feat(categories): implement professional category management experience

Categories dashboard (real total/visible/hidden/empty/root/subcategory/missing-image/missing-SEO/last-modified/completion% stats, recommended next action); tree view is now a real expand/collapse hierarchy (state persisted via LocalStorageService) with keyboard navigation (arrow keys, jump-to-parent), search that force-expands and keeps only matching branches + their ancestors/descendants instead of silently dropping deep matches; added Table/Cards views alongside the tree with density and saved column visibility; real bulk actions (show/hide/delete/assign parent/assign image via the Media Library picker/duplicate via the existing createCategory call/CSV export) plus the pre-existing single-item actions; reusable CategoryHealthWidget (image/SEO/description/valid-parent/visibility/products-assigned + completion%); editor reorganized into General/Media/SEO/Visibility/Navigation/Attributes/Advanced tabs, media now uses the shared ImageFieldComponent, SEO explains fields in plain language with a live preview, Navigation tab shows real breadcrumb/children/visibility-based nav status, Attributes uses the shared KeyValueEditorComponent. Filled in the adminCategories i18n namespace (previously only 2 of ~90 referenced keys existed) across en/ru/hy. Also fixed the pre-existing bug where a filtered/searched category list could silently drop a matched descendant whose ancestor's title didn't match, by loading the full catalog once and filtering client-side.
This commit is contained in:
sdarbinyan
2026-07-18 17:04:11 +04:00
parent aeb48504c5
commit ac615837ab
22 changed files with 1433 additions and 117 deletions

View File

@@ -1216,6 +1216,84 @@ export const hy: Translations = {
adminCategories: {
chooseImage: 'Ընտրել պատկեր',
replaceImage: 'Փոխարինել պատկերը',
search: 'Փնտրել կատեգորիաներ…',
showDeleted: 'Ցույց տալ ջնջվածները',
create: 'Ստեղծել կատեգորիա',
edit: 'Խմբագրել կատեգորիան',
title: 'Անուն',
slug: 'URL հասցե',
slugTaken: 'Այս հասցեն արդեն օգտագործվում է այլ կատեգորիայի կողմից։',
parent: 'Ծնող կատեգորիա',
noParent: 'Առանց ծնողի (վերին մակարդակ)',
icon: 'Պատկերակ',
image: 'Պատկեր',
imageHint: 'Ցուցադրվում է կատեգորիաների ցանկերում և նավիգացիայում։',
description: 'Նկարագրություն',
items: 'ապրանք',
status: { draft: 'Սևագիր', published: 'Հրապարակված' },
restore: 'Վերականգնել',
saveDraft: 'Պահպանել սևագիրը',
publish: 'Հրապարակել',
confirmDelete: 'Ջնջե՞լ այս կատեգորիան։ Հնարավոր չէ հետարկել։',
confirmLeaveUnsaved: 'Դուք ունեք չպահպանված փոփոխություններ։ Դո՞ւրս գալ առանց պահպանելու։',
deleteBlocked: 'Այս կատեգորիան հնարավոր չէ ջնջել, քանի դեռ ունի ենթակատեգորիաներ կամ նշանակված ապրանքներ։',
emptyTitle: 'Կատեգորիաներ դեռ չկան',
emptyDescription: 'Ստեղծեք առաջին կատեգորիան՝ ապրանքները կազմակերպելու համար։',
emptyGuide: 'Կատեգորիաները օգնում են հաճախորդներին գտնել ապրանքներ։ Սկսեք մի քանի լայն վերին մակարդակի կատեգորիաներից (օր․՝ Հագուստ, Էլեկտրոնիկա), ապա ավելացրեք ենթակատեգորիաներ՝ կատալոգի աճին զուգահեռ․ խուսափեք 2-3 մակարդակից ավելի խորությունից։',
viewTree: 'Ծառ',
viewCards: 'Քարտեր',
expandAll: 'Ընդարձակել բոլորը',
collapseAll: 'Ծալել բոլորը',
expandNode: 'Ընդարձակել',
collapseNode: 'Ծալել',
jumpToParent: 'Անցնել ծնողին',
deletedBadge: 'Ջնջված',
column_slug: 'Հասցե',
column_items: 'Ապրանքներ',
column_status: 'Կարգավիճակ',
column_visibility: 'Տեսանելիություն',
column_updated: 'Վերջին փոփոխություն',
bulkAssignParent: 'Նշանակել ծնող',
bulkAssignImage: 'Նշանակել պատկեր',
groupGeneral: 'Հիմնական',
groupMedia: 'Մեդիա',
groupSeo: 'SEO',
groupVisibility: 'Տեսանելիություն',
groupNavigation: 'Նավիգացիա',
groupAttributes: 'Հատկանիշներ',
groupAdvanced: 'Լրացուցիչ',
visibilityExplain: 'Թաքցված կատեգորիան և դրա ապրանքները չեն երևում խանութի նավիգացիայում և որոնման մեջ, մինչև այն նորից տեսանելի դարձնեք։',
navBreadcrumb: 'Ուղենիշ',
navRoot: 'Սա վերին մակարդակի կատեգորիա է։',
navChildren: 'Ենթակատեգորիաներ',
navNoChildren: 'Ենթակատեգորիաներ դեռ չկան։',
navAppearsIn: 'Որտեղ է երևում',
navAppearsVisible: 'Տեսանելի է կատալոգի նավիգացիայում և որոնման մեջ։',
navAppearsHidden: 'Թաքցված է․ չի երևում կատալոգի նավիգացիայում, քանի դեռ թաքցված է։',
itemsCountLabel: 'Նշանակված ապրանքներ',
createdAtLabel: 'Ստեղծված է',
healthImage: 'Պատկեր',
healthSeo: 'SEO',
healthDescription: 'Նկարագրություն',
healthParent: 'Ծնող',
healthVisibility: 'Տեսանելիություն',
healthProducts: 'Նշանակված ապրանքներ',
totalCategories: 'Ընդհանուր կատեգորիաներ',
visibleCount: 'Տեսանելի',
hiddenCount: 'Թաքցված',
emptyCount: 'Դատարկ',
rootCount: 'Արմատային կատեգորիաներ',
subCount: 'Ենթակատեգորիաներ',
missingImagesCount: 'Առանց պատկերի',
missingSeoCount: 'Առանց SEO-ի',
lastModified: 'Վերջին փոփոխություն',
lastModifiedNever: 'Երբեք',
completionLabel: 'Ավարտվածություն',
recommendedNext: 'Հաջորդ առաջարկվող քայլը',
recommendAddImage: 'Կատեգորիան պատկեր չունի․ ավելացրեք մեկը՝ վստահելիության համար։',
recommendAddSeo: 'Կատեգորիան չունի որոնման վերնագիր կամ նկարագրություն․ ավելացրեք դրանք։',
recommendFillEmpty: 'Կատեգորիան ապրանքներ չունի․ ավելացրեք ապրանքներ կամ թաքցրեք այն։',
recommendNone: 'Հիանալի է․ կատեգորիաների կառուցվածքը լավ վիճակում է։',
},
adminProducts: {
emptyTitle: 'Ապրանքներ չեն գտնվել',