feat: Page Editor UX Phase 2 - unsaved changes panel, property search, reset property, empty states
Some checks failed
Architecture Governance / architecture (push) Has been cancelled

- ProjectEditorFacade.resetField(key): field-level revert-to-original, reusing getByPath + a new immutable setByPath (write-side counterpart, scalar/object dot-paths only).
- app-form-field gains showReset/resetLabel/(resetClicked) - a reusable per-field reset affordance, wired on branding logo/title and theme primary/background color.
- Save bar: unsaved-changes count is now clickable, expanding a field-level diff list (reuses facade.changeSummary(), already built for the Preview tab) with jump-to-section links.
- BuilderPropertySearchComponent: filters EditorSchemaService.all() by translated label/hint, jumps to the owning section - no new registry, reuses the existing schema.
- navigation-section: app-empty-state (existing component) added for empty header/footer link lists.
- Reset Section and Draft/Published badge were already implemented; not touched.
- New copy added as translation keys (en/ru/hy).
This commit is contained in:
sdarbinyan
2026-07-27 11:12:35 +04:00
parent 42f11dd8c0
commit 65c6d6f5d1
23 changed files with 432 additions and 9 deletions

View File

@@ -880,6 +880,16 @@ export const en: Translations = {
usedByLinks: 'Links',
usedByBadges: 'Badges',
usedByPageBackground: 'Page background',
resetField: 'Reset',
propertySearchLabel: 'Search settings',
propertySearchPlaceholder: 'Search settings…',
propertySearchResultsLabel: 'Search results',
propertySearchNoResults: 'No matching settings.',
unsavedChangesPanelTitle: 'Unsaved changes',
navigationHeaderEmptyTitle: 'No header links yet',
navigationHeaderEmptyDesc: 'Add a link so customers can navigate from the header.',
navigationFooterEmptyTitle: 'No footer links yet',
navigationFooterEmptyDesc: 'Add a link so customers can navigate from the footer.',
addBlockHint: 'Add a block to your homepage:',
dragToReorder: 'Drag to reorder',
blockRemoveConfirm: 'Remove this block from the homepage?',

View File

@@ -880,6 +880,16 @@ export const hy: Translations = {
usedByLinks: 'Հղումներ',
usedByBadges: 'Կրծքանշաններ',
usedByPageBackground: 'Էջի ֆոն',
resetField: 'Վերականգնել',
propertySearchLabel: 'Որոնել կարգավորումներ',
propertySearchPlaceholder: 'Որոնել կարգավորումներ…',
propertySearchResultsLabel: 'Որոնման արդյունքներ',
propertySearchNoResults: 'Համընկնումներ չեն գտնվել։',
unsavedChangesPanelTitle: 'Չպահպանված փոփոխություններ',
navigationHeaderEmptyTitle: 'Վերնագրում հղումներ դեռ չկան',
navigationHeaderEmptyDesc: 'Ավելացրեք հղում, որպեսզի գնորդները կարողանան նավարկել վերնագրից։',
navigationFooterEmptyTitle: 'Ստորագրում հղումներ դեռ չկան',
navigationFooterEmptyDesc: 'Ավելացրեք հղում, որպեսզի գնորդները կարողանան նավարկել ստորագրից։',
addBlockHint: 'Ավելացնել բլոկ գլխավոր էջում.',
dragToReorder: 'Քաշեք՝ կարգը փոխելու համար',
blockRemoveConfirm: 'Հեռացնե՞լ այս բլոկը գլխավոր էջից։',

View File

@@ -880,6 +880,16 @@ export const ru: Translations = {
usedByLinks: 'Ссылки',
usedByBadges: 'Значки',
usedByPageBackground: 'Фон страницы',
resetField: 'Сбросить',
propertySearchLabel: 'Поиск настроек',
propertySearchPlaceholder: 'Поиск настроек…',
propertySearchResultsLabel: 'Результаты поиска',
propertySearchNoResults: 'Совпадений не найдено.',
unsavedChangesPanelTitle: 'Несохранённые изменения',
navigationHeaderEmptyTitle: 'В шапке пока нет ссылок',
navigationHeaderEmptyDesc: 'Добавьте ссылку, чтобы покупатели могли перемещаться из шапки сайта.',
navigationFooterEmptyTitle: 'В подвале пока нет ссылок',
navigationFooterEmptyDesc: 'Добавьте ссылку, чтобы покупатели могли перемещаться из подвала сайта.',
addBlockHint: 'Добавить блок на главную страницу:',
dragToReorder: 'Перетащите, чтобы изменить порядок',
blockRemoveConfirm: 'Удалить этот блок с главной страницы?',

View File

@@ -881,6 +881,16 @@ export interface Translations {
usedByLinks: string;
usedByBadges: string;
usedByPageBackground: string;
resetField: string;
propertySearchLabel: string;
propertySearchPlaceholder: string;
propertySearchResultsLabel: string;
propertySearchNoResults: string;
unsavedChangesPanelTitle: string;
navigationHeaderEmptyTitle: string;
navigationHeaderEmptyDesc: string;
navigationFooterEmptyTitle: string;
navigationFooterEmptyDesc: string;
blockRemoveConfirm: string;
blockHero: string;
blockHeroDesc: string;