@trismegisto/spine 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs → trismegisto-spine-auto-service-apps.technical-dKM4fG42.mjs} +19 -14
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-dKM4fG42.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs → trismegisto-spine-auto-service-apps.usage-VMrCG5o3.mjs} +14 -10
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-VMrCG5o3.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs +37 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-DdtDk_xl.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map → trismegisto-spine-auto-service-auto-service-client-picker.component-DdtDk_xl.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs → trismegisto-spine-auto-service-auto-service-client.component-DXl1y6Sx.mjs} +15 -15
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map → trismegisto-spine-auto-service-auto-service-client.component-DXl1y6Sx.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs → trismegisto-spine-auto-service-auto-service-delete-B1tXgMvi.mjs} +2 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-B1tXgMvi.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs → trismegisto-spine-auto-service-auto-service-groups.component-C4iQ2GPX.mjs} +92 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-C4iQ2GPX.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs +37 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map → trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs → trismegisto-spine-auto-service-auto-service.component-DV88Uger.mjs} +78 -80
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DV88Uger.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs → trismegisto-spine-auto-service-groups.technical-D05838rU.mjs} +11 -7
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-D05838rU.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs → trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs} +11 -12
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +9 -9
- package/fesm2022/trismegisto-spine.mjs +24 -6
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine.d.ts +22 -7
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs +0 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +0 -37
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service.component-DV88Uger.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 * Para quem a permissão de operação é dada: um grupo (pessoas logadas) ou um token de API (sem login).\n * - `group`: só `protected` depende de permissão. `public` e `optional` rodam para qualquer um e `private` para qualquer\n * autenticado: liberar uma delas não muda nada, e o admin-server recusa (400 `operation_not_protected`).\n * - `token`: o token não tem login, então nada vale para ele sem permissão: `protected`, `private` (e `optional`) só com\n * a operação liberada explicitamente. Só `public` dispensa o token, e o admin-server recusa (400 `operation_public`).\n */\nexport type PermissionMode = 'group' | 'token';\n\n/** A operação depende de permissão para esse modo (a caixa fica escolhível). */\nexport function requiresPermission(level: string | null | undefined, mode: PermissionMode = 'group'): boolean {\n if (mode === 'token') return level !== 'public';\n return level === 'protected';\n}\n\n/** Por que a operação não precisa de permissão (no idioma ativo); vazio quando precisa. */\nexport function freeAccessText(level: string | null | undefined, text: SpineMessages['autoService'], mode: PermissionMode = 'group'): string {\n if (requiresPermission(level, mode)) return '';\n if (mode === 'token') return text.publicNoToken;\n if (level === 'private') return text.freeForAuthenticated;\n if (level === 'public' || level === 'optional') return text.freeForAll;\n return text.freeNoPermission;\n}\n\n/**\n * Estado inicial da caixa de uma operação que NÃO depende de permissão: no grupo vem marcada (já vale para ele); no token\n * vem desmarcada (pública não passa pelo token). Nos dois casos desabilitada.\n */\nexport function freeChecked(mode: PermissionMode): boolean {\n return mode === 'group';\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 { PermissionMode, freeAccessText, freeChecked, 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 no modo do painel e sem permissão gravada: caixa desabilitada. */\n free: string;\n}\n\n/**\n * \"Gerenciar operações\" de um consumer da aplicação: a caixa de cada operação e a diferença gravada ao confirmar.\n * `mode` diz de quem é o consumer: `group` (aba Acessos; public/private já valem e vêm marcadas e travadas) ou `token`\n * (aba Tokens; nada vem marcado, protected e private são escolhíveis e public fica travada e desmarcada).\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() mode: PermissionMode = 'group';\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 // Operação que não depende de permissão neste modo (o servidor recusa liberá-la): sem permissão gravada, a caixa\n // vem travada (marcada no grupo, desmarcada no token); com uma antiga, fica editável para dar para retirar.\n const free = !perm && !requiresPermission(op.level, this.mode) ? freeAccessText(op.level, this.text, this.mode) : '';\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: freeChecked(this.mode), 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 <p class=\"op-note muted\" *ngIf=\"!loading && mode === 'token' && rows.length\">{{ text.tokenOperationsNote }}</p>\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 = dá para escolher (protected/private). Senão, por que o token não precisa dela (public): caixa desmarcada 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 * Nada vem marcado: o token não tem login, então `protected` e `private` (e `optional`) só valem se marcadas aqui; as\n * `public` aparecem desmarcadas e desabilitadas (não precisam de 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, 'token'),\n control: requiresPermission(op.level, 'token')\n ? new FormControl(false, { nonNullable: true })\n : new FormControl({ value: false, 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 escolhidas (protected/private): public não vira permissão (o servidor recusa com operation_public).\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\" mode=\"token\" [open]=\"showPermissions\" (openChange)=\"showPermissions = $event\">\n</spine-auto-service-consumer-permissions>\n","import { Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n AlertComponent, ButtonComponent, CardComponent, ComboboxComponent, ComboboxOption, CopyButtonComponent, HermesDialogService,\n HermesToastService, ModalComponent, TabComponent, 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: Cadastrar e um cartão com o seletor das aplicações e Consultar.\n * A aplicação consultada abre embaixo: o resumo com Editar, Ativar/Desativar, Gerar novo segredo e Excluir, e as abas\n * 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, ComboboxComponent, CopyButtonComponent, 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 escolhida no seletor (só abre ao Consultar). */\n selectedAppId = '';\n /** Aplicação aberta (resumo + abas embaixo do seletor). */\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 /** Opções do seletor, recalculadas na carga (o `hm-combobox` recebe sempre o mesmo array). */\n appComboOptions: ComboboxOption[] = [];\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.selectedAppId = ''; this.apps = []; this.appComboOptions = []; this.newSecret = null; this.rotatedSecret = null;\n void this.load();\n }\n }\n\n async load() {\n const clientId = this.clientId;\n if (!clientId) { this.apps = []; this.appComboOptions = []; 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 this.appComboOptions = this.apps.map((a) => ({ value: a.id, label: a.name ?? a.id }));\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 if (this.selectedAppId && !this.apps.some((a) => a.id === this.selectedAppId)) this.selectedAppId = '';\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n /** Consultar: abre a aplicação escolhida no seletor. */\n searchApp() {\n const a = this.apps.find((x) => x.id === this.selectedAppId);\n if (a) this.openApp(a);\n }\n\n /** Abre a aplicação embaixo do seletor; 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.selectedAppId = a.id;\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. */\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; this.selectedAppId = ''; }\n this.newSecret = null;\n await this.load();\n }\n}\n","<div class=\"as-stack\">\n <div class=\"as-actions\">\n <hm-button icon=\"plus\" (clicked)=\"openCreate()\">{{ text.register }}</hm-button>\n </div>\n\n <hm-alert *ngIf=\"newSecret\" variant=\"success\" [closable]=\"true\" (closed)=\"newSecret = null\">\n {{ text.secretCreated }} <strong>{{ newSecret }}</strong>\n </hm-alert>\n\n <!-- Escolher a aplicação no seletor e Consultar abre o resumo (com as ações) e as abas embaixo. -->\n <hm-card>\n <div class=\"as-field-row\">\n <hm-combobox [label]=\"text.pickApp\" [options]=\"appComboOptions\" [value]=\"selectedAppId\"\n (valueChange)=\"selectedAppId = $event\" [disabled]=\"loading\">\n </hm-combobox>\n <hm-button [disabled]=\"!selectedAppId\" (clicked)=\"searchApp()\" icon=\"search\">{{ text.search }}</hm-button>\n </div>\n <p class=\"as-empty muted\" *ngIf=\"!loading && apps.length === 0\">{{ text.noApps }}</p>\n </hm-card>\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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"}
|
|
@@ -5,7 +5,7 @@ var groups_technical = `# Grupos — especificação técnica
|
|
|
5
5
|
|
|
6
6
|
Tela \`AutoServiceGroupsComponent\`, ligada ao router de template \`AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID\`
|
|
7
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-
|
|
8
|
+
cabeçalho \`x-access-token\`. Peças: dois \`hm-combobox\` (nível de acesso e grupo) + Consultar, \`AutoServiceGroupModalComponent\` (criar/editar),
|
|
9
9
|
\`AutoServiceGroupMembersComponent\` (membros do grupo aberto) e \`AutoServiceGroupMembersModalComponent\`.
|
|
10
10
|
|
|
11
11
|
## Endpoints
|
|
@@ -33,10 +33,14 @@ cabeçalho \`x-access-token\`. Peças: \`hm-data-grid\` dos grupos, \`AutoServic
|
|
|
33
33
|
mais nada; com nenhum, mostra
|
|
34
34
|
\`autoService.noClients\`; a combobox só aparece se a API devolver mais de um.
|
|
35
35
|
- Grupo de outro projeto responde \`404\` (\`assertGroupBelongsToClient\`).
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
- Seletores: grupos e tipos carregados juntos ao escolher o client. **Nível de acesso** (\`levelOptions\`): os tipos
|
|
37
|
+
de \`group-types\` com \`assignable !== false\` ou com algum grupo na lista (o Administrador fica de fora), mais os tipos
|
|
38
|
+
que só aparecem nos grupos (sem a rota de tipos) e "Sem nível" (\`NO_LEVEL\`) se algum grupo não tiver tipo; do
|
|
39
|
+
\`level\` maior para o menor. **Grupo** (\`groupOptions\`): só os do nível escolhido, em ordem alfabética; trocar o
|
|
40
|
+
nível limpa o grupo. **Consultar** abre o grupo (resumo com Editar/Excluir + membros); abrir um grupo aponta os dois
|
|
41
|
+
seletores para ele. Depois de criar/editar/excluir a lista recarrega; o grupo aberto é trocado pela versão nova (ou
|
|
42
|
+
fecha, se sumiu); o grupo recém-criado já abre. (Na 3.0.0 a lista era um \`hm-data-grid\`; voltou ao seletor a
|
|
43
|
+
pedido do usuário.)
|
|
40
44
|
- Modal: nome obrigatório (1–100, aparado), tipo obrigatório, descrição opcional; na criação a descrição vazia não
|
|
41
45
|
vai no corpo; na edição vai como \`null\` (apaga). Tipos oferecidos: só \`assignable !== false\`. A falha aparece no
|
|
42
46
|
modal (\`hm-alert\`) e o modal continua aberto.
|
|
@@ -57,9 +61,9 @@ cabeçalho \`x-access-token\`. Peças: \`hm-data-grid\` dos grupos, \`AutoServic
|
|
|
57
61
|
digitar, \`limit=10\`. Membros atuais são retirados dos dois.
|
|
58
62
|
- Funções oferecidas pela tela: Administrador, Editor, Leitor; vazio grava \`role: null\`.
|
|
59
63
|
- **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
|
|
64
|
+
membros que ficaram). Ao terminar, emite \`saved\` e a tabela de membros recarrega. Se uma chamada falhar, o modal mostra o
|
|
61
65
|
erro, emite \`saved\` (parte pode ter sido gravada) e recarrega os membros.
|
|
62
66
|
`;
|
|
63
67
|
|
|
64
68
|
export { groups_technical as default };
|
|
65
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-groups.technical-
|
|
69
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-groups.technical-D05838rU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-groups.technical-D05838rU.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: dois \\`hm-combobox\\` (nível de acesso e grupo) + Consultar, \\`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- Seletores: grupos e tipos carregados juntos ao escolher o client. **Nível de acesso** (\\`levelOptions\\`): os tipos\n de \\`group-types\\` com \\`assignable !== false\\` ou com algum grupo na lista (o Administrador fica de fora), mais os tipos\n que só aparecem nos grupos (sem a rota de tipos) e \"Sem nível\" (\\`NO_LEVEL\\`) se algum grupo não tiver tipo; do\n \\`level\\` maior para o menor. **Grupo** (\\`groupOptions\\`): só os do nível escolhido, em ordem alfabética; trocar o\n nível limpa o grupo. **Consultar** abre o grupo (resumo com Editar/Excluir + membros); abrir um grupo aponta os dois\n seletores para ele. Depois de criar/editar/excluir a lista recarrega; o grupo aberto é trocado pela versão nova (ou\n fecha, se sumiu); o grupo recém-criado já abre. (Na 3.0.0 a lista era um \\`hm-data-grid\\`; voltou ao seletor a\n pedido do usuário.)\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 de membros 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Dd;;"}
|
|
@@ -15,20 +15,19 @@ acesso a quem administra o projeto.
|
|
|
15
15
|
|
|
16
16
|
## A lista de grupos
|
|
17
17
|
|
|
18
|
-
A
|
|
19
|
-
|
|
18
|
+
A tela abre com o botão **Novo grupo** e um cartão com dois seletores (o grupo de administração do projeto não
|
|
19
|
+
entra; veja abaixo):
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- **Situação**: **Ativo** ou **Inativo**.
|
|
21
|
+
1. **Nível de acesso**: o tipo do grupo (o crachá), do nível mais alto para o mais baixo.
|
|
22
|
+
2. **Grupo**: só os grupos do nível escolhido. Trocar o nível limpa o grupo escolhido.
|
|
24
23
|
|
|
25
|
-
Clique
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
Clique em **Consultar** para abrir o grupo embaixo: um cartão com o nome, os selos do tipo (a cor acompanha o nível)
|
|
25
|
+
e da situação (**Ativo** ou **Inativo**), a descrição e os botões **Editar** e **Excluir**, e a tabela **Membros do
|
|
26
|
+
grupo**.
|
|
28
27
|
|
|
29
28
|
## Criar e editar
|
|
30
29
|
|
|
31
|
-
- **Novo grupo** (
|
|
30
|
+
- **Novo grupo** (acima dos seletores) abre o modal com **Nome** (obrigatório, até 100 caracteres), **Tipo**
|
|
32
31
|
(obrigatório) e **Descrição** (opcional). **Criar** grava e já abre o grupo novo, para incluir os membros.
|
|
33
32
|
- **Editar** abre o mesmo modal preenchido, com a caixa **Ativo** a mais: desmarcada, o grupo fica inativo.
|
|
34
33
|
**Salvar** grava; apagar a descrição a remove.
|
|
@@ -41,12 +40,12 @@ também tem **Editar** e **Excluir**.
|
|
|
41
40
|
**Excluir** pede confirmação (**Excluir grupo?**, com o nome do grupo). Excluir um grupo apaga também os membros
|
|
42
41
|
dele, os acessos a telas (**Cliente › Acesso**) e as permissões em aplicações (**Aplicações › Acessos**), e não
|
|
43
42
|
pode ser desfeito. Depois aparece **Exclusão concluída.**; se o servidor recusar, a mensagem diz o motivo e o grupo
|
|
44
|
-
continua
|
|
43
|
+
continua aberto.
|
|
45
44
|
|
|
46
45
|
## O grupo de administração
|
|
47
46
|
|
|
48
47
|
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á
|
|
48
|
+
só no painel central (Argos) e não aparece no auto-serviço: não está nos seletores, não se edita nem se exclui aqui, e os
|
|
50
49
|
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
50
|
quem administra o Argos.
|
|
52
51
|
|
|
@@ -78,4 +77,4 @@ Depois de salvar, a tabela **Membros do grupo** é recarregada.
|
|
|
78
77
|
`;
|
|
79
78
|
|
|
80
79
|
export { groups_usage as default };
|
|
81
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-groups.usage-
|
|
80
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-groups.usage-ChGMgYU3.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 tela abre com o botão **Novo grupo** e um cartão com dois seletores (o grupo de administração do projeto não\nentra; veja abaixo):\n\n1. **Nível de acesso**: o tipo do grupo (o crachá), do nível mais alto para o mais baixo.\n2. **Grupo**: só os grupos do nível escolhido. Trocar o nível limpa o grupo escolhido.\n\nClique em **Consultar** para abrir o grupo embaixo: um cartão com o nome, os selos do tipo (a cor acompanha o nível)\ne da situação (**Ativo** ou **Inativo**), a descrição e os botões **Editar** e **Excluir**, e a tabela **Membros do\ngrupo**.\n\n## Criar e editar\n\n- **Novo grupo** (acima dos seletores) 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 aberto.\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á nos seletores, 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEd;;"}
|
|
@@ -37,11 +37,11 @@ const AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID = '6a9a13db-f31b-494e-b51c-79af0ac28b
|
|
|
37
37
|
*/
|
|
38
38
|
const AUTO_SERVICE_SCREENS = {
|
|
39
39
|
home: () => import('./trismegisto-spine-auto-service-home.component-5_aji1hf.mjs').then(m => m.HomeComponent),
|
|
40
|
-
groups: () => import('./trismegisto-spine-auto-service-auto-service-groups.component-
|
|
41
|
-
apps: () => import('./trismegisto-spine-auto-service-auto-service.component-
|
|
42
|
-
client: () => import('./trismegisto-spine-auto-service-auto-service-client.component-
|
|
43
|
-
audit: () => import('./trismegisto-spine-auto-service-auto-service-audit.component-
|
|
44
|
-
loginAttempts: () => import('./trismegisto-spine-auto-service-auto-service-login-attempts.component-
|
|
40
|
+
groups: () => import('./trismegisto-spine-auto-service-auto-service-groups.component-C4iQ2GPX.mjs').then(m => m.AutoServiceGroupsComponent),
|
|
41
|
+
apps: () => import('./trismegisto-spine-auto-service-auto-service.component-DV88Uger.mjs').then(m => m.AutoServiceComponent),
|
|
42
|
+
client: () => import('./trismegisto-spine-auto-service-auto-service-client.component-DXl1y6Sx.mjs').then(m => m.AutoServiceClientComponent),
|
|
43
|
+
audit: () => import('./trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs').then(m => m.AutoServiceAuditComponent),
|
|
44
|
+
loginAttempts: () => import('./trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs').then(m => m.AutoServiceLoginAttemptsComponent),
|
|
45
45
|
};
|
|
46
46
|
/**
|
|
47
47
|
* Documentação das 6 telas (botão de documentação da barra da página e índice "Documentação do sistema"): o manual
|
|
@@ -57,12 +57,12 @@ const AUTO_SERVICE_DOCUMENTS = {
|
|
|
57
57
|
loadTechnical: () => import('./trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs').then(m => m.default),
|
|
58
58
|
},
|
|
59
59
|
groups: {
|
|
60
|
-
load: () => import('./trismegisto-spine-auto-service-groups.usage-
|
|
61
|
-
loadTechnical: () => import('./trismegisto-spine-auto-service-groups.technical-
|
|
60
|
+
load: () => import('./trismegisto-spine-auto-service-groups.usage-ChGMgYU3.mjs').then(m => m.default),
|
|
61
|
+
loadTechnical: () => import('./trismegisto-spine-auto-service-groups.technical-D05838rU.mjs').then(m => m.default),
|
|
62
62
|
},
|
|
63
63
|
apps: {
|
|
64
|
-
load: () => import('./trismegisto-spine-auto-service-apps.usage-
|
|
65
|
-
loadTechnical: () => import('./trismegisto-spine-auto-service-apps.technical-
|
|
64
|
+
load: () => import('./trismegisto-spine-auto-service-apps.usage-VMrCG5o3.mjs').then(m => m.default),
|
|
65
|
+
loadTechnical: () => import('./trismegisto-spine-auto-service-apps.technical-dKM4fG42.mjs').then(m => m.default),
|
|
66
66
|
},
|
|
67
67
|
client: {
|
|
68
68
|
load: () => import('./trismegisto-spine-auto-service-client.usage-CcJANb20.mjs').then(m => m.default),
|
|
@@ -1700,6 +1700,10 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1700
1700
|
editGroup: 'Editar grupo',
|
|
1701
1701
|
groupsCaption: 'Grupos do projeto',
|
|
1702
1702
|
noGroups: 'Nenhum grupo cadastrado ainda.',
|
|
1703
|
+
accessLevel: 'Nível de acesso',
|
|
1704
|
+
pickAccessLevel: 'Selecione o nível',
|
|
1705
|
+
noLevel: 'Sem nível',
|
|
1706
|
+
noGroupsOfLevel: 'Nenhum grupo neste nível.',
|
|
1703
1707
|
colStatus: 'Situação',
|
|
1704
1708
|
groupName: 'Nome',
|
|
1705
1709
|
groupType: 'Tipo',
|
|
@@ -1740,10 +1744,11 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1740
1744
|
tokenExpiresHint: 'De amanhã até 365 dias a partir de hoje.',
|
|
1741
1745
|
tokenExpiresInvalid: 'Escolha uma data entre amanhã e 365 dias a partir de hoje.',
|
|
1742
1746
|
tokenOperations: 'Operações liberadas ao token',
|
|
1743
|
-
tokenOperationsNote: '
|
|
1747
|
+
tokenOperationsNote: 'Nada vem marcado: o token não tem login, então marque as operações protected e private que ele pode chamar. As public não precisam de token.',
|
|
1744
1748
|
freeForAll: 'liberada para todos',
|
|
1745
1749
|
freeForAuthenticated: 'liberada para autenticados',
|
|
1746
1750
|
freeNoPermission: 'não depende de permissão',
|
|
1751
|
+
publicNoToken: 'pública: não precisa de token',
|
|
1747
1752
|
createToken: 'Criar token',
|
|
1748
1753
|
tokenSaveError: 'Não foi possível criar o token. Tente de novo.',
|
|
1749
1754
|
tokenCreatedHeading: 'Token {name} criado',
|
|
@@ -1759,7 +1764,8 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1759
1764
|
invalidExpiresAt: 'Data de validade inválida. Escolha outra data.',
|
|
1760
1765
|
invalidValidity: 'A validade precisa ficar entre amanhã e 365 dias a partir de hoje.',
|
|
1761
1766
|
invalidOperationIds: 'Alguma operação escolhida não existe mais nesta aplicação. Reabra o formulário e escolha de novo.',
|
|
1762
|
-
operationNotProtected: 'Só operações protected podem ser liberadas
|
|
1767
|
+
operationNotProtected: 'Só operações protected podem ser liberadas a um grupo; as public e private já valem para ele.',
|
|
1768
|
+
operationPublic: 'Operação pública não precisa de token e não pode ser liberada a ele. Desmarque-a e tente de novo.',
|
|
1763
1769
|
appNotFound: 'Aplicação não encontrada neste client. Ela pode ter sido excluída.',
|
|
1764
1770
|
tokenNotFound: 'Token não encontrado nesta aplicação. Ele pode já ter sido revogado.',
|
|
1765
1771
|
},
|
|
@@ -2745,6 +2751,10 @@ const SPINE_MESSAGES_EN = {
|
|
|
2745
2751
|
editGroup: 'Edit group',
|
|
2746
2752
|
groupsCaption: 'Project groups',
|
|
2747
2753
|
noGroups: 'No groups yet.',
|
|
2754
|
+
accessLevel: 'Access level',
|
|
2755
|
+
pickAccessLevel: 'Select a level',
|
|
2756
|
+
noLevel: 'No level',
|
|
2757
|
+
noGroupsOfLevel: 'No groups at this level.',
|
|
2748
2758
|
colStatus: 'Status',
|
|
2749
2759
|
groupName: 'Name',
|
|
2750
2760
|
groupType: 'Type',
|
|
@@ -2785,10 +2795,11 @@ const SPINE_MESSAGES_EN = {
|
|
|
2785
2795
|
tokenExpiresHint: 'From tomorrow up to 365 days from today.',
|
|
2786
2796
|
tokenExpiresInvalid: 'Pick a date between tomorrow and 365 days from today.',
|
|
2787
2797
|
tokenOperations: 'Operations granted to the token',
|
|
2788
|
-
tokenOperationsNote: '
|
|
2798
|
+
tokenOperationsNote: 'Nothing comes checked: a token has no login, so check the protected and private operations it may call. Public ones need no token.',
|
|
2789
2799
|
freeForAll: 'open to everyone',
|
|
2790
2800
|
freeForAuthenticated: 'open to authenticated callers',
|
|
2791
2801
|
freeNoPermission: 'does not depend on permission',
|
|
2802
|
+
publicNoToken: 'public: no token needed',
|
|
2792
2803
|
createToken: 'Create token',
|
|
2793
2804
|
tokenSaveError: 'Could not create the token. Try again.',
|
|
2794
2805
|
tokenCreatedHeading: 'Token {name} created',
|
|
@@ -2804,7 +2815,8 @@ const SPINE_MESSAGES_EN = {
|
|
|
2804
2815
|
invalidExpiresAt: 'Invalid expiration date. Pick another date.',
|
|
2805
2816
|
invalidValidity: 'The expiration must be between tomorrow and 365 days from today.',
|
|
2806
2817
|
invalidOperationIds: 'Some selected operation no longer exists in this application. Reopen the form and choose again.',
|
|
2807
|
-
operationNotProtected: 'Only protected operations can be granted to
|
|
2818
|
+
operationNotProtected: 'Only protected operations can be granted to a group; public and private ones already apply to it.',
|
|
2819
|
+
operationPublic: 'A public operation needs no token and cannot be granted to one. Uncheck it and try again.',
|
|
2808
2820
|
appNotFound: 'Application not found in this client. It may have been deleted.',
|
|
2809
2821
|
tokenNotFound: 'Token not found in this application. It may have been revoked already.',
|
|
2810
2822
|
},
|
|
@@ -3790,6 +3802,10 @@ const SPINE_MESSAGES_ES = {
|
|
|
3790
3802
|
editGroup: 'Editar grupo',
|
|
3791
3803
|
groupsCaption: 'Grupos del proyecto',
|
|
3792
3804
|
noGroups: 'Aún no hay grupos registrados.',
|
|
3805
|
+
accessLevel: 'Nivel de acceso',
|
|
3806
|
+
pickAccessLevel: 'Selecciona un nivel',
|
|
3807
|
+
noLevel: 'Sin nivel',
|
|
3808
|
+
noGroupsOfLevel: 'Ningún grupo en este nivel.',
|
|
3793
3809
|
colStatus: 'Estado',
|
|
3794
3810
|
groupName: 'Nombre',
|
|
3795
3811
|
groupType: 'Tipo',
|
|
@@ -3830,10 +3846,11 @@ const SPINE_MESSAGES_ES = {
|
|
|
3830
3846
|
tokenExpiresHint: 'Desde mañana hasta 365 días a partir de hoy.',
|
|
3831
3847
|
tokenExpiresInvalid: 'Elige una fecha entre mañana y 365 días a partir de hoy.',
|
|
3832
3848
|
tokenOperations: 'Operaciones concedidas al token',
|
|
3833
|
-
tokenOperationsNote: '
|
|
3849
|
+
tokenOperationsNote: 'Nada viene marcado: el token no tiene login, así que marca las operaciones protected y private que puede llamar. Las public no necesitan token.',
|
|
3834
3850
|
freeForAll: 'abierta a todos',
|
|
3835
3851
|
freeForAuthenticated: 'abierta a autenticados',
|
|
3836
3852
|
freeNoPermission: 'no depende de permiso',
|
|
3853
|
+
publicNoToken: 'pública: no necesita token',
|
|
3837
3854
|
createToken: 'Crear token',
|
|
3838
3855
|
tokenSaveError: 'No se pudo crear el token. Inténtalo de nuevo.',
|
|
3839
3856
|
tokenCreatedHeading: 'Token {name} creado',
|
|
@@ -3849,7 +3866,8 @@ const SPINE_MESSAGES_ES = {
|
|
|
3849
3866
|
invalidExpiresAt: 'Fecha de vencimiento no válida. Elige otra fecha.',
|
|
3850
3867
|
invalidValidity: 'El vencimiento debe estar entre mañana y 365 días a partir de hoy.',
|
|
3851
3868
|
invalidOperationIds: 'Alguna operación elegida ya no existe en esta aplicación. Vuelve a abrir el formulario y elige de nuevo.',
|
|
3852
|
-
operationNotProtected: 'Solo las operaciones protected se pueden conceder
|
|
3869
|
+
operationNotProtected: 'Solo las operaciones protected se pueden conceder a un grupo; las public y private ya valen para él.',
|
|
3870
|
+
operationPublic: 'Una operación pública no necesita token y no se le puede conceder. Desmárcala e inténtalo de nuevo.',
|
|
3853
3871
|
appNotFound: 'Aplicación no encontrada en este client. Puede haber sido eliminada.',
|
|
3854
3872
|
tokenNotFound: 'Token no encontrado en esta aplicación. Puede que ya haya sido revocado.',
|
|
3855
3873
|
},
|