fix(admin): polish products

Add accessible names to the table-view select-all and per-row
checkboxes — they had none, while the grid-view equivalent already
did (product name via aria-label). New adminProducts.selectAllRows/
selectRow keys added across en/ru/hy.

Reviewed toolbar, filters, bulk actions, empty/loading states, and
grid view: all buttons already route through app-button (own
:focus-visible), empty state already uses shared EmptyStateComponent.
No orphaned bindings or corrupted glyphs found.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
sdarbinyan
2026-07-19 23:55:11 +04:00
parent d70e5d6bdc
commit 8956cd00d7
5 changed files with 10 additions and 2 deletions

View File

@@ -88,7 +88,7 @@
<app-table [class.density-compact]="density === 'compact'">
<thead>
<tr>
<th><input type="checkbox" (change)="selectAll.emit($any($event.target).checked)" /></th>
<th><input type="checkbox" [attr.aria-label]="'adminProducts.selectAllRows' | translate" (change)="selectAll.emit($any($event.target).checked)" /></th>
<th>{{ 'adminProducts.name' | translate }}</th>
@if (isColumnVisible('sku')) { <th>{{ 'backoffice.sku' | translate }}</th> }
@if (isColumnVisible('brand')) { <th>{{ 'adminProducts.brand' | translate }}</th> }
@@ -102,7 +102,7 @@
<tbody>
@for (product of products; track product.id) {
<tr>
<td><input type="checkbox" [checked]="isSelected(product.id)" (change)="selectionChange.emit({ id: product.id, checked: $any($event.target).checked })" /></td>
<td><input type="checkbox" [checked]="isSelected(product.id)" [attr.aria-label]="('adminProducts.selectRow' | translate) + ': ' + product.name" (change)="selectionChange.emit({ id: product.id, checked: $any($event.target).checked })" /></td>
<td>{{ product.name }}</td>
@if (isColumnVisible('sku')) { <td>{{ product.sku }}</td> }
@if (isColumnVisible('brand')) { <td>{{ product.brand }}</td> }

View File

@@ -1531,6 +1531,8 @@ export const en: Translations = {
emptyTitle: 'No products found',
emptyDescription: 'Try adjusting your filters, or create a new product.',
emptyGuide: 'Good products have a clear title, at least one photo, a price, and a short description — that\'s enough to publish. You can always add more detail later.',
selectAllRows: 'Select all products',
selectRow: 'Select product',
search: 'Search products…',
category: 'Category',
allCategories: 'All categories',

View File

@@ -1526,6 +1526,8 @@ export const hy: Translations = {
emptyTitle: 'Ապրանքներ չեն գտնվել',
emptyDescription: 'Փոխեք ֆիլտրերը կամ ստեղծեք նոր ապրանք։',
emptyGuide: 'Լավ ապրանքին բավական է հստակ վերնագիր, առնվազն մեկ լուսանկար, գին և կարճ նկարագրություն՝ հրապարակելու համար։ Մնացածը կարող եք ավելացնել հետո։',
selectAllRows: 'Ընտրել բոլոր ապրանքները',
selectRow: 'Ընտրել ապրանքը',
search: 'Փնտրել ապրանքներ…',
category: 'Կատեգորիա',
allCategories: 'Բոլոր կատեգորիաները',

View File

@@ -1526,6 +1526,8 @@ export const ru: Translations = {
emptyTitle: 'Товары не найдены',
emptyDescription: 'Измените фильтры или создайте новый товар.',
emptyGuide: 'Хорошему товару нужны понятное название, минимум одно фото, цена и короткое описание — этого достаточно для публикации. Остальное можно добавить позже.',
selectAllRows: 'Выбрать все товары',
selectRow: 'Выбрать товар',
search: 'Поиск товаров…',
category: 'Категория',
allCategories: 'Все категории',

View File

@@ -1539,6 +1539,8 @@ export interface Translations {
emptyTitle: string;
emptyDescription: string;
emptyGuide: string;
selectAllRows: string;
selectRow: string;
search: string;
category: string;
allCategories: string;