rl-core-front 0.6.0 → 0.8.0
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/README.md +20 -0
- package/package.json +1 -1
- package/src/_services/api/schema.d.ts +381 -2
- package/src/components/app-shell.tsx +229 -51
- package/src/components/ui/data-table.tsx +18 -1
- package/src/components/ui/dialog.tsx +157 -62
- package/src/components/ui/index.ts +1 -0
- package/src/components/ui/job-progress.tsx +100 -0
- package/src/components/ui/sheet.tsx +1 -1
- package/src/features/errors/error-state.tsx +50 -0
- package/src/features/errors/forbidden-screen.tsx +37 -0
- package/src/features/errors/not-found-screen.tsx +35 -0
- package/src/features/queues/hooks/use-queue-jobs.ts +103 -0
- package/src/features/queues/queues-screen.tsx +264 -0
- package/src/features/queues/services/queues.service.ts +57 -0
- package/src/features/rbac/components/permission-matrix.tsx +210 -0
- package/src/features/rbac/panels/definitions-panel.tsx +75 -0
- package/src/features/rbac/panels/index.ts +1 -0
- package/src/features/rbac/panels/roles-panel.tsx +113 -57
- package/src/features/rbac/rbac-screen.tsx +35 -37
- package/src/hooks/use-job-progress.ts +192 -0
- package/src/i18n/messages/en.ts +52 -0
- package/src/i18n/messages/pt.ts +53 -0
- package/src/index.ts +24 -0
package/README.md
CHANGED
|
@@ -85,6 +85,26 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
|
|
85
85
|
}
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
+
### Telas prontas
|
|
89
|
+
|
|
90
|
+
`LoginScreen`, `DashboardScreen`, `UsersScreen`, `RbacScreen`, `LogsScreen`,
|
|
91
|
+
`AuditScreen`, `ProfileScreen`, `QueuesScreen`, mais as de recuperação de senha e
|
|
92
|
+
as de erro (`ForbiddenScreen`, `NotFoundScreen`). Cada uma é uma linha no
|
|
93
|
+
`page.tsx` da rota — a de filas em `/filas`, e ela some do menu sozinha para
|
|
94
|
+
quem não tem `queues:read:any`.
|
|
95
|
+
|
|
96
|
+
### Acompanhar um job em segundo plano
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
const job = useJobProgress<ImportSummary>(jobId);
|
|
100
|
+
|
|
101
|
+
<JobProgress {...job} successMessage={`${job.summary?.total} linhas importadas`} />;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
O hook usa a conexão de socket que o `SocketProvider` já mantém — não abre uma
|
|
105
|
+
segunda — e relê `GET /jobs/:id` na montagem e a cada reconexão, para o caso de
|
|
106
|
+
o job ter terminado antes de a tela assinar.
|
|
107
|
+
|
|
88
108
|
## Identidade do sistema
|
|
89
109
|
|
|
90
110
|
O `BrandProvider` é o que troca o "Core App" pelo nome do projeto. Ele alimenta
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rl-core-front",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Telas e componentes Next.js do core: login com 2FA, usu\u00e1rios, RBAC, auditoria, logs e listagens com filtro din\u00e2mico",
|
|
5
5
|
"author": "Rodrigo Liberti",
|
|
6
6
|
"license": "MIT",
|
|
@@ -624,6 +624,38 @@ export interface paths {
|
|
|
624
624
|
patch?: never;
|
|
625
625
|
trace?: never;
|
|
626
626
|
};
|
|
627
|
+
"/rbac/users/{userId}/permissions": {
|
|
628
|
+
parameters: {
|
|
629
|
+
query?: never;
|
|
630
|
+
header?: never;
|
|
631
|
+
path?: never;
|
|
632
|
+
cookie?: never;
|
|
633
|
+
};
|
|
634
|
+
get: operations["RbacController_userPermissions"];
|
|
635
|
+
put: operations["RbacController_setUserPermissions"];
|
|
636
|
+
post?: never;
|
|
637
|
+
delete?: never;
|
|
638
|
+
options?: never;
|
|
639
|
+
head?: never;
|
|
640
|
+
patch?: never;
|
|
641
|
+
trace?: never;
|
|
642
|
+
};
|
|
643
|
+
"/rbac/users/{userId}/permissions/{permissionId}": {
|
|
644
|
+
parameters: {
|
|
645
|
+
query?: never;
|
|
646
|
+
header?: never;
|
|
647
|
+
path?: never;
|
|
648
|
+
cookie?: never;
|
|
649
|
+
};
|
|
650
|
+
get?: never;
|
|
651
|
+
put?: never;
|
|
652
|
+
post: operations["RbacController_grantUserPermission"];
|
|
653
|
+
delete: operations["RbacController_revokeUserPermission"];
|
|
654
|
+
options?: never;
|
|
655
|
+
head?: never;
|
|
656
|
+
patch?: never;
|
|
657
|
+
trace?: never;
|
|
658
|
+
};
|
|
627
659
|
"/audit/requests": {
|
|
628
660
|
parameters: {
|
|
629
661
|
query?: never;
|
|
@@ -752,6 +784,86 @@ export interface paths {
|
|
|
752
784
|
patch: operations["NotificationsController_markAsRead"];
|
|
753
785
|
trace?: never;
|
|
754
786
|
};
|
|
787
|
+
"/jobs/{id}": {
|
|
788
|
+
parameters: {
|
|
789
|
+
query?: never;
|
|
790
|
+
header?: never;
|
|
791
|
+
path?: never;
|
|
792
|
+
cookie?: never;
|
|
793
|
+
};
|
|
794
|
+
get: operations["JobStatusController_status"];
|
|
795
|
+
put?: never;
|
|
796
|
+
post?: never;
|
|
797
|
+
delete?: never;
|
|
798
|
+
options?: never;
|
|
799
|
+
head?: never;
|
|
800
|
+
patch?: never;
|
|
801
|
+
trace?: never;
|
|
802
|
+
};
|
|
803
|
+
"/queues/counts": {
|
|
804
|
+
parameters: {
|
|
805
|
+
query?: never;
|
|
806
|
+
header?: never;
|
|
807
|
+
path?: never;
|
|
808
|
+
cookie?: never;
|
|
809
|
+
};
|
|
810
|
+
get: operations["QueueAdminController_counts"];
|
|
811
|
+
put?: never;
|
|
812
|
+
post?: never;
|
|
813
|
+
delete?: never;
|
|
814
|
+
options?: never;
|
|
815
|
+
head?: never;
|
|
816
|
+
patch?: never;
|
|
817
|
+
trace?: never;
|
|
818
|
+
};
|
|
819
|
+
"/queues/jobs": {
|
|
820
|
+
parameters: {
|
|
821
|
+
query?: never;
|
|
822
|
+
header?: never;
|
|
823
|
+
path?: never;
|
|
824
|
+
cookie?: never;
|
|
825
|
+
};
|
|
826
|
+
get: operations["QueueAdminController_jobs"];
|
|
827
|
+
put?: never;
|
|
828
|
+
post?: never;
|
|
829
|
+
delete?: never;
|
|
830
|
+
options?: never;
|
|
831
|
+
head?: never;
|
|
832
|
+
patch?: never;
|
|
833
|
+
trace?: never;
|
|
834
|
+
};
|
|
835
|
+
"/queues/jobs/{id}/retry": {
|
|
836
|
+
parameters: {
|
|
837
|
+
query?: never;
|
|
838
|
+
header?: never;
|
|
839
|
+
path?: never;
|
|
840
|
+
cookie?: never;
|
|
841
|
+
};
|
|
842
|
+
get?: never;
|
|
843
|
+
put?: never;
|
|
844
|
+
post: operations["QueueAdminController_retry"];
|
|
845
|
+
delete?: never;
|
|
846
|
+
options?: never;
|
|
847
|
+
head?: never;
|
|
848
|
+
patch?: never;
|
|
849
|
+
trace?: never;
|
|
850
|
+
};
|
|
851
|
+
"/queues/jobs/{id}": {
|
|
852
|
+
parameters: {
|
|
853
|
+
query?: never;
|
|
854
|
+
header?: never;
|
|
855
|
+
path?: never;
|
|
856
|
+
cookie?: never;
|
|
857
|
+
};
|
|
858
|
+
get?: never;
|
|
859
|
+
put?: never;
|
|
860
|
+
post?: never;
|
|
861
|
+
delete: operations["QueueAdminController_remove"];
|
|
862
|
+
options?: never;
|
|
863
|
+
head?: never;
|
|
864
|
+
patch?: never;
|
|
865
|
+
trace?: never;
|
|
866
|
+
};
|
|
755
867
|
}
|
|
756
868
|
export type webhooks = Record<string, never>;
|
|
757
869
|
export interface components {
|
|
@@ -981,7 +1093,7 @@ export interface components {
|
|
|
981
1093
|
};
|
|
982
1094
|
CreateScopeCommand: {
|
|
983
1095
|
/**
|
|
984
|
-
* @description own | team |
|
|
1096
|
+
* @description own | team | any
|
|
985
1097
|
* @example own
|
|
986
1098
|
*/
|
|
987
1099
|
name: string;
|
|
@@ -989,7 +1101,7 @@ export interface components {
|
|
|
989
1101
|
};
|
|
990
1102
|
UpdateScopeCommand: {
|
|
991
1103
|
/**
|
|
992
|
-
* @description own | team |
|
|
1104
|
+
* @description own | team | any
|
|
993
1105
|
* @example own
|
|
994
1106
|
*/
|
|
995
1107
|
name?: string;
|
|
@@ -1114,6 +1226,9 @@ export interface components {
|
|
|
1114
1226
|
permissionIds?: string[];
|
|
1115
1227
|
isActive?: boolean;
|
|
1116
1228
|
};
|
|
1229
|
+
SetUserPermissionsCommand: {
|
|
1230
|
+
permissionIds: string[];
|
|
1231
|
+
};
|
|
1117
1232
|
/**
|
|
1118
1233
|
* @description 0 = sucesso, 1 = erro, 2 = abortada
|
|
1119
1234
|
* @enum {number}
|
|
@@ -1242,6 +1357,79 @@ export interface components {
|
|
|
1242
1357
|
/** @description Dado extra. `route` é usado pelo cliente para navegar. */
|
|
1243
1358
|
payload?: Record<string, never>;
|
|
1244
1359
|
};
|
|
1360
|
+
JobProgressResponse: {
|
|
1361
|
+
/** @example 120 */
|
|
1362
|
+
processed: number;
|
|
1363
|
+
/** @example 175 */
|
|
1364
|
+
total: number;
|
|
1365
|
+
/**
|
|
1366
|
+
* @description Inteiro de 0 a 100
|
|
1367
|
+
* @example 69
|
|
1368
|
+
*/
|
|
1369
|
+
percent: number;
|
|
1370
|
+
/** @example Lendo a planilha */
|
|
1371
|
+
message?: string;
|
|
1372
|
+
};
|
|
1373
|
+
JobErrorResponse: {
|
|
1374
|
+
/** @example INVALID_FILTER */
|
|
1375
|
+
code: string | null;
|
|
1376
|
+
/** @example Falha ao processar. Tente novamente */
|
|
1377
|
+
message: string;
|
|
1378
|
+
};
|
|
1379
|
+
JobStatusResponse: {
|
|
1380
|
+
/** @example 42 */
|
|
1381
|
+
id: string;
|
|
1382
|
+
/** @example funkos:import */
|
|
1383
|
+
name: string;
|
|
1384
|
+
/**
|
|
1385
|
+
* @example active
|
|
1386
|
+
* @enum {string}
|
|
1387
|
+
*/
|
|
1388
|
+
state: "waiting" | "active" | "completed" | "failed" | "delayed" | "unknown";
|
|
1389
|
+
progress: components["schemas"]["JobProgressResponse"] | null;
|
|
1390
|
+
/** @description Relatório que o processador devolveu, no formato da feature */
|
|
1391
|
+
summary: Record<string, never> | null;
|
|
1392
|
+
error: components["schemas"]["JobErrorResponse"] | null;
|
|
1393
|
+
/** Format: date-time */
|
|
1394
|
+
createdAt: string;
|
|
1395
|
+
/** Format: date-time */
|
|
1396
|
+
finishedAt: string | null;
|
|
1397
|
+
};
|
|
1398
|
+
QueueCountsResponse: {
|
|
1399
|
+
/** @example 3 */
|
|
1400
|
+
waiting: number;
|
|
1401
|
+
/** @example 1 */
|
|
1402
|
+
active: number;
|
|
1403
|
+
/** @example 128 */
|
|
1404
|
+
completed: number;
|
|
1405
|
+
/** @example 2 */
|
|
1406
|
+
failed: number;
|
|
1407
|
+
/** @example 0 */
|
|
1408
|
+
delayed: number;
|
|
1409
|
+
};
|
|
1410
|
+
QueueJobResponse: {
|
|
1411
|
+
/** @example 42 */
|
|
1412
|
+
id: string;
|
|
1413
|
+
/** @example funkos:import */
|
|
1414
|
+
name: string;
|
|
1415
|
+
/** @example failed */
|
|
1416
|
+
state: string;
|
|
1417
|
+
/** Format: uuid */
|
|
1418
|
+
ownerId: string | null;
|
|
1419
|
+
/** @example 2 */
|
|
1420
|
+
attemptsMade: number;
|
|
1421
|
+
/** @example 69 */
|
|
1422
|
+
percent: number | null;
|
|
1423
|
+
failedReason: string | null;
|
|
1424
|
+
/** Format: date-time */
|
|
1425
|
+
createdAt: string;
|
|
1426
|
+
/** Format: date-time */
|
|
1427
|
+
finishedAt: string | null;
|
|
1428
|
+
};
|
|
1429
|
+
PaginatedQueueJobsResponse: {
|
|
1430
|
+
items: components["schemas"]["QueueJobResponse"][];
|
|
1431
|
+
meta: components["schemas"]["PaginationMetaResponse"];
|
|
1432
|
+
};
|
|
1245
1433
|
};
|
|
1246
1434
|
responses: never;
|
|
1247
1435
|
parameters: never;
|
|
@@ -2488,6 +2676,96 @@ export interface operations {
|
|
|
2488
2676
|
};
|
|
2489
2677
|
};
|
|
2490
2678
|
};
|
|
2679
|
+
RbacController_userPermissions: {
|
|
2680
|
+
parameters: {
|
|
2681
|
+
query?: never;
|
|
2682
|
+
header?: never;
|
|
2683
|
+
path: {
|
|
2684
|
+
userId: string;
|
|
2685
|
+
};
|
|
2686
|
+
cookie?: never;
|
|
2687
|
+
};
|
|
2688
|
+
requestBody?: never;
|
|
2689
|
+
responses: {
|
|
2690
|
+
200: {
|
|
2691
|
+
headers: {
|
|
2692
|
+
[name: string]: unknown;
|
|
2693
|
+
};
|
|
2694
|
+
content: {
|
|
2695
|
+
"application/json": components["schemas"]["PermissionResponse"][];
|
|
2696
|
+
};
|
|
2697
|
+
};
|
|
2698
|
+
};
|
|
2699
|
+
};
|
|
2700
|
+
RbacController_setUserPermissions: {
|
|
2701
|
+
parameters: {
|
|
2702
|
+
query?: never;
|
|
2703
|
+
header?: never;
|
|
2704
|
+
path: {
|
|
2705
|
+
userId: string;
|
|
2706
|
+
};
|
|
2707
|
+
cookie?: never;
|
|
2708
|
+
};
|
|
2709
|
+
requestBody: {
|
|
2710
|
+
content: {
|
|
2711
|
+
"application/json": components["schemas"]["SetUserPermissionsCommand"];
|
|
2712
|
+
};
|
|
2713
|
+
};
|
|
2714
|
+
responses: {
|
|
2715
|
+
200: {
|
|
2716
|
+
headers: {
|
|
2717
|
+
[name: string]: unknown;
|
|
2718
|
+
};
|
|
2719
|
+
content: {
|
|
2720
|
+
"application/json": components["schemas"]["PermissionResponse"][];
|
|
2721
|
+
};
|
|
2722
|
+
};
|
|
2723
|
+
};
|
|
2724
|
+
};
|
|
2725
|
+
RbacController_grantUserPermission: {
|
|
2726
|
+
parameters: {
|
|
2727
|
+
query?: never;
|
|
2728
|
+
header?: never;
|
|
2729
|
+
path: {
|
|
2730
|
+
userId: string;
|
|
2731
|
+
permissionId: string;
|
|
2732
|
+
};
|
|
2733
|
+
cookie?: never;
|
|
2734
|
+
};
|
|
2735
|
+
requestBody?: never;
|
|
2736
|
+
responses: {
|
|
2737
|
+
200: {
|
|
2738
|
+
headers: {
|
|
2739
|
+
[name: string]: unknown;
|
|
2740
|
+
};
|
|
2741
|
+
content: {
|
|
2742
|
+
"application/json": components["schemas"]["PermissionResponse"][];
|
|
2743
|
+
};
|
|
2744
|
+
};
|
|
2745
|
+
};
|
|
2746
|
+
};
|
|
2747
|
+
RbacController_revokeUserPermission: {
|
|
2748
|
+
parameters: {
|
|
2749
|
+
query?: never;
|
|
2750
|
+
header?: never;
|
|
2751
|
+
path: {
|
|
2752
|
+
userId: string;
|
|
2753
|
+
permissionId: string;
|
|
2754
|
+
};
|
|
2755
|
+
cookie?: never;
|
|
2756
|
+
};
|
|
2757
|
+
requestBody?: never;
|
|
2758
|
+
responses: {
|
|
2759
|
+
200: {
|
|
2760
|
+
headers: {
|
|
2761
|
+
[name: string]: unknown;
|
|
2762
|
+
};
|
|
2763
|
+
content: {
|
|
2764
|
+
"application/json": components["schemas"]["PermissionResponse"][];
|
|
2765
|
+
};
|
|
2766
|
+
};
|
|
2767
|
+
};
|
|
2768
|
+
};
|
|
2491
2769
|
AuditController_requests: {
|
|
2492
2770
|
parameters: {
|
|
2493
2771
|
query?: {
|
|
@@ -2688,4 +2966,105 @@ export interface operations {
|
|
|
2688
2966
|
};
|
|
2689
2967
|
};
|
|
2690
2968
|
};
|
|
2969
|
+
JobStatusController_status: {
|
|
2970
|
+
parameters: {
|
|
2971
|
+
query?: never;
|
|
2972
|
+
header?: never;
|
|
2973
|
+
path: {
|
|
2974
|
+
id: string;
|
|
2975
|
+
};
|
|
2976
|
+
cookie?: never;
|
|
2977
|
+
};
|
|
2978
|
+
requestBody?: never;
|
|
2979
|
+
responses: {
|
|
2980
|
+
200: {
|
|
2981
|
+
headers: {
|
|
2982
|
+
[name: string]: unknown;
|
|
2983
|
+
};
|
|
2984
|
+
content: {
|
|
2985
|
+
"application/json": components["schemas"]["JobStatusResponse"];
|
|
2986
|
+
};
|
|
2987
|
+
};
|
|
2988
|
+
};
|
|
2989
|
+
};
|
|
2990
|
+
QueueAdminController_counts: {
|
|
2991
|
+
parameters: {
|
|
2992
|
+
query?: never;
|
|
2993
|
+
header?: never;
|
|
2994
|
+
path?: never;
|
|
2995
|
+
cookie?: never;
|
|
2996
|
+
};
|
|
2997
|
+
requestBody?: never;
|
|
2998
|
+
responses: {
|
|
2999
|
+
200: {
|
|
3000
|
+
headers: {
|
|
3001
|
+
[name: string]: unknown;
|
|
3002
|
+
};
|
|
3003
|
+
content: {
|
|
3004
|
+
"application/json": components["schemas"]["QueueCountsResponse"];
|
|
3005
|
+
};
|
|
3006
|
+
};
|
|
3007
|
+
};
|
|
3008
|
+
};
|
|
3009
|
+
QueueAdminController_jobs: {
|
|
3010
|
+
parameters: {
|
|
3011
|
+
query: {
|
|
3012
|
+
state: "waiting" | "active" | "completed" | "failed" | "delayed";
|
|
3013
|
+
page: string;
|
|
3014
|
+
limit: string;
|
|
3015
|
+
};
|
|
3016
|
+
header?: never;
|
|
3017
|
+
path?: never;
|
|
3018
|
+
cookie?: never;
|
|
3019
|
+
};
|
|
3020
|
+
requestBody?: never;
|
|
3021
|
+
responses: {
|
|
3022
|
+
200: {
|
|
3023
|
+
headers: {
|
|
3024
|
+
[name: string]: unknown;
|
|
3025
|
+
};
|
|
3026
|
+
content: {
|
|
3027
|
+
"application/json": components["schemas"]["PaginatedQueueJobsResponse"];
|
|
3028
|
+
};
|
|
3029
|
+
};
|
|
3030
|
+
};
|
|
3031
|
+
};
|
|
3032
|
+
QueueAdminController_retry: {
|
|
3033
|
+
parameters: {
|
|
3034
|
+
query?: never;
|
|
3035
|
+
header?: never;
|
|
3036
|
+
path: {
|
|
3037
|
+
id: string;
|
|
3038
|
+
};
|
|
3039
|
+
cookie?: never;
|
|
3040
|
+
};
|
|
3041
|
+
requestBody?: never;
|
|
3042
|
+
responses: {
|
|
3043
|
+
204: {
|
|
3044
|
+
headers: {
|
|
3045
|
+
[name: string]: unknown;
|
|
3046
|
+
};
|
|
3047
|
+
content?: never;
|
|
3048
|
+
};
|
|
3049
|
+
};
|
|
3050
|
+
};
|
|
3051
|
+
QueueAdminController_remove: {
|
|
3052
|
+
parameters: {
|
|
3053
|
+
query?: never;
|
|
3054
|
+
header?: never;
|
|
3055
|
+
path: {
|
|
3056
|
+
id: string;
|
|
3057
|
+
};
|
|
3058
|
+
cookie?: never;
|
|
3059
|
+
};
|
|
3060
|
+
requestBody?: never;
|
|
3061
|
+
responses: {
|
|
3062
|
+
204: {
|
|
3063
|
+
headers: {
|
|
3064
|
+
[name: string]: unknown;
|
|
3065
|
+
};
|
|
3066
|
+
content?: never;
|
|
3067
|
+
};
|
|
3068
|
+
};
|
|
3069
|
+
};
|
|
2691
3070
|
}
|