From 0b5106458adc58aff6f4f0203f41694970fe2b92 Mon Sep 17 00:00:00 2001 From: poignatov Date: Thu, 12 Mar 2026 15:28:25 +0300 Subject: [PATCH] =?UTF-8?q?6.13.0:=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20$name=20=D0=B8=20$subtaskName=20?= =?UTF-8?q?=D0=B2=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=D1=85=20=D0=BD=D0=B0=D0=B3=D1=80=D0=B0=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION | 2 +- play-life-backend/main.go | 14 ++++++++++---- play-life-web/package.json | 2 +- play-life-web/src/components/TaskDetail.jsx | 12 +++++++++--- play-life-web/src/components/TaskForm.jsx | 16 ++++++++-------- 5 files changed, 29 insertions(+), 17 deletions(-) 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 }