Доски желаний и политика награждения
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m0s

This commit is contained in:
poignatov
2026-01-13 22:35:01 +03:00
parent 5ebb55510e
commit f9928c6470
19 changed files with 3662 additions and 198 deletions

View File

@@ -24,6 +24,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, isTest: isTestFromProps = fa
const [isDeleting, setIsDeleting] = useState(false)
const [wishlistInfo, setWishlistInfo] = useState(null) // Информация о связанном желании
const [currentWishlistId, setCurrentWishlistId] = useState(null) // Текущий wishlist_id задачи
const [rewardPolicy, setRewardPolicy] = useState('personal') // Политика награждения: 'personal' или 'general'
// Test-specific state
const [isTest, setIsTest] = useState(isTestFromProps)
const [wordsCount, setWordsCount] = useState('10')
@@ -122,6 +123,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, isTest: isTestFromProps = fa
} else {
setCurrentWishlistId(null)
setWishlistInfo(null)
setRewardPolicy('personal') // Сбрасываем при отвязке
}
}
}, [taskId, wishlistId, authFetch])
@@ -339,9 +341,16 @@ function TaskForm({ onNavigate, taskId, wishlistId, isTest: isTestFromProps = fa
} catch (err) {
console.error('Error loading wishlist info:', err)
}
// Загружаем политику награждения
if (data.task.reward_policy) {
setRewardPolicy(data.task.reward_policy)
} else {
setRewardPolicy('personal') // Значение по умолчанию
}
} else {
setCurrentWishlistId(null)
setWishlistInfo(null)
setRewardPolicy('personal') // Сбрасываем при отвязке
}
// Загружаем информацию о тесте, если есть config_id
@@ -628,6 +637,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, isTest: isTestFromProps = fa
wishlist_id: taskId
? (currentWishlistId && !wishlistInfo ? null : undefined)
: (currentWishlistId || undefined),
reward_policy: (wishlistInfo || currentWishlistId) ? rewardPolicy : undefined,
rewards: rewards.map(r => ({
position: r.position,
project_name: r.project_name.trim(),
@@ -798,6 +808,23 @@ function TaskForm({ onNavigate, taskId, wishlistId, isTest: isTestFromProps = fa
</button>
)}
</div>
<div className="form-group" style={{ marginTop: '12px' }}>
<label htmlFor="reward_policy">Политика награждения:</label>
<select
id="reward_policy"
value={rewardPolicy}
onChange={(e) => setRewardPolicy(e.target.value)}
className="form-input"
>
<option value="personal">Личная</option>
<option value="general">Общая</option>
</select>
<small style={{ color: '#666', fontSize: '0.9em', display: 'block', marginTop: '4px' }}>
{rewardPolicy === 'personal'
? 'Задача выполняется только если вы сами завершили желание. Если другой пользователь завершит желание, задача будет удалена.'
: 'Задача выполняется если кто-либо (неважно кто) отметил желание завершённым.'}
</small>
</div>
</div>
)}