@trismegisto/spine 2.1.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -19
- package/fesm2022/trismegisto-spine-audit.mjs +264 -10
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs +84 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs → trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs} +6 -5
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs → trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs} +9 -8
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs} +4 -4
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs.map → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs → trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs} +123 -27
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs +544 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs +943 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs → trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs} +24 -3
- package/fesm2022/trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs → trismegisto-spine-auto-service-client.usage-CcJANb20.mjs} +15 -6
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CcJANb20.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs +65 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs +81 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs → trismegisto-spine-auto-service-home.component-5_aji1hf.mjs} +5 -4
- package/fesm2022/trismegisto-spine-auto-service-home.component-5_aji1hf.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs +60 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +49 -29
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout.mjs +1850 -217
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +28 -8
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +1163 -87
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-audit.d.ts +180 -5
- package/types/trismegisto-spine-audit.d.ts.map +1 -1
- package/types/trismegisto-spine-auto-service.d.ts +100 -7
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +885 -22
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts +11 -2
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +496 -34
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +0 -48
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +0 -55
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs +0 -357
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs +0 -502
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +0 -54
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs","sources":["../../../projects/ui/auto-service/src/tabs/auto-service-apps/modals/apps-modal/auto-service-apps-modal.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/modals/apps-modal/auto-service-apps-modal.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/modals/consumer-create/auto-service-consumer-create.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/modals/consumer-create/auto-service-consumer-create.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/operation-level.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/modals/consumer-permissions/auto-service-consumer-permissions.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/modals/consumer-permissions/auto-service-consumer-permissions.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/auto-service-app-access.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/auto-service-app-access.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-operations/auto-service-app-operations.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-operations/auto-service-app-operations.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/token-create/auto-service-token-create.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/token-create/auto-service-token-create.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/auto-service-app-tokens.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/auto-service-app-tokens.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/auto-service-apps.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/auto-service-apps.component.html","../../../projects/ui/auto-service/src/auto-service.component.ts","../../../projects/ui/auto-service/src/auto-service.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 { ButtonComponent, CheckboxComponent, InputComponent, ModalComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n@Component({\n selector: 'spine-auto-service-apps-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonComponent, CheckboxComponent, InputComponent, ModalComponent],\n templateUrl: './auto-service-apps-modal.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-apps-modal.component.scss'],\n})\nexport class AutoServiceAppsModalComponent 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 @Input() app: any = null;\n @Input() clientId = '';\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n @Output() saved = new EventEmitter<string | undefined>();\n\n readonly name = new FormControl('', { nonNullable: true, validators: [Validators.required] });\n readonly grants = new FormControl('client_credentials', { nonNullable: true });\n readonly enabled = new FormControl(true, { nonNullable: true });\n\n saving = false;\n constructor(private service: AutoServiceService) {}\n get isEdit(): boolean { return !!this.app?.id; }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) { this.resetForm(); } }\n\n resetForm() {\n if (this.isEdit) {\n this.name.setValue(this.app.name);\n this.grants.setValue(this.app.allowed_grants?.join(', ') ?? '');\n this.enabled.setValue(this.app.enabled);\n } else {\n this.name.setValue('');\n this.grants.setValue('client_credentials');\n this.enabled.setValue(true);\n }\n }\n\n onModalOpenChange(value: boolean) { this.open = value; this.openChange.emit(value); }\n close() { this.onModalOpenChange(false); }\n\n async save() {\n this.saving = true;\n try {\n const allowed_grants = this.grants.value.split(',').map(s => s.trim()).filter(Boolean);\n if (this.isEdit) {\n await this.service.updateApp(this.clientId, this.app.id, { name: this.name.value, allowed_grants, enabled: this.enabled.value });\n this.saved.emit();\n } else {\n const res = await this.service.createApp(this.clientId, { name: this.name.value, allowed_grants });\n this.saved.emit(res.secret);\n }\n this.close();\n } finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\" [heading]=\"isEdit ? text.editApp : text.newApp\" (closed)=\"close()\">\n <div class=\"form-stack\">\n <hm-input [formControl]=\"name\" [label]=\"text.name\" />\n <hm-input [formControl]=\"grants\" [label]=\"text.grants\" placeholder=\"client_credentials\" />\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]=\"!name.value\" [loading]=\"saving\" (clicked)=\"save()\">{{ text.save }}</hm-button>\n </ng-container>\n</hm-modal>\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonComponent, ComboboxComponent, ComboboxOption, ModalComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n@Component({\n selector: 'spine-auto-service-consumer-create',\n standalone: true,\n imports: [CommonModule, ButtonComponent, ComboboxComponent, ModalComponent],\n templateUrl: './auto-service-consumer-create.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-consumer-create.component.scss'],\n})\nexport class AutoServiceConsumerCreateComponent 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 @Input() clientId = '';\n @Input() appId = '';\n @Input() availableGroups: any[] = [];\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n @Output() created = new EventEmitter<void>();\n groupId = '';\n saving = false;\n constructor(private service: AutoServiceService) {}\n\n get groupOptions(): ComboboxOption[] {\n return this.availableGroups.map((g) => ({ value: g.id, label: g.type ? `${g.name} (${g.type.name})` : g.name }));\n }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) { this.groupId = ''; } }\n onModalOpenChange(value: boolean) { this.open = value; this.openChange.emit(value); }\n close() { this.onModalOpenChange(false); }\n\n async save() {\n if (!this.groupId) return;\n this.saving = true;\n try { await this.service.createAppConsumer(this.clientId, this.appId, this.groupId); this.created.emit(); this.close(); }\n finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\" [heading]=\"text.newAccessHeading\" (closed)=\"close()\">\n <hm-combobox [label]=\"text.group\" [options]=\"groupOptions\" [value]=\"groupId\" (valueChange)=\"groupId = $event\"></hm-combobox>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!groupId\" [loading]=\"saving\" (clicked)=\"save()\">{{ text.create }}</hm-button>\n </ng-container>\n</hm-modal>\n","import type { TagColor } from '@trismegisto/angular';\nimport type { SpineMessages } from '@trismegisto/spine';\n\n/**\n * Só operação `protected` depende de permissão (grupo ou token com a operação liberada). `public` roda para qualquer um,\n * `optional` também (com credencial vale como private) e `private` para qualquer autenticado: liberar uma delas a um\n * token não muda nada, e o admin-server recusa (400 `operation_not_protected`).\n */\nexport function requiresPermission(level: string | null | undefined): boolean {\n return level === 'protected';\n}\n\n/** Por que a operação não precisa de permissão (no idioma ativo); vazio para `protected`. */\nexport function freeAccessText(level: string | null | undefined, text: SpineMessages['autoService']): string {\n if (requiresPermission(level)) return '';\n if (level === 'private') return text.freeForAuthenticated;\n if (level === 'public' || level === 'optional') return text.freeForAll;\n return text.freeNoPermission;\n}\n\n/** Cor do selo de nível, a mesma da aba Operações: pública em verde, protegida em amarelo; o resto neutro. */\nexport function levelTagColor(level: string | null | undefined): TagColor {\n if (level === 'public') return 'success';\n if (level === 'protected') return 'warning';\n return 'neutral';\n}\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ButtonComponent, DrawerComponent, HermesToastService, IconComponent, TagComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../../../auto-service.service';\nimport { autoServiceErrorText } from '../../../../../../auto-service-errors';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { freeAccessText, levelTagColor, requiresPermission } from '../../../app-tokens/operation-level';\n\ninterface OperationRow {\n operation_id: string; identifier: string; method: string; level: string; description?: string;\n permissionId?: string; control: FormControl<boolean>;\n /** Operação que não depende de permissão (public/private) e sem permissão gravada: caixa marcada e desabilitada. */\n free: string;\n}\n\n@Component({\n selector: 'spine-auto-service-consumer-permissions',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonComponent, DrawerComponent, IconComponent, TagComponent],\n templateUrl: './auto-service-consumer-permissions.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-consumer-permissions.component.scss'],\n})\nexport class AutoServiceConsumerPermissionsComponent 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 protected readonly fmt = formatMessage;\n protected readonly levelTagColor = levelTagColor;\n private readonly toast = inject(HermesToastService);\n @Input() clientId = '';\n @Input() appId = '';\n @Input() consumer: any = null;\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n rows: OperationRow[] = [];\n loading = false;\n saving = false;\n constructor(private service: AutoServiceService) {}\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) { this.reset(); } }\n close() { this.open = false; this.openChange.emit(false); }\n\n async reset() {\n this.loading = true;\n try {\n const [opsRes, permsRes] = await Promise.all([\n this.service.getAppOperations(this.clientId, this.appId),\n this.service.getAppPermissions(this.clientId, this.consumer.consumer_id),\n ]);\n const operations = opsRes.operations ?? [];\n const permissions = permsRes.permissions ?? [];\n this.rows = operations.map((op: any) => {\n const perm = permissions.find((p: any) => p.operation_id === op.operation_id);\n // Só `protected` depende de permissão (o servidor recusa as outras com 400 operation_not_protected): sem\n // permissão gravada, a caixa vem marcada e travada; com uma antiga, fica editável para dar para retirar.\n const free = !perm && !requiresPermission(op.level) ? freeAccessText(op.level, this.text) : '';\n return {\n operation_id: op.operation_id, identifier: op.identifier, method: op.method, level: op.level,\n description: op.description, permissionId: perm?.permission_id, free,\n control: free\n ? new FormControl({ value: true, disabled: true }, { nonNullable: true })\n : new FormControl(!!perm, { nonNullable: true }),\n };\n });\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n get hasChanges(): boolean { return this.rows.some(r => !r.free && r.control.value !== !!r.permissionId); }\n\n async confirm() {\n const toAdd = this.rows.filter(r => !r.free && r.control.value && !r.permissionId);\n const toRemove = this.rows.filter(r => !r.free && !r.control.value && r.permissionId);\n if (toAdd.length === 0 && toRemove.length === 0) { this.close(); return; }\n this.saving = true;\n try {\n for (const r of toAdd) { await this.service.addAppPermission(this.clientId, this.consumer.consumer_id, r.operation_id); }\n for (const r of toRemove) { await this.service.removeAppPermission(this.clientId, this.consumer.consumer_id, r.permissionId!); }\n this.close();\n } catch (err) {\n // O drawer fica aberto; reabrir relê o que de fato ficou gravado.\n this.toast.error(autoServiceErrorText(err, this.text, this.text.permissionsSaveError));\n } finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-drawer [open]=\"open\" (openChange)=\"open = $event\" [heading]=\"fmt(text.operationsOf, { group: consumer?.group_name ?? '' })\" (closed)=\"close()\">\n <div *ngIf=\"loading\" class=\"loading-row\">{{ text.loading }}</div>\n\n <div class=\"op-list\" *ngIf=\"!loading\">\n <label class=\"op-row\" *ngFor=\"let row of rows\">\n <input type=\"checkbox\" class=\"hm-check\" [formControl]=\"row.control\" />\n <span class=\"op-row__body\">\n <code>{{ row.identifier }}</code>\n <hm-tag [name]=\"row.method\" />\n <hm-tag [name]=\"row.level\" [color]=\"levelTagColor(row.level)\" />\n <span class=\"op-row__free\" *ngIf=\"row.free\">{{ row.free }}</span>\n <span class=\"op-row__desc muted\" *ngIf=\"row.description\">{{ row.description }}</span>\n </span>\n </label>\n </div>\n\n <div class=\"empty-state\" *ngIf=\"!loading && rows.length === 0\">\n <hm-icon shape=\"filter-grid\" size=\"xl\"></hm-icon>\n <p>{{ text.noOperations }}</p>\n </div>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!hasChanges\" [loading]=\"saving\" (clicked)=\"confirm()\">{{ text.confirmChanges }}</hm-button>\n </ng-container>\n</hm-drawer>\n","import { Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonComponent, DataGridActionTriggered, DataGridComponent, DataGridRowAction, GridColumn, IconComponent } from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { AutoServiceDeleteFeedback } from '../../../../auto-service-delete';\nimport { AutoServiceService } from '../../../../auto-service.service';\nimport { AutoServiceConsumerCreateComponent } from './modals/consumer-create/auto-service-consumer-create.component';\nimport { AutoServiceConsumerPermissionsComponent } from './modals/consumer-permissions/auto-service-consumer-permissions.component';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\ninterface ConsumerRow {\n consumer_id: string; group_name: string; group_type_name: string;\n /** Vínculo do grupo de administração: não é do auto-serviço (servidor antigo ainda devolve; a tela descarta). */\n group_is_admin?: boolean;\n}\n\n@Component({\n selector: 'spine-auto-service-app-access',\n standalone: true,\n imports: [CommonModule, ButtonComponent, IconComponent, DataGridComponent, AutoServiceConsumerCreateComponent, AutoServiceConsumerPermissionsComponent],\n templateUrl: './auto-service-app-access.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-app-access.component.scss'],\n})\nexport class AutoServiceAppAccessComponent 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 deletion = inject(AutoServiceDeleteFeedback);\n @Input() clientId = '';\n @Input() appId = '';\n entries: ConsumerRow[] = [];\n availableGroups: any[] = [];\n loading = false;\n showCreate = false;\n showPermissions = false;\n activeConsumer: ConsumerRow | null = null;\n constructor(private service: AutoServiceService) {}\n\n readonly rowId = (c: ConsumerRow) => c.consumer_id;\n readonly columns = computed<GridColumn<ConsumerRow>[]>(() => [\n { key: 'group_name', title: this.text.colGroup, value: (c) => c.group_name, sortable: true },\n { key: 'group_type_name', title: this.text.colType, value: (c) => c.group_type_name, sortable: true },\n ]);\n readonly rowActions = computed<DataGridRowAction<ConsumerRow>[]>(() => [\n { id: 'permissions', icon: 'shield', label: this.text.manageOperations },\n {\n id: 'delete', icon: 'trash', label: this.text.remove, danger: true, separatorAbove: true,\n confirm: (c) => ({ heading: this.text.confirmRemoveConsumerHeading, message: formatMessage(this.text.confirmRemoveConsumer, { group: c.group_name }) }),\n },\n ]);\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['appId']) { this.load(); }\n if (changes['clientId']) { this.loadGroups(); }\n }\n\n async load() {\n if (!this.appId) { this.entries = []; return; }\n this.loading = true;\n try {\n const res = await this.service.getAppConsumers(this.clientId, this.appId);\n this.entries = (res.consumers ?? []).filter((c: ConsumerRow) => !c.group_is_admin);\n }\n finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n async loadGroups() {\n if (!this.clientId) { this.availableGroups = []; return; }\n const res = await this.service.getGroups(this.clientId);\n this.availableGroups = (res.groups ?? []).filter((g) => !g.is_admin);\n this.cdr.markForCheck();\n }\n\n openCreate() { this.showCreate = true; }\n async onCreated() { await this.load(); }\n /** Já confirmado pelo `confirm` da ação na grade. */\n async deleteConsumer(consumerId: string) {\n if (await this.deletion.run(() => this.service.deleteAppConsumer(this.clientId, consumerId))) await this.load();\n }\n openPermissions(consumer: ConsumerRow) { this.activeConsumer = consumer; this.showPermissions = true; }\n\n onAction(e: DataGridActionTriggered<ConsumerRow>): void {\n if (e.action === 'permissions') this.openPermissions(e.row);\n if (e.action === 'delete') void this.deleteConsumer(e.row.consumer_id);\n }\n}\n","<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"entries\"\n [rowId]=\"rowId\"\n [caption]=\"text.appAccessCaption\"\n [loading]=\"loading\"\n [rowActions]=\"rowActions()\"\n (actionTriggered)=\"onAction($event)\"\n [emptyMessage]=\"text.noAppAccess\"\n>\n <hm-button dataGridActions icon=\"plus\" (clicked)=\"openCreate()\">{{ text.newAccess }}</hm-button>\n</hm-data-grid>\n\n<spine-auto-service-consumer-create\n [clientId]=\"clientId\"\n [appId]=\"appId\"\n [availableGroups]=\"availableGroups\"\n [open]=\"showCreate\"\n (openChange)=\"showCreate = $event\"\n (created)=\"onCreated()\">\n</spine-auto-service-consumer-create>\n\n<spine-auto-service-consumer-permissions\n *ngIf=\"activeConsumer\"\n [clientId]=\"clientId\"\n [appId]=\"appId\"\n [consumer]=\"activeConsumer\"\n [open]=\"showPermissions\"\n (openChange)=\"showPermissions = $event\">\n</spine-auto-service-consumer-permissions>\n","import { Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DataGridCellDirective, DataGridComponent, GridColumn, TagColor, TagComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { pluralMessage } from '@trismegisto/primitives';\n\ninterface OperationRow {\n operation_id: string; identifier: string; method: string; level: string; description?: string; allowed_groups?: any[];\n}\n\n@Component({\n selector: 'spine-auto-service-app-operations',\n standalone: true,\n imports: [CommonModule, DataGridComponent, DataGridCellDirective, TagComponent],\n templateUrl: './auto-service-app-operations.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-app-operations.component.scss'],\n})\nexport class AutoServiceAppOperationsComponent 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 messages = inject(SPINE_MESSAGES);\n @Input() clientId = '';\n @Input() appId = '';\n operations: OperationRow[] = [];\n loading = false;\n constructor(private service: AutoServiceService) {}\n\n readonly rowId = (op: OperationRow) => op.operation_id;\n readonly columns = computed<GridColumn<OperationRow>[]>(() => [\n { key: 'identifier', title: this.text.colIdentifier, value: (op) => op.identifier, sortable: true },\n { key: 'method', title: this.text.colMethod, value: (op) => op.method, sortable: true },\n { key: 'level', title: this.text.colLevel, value: (op) => op.level, sortable: true },\n { key: 'description', title: this.text.colDescription, value: (op) => op.description || '—' },\n {\n key: 'allowed_groups', title: this.text.colAllowedGroups,\n value: (op) => op.allowed_groups?.length ? pluralMessage(this.text.groupCount, op.allowed_groups.length, this.messages.meta.locale) : '—',\n },\n ]);\n\n ngOnChanges(changes: SimpleChanges) { if (changes['appId']) { this.load(); } }\n\n async load() {\n if (!this.appId) { this.operations = []; return; }\n this.loading = true;\n try { const res = await this.service.getAppOperations(this.clientId, this.appId); this.operations = res.operations; }\n finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n /** Nível da operação no selo: pública em verde, protegida em amarelo; o resto neutro. */\n levelTagColor(level: string | null | undefined): TagColor {\n if (level === 'public') return 'success';\n if (level === 'protected') return 'warning';\n return 'neutral';\n }\n}\n","<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"operations\"\n [rowId]=\"rowId\"\n [caption]=\"text.operationsCaption\"\n [loading]=\"loading\"\n [emptyMessage]=\"text.noOperations\"\n>\n <ng-template hmCell=\"identifier\" let-op>\n <code>{{ op.identifier }}</code>\n </ng-template>\n\n <ng-template hmCell=\"method\" let-op>\n <hm-tag [name]=\"op.method\" />\n </ng-template>\n\n <ng-template hmCell=\"level\" let-op>\n <hm-tag [name]=\"op.level\" [color]=\"levelTagColor(op.level)\" />\n </ng-template>\n</hm-data-grid>\n","import {\n Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AbstractControl, FormControl, ReactiveFormsModule, ValidationErrors, ValidatorFn, Validators } from '@angular/forms';\nimport {\n AlertComponent, ButtonComponent, CheckboxComponent, CopyButtonComponent, DatePickerComponent, InputComponent, ModalComponent,\n TagComponent, TextareaComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { autoServiceErrorText } from '../../../../../auto-service-errors';\nimport { AutoServiceService } from '../../../../../auto-service.service';\nimport { freeAccessText, levelTagColor, requiresPermission } from '../operation-level';\n\n/** Teto de validade aceito pelo servidor (`APP_TOKEN_MAX_DAYS` do argos-admin). */\nexport const APP_TOKEN_MAX_DAYS = 365;\n/** Validade sugerida ao abrir o modal. */\nexport const APP_TOKEN_DEFAULT_DAYS = 90;\n/** Limite do nome no formulário. */\nexport const APP_TOKEN_NAME_MAX = 100;\n\n/** Data LOCAL em AAAA-MM-DD (`toISOString()` daria a data em UTC: em UTC-3, depois das 21h já é amanhã). */\nexport function localIsoDate(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\n/** Hoje + `days` dias, em data local (`setDate` cuida da virada de mês e ano). */\nexport function addLocalDays(base: Date, days: number): string {\n const date = new Date(base.getFullYear(), base.getMonth(), base.getDate());\n date.setDate(date.getDate() + days);\n return localIsoDate(date);\n}\n\n/**\n * Meia-noite LOCAL do dia escolhido (AAAA-MM-DD), em ISO com fuso. Mandar só a data fazia o servidor ler meia-noite\n * UTC (em UTC-3 \"amanhã\" podia já ter passado). Meia-noite local de amanhã é sempre futura e a de hoje + 365 nunca\n * passa de agora + 365 dias.\n */\nexport function localDayStartIso(value: string): string {\n const [y, m, d] = value.split('-').map(Number);\n return new Date(y, m - 1, d).toISOString();\n}\n\n/** Intervalo [min, max] comparando AAAA-MM-DD (ordem do texto = ordem das datas). */\nfunction dateRangeValidator(min: string, max: string): ValidatorFn {\n return (control: AbstractControl<string | null>): ValidationErrors | null => {\n const value = control.value;\n if (!value) return null;\n if (value < min) return { minDate: { min, actual: value } };\n if (value > max) return { maxDate: { max, actual: value } };\n return null;\n };\n}\n\ninterface OperationRow {\n operation_id: string;\n identifier: string;\n method: string;\n level: string;\n description?: string;\n /** Vazio = protegida (dá para escolher). Senão, por que não depende de permissão: caixa marcada e desabilitada. */\n free: string;\n control: FormControl<boolean>;\n}\n\n/**\n * \"Novo token\" de uma aplicação: nome, descrição, validade (de amanhã até 365 dias) e as operações liberadas ao token.\n * Só as `protected` dependem de permissão e podem ser marcadas; as outras aparecem marcadas e desabilitadas (já valem\n * para o token) e nunca vão em `operation_ids`. Criado, o valor aparece uma única vez, com copiar; fechar o descarta.\n * Mirror de admin/ui/.../apps/tabs/app-tokens/modals/token-create (argos-admin), escopado em `/auto-service/:clientId`.\n */\n@Component({\n selector: 'spine-auto-service-token-create',\n standalone: true,\n imports: [\n CommonModule, ReactiveFormsModule, AlertComponent, ButtonComponent, CheckboxComponent, CopyButtonComponent, DatePickerComponent,\n InputComponent, ModalComponent, TagComponent, TextareaComponent,\n ],\n templateUrl: './auto-service-token-create.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-token-create.component.scss'],\n})\nexport class AutoServiceTokenCreateComponent 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 protected readonly levelTagColor = levelTagColor;\n protected readonly nameMax = APP_TOKEN_NAME_MAX;\n\n @Input() clientId = '';\n @Input() appId = '';\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n /** Token criado (a lista recarrega na hora, sem esperar o modal fechar). */\n @Output() created = new EventEmitter<void>();\n\n minDate = addLocalDays(new Date(), 1);\n maxDate = addLocalDays(new Date(), APP_TOKEN_MAX_DAYS);\n\n readonly name = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.maxLength(APP_TOKEN_NAME_MAX)] });\n readonly description = new FormControl('', { nonNullable: true });\n readonly expiresAt = new FormControl<string | null>(null, { validators: [Validators.required] });\n\n rows: OperationRow[] = [];\n loading = false;\n saving = false;\n saveError: string | null = null;\n /** Valor recém-criado: aparece uma única vez, só enquanto o modal está aberto. */\n createdToken: { name: string; token: string } | null = null;\n\n /** Mensagens de validação da data no idioma ativo (o `hm-date-picker` mostra pelo `messages`). */\n get dateMessages(): Record<string, string> {\n return { minDate: this.text.tokenExpiresInvalid, maxDate: this.text.tokenExpiresInvalid };\n }\n\n get canSave(): boolean {\n return !this.saving && !this.loading && this.name.valid && !!this.name.value.trim() && this.expiresAt.valid;\n }\n\n get hasFreeRows(): boolean { return this.rows.some((r) => !!r.free); }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) void this.reset(); }\n\n /** Abre limpo: datas recalculadas (o modal pode ficar montado de um dia para o outro) e operações relidas. */\n async reset() {\n this.minDate = addLocalDays(new Date(), 1);\n this.maxDate = addLocalDays(new Date(), APP_TOKEN_MAX_DAYS);\n this.expiresAt.setValidators([Validators.required, dateRangeValidator(this.minDate, this.maxDate)]);\n this.name.reset('');\n this.description.reset('');\n this.expiresAt.reset(addLocalDays(new Date(), APP_TOKEN_DEFAULT_DAYS));\n this.createdToken = null;\n this.saveError = null;\n this.rows = [];\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const res = await this.service.getAppOperations(this.clientId, this.appId);\n this.rows = (res.operations ?? []).map((op: any) => ({\n operation_id: op.operation_id,\n identifier: op.identifier,\n method: op.method,\n level: op.level,\n description: op.description,\n free: freeAccessText(op.level, this.text),\n control: requiresPermission(op.level)\n ? new FormControl(false, { nonNullable: true })\n : new FormControl({ value: true, disabled: true }, { nonNullable: true }),\n }));\n } catch (err) {\n this.saveError = autoServiceErrorText(err, this.text, this.text.tokenSaveError);\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n onModalOpenChange(value: boolean) {\n this.open = value;\n if (!value) this.createdToken = null;\n this.openChange.emit(value);\n }\n\n close() { this.onModalOpenChange(false); }\n\n async save() {\n this.name.markAsTouched();\n this.expiresAt.markAsTouched();\n if (!this.canSave || !this.expiresAt.value) return;\n this.saving = true;\n this.saveError = null;\n this.cdr.markForCheck();\n try {\n const name = this.name.value.trim();\n const description = this.description.value.trim();\n const res = await this.service.createAppToken(this.clientId, this.appId, {\n name,\n ...(description ? { description } : {}),\n expires_at: localDayStartIso(this.expiresAt.value),\n // Só as protegidas escolhidas: public/private não viram permissão (o servidor recusa).\n operation_ids: this.rows.filter((r) => !r.free && r.control.value).map((r) => r.operation_id),\n });\n this.createdToken = { name: res.name ?? name, token: res.token };\n this.created.emit();\n } catch (err) {\n this.saveError = autoServiceErrorText(err, this.text, this.text.tokenSaveError);\n } finally {\n this.saving = false;\n this.cdr.markForCheck();\n }\n }\n\n createdHeading(name: string): string { return formatMessage(this.text.tokenCreatedHeading, { name }); }\n valueLabel(name: string): string { return formatMessage(this.text.tokenValueLabel, { name }); }\n}\n","<!-- Depois de criar, o modal só mostra o valor (uma vez); fechar (Concluir, Esc ou ✕) o descarta. -->\n<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\"\n [heading]=\"createdToken ? createdHeading(createdToken.name) : text.newToken\" size=\"large\" (closed)=\"close()\">\n <div class=\"form-stack\" *ngIf=\"createdToken as created; else formTpl\">\n <hm-alert variant=\"warning\" [heading]=\"text.tokenCreatedWarning\">{{ text.tokenCreatedNote }}</hm-alert>\n <div class=\"as-secret\">\n <span class=\"as-secret__label\" id=\"as-created-token-label\">{{ valueLabel(created.name) }}</span>\n <div class=\"as-secret__row\">\n <code class=\"as-secret__value\" aria-labelledby=\"as-created-token-label\">{{ created.token }}</code>\n <hm-copy-button variant=\"text\" [value]=\"created.token\" [label]=\"text.copyToken\" [copiedLabel]=\"text.tokenCopied\" />\n </div>\n </div>\n </div>\n\n <ng-template #formTpl>\n <div class=\"form-stack\">\n <hm-alert *ngIf=\"saveError\" variant=\"error\">{{ saveError }}</hm-alert>\n <hm-input [formControl]=\"name\" [label]=\"text.tokenName\" [maxLength]=\"nameMax\" />\n <hm-textarea [formControl]=\"description\" [label]=\"text.tokenDescription\" [rows]=\"2\" />\n <hm-date-picker [formControl]=\"expiresAt\" [label]=\"text.tokenExpiresAt\" [min]=\"minDate\" [max]=\"maxDate\"\n [hint]=\"text.tokenExpiresHint\" [messages]=\"dateMessages\" />\n\n <fieldset class=\"token-ops\">\n <legend class=\"token-ops__legend\">{{ text.tokenOperations }}</legend>\n <p class=\"token-ops__note muted\" *ngIf=\"hasFreeRows || rows.length\">{{ text.tokenOperationsNote }}</p>\n <p class=\"token-ops__empty muted\" *ngIf=\"loading\">{{ text.loading }}</p>\n <p class=\"token-ops__empty muted\" *ngIf=\"!loading && rows.length === 0\">{{ text.noOperations }}</p>\n <div class=\"token-ops__row\" *ngFor=\"let row of rows\">\n <hm-checkbox [formControl]=\"row.control\" [label]=\"row.identifier\" />\n <div class=\"token-ops__meta\">\n <hm-tag [name]=\"row.method\" />\n <hm-tag [name]=\"row.level\" [color]=\"levelTagColor(row.level)\" />\n <span class=\"token-ops__free\" *ngIf=\"row.free\">{{ row.free }}</span>\n <span class=\"token-ops__desc muted\" *ngIf=\"row.description\">{{ row.description }}</span>\n </div>\n </div>\n </fieldset>\n </div>\n </ng-template>\n\n <ng-container footer>\n <ng-container *ngIf=\"!createdToken\">\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!canSave\" [loading]=\"saving\" (clicked)=\"save()\">{{ text.createToken }}</hm-button>\n </ng-container>\n <hm-button *ngIf=\"createdToken\" (clicked)=\"close()\">{{ text.rotatedSecretDone }}</hm-button>\n </ng-container>\n</hm-modal>\n","import {\n Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ButtonComponent, DataGridActionTriggered, DataGridCellDirective, DataGridComponent, DataGridRowAction, GridColumn,\n HermesToastService, TagColor, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { autoServiceErrorText } from '../../../../auto-service-errors';\nimport { AutoServiceAppToken, AutoServiceService } from '../../../../auto-service.service';\nimport { AutoServiceConsumerPermissionsComponent } from '../app-access/modals/consumer-permissions/auto-service-consumer-permissions.component';\nimport { AutoServiceTokenCreateComponent } from './token-create/auto-service-token-create.component';\n\ntype TokenStatus = 'active' | 'expired' | 'revoked';\n\n/**\n * Aba Tokens da aplicação: os tokens de API (`x-api-token`) com situação, validade e último uso; \"Novo token\" (modal com\n * as operações liberadas) e, no menu da linha, \"Gerenciar operações\" (o token também é um consumer) e \"Revogar\" (com\n * confirmação; o token para de valer na hora e fica na lista como revogado).\n * Mirror de admin/ui/.../apps/tabs/app-tokens (argos-admin), escopado em `/auto-service/:clientId`.\n */\n@Component({\n selector: 'spine-auto-service-app-tokens',\n standalone: true,\n imports: [\n CommonModule, ButtonComponent, DataGridComponent, DataGridCellDirective, TagComponent,\n AutoServiceTokenCreateComponent, AutoServiceConsumerPermissionsComponent,\n ],\n templateUrl: './auto-service-app-tokens.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-app-tokens.component.scss'],\n})\nexport class AutoServiceAppTokensComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n private readonly catalog = inject(SPINE_MESSAGES);\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 private readonly toast = inject(HermesToastService);\n @Input() clientId = '';\n @Input() appId = '';\n tokens: AutoServiceAppToken[] = [];\n loading = false;\n showCreate = false;\n showPermissions = false;\n /** Token aberto em \"Gerenciar operações\", no formato que o painel de permissões espera (o nome no lugar do grupo). */\n permissionsConsumer: { consumer_id: string; group_name: string } | null = null;\n\n readonly rowId = (tk: AutoServiceAppToken) => tk.id;\n readonly columns = computed<GridColumn<AutoServiceAppToken>[]>(() => [\n { key: 'name', title: this.text.colName, value: (tk) => tk.name, sortable: true, searchable: true },\n { key: 'prefix', title: this.text.colTokenPrefix, value: (tk) => tk.token_prefix ?? '' },\n { key: 'status', title: this.text.colStatus, value: (tk) => this.statusLabel(this.status(tk)), sortable: true },\n { key: 'expires_at', title: this.text.colExpiresAt, value: (tk) => tk.expires_at ?? '', sortable: true },\n { key: 'last_used_at', title: this.text.colLastUsed, value: (tk) => tk.last_used_at ?? '', sortable: true },\n ]);\n // Revogado não tem mais o que fazer: a linha fica sem o menu.\n readonly rowActions = computed<DataGridRowAction<AutoServiceAppToken>[]>(() => [\n { id: 'operations', icon: 'shield', label: this.text.manageOperations, available: (tk) => !tk.revoked_at },\n {\n id: 'revoke', icon: 'ban', label: this.text.revokeToken, danger: true, separatorAbove: true,\n available: (tk) => !tk.revoked_at,\n confirm: (tk) => ({\n heading: this.text.confirmRevokeTokenHeading,\n message: formatMessage(this.text.confirmRevokeToken, { name: tk.name }),\n confirmLabel: this.text.revokeToken,\n }),\n },\n ]);\n\n ngOnChanges(changes: SimpleChanges) { if (changes['appId'] || changes['clientId']) void this.load(); }\n\n async load() {\n const { clientId, appId } = this;\n if (!clientId || !appId) { this.tokens = []; return; }\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const res = await this.service.getAppTokens(clientId, appId);\n if (this.appId !== appId || this.clientId !== clientId) return;\n this.tokens = res.tokens ?? [];\n } catch (err) {\n this.tokens = [];\n this.toast.error(autoServiceErrorText(err, this.text, this.text.tokensLoadError));\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n status(tk: AutoServiceAppToken, now = Date.now()): TokenStatus {\n if (tk.revoked_at) return 'revoked';\n if (new Date(tk.expires_at).getTime() <= now) return 'expired';\n return 'active';\n }\n\n statusLabel(status: TokenStatus): string {\n if (status === 'revoked') return this.text.tokenRevoked;\n if (status === 'expired') return this.text.tokenExpired;\n return this.text.active;\n }\n\n /** Ativo em verde, expirado em amarelo, revogado neutro; o texto do selo diz qual (a cor só reforça). */\n statusColor(status: TokenStatus): TagColor {\n if (status === 'revoked') return 'neutral';\n if (status === 'expired') return 'warning';\n return 'success';\n }\n\n formatDate(value: string | null | undefined): string {\n if (!value) return '';\n return new Intl.DateTimeFormat(this.catalog.meta.locale, { dateStyle: 'short', timeStyle: 'short' }).format(new Date(value));\n }\n\n openCreate() { this.showCreate = true; this.cdr.markForCheck(); }\n\n openPermissions(tk: AutoServiceAppToken) {\n this.permissionsConsumer = { consumer_id: tk.consumer_id, group_name: tk.name };\n this.showPermissions = true;\n this.cdr.markForCheck();\n }\n\n /** Já confirmado pelo `confirm` da ação na grade. Sucesso e falha viram toast. */\n async revoke(tk: AutoServiceAppToken) {\n if (tk.revoked_at) return;\n try {\n await this.service.revokeAppToken(this.clientId, this.appId, tk.id);\n this.toast.success(formatMessage(this.text.tokenRevokedDone, { name: tk.name }));\n } catch (err) {\n this.toast.error(autoServiceErrorText(err, this.text, this.text.tokenRevokeError));\n return;\n }\n await this.load();\n }\n\n onAction(e: DataGridActionTriggered<AutoServiceAppToken>): void {\n if (e.action === 'operations') this.openPermissions(e.row);\n if (e.action === 'revoke') void this.revoke(e.row);\n }\n}\n","<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"tokens\"\n [rowId]=\"rowId\"\n [caption]=\"text.tokensCaption\"\n [loading]=\"loading\"\n [rowActions]=\"rowActions()\"\n [emptyMessage]=\"text.noTokens\"\n (actionTriggered)=\"onAction($event)\"\n>\n <hm-button dataGridActions icon=\"plus\" (clicked)=\"openCreate()\">{{ text.newToken }}</hm-button>\n <ng-template hmCell=\"prefix\" let-tk>\n <code *ngIf=\"tk.token_prefix; else noPrefix\">{{ tk.token_prefix }}…</code>\n <ng-template #noPrefix>—</ng-template>\n </ng-template>\n <ng-template hmCell=\"status\" let-tk>\n <hm-tag [name]=\"statusLabel(status(tk))\" [color]=\"statusColor(status(tk))\" />\n </ng-template>\n <ng-template hmCell=\"expires_at\" let-tk>{{ formatDate(tk.expires_at) || '—' }}</ng-template>\n <ng-template hmCell=\"last_used_at\" let-tk>{{ tk.last_used_at ? formatDate(tk.last_used_at) : text.neverUsed }}</ng-template>\n</hm-data-grid>\n\n<spine-auto-service-token-create [clientId]=\"clientId\" [appId]=\"appId\" [open]=\"showCreate\"\n (openChange)=\"showCreate = $event\" (created)=\"load()\">\n</spine-auto-service-token-create>\n\n<spine-auto-service-consumer-permissions *ngIf=\"permissionsConsumer as consumer\" [clientId]=\"clientId\" [appId]=\"appId\"\n [consumer]=\"consumer\" [open]=\"showPermissions\" (openChange)=\"showPermissions = $event\">\n</spine-auto-service-consumer-permissions>\n","import { Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n AlertComponent, ButtonComponent, CardComponent, CopyButtonComponent, DataGridActionTriggered, DataGridCellDirective,\n DataGridComponent, DataGridRowAction, GridColumn, HermesDialogService, HermesToastService, ModalComponent, TabComponent,\n TabContentDirective, TabsComponent, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AutoServiceDeleteFeedback } from '../../auto-service-delete';\nimport { AutoServiceApp, AutoServiceService } from '../../auto-service.service';\nimport { AutoServiceAppsModalComponent } from './modals/apps-modal/auto-service-apps-modal.component';\nimport { AutoServiceAppAccessComponent } from './tabs/app-access/auto-service-app-access.component';\nimport { AutoServiceAppOperationsComponent } from './tabs/app-operations/auto-service-app-operations.component';\nimport { AutoServiceAppTokensComponent } from './tabs/app-tokens/auto-service-app-tokens.component';\n\ntype Tab = 'operations' | 'access' | 'tokens';\n\n/**\n * Aplicações (client_credentials) do projeto do client: tabela (Nome/Grants/Situação) com cadastrar e, no menu da linha,\n * editar, ativar/desativar, gerar novo segredo e excluir. Clicar na linha abre a aplicação embaixo da tabela: o resumo\n * (com as mesmas ações) e as abas Operações, Acessos e Tokens. Mesmo molde da tela Grupos.\n */\n@Component({\n selector: 'spine-auto-service-apps',\n standalone: true,\n imports: [\n CommonModule, AlertComponent, ButtonComponent, CardComponent, CopyButtonComponent, DataGridComponent, DataGridCellDirective,\n ModalComponent, TabsComponent, TabComponent, TabContentDirective, TagComponent,\n AutoServiceAppsModalComponent, AutoServiceAppOperationsComponent, AutoServiceAppAccessComponent, AutoServiceAppTokensComponent,\n ],\n templateUrl: './auto-service-apps.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-apps.component.scss'],\n})\nexport class AutoServiceAppsComponent 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 dialogs = inject(HermesDialogService);\n private readonly deletion = inject(AutoServiceDeleteFeedback);\n private readonly toast = inject(HermesToastService);\n private readonly service = inject(AutoServiceService);\n @Input() clientId = '';\n apps: AutoServiceApp[] = [];\n loading = false;\n /** Aplicação aberta (resumo + abas embaixo da tabela). */\n app: AutoServiceApp | null = null;\n modalApp: AutoServiceApp | null = null;\n showAppModal = false;\n activeTab: Tab = 'operations';\n newSecret: string | null = null;\n /** Segredo gerado por \"Gerar novo segredo\", mostrado uma vez na janela até \"Concluir\". */\n rotatedSecret: { name: string; secret: string } | null = null;\n rotatingSecret = false;\n\n readonly rowId = (a: AutoServiceApp) => a.id;\n readonly columns = computed<GridColumn<AutoServiceApp>[]>(() => [\n { key: 'name', title: this.text.colName, value: (a) => a.name, sortable: true, searchable: true },\n { key: 'grants', title: this.text.colGrants, value: (a) => this.grantsText(a) },\n { key: 'status', title: this.text.colStatus, value: (a) => (a.enabled ? this.text.active : this.text.inactive), sortable: true },\n ]);\n readonly rowActions = computed<DataGridRowAction<AutoServiceApp>[]>(() => [\n { id: 'edit', icon: 'pencil', label: this.text.edit },\n { id: 'disable', icon: 'pause', label: this.text.disable, available: (a) => !!a.enabled },\n { id: 'enable', icon: 'play', label: this.text.enable, available: (a) => !a.enabled },\n { id: 'rotate', icon: 'key', label: this.text.rotateSecret },\n {\n id: 'delete', icon: 'trash', label: this.text.delete, danger: true, separatorAbove: true,\n confirm: (a) => ({ heading: this.text.confirmDeleteAppHeading, message: formatMessage(this.text.confirmDeleteApp, { name: a.name ?? a.id }) }),\n },\n ]);\n\n // Trocar de client fecha a aplicação aberta e esconde o segredo recém-criado: ele é de uma aplicação do client anterior.\n ngOnChanges(changes: SimpleChanges) {\n if (changes['clientId']) {\n this.app = null; this.apps = []; this.newSecret = null; this.rotatedSecret = null;\n void this.load();\n }\n }\n\n grantsText(a: AutoServiceApp): string { return a.allowed_grants?.length ? a.allowed_grants.join(', ') : '—'; }\n openAppLabel(a: AutoServiceApp): string { return formatMessage(this.text.openApp, { name: a.name }); }\n\n async load() {\n const clientId = this.clientId;\n if (!clientId) { this.apps = []; return; }\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const res = await this.service.getApps(clientId);\n if (this.clientId !== clientId) return;\n this.apps = res.apps ?? [];\n // A aplicação aberta acompanha o que o servidor devolveu (nome/situação novos) ou fecha se sumiu.\n if (this.app) this.app = this.apps.find((a) => a.id === this.app!.id) ?? null;\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n /** Abre a aplicação embaixo da tabela; outra aplicação volta para a aba Operações. */\n openApp(a: AutoServiceApp) {\n if (this.app?.id !== a.id) this.activeTab = 'operations';\n this.app = a;\n this.cdr.markForCheck();\n }\n\n setTab(tab: Tab) { this.activeTab = tab; }\n openCreate() { this.modalApp = null; this.showAppModal = true; this.cdr.markForCheck(); }\n openEdit(a: AutoServiceApp | null = this.app) { if (!a) return; this.modalApp = a; this.showAppModal = true; this.cdr.markForCheck(); }\n\n async onAppSaved(secret?: string) {\n if (secret) this.newSecret = secret;\n await this.load();\n this.cdr.markForCheck();\n }\n\n async toggleEnabled(a: AutoServiceApp | null = this.app) {\n if (!a) return;\n await this.service.updateApp(this.clientId, a.id, { enabled: !a.enabled });\n await this.load();\n }\n\n /**\n * \"Gerar novo segredo\": confirmação (o atual para de valer na hora), POST e o segredo novo numa janela,\n * mostrado uma única vez. Falha vira toast (404: aplicação de outro client; 403: client que a pessoa não\n * administra; senão o `detail` do servidor ou a mensagem genérica).\n */\n async rotateSecret(a: AutoServiceApp | null = this.app) {\n if (!a || this.rotatingSecret) return;\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmRotateSecretHeading,\n message: this.text.confirmRotateSecret,\n confirmLabel: this.text.rotateSecret,\n danger: true,\n });\n if (!ok) return;\n this.rotatingSecret = true;\n this.cdr.markForCheck();\n try {\n const res = await this.service.rotateAppSecret(this.clientId, a.id);\n this.rotatedSecret = { name: a.name ?? a.id, secret: res.secret };\n } catch (err) {\n this.toast.error(this.rotateErrorText(err));\n } finally {\n this.rotatingSecret = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Fecha a janela do segredo: depois dela não há como ver o segredo de novo. */\n closeRotatedSecret() { this.rotatedSecret = null; this.cdr.markForCheck(); }\n\n rotatedSecretHeading(name: string): string { return formatMessage(this.text.rotatedSecretHeading, { name }); }\n rotatedSecretLabel(name: string): string { return formatMessage(this.text.rotatedSecretLabel, { name }); }\n\n private rotateErrorText(err: unknown): string {\n if (err instanceof HttpErrorResponse) {\n if (err.status === 404) return this.text.rotateSecretNotFound;\n if (err.status === 403) return this.text.rotateSecretForbidden;\n const detail = err.error?.detail;\n if (typeof detail === 'string' && detail) return detail;\n }\n return this.text.rotateSecretError;\n }\n\n /** Botão Excluir do resumo: pede confirmação e só então exclui. A ação da tabela já confirma pelo `confirm` dela. */\n async deleteApp(a: AutoServiceApp | null = this.app) {\n if (!a) return;\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmDeleteAppHeading,\n message: formatMessage(this.text.confirmDeleteApp, { name: a.name ?? a.id }),\n confirmLabel: this.text.delete,\n danger: true,\n });\n if (ok) await this.removeApp(a);\n }\n\n /** DELETE com toast de sucesso/erro; a aplicação aberta fecha e o segredo recém-criado some. */\n async removeApp(a: AutoServiceApp) {\n if (!(await this.deletion.run(() => this.service.deleteApp(this.clientId, a.id)))) return;\n if (this.app?.id === a.id) this.app = null;\n this.newSecret = null;\n await this.load();\n }\n\n onAction(e: DataGridActionTriggered<AutoServiceApp>): void {\n switch (e.action) {\n case 'edit': this.openEdit(e.row); break;\n case 'enable':\n case 'disable': void this.toggleEnabled(e.row); break;\n case 'rotate': void this.rotateSecret(e.row); break;\n case 'delete': void this.removeApp(e.row); break;\n }\n }\n}\n","<div class=\"as-stack\">\n <hm-alert *ngIf=\"newSecret\" variant=\"success\" [closable]=\"true\" (closed)=\"newSecret = null\">\n {{ text.secretCreated }} <strong>{{ newSecret }}</strong>\n </hm-alert>\n\n <!-- Clicar na linha (ou no nome, pelo teclado) abre a aplicação embaixo da tabela. -->\n <hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"apps\"\n [rowId]=\"rowId\"\n [caption]=\"text.appsCaption\"\n [loading]=\"loading\"\n [rowActions]=\"rowActions()\"\n [emptyMessage]=\"text.noApps\"\n rowClickable\n (rowClicked)=\"openApp($event)\"\n (actionTriggered)=\"onAction($event)\"\n >\n <hm-button dataGridActions icon=\"plus\" (clicked)=\"openCreate()\">{{ text.register }}</hm-button>\n <ng-template hmCell=\"name\" let-a>\n <button type=\"button\" class=\"name-cell__open\" [attr.aria-label]=\"openAppLabel(a)\"\n [attr.aria-current]=\"app?.id === a.id ? 'true' : null\" (click)=\"openApp(a)\">{{ a.name }}</button>\n </ng-template>\n <ng-template hmCell=\"grants\" let-a>\n <code *ngIf=\"a.allowed_grants?.length; else noGrants\">{{ grantsText(a) }}</code>\n <ng-template #noGrants>—</ng-template>\n </ng-template>\n <ng-template hmCell=\"status\" let-a>\n <hm-tag [name]=\"a.enabled ? text.active : text.inactive\" [color]=\"a.enabled ? 'success' : 'danger'\" />\n </ng-template>\n </hm-data-grid>\n\n <ng-container *ngIf=\"app as a\">\n <hm-card>\n <div class=\"as-summary\">\n <div class=\"as-summary__info\">\n <p class=\"as-summary__title app-title\">\n {{ a.name }}\n <hm-tag [name]=\"a.enabled ? text.active : text.inactive\" [color]=\"a.enabled ? 'success' : 'danger'\" />\n </p>\n <p class=\"as-summary__detail\">{{ a.allowed_grants?.join(', ') }}</p>\n </div>\n <div class=\"as-actions\">\n <hm-button emphasis=\"medium\" icon=\"pencil\" (clicked)=\"openEdit(a)\">{{ text.edit }}</hm-button>\n <hm-button emphasis=\"medium\" (clicked)=\"toggleEnabled(a)\">{{ a.enabled ? text.disable : text.enable }}</hm-button>\n <hm-button emphasis=\"medium\" icon=\"key\" [loading]=\"rotatingSecret\" (clicked)=\"rotateSecret(a)\">{{ text.rotateSecret }}</hm-button>\n <hm-button intent=\"danger\" emphasis=\"medium\" icon=\"trash\" (clicked)=\"deleteApp(a)\">{{ text.delete }}</hm-button>\n </div>\n </div>\n </hm-card>\n\n <!-- Conteúdo de cada aba é preguiçoso (*hmTabContent): só busca na API quando a aba é aberta. -->\n <hm-tabs [label]=\"text.appSections\" [active]=\"activeTab\" (activeChange)=\"setTab($any($event))\">\n <hm-tab id=\"operations\" [label]=\"text.tabOperations\">\n <spine-auto-service-app-operations *hmTabContent [clientId]=\"clientId\" [appId]=\"a.id\"></spine-auto-service-app-operations>\n </hm-tab>\n <hm-tab id=\"access\" [label]=\"text.tabAccesses\">\n <spine-auto-service-app-access *hmTabContent [clientId]=\"clientId\" [appId]=\"a.id\"></spine-auto-service-app-access>\n </hm-tab>\n <hm-tab id=\"tokens\" [label]=\"text.tabTokens\">\n <spine-auto-service-app-tokens *hmTabContent [clientId]=\"clientId\" [appId]=\"a.id\"></spine-auto-service-app-tokens>\n </hm-tab>\n </hm-tabs>\n </ng-container>\n</div>\n\n<!-- Segredo novo (\"Gerar novo segredo\"): aparece uma vez; fechar (Concluir, Esc ou ✕) o descarta. -->\n<hm-modal\n [open]=\"!!rotatedSecret\"\n (openChange)=\"$event || closeRotatedSecret()\"\n [heading]=\"rotatedSecret ? rotatedSecretHeading(rotatedSecret.name) : ''\"\n (closed)=\"closeRotatedSecret()\">\n <div class=\"as-stack\" *ngIf=\"rotatedSecret as rotated\">\n <hm-alert variant=\"warning\" [heading]=\"text.rotatedSecretWarning\">{{ text.rotatedSecretNote }}</hm-alert>\n <div class=\"as-secret\">\n <span class=\"as-secret__label\" id=\"as-rotated-secret-label\">{{ rotatedSecretLabel(rotated.name) }}</span>\n <div class=\"as-secret__row\">\n <code class=\"as-secret__value\" aria-labelledby=\"as-rotated-secret-label\">{{ rotated.secret }}</code>\n <hm-copy-button variant=\"text\" [value]=\"rotated.secret\" [label]=\"text.copySecret\" [copiedLabel]=\"text.secretCopied\" />\n </div>\n </div>\n </div>\n <ng-container footer>\n <hm-button (clicked)=\"closeRotatedSecret()\">{{ text.rotatedSecretDone }}</hm-button>\n </ng-container>\n</hm-modal>\n\n<spine-auto-service-apps-modal\n [app]=\"modalApp\"\n [clientId]=\"clientId\"\n [open]=\"showAppModal\"\n (openChange)=\"showAppModal = $event\"\n (saved)=\"onAppSaved($event)\">\n</spine-auto-service-apps-modal>\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from './client-picker/auto-service-client-picker.component';\nimport { AutoServiceAppsComponent } from './tabs/auto-service-apps/auto-service-apps.component';\n\n/**\n * Página \"Aplicações\" do auto-serviço: o seletor de client e as aplicações dele. A auditoria tem página\n * própria no menu Administração (`AUTO_SERVICE_SCREENS.audit`) — a aba que existia aqui duplicava a tela.\n */\n@Component({\n selector: 'spine-auto-service',\n standalone: true,\n imports: [CommonModule, AutoServiceClientPickerComponent, AutoServiceAppsComponent],\n templateUrl: './auto-service.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service.component.scss'],\n})\nexport class AutoServiceComponent {\n client: AutoServiceClient | null = null;\n\n onClientChange(c: AutoServiceClient | null) { this.client = c; }\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 <spine-auto-service-apps *ngIf=\"client as c\" [clientId]=\"c.id\"></spine-auto-service-apps>\n</div>\n"],"names":["i1.AutoServiceService","i2","i1"],"mappings":"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"}
|
|
@@ -14,9 +14,10 @@ template \`AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID\` (\`ad100003-…\`). Fala com
|
|
|
14
14
|
| Rotas do client (\`web.routes\`) | \`GET / POST /auto-service/:clientId/routes\`, \`PUT / DELETE .../routes/:routeId\` |
|
|
15
15
|
| Roteadores do client (\`web.router\`) | \`GET / POST /auto-service/:clientId/routers\`, \`PUT / DELETE .../routers/:routerId\` |
|
|
16
16
|
| Ordem dos itens do menu | \`PATCH /auto-service/:clientId/routers/reorder\` |
|
|
17
|
-
| Acessos (grupo ↔ client) | \`GET / POST /auto-service/:clientId/access\` (\`{ group_id }
|
|
17
|
+
| Acessos (grupo ↔ client) | \`GET / POST /auto-service/:clientId/access\` (\`{ group_id }\`; sem o acesso do grupo de administração), \`DELETE .../access/:accessId\` |
|
|
18
18
|
| Guards de um acesso | \`GET / POST /auto-service/:clientId/access/:accessId/guards\` (\`{ router_id }\`), \`DELETE .../guards/:guardId\` |
|
|
19
|
-
| Grupos oferecidos em "Novo acesso" | \`GET /auto-service/:clientId/groups\` |
|
|
19
|
+
| Grupos oferecidos em "Novo acesso" | \`GET /auto-service/:clientId/groups\` (sem o grupo de administração) |
|
|
20
|
+
| Crachás do campo "Crachás permitidos" | \`GET /auto-service/:clientId/group-types\` (\`{ id, name, level, assignable }\`) |
|
|
20
21
|
|
|
21
22
|
## Regras
|
|
22
23
|
|
|
@@ -26,6 +27,12 @@ template \`AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID\` (\`ad100003-…\`). Fala com
|
|
|
26
27
|
|
|
27
28
|
- **Autorização** (\`clientAdminGuard\`): grupo que administra o projeto do client + crachá Administrador ativo. O
|
|
28
29
|
\`client_id\` dos controllers vem sempre da URL. Access, grupo ou router de outro client responde 404.
|
|
30
|
+
- **Grupo de administração**: gerido só no painel central (Argos), não aparece no auto-serviço. O servidor não
|
|
31
|
+
devolve o acesso dele em \`GET /access\` nem o grupo em \`GET /groups\`; servidor antigo que ainda devolva
|
|
32
|
+
(\`group_is_admin: true\` no acesso, \`is_admin: true\` no grupo) tem a linha descartada pela tela. Se um servidor
|
|
33
|
+
antigo recusar o \`DELETE\` do acesso dele com \`409 admin_group_access_protected\`, o toast mostra
|
|
34
|
+
\`autoService.groupErrors.adminGroupAccessProtected\` (\`autoServiceErrorText\`, usado pelo
|
|
35
|
+
\`AutoServiceDeleteFeedback\` em toda exclusão).
|
|
29
36
|
- **Template** (\`templated\`, cópia materializada pelo sync do template): a tela tira editar/excluir da linha e mostra
|
|
30
37
|
o selo; o servidor recusa \`PUT\`/\`DELETE\` com 403. Reordenar e configurar guards continuam liberados (ordem e acesso
|
|
31
38
|
são do client; o sync não sobrescreve ordem).
|
|
@@ -36,6 +43,20 @@ template \`AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID\` (\`ad100003-…\`). Fala com
|
|
|
36
43
|
- **Caminho montado**: junta os \`path\` das rotas de \`header_id\`, \`navigation_id\`, \`menu_id\`, \`item_id\`,
|
|
37
44
|
\`submenu_id\` e \`page_id\`, nessa ordem.
|
|
38
45
|
- **Roteador**: níveis vazios vão como \`null\`; descrição em branco vai como \`null\`; \`is_private\` começa \`true\`.
|
|
46
|
+
- **Hierarquia de cima para baixo** (\`HIERARCHY_LEVELS\`, \`hasHierarchyGap\`): cada combobox de nível fica
|
|
47
|
+
desabilitado enquanto o nível de cima está vazio (\`levelLocked\`; um valor já gravado fora da regra continua
|
|
48
|
+
editável, para dar para limpar) e limpar um nível limpa os de baixo (\`setLevel\`). Com buraco, o formulário mostra o
|
|
49
|
+
aviso \`routerErrors.hierarchyGap\` e não grava; o argos-admin recusa o mesmo caso com 400 \`router_hierarchy_gap\`, que
|
|
50
|
+
vira esse texto no modal (\`autoServiceErrorText\`). Outras falhas: o \`detail\` do servidor ou \`routerSaveError\`.
|
|
51
|
+
- **Crachás permitidos** (\`allowed_type_ids: string[]\`, mesma semântica do modal de roteador do argos-admin): a lista
|
|
52
|
+
e o \`GET\` do roteador trazem o campo; \`POST\`/\`PUT\` sempre mandam o array do formulário (\`hm-combobox-multi\`),
|
|
53
|
+
que substitui o conjunto inteiro. Vazio = sem restrição: qualquer crachá pode receber guard para o roteador; com
|
|
54
|
+
ids, só grupos de um desses tipos. As opções são **todos** os tipos de \`group-types\`, inclusive o Administrador
|
|
55
|
+
(\`assignable\` só vale para criar grupo). A coluna **Crachás permitidos** mostra os nomes como \`hm-tag\` (\`anyBadge\`
|
|
56
|
+
quando vazio; id sem tipo conhecido aparece como o próprio id). Falha ao buscar os tipos não impede a tabela (o
|
|
57
|
+
campo fica sem opções). Tipo inexistente recusado pelo servidor: \`invalid_allowed_type_ids\`/\`invalid_allowed_types\`
|
|
58
|
+
viram \`routerErrors.invalidAllowedTypes\` e \`invalid_type\` vira \`groupErrors.invalidType\`; outros códigos caem no
|
|
59
|
+
\`detail\` ou em \`routerSaveError\`.
|
|
39
60
|
- **Guards**: a árvore usa só roteadores com \`is_private\` e \`allowed_type_ids\` vazio ou contendo o \`group_type_id\`
|
|
40
61
|
do acesso; pastas pelos níveis do roteador, folhas com o guard atual marcado. **Confirmar alterações** grava só a
|
|
41
62
|
diferença: primeiro os guards novos, depois as retiradas.
|
|
@@ -43,4 +64,4 @@ template \`AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID\` (\`ad100003-…\`). Fala com
|
|
|
43
64
|
`;
|
|
44
65
|
|
|
45
66
|
export { client_technical as default };
|
|
46
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-client.technical-
|
|
67
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs","sources":["../../../projects/ui/auto-service/src/docs/client.technical.ts"],"sourcesContent":["// Especificação técnica da tela Cliente 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 `# Cliente — especificação técnica\n\nTela \\`AutoServiceClientComponent\\` (seletor de client + abas Rotas, Roteadores e Acesso), ligada ao router de\ntemplate \\`AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID\\` (\\`ad100003-…\\`). Fala com o argos-admin-server em\n\\`{adminApi}/auto-service\\` (\\`AutoServiceService\\`), com o token no cabeçalho \\`x-access-token\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Rotas do client (\\`web.routes\\`) | \\`GET / POST /auto-service/:clientId/routes\\`, \\`PUT / DELETE .../routes/:routeId\\` |\n| Roteadores do client (\\`web.router\\`) | \\`GET / POST /auto-service/:clientId/routers\\`, \\`PUT / DELETE .../routers/:routerId\\` |\n| Ordem dos itens do menu | \\`PATCH /auto-service/:clientId/routers/reorder\\` |\n| Acessos (grupo ↔ client) | \\`GET / POST /auto-service/:clientId/access\\` (\\`{ group_id }\\`; sem o acesso do grupo de administração), \\`DELETE .../access/:accessId\\` |\n| Guards de um acesso | \\`GET / POST /auto-service/:clientId/access/:accessId/guards\\` (\\`{ router_id }\\`), \\`DELETE .../guards/:guardId\\` |\n| Grupos oferecidos em \"Novo acesso\" | \\`GET /auto-service/:clientId/groups\\` (sem o grupo de administração) |\n| Crachás do campo \"Crachás permitidos\" | \\`GET /auto-service/:clientId/group-types\\` (\\`{ id, name, level, assignable }\\`) |\n\n## Regras\n\n- Excluir rota, roteador e acesso usa o \\`confirm\\` da ação no \\`hm-data-grid\\` (diálogo de perigo com o nome do item);\n o \\`DELETE\\` só sai depois do sim, com toast de sucesso/erro (\\`AutoServiceDeleteFeedback\\`). Ids nos caminhos vão\n codificados (\\`urlPath\\`).\n\n- **Autorização** (\\`clientAdminGuard\\`): grupo que administra o projeto do client + crachá Administrador ativo. O\n \\`client_id\\` dos controllers vem sempre da URL. Access, grupo ou router de outro client responde 404.\n- **Grupo de administração**: gerido só no painel central (Argos), não aparece no auto-serviço. O servidor não\n devolve o acesso dele em \\`GET /access\\` nem o grupo em \\`GET /groups\\`; servidor antigo que ainda devolva\n (\\`group_is_admin: true\\` no acesso, \\`is_admin: true\\` no grupo) tem a linha descartada pela tela. Se um servidor\n antigo recusar o \\`DELETE\\` do acesso dele com \\`409 admin_group_access_protected\\`, o toast mostra\n \\`autoService.groupErrors.adminGroupAccessProtected\\` (\\`autoServiceErrorText\\`, usado pelo\n \\`AutoServiceDeleteFeedback\\` em toda exclusão).\n- **Template** (\\`templated\\`, cópia materializada pelo sync do template): a tela tira editar/excluir da linha e mostra\n o selo; o servidor recusa \\`PUT\\`/\\`DELETE\\` com 403. Reordenar e configurar guards continuam liberados (ordem e acesso\n são do client; o sync não sobrescreve ordem).\n- **Rota protegida** (\\`excludable: false\\`): sem \"Excluir\" na tela (o servidor responde 409 no \\`DELETE\\`) e a caixa\n \"Excluível\" desabilitada na edição; o servidor recusa com 403 um \\`PUT\\` que tente \\`excludable: true\\`.\n- **Caminho da rota**: vazio ou \\`^[a-z]+(?:-[a-z]+)*$\\` (\\`routePathValidator\\`, mesma regra do \\`route-path.ts\\` do\n admin-server, que é quem recusa). Um \\`/\\` dentro do caminho desalinha a resolução por nível do \\`ViewGuard\\`.\n- **Caminho montado**: junta os \\`path\\` das rotas de \\`header_id\\`, \\`navigation_id\\`, \\`menu_id\\`, \\`item_id\\`,\n \\`submenu_id\\` e \\`page_id\\`, nessa ordem.\n- **Roteador**: níveis vazios vão como \\`null\\`; descrição em branco vai como \\`null\\`; \\`is_private\\` começa \\`true\\`.\n- **Hierarquia de cima para baixo** (\\`HIERARCHY_LEVELS\\`, \\`hasHierarchyGap\\`): cada combobox de nível fica\n desabilitado enquanto o nível de cima está vazio (\\`levelLocked\\`; um valor já gravado fora da regra continua\n editável, para dar para limpar) e limpar um nível limpa os de baixo (\\`setLevel\\`). Com buraco, o formulário mostra o\n aviso \\`routerErrors.hierarchyGap\\` e não grava; o argos-admin recusa o mesmo caso com 400 \\`router_hierarchy_gap\\`, que\n vira esse texto no modal (\\`autoServiceErrorText\\`). Outras falhas: o \\`detail\\` do servidor ou \\`routerSaveError\\`.\n- **Crachás permitidos** (\\`allowed_type_ids: string[]\\`, mesma semântica do modal de roteador do argos-admin): a lista\n e o \\`GET\\` do roteador trazem o campo; \\`POST\\`/\\`PUT\\` sempre mandam o array do formulário (\\`hm-combobox-multi\\`),\n que substitui o conjunto inteiro. Vazio = sem restrição: qualquer crachá pode receber guard para o roteador; com\n ids, só grupos de um desses tipos. As opções são **todos** os tipos de \\`group-types\\`, inclusive o Administrador\n (\\`assignable\\` só vale para criar grupo). A coluna **Crachás permitidos** mostra os nomes como \\`hm-tag\\` (\\`anyBadge\\`\n quando vazio; id sem tipo conhecido aparece como o próprio id). Falha ao buscar os tipos não impede a tabela (o\n campo fica sem opções). Tipo inexistente recusado pelo servidor: \\`invalid_allowed_type_ids\\`/\\`invalid_allowed_types\\`\n viram \\`routerErrors.invalidAllowedTypes\\` e \\`invalid_type\\` vira \\`groupErrors.invalidType\\`; outros códigos caem no\n \\`detail\\` ou em \\`routerSaveError\\`.\n- **Guards**: a árvore usa só roteadores com \\`is_private\\` e \\`allowed_type_ids\\` vazio ou contendo o \\`group_type_id\\`\n do acesso; pastas pelos níveis do roteador, folhas com o guard atual marcado. **Confirmar alterações** grava só a\n diferença: primeiro os guards novos, depois as retiradas.\n- As abas são preguiçosas (\\`*hmTabContent\\`): cada uma só busca ao ser aberta.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,uBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Dd;;"}
|
|
@@ -8,9 +8,9 @@ Gerencie a navegação do seu client sem depender do painel central: as rotas (o
|
|
|
8
8
|
|
|
9
9
|
## Antes de começar
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
Como nas outras telas do auto-serviço, o client administrado é o do app em que você está logado: não há client
|
|
12
|
+
para escolher. É preciso estar no grupo de administração do projeto desse app e com o crachá **Administrador**
|
|
13
|
+
ativo. A tela mostra as abas **Rotas**, **Roteadores** e **Acesso**.
|
|
14
14
|
|
|
15
15
|
## Como as peças se encaixam
|
|
16
16
|
|
|
@@ -45,17 +45,24 @@ A tabela mostra **Nome**, **Exibição**, **Ícone**, **Path** e **Excluível**.
|
|
|
45
45
|
|
|
46
46
|
## Aba Roteadores
|
|
47
47
|
|
|
48
|
-
A tabela mostra **Página**, **Caminho montado** (o endereço final), **Descrição
|
|
49
|
-
**Público**).
|
|
48
|
+
A tabela mostra **Página**, **Caminho montado** (o endereço final), **Descrição**, **Visibilidade** (**Privado** ou
|
|
49
|
+
**Público**) e **Crachás permitidos** (os crachás que podem receber acesso à tela, ou **Qualquer crachá**).
|
|
50
50
|
|
|
51
51
|
- **Novo roteador** (habilitado quando já existe alguma rota) abre o formulário:
|
|
52
52
|
- **Página** (obrigatório): a rota que vira a tela.
|
|
53
53
|
- **Descrição**: o que a tela faz, em uma frase. Aparece abaixo do título, na barra da página.
|
|
54
54
|
- **Hierarquia (opcional)**: as rotas de **Header**, **Navegação**, **Menu**, **Item** e **Submenu** acima da página.
|
|
55
|
+
A hierarquia é **de cima para baixo**: **Navegação** só abre com um **Header** escolhido, **Menu** só com uma
|
|
56
|
+
**Navegação**, **Item** só com um **Menu** e **Submenu** só com um **Item**. Limpar um nível limpa os de baixo. A
|
|
57
|
+
página não depende de nível nenhum. Um roteador antigo com um nível vazio no meio mostra o aviso e só salva depois
|
|
58
|
+
de preencher o nível que falta (ou limpar os de baixo).
|
|
55
59
|
- **Privado** (já vem marcado): a tela só fica visível para os grupos que receberem acesso a ela na aba **Acesso**.
|
|
56
60
|
Desmarcado, o roteador é **Público** e não depende dessa liberação.
|
|
61
|
+
- **Crachás permitidos**: escolha um ou mais crachás (tipos de grupo, inclusive **Administrador**) para limitar
|
|
62
|
+
quem pode receber acesso a esta tela na aba **Acesso**. Vazio = **Qualquer crachá**.
|
|
57
63
|
- No menu de cada linha: **Editar** e **Excluir**. **Excluir** pede confirmação (**Excluir roteador?**, com o caminho
|
|
58
64
|
montado) e só apaga depois de **Excluir** no diálogo; a página sai do menu.
|
|
65
|
+
- Se o servidor recusar a gravação, o motivo aparece no próprio formulário, que continua aberto.
|
|
59
66
|
|
|
60
67
|
## Aba Acesso
|
|
61
68
|
|
|
@@ -69,6 +76,8 @@ A tabela mostra os grupos com acesso ao client: **Grupo** e **Crachá** (o tipo
|
|
|
69
76
|
pode e clique em **Confirmar alterações** (o botão só habilita quando algo mudou).
|
|
70
77
|
- **Remover** pede confirmação (**Remover acesso?**, com o nome do grupo) e só então tira o acesso do grupo ao
|
|
71
78
|
client.
|
|
79
|
+
- O grupo de administração do projeto não aparece aqui (nem na lista, nem em **Novo acesso**): o acesso dele é
|
|
80
|
+
gerido só no painel central (Argos).
|
|
72
81
|
|
|
73
82
|
Depois de cada exclusão aparece **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e o
|
|
74
83
|
item continua na tabela.
|
|
@@ -77,4 +86,4 @@ item continua na tabela.
|
|
|
77
86
|
`;
|
|
78
87
|
|
|
79
88
|
export { client_usage as default };
|
|
80
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-client.usage-
|
|
89
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-client.usage-CcJANb20.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-client.usage-CcJANb20.mjs","sources":["../../../projects/ui/auto-service/src/docs/client.usage.ts"],"sourcesContent":["// Manual de uso da tela Cliente 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 `# Cliente\n\nGerencie a navegação do seu client sem depender do painel central: as rotas (os itens do menu), os roteadores\n(onde cada tela aparece e se ela é privada) e o acesso (quais grupos veem quais telas privadas).\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. A tela mostra as abas **Rotas**, **Roteadores** e **Acesso**.\n\n## Como as peças se encaixam\n\n- **Rota:** um item com nome, nome de exibição, ícone e um trecho do endereço. Sozinha, ela não vira tela.\n- **Roteador:** coloca uma rota como **página** e diz em que ponto do menu ela fica (Header › Navegação › Menu ›\n Item › Submenu, todos opcionais). O endereço final da tela é a soma dos trechos das rotas dessa cadeia.\n- **Acesso:** libera o client para um grupo. Em cada acesso você escolhe quais roteadores **privados** aquele grupo\n enxerga.\n\n## Selos e travas\n\n- **Template:** o item veio do template da aplicação. Só a administração central do Argos edita ou exclui; aqui a\n linha aparece sem o menu de ações. A ordem e o acesso desses itens continuam sendo seus.\n- **Rota protegida** (**Excluível: Não**): não pode ser excluída. Ao editá-la, a caixa **Excluível** fica travada:\n só a administração central libera a exclusão.\n\n## Aba Rotas\n\nA tabela mostra **Nome**, **Exibição**, **Ícone**, **Path** e **Excluível**.\n\n- **Nova rota** abre o formulário:\n - **Nome interno** (obrigatório) e **Nome de exibição** (o texto que aparece no menu).\n - **Ícone**: escolha no catálogo; dá para digitar para filtrar, e cada opção mostra o próprio ícone.\n - **Caminho (path)**: um trecho só do endereço, com letras minúsculas e hífen (por exemplo, \\`ordens-servico\\`),\n sem \\`/\\`, espaço, número ou acento, e sem hífen no início ou no fim. O \\`/\\` entre os níveis quem monta é o\n roteador. Deixe vazio numa rota que só agrupa itens do menu.\n - **Info** e **Excluível**.\n- No menu de cada linha: **Editar** e **Excluir** (este só em rota excluível). **Excluir** pede confirmação\n (**Excluir rota?**, com o nome dela) e só apaga depois de **Excluir** no diálogo.\n- **Reordenar:** define a ordem dos itens no menu de navegação. A ordem é do seu client: vale também para itens do\n template, e a sincronização do template não a desfaz.\n\n## Aba Roteadores\n\nA tabela mostra **Página**, **Caminho montado** (o endereço final), **Descrição**, **Visibilidade** (**Privado** ou\n**Público**) e **Crachás permitidos** (os crachás que podem receber acesso à tela, ou **Qualquer crachá**).\n\n- **Novo roteador** (habilitado quando já existe alguma rota) abre o formulário:\n - **Página** (obrigatório): a rota que vira a tela.\n - **Descrição**: o que a tela faz, em uma frase. Aparece abaixo do título, na barra da página.\n - **Hierarquia (opcional)**: as rotas de **Header**, **Navegação**, **Menu**, **Item** e **Submenu** acima da página.\n A hierarquia é **de cima para baixo**: **Navegação** só abre com um **Header** escolhido, **Menu** só com uma\n **Navegação**, **Item** só com um **Menu** e **Submenu** só com um **Item**. Limpar um nível limpa os de baixo. A\n página não depende de nível nenhum. Um roteador antigo com um nível vazio no meio mostra o aviso e só salva depois\n de preencher o nível que falta (ou limpar os de baixo).\n - **Privado** (já vem marcado): a tela só fica visível para os grupos que receberem acesso a ela na aba **Acesso**.\n Desmarcado, o roteador é **Público** e não depende dessa liberação.\n - **Crachás permitidos**: escolha um ou mais crachás (tipos de grupo, inclusive **Administrador**) para limitar\n quem pode receber acesso a esta tela na aba **Acesso**. Vazio = **Qualquer crachá**.\n- No menu de cada linha: **Editar** e **Excluir**. **Excluir** pede confirmação (**Excluir roteador?**, com o caminho\n montado) e só apaga depois de **Excluir** no diálogo; a página sai do menu.\n- Se o servidor recusar a gravação, o motivo aparece no próprio formulário, que continua aberto.\n\n## Aba Acesso\n\nA tabela mostra os grupos com acesso ao client: **Grupo** e **Crachá** (o tipo do grupo).\n\n- **Novo acesso**: escolha o **Grupo** e clique em **Criar**.\n- No menu de cada linha:\n - **Gerenciar rotas** abre o painel **Rotas de nome do grupo**, com a árvore dos roteadores privados: as pastas\n são os níveis do menu e cada página tem uma caixa de seleção. Só aparecem os roteadores privados sem restrição\n de crachá ou cujo crachá permitido inclua o do grupo. Marque as telas que o grupo pode ver, desmarque as que não\n pode e clique em **Confirmar alterações** (o botão só habilita quando algo mudou).\n - **Remover** pede confirmação (**Remover acesso?**, com o nome do grupo) e só então tira o acesso do grupo ao\n client.\n- O grupo de administração do projeto não aparece aqui (nem na lista, nem em **Novo acesso**): o acesso dele é\n gerido só no painel central (Argos).\n\nDepois de cada exclusão aparece **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e o\nitem continua na tabela.\n\n> Quem participa de cada grupo se gerencia na tela **Grupos**.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,mBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkFd;;"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Especificação técnica da tela Grupos do auto-serviço (`RouteDocument.loadTechnical`), em Markdown. Módulo próprio,
|
|
2
|
+
// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
|
|
3
|
+
// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
|
|
4
|
+
var groups_technical = `# Grupos — especificação técnica
|
|
5
|
+
|
|
6
|
+
Tela \`AutoServiceGroupsComponent\`, ligada ao router de template \`AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID\`
|
|
7
|
+
(\`ad100001-…\`). Fala com o argos-admin-server em \`{adminApi}/auto-service\` (\`AutoServiceService\`), com o token no
|
|
8
|
+
cabeçalho \`x-access-token\`. Peças: \`hm-data-grid\` dos grupos, \`AutoServiceGroupModalComponent\` (criar/editar),
|
|
9
|
+
\`AutoServiceGroupMembersComponent\` (membros do grupo aberto) e \`AutoServiceGroupMembersModalComponent\`.
|
|
10
|
+
|
|
11
|
+
## Endpoints
|
|
12
|
+
|
|
13
|
+
| Ação | Endpoint |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Client administrado (só o do token) | \`GET /auto-service\` |
|
|
16
|
+
| Grupos do projeto do client | \`GET /auto-service/:clientId/groups\` (\`{ id, name, description, enabled, type }\`, sem o grupo de administração) |
|
|
17
|
+
| Tipos de grupo do realm | \`GET /auto-service/:clientId/group-types\` (\`{ id, name, level, assignable }\`) |
|
|
18
|
+
| Criar grupo | \`POST /auto-service/:clientId/groups\` (\`{ name, type_id, description? }\`) |
|
|
19
|
+
| Editar grupo | \`PUT /auto-service/:clientId/groups/:groupId\` (\`{ name, type_id, description, enabled }\`) |
|
|
20
|
+
| Excluir grupo | \`DELETE /auto-service/:clientId/groups/:groupId\` |
|
|
21
|
+
| Membros do grupo | \`GET /auto-service/:clientId/groups/:groupId/members\` |
|
|
22
|
+
| Sugestões e busca de usuários | \`GET /auto-service/:clientId/users?search=&limit=\` |
|
|
23
|
+
| Adicionar membro | \`POST /auto-service/:clientId/groups/:groupId/members\` (\`{ user_id, role }\`) |
|
|
24
|
+
| Trocar a função | \`PUT /auto-service/:clientId/groups/:groupId/members/:userId\` (\`{ role }\`) |
|
|
25
|
+
| Remover membro | \`DELETE /auto-service/:clientId/groups/:groupId/members/:userId\` |
|
|
26
|
+
|
|
27
|
+
## Regras
|
|
28
|
+
|
|
29
|
+
- **Autorização** (\`clientAdminGuard\` no servidor): o \`sub\` é membro do grupo de administração (\`is_admin\`,
|
|
30
|
+
habilitado) do projeto do client **e** está com o crachá Administrador ativo. Todo token só administra o client em
|
|
31
|
+
que foi emitido: \`GET /auto-service\` devolve só ele. O seletor de client
|
|
32
|
+
(\`AutoServiceClientPickerComponent\`) mostra \`loading\` enquanto busca; com um client, escolhe sozinho e não desenha
|
|
33
|
+
mais nada; com nenhum, mostra
|
|
34
|
+
\`autoService.noClients\`; a combobox só aparece se a API devolver mais de um.
|
|
35
|
+
- Grupo de outro projeto responde \`404\` (\`assertGroupBelongsToClient\`).
|
|
36
|
+
- Lista: grupos e tipos carregados juntos ao escolher o client; grupos ordenados por \`type.level\`, do maior para o
|
|
37
|
+
menor. Linha clicável (\`rowClickable\`) e o nome como botão (teclado) abrem o grupo; ações da linha: Editar e
|
|
38
|
+
Excluir (com \`confirm\` do \`hm-data-grid\`). Depois de criar/editar/excluir a lista recarrega; o grupo aberto é
|
|
39
|
+
trocado pela versão nova (ou fecha, se sumiu); o grupo recém-criado já abre.
|
|
40
|
+
- Modal: nome obrigatório (1–100, aparado), tipo obrigatório, descrição opcional; na criação a descrição vazia não
|
|
41
|
+
vai no corpo; na edição vai como \`null\` (apaga). Tipos oferecidos: só \`assignable !== false\`. A falha aparece no
|
|
42
|
+
modal (\`hm-alert\`) e o modal continua aberto.
|
|
43
|
+
- **Grupo de administração** (\`is_admin\`): gerido só no painel central (Argos), não aparece no auto-serviço. O
|
|
44
|
+
servidor não o devolve em \`GET /groups\` e responde \`404\` a editar, excluir e mexer nos membros dele (como grupo
|
|
45
|
+
de outro projeto). Servidor antigo que ainda o devolva (\`is_admin: true\`): a tela descarta na carga da lista
|
|
46
|
+
(\`load\`) e na lista de grupos do novo acesso (**Cliente › Acesso**). O Administrador (\`assignable: false\`)
|
|
47
|
+
nunca entra nos tipos do modal. Os textos \`adminGroupTag\`, \`adminGroupNote\`, \`adminGroupEditNote\` e
|
|
48
|
+
\`adminGroupLastMemberWarning\` ficaram \`@deprecated\`.
|
|
49
|
+
- **Erros** (\`autoServiceErrorText\`, em \`auto-service-errors.ts\`): o código \`error\` da resposta vira o texto de
|
|
50
|
+
\`autoService.groupErrors\` no idioma ativo — \`invalid_type\`, \`admin_type_reserved\`, \`empty_update\`,
|
|
51
|
+
\`group_project_immutable\` (400); \`group_name_taken\`, \`admin_group_immutable\`, \`admin_group_protected\`,
|
|
52
|
+
\`admin_group_last_member\`, \`admin_group_access_protected\` (409; de servidor antigo — o atual responde 404 ao
|
|
53
|
+
grupo de administração); \`404\` de grupo → \`groupNotFound\`. Código
|
|
54
|
+
desconhecido usa o \`detail\` do servidor e, por último, o texto genérico (\`groupSaveError\`, \`membersSaveError\` ou
|
|
55
|
+
\`deleteError\`). O \`AutoServiceDeleteFeedback\` usa a mesma função em todas as exclusões do auto-serviço.
|
|
56
|
+
- Sugestões: \`limit=30\` sem \`search\`, mostradas de 3 em 3. Busca: a partir de 2 caracteres, depois de 300 ms sem
|
|
57
|
+
digitar, \`limit=10\`. Membros atuais são retirados dos dois.
|
|
58
|
+
- Funções oferecidas pela tela: Administrador, Editor, Leitor; vazio grava \`role: null\`.
|
|
59
|
+
- **Salvar alterações** grava só a diferença, em sequência: adições, depois remoções, depois trocas de função (dos
|
|
60
|
+
membros que ficaram). Ao terminar, emite \`saved\` e a tabela recarrega. Se uma chamada falhar, o modal mostra o
|
|
61
|
+
erro, emite \`saved\` (parte pode ter sido gravada) e recarrega os membros.
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
export { groups_technical as default };
|
|
65
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs","sources":["../../../projects/ui/auto-service/src/docs/groups.technical.ts"],"sourcesContent":["// Especificação técnica da tela Grupos 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 `# Grupos — especificação técnica\n\nTela \\`AutoServiceGroupsComponent\\`, ligada ao router de template \\`AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID\\`\n(\\`ad100001-…\\`). Fala com o argos-admin-server em \\`{adminApi}/auto-service\\` (\\`AutoServiceService\\`), com o token no\ncabeçalho \\`x-access-token\\`. Peças: \\`hm-data-grid\\` dos grupos, \\`AutoServiceGroupModalComponent\\` (criar/editar),\n\\`AutoServiceGroupMembersComponent\\` (membros do grupo aberto) e \\`AutoServiceGroupMembersModalComponent\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Client administrado (só o do token) | \\`GET /auto-service\\` |\n| Grupos do projeto do client | \\`GET /auto-service/:clientId/groups\\` (\\`{ id, name, description, enabled, type }\\`, sem o grupo de administração) |\n| Tipos de grupo do realm | \\`GET /auto-service/:clientId/group-types\\` (\\`{ id, name, level, assignable }\\`) |\n| Criar grupo | \\`POST /auto-service/:clientId/groups\\` (\\`{ name, type_id, description? }\\`) |\n| Editar grupo | \\`PUT /auto-service/:clientId/groups/:groupId\\` (\\`{ name, type_id, description, enabled }\\`) |\n| Excluir grupo | \\`DELETE /auto-service/:clientId/groups/:groupId\\` |\n| Membros do grupo | \\`GET /auto-service/:clientId/groups/:groupId/members\\` |\n| Sugestões e busca de usuários | \\`GET /auto-service/:clientId/users?search=&limit=\\` |\n| Adicionar membro | \\`POST /auto-service/:clientId/groups/:groupId/members\\` (\\`{ user_id, role }\\`) |\n| Trocar a função | \\`PUT /auto-service/:clientId/groups/:groupId/members/:userId\\` (\\`{ role }\\`) |\n| Remover membro | \\`DELETE /auto-service/:clientId/groups/:groupId/members/:userId\\` |\n\n## Regras\n\n- **Autorização** (\\`clientAdminGuard\\` no servidor): o \\`sub\\` é membro do grupo de administração (\\`is_admin\\`,\n habilitado) do projeto do client **e** está com o crachá Administrador ativo. Todo token só administra o client em\n que foi emitido: \\`GET /auto-service\\` devolve só ele. O seletor de client\n (\\`AutoServiceClientPickerComponent\\`) mostra \\`loading\\` enquanto busca; com um client, escolhe sozinho e não desenha\n mais nada; com nenhum, mostra\n \\`autoService.noClients\\`; a combobox só aparece se a API devolver mais de um.\n- Grupo de outro projeto responde \\`404\\` (\\`assertGroupBelongsToClient\\`).\n- Lista: grupos e tipos carregados juntos ao escolher o client; grupos ordenados por \\`type.level\\`, do maior para o\n menor. Linha clicável (\\`rowClickable\\`) e o nome como botão (teclado) abrem o grupo; ações da linha: Editar e\n Excluir (com \\`confirm\\` do \\`hm-data-grid\\`). Depois de criar/editar/excluir a lista recarrega; o grupo aberto é\n trocado pela versão nova (ou fecha, se sumiu); o grupo recém-criado já abre.\n- Modal: nome obrigatório (1–100, aparado), tipo obrigatório, descrição opcional; na criação a descrição vazia não\n vai no corpo; na edição vai como \\`null\\` (apaga). Tipos oferecidos: só \\`assignable !== false\\`. A falha aparece no\n modal (\\`hm-alert\\`) e o modal continua aberto.\n- **Grupo de administração** (\\`is_admin\\`): gerido só no painel central (Argos), não aparece no auto-serviço. O\n servidor não o devolve em \\`GET /groups\\` e responde \\`404\\` a editar, excluir e mexer nos membros dele (como grupo\n de outro projeto). Servidor antigo que ainda o devolva (\\`is_admin: true\\`): a tela descarta na carga da lista\n (\\`load\\`) e na lista de grupos do novo acesso (**Cliente › Acesso**). O Administrador (\\`assignable: false\\`)\n nunca entra nos tipos do modal. Os textos \\`adminGroupTag\\`, \\`adminGroupNote\\`, \\`adminGroupEditNote\\` e\n \\`adminGroupLastMemberWarning\\` ficaram \\`@deprecated\\`.\n- **Erros** (\\`autoServiceErrorText\\`, em \\`auto-service-errors.ts\\`): o código \\`error\\` da resposta vira o texto de\n \\`autoService.groupErrors\\` no idioma ativo — \\`invalid_type\\`, \\`admin_type_reserved\\`, \\`empty_update\\`,\n \\`group_project_immutable\\` (400); \\`group_name_taken\\`, \\`admin_group_immutable\\`, \\`admin_group_protected\\`,\n \\`admin_group_last_member\\`, \\`admin_group_access_protected\\` (409; de servidor antigo — o atual responde 404 ao\n grupo de administração); \\`404\\` de grupo → \\`groupNotFound\\`. Código\n desconhecido usa o \\`detail\\` do servidor e, por último, o texto genérico (\\`groupSaveError\\`, \\`membersSaveError\\` ou\n \\`deleteError\\`). O \\`AutoServiceDeleteFeedback\\` usa a mesma função em todas as exclusões do auto-serviço.\n- Sugestões: \\`limit=30\\` sem \\`search\\`, mostradas de 3 em 3. Busca: a partir de 2 caracteres, depois de 300 ms sem\n digitar, \\`limit=10\\`. Membros atuais são retirados dos dois.\n- Funções oferecidas pela tela: Administrador, Editor, Leitor; vazio grava \\`role: null\\`.\n- **Salvar alterações** grava só a diferença, em sequência: adições, depois remoções, depois trocas de função (dos\n membros que ficaram). Ao terminar, emite \\`saved\\` e a tabela recarrega. Se uma chamada falhar, o modal mostra o\n erro, emite \\`saved\\` (parte pode ter sido gravada) e recarrega os membros.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,uBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Dd;;"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Manual de uso da tela Grupos do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,
|
|
2
|
+
// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do
|
|
3
|
+
// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.
|
|
4
|
+
var groups_usage = `# Grupos
|
|
5
|
+
|
|
6
|
+
Mantenha os grupos do projeto do seu app sem depender do painel central: crie, edite e exclua grupos, veja os
|
|
7
|
+
membros de cada um, adicione e remova pessoas e defina a função de cada uma.
|
|
8
|
+
|
|
9
|
+
## Antes de começar
|
|
10
|
+
|
|
11
|
+
O auto-serviço administra o app em que você está logado: não há client para escolher. É preciso estar no grupo de
|
|
12
|
+
administração do projeto desse app e com o crachá **Administrador** ativo. Se aparecer o aviso de que você não
|
|
13
|
+
administra este app, falta uma dessas duas coisas: troque de crachá no menu do seu perfil, se disponível, ou peça
|
|
14
|
+
acesso a quem administra o projeto.
|
|
15
|
+
|
|
16
|
+
## A lista de grupos
|
|
17
|
+
|
|
18
|
+
A tabela **Grupos do projeto** mostra os grupos do projeto, do tipo de nível mais alto para o mais baixo (o grupo de
|
|
19
|
+
administração do projeto não entra; veja abaixo):
|
|
20
|
+
|
|
21
|
+
- **Nome**;
|
|
22
|
+
- **Tipo**, num selo cuja cor acompanha o nível;
|
|
23
|
+
- **Situação**: **Ativo** ou **Inativo**.
|
|
24
|
+
|
|
25
|
+
Clique numa linha (ou no nome do grupo, pelo teclado) para abrir o grupo embaixo da tabela: um cartão com o nome,
|
|
26
|
+
os selos, a descrição e os botões **Editar** e **Excluir**, e a tabela **Membros do grupo**. O menu de cada linha
|
|
27
|
+
também tem **Editar** e **Excluir**.
|
|
28
|
+
|
|
29
|
+
## Criar e editar
|
|
30
|
+
|
|
31
|
+
- **Novo grupo** (no topo da tabela) abre o modal com **Nome** (obrigatório, até 100 caracteres), **Tipo**
|
|
32
|
+
(obrigatório) e **Descrição** (opcional). **Criar** grava e já abre o grupo novo, para incluir os membros.
|
|
33
|
+
- **Editar** abre o mesmo modal preenchido, com a caixa **Ativo** a mais: desmarcada, o grupo fica inativo.
|
|
34
|
+
**Salvar** grava; apagar a descrição a remove.
|
|
35
|
+
- O tipo **Administrador** não aparece na lista de tipos: ele é só do grupo de administração, que não se gere aqui.
|
|
36
|
+
- Se o servidor recusar, a mensagem aparece no próprio modal e nada é gravado. Os casos mais comuns: já existe um
|
|
37
|
+
grupo com esse nome no projeto, ou o tipo escolhido deixou de existir.
|
|
38
|
+
|
|
39
|
+
## Excluir
|
|
40
|
+
|
|
41
|
+
**Excluir** pede confirmação (**Excluir grupo?**, com o nome do grupo). Excluir um grupo apaga também os membros
|
|
42
|
+
dele, os acessos a telas (**Cliente › Acesso**) e as permissões em aplicações (**Aplicações › Acessos**), e não
|
|
43
|
+
pode ser desfeito. Depois aparece **Exclusão concluída.**; se o servidor recusar, a mensagem diz o motivo e o grupo
|
|
44
|
+
continua na tabela.
|
|
45
|
+
|
|
46
|
+
## O grupo de administração
|
|
47
|
+
|
|
48
|
+
Todo projeto tem um, e só um, grupo de administração: quem está nele administra o app no auto-serviço. Ele é gerido
|
|
49
|
+
só no painel central (Argos) e não aparece no auto-serviço: não está na tabela, não se edita nem se exclui aqui, e os
|
|
50
|
+
membros dele também não se gerenciam por esta tela. Para incluir ou tirar alguém da administração do app, peça a
|
|
51
|
+
quem administra o Argos.
|
|
52
|
+
|
|
53
|
+
## Gerenciar membros
|
|
54
|
+
|
|
55
|
+
Com o grupo aberto, clique em **Gerenciar membros**. O modal **Membros — nome do grupo** junta tudo o que muda no
|
|
56
|
+
grupo e só grava quando você confirma.
|
|
57
|
+
|
|
58
|
+
- **Adicionar:** em **Adicionar usuário**, digite pelo menos 2 letras do nome, do login ou do e-mail e escolha a
|
|
59
|
+
pessoa na lista (quem já é membro não aparece). Também dá para clicar numa das **Sugestões**; **Ver mais
|
|
60
|
+
sugestões** mostra mais três. Se quiser, escolha a **Função** (Administrador, Editor ou Leitor) e clique em
|
|
61
|
+
**Adicionar**. A pessoa entra na lista com o selo **Novo**.
|
|
62
|
+
- **Mudar a função:** use a coluna **Função** de cada membro. O traço (—) deixa o membro sem função.
|
|
63
|
+
- **Remover:** marque os membros na lista. Eles vão para o painel **Remoção**, ao lado, e a função deles fica
|
|
64
|
+
travada. **Desfazer remoção** (o ícone ao lado do nome) devolve o membro. Marcar alguém com o selo **Novo**
|
|
65
|
+
apenas o tira da lista, porque ele ainda não foi gravado.
|
|
66
|
+
- **Salvar alterações** grava tudo de uma vez: as pessoas novas, as remoções e as funções trocadas. **Cancelar**
|
|
67
|
+
(ou fechar o modal) descarta o que não foi salvo. Se uma parte falhar, o modal mostra o motivo e recarrega a
|
|
68
|
+
lista com o que de fato ficou gravado.
|
|
69
|
+
|
|
70
|
+
Depois de salvar, a tabela **Membros do grupo** é recarregada.
|
|
71
|
+
|
|
72
|
+
## O que esta tela não faz
|
|
73
|
+
|
|
74
|
+
- Não mexe em grupos de outros projetos: só aparecem, e só se alteram, os grupos do projeto deste app.
|
|
75
|
+
- Não mexe no grupo de administração do projeto: ele fica só no painel central (Argos).
|
|
76
|
+
- Não define o que o grupo pode acessar. As telas que cada grupo vê ficam em **Cliente › Acesso**; as operações que
|
|
77
|
+
cada grupo pode chamar numa aplicação ficam em **Aplicações › Acessos**.
|
|
78
|
+
`;
|
|
79
|
+
|
|
80
|
+
export { groups_usage as default };
|
|
81
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs","sources":["../../../projects/ui/auto-service/src/docs/groups.usage.ts"],"sourcesContent":["// Manual de uso da tela Grupos 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 `# Grupos\n\nMantenha os grupos do projeto do seu app sem depender do painel central: crie, edite e exclua grupos, veja os\nmembros de cada um, adicione e remova pessoas e defina a função de cada uma.\n\n## Antes de começar\n\nO auto-serviço administra o app em que você está logado: não há client para escolher. É preciso estar no grupo de\nadministração do projeto desse app e com o crachá **Administrador** ativo. Se aparecer o aviso de que você não\nadministra este app, falta uma dessas duas coisas: troque de crachá no menu do seu perfil, se disponível, ou peça\nacesso a quem administra o projeto.\n\n## A lista de grupos\n\nA tabela **Grupos do projeto** mostra os grupos do projeto, do tipo de nível mais alto para o mais baixo (o grupo de\nadministração do projeto não entra; veja abaixo):\n\n- **Nome**;\n- **Tipo**, num selo cuja cor acompanha o nível;\n- **Situação**: **Ativo** ou **Inativo**.\n\nClique numa linha (ou no nome do grupo, pelo teclado) para abrir o grupo embaixo da tabela: um cartão com o nome,\nos selos, a descrição e os botões **Editar** e **Excluir**, e a tabela **Membros do grupo**. O menu de cada linha\ntambém tem **Editar** e **Excluir**.\n\n## Criar e editar\n\n- **Novo grupo** (no topo da tabela) abre o modal com **Nome** (obrigatório, até 100 caracteres), **Tipo**\n (obrigatório) e **Descrição** (opcional). **Criar** grava e já abre o grupo novo, para incluir os membros.\n- **Editar** abre o mesmo modal preenchido, com a caixa **Ativo** a mais: desmarcada, o grupo fica inativo.\n **Salvar** grava; apagar a descrição a remove.\n- O tipo **Administrador** não aparece na lista de tipos: ele é só do grupo de administração, que não se gere aqui.\n- Se o servidor recusar, a mensagem aparece no próprio modal e nada é gravado. Os casos mais comuns: já existe um\n grupo com esse nome no projeto, ou o tipo escolhido deixou de existir.\n\n## Excluir\n\n**Excluir** pede confirmação (**Excluir grupo?**, com o nome do grupo). Excluir um grupo apaga também os membros\ndele, os acessos a telas (**Cliente › Acesso**) e as permissões em aplicações (**Aplicações › Acessos**), e não\npode ser desfeito. Depois aparece **Exclusão concluída.**; se o servidor recusar, a mensagem diz o motivo e o grupo\ncontinua na tabela.\n\n## O grupo de administração\n\nTodo projeto tem um, e só um, grupo de administração: quem está nele administra o app no auto-serviço. Ele é gerido\nsó no painel central (Argos) e não aparece no auto-serviço: não está na tabela, não se edita nem se exclui aqui, e os\nmembros dele também não se gerenciam por esta tela. Para incluir ou tirar alguém da administração do app, peça a\nquem administra o Argos.\n\n## Gerenciar membros\n\nCom o grupo aberto, clique em **Gerenciar membros**. O modal **Membros — nome do grupo** junta tudo o que muda no\ngrupo e só grava quando você confirma.\n\n- **Adicionar:** em **Adicionar usuário**, digite pelo menos 2 letras do nome, do login ou do e-mail e escolha a\n pessoa na lista (quem já é membro não aparece). Também dá para clicar numa das **Sugestões**; **Ver mais\n sugestões** mostra mais três. Se quiser, escolha a **Função** (Administrador, Editor ou Leitor) e clique em\n **Adicionar**. A pessoa entra na lista com o selo **Novo**.\n- **Mudar a função:** use a coluna **Função** de cada membro. O traço (—) deixa o membro sem função.\n- **Remover:** marque os membros na lista. Eles vão para o painel **Remoção**, ao lado, e a função deles fica\n travada. **Desfazer remoção** (o ícone ao lado do nome) devolve o membro. Marcar alguém com o selo **Novo**\n apenas o tira da lista, porque ele ainda não foi gravado.\n- **Salvar alterações** grava tudo de uma vez: as pessoas novas, as remoções e as funções trocadas. **Cancelar**\n (ou fechar o modal) descarta o que não foi salvo. Se uma parte falhar, o modal mostra o motivo e recarrega a\n lista com o que de fato ficou gravado.\n\nDepois de salvar, a tabela **Membros do grupo** é recarregada.\n\n## O que esta tela não faz\n\n- Não mexe em grupos de outros projetos: só aparecem, e só se alteram, os grupos do projeto deste app.\n- Não mexe no grupo de administração do projeto: ele fica só no painel central (Argos).\n- Não define o que o grupo pode acessar. As telas que cada grupo vê ficam em **Cliente › Acesso**; as operações que\n cada grupo pode chamar numa aplicação ficam em **Aplicações › Acessos**.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,mBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Ed;;"}
|