@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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-auto-service.component-BLN49F4a.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-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-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-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/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, 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 { 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 { 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, IconComponent, TagComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\n\ninterface OperationRow {\n operation_id: string; identifier: string; method: string; level: string; description?: string;\n permissionId?: string; control: FormControl<boolean>;\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 @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 return {\n operation_id: op.operation_id, identifier: op.identifier, method: op.method, level: op.level,\n description: op.description, permissionId: perm?.permission_id,\n control: 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.control.value !== !!r.permissionId); }\n\n async confirm() {\n const toAdd = this.rows.filter(r => r.control.value && !r.permissionId);\n const toRemove = this.rows.filter(r => !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 } 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\" />\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 { consumer_id: string; group_name: string; group_type_name: string; }\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 { const res = await this.service.getAppConsumers(this.clientId, this.appId); this.entries = res.consumers; }\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;\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, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n AlertComponent, ButtonComponent, CardComponent, ComboboxComponent, ComboboxOption, HermesDialogService, TabComponent, TabContentDirective,\n TabsComponent, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { AutoServiceDeleteFeedback } from '../../auto-service-delete';\nimport { AutoServiceService } from '../../auto-service.service';\nimport { AutoServiceAppsModalComponent } from './modals/apps-modal/auto-service-apps-modal.component';\nimport { AutoServiceAppOperationsComponent } from './tabs/app-operations/auto-service-app-operations.component';\nimport { AutoServiceAppAccessComponent } from './tabs/app-access/auto-service-app-access.component';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\ntype Tab = 'operations' | 'access';\n\n@Component({\n selector: 'spine-auto-service-apps',\n standalone: true,\n imports: [\n CommonModule, FormsModule, AlertComponent, ButtonComponent, CardComponent, ComboboxComponent, TabsComponent, TabComponent,\n TabContentDirective, TagComponent,\n AutoServiceAppsModalComponent, AutoServiceAppOperationsComponent, AutoServiceAppAccessComponent,\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 @Input() clientId = '';\n loadingOptions = false;\n appOptions: any[] = [];\n selectedAppId = '';\n app: any = null;\n searchingApp = false;\n modalApp: any = null;\n showAppModal = false;\n activeTab: Tab = 'operations';\n newSecret: string | null = null;\n constructor(private service: AutoServiceService) {}\n\n get appComboOptions(): ComboboxOption[] {\n return this.appOptions.map((a) => ({ value: a.id, label: a.name }));\n }\n\n // Trocar de client esconde o segredo recém-criado: ele é de uma aplicação do client anterior.\n ngOnChanges(changes: SimpleChanges) { if (changes['clientId']) { this.selectedAppId = ''; this.app = null; this.newSecret = null; this.loadAppOptions(); } }\n\n async loadAppOptions() {\n if (!this.clientId) { this.appOptions = []; return; }\n this.loadingOptions = true;\n try { const res = await this.service.getApps(this.clientId); this.appOptions = res.apps; }\n finally { this.loadingOptions = false; this.cdr.markForCheck(); }\n }\n\n async searchApp() {\n if (!this.selectedAppId) return;\n this.searchingApp = true;\n try { this.app = this.appOptions.find(a => a.id === this.selectedAppId) ?? null; this.activeTab = 'operations'; }\n finally { this.searchingApp = false; this.cdr.markForCheck(); }\n }\n\n setTab(tab: Tab) { this.activeTab = tab; }\n openCreate() { this.modalApp = null; this.showAppModal = true; }\n openEdit() { this.modalApp = this.app; this.showAppModal = true; }\n\n async onAppSaved(secret?: string) {\n if (secret) this.newSecret = secret;\n await this.loadAppOptions();\n if (this.app?.id) { this.app = this.appOptions.find(a => a.id === this.app.id) ?? this.app; }\n this.cdr.markForCheck();\n }\n\n async toggleEnabled() {\n if (!this.app) return;\n await this.service.updateApp(this.clientId, this.app.id, { enabled: !this.app.enabled });\n await this.loadAppOptions();\n this.app = this.appOptions.find(a => a.id === this.app.id) ?? this.app;\n this.cdr.markForCheck();\n }\n\n /** Pede confirmação; só então o DELETE (com toast de sucesso/erro). */\n async deleteApp() {\n const app = this.app;\n if (!app) return;\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmDeleteAppHeading,\n message: formatMessage(this.text.confirmDeleteApp, { name: app.name ?? app.id }),\n confirmLabel: this.text.delete,\n danger: true,\n });\n if (!ok) return;\n if (!(await this.deletion.run(() => this.service.deleteApp(this.clientId, app.id)))) return;\n this.app = null; this.selectedAppId = ''; this.newSecret = null;\n await this.loadAppOptions();\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 <hm-card>\n <div class=\"as-field-row\">\n <hm-combobox [label]=\"text.pickApp\" [options]=\"appComboOptions\"\n [value]=\"selectedAppId\" (valueChange)=\"selectedAppId = $event\" [disabled]=\"loadingOptions\">\n </hm-combobox>\n <hm-button [disabled]=\"!selectedAppId || searchingApp\" (clicked)=\"searchApp()\" icon=\"search\">{{ text.search }}</hm-button>\n </div>\n </hm-card>\n\n <ng-container *ngIf=\"app\">\n <hm-card>\n <div class=\"as-summary\">\n <div class=\"as-summary__info\">\n <p class=\"as-summary__title\">\n {{ app.name }}\n <hm-tag [name]=\"app.enabled ? text.active : text.inactive\" [color]=\"app.enabled ? 'success' : 'danger'\" />\n </p>\n <p class=\"as-summary__detail\">{{ app.allowed_grants?.join(', ') }}</p>\n </div>\n <div class=\"as-actions\">\n <hm-button emphasis=\"medium\" icon=\"pencil\" (clicked)=\"openEdit()\">{{ text.edit }}</hm-button>\n <hm-button emphasis=\"medium\" (clicked)=\"toggleEnabled()\">{{ app.enabled ? text.disable : text.enable }}</hm-button>\n <hm-button intent=\"danger\" emphasis=\"medium\" icon=\"trash\" (clicked)=\"deleteApp()\">{{ 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]=\"app.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]=\"app.id\"></spine-auto-service-app-access>\n </hm-tab>\n </hm-tabs>\n </ng-container>\n</div>\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","i1"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-client.technical-BHWhpyWv.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 }\\`), \\`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\\` |\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- **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- **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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCd;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-client.usage-CM2WB2e2.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\nA escolha do client funciona como nas outras telas do auto-serviço: com um client só, ele já vem escolhido; com\nmais de um, escolha em **Selecione o client que deseja administrar**. É preciso estar com o crachá\n**Administrador** ativo. Depois de escolher, 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** e **Visibilidade** (**Privado** ou\n**Público**).\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 - **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- 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\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\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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEd;;"}
|
|
@@ -1,39 +0,0 @@
|
|
|
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\`.
|
|
9
|
-
|
|
10
|
-
## Endpoints
|
|
11
|
-
|
|
12
|
-
| Ação | Endpoint |
|
|
13
|
-
| --- | --- |
|
|
14
|
-
| Clients que a pessoa administra (seletor) | \`GET /auto-service\` |
|
|
15
|
-
| Grupos do client | \`GET /auto-service/:clientId/groups\` |
|
|
16
|
-
| Membros do grupo | \`GET /auto-service/:clientId/groups/:groupId/members\` |
|
|
17
|
-
| Sugestões e busca de usuários | \`GET /auto-service/:clientId/users?search=&limit=\` |
|
|
18
|
-
| Adicionar membro | \`POST /auto-service/:clientId/groups/:groupId/members\` (\`{ user_id, role }\`) |
|
|
19
|
-
| Trocar a função | \`PUT /auto-service/:clientId/groups/:groupId/members/:userId\` (\`{ role }\`) |
|
|
20
|
-
| Remover membro | \`DELETE /auto-service/:clientId/groups/:groupId/members/:userId\` |
|
|
21
|
-
|
|
22
|
-
## Regras
|
|
23
|
-
|
|
24
|
-
- **Autorização** (\`clientAdminGuard\` no servidor): a pessoa precisa estar num grupo que administra o projeto do
|
|
25
|
-
client (\`auth.group_projects\`) **e** com o crachá Administrador ativo no token. Sem isso, 401/403; grupo que não
|
|
26
|
-
é do projeto do client responde 404 (\`assertGroupBelongsToClient\`).
|
|
27
|
-
- Com um client só, o seletor escolhe sozinho e não aparece; sem nenhum, mostra \`autoService.noClients\`.
|
|
28
|
-
- Grupos ordenados por \`type.level\`, do maior para o menor. **Consultar** só escolhe o grupo já carregado (não há
|
|
29
|
-
chamada extra).
|
|
30
|
-
- Sugestões: \`limit=30\` sem \`search\`, mostradas de 3 em 3. Busca: a partir de 2 caracteres, depois de 300 ms sem
|
|
31
|
-
digitar, \`limit=10\`. Membros atuais são retirados dos dois.
|
|
32
|
-
- Funções oferecidas pela tela: Administrador, Editor, Leitor; vazio grava \`role: null\`.
|
|
33
|
-
- **Salvar alterações** grava só a diferença, em sequência: adições, depois remoções, depois trocas de função (dos
|
|
34
|
-
membros que ficaram). Ao terminar, emite \`saved\` e a tabela recarrega.
|
|
35
|
-
- A tela não cria, renomeia nem exclui grupos (não há endpoint para isso em \`/auto-service\`).
|
|
36
|
-
`;
|
|
37
|
-
|
|
38
|
-
export { groups_technical as default };
|
|
39
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-groups.technical-jQlwaQPn.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\\`.\n\n## Endpoints\n\n| Ação | Endpoint |\n| --- | --- |\n| Clients que a pessoa administra (seletor) | \\`GET /auto-service\\` |\n| Grupos do client | \\`GET /auto-service/:clientId/groups\\` |\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): a pessoa precisa estar num grupo que administra o projeto do\n client (\\`auth.group_projects\\`) **e** com o crachá Administrador ativo no token. Sem isso, 401/403; grupo que não\n é do projeto do client responde 404 (\\`assertGroupBelongsToClient\\`).\n- Com um client só, o seletor escolhe sozinho e não aparece; sem nenhum, mostra \\`autoService.noClients\\`.\n- Grupos ordenados por \\`type.level\\`, do maior para o menor. **Consultar** só escolhe o grupo já carregado (não há\n chamada extra).\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.\n- A tela não cria, renomeia nem exclui grupos (não há endpoint para isso em \\`/auto-service\\`).\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,uBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCd;;"}
|
|
@@ -1,54 +0,0 @@
|
|
|
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
|
-
Gerencie quem faz parte dos grupos do seu client, sem depender do painel central: consulte um grupo, veja os
|
|
7
|
-
membros, adicione e remova pessoas e defina a função de cada uma.
|
|
8
|
-
|
|
9
|
-
## Antes de começar
|
|
10
|
-
|
|
11
|
-
No topo da tela fica a escolha do client:
|
|
12
|
-
|
|
13
|
-
- Se você administra **um client só**, ele já vem escolhido e a escolha nem aparece.
|
|
14
|
-
- Se administra **mais de um**, escolha em **Selecione o client que deseja administrar**.
|
|
15
|
-
- Se aparecer o aviso de que você ainda não administra nenhum client, faltam uma destas duas coisas: ter acesso
|
|
16
|
-
concedido a um client e estar com o crachá **Administrador** ativo. Troque de crachá no menu do seu perfil, se
|
|
17
|
-
disponível, ou peça acesso a um administrador central.
|
|
18
|
-
|
|
19
|
-
## Como usar
|
|
20
|
-
|
|
21
|
-
1. Em **Selecione um grupo**, escolha o grupo e clique em **Consultar**. A lista mostra o nome e, entre
|
|
22
|
-
parênteses, o tipo do grupo, do tipo de nível mais alto para o mais baixo.
|
|
23
|
-
2. O cartão do grupo mostra o nome, um selo com o tipo (a cor acompanha o nível) e a descrição.
|
|
24
|
-
3. A tabela **Membros do grupo** lista cada pessoa com nome, situação (**Ativo** ou **Inativo**), login e e-mail,
|
|
25
|
-
e a data em que entrou no grupo (**Membro desde**).
|
|
26
|
-
4. Para mudar a composição do grupo, clique em **Gerenciar membros**.
|
|
27
|
-
|
|
28
|
-
## Gerenciar membros
|
|
29
|
-
|
|
30
|
-
O modal **Membros — nome do grupo** junta tudo o que muda no grupo e só grava quando você confirma.
|
|
31
|
-
|
|
32
|
-
- **Adicionar:** em **Adicionar usuário**, digite pelo menos 2 letras do nome, do login ou do e-mail e escolha a
|
|
33
|
-
pessoa na lista (quem já é membro não aparece). Também dá para clicar numa das **Sugestões**; **Ver mais
|
|
34
|
-
sugestões** mostra mais três. Se quiser, escolha a **Função** (Administrador, Editor ou Leitor) e clique em
|
|
35
|
-
**Adicionar**. A pessoa entra na lista com o selo **Novo**.
|
|
36
|
-
- **Mudar a função:** use a coluna **Função** de cada membro. O traço (—) deixa o membro sem função.
|
|
37
|
-
- **Remover:** marque os membros na lista. Eles vão para o painel **Remoção**, ao lado, e a função deles fica
|
|
38
|
-
travada. **Desfazer remoção** (o ícone ao lado do nome) devolve o membro. Marcar alguém com o selo **Novo**
|
|
39
|
-
apenas o tira da lista, porque ele ainda não foi gravado.
|
|
40
|
-
- **Salvar alterações** grava tudo de uma vez: as pessoas novas, as remoções e as funções trocadas. **Cancelar**
|
|
41
|
-
(ou fechar o modal) descarta o que não foi salvo.
|
|
42
|
-
|
|
43
|
-
Depois de salvar, a tabela **Membros do grupo** é recarregada.
|
|
44
|
-
|
|
45
|
-
## O que esta tela não faz
|
|
46
|
-
|
|
47
|
-
- Não cria, renomeia nem exclui grupos, e não muda o tipo de um grupo: isso fica com a administração central do
|
|
48
|
-
Argos.
|
|
49
|
-
- Não define o que o grupo pode acessar. As telas que cada grupo vê ficam em **Cliente › Acesso**; as operações que
|
|
50
|
-
cada grupo pode chamar numa aplicação ficam em **Aplicações › Acessos**.
|
|
51
|
-
`;
|
|
52
|
-
|
|
53
|
-
export { groups_usage as default };
|
|
54
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.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\nGerencie quem faz parte dos grupos do seu client, sem depender do painel central: consulte um grupo, veja os\nmembros, adicione e remova pessoas e defina a função de cada uma.\n\n## Antes de começar\n\nNo topo da tela fica a escolha do client:\n\n- Se você administra **um client só**, ele já vem escolhido e a escolha nem aparece.\n- Se administra **mais de um**, escolha em **Selecione o client que deseja administrar**.\n- Se aparecer o aviso de que você ainda não administra nenhum client, faltam uma destas duas coisas: ter acesso\n concedido a um client e estar com o crachá **Administrador** ativo. Troque de crachá no menu do seu perfil, se\n disponível, ou peça acesso a um administrador central.\n\n## Como usar\n\n1. Em **Selecione um grupo**, escolha o grupo e clique em **Consultar**. A lista mostra o nome e, entre\n parênteses, o tipo do grupo, do tipo de nível mais alto para o mais baixo.\n2. O cartão do grupo mostra o nome, um selo com o tipo (a cor acompanha o nível) e a descrição.\n3. A tabela **Membros do grupo** lista cada pessoa com nome, situação (**Ativo** ou **Inativo**), login e e-mail,\n e a data em que entrou no grupo (**Membro desde**).\n4. Para mudar a composição do grupo, clique em **Gerenciar membros**.\n\n## Gerenciar membros\n\nO modal **Membros — nome do grupo** junta tudo o que muda no grupo 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.\n\nDepois de salvar, a tabela **Membros do grupo** é recarregada.\n\n## O que esta tela não faz\n\n- Não cria, renomeia nem exclui grupos, e não muda o tipo de um grupo: isso fica com a administração central do\n 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Cd;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs","sources":["../../../projects/ui/auto-service/src/home/home-shortcuts.ts","../../../projects/ui/auto-service/src/home/home.component.ts","../../../projects/ui/auto-service/src/home/home.component.html"],"sourcesContent":["import { Route } from '@trismegisto/spine';\nimport {\n AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID,\n} from '../auto-service.tokens';\n\n/** A page the person can open, with the labels of the menus above it. */\nexport interface HomeDestination {\n readonly id: string;\n readonly label: string;\n readonly icon: string | null;\n readonly redirect: string;\n readonly trail: readonly string[];\n}\n\n/** A large entry tile on the home screen. */\nexport interface HomeShortcut extends HomeDestination {\n readonly screens: number;\n readonly privileged: boolean;\n}\n\n// Above this many tiles a grid stops being scannable at a glance.\nconst MAX_TILES = 12;\n\nconst ADMIN_TEMPLATES = new Set(\n [\n AUTO_SERVICE_GROUPS_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_APPS_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_CLIENT_TEMPLATE_ROUTER_ID,\n AUTO_SERVICE_AUDIT_TEMPLATE_ROUTER_ID,\n ].map((id) => id.toLowerCase()),\n);\nconst HOME_TEMPLATE = AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID.toLowerCase();\n\nfunction childrenOf(node: Route): Route[] {\n return (node.routes ?? []).filter((child): child is Route => child != null);\n}\n\nfunction labelOf(node: Route): string {\n return (node.route_display_name ?? node.route_name ?? '').trim();\n}\n\nfunction identityOf(node: Route): string {\n return node.route_redirect || `${node.route_type ?? 'node'}:${node.routed_id}`;\n}\n\nfunction templateOf(node: Route): string {\n return (node.source_template_router_id ?? '').toLowerCase();\n}\n\nexport function isPage(node: Route): boolean {\n return !!node.route_redirect && (node.route_type === 'page' || childrenOf(node).length === 0);\n}\n\nexport function isHome(node: Route): boolean {\n return templateOf(node) === HOME_TEMPLATE || (isPage(node) && node.route_path === 'home');\n}\n\nexport function modules(tree: readonly Route[]): readonly Route[] {\n return tree.filter((node) => node != null && !isHome(node));\n}\n\nexport function systemAreas(tree: readonly Route[]): readonly Route[] {\n return tree.filter((node) => node != null && isHome(node));\n}\n\nexport function destinations(tree: readonly Route[], trail: readonly string[] = []): readonly HomeDestination[] {\n const found: HomeDestination[] = [];\n const walk = (nodes: readonly Route[], path: readonly string[]) => {\n for (const node of nodes) {\n if (node == null) continue;\n if (isPage(node)) {\n found.push({ id: identityOf(node), label: labelOf(node), icon: node.route_icon ?? null, redirect: node.route_redirect!, trail: path });\n }\n const kids = childrenOf(node);\n if (kids.length) walk(kids, [...path, labelOf(node)]);\n }\n };\n walk(tree, trail);\n return found;\n}\n\nexport function trailFor(tree: readonly Route[], redirect: string): readonly string[] | null {\n return destinations(tree).find((d) => d.redirect === redirect)?.trail ?? null;\n}\n\nfunction isPrivileged(node: Route): boolean {\n return ADMIN_TEMPLATES.has(templateOf(node)) || childrenOf(node).some(isPrivileged);\n}\n\ninterface Candidate {\n readonly node: Route;\n readonly trail: readonly string[];\n readonly privileged: boolean;\n}\n\nfunction navigableChildren(node: Route): Route[] {\n return childrenOf(node).filter((child) => isPage(child) || destinations([child]).length > 0);\n}\n\n/** Replaces each candidate by its navigable children; `null` when nobody has any. */\nfunction descend(level: readonly Candidate[]): Candidate[] | null {\n let changed = false;\n const next = level.flatMap((item) => {\n const kids = navigableChildren(item.node);\n if (!kids.length) return [item];\n changed = true;\n const trail = [...item.trail, labelOf(item.node)];\n return kids.map((node) => ({ node, trail, privileged: item.privileged }));\n });\n return changed ? next : null;\n}\n\nfunction toShortcut({ node, trail, privileged }: Candidate): HomeShortcut {\n const below = destinations([node]);\n return {\n id: identityOf(node),\n label: labelOf(node),\n icon: node.route_icon ?? null,\n redirect: node.route_redirect || below[0]?.redirect || '',\n trail,\n screens: below.length - (isPage(node) ? 1 : 0),\n privileged,\n };\n}\n\n/**\n * Picks the shallowest level of the tree where there is a real choice to make: a single item is\n * skipped over, a pair is opened up while the result still fits the grid, three or more stay put.\n */\nexport function entryShortcuts(tree: readonly Route[]): readonly HomeShortcut[] {\n let level: readonly Candidate[] = modules(tree).map((node) => ({ node, trail: [], privileged: isPrivileged(node) }));\n while (level.length > 0 && level.length < 3) {\n const next = descend(level);\n if (!next) break;\n if (level.length === 2 && next.length > MAX_TILES) break;\n level = next;\n }\n return level.map(toShortcut);\n}\n","import { ChangeDetectionStrategy, Component, Injectable, computed, effect, inject } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { ViewService } from '@orfeu/angular/core';\nimport {\n DataGridCellDirective,\n DataGridColumn,\n DataGridComponent,\n IconButtonComponent,\n IconComponent,\n StatePageComponent,\n} from '@trismegisto/angular';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { QuickAccessItem, Route, SPINE_MESSAGES, SpineQuickAccessService, spineRoutesOf } from '@trismegisto/spine';\nimport { SpineDocsService, SpineSettingsService } from '@trismegisto/spine/layout';\nimport { map } from 'rxjs';\nimport { HomeShortcut, destinations, entryShortcuts, modules, systemAreas, trailFor } from './home-shortcuts';\n\n/** Remembers, for the whole app load, that the home screen already jumped to the only screen. */\n@Injectable({ providedIn: 'root' })\nexport class HomeAutoRedirect {\n done = false;\n}\n\ninterface RecentRow extends QuickAccessItem {\n readonly where: string;\n}\n\nconst TRAIL_SEPARATOR = ' › ';\nconst RECENT_ROWS = 4;\n\nlet instances = 0;\n\nfunction cleanTree(view: Parameters<typeof spineRoutesOf>[0]): Route[] {\n return spineRoutesOf(view).filter((node): node is Route => node != null);\n}\n\n@Component({\n selector: 'home',\n imports: [NgTemplateOutlet, DataGridComponent, DataGridCellDirective, IconButtonComponent, IconComponent, StatePageComponent],\n templateUrl: './home.component.html',\n styleUrl: './home.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HomeComponent {\n private readonly router = inject(Router);\n private readonly quickAccess = inject(SpineQuickAccessService);\n private readonly docs = inject(SpineDocsService);\n private readonly settings = inject(SpineSettingsService);\n private readonly autoRedirect = inject(HomeAutoRedirect);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly t = this.messages.home;\n protected readonly uid = `home-${++instances}`;\n\n private readonly view = inject(ViewService);\n private readonly tree = toSignal(this.view.currentView$.pipe(map(cleanTree)), {\n initialValue: cleanTree(this.view.currentView),\n });\n\n private readonly workDestinations = computed(() => destinations(modules(this.tree())));\n protected readonly noAccess = computed(() => this.tree().length > 0 && modules(this.tree()).length === 0);\n protected readonly areas = computed(() => systemAreas(this.tree()));\n\n private readonly shortcuts = computed(() => entryShortcuts(this.tree()));\n protected readonly workTiles = computed(() => this.shortcuts().filter((s) => !s.privileged));\n protected readonly adminTiles = computed(() => this.shortcuts().filter((s) => s.privileged));\n protected readonly descended = computed(() => this.shortcuts().some((s) => s.trail.length > 0));\n protected readonly sideBySide = computed(() => this.shortcuts().length <= 2);\n\n /** Every tile already opens a final screen, so recents/favorites would not save a single click. */\n private readonly everythingInView = computed(() => {\n const list = this.shortcuts();\n return list.length > 0 && list.every((s) => s.screens === 0);\n });\n\n protected readonly favorites = computed(() => (this.everythingInView() ? [] : this.quickAccess.favorites()));\n protected readonly recentRows = computed<readonly RecentRow[]>(() => {\n if (this.everythingInView()) return [];\n return this.quickAccess\n .recents()\n .slice(0, RECENT_ROWS)\n .map((item) => ({ ...item, where: this.whereOf(item) }));\n });\n\n protected readonly recentColumns: readonly DataGridColumn<RecentRow>[] = [\n { key: 'displayName', title: this.t.colScreen, value: (row) => row.displayName },\n { key: 'where', title: this.t.colWhere, value: (row) => row.where },\n {\n key: 'favorite',\n title: this.t.colFavorite,\n value: () => '',\n filterable: false,\n sortable: false,\n searchable: false,\n initialWidth: '5.5rem',\n },\n ];\n protected readonly rowId = (row: RecentRow) => row.id;\n\n constructor() {\n effect(() => {\n const only = this.workDestinations();\n if (only.length !== 1 || this.autoRedirect.done) return;\n this.autoRedirect.done = true;\n void this.router.navigateByUrl(only[0].redirect, { replaceUrl: true });\n });\n }\n\n protected caption(tile: HomeShortcut): string {\n if (tile.screens > 0) return pluralMessage(this.t.screenCount, tile.screens, this.messages.meta.locale);\n return tile.trail.join(TRAIL_SEPARATOR);\n }\n\n protected whereOf(item: QuickAccessItem): string {\n const trail = item.trail ?? trailFor(this.tree(), item.redirect);\n return trail?.join(TRAIL_SEPARATOR) || this.t.noModule;\n }\n\n protected row(value: unknown): RecentRow {\n return value as RecentRow;\n }\n\n protected isFavorite(id: string): boolean {\n return this.quickAccess.isFavorite(id);\n }\n\n protected favoriteLabel(row: RecentRow): string {\n const template = this.isFavorite(row.id) ? this.t.unfavorite : this.t.favorite;\n return formatMessage(template, { name: row.displayName });\n }\n\n protected toggleFavorite(row: RecentRow): void {\n this.quickAccess.toggleFavorite({\n id: row.id,\n icon: row.icon,\n displayName: row.displayName,\n redirect: row.redirect,\n trail: row.trail ?? trailFor(this.tree(), row.redirect) ?? [],\n });\n }\n\n protected go(redirect: string | null | undefined): void {\n if (redirect) void this.router.navigateByUrl(redirect);\n }\n\n protected openSettings(): void {\n this.settings.open();\n }\n\n protected openDocs(): void {\n this.docs.openIndex();\n }\n}\n","@if (noAccess()) {\n <hm-state-page kind=\"no-rights\" [heading]=\"t.noAccessTitle\" [description]=\"t.noAccessText\" action=\"\" />\n} @else {\n <div class=\"hub\" [class.hub--columns]=\"sideBySide()\">\n @if (workTiles().length) {\n <section class=\"block\" [attr.aria-labelledby]=\"uid + '-work'\">\n <h2 class=\"block__title\" [id]=\"uid + '-work'\">{{ descended() ? t.yourScreens : t.modules }}</h2>\n <ng-container *ngTemplateOutlet=\"tileGrid; context: { $implicit: workTiles(), admin: false }\" />\n </section>\n }\n\n @if (adminTiles().length) {\n <section class=\"block\" [attr.aria-labelledby]=\"uid + '-admin'\">\n <h2 class=\"block__title\" [id]=\"uid + '-admin'\">{{ t.privileged }}</h2>\n <ng-container *ngTemplateOutlet=\"tileGrid; context: { $implicit: adminTiles(), admin: true }\" />\n </section>\n }\n\n @if (recentRows().length) {\n <section class=\"block\" [attr.aria-labelledby]=\"uid + '-recent'\">\n <h2 class=\"block__title\" [id]=\"uid + '-recent'\">{{ t.recent }}</h2>\n <hm-data-grid\n [caption]=\"t.recentCaption\"\n [columns]=\"recentColumns\"\n [rows]=\"recentRows()\"\n [rowId]=\"rowId\"\n [filterable]=\"false\"\n [paginated]=\"false\"\n >\n <ng-template hmCell=\"displayName\" let-value>\n @let item = row(value);\n <button type=\"button\" class=\"link\" (click)=\"go(item.redirect)\">\n <hm-icon [shape]=\"item.icon || 'grid-layout'\" size=\"sm\" />\n <span>{{ item.displayName }}</span>\n </button>\n </ng-template>\n <ng-template hmCell=\"favorite\" let-value>\n @let item = row(value);\n <hm-icon-button\n emphasis=\"subtle\"\n icon=\"heart\"\n [solid]=\"isFavorite(item.id)\"\n [class.heart--on]=\"isFavorite(item.id)\"\n [label]=\"favoriteLabel(item)\"\n (clicked)=\"toggleFavorite(item)\"\n />\n </ng-template>\n </hm-data-grid>\n </section>\n }\n\n @if (favorites().length) {\n <section class=\"block\" [attr.aria-labelledby]=\"uid + '-fav'\">\n <h2 class=\"block__title\" [id]=\"uid + '-fav'\">{{ t.favorites }}</h2>\n <ul class=\"chips\">\n @for (fav of favorites(); track fav.id) {\n <li>\n <button type=\"button\" class=\"chip\" [title]=\"whereOf(fav)\" (click)=\"go(fav.redirect)\">\n <hm-icon [shape]=\"fav.icon || 'grid-layout'\" size=\"sm\" />\n <span>{{ fav.displayName }}</span>\n </button>\n </li>\n }\n </ul>\n </section>\n }\n\n <section class=\"block\" [attr.aria-labelledby]=\"uid + '-nav'\">\n <h2 class=\"block__title\" [id]=\"uid + '-nav'\">{{ t.navigate }}</h2>\n <ul class=\"chips\">\n @for (area of areas(); track area.routed_id) {\n <li>\n <button type=\"button\" class=\"chip\" (click)=\"go(area.route_redirect)\">\n <hm-icon [shape]=\"area.route_icon || 'home'\" size=\"sm\" />\n <span>{{ area.route_display_name }}</span>\n </button>\n </li>\n }\n <li>\n <button type=\"button\" class=\"chip\" (click)=\"openSettings()\">\n <hm-icon shape=\"cog\" size=\"sm\" />\n <span>{{ t.settings }}</span>\n </button>\n </li>\n </ul>\n </section>\n\n <section class=\"block\" [attr.aria-labelledby]=\"uid + '-tools'\">\n <h2 class=\"block__title\" [id]=\"uid + '-tools'\">{{ t.tools }}</h2>\n <ul class=\"chips\">\n <li>\n <button type=\"button\" class=\"chip\" (click)=\"openDocs()\">\n <hm-icon shape=\"doc-list\" size=\"sm\" />\n <span>{{ t.systemDocs }}</span>\n </button>\n </li>\n </ul>\n </section>\n </div>\n}\n\n<ng-template #tileGrid let-tiles let-admin=\"admin\">\n <ul class=\"tiles\" [class.tiles--admin]=\"admin\">\n @for (tile of tiles; track tile.id; let i = $index) {\n <li class=\"tiles__cell\" [style.--tile-order]=\"i\">\n <button type=\"button\" class=\"tile\" (click)=\"go(tile.redirect)\">\n <hm-icon class=\"tile__icon\" [shape]=\"tile.icon ?? 'grid-layout'\" size=\"lg\" />\n <span class=\"tile__text\">\n <span class=\"tile__label\">{{ tile.label }}</span>\n @if (caption(tile); as meta) {\n <span class=\"tile__meta\">{{ meta }}</span>\n }\n </span>\n </button>\n </li>\n }\n </ul>\n</ng-template>\n"],"names":[],"mappings":"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"}
|