Версия 1.1.5 Скроллинг вверх в списке статей после сохранения при редактировании.

This commit is contained in:
anibilag 2025-10-22 18:56:57 +03:00
parent 915b8274a6
commit d6b4bfdb2c
4 changed files with 26 additions and 4 deletions

View File

@ -1,7 +1,7 @@
{ {
"name": "vite-react-typescript-starter", "name": "vite-react-typescript-starter",
"private": true, "private": true,
"version": "1.1.4", "version": "1.1.5",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@ -54,6 +54,7 @@ interface ArticleFormProps {
authors: Author[]; authors: Author[];
availableCategoryIds: number[]; availableCategoryIds: number[];
availableCityIds: number[]; availableCityIds: number[];
onAfterSave?: () => void; // Новый пропс для колбэка после сохранения
} }
export function ArticleForm({ export function ArticleForm({
@ -66,6 +67,7 @@ export function ArticleForm({
authors, authors,
availableCategoryIds, availableCategoryIds,
availableCityIds, availableCityIds,
onAfterSave,
}: ArticleFormProps) { }: ArticleFormProps) {
const { user } = useAuthStore(); const { user } = useAuthStore();
const isAdmin = user?.permissions.isAdmin || false; const isAdmin = user?.permissions.isAdmin || false;
@ -278,6 +280,11 @@ export function ArticleForm({
try { try {
setIsSubmitting(true); setIsSubmitting(true);
await onSubmit(articleData, closeForm); await onSubmit(articleData, closeForm);
// Вызываем колбэк после успешного сохранения
if (closeForm && onAfterSave) {
onAfterSave();
}
} catch (error) { } catch (error) {
console.error('Ошибка при сохранении статьи:', error); console.error('Ошибка при сохранении статьи:', error);
setError('Не удалось сохранить статью. Пожалуйста, попробуйте снова.'); setError('Не удалось сохранить статью. Пожалуйста, попробуйте снова.');

View File

@ -17,6 +17,7 @@ interface ArticleListProps {
onShowGallery: (id: string) => void; onShowGallery: (id: string) => void;
onNewArticle: () => void; onNewArticle: () => void;
refreshTrigger: number; refreshTrigger: number;
scrollToTop?: () => void; // Добавляем новый пропс
} }
const ARTICLES_PER_PAGE = 6; const ARTICLES_PER_PAGE = 6;
@ -29,6 +30,7 @@ export const ArticleList = React.memo(function ArticleList({
onShowGallery, onShowGallery,
onNewArticle, onNewArticle,
refreshTrigger, refreshTrigger,
scrollToTop,
}: ArticleListProps) { }: ArticleListProps) {
const { user } = useAuthStore(); const { user } = useAuthStore();
const { availableCategoryIds, availableCityIds, isAdmin } = usePermissions(); const { availableCategoryIds, availableCityIds, isAdmin } = usePermissions();
@ -144,6 +146,12 @@ export const ArticleList = React.memo(function ArticleList({
setSearchParams(newParams); setSearchParams(newParams);
}; };
// Обработчик редактирования статьи
const handleEditClick = (articleId: string) => {
onEdit(articleId);
scrollToTop?.();
};
const hasNoPermissions = availableCategoryIds.length === 0 || availableCityIds.length === 0; const hasNoPermissions = availableCategoryIds.length === 0 || availableCityIds.length === 0;
return ( return (
@ -269,8 +277,8 @@ export const ArticleList = React.memo(function ArticleList({
> >
{article.isActive ? <ToggleRight size={18} /> : <ToggleLeft size={18} />} {article.isActive ? <ToggleRight size={18} /> : <ToggleLeft size={18} />}
</button> </button>
<button <button
onClick={() => onEdit(article.id)} onClick={() => handleEditClick(article.id)}
className="p-2 text-gray-400 hover:text-blue-600 rounded-full hover:bg-blue-50" className="p-2 text-gray-400 hover:text-blue-600 rounded-full hover:bg-blue-50"
> >
<Pencil size={18} /> <Pencil size={18} />

View File

@ -1,4 +1,4 @@
import {useState, useEffect, useCallback } from 'react'; import { useState, useEffect, useCallback } from 'react';
import axios from 'axios'; import axios from 'axios';
import { Header } from '../components/Header'; import { Header } from '../components/Header';
import { ArticleList } from '../components/ArticleList'; import { ArticleList } from '../components/ArticleList';
@ -204,6 +204,11 @@ export function AdminPage() {
setShowForm(true); setShowForm(true);
}; };
// Функция для скроллинга к списку статей
const scrollToArticlesList = () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
};
return ( return (
<div className="min-h-screen bg-gray-50"> <div className="min-h-screen bg-gray-50">
<Header /> <Header />
@ -248,6 +253,7 @@ export function AdminPage() {
onShowGallery={(id) => setShowGalleryModal(id)} onShowGallery={(id) => setShowGalleryModal(id)}
onNewArticle={handleNewArticle} onNewArticle={handleNewArticle}
refreshTrigger={refreshArticles} refreshTrigger={refreshArticles}
scrollToTop={scrollToArticlesList} // Передаем функцию скроллинга
/> />
)} )}
{(viewMode === 'create' || viewMode === 'edit') && showForm && ( {(viewMode === 'create' || viewMode === 'edit') && showForm && (
@ -261,6 +267,7 @@ export function AdminPage() {
authors={authors} authors={authors}
availableCategoryIds={availableCategoryIds} availableCategoryIds={availableCategoryIds}
availableCityIds={availableCityIds} availableCityIds={availableCityIds}
onAfterSave={scrollToArticlesList} // Передаем функцию скроллинга напрямую
/> />
)} )}
{showGalleryModal && ( {showGalleryModal && (