diff --git a/package.json b/package.json index 8cdcbe1..18e31bf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vite-react-typescript-starter", "private": true, - "version": "1.1.4", + "version": "1.1.5", "type": "module", "scripts": { "dev": "vite", diff --git a/src/components/ArticleForm.tsx b/src/components/ArticleForm.tsx index 93d60ee..d24b9e8 100644 --- a/src/components/ArticleForm.tsx +++ b/src/components/ArticleForm.tsx @@ -54,6 +54,7 @@ interface ArticleFormProps { authors: Author[]; availableCategoryIds: number[]; availableCityIds: number[]; + onAfterSave?: () => void; // Новый пропс для колбэка после сохранения } export function ArticleForm({ @@ -66,6 +67,7 @@ export function ArticleForm({ authors, availableCategoryIds, availableCityIds, + onAfterSave, }: ArticleFormProps) { const { user } = useAuthStore(); const isAdmin = user?.permissions.isAdmin || false; @@ -278,6 +280,11 @@ export function ArticleForm({ try { setIsSubmitting(true); await onSubmit(articleData, closeForm); + + // Вызываем колбэк после успешного сохранения + if (closeForm && onAfterSave) { + onAfterSave(); + } } catch (error) { console.error('Ошибка при сохранении статьи:', error); setError('Не удалось сохранить статью. Пожалуйста, попробуйте снова.'); diff --git a/src/components/ArticleList.tsx b/src/components/ArticleList.tsx index d6fc4b2..e194d23 100644 --- a/src/components/ArticleList.tsx +++ b/src/components/ArticleList.tsx @@ -17,6 +17,7 @@ interface ArticleListProps { onShowGallery: (id: string) => void; onNewArticle: () => void; refreshTrigger: number; + scrollToTop?: () => void; // Добавляем новый пропс } const ARTICLES_PER_PAGE = 6; @@ -29,6 +30,7 @@ export const ArticleList = React.memo(function ArticleList({ onShowGallery, onNewArticle, refreshTrigger, + scrollToTop, }: ArticleListProps) { const { user } = useAuthStore(); const { availableCategoryIds, availableCityIds, isAdmin } = usePermissions(); @@ -144,6 +146,12 @@ export const ArticleList = React.memo(function ArticleList({ setSearchParams(newParams); }; + // Обработчик редактирования статьи + const handleEditClick = (articleId: string) => { + onEdit(articleId); + scrollToTop?.(); + }; + const hasNoPermissions = availableCategoryIds.length === 0 || availableCityIds.length === 0; return ( @@ -269,8 +277,8 @@ export const ArticleList = React.memo(function ArticleList({ > {article.isActive ? : } - onEdit(article.id)} + handleEditClick(article.id)} className="p-2 text-gray-400 hover:text-blue-600 rounded-full hover:bg-blue-50" > diff --git a/src/pages/AdminPage.tsx b/src/pages/AdminPage.tsx index 3d6a8ee..07a5923 100644 --- a/src/pages/AdminPage.tsx +++ b/src/pages/AdminPage.tsx @@ -1,4 +1,4 @@ -import {useState, useEffect, useCallback } from 'react'; +import { useState, useEffect, useCallback } from 'react'; import axios from 'axios'; import { Header } from '../components/Header'; import { ArticleList } from '../components/ArticleList'; @@ -204,6 +204,11 @@ export function AdminPage() { setShowForm(true); }; + // Функция для скроллинга к списку статей + const scrollToArticlesList = () => { + window.scrollTo({ top: 0, behavior: 'smooth' }); + }; + return ( @@ -248,6 +253,7 @@ export function AdminPage() { onShowGallery={(id) => setShowGalleryModal(id)} onNewArticle={handleNewArticle} refreshTrigger={refreshArticles} + scrollToTop={scrollToArticlesList} // Передаем функцию скроллинга /> )} {(viewMode === 'create' || viewMode === 'edit') && showForm && ( @@ -261,6 +267,7 @@ export function AdminPage() { authors={authors} availableCategoryIds={availableCategoryIds} availableCityIds={availableCityIds} + onAfterSave={scrollToArticlesList} // Передаем функцию скроллинга напрямую /> )} {showGalleryModal && (