6.11.0: Фикс навигации и переключение типов задач
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m8s

This commit is contained in:
poignatov
2026-03-11 09:04:11 +03:00
parent dc50433eb1
commit ea1720506a
5 changed files with 245 additions and 229 deletions

View File

@@ -131,9 +131,6 @@ function AppContent() {
// Счётчик для сброса формы товара при каждом открытии
const [shoppingItemFormKey, setShoppingItemFormKey] = useState(0)
// Модальное окно выбора типа задачи
const [showAddModal, setShowAddModal] = useState(false)
// Ref для функции открытия модала добавления записи в CurrentWeek
const currentWeekAddModalRef = useRef(null)
@@ -334,9 +331,12 @@ function AppContent() {
if (savedTab && validTabs.includes(savedTab) && mainTabs.includes(savedTab)) {
setActiveTab(savedTab)
setLoadedTabs(prev => ({ ...prev, [savedTab]: true }))
// Сохраняем таб в history state для корректной работы кнопки "назад"
window.history.replaceState({ tab: savedTab }, '', window.location.href)
} else {
// Если нет сохранённого таба — активируем current по умолчанию
setLoadedTabs(prev => ({ ...prev, current: true }))
window.history.replaceState({ tab: 'current' }, '', window.location.href)
}
// Очищаем URL от параметров таба, если это основной таб
if (tabFromUrl && mainTabs.includes(tabFromUrl)) {
@@ -847,9 +847,9 @@ function AppContent() {
setSelectedProject(null)
clearUrl(event.state.tab)
} else {
// Если state пустой, используем сохраненный таб из localStorage
// Если state пустой, используем сохраненный таб из localStorage (только основные табы)
const savedTab = window.localStorage?.getItem('activeTab')
const validMainTab = savedTab && validTabs.includes(savedTab) ? savedTab : 'current'
const validMainTab = savedTab && mainTabs.includes(savedTab) ? savedTab : 'current'
setActiveTab(validMainTab)
setTabParams({})
markTabAsLoaded(validMainTab)
@@ -911,8 +911,8 @@ function AppContent() {
{
// Для task-form и wishlist-form явно удаляем параметры, только если нет никаких параметров
// task-form может иметь taskId (редактирование), wishlistId (создание из желания), returnTo (возврат после создания), или isTest (создание теста)
const isTaskFormWithNoParams = tab === 'task-form' && params.taskId === undefined && params.wishlistId === undefined && params.returnTo === undefined && params.isTest === undefined && params.isPurchase === undefined
// task-form может иметь taskId (редактирование), wishlistId (создание из желания), returnTo (возврат после создания)
const isTaskFormWithNoParams = tab === 'task-form' && params.taskId === undefined && params.wishlistId === undefined && params.returnTo === undefined
// Проверяем, что boardId не null и не undefined (null означает "нет доски", но это валидное значение)
const hasBoardId = params.boardId !== null && params.boardId !== undefined
const isWishlistFormWithNoParams = tab === 'wishlist-form' && params.wishlistId === undefined && params.newTaskId === undefined && !hasBoardId
@@ -1025,24 +1025,9 @@ function AppContent() {
}
}
// Обработчики для кнопки добавления задачи
// Обработчик для кнопки добавления задачи
const handleAddClick = () => {
setShowAddModal(true)
}
const handleAddTask = () => {
setShowAddModal(false)
handleNavigate('task-form', { taskId: undefined, isTest: false })
}
const handleAddTest = () => {
setShowAddModal(false)
handleNavigate('task-form', { taskId: undefined, isTest: true })
}
const handleAddPurchase = () => {
setShowAddModal(false)
handleNavigate('task-form', { taskId: undefined, isPurchase: true })
handleNavigate('task-form', { taskId: undefined })
}
// Обработчик навигации для компонентов
@@ -1308,13 +1293,11 @@ function AppContent() {
{loadedTabs['task-form'] && (
<div className={getTabContainerClasses('task-form')}>
<div className={getInnerContainerClasses('task-form')}>
<TaskForm
key={tabParams.taskId || `new-${tabParams.isTest ? 'test' : tabParams.isPurchase ? 'purchase' : 'task'}`}
<TaskForm
key={tabParams.taskId || 'new-task'}
onNavigate={handleNavigate}
taskId={tabParams.taskId}
wishlistId={tabParams.wishlistId}
isTest={tabParams.isTest}
isPurchase={tabParams.isPurchase}
returnTo={tabParams.returnTo}
returnWishlistId={tabParams.returnWishlistId}
/>
@@ -1779,51 +1762,6 @@ function AppContent() {
</div>
)}
{/* Модальное окно выбора типа задачи */}
{showAddModal && (
<div className="task-add-modal-overlay" onClick={() => setShowAddModal(false)}>
<div className="task-add-modal" onClick={(e) => e.stopPropagation()}>
<div className="task-add-modal-header">
<h3>Что добавить?</h3>
</div>
<div className="task-add-modal-buttons">
<button
className="task-add-modal-button task-add-modal-button-task"
onClick={handleAddTask}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M9 11l3 3L22 4"></path>
<path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path>
</svg>
Задача
</button>
<button
className="task-add-modal-button task-add-modal-button-test"
onClick={handleAddTest}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path>
<path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path>
<path d="M8 7h6"></path>
<path d="M8 11h4"></path>
</svg>
Тест
</button>
<button
className="task-add-modal-button task-add-modal-button-purchase"
onClick={handleAddPurchase}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<circle cx="9" cy="21" r="1"></circle>
<circle cx="20" cy="21" r="1"></circle>
<path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path>
</svg>
Закупка
</button>
</div>
</div>
</div>
)}
</div>
)
}