@trismegisto/spine 3.0.0 → 3.0.1
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/fesm2022/{trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs → trismegisto-spine-auto-service-apps.technical-dKM4fG42.mjs} +19 -14
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-dKM4fG42.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs → trismegisto-spine-auto-service-apps.usage-VMrCG5o3.mjs} +14 -10
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-VMrCG5o3.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs +37 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-DdtDk_xl.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map → trismegisto-spine-auto-service-auto-service-client-picker.component-DdtDk_xl.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs → trismegisto-spine-auto-service-auto-service-client.component-DXl1y6Sx.mjs} +15 -15
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map → trismegisto-spine-auto-service-auto-service-client.component-DXl1y6Sx.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs → trismegisto-spine-auto-service-auto-service-delete-B1tXgMvi.mjs} +2 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-B1tXgMvi.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs → trismegisto-spine-auto-service-auto-service-groups.component-C4iQ2GPX.mjs} +92 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-C4iQ2GPX.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs +37 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map → trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs → trismegisto-spine-auto-service-auto-service.component-DV88Uger.mjs} +78 -80
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DV88Uger.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs → trismegisto-spine-auto-service-groups.technical-D05838rU.mjs} +11 -7
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-D05838rU.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs → trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs} +11 -12
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +9 -9
- package/fesm2022/trismegisto-spine.mjs +24 -6
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine.d.ts +22 -7
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs +0 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +0 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trismegisto/spine",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": ">=21.0.0",
|
|
7
7
|
"@angular/core": ">=21.0.0",
|
|
8
8
|
"@angular/router": ">=21.0.0",
|
|
9
9
|
"@orfeu/angular": "^1.0.0",
|
|
10
|
-
"@trismegisto/angular": "^3.0.
|
|
11
|
-
"@trismegisto/core": "^3.0.
|
|
12
|
-
"@trismegisto/icons": "^3.0.
|
|
13
|
-
"@trismegisto/primitives": "^3.0.
|
|
14
|
-
"@trismegisto/tokens": "^3.0.
|
|
10
|
+
"@trismegisto/angular": "^3.0.1",
|
|
11
|
+
"@trismegisto/core": "^3.0.1",
|
|
12
|
+
"@trismegisto/icons": "^3.0.1",
|
|
13
|
+
"@trismegisto/primitives": "^3.0.1",
|
|
14
|
+
"@trismegisto/tokens": "^3.0.1",
|
|
15
15
|
"rxjs": "^7.0.0",
|
|
16
16
|
"@apollo/client": "^4.2.0",
|
|
17
17
|
"apollo-angular": "^14.2.0",
|
|
@@ -1163,7 +1163,7 @@ interface SpineMessages {
|
|
|
1163
1163
|
create: string;
|
|
1164
1164
|
edit: string;
|
|
1165
1165
|
remove: string;
|
|
1166
|
-
/**
|
|
1166
|
+
/** Botão "Consultar" ao lado dos seletores de Grupos e Aplicações. */
|
|
1167
1167
|
search: string;
|
|
1168
1168
|
active: string;
|
|
1169
1169
|
inactive: string;
|
|
@@ -1184,7 +1184,7 @@ interface SpineMessages {
|
|
|
1184
1184
|
groupsIntro: string;
|
|
1185
1185
|
/** @deprecated não é mais exibido (o auto-serviço não repete título/explicação que a barra da página e a aba já dão). */
|
|
1186
1186
|
groupsFixed: string;
|
|
1187
|
-
/**
|
|
1187
|
+
/** Placeholder do seletor de grupo (Grupos, depois do nível de acesso). */
|
|
1188
1188
|
pickGroup: string;
|
|
1189
1189
|
noDescription: string;
|
|
1190
1190
|
/** @deprecated não é mais exibido (o auto-serviço não repete título/explicação que a barra da página e a aba já dão). */
|
|
@@ -1232,7 +1232,7 @@ interface SpineMessages {
|
|
|
1232
1232
|
/** @deprecated não é mais exibido (a tela Aplicações lista as aplicações numa tabela, sem "Consultar"). */
|
|
1233
1233
|
appsSearchIntro: string;
|
|
1234
1234
|
secretCreated: string;
|
|
1235
|
-
/**
|
|
1235
|
+
/** Rótulo do seletor de aplicação (Aplicações, com "Consultar"). */
|
|
1236
1236
|
pickApp: string;
|
|
1237
1237
|
disable: string;
|
|
1238
1238
|
enable: string;
|
|
@@ -1368,14 +1368,22 @@ interface SpineMessages {
|
|
|
1368
1368
|
/** Tela Grupos: lista dos grupos do projeto, criar/editar/excluir. */
|
|
1369
1369
|
newGroup: string;
|
|
1370
1370
|
editGroup: string;
|
|
1371
|
+
/** @deprecated não é mais exibido (a tela Grupos voltou ao seletor de nível + grupo, sem tabela). */
|
|
1371
1372
|
groupsCaption: string;
|
|
1372
1373
|
noGroups: string;
|
|
1374
|
+
/** Tela Grupos: primeiro seletor (o tipo do grupo, do nível mais alto para o mais baixo). */
|
|
1375
|
+
accessLevel: string;
|
|
1376
|
+
pickAccessLevel: string;
|
|
1377
|
+
/** Opção do seletor de nível para os grupos sem tipo. */
|
|
1378
|
+
noLevel: string;
|
|
1379
|
+
/** Nível escolhido sem nenhum grupo. */
|
|
1380
|
+
noGroupsOfLevel: string;
|
|
1373
1381
|
colStatus: string;
|
|
1374
1382
|
groupName: string;
|
|
1375
1383
|
groupType: string;
|
|
1376
1384
|
groupTypePlaceholder: string;
|
|
1377
1385
|
groupDescription: string;
|
|
1378
|
-
/**
|
|
1386
|
+
/** @deprecated não é mais exibido (a tela Grupos voltou ao seletor, sem tabela). */
|
|
1379
1387
|
openGroup: string;
|
|
1380
1388
|
/** @deprecated não é mais exibido (o grupo de administração do projeto é gerido só no painel central e não aparece no auto-serviço). */
|
|
1381
1389
|
adminGroupTag: string;
|
|
@@ -1394,11 +1402,13 @@ interface SpineMessages {
|
|
|
1394
1402
|
* Erros do argos-admin-server nos grupos e acessos do auto-serviço, pelo código (`error`) da resposta
|
|
1395
1403
|
* (ver `autoServiceErrorText`). `groupNotFound` é o 404 de grupo de outro projeto.
|
|
1396
1404
|
*/
|
|
1397
|
-
/**
|
|
1405
|
+
/** @deprecated não é mais exibido (a tela Aplicações voltou ao seletor + "Consultar", sem tabela). */
|
|
1398
1406
|
appsCaption: string;
|
|
1407
|
+
/** Tela Aplicações: o projeto ainda não tem aplicação (embaixo do seletor). */
|
|
1399
1408
|
noApps: string;
|
|
1409
|
+
/** @deprecated não é mais exibido (a tela Aplicações voltou ao seletor, sem tabela). */
|
|
1400
1410
|
colGrants: string;
|
|
1401
|
-
/**
|
|
1411
|
+
/** @deprecated não é mais exibido (a tela Aplicações voltou ao seletor, sem tabela). */
|
|
1402
1412
|
openApp: string;
|
|
1403
1413
|
/** Aba Tokens da aplicação: tokens de API (`x-api-token`), criar e revogar. */
|
|
1404
1414
|
tabTokens: string;
|
|
@@ -1427,10 +1437,12 @@ interface SpineMessages {
|
|
|
1427
1437
|
tokenExpiresInvalid: string;
|
|
1428
1438
|
tokenOperations: string;
|
|
1429
1439
|
tokenOperationsNote: string;
|
|
1430
|
-
/**
|
|
1440
|
+
/** Grupo: por que a operação não depende de permissão (caixa marcada e desabilitada): public/optional, private, outro nível. */
|
|
1431
1441
|
freeForAll: string;
|
|
1432
1442
|
freeForAuthenticated: string;
|
|
1433
1443
|
freeNoPermission: string;
|
|
1444
|
+
/** Token: operação public (caixa desmarcada e desabilitada; o token não precisa dela). */
|
|
1445
|
+
publicNoToken: string;
|
|
1434
1446
|
createToken: string;
|
|
1435
1447
|
tokenSaveError: string;
|
|
1436
1448
|
/** O token criado, mostrado uma única vez; `{name}` = nome do token. */
|
|
@@ -1450,7 +1462,10 @@ interface SpineMessages {
|
|
|
1450
1462
|
invalidExpiresAt: string;
|
|
1451
1463
|
invalidValidity: string;
|
|
1452
1464
|
invalidOperationIds: string;
|
|
1465
|
+
/** `operation_not_protected`: grupo só recebe operação protected. */
|
|
1453
1466
|
operationNotProtected: string;
|
|
1467
|
+
/** `operation_public`: operação public não se libera a token. */
|
|
1468
|
+
operationPublic: string;
|
|
1454
1469
|
appNotFound: string;
|
|
1455
1470
|
tokenNotFound: string;
|
|
1456
1471
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine.d.ts","sources":["../../../projects/ui/src/route.model.ts","../../../projects/ui/src/route-tree.ts","../../../projects/ui/src/hermes.imports.ts","../../../projects/ui/src/brand.ts","../../../projects/ui/src/app-config.token.ts","../../../projects/ui/src/theme.service.ts","../../../projects/ui/src/theme-preset.service.ts","../../../projects/ui/src/density.service.ts","../../../projects/ui/src/theme.initializer.ts","../../../projects/ui/src/package-info.token.ts","../../../projects/ui/src/preferences.service.ts","../../../projects/ui/src/admin-api.token.ts","../../../projects/ui/src/quick-access.service.ts","../../../projects/ui/src/user-storage.ts","../../../projects/ui/src/runtime-environment.ts","../../../projects/ui/src/news.token.ts","../../../projects/ui/src/i18n/spine-messages.ts","../../../projects/ui/src/i18n/spine-messages.en.ts","../../../projects/ui/src/i18n/spine-messages.es.ts","../../../projects/ui/src/i18n/spine-i18n.ts"],"mappings":";;;;;UAAiB,KAAK;AACpB;AACA;AACA;;;;AAIG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,aAAS,KAAK;AACd;;;;;;AAMG;AACH;;AAEA;AAKA;AACD;AAED;AACA,iBAAgB,UAAU,QAAQ,KAAK;;AClCvC;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACH,iBAAgB,cAAc,kBAAkB,KAAK,wBAAwB,KAAK;AASlF;AACA,iBAAgB,aAAa;AAAS,sBAAkB,KAAK;AAAW,uBAAsB,KAAK;;ACpBnG;;;;;AAKG;AACH,cAAa,iBAAiB,WAAW,IAAI;;ACvB7C;;;AAGG;AAEH;AACM,KAAM,eAAe;;;;;AAE3B;AACA,cAAa,kBAAkB;AAE/B;UACiB,gBAAgB;;AAE/B;;AAEA;AACD;AAED;AACA,iBAAgB,gBAAgB,OAAO,eAAe,8BAA8B,gBAAgB;AAgBpG;;;;AAIG;AACH,iBAAgB,iBAAiB,MAAM,QAAQ,iBAAiB,eAAe;;UCrC9D,WAAW;;AAE1B;;;;;AAKG;YACK,oBAAoB;;;AAG5B;;;;;;;;;;AAUG;AACH,WAAO,eAAe;AACtB;AACwF;;AAExF;AACsF;;AAEtF;;AAEiF;;AAEjF;;AAEG;eACQ,aAAa;AACzB;AAED;UACiB,cAAc;;;;;;;;;;;AAW9B;AAED;UACiB,eAAe;;;;;;;AAO/B;AAED;;;AAGG;UACc,aAAa;AAC5B;AAC0D;AAC1D;AAAY,0BAAkB,cAAc;;;;AAG5C;AACwD;;;;;;;;;;AAOxD;AAAY,wBAAgB,eAAe;;AAC3C;AACmG;;AAEpG;AAED,cAAa,YAAY,EAAA,cAAA,CAAA,WAAA;;ACtFzB;;;;;;;;AAQG;AACH,cACa,YAAY;AAOH;AACG;AACrB;AARF;;AAGA;AAG4B,0BAAU,QAAQ,cACH,MAAM,QACjC,MAAM,UACsB,WAAW;mBA2BxC,eAAe;;gBAKlB,eAAe;kBAIb,eAAe;oBAKb,eAAe;oDAnDpB,YAAY;wDAAZ,YAAY;AAuDxB;;ACnED;;;;;;;AAOG;AACH,cACa,kBAAkB;AAC7B;mBAEe,YAAY;AAK3B,6BAAyB,YAAY;AAIrC,sBAAkB,YAAY;oDAZnB,kBAAkB;wDAAlB,kBAAkB;AAe9B;;UCtBgB,cAAc;UACvB,aAAa;AACpB;AAED;;;;;AAKG;AACH,cACa,cAAc;AAOF;AACrB;AAPF;;AAGA;4BAG2C,MAAM,QACjC,MAAM,UACsB,WAAW;mBAaxC,cAAc;wBAIT,aAAa;AAKjC;AAC6F;;oDAhClF,cAAc;wDAAd,cAAc;AAoC1B;;AC3CD;;;AAGyF;AACzF,iBAAgB,SAAS,UAAU,WAAW,GAAG,oBAAoB;;ACXrE;;;;AAIqF;UACpE,WAAW;;;;;;;AAO1B;;;AACA;;;;;;;mBAGe,MAAM;AACrB;AACD;AAED,cAAa,gBAAgB,EAAA,cAAA,CAAA,WAAA;;ACF7B;AACA,cAAa,kBAAkB;AAE/B;;;AAGG;AACG,KAAM,wBAAwB;AAEpC;KACY,wBAAwB,QAAQ,aAAa;AACzD;KACY,wBAAwB,GAAG,OAAO;AAG9C;;;;;;;;;;;;;AAaG;AACH,cACa,uBAAuB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;uBAKiB,aAAA,CAAA,cAAA;;;;gCAMS,aAAA,CAAA,MAAA;;uBAGT,aAAA,CAAA,cAAA;AAEjB;;;AAGG;4BACmB,aAAA,CAAA,cAAA;;wBAGJ,aAAA,CAAA,cAAA;;qBAGH,aAAA,CAAA,cAAA,CAAA,sBAAA;;wBAGG,aAAA,CAAA,cAAA,CAAA,wBAAA;;wBAGA,aAAA,CAAA,cAAA,CAAA,wBAAA;AAElB;AACA;AACA;AACA;AAEA;AACyE;0BACrD,aAAA,CAAA,cAAA;;wBAGF,aAAA,CAAA,cAAA,CAAA,wBAAA;;0BAGE,aAAA,CAAA,cAAA,CAAA,QAAA,CAAA,MAAA;;6BAGG,aAAA,CAAA,cAAA;;;AAGQ;AAAwB;AAAwB;;;AAuC/E;AAKA;AAMA;AAKA;;AAMA;AAMA;;AAMA;AAOA;;AAMA,qBAAiB,sBAAsB;AAOvC;;AAMA,wBAAoB,wBAAwB;;AAQ5C,wBAAoB,wBAAwB;AAO5C;;AAOA;;AAQA,wBAAoB,wBAAwB;;;;AAa5C,0BAAsB,QAAQ,CAAC,MAAM;;AAQrC;AAMA;;;AAgBA;AAKA;oDAvPW,uBAAuB;wDAAvB,uBAAuB;AA8PnC;;AC9SD;;;;;;AAMG;AACH,cAAa,eAAe,EAAA,cAAA;;ACL5B;UACiB,eAAe;AAC9B;AACA;AACA;AACA;;AAEA;AACD;AAOD;;;;AAIG;AACH,cACa,uBAAuB;AAClC;AACA;AACA;AACA;wBAEkB,aAAA,CAAA,MAAA,UAAA,eAAA;sBACF,aAAA,CAAA,MAAA,UAAA,eAAA;AAEhB;;;;AA4BA;;AASA,yBAAqB,eAAe;;AAOpC;AAWA,sBAAkB,eAAe;AAQjC;AAIA;AAUA;oDAtFW,uBAAuB;wDAAvB,uBAAuB;AAqGnC;;ACzHD;AACA,cAAa,uBAAuB;;;;;;;AAQ9B,KAAM,mBAAmB,WAAW,uBAAuB,eAAe,uBAAuB;AAOvG;;;;;;;;;AASG;AACH,cACa,gBAAgB;AAC3B;AACA;AACA;AACA;;;;;AAiBA;;AAaA,cAAU,mBAAmB;;AAS7B;AAaA;;;AAGG;AACH,gBAAY,mBAAmB;;AAY/B,gBAAY,mBAAmB;;AAW/B;AAKA;AAIA;oDA5FW,gBAAgB;wDAAhB,gBAAgB;AAoG5B;;ACpID;;;AAGG;UACc,uBAAuB;AACtC;;;;;AACA,cAAU,MAAM;;;AAAsC;AACvD;UAEgB,sBAAsB;;AAErC;;AAEA;;AAEA;;;AAGD;AAED;;;;;;;;;;;;;;;;;AAiBG;AACH,iBAAgB,uBAAuB,cAAc,uBAAuB,GAAG,sBAAsB;;ACpCrG;;;AAGG;UACc,qBAAqB;AACpC;AACA;AAAiC;AAAuB;AAAwB;AACjF;AAED;UACiB,cAAc;AAC7B;AACA;;AAEA,4BAAwB,qBAAqB;AAC7C;AACuB;AACvB;;AAEA;AACD;AAED;;;AAGG;UACc,aAAa;;AAE5B;AACA,8BAA0B,cAAc;;AAExC;AACD;AAED;AACA,cAAa,UAAU,EAAA,cAAA,oBAAA,aAAA;AAEvB;;;;;;;;;AASG;AACH,iBAAgB,gBAAgB,iBAAiB,aAAa,KAAK,oBAAoB;;AC/CvF;;;;;;;;AAQG;UACc,aAAa;AAC5B;;;AACA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA;;;;;;;;AAQA;;;;;;AAMA;;;;;;;;AAQA;;;;AAIA;;;;;;;;;;;;;;AAcA;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA;;;;;;;;;;;;;;;;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA2Fc,aAAa;uBACV,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyF9B;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAkDkB,aAAa;;;;;;;;;;;;;;;AAe7B;;;;;;;;AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAsCkB,aAAa;;2BAEZ,aAAa;;AAElC;;;AAGA;;;;;;;;AAQA;;;;;AAKA;;;AAGG;AACH;;;;;;;;;;;;;AAaA;;;;;AAKA;;;;;;;;qBAQe,aAAa;;;;;;;;;;;;;;;AAe5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAsGc,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDzB;;;AAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAgDS,aAAa
|
|
1
|
+
{"version":3,"file":"trismegisto-spine.d.ts","sources":["../../../projects/ui/src/route.model.ts","../../../projects/ui/src/route-tree.ts","../../../projects/ui/src/hermes.imports.ts","../../../projects/ui/src/brand.ts","../../../projects/ui/src/app-config.token.ts","../../../projects/ui/src/theme.service.ts","../../../projects/ui/src/theme-preset.service.ts","../../../projects/ui/src/density.service.ts","../../../projects/ui/src/theme.initializer.ts","../../../projects/ui/src/package-info.token.ts","../../../projects/ui/src/preferences.service.ts","../../../projects/ui/src/admin-api.token.ts","../../../projects/ui/src/quick-access.service.ts","../../../projects/ui/src/user-storage.ts","../../../projects/ui/src/runtime-environment.ts","../../../projects/ui/src/news.token.ts","../../../projects/ui/src/i18n/spine-messages.ts","../../../projects/ui/src/i18n/spine-messages.en.ts","../../../projects/ui/src/i18n/spine-messages.es.ts","../../../projects/ui/src/i18n/spine-i18n.ts"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs","sources":["../../../projects/ui/auto-service/src/docs/apps.technical.ts"],"sourcesContent":["// Especificação técnica da tela Aplicações do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,\n// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do\n// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Aplicações — especificação técnica\n\nTela \\`AutoServiceComponent\\` (seletor de client + \\`AutoServiceAppsComponent\\`), ligada ao router de template\n\\`AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID\\` (\\`ad100002-…\\`). Fala com o argos-admin-server em \\`{adminApi}/auto-service\\`\n(\\`AutoServiceService\\`), com o token no cabeçalho \\`x-access-token\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Client administrado (só o do token; ver Grupos) | \\`GET /auto-service\\` |\n| Aplicações do projeto do client | \\`GET /auto-service/:clientId/apps\\` |\n| Cadastrar (devolve o \\`secret\\`) | \\`POST /auto-service/:clientId/apps\\` (\\`{ name, allowed_grants }\\`) |\n| Editar / ativar / desativar | \\`PUT /auto-service/:clientId/apps/:appId\\` (\\`{ name, allowed_grants, enabled }\\` ou só \\`{ enabled }\\`) |\n| Excluir | \\`DELETE /auto-service/:clientId/apps/:appId\\` |\n| Gerar novo segredo | \\`POST /auto-service/:clientId/apps/:appId/secret\\` (resposta \\`{ id, secret }\\`, \\`no-store\\`) |\n| Operações registradas | \\`GET /auto-service/:clientId/apps/:appId/operations\\` |\n| Grupos com acesso (consumers) | \\`GET /auto-service/:clientId/apps/:appId/consumers\\` (\\`{ consumers: [{ consumer_id, group_id, group_name, group_type_name, group_type_level, group_is_admin, app_id, app_name, created_at }] }\\`) |\n| Grupos oferecidos em \"Novo acesso\" | \\`GET /auto-service/:clientId/groups\\` |\n| Novo acesso | \\`POST /auto-service/:clientId/apps/:appId/consumers\\` (\\`{ group_id }\\`) |\n| Remover acesso | \\`DELETE /auto-service/:clientId/apps/consumers/:consumerId\\` |\n| Operações liberadas ao grupo | \\`GET /auto-service/:clientId/apps/consumers/:consumerId/permissions\\` |\n| Liberar / retirar operação | \\`POST .../consumers/:consumerId/permissions\\` (\\`{ operation_id }\\`) / \\`DELETE .../permissions/:permissionId\\` |\n| Tokens de API da aplicação | \\`GET /auto-service/:clientId/apps/:appId/tokens\\` (\\`{ tokens: [{ id, consumer_id, name, description, token_prefix, expires_at, revoked_at, created_at, last_used_at }] }\\`) |\n| Novo token | \\`POST /auto-service/:clientId/apps/:appId/tokens\\` (\\`{ name, description?, expires_at, operation_ids? }\\`; resposta 201 \\`{ id, consumer_id, name, token }\\`) |\n| Revogar token | \\`DELETE /auto-service/:clientId/apps/:appId/tokens/:tokenId\\` (204) |\n| Operações do token (consumer dele) | as mesmas rotas de \\`.../apps/consumers/:consumerId/permissions\\` acima |\n\n## Tela\n\n- Tabela (\\`hm-data-grid\\`, \\`AutoServiceAppsComponent\\`) com Nome/Grants/Situação, **Cadastrar** na barra e, no menu da\n linha (primeira coluna), Editar, Desativar/Ativar (só a que cabe na situação), Gerar novo segredo e Excluir (com o\n \\`confirm\\` da grade). Clicar na linha (\\`rowClickable\\`) ou no botão do nome abre a aplicação embaixo: resumo com as\n mesmas ações e as abas Operações, Acessos e Tokens. Não há mais combobox + \"Consultar\".\n- Recarregar a lista (salvar, ativar, excluir) mantém a aplicação aberta com os dados novos ou a fecha se sumiu;\n trocar de client fecha a aplicação aberta.\n\n## Regras\n\n- **Autorização** (\\`clientAdminGuard\\`): grupo que administra o projeto do client + crachá Administrador ativo.\n App, consumer ou grupo de outro client responde 404, nunca 403 (\\`assertAppBelongsToClient\\`,\n \\`assertConsumerBelongsToClient\\`, \\`assertBodyGroupVisibleToClient\\`).\n- **Grupo de administração fora da aba Acessos** (decisão 32 do Argos): o servidor não lista o consumer dele, recusa\n \\`POST .../consumers\\` com ele (404 \"Grupo não encontrado\") e responde 404 às permissões e à remoção dele. A tela\n ainda descarta, por defesa, o consumer com \\`group_is_admin: true\\` e o grupo com \\`is_admin: true\\` em \"Novo\n acesso\" (servidor antigo). Consumers de token de API (aba Tokens) não são grupo e não mudam.\n- O \\`secret\\` só vem na resposta do \\`POST\\`; a tela mostra num \\`hm-alert\\` até ser fechado e não o guarda.\n- Grants: texto separado por vírgula, enviado como lista (\\`allowed_grants\\`) sem itens vazios.\n- **Excluir** passa por \\`HermesDialogService.confirm\\` (perigo, com o nome da aplicação) e **Remover** (acesso) pelo\n \\`confirm\\` da ação no \\`hm-data-grid\\`; só depois do sim sai o \\`DELETE\\`. Sucesso e falha viram toast\n (\\`AutoServiceDeleteFeedback\\`: \\`deleteDone\\`, ou o \\`detail\\` do servidor / \\`deleteError\\`). **Ativar/Desativar** chama o\n servidor direto (reversível).\n- O \\`secret\\` exibido some ao trocar de client e ao excluir a aplicação.\n- **Gerar novo segredo** passa por \\`HermesDialogService.confirm\\` (perigo) e mostra o segredo num \\`hm-modal\\` com\n \\`hm-copy-button\\`, uma vez: fechar (Concluir, Esc) descarta. Falha vira toast: 404 (aplicação de outro client),\n 403 (client que a pessoa não administra) ou o \\`detail\\` do servidor / \\`rotateSecretError\\`.\n- Ids nos caminhos vão codificados (\\`urlPath\\` de \\`@trismegisto/primitives\\`).\n- As abas são preguiçosas (\\`*hmTabContent\\`): cada uma só busca ao ser aberta. Abrir outra aplicação volta para\n **Operações**.\n- **Gerenciar operações** cruza \\`operations\\` com \\`permissions\\` (por \\`operation_id\\`) e grava só a diferença, em\n sequência: primeiro as liberações, depois as retiradas. Só \\`protected\\` depende de permissão: operação de outro nível\n sem permissão gravada vem marcada e desabilitada (\\`free\\`) e fica fora da diferença; com uma permissão antiga, segue\n editável para dar para retirar (o servidor recusa liberar uma não protegida com 400 \\`operation_not_protected\\`).\n Falha vira toast (\\`autoServiceErrorText\\`, ou \\`permissionsSaveError\\`) e o painel fica aberto.\n- **Tokens** (\\`AutoServiceAppTokensComponent\\`, \\`AutoServiceTokenCreateComponent\\`; mirror da aba Tokens do\n argos-admin): situação calculada no cliente (\\`revoked_at\\` → Revogado; \\`expires_at\\` vencido → Expirado; senão\n Ativo). **Novo token** relê as operações da aplicação: \\`protected\\` escolhíveis, as outras marcadas e desabilitadas e\n nunca enviadas em \\`operation_ids\\`. Validade num \\`hm-date-picker\\` de amanhã até hoje + 365 dias (padrão 90), enviada\n como a meia-noite LOCAL do dia (\\`localDayStartIso\\`) — o servidor aceita só datas no futuro e até agora + 365 dias.\n O \\`token\\` da resposta aparece uma única vez no modal (\\`hm-copy-button\\`); fechar descarta. Revogar passa pelo\n \\`confirm\\` da grade e vira toast; o token fica na lista como revogado, sem ações. \"Gerenciar operações\" do token abre\n o painel de permissões com o \\`consumer_id\\` do token (o nome no lugar do grupo).\n- **Erros dos tokens** (\\`autoServiceErrorText\\`, pt-BR/en/es em \\`autoService.tokenErrors\\`): \\`invalid_expires_at\\`,\n \\`invalid_validity\\`, \\`invalid_operation_ids\\`, \\`operation_not_protected\\`; 404 com \\`error\\` falando de aplicação ou de\n token vira \\`appNotFound\\`/\\`tokenNotFound\\`; senão o \\`detail\\` do servidor e, por último, \\`tokenSaveError\\` /\n \\`tokenRevokeError\\` / \\`tokensLoadError\\`. Erro ao criar aparece no modal (que continua aberto).\n- A auditoria das aplicações tem tela própria (Auditoria, \\`ad100004-…\\`).\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,qBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Ed;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs","sources":["../../../projects/ui/auto-service/src/docs/apps.usage.ts"],"sourcesContent":["// Manual de uso da tela Aplicações do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,\n// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do\n// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Aplicações\n\nGerencie as aplicações (credenciais \\`client_credentials\\`) do projeto do seu client, sem depender do painel\ncentral: cadastre, ative ou desative e exclua aplicações, veja as operações que cada uma registra, defina quais\ngrupos podem chamar quais operações e crie os tokens de API das aplicações.\n\n## Antes de começar\n\nComo nas outras telas do auto-serviço, o client administrado é o do app em que você está logado: não há client\npara escolher. É preciso estar no grupo de administração do projeto desse app e com o crachá **Administrador**\nativo.\n\n## Como usar\n\n1. A tela abre com a tabela das aplicações do projeto: **Nome**, **Grants** e **Situação** (**Ativo** ou\n **Inativo**). Dá para ordenar pelo nome e pela situação.\n2. Para criar uma aplicação, clique em **Cadastrar** (acima da tabela). No modal **Nova aplicação**, preencha o\n **Nome** (obrigatório) e os **Grants** (separados por vírgula; já vem \\`client_credentials\\`) e clique em **Salvar**.\n3. Ao criar, aparece no topo da tela o aviso **Aplicação criada** com o secret. **Copie e guarde o secret na hora:\n ele não é exibido de novo.** O aviso some quando você o fecha, troca de client ou exclui a aplicação.\n4. O menu **⋮** no começo de cada linha tem as ações da aplicação:\n - **Editar**: muda nome, grants e a caixa **Ativo**.\n - **Desativar** / **Ativar**: liga ou desliga a aplicação sem apagar nada.\n - **Gerar novo segredo**: abre a confirmação **Gerar um novo segredo?**. Confirmando, o segredo atual deixa de\n funcionar na hora (atualize o APP_SECRET do serviço que usa a aplicação; tokens já emitidos valem até expirar,\n até 1 hora) e o novo aparece numa janela, **uma única vez**, com o botão **Copiar**. **Concluir** fecha a janela.\n - **Excluir**: abre a confirmação **Excluir aplicação?** com o nome dela; só depois de **Excluir** no diálogo a\n aplicação é apagada e a credencial dela para de funcionar. **Cancelar** (ou Esc) não muda nada.\n5. Clique na linha (ou no nome, pelo teclado) para abrir a aplicação embaixo da tabela: o cartão com o nome, a\n situação, os grants e as mesmas ações do menu, e as abas **Operações**, **Acessos** e **Tokens**.\n\n> **Desativar** age na hora e se desfaz com **Ativar**. **Excluir** não tem volta: na dúvida, desative. Depois de\n> excluir aparece a mensagem **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e a\n> aplicação continua na tela.\n\n## Aba Operações\n\nLista, só para consulta, as operações registradas pela aplicação: **Identificador**, **Método**, **Nível** (o selo\nfica verde para operação pública e amarelo para protegida), **Descrição** e **Grupos permitidos** (quantos grupos já\npodem chamar a operação). A tela não cria nem edita operações.\n\n## Aba Acessos\n\nMostra os grupos que têm acesso à aplicação (**Grupo** e **Tipo**). O grupo de administração do projeto não aparece:\no acesso dele às aplicações é gerido só no painel central do Argos.\n\n- **Novo acesso**: escolha o **Grupo** e clique em **Criar**. Só aparecem os grupos do seu client (sem o de\n administração).\n- No menu de cada linha:\n - **Gerenciar operações** abre o painel **Operações de nome do grupo**, com uma caixa por operação\n (identificador, método, nível e descrição). Só as operações **protected** dependem de permissão: as **public** e\n **private** aparecem marcadas e travadas (liberadas para todos ou para autenticados). Marque o que o grupo pode\n chamar, desmarque o que não pode e clique em **Confirmar alterações** (o botão só habilita quando algo mudou).\n **Cancelar** descarta.\n - **Remover** pede confirmação (**Remover acesso à aplicação?**, com o nome do grupo) e só então tira o acesso do\n grupo à aplicação e as permissões de operação dele.\n\nDepois de criar o acesso, use **Gerenciar operações** para escolher o que o grupo pode chamar.\n\n## Aba Tokens\n\nTokens de API da aplicação: a credencial que um serviço envia no cabeçalho \\`x-api-token\\` para chamar as operações\nda aplicação sem login. A tabela mostra **Nome**, **Início do token** (os primeiros caracteres, para reconhecer),\n**Situação** (**Ativo**, **Expirado** ou **Revogado**), **Expira em** e **Último uso**.\n\n1. **Novo token** abre o formulário:\n - **Nome** (obrigatório) e **Descrição** (opcional).\n - **Expira em**: de amanhã até 365 dias a partir de hoje (vem com 90 dias). O token vale até a meia-noite desse\n dia.\n - **Operações liberadas ao token**: marque as operações **protected** que o token pode chamar. As **public** e\n **private** já valem para ele e aparecem marcadas e travadas.\n2. **Criar token** mostra o valor do token **uma única vez**, com o botão **Copiar**. **Copie e guarde na hora:\n fechando a janela (Concluir ou Esc) não há como vê-lo de novo.** Se ele se perder, revogue e crie outro.\n3. No menu de cada linha:\n - **Gerenciar operações** abre o mesmo painel da aba Acessos, para mudar as operações liberadas ao token.\n - **Revogar** pede confirmação (**Revogar token?**, com o nome dele). Confirmando, o token deixa de funcionar na\n hora e fica na lista como **Revogado**. Não tem volta.\n\nToken revogado não tem mais ações. Se o servidor recusar a criação (por exemplo, validade fora do intervalo), o\nmotivo aparece no próprio formulário.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,iBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFd;;"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
-
import { SpineAuditComponent } from '@trismegisto/spine/audit';
|
|
4
|
-
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Tela "Auditoria" do auto-serviço (router `AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID`): o dono/membro
|
|
8
|
-
* do projeto escolhe o client (como em Aplicações) e vê os eventos dos apps dele — com a MESMA tela do
|
|
9
|
-
* painel central (`SpineAuditComponent`, `@trismegisto/spine/audit`), no escopo `client`. Carregada só
|
|
10
|
-
* por `AUTO_SERVICE_SCREENS.audit` — nunca exportada pelo ponto de entrada (ver `public-api.ts`).
|
|
11
|
-
*/
|
|
12
|
-
class AutoServiceAuditComponent {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.client = signal(null, ...(ngDevMode ? [{ debugName: "client" }] : /* istanbul ignore next */ []));
|
|
15
|
-
}
|
|
16
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceAuditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.24", type: AutoServiceAuditComponent, isStandalone: true, selector: "spine-auto-service-audit", ngImport: i0, template: `
|
|
18
|
-
<spine-auto-service-client-picker (clientChange)="client.set($event)" />
|
|
19
|
-
@if (client(); as c) {
|
|
20
|
-
<br />
|
|
21
|
-
<spine-audit scope="client" [clientId]="c.id" />
|
|
22
|
-
}
|
|
23
|
-
`, isInline: true, styles: [".as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>:first-child{flex:1 1 20rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}\n"], dependencies: [{ kind: "component", type: AutoServiceClientPickerComponent, selector: "spine-auto-service-client-picker", outputs: ["clientChange"] }, { kind: "component", type: SpineAuditComponent, selector: "spine-audit", inputs: ["scope", "clientId", "adminApi"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
24
|
-
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceAuditComponent, decorators: [{
|
|
26
|
-
type: Component,
|
|
27
|
-
args: [{ selector: 'spine-auto-service-audit', imports: [AutoServiceClientPickerComponent, SpineAuditComponent], template: `
|
|
28
|
-
<spine-auto-service-client-picker (clientChange)="client.set($event)" />
|
|
29
|
-
@if (client(); as c) {
|
|
30
|
-
<br />
|
|
31
|
-
<spine-audit scope="client" [clientId]="c.id" />
|
|
32
|
-
}
|
|
33
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>:first-child{flex:1 1 20rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}\n"] }]
|
|
34
|
-
}] });
|
|
35
|
-
|
|
36
|
-
export { AutoServiceAuditComponent };
|
|
37
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs","sources":["../../../projects/ui/auto-service/src/auto-service-errors.ts","../../../projects/ui/auto-service/src/auto-service-delete.ts"],"sourcesContent":["import { HttpErrorResponse } from '@angular/common/http';\nimport type { SpineMessages } from '@trismegisto/spine';\n\ntype AutoServiceText = SpineMessages['autoService'];\n\n/**\n * Código do argos-admin-server (`{ error, detail }`) → texto do catálogo no idioma ativo. Grupos e acessos em\n * `autoService.groupErrors`, tokens de aplicação em `tokenErrors`, roteadores em `routerErrors`.\n */\nconst ERROR_TEXTS: Readonly<Record<string, (text: AutoServiceText) => string>> = {\n invalid_type: (t) => t.groupErrors.invalidType,\n admin_type_reserved: (t) => t.groupErrors.adminTypeReserved,\n empty_update: (t) => t.groupErrors.emptyUpdate,\n group_project_immutable: (t) => t.groupErrors.groupProjectImmutable,\n group_name_taken: (t) => t.groupErrors.groupNameTaken,\n admin_group_immutable: (t) => t.groupErrors.adminGroupImmutable,\n admin_group_protected: (t) => t.groupErrors.adminGroupProtected,\n admin_group_last_member: (t) => t.groupErrors.adminGroupLastMember,\n admin_group_access_protected: (t) => t.groupErrors.adminGroupAccessProtected,\n invalid_expires_at: (t) => t.tokenErrors.invalidExpiresAt,\n invalid_validity: (t) => t.tokenErrors.invalidValidity,\n invalid_operation_ids: (t) => t.tokenErrors.invalidOperationIds,\n operation_not_protected: (t) => t.tokenErrors.operationNotProtected,\n router_hierarchy_gap: (t) => t.routerErrors.hierarchyGap,\n invalid_allowed_type_ids: (t) => t.routerErrors.invalidAllowedTypes,\n invalid_allowed_types: (t) => t.routerErrors.invalidAllowedTypes,\n};\n\n/**\n * Texto de uma falha do auto-serviço no idioma ativo. Código de regra conhecido (grupos, acessos, tokens e roteadores)\n * vira o texto do catálogo; 404 cujo `error` fala de grupo (de outro projeto ou já excluído), de token ou de aplicação\n * vira `groupNotFound`/`tokenNotFound`/`appNotFound`; senão, o `detail` do servidor e, por último, `fallback`.\n */\nexport function autoServiceErrorText(err: unknown, text: AutoServiceText, fallback: string): string {\n if (!(err instanceof HttpErrorResponse)) return fallback;\n const body = err.error as { error?: unknown; detail?: unknown } | null | undefined;\n const code = typeof body?.error === 'string' ? body.error : '';\n const known = Object.prototype.hasOwnProperty.call(ERROR_TEXTS, code) ? ERROR_TEXTS[code] : undefined;\n if (known) return known(text);\n if (err.status === 404) {\n if (/grupo|group/i.test(code)) return text.groupErrors.groupNotFound;\n if (/token/i.test(code)) return text.tokenErrors.tokenNotFound;\n if (/\\bapp\\b|aplica/i.test(code)) return text.tokenErrors.appNotFound;\n }\n if (typeof body?.detail === 'string' && body.detail) return body.detail;\n return fallback;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HermesToastService } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { autoServiceErrorText } from './auto-service-errors';\n\n/**\n * Exclusões do auto-serviço: o DELETE com aviso. Sucesso vira toast `deleteDone`; falha vira toast de erro\n * com o texto da regra (`autoServiceErrorText`: código conhecido do servidor no idioma ativo, senão o `detail`\n * do servidor, senão `deleteError`) e nada propaga. A confirmação vem antes, de quem chama\n * (`HermesDialogService.confirm` ou o `confirm` da ação no `hm-data-grid`).\n */\n@Injectable({ providedIn: 'root' })\nexport class AutoServiceDeleteFeedback {\n private readonly toast = inject(HermesToastService);\n private readonly text = inject(SPINE_MESSAGES).autoService;\n\n /** `true` se excluiu. */\n async run(request: () => Promise<unknown>): Promise<boolean> {\n try {\n await request();\n this.toast.success(this.text.deleteDone);\n return true;\n } catch (err) {\n this.toast.error(autoServiceErrorText(err, this.text, this.text.deleteError));\n return false;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs","sources":["../../../projects/ui/auto-service/src/groups/group-modal/auto-service-group-modal.component.ts","../../../projects/ui/auto-service/src/groups/group-modal/auto-service-group-modal.component.html","../../../projects/ui/auto-service/src/groups/members/auto-service-group-members.component.ts","../../../projects/ui/auto-service/src/groups/members/auto-service-group-members.component.html","../../../projects/ui/auto-service/src/groups/members-modal/auto-service-group-members-modal.component.ts","../../../projects/ui/auto-service/src/groups/members-modal/auto-service-group-members-modal.component.html","../../../projects/ui/auto-service/src/groups/auto-service-groups.component.ts","../../../projects/ui/auto-service/src/groups/auto-service-groups.component.html"],"sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport {\n AlertComponent, ButtonComponent, CheckboxComponent, ComboboxComponent, ComboboxOption, InputComponent, ModalComponent, TextareaComponent,\n} from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { autoServiceErrorText } from '../../auto-service-errors';\nimport { AutoServiceGroup, AutoServiceGroupType, AutoServiceService } from '../../auto-service.service';\n\n/** Limite do nome no servidor (1–100). */\nexport const GROUP_NAME_MAX = 100;\n\n/**\n * Criar/editar grupo do projeto do client. Só os tipos `assignable` são oferecidos (o Administrador nunca é: é do grupo\n * de administração, que é gerido só no painel central e não aparece no auto-serviço). Falha do servidor aparece no próprio modal, no idioma ativo.\n * Mirror de admin/ui/.../groups/modals/groups-modal (argos-admin), sem o seletor de projeto.\n */\n@Component({\n selector: 'spine-auto-service-group-modal',\n standalone: true,\n imports: [\n CommonModule, ReactiveFormsModule, AlertComponent, ButtonComponent, CheckboxComponent, ComboboxComponent, InputComponent,\n ModalComponent, TextareaComponent,\n ],\n templateUrl: './auto-service-group-modal.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-group-modal.component.scss'],\n})\nexport class AutoServiceGroupModalComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly service = inject(AutoServiceService);\n /** Grupo em edição; `null` cria. */\n @Input() group: AutoServiceGroup | null = null;\n @Input() clientId = '';\n @Input() groupTypes: readonly AutoServiceGroupType[] = [];\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n /** O grupo gravado (o servidor devolve o grupo criado/alterado). */\n @Output() saved = new EventEmitter<AutoServiceGroup>();\n\n protected readonly nameMax = GROUP_NAME_MAX;\n readonly name = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.maxLength(GROUP_NAME_MAX)] });\n readonly typeId = new FormControl('', { nonNullable: true, validators: [Validators.required] });\n readonly description = new FormControl('', { nonNullable: true });\n readonly enabled = new FormControl(true, { nonNullable: true });\n\n saving = false;\n saveError: string | null = null;\n\n get isEdit(): boolean { return !!this.group?.id; }\n\n /** Tipos que dá para escolher (`assignable`; o Administrador nunca). */\n typeOptions: ComboboxOption[] = [];\n\n get canSave(): boolean {\n if (this.saving) return false;\n return this.name.valid && !!this.name.value.trim() && this.typeId.valid;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['groupTypes'] || changes['group']) {\n this.typeOptions = this.groupTypes\n .filter((t) => t.assignable !== false)\n .map((t) => ({ value: t.id, label: t.name }));\n }\n if (changes['open'] && this.open) this.resetForm();\n }\n\n resetForm() {\n const g = this.isEdit ? this.group : null;\n this.saveError = null;\n this.name.reset(g?.name ?? '');\n this.typeId.reset(g?.type?.id ?? '');\n this.description.reset(g?.description ?? '');\n this.enabled.reset(g ? !!g.enabled : true);\n }\n\n onModalOpenChange(value: boolean) { this.open = value; this.openChange.emit(value); }\n close() { this.onModalOpenChange(false); }\n\n async save() {\n if (!this.canSave) return;\n this.saving = true;\n this.saveError = null;\n this.cdr.markForCheck();\n // Descrição vazia vai como null na edição: o servidor só ignora campo ausente, e é assim que se apaga a descrição.\n const description = this.description.value.trim();\n try {\n let saved: AutoServiceGroup;\n if (this.isEdit && this.group) {\n saved = await this.service.updateGroup(this.clientId, this.group.id,\n { name: this.name.value.trim(), type_id: this.typeId.value, description: description || null, enabled: this.enabled.value });\n } else {\n saved = await this.service.createGroup(this.clientId, {\n name: this.name.value.trim(), type_id: this.typeId.value, ...(description ? { description } : {}),\n });\n }\n this.saved.emit(saved);\n this.close();\n } catch (err) {\n this.saveError = autoServiceErrorText(err, this.text, this.text.groupSaveError);\n } finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\" [heading]=\"isEdit ? text.editGroup : text.newGroup\" (closed)=\"close()\">\n <div class=\"form-stack\">\n <hm-alert *ngIf=\"saveError\" variant=\"error\">{{ saveError }}</hm-alert>\n <hm-input [formControl]=\"name\" [label]=\"text.groupName\" [maxLength]=\"nameMax\" />\n <hm-combobox [formControl]=\"typeId\" [options]=\"typeOptions\" [label]=\"text.groupType\" [placeholder]=\"text.groupTypePlaceholder\" />\n <hm-textarea [formControl]=\"description\" [label]=\"text.groupDescription\" />\n <hm-checkbox *ngIf=\"isEdit\" [formControl]=\"enabled\" [label]=\"text.active\" />\n </div>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!canSave\" [loading]=\"saving\" (clicked)=\"save()\">{{ isEdit ? text.save : text.create }}</hm-button>\n </ng-container>\n</hm-modal>\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AccountAvatarComponent, ButtonComponent, DataGridComponent, DataGridCellDirective, GridColumn, TagComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\ninterface GroupMemberRow {\n user_id: string;\n username: string;\n email: string;\n name?: string | null;\n picture?: string | null;\n enabled?: boolean;\n joined_at?: string | null;\n}\n\n// Mirror de admin/ui/.../groups/members/group-members.component.ts (argos-admin),\n// adaptado pra falar com /auto-service/:clientId/groups/:groupId/members em vez de\n// /admin/groups/:groupId/members.\n@Component({\n selector: 'spine-auto-service-group-members',\n standalone: true,\n imports: [CommonModule, ButtonComponent, TagComponent, AccountAvatarComponent, DataGridComponent, DataGridCellDirective],\n templateUrl: './auto-service-group-members.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-group-members.component.scss'],\n})\nexport class AutoServiceGroupMembersComponent implements OnChanges {\n\n private readonly catalog = inject(SPINE_MESSAGES);\n /** Data e hora curtas no idioma ativo. */\n protected formatDate(value: string | null | undefined): string {\n return value ? new Intl.DateTimeFormat(this.catalog.meta.locale, { dateStyle: 'short', timeStyle: 'short' }).format(new Date(value)) : '';\n }\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n @Input() clientId = '';\n @Input() groupId = '';\n @Input() refreshTrigger = 0;\n @Output() countChange = new EventEmitter<number>();\n @Output() manageMembers = new EventEmitter<void>();\n\n members: GroupMemberRow[] = [];\n loading = false;\n\n readonly rowId = (m: GroupMemberRow) => m.user_id;\n\n readonly columns = computed<GridColumn<GroupMemberRow>[]>(() => [\n { key: 'username', title: this.text.colUser, value: (m) => m.name || m.username, sortable: true },\n {\n key: 'joined_at',\n title: this.text.colMemberSince,\n value: (m) => (m.joined_at ? this.formatDate(m.joined_at) : '—'),\n sortable: true,\n },\n ]);\n\n constructor(private service: AutoServiceService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['groupId'] || changes['refreshTrigger']) {\n this.load();\n }\n }\n\n async load() {\n if (!this.clientId || !this.groupId) {\n this.members = [];\n this.countChange.emit(0);\n return;\n }\n this.loading = true;\n try {\n const res = await this.service.getGroupMembers(this.clientId, this.groupId);\n this.members = res.members;\n this.countChange.emit(this.members.length);\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"members\"\n [rowId]=\"rowId\"\n [caption]=\"text.membersCaption\"\n [loading]=\"loading\"\n [emptyMessage]=\"text.noMembers\"\n>\n <hm-button dataGridActions icon=\"employee-group\" (clicked)=\"manageMembers.emit()\">{{ text.manageMembers }}</hm-button>\n <ng-template hmCell=\"username\" let-m>\n <div class=\"user-cell\">\n <hm-account-avatar class=\"user-cell__avatar\" [name]=\"m.name || m.username\" [imageUrl]=\"m.picture\"></hm-account-avatar>\n <div class=\"user-cell__body\">\n <div class=\"user-cell__name\">\n <b>{{ m.name || m.username }}</b>\n <hm-tag [name]=\"m.enabled ? text.active : text.inactive\" [color]=\"m.enabled ? 'success' : 'danger'\" />\n </div>\n <div class=\"user-cell__email\">\n <ng-container *ngIf=\"m.name\">{{ m.username }} · </ng-container>{{ m.email }}\n </div>\n </div>\n </div>\n </ng-template>\n</hm-data-grid>\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n AccountAvatarComponent, AlertComponent, BadgeComponent, ButtonComponent, CardComponent, DataGridCellDirective, DataGridComponent, DividerComponent,\n EMPTY_SELECTION, GridColumn, GridSelection, IconButtonComponent, IconComponent, ModalComponent, SelectComponent, TagComponent,\n} from '@trismegisto/angular';\nimport { AutoServiceService } from '../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { autoServiceErrorText } from '../../auto-service-errors';\n\ninterface StagedMember {\n user_id: string;\n username: string;\n email: string;\n name?: string | null;\n picture?: string | null;\n enabled?: boolean;\n role?: string | null;\n joined_at?: string | null;\n added_by_username?: string | null;\n new?: boolean;\n}\n\nconst ROLE_OPTIONS = ['Administrador', 'Editor', 'Leitor'];\n\nlet searchSequence = 0;\n\n@Component({\n selector: 'spine-auto-service-group-members-modal',\n standalone: true,\n imports: [\n CommonModule, FormsModule, AccountAvatarComponent, AlertComponent, BadgeComponent, ButtonComponent, CardComponent, DataGridComponent,\n DataGridCellDirective, DividerComponent, IconButtonComponent, IconComponent, ModalComponent, SelectComponent, TagComponent,\n ],\n templateUrl: './auto-service-group-members-modal.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-group-members-modal.component.scss'],\n})\nexport class AutoServiceGroupMembersModalComponent implements OnChanges {\n\n private readonly catalog = inject(SPINE_MESSAGES);\n /** Data e hora curtas no idioma ativo. */\n protected formatDate(value: string | null | undefined): string {\n return value ? new Intl.DateTimeFormat(this.catalog.meta.locale, { dateStyle: 'short', timeStyle: 'short' }).format(new Date(value)) : '';\n }\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n protected readonly fmt = formatMessage;\n @Input() clientId = '';\n @Input() groupId = '';\n @Input() groupName = '';\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n @Output() saved = new EventEmitter<void>();\n\n roleOptions = ROLE_OPTIONS;\n /** Liga o rótulo \"Adicionar usuário\" ao campo de busca. */\n protected readonly searchId = `spine-members-search-${++searchSequence}`;\n loading = false;\n saving = false;\n /** Falha ao gravar (no idioma ativo); o que já tinha sido gravado fica — a lista é recarregada. */\n saveError: string | null = null;\n members: StagedMember[] = [];\n /** Ids marcados pra remoção — o grid seleciona por id (não por objeto, ver `GridSelection`). */\n checkedForRemovalIds: GridSelection = EMPTY_SELECTION;\n private originalRoles = new Map<string, string | null>();\n addSearch = '';\n addSearchResults: any[] = [];\n selectedToAdd: any = null;\n selectedRole: string | null = null;\n private addSearchTimer: any;\n suggestions: any[] = [];\n private suggestionsPool: any[] = [];\n private suggestionsVisibleCount = 3;\n\n readonly rowId = (m: StagedMember) => m.user_id;\n\n readonly columns = computed<GridColumn<StagedMember>[]>(() => [\n {\n key: 'username',\n title: this.text.colUser,\n value: (m) => [m.name, m.username, m.email].filter(Boolean).join(' '),\n sortable: true,\n },\n { key: 'role', title: this.text.colRole, value: (m) => m.role ?? '—' },\n {\n key: 'joined_at',\n title: this.text.colAddedAt,\n value: (m) => (m.joined_at ? this.formatDate(m.joined_at) : '—'),\n sortable: true,\n },\n ]);\n\n constructor(private service: AutoServiceService) {}\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) { this.resetAndLoad(); } }\n\n onModalOpenChange(value: boolean) { this.open = value; this.openChange.emit(value); }\n close() { this.onModalOpenChange(false); }\n\n get checkedForRemoval(): StagedMember[] {\n return this.members.filter((m) => this.checkedForRemovalIds.has(m.user_id));\n }\n get removalCount(): number { return this.checkedForRemovalIds.size; }\n get hasMoreSuggestions(): boolean { return this.suggestionsVisibleCount < this.suggestionsPool.length; }\n\n async resetAndLoad() {\n this.addSearch = ''; this.addSearchResults = []; this.selectedToAdd = null; this.selectedRole = null;\n this.checkedForRemovalIds = EMPTY_SELECTION; this.saveError = null; this.loading = true;\n try {\n const res = await this.service.getGroupMembers(this.clientId, this.groupId);\n this.members = (res.members ?? []).map((m: any) => ({\n user_id: m.user_id, username: m.username, email: m.email, name: m.name ?? null,\n picture: m.picture ?? null, enabled: m.enabled, role: m.role ?? null,\n joined_at: m.joined_at, added_by_username: m.added_by_username ?? null,\n }));\n this.originalRoles = new Map(this.members.map(m => [m.user_id, m.role ?? null]));\n this.cdr.markForCheck();\n await this.loadSuggestions();\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n async loadSuggestions() {\n if (!this.clientId) { this.suggestionsPool = []; this.suggestions = []; return; }\n const res = await this.service.searchUsers(this.clientId, { limit: 30 });\n const existingIds = new Set(this.members.map(m => m.user_id));\n this.suggestionsPool = (res.users ?? []).filter((u: any) => !existingIds.has(u.id));\n this.suggestionsVisibleCount = 3;\n this.suggestions = this.suggestionsPool.slice(0, this.suggestionsVisibleCount);\n }\n\n showMoreSuggestions() { this.suggestionsVisibleCount += 3; this.suggestions = this.suggestionsPool.slice(0, this.suggestionsVisibleCount); }\n\n onAddSearchChange(value: string) {\n this.addSearch = value; this.selectedToAdd = null; clearTimeout(this.addSearchTimer);\n if (value.trim().length < 2) { this.addSearchResults = []; return; }\n this.addSearchTimer = setTimeout(async () => {\n const res = await this.service.searchUsers(this.clientId, { search: value.trim(), limit: 10 });\n const existingIds = new Set(this.members.map(m => m.user_id));\n this.addSearchResults = (res.users ?? []).filter((u: any) => !existingIds.has(u.id));\n this.cdr.markForCheck();\n }, 300);\n }\n\n selectCandidate(user: any) { this.selectedToAdd = user; this.addSearch = user.username; this.addSearchResults = []; }\n clearSelectedToAdd() { this.selectedToAdd = null; this.addSearch = ''; this.addSearchResults = []; }\n\n addSelectedMember() {\n if (!this.selectedToAdd) return;\n const user = this.selectedToAdd;\n this.members = [{\n user_id: user.id, username: user.username, email: user.email, name: user.name ?? null, picture: user.picture ?? null, enabled: user.enabled,\n role: this.selectedRole, joined_at: null, added_by_username: null, new: true,\n }, ...this.members];\n this.suggestionsPool = this.suggestionsPool.filter(u => u.id !== user.id);\n this.suggestions = this.suggestionsPool.slice(0, this.suggestionsVisibleCount);\n this.clearSelectedToAdd(); this.selectedRole = null;\n }\n\n removeStagedNew(member: StagedMember) { this.members = this.members.filter(m => m.user_id !== member.user_id); }\n\n /** `[(selection)]` do grid: separa o que ainda é staged (nunca existiu no servidor — remove\n * na hora, não \"marca pra remover\") do que já existe (fica marcado, removido só no Salvar). */\n onSelectionChange(ids: GridSelection): void {\n const cleaned = this.members.filter((m) => ids.has(m.user_id));\n const stillNew = cleaned.filter((m) => m.new);\n for (const m of stillNew) this.removeStagedNew(m);\n this.checkedForRemovalIds = new Set([...ids].filter((id) => !stillNew.some((m) => m.user_id === id)));\n }\n\n isMarkedForRemoval(member: StagedMember): boolean { return this.checkedForRemovalIds.has(member.user_id); }\n undoRemoval(member: StagedMember): void {\n const next = new Set(this.checkedForRemovalIds);\n next.delete(member.user_id);\n this.checkedForRemovalIds = next;\n }\n\n async save() {\n this.saving = true;\n this.saveError = null;\n try {\n const toAdd = this.members.filter(m => m.new);\n for (const m of toAdd) { await this.service.addGroupMember(this.clientId, this.groupId, m.user_id, m.role ?? null); }\n for (const m of this.checkedForRemoval) { await this.service.removeGroupMember(this.clientId, this.groupId, m.user_id); }\n const removedIds = this.checkedForRemovalIds;\n const roleChanges = this.members.filter(m => !m.new && !removedIds.has(m.user_id) && (m.role ?? null) !== (this.originalRoles.get(m.user_id) ?? null));\n for (const m of roleChanges) { await this.service.updateGroupMemberRole(this.clientId, this.groupId, m.user_id, m.role ?? null); }\n this.saved.emit();\n this.close();\n } catch (err) {\n // Parte pode ter sido gravada (as chamadas são em sequência): recarrega para mostrar o estado real.\n this.saveError = autoServiceErrorText(err, this.text, this.text.membersSaveError);\n this.saved.emit();\n const error = this.saveError;\n await this.resetAndLoad().catch(() => undefined);\n this.saveError = error;\n } finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\" [heading]=\"fmt(text.membersHeading, { group: groupName })\" size=\"large\" (closed)=\"close()\">\n <div class=\"as-stack\">\n <hm-alert *ngIf=\"saveError\" variant=\"error\">{{ saveError }}</hm-alert>\n <hm-card>\n <div class=\"add-section__row\">\n <!-- Busca com lista de candidatos própria (vem da API a cada tecla): o rótulo é o que antes era o\n título do card. -->\n <div class=\"add-field\">\n <label class=\"add-field__label\" [attr.for]=\"searchId\">{{ text.addUser }}</label>\n <div class=\"add-search\">\n <hm-icon shape=\"search\" size=\"16\"></hm-icon>\n <input type=\"text\" [id]=\"searchId\" [placeholder]=\"text.userSearch\"\n [ngModel]=\"addSearch\" (ngModelChange)=\"onAddSearchChange($event)\" />\n <hm-icon shape=\"times\" size=\"14\" *ngIf=\"addSearch\" class=\"add-search__clear\" (click)=\"clearSelectedToAdd()\"></hm-icon>\n\n <div class=\"add-search__results\" *ngIf=\"addSearchResults.length\">\n <button type=\"button\" class=\"add-search__result\" *ngFor=\"let u of addSearchResults\" (click)=\"selectCandidate(u)\">\n <b>{{ u.name || u.username }}</b>\n <span class=\"muted\"><ng-container *ngIf=\"u.name\">{{ u.username }} · </ng-container>{{ u.email }}</span>\n </button>\n </div>\n </div>\n </div>\n\n <hm-select class=\"add-section__role\" [label]=\"text.role\" [value]=\"selectedRole ?? ''\" (valueChange)=\"selectedRole = $event || null\">\n <option value=\"\">{{ text.pickRole }}</option>\n <option *ngFor=\"let r of roleOptions\" [value]=\"r\">{{ r }}</option>\n </hm-select>\n\n <hm-button [disabled]=\"!selectedToAdd\" (clicked)=\"addSelectedMember()\">\n {{ text.add }}\n </hm-button>\n </div>\n\n <div class=\"suggestions\" *ngIf=\"suggestions.length\">\n <hm-divider [label]=\"text.suggestions\" />\n <div class=\"suggestions__row\">\n <button type=\"button\" class=\"suggestion-card\" *ngFor=\"let u of suggestions\" (click)=\"selectCandidate(u)\">\n <b>{{ u.name || u.username }}</b>\n <span class=\"muted\"><ng-container *ngIf=\"u.name\">{{ u.username }} · </ng-container>{{ u.email }}</span>\n </button>\n <hm-button *ngIf=\"hasMoreSuggestions\" emphasis=\"minimal\" (clicked)=\"showMoreSuggestions()\">\n {{ text.moreSuggestions }}\n </hm-button>\n </div>\n </div>\n </hm-card>\n\n <div class=\"members-split\">\n <div class=\"members-split__grid\">\n <hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"members\"\n [rowId]=\"rowId\"\n [caption]=\"fmt(text.membersOf, { group: groupName })\"\n [loading]=\"loading\"\n [selectable]=\"true\"\n [selection]=\"checkedForRemovalIds\"\n (selectionChange)=\"onSelectionChange($event)\"\n [emptyMessage]=\"text.noMembersShort\"\n >\n <ng-template hmCell=\"username\" let-m>\n <div class=\"user-cell\">\n <hm-account-avatar class=\"user-cell__avatar\" [name]=\"m.name || m.username\" [imageUrl]=\"m.picture\"></hm-account-avatar>\n <div class=\"user-cell__body\">\n <div class=\"user-cell__name\">\n <b>{{ m.name || m.username }}</b>\n <hm-tag *ngIf=\"m.new\" [name]=\"text.newMember\" color=\"info\" />\n </div>\n <div class=\"user-cell__email\">\n <ng-container *ngIf=\"m.name\">{{ m.username }} · </ng-container>{{ m.email }}\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template hmCell=\"role\" let-m>\n <hm-select class=\"role-cell\" [label]=\"text.colRole\" labelHidden [disabled]=\"isMarkedForRemoval(m)\"\n [value]=\"m.role ?? ''\" (valueChange)=\"m.role = $event || null\">\n <option value=\"\">—</option>\n <option *ngFor=\"let r of roleOptions\" [value]=\"r\">{{ r }}</option>\n </hm-select>\n </ng-template>\n\n <ng-template hmCell=\"joined_at\" let-m>\n <ng-container *ngIf=\"m.joined_at\">\n {{ formatDate(m.joined_at) }}\n <div class=\"muted\" *ngIf=\"m.added_by_username\">{{ fmt(text.addedBy, { user: m.added_by_username }) }}</div>\n </ng-container>\n <ng-container *ngIf=\"!m.joined_at\">—</ng-container>\n </ng-template>\n </hm-data-grid>\n </div>\n\n <div class=\"members-split__removal\">\n <hm-card class=\"removal-card\">\n <div class=\"removal-header\">\n <hm-icon shape=\"trash\"></hm-icon> {{ text.removal }} <hm-badge [value]=\"removalCount\" intent=\"danger\" />\n </div>\n\n <div class=\"removal-empty\" *ngIf=\"removalCount === 0\">\n <hm-icon shape=\"employee-group\" size=\"xxl\"></hm-icon>\n <p class=\"muted\">{{ text.removalEmpty }}</p>\n </div>\n\n <div class=\"removal-item\" *ngFor=\"let m of checkedForRemoval\">\n <div class=\"user-cell\">\n <hm-account-avatar class=\"user-cell__avatar\" [name]=\"m.name || m.username\"></hm-account-avatar>\n <div class=\"user-cell__body\">\n <b>{{ m.name || m.username }}</b>\n <div class=\"user-cell__email\">\n <ng-container *ngIf=\"m.name\">{{ m.username }} · </ng-container>{{ m.email }}\n </div>\n </div>\n </div>\n <hm-icon-button emphasis=\"subtle\" icon=\"undo\" [label]=\"text.undoRemoval\" (clicked)=\"undoRemoval(m)\" />\n </div>\n </hm-card>\n </div>\n </div>\n </div>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [loading]=\"saving\" [disabled]=\"saving\" (clicked)=\"save()\" icon=\"floppy\">\n {{ text.saveChanges }}\n </hm-button>\n </ng-container>\n</hm-modal>\n","import { Component, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ButtonComponent, CardComponent, DataGridActionTriggered, DataGridCellDirective, DataGridComponent, DataGridRowAction,\n GridColumn, HermesDialogService, TagColor, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AutoServiceDeleteFeedback } from '../auto-service-delete';\nimport { AutoServiceGroup, AutoServiceGroupType, AutoServiceService } from '../auto-service.service';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\nimport { AutoServiceGroupModalComponent } from './group-modal/auto-service-group-modal.component';\nimport { AutoServiceGroupMembersComponent } from './members/auto-service-group-members.component';\nimport { AutoServiceGroupMembersModalComponent } from './members-modal/auto-service-group-members-modal.component';\n\n/**\n * Grupos do projeto do client: tabela (Nome/Tipo/Situação) com criar, editar e excluir; o grupo aberto mostra o\n * resumo e os membros. O grupo de administração do projeto (`is_admin`) é gerido só no painel central (Argos): o\n * servidor não o devolve no auto-serviço e, se um servidor antigo devolver, a tela descarta. Mirror de admin/ui/.../features/admin/groups (argos-admin), escopado em `/auto-service/:clientId`.\n */\n@Component({\n selector: 'spine-auto-service-groups',\n standalone: true,\n imports: [\n CommonModule, ButtonComponent, CardComponent, DataGridComponent, DataGridCellDirective, TagComponent,\n AutoServiceClientPickerComponent, AutoServiceGroupModalComponent, AutoServiceGroupMembersComponent, AutoServiceGroupMembersModalComponent,\n ],\n templateUrl: './auto-service-groups.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-groups.component.scss'],\n})\nexport class AutoServiceGroupsComponent {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly dialogs = inject(HermesDialogService);\n private readonly deletion = inject(AutoServiceDeleteFeedback);\n private readonly service = inject(AutoServiceService);\n client: AutoServiceClient | null = null;\n groups: AutoServiceGroup[] = [];\n groupTypes: AutoServiceGroupType[] = [];\n loading = false;\n /** Grupo aberto (resumo + membros embaixo da tabela). */\n group: AutoServiceGroup | null = null;\n memberCount = 0;\n showMembersModal = false;\n membersVersion = 0;\n /** Grupo do modal de criar/editar; `null` cria. */\n modalGroup: AutoServiceGroup | null = null;\n showGroupModal = false;\n\n readonly rowId = (g: AutoServiceGroup) => g.id;\n readonly columns = computed<GridColumn<AutoServiceGroup>[]>(() => [\n { key: 'name', title: this.text.colName, value: (g) => g.name, sortable: true },\n { key: 'type', title: this.text.colType, value: (g) => g.type?.name ?? '—', sortable: true },\n { key: 'status', title: this.text.colStatus, value: (g) => (g.enabled ? this.text.active : this.text.inactive), sortable: true },\n ]);\n readonly rowActions = computed<DataGridRowAction<AutoServiceGroup>[]>(() => [\n { id: 'edit', icon: 'pencil', label: this.text.edit },\n {\n id: 'delete', icon: 'trash', label: this.text.delete, danger: true, separatorAbove: true,\n confirm: (g) => ({ heading: this.text.confirmDeleteGroupHeading, message: formatMessage(this.text.confirmDeleteGroup, { name: g.name }) }),\n },\n ]);\n\n onClientChange(c: AutoServiceClient | null) {\n this.client = c;\n this.group = null;\n this.groups = [];\n void this.load();\n }\n\n /** Cor do selo do tipo de grupo (`hm-tag`): quanto mais alto o nível, mais \"quente\". O texto do\n * selo é o nome do tipo — a cor só reforça (WCAG 1.4.1). */\n levelTagColor(level?: number): TagColor {\n if (!level) return 'neutral';\n if (level >= 50) return 'danger';\n if (level >= 40) return 'warning';\n if (level >= 30) return 'info';\n if (level >= 20) return 'success';\n return 'neutral';\n }\n\n openGroupLabel(g: AutoServiceGroup): string { return formatMessage(this.text.openGroup, { name: g.name }); }\n\n /** Grupos (do tipo de nível mais alto para o mais baixo) e os tipos do realm, juntos. */\n async load() {\n const client = this.client;\n if (!client) { this.groups = []; this.groupTypes = []; return; }\n this.loading = true;\n this.cdr.markForCheck();\n try {\n // Sem os tipos (admin-server sem `group-types`) a lista abre igual; só o modal fica sem tipo para escolher.\n const [groups, types] = await Promise.all([\n this.service.getGroups(client.id),\n this.service.getGroupTypes(client.id).catch(() => ({ group_types: [] as AutoServiceGroupType[] })),\n ]);\n if (this.client?.id !== client.id) return;\n // O grupo de administração não é do auto-serviço; servidor antigo ainda o devolve.\n this.groups = (groups.groups ?? []).filter((g) => !g.is_admin).sort((a, b) => (b.type?.level ?? 0) - (a.type?.level ?? 0));\n this.groupTypes = types.group_types ?? [];\n // O grupo aberto acompanha o que o servidor devolveu (nome/descrição novos) ou fecha se sumiu.\n if (this.group) this.group = this.groups.find((g) => g.id === this.group!.id) ?? null;\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n openGroup(g: AutoServiceGroup) {\n if (this.group?.id !== g.id) this.memberCount = 0;\n this.group = g;\n this.cdr.markForCheck();\n }\n\n openCreate() { this.modalGroup = null; this.showGroupModal = true; this.cdr.markForCheck(); }\n openEdit(g: AutoServiceGroup) { this.modalGroup = g; this.showGroupModal = true; this.cdr.markForCheck(); }\n\n async onGroupSaved(saved: AutoServiceGroup) {\n await this.load();\n // Recém-criado já abre, para incluir os membros em seguida.\n const fresh = this.groups.find((g) => g.id === saved?.id);\n if (fresh) this.group = fresh;\n this.cdr.markForCheck();\n }\n\n /** Botão Excluir do resumo: confirma e exclui. A ação da tabela já confirma pelo `confirm` dela. */\n async confirmDelete(g: AutoServiceGroup) {\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmDeleteGroupHeading,\n message: formatMessage(this.text.confirmDeleteGroup, { name: g.name }),\n confirmLabel: this.text.delete,\n danger: true,\n });\n if (ok) await this.deleteGroup(g);\n }\n\n async deleteGroup(g: AutoServiceGroup) {\n if (!this.client) return;\n if (!(await this.deletion.run(() => this.service.deleteGroup(this.client!.id, g.id)))) return;\n if (this.group?.id === g.id) this.group = null;\n await this.load();\n }\n\n onAction(e: DataGridActionTriggered<AutoServiceGroup>): void {\n if (e.action === 'edit') this.openEdit(e.row);\n if (e.action === 'delete') void this.deleteGroup(e.row);\n }\n\n openMembers() { this.showMembersModal = true; }\n onMembersSaved() { this.membersVersion++; }\n}\n","<!-- Título e descrição da tela vêm da barra da página (nome + description do router). -->\n<div class=\"as-stack\">\n <spine-auto-service-client-picker (clientChange)=\"onClientChange($event)\"></spine-auto-service-client-picker>\n\n <ng-container *ngIf=\"client\">\n <!-- Clicar na linha (ou no nome, pelo teclado) abre o grupo embaixo da tabela. -->\n <hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"groups\"\n [rowId]=\"rowId\"\n [caption]=\"text.groupsCaption\"\n [loading]=\"loading\"\n [rowActions]=\"rowActions()\"\n [emptyMessage]=\"text.noGroups\"\n rowClickable\n (rowClicked)=\"openGroup($event)\"\n (actionTriggered)=\"onAction($event)\"\n >\n <hm-button dataGridActions icon=\"plus\" (clicked)=\"openCreate()\">{{ text.newGroup }}</hm-button>\n <ng-template hmCell=\"name\" let-g>\n <span class=\"name-cell\">\n <button type=\"button\" class=\"name-cell__open\" [attr.aria-label]=\"openGroupLabel(g)\"\n [attr.aria-current]=\"group?.id === g.id ? 'true' : null\" (click)=\"openGroup(g)\">{{ g.name }}</button>\n </span>\n </ng-template>\n <ng-template hmCell=\"type\" let-g>\n <hm-tag *ngIf=\"g.type?.name; else noType\" [name]=\"g.type.name\" [color]=\"levelTagColor(g.type?.level)\" />\n <ng-template #noType>—</ng-template>\n </ng-template>\n <ng-template hmCell=\"status\" let-g>\n <hm-tag [name]=\"g.enabled ? text.active : text.inactive\" [color]=\"g.enabled ? 'success' : 'danger'\" />\n </ng-template>\n </hm-data-grid>\n\n <ng-container *ngIf=\"group as g\">\n <hm-card>\n <div class=\"as-summary\">\n <div class=\"as-summary__info\">\n <p class=\"as-summary__title group-title\">\n {{ g.name }}\n <hm-tag *ngIf=\"g.type?.name\" [name]=\"g.type!.name\" [color]=\"levelTagColor(g.type?.level)\" />\n <hm-tag [name]=\"g.enabled ? text.active : text.inactive\" [color]=\"g.enabled ? 'success' : 'danger'\" />\n </p>\n <p class=\"as-summary__detail\">{{ g.description || text.noDescription }}</p>\n </div>\n <div class=\"as-actions\">\n <hm-button emphasis=\"medium\" icon=\"pencil\" (clicked)=\"openEdit(g)\">{{ text.edit }}</hm-button>\n <hm-button intent=\"danger\" emphasis=\"medium\" icon=\"trash\" (clicked)=\"confirmDelete(g)\">{{ text.delete }}</hm-button>\n </div>\n </div>\n </hm-card>\n\n <spine-auto-service-group-members [clientId]=\"client.id\" [groupId]=\"g.id\" [refreshTrigger]=\"membersVersion\"\n (countChange)=\"memberCount = $event\" (manageMembers)=\"openMembers()\"></spine-auto-service-group-members>\n\n <spine-auto-service-group-members-modal [clientId]=\"client.id\" [groupId]=\"g.id\" [groupName]=\"g.name\"\n [open]=\"showMembersModal\" (openChange)=\"showMembersModal = $event\" (saved)=\"onMembersSaved()\">\n </spine-auto-service-group-members-modal>\n </ng-container>\n\n <spine-auto-service-group-modal [clientId]=\"client.id\" [group]=\"modalGroup\" [groupTypes]=\"groupTypes\"\n [open]=\"showGroupModal\" (openChange)=\"showGroupModal = $event\" (saved)=\"onGroupSaved($event)\">\n </spine-auto-service-group-modal>\n </ng-container>\n</div>\n"],"names":["i1","i1.AutoServiceService"],"mappings":"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"}
|
package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
-
import { SpineLoginAttemptsComponent } from '@trismegisto/spine/audit';
|
|
4
|
-
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Tela "Tentativas de login" do auto-serviço (router `AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID`, no menu
|
|
8
|
-
* Auditoria ao lado de Ações): o client do app + a MESMA tela do painel central (`SpineLoginAttemptsComponent`,
|
|
9
|
-
* `@trismegisto/spine/audit`) no escopo `client` -- só as tentativas de login nesta aplicação. Carregada só por
|
|
10
|
-
* `AUTO_SERVICE_SCREENS.loginAttempts` -- nunca exportada pelo ponto de entrada (ver `public-api.ts`).
|
|
11
|
-
*/
|
|
12
|
-
class AutoServiceLoginAttemptsComponent {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.client = signal(null, ...(ngDevMode ? [{ debugName: "client" }] : /* istanbul ignore next */ []));
|
|
15
|
-
}
|
|
16
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceLoginAttemptsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.24", type: AutoServiceLoginAttemptsComponent, isStandalone: true, selector: "spine-auto-service-login-attempts", ngImport: i0, template: `
|
|
18
|
-
<spine-auto-service-client-picker (clientChange)="client.set($event)" />
|
|
19
|
-
@if (client(); as c) {
|
|
20
|
-
<br />
|
|
21
|
-
<spine-login-attempts scope="client" [clientId]="c.id" />
|
|
22
|
-
}
|
|
23
|
-
`, isInline: true, styles: [".as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>:first-child{flex:1 1 20rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}\n"], dependencies: [{ kind: "component", type: AutoServiceClientPickerComponent, selector: "spine-auto-service-client-picker", outputs: ["clientChange"] }, { kind: "component", type: SpineLoginAttemptsComponent, selector: "spine-login-attempts", inputs: ["scope", "clientId", "realmId", "adminApi"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
24
|
-
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceLoginAttemptsComponent, decorators: [{
|
|
26
|
-
type: Component,
|
|
27
|
-
args: [{ selector: 'spine-auto-service-login-attempts', imports: [AutoServiceClientPickerComponent, SpineLoginAttemptsComponent], template: `
|
|
28
|
-
<spine-auto-service-client-picker (clientChange)="client.set($event)" />
|
|
29
|
-
@if (client(); as c) {
|
|
30
|
-
<br />
|
|
31
|
-
<spine-login-attempts scope="client" [clientId]="c.id" />
|
|
32
|
-
}
|
|
33
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>:first-child{flex:1 1 20rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}\n"] }]
|
|
34
|
-
}] });
|
|
35
|
-
|
|
36
|
-
export { AutoServiceLoginAttemptsComponent };
|
|
37
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map
|