Files
marketplaces/src/app/features/admin/users/pages/admin-users-page.component.ts
sdarbinyan b909a195f7 fix(backoffice): wording quality pass across orders, moderation, transactions, users, customers
- Replaced hardcoded English audit/timeline text (order status changes,
  review moderation events, user role/status changes) with proper
  adminXxx.timelineEvent.*/adminUsers.audit.* i18n keys, so Recent
  Activity/Timeline/Audit panels no longer mix English into ru/hy UI.
- Translated raw internal codes rendered directly to users: transaction
  payment method ('card'/'qr'/'cash_on_delivery' -> adminTransactions.methodValue.*)
  and user roles/permissions ('products.manage' etc -> adminUsers.roleValue.*/
  adminUsers.permission.*), replacing developer-facing enum leakage with
  real copy.
- Fixed wrong-noun list-footer counts: Orders/Transactions/Moderation
  list pages all reused adminProducts.items ("N товаров"/"N products")
  regardless of what was actually listed; each now has its own itemsCount
  key ("N заказов", "N транзакций", "N отзывов").
- Fixed customer detail page's "Back" button reusing adminOrders.back
  ("Back to orders") instead of a customers-specific label.
- Added translation keys to en/ru/hy + translations.ts interface for all
  of the above.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-25 21:20:37 +04:00

76 lines
3.3 KiB
TypeScript

import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { AdminUsersFacade } from '../facade/admin-users.facade';
import { AdminUserScope, AdminUserStatus } from '../models/admin-user.model';
import { TranslatePipe } from '../../../../i18n/translate.pipe';
import { TranslateService } from '../../../../i18n/translate.service';
import { ButtonComponent } from '../../../../shared/ui/button/button.component';
import { InputComponent } from '../../../../shared/ui/input/input.component';
import { BadgeComponent } from '../../../../shared/ui/badge/badge.component';
import { TableComponent } from '../../../../shared/ui/table/table.component';
import { DialogComponent } from '../../../../shared/ui/dialog/dialog.component';
import { SkeletonComponent } from '../../../../shared/ui/skeleton/skeleton.component';
import { EmptyStateComponent } from '../../../../shared/ui/empty-state/empty-state.component';
@Component({
selector: 'app-admin-users-page',
standalone: true,
imports: [CommonModule, FormsModule, TranslatePipe, ButtonComponent, InputComponent, BadgeComponent, TableComponent, DialogComponent, SkeletonComponent, EmptyStateComponent],
templateUrl: './admin-users-page.component.html',
styleUrls: ['./admin-users-page.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AdminUsersPageComponent {
readonly facade = inject(AdminUsersFacade);
private readonly translate = inject(TranslateService);
readonly inviteEmail = signal('');
readonly inviteRoleId = signal('viewer');
readonly inviteScope = signal<AdminUserScope>('office');
constructor() {
this.facade.loadAll();
}
sendInvite(): void {
this.facade.invite(this.inviteEmail(), this.inviteRoleId(), this.inviteScope());
this.inviteEmail.set('');
}
toggleStatus(userId: string, current: AdminUserStatus): void {
const next: AdminUserStatus = current === 'suspended' ? 'active' : 'suspended';
if (next === 'suspended' && !window.confirm(this.translate.t('adminUsers.confirmSuspend'))) {
return;
}
this.facade.setStatus(userId, next);
}
private static readonly PERMISSION_KEYS: Record<string, string> = {
'*': 'all',
'products.manage': 'productsManage',
'products.view': 'productsView',
'categories.manage': 'categoriesManage',
'orders.manage': 'ordersManage',
'orders.view': 'ordersView',
'media.manage': 'mediaManage',
};
readonly roleLabel = (roleId: string): string => this.translate.t('adminUsers.roleValue.' + roleId);
readonly permissionLabel = (code: string): string => {
const key = AdminUsersPageComponent.PERMISSION_KEYS[code];
return key ? this.translate.t('adminUsers.permission.' + key) : code;
};
auditText(entry: { eventKey: 'roleChanged' | 'statusChanged'; roleId?: string; status?: AdminUserStatus }): string {
if (entry.eventKey === 'roleChanged' && entry.roleId) {
return this.translate.t('adminUsers.audit.roleChanged', { role: this.roleLabel(entry.roleId) });
}
if (entry.eventKey === 'statusChanged' && entry.status) {
return this.translate.t('adminUsers.audit.statusChanged', { status: this.translate.t('adminUsers.statusValue.' + entry.status) });
}
return '';
}
}