@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.
Files changed (37) hide show
  1. package/fesm2022/{trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs → trismegisto-spine-auto-service-apps.technical-dKM4fG42.mjs} +19 -14
  2. package/fesm2022/trismegisto-spine-auto-service-apps.technical-dKM4fG42.mjs.map +1 -0
  3. package/fesm2022/{trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs → trismegisto-spine-auto-service-apps.usage-VMrCG5o3.mjs} +14 -10
  4. package/fesm2022/trismegisto-spine-auto-service-apps.usage-VMrCG5o3.mjs.map +1 -0
  5. package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs +37 -0
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. package/fesm2022/{trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs → trismegisto-spine-auto-service-auto-service-delete-B1tXgMvi.mjs} +2 -1
  12. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-B1tXgMvi.mjs.map +1 -0
  13. 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
  14. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-C4iQ2GPX.mjs.map +1 -0
  15. package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs +37 -0
  16. 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
  17. package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs → trismegisto-spine-auto-service-auto-service.component-DV88Uger.mjs} +78 -80
  18. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DV88Uger.mjs.map +1 -0
  19. package/fesm2022/{trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs → trismegisto-spine-auto-service-groups.technical-D05838rU.mjs} +11 -7
  20. package/fesm2022/trismegisto-spine-auto-service-groups.technical-D05838rU.mjs.map +1 -0
  21. package/fesm2022/{trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs → trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs} +11 -12
  22. package/fesm2022/trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs.map +1 -0
  23. package/fesm2022/trismegisto-spine-auto-service.mjs +9 -9
  24. package/fesm2022/trismegisto-spine.mjs +24 -6
  25. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  26. package/package.json +6 -6
  27. package/types/trismegisto-spine.d.ts +22 -7
  28. package/types/trismegisto-spine.d.ts.map +1 -1
  29. package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +0 -1
  30. package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +0 -1
  31. package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs +0 -37
  32. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +0 -1
  33. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +0 -1
  34. package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +0 -37
  35. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +0 -1
  36. package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +0 -1
  37. 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.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.0",
11
- "@trismegisto/core": "^3.0.0",
12
- "@trismegisto/icons": "^3.0.0",
13
- "@trismegisto/primitives": "^3.0.0",
14
- "@trismegisto/tokens": "^3.0.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
- /** @deprecated não é mais exibido (Grupos e Aplicações viraram tabelas, sem "Consultar"). */
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
- /** @deprecated não é mais exibido (a tela Grupos lista os grupos numa tabela, sem "Consultar"). */
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
- /** @deprecated não é mais exibido (a tela Aplicações lista as aplicações numa tabela, sem "Consultar"). */
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
- /** `{name}`: nome acessível do botão que abre o grupo na lista. */
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
- /** Tela Aplicações: tabela das aplicações do projeto (clicar na linha abre a aplicação embaixo). */
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
- /** `{name}`: nome acessível do botão que abre a aplicação na lista. */
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
- /** Por que a operação não depende de permissão (caixa marcada e desabilitada): public/optional, private, outro nível. */
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BzB;;;AAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDH;;;;;;;;;AASA;;;;;AAKA;;;;;;;;;;;;;AAaF;;;;AAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA8Cc,aAAa;sBACX,aAAa;qBACd,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA+Db,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwEb,aAAa;;;;;;;;;;;;;AAa5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA2CmB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BE,iBAAS,MAAM;iBACN,MAAM;iBACN,MAAM;;;;;;;;;AAalB;AAED,cAAa,oBAAoB,EAAE,aAoiClC;;AC5sED,cAAa,iBAAiB,EAAE,aAkiC/B;;ACliCD,cAAa,iBAAiB,EAAE,aAmiC/B;;KC9hCW,qBAAqB,GAAG,eAAe,CAAC,aAAa;UAEhD,eAAe;;AAE9B,wBAAoB,QAAQ,CAAC,MAAM,SAAS,aAAa;;AAEzD,wBAAoB,qBAAqB;AAC1C;AAED,cAAa,iBAAiB,EAAA,cAAA,CAAA,eAAA;AAe9B;;;;AAIG;AACH,iBAAgB,oBAAoB,IAAI,aAAa;AAIrD;;;;;;;;AAQG;AACH,cAAa,cAAc,EAAA,cAAA,CAAA,aAAA;AAkB3B;AACA,iBAAgB,oBAAoB,SAAS,eAAe,GAAG,QAAQ;;","names":[]}
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":";;;;;;AAKA;;;AAGG;AACH,MAAM,WAAW,GAAgE;IAC/E,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,WAAW;IAC9C,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,iBAAiB;IAC3D,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,WAAW;IAC9C,uBAAuB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,qBAAqB;IACnE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,cAAc;IACrD,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,mBAAmB;IAC/D,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,mBAAmB;IAC/D,uBAAuB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,oBAAoB;IAClE,4BAA4B,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,yBAAyB;IAC5E,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,gBAAgB;IACzD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,eAAe;IACtD,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,mBAAmB;IAC/D,uBAAuB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,qBAAqB;IACnE,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,YAAY;IACxD,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,mBAAmB;IACnE,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,mBAAmB;CACjE;AAED;;;;AAIG;SACa,oBAAoB,CAAC,GAAY,EAAE,IAAqB,EAAE,QAAgB,EAAA;AACxF,IAAA,IAAI,EAAE,GAAG,YAAY,iBAAiB,CAAC;AAAE,QAAA,OAAO,QAAQ;AACxD,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAiE;AAClF,IAAA,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,SAAS;AACrG,IAAA,IAAI,KAAK;AAAE,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC;AAC7B,IAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AACtB,QAAA,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa;AACpE,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa;AAC9D,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW;IACvE;IACA,IAAI,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM;AACvE,IAAA,OAAO,QAAQ;AACjB;;ACzCA;;;;;AAKG;MAEU,yBAAyB,CAAA;AADtC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAClC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;AAa3D,IAAA;;IAVC,MAAM,GAAG,CAAC,OAA+B,EAAA;AACvC,QAAA,IAAI;YACF,MAAM,OAAO,EAAE;YACf,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC7E,YAAA,OAAO,KAAK;QACd;IACF;+GAdW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cADZ,MAAM,EAAA,CAAA,CAAA;;4FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
@@ -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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"}
@@ -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