экраны закупов и креативов

This commit is contained in:
Artem Tsyrulnikov
2025-12-30 22:21:57 +03:00
parent 2fb8c83041
commit c05ac84b38
16 changed files with 1962 additions and 493 deletions

View File

@@ -0,0 +1,122 @@
package screens
import (
"fmt"
"example.com/m/adapter/backend"
"example.com/m/bot"
"github.com/NicoNex/echotron/v3"
)
type AddPlacement struct {
WorkspaceID string
BackState bot.State
// Выбранные данные
SelectedProject *backend.Project
SelectedCreative *backend.Creative
}
func (s *AddPlacement) Enter(b *bot.Bot, mode bot.RenderMode) {
text := `<b> Создать закуп</b>
Шаг 1: Выберите проект и креатив
Нажмите на кнопки ниже для выбора:`
var buttons [][]echotron.InlineKeyboardButton
// Кнопка выбора проекта
projectButtonText := "Проект: Не выбран"
if s.SelectedProject != nil {
projectButtonText = fmt.Sprintf("Проект: %s", s.SelectedProject.Title)
}
buttons = append(buttons, bot.Row(
bot.Button(projectButtonText, "select_project"),
))
// Кнопка выбора креатива
creativeButtonText := "Креатив: Не выбран"
if s.SelectedCreative != nil {
creativeButtonText = fmt.Sprintf("Креатив: %s", s.SelectedCreative.Name)
}
buttons = append(buttons, bot.Row(
bot.Button(creativeButtonText, "select_creative"),
))
// Кнопки навигации
var navRow []echotron.InlineKeyboardButton
navRow = append(navRow, bot.Button("« Назад", "cancel"))
// Кнопка "Далее" активна только если выбран проект
if s.SelectedProject != nil {
navRow = append(navRow, bot.Button("Далее →", "next"))
}
buttons = append(buttons, navRow)
keyboard := bot.Keyboard(buttons...)
b.Render(text, keyboard, mode)
}
func (s *AddPlacement) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return
}
data := u.CallbackQuery.Data
switch data {
case "cancel":
if s.BackState != nil {
b.SetState(s.BackState, bot.EditMessage)
}
case "select_project":
// Переходим к выбору проекта
b.SetState(&SelectProjectForPlacement{
WorkspaceID: s.WorkspaceID,
AddPlacementState: s,
}, bot.NewMessage)
case "select_creative":
if s.SelectedProject == nil {
// Если проект не выбран, показываем предупреждение
b.Edit(`<b>⚠️ Сначала выберите проект</b>
Для выбора креатива необходимо сначала выбрать проект, так как креативы привязаны к проектам.`, bot.Keyboard(
bot.Row(bot.Button("« Назад", "back_to_add_placement")),
))
return
}
// Переходим к выбору креатива
b.SetState(&SelectCreativeForPlacement{
WorkspaceID: s.WorkspaceID,
ProjectID: s.SelectedProject.ID,
AddPlacementState: s,
}, bot.NewMessage)
case "back_to_add_placement":
s.Enter(b, bot.EditMessage)
case "next":
if s.SelectedProject == nil {
return
}
// Переходим к управлению планом закупа (добавление/удаление каналов)
b.SetState(&PlacementPurchasePlan{
WorkspaceID: s.WorkspaceID,
ProjectID: s.SelectedProject.ID,
AddPlacementState: s,
}, bot.EditMessage)
default:
s.Enter(b, bot.NewMessage)
}
}
func (s *AddPlacement) HandleMessage(_ *bot.Bot, _ *echotron.Update) { return }
func (s *AddPlacement) Handle(_ *bot.Bot, _ *echotron.Update) { return }