diff --git a/VERSION b/VERSION index ff61e18..5917993 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.12.1 +6.13.0 diff --git a/play-life-backend/main.go b/play-life-backend/main.go index 2700ece..6eb9395 100644 --- a/play-life-backend/main.go +++ b/play-life-backend/main.go @@ -8570,7 +8570,7 @@ func (a *App) createTaskHandler(w http.ResponseWriter, r *http.Request) { // Если сообщение награды не указано или пустое, устанавливаем "Выполнить желание: {TITLE}" if req.RewardMessage == nil || strings.TrimSpace(*req.RewardMessage) == "" { - rewardMsg := fmt.Sprintf("Выполнить желание: %s", wishlistName) + rewardMsg := "Выполнить желание: $name" req.RewardMessage = &rewardMsg } @@ -9972,7 +9972,7 @@ func (a *App) executeTask(taskID int, userID int, req CompleteTaskRequest) error } // Функция для замены плейсхолдеров в сообщении награды - replaceRewardPlaceholders := func(message string, rewardStrings map[int]string) string { + replaceRewardPlaceholders := func(message string, rewardStrings map[int]string, taskName string, subtaskName string) string { result := message // Сначала сохраняем экранированные плейсхолдеры \$0, \$1 и т.д. во временные маркеры escapedMarkers := make(map[string]string) @@ -9984,6 +9984,12 @@ func (a *App) executeTask(taskID int, userID int, req CompleteTaskRequest) error result = strings.ReplaceAll(result, escaped, marker) } } + // Заменяем $subtaskName именем подзадачи (если задано) + if subtaskName != "" { + result = strings.ReplaceAll(result, "$subtaskName", subtaskName) + } + // Заменяем $name именем задачи + result = strings.ReplaceAll(result, "$name", taskName) // Заменяем ${0}, ${1}, и т.д. for i := 0; i < 100; i++ { // Максимум 100 плейсхолдеров placeholder := fmt.Sprintf("${%d}", i) @@ -10025,7 +10031,7 @@ func (a *App) executeTask(taskID int, userID int, req CompleteTaskRequest) error // Подставляем в reward_message основной задачи var mainTaskMessage string if task.RewardMessage != nil && *task.RewardMessage != "" { - mainTaskMessage = replaceRewardPlaceholders(*task.RewardMessage, rewardStrings) + mainTaskMessage = replaceRewardPlaceholders(*task.RewardMessage, rewardStrings, task.Name, "") } else { // Если reward_message пустой, используем имя задачи mainTaskMessage = task.Name @@ -10117,7 +10123,7 @@ func (a *App) executeTask(taskID int, userID int, req CompleteTaskRequest) error } // Подставляем в reward_message подзадачи - subtaskMessage := replaceRewardPlaceholders(subtaskRewardMessage.String, subtaskRewardStrings) + subtaskMessage := replaceRewardPlaceholders(subtaskRewardMessage.String, subtaskRewardStrings, task.Name, subtaskName) subtaskMessages = append(subtaskMessages, subtaskMessage) } diff --git a/play-life-web/package.json b/play-life-web/package.json index 223014e..fe438ab 100644 --- a/play-life-web/package.json +++ b/play-life-web/package.json @@ -1,6 +1,6 @@ { "name": "play-life-web", - "version": "6.12.1", + "version": "6.13.0", "type": "module", "scripts": { "dev": "vite", diff --git a/play-life-web/src/components/TaskDetail.jsx b/play-life-web/src/components/TaskDetail.jsx index 28c1cde..36af978 100644 --- a/play-life-web/src/components/TaskDetail.jsx +++ b/play-life-web/src/components/TaskDetail.jsx @@ -291,7 +291,7 @@ const formatTelegramMessage = (task, rewards, subtasks, selectedSubtasks, progre }) // Функция для замены плейсхолдеров - const replacePlaceholders = (message, rewardStrings) => { + const replacePlaceholders = (message, rewardStrings, taskName, subtaskName) => { let result = message // Сначала защищаем экранированные плейсхолдеры const escapedMarkers = {} @@ -303,6 +303,12 @@ const formatTelegramMessage = (task, rewards, subtasks, selectedSubtasks, progre result = result.replace(new RegExp(escaped.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), marker) } } + // Заменяем $subtaskName именем подзадачи (если задано) + if (subtaskName) { + result = result.replace(/\$subtaskName/g, subtaskName) + } + // Заменяем $name именем задачи + result = result.replace(/\$name/g, taskName || '') // Заменяем ${0}, ${1}, и т.д. for (let i = 0; i < 100; i++) { const placeholder = `\${${i}}` @@ -327,7 +333,7 @@ const formatTelegramMessage = (task, rewards, subtasks, selectedSubtasks, progre // Формируем сообщение основной задачи let mainTaskMessage = task.reward_message && task.reward_message.trim() !== '' - ? replacePlaceholders(task.reward_message, rewardStrings) + ? replacePlaceholders(task.reward_message, rewardStrings, task.name) : task.name // Формируем сообщения подзадач @@ -361,7 +367,7 @@ const formatTelegramMessage = (task, rewards, subtasks, selectedSubtasks, progre subtaskRewardStrings[reward.position] = scoreStr }) - const subtaskMessage = replacePlaceholders(subtask.task.reward_message, subtaskRewardStrings) + const subtaskMessage = replacePlaceholders(subtask.task.reward_message, subtaskRewardStrings, task.name, subtask.task.name) subtaskMessages.push(subtaskMessage) }) diff --git a/play-life-web/src/components/TaskForm.jsx b/play-life-web/src/components/TaskForm.jsx index 0b8ce9f..bd1e81e 100644 --- a/play-life-web/src/components/TaskForm.jsx +++ b/play-life-web/src/components/TaskForm.jsx @@ -12,7 +12,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, returnTo, returnWishlistId } const { authFetch } = useAuth() const [name, setName] = useState('') const [progressionBase, setProgressionBase] = useState('') - const [rewardMessage, setRewardMessage] = useState('') + const [rewardMessage, setRewardMessage] = useState('$name') const [repetitionPeriodValue, setRepetitionPeriodValue] = useState('') const [repetitionPeriodType, setRepetitionPeriodType] = useState('day') const [repetitionMode, setRepetitionMode] = useState('after') // 'after' = Через, 'each' = Каждое @@ -108,7 +108,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, returnTo, returnWishlistId } // Функция сброса формы const resetForm = () => { setName('') - setRewardMessage('') + setRewardMessage('$name') setProgressionBase('') setRepetitionPeriodValue('') setRepetitionPeriodType('day') @@ -156,7 +156,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, returnTo, returnWishlistId } } // Предзаполняем сообщение награды if (data.name) { - setRewardMessage(`Выполнить желание: ${data.name}`) + setRewardMessage('Выполнить желание: $name') } } } catch (err) { @@ -181,7 +181,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, returnTo, returnWishlistId } } const data = await response.json() setName(data.task.name) - setRewardMessage(data.task.reward_message || '') + setRewardMessage(data.task.reward_message || '$name') setProgressionBase(data.task.progression_base ? String(data.task.progression_base) : '') setGroupName(data.task.group_name ?? '') @@ -359,7 +359,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, returnTo, returnWishlistId } setSubtasks(data.subtasks.map((st, index) => ({ id: st.task.id, name: st.task.name || '', - reward_message: st.task.reward_message || '', + reward_message: st.task.reward_message || '$subtaskName', position: st.task.position !== undefined && st.task.position !== null ? st.task.position : index, rewards: st.rewards.map(r => ({ position: r.position, @@ -539,7 +539,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, returnTo, returnWishlistId } setSubtasks([...subtasks, { id: null, name: '', - reward_message: '', + reward_message: '$subtaskName', position: subtasks.length, rewards: [] }]) @@ -1018,7 +1018,7 @@ function TaskForm({ onNavigate, taskId, wishlistId, returnTo, returnWishlistId }