улучшение ui

This commit is contained in:
Artem Tsyrulnikov
2026-01-09 12:23:02 +03:00
parent 40c7be8470
commit 9fbb6fdbbf
19 changed files with 635 additions and 453 deletions

View File

@@ -175,20 +175,20 @@ func (s *DateTimePicker) renderCalendarTitle() string {
func (s *DateTimePicker) calendarKeyboard() echotron.InlineKeyboardMarkup {
var rows [][]echotron.InlineKeyboardButton
rows = append(rows, bot.Row(
rows = append(rows, Row(
s.monthPrevButton(),
bot.Button(monthName(s.month), dtpCallbackPrefix+"open_months"),
bot.Button("→", dtpCallbackPrefix+"month_next"),
Button(monthName(s.month), dtpCallbackPrefix+"open_months"),
Button("→", dtpCallbackPrefix+"month_next"),
))
rows = append(rows, bot.Row(
bot.Button("Пн", "empty"),
bot.Button("Вт", "empty"),
bot.Button("Ср", "empty"),
bot.Button("Чт", "empty"),
bot.Button("Пт", "empty"),
bot.Button("Сб", "empty"),
bot.Button("Вс", "empty"),
rows = append(rows, Row(
Button("Пн", "empty"),
Button("Вт", "empty"),
Button("Ср", "empty"),
Button("Чт", "empty"),
Button("Пт", "empty"),
Button("Сб", "empty"),
Button("Вс", "empty"),
))
firstOfMonth := time.Date(s.year, s.month, 1, 0, 0, 0, 0, mskLocation)
@@ -202,16 +202,16 @@ func (s *DateTimePicker) calendarKeyboard() echotron.InlineKeyboardMarkup {
var row []echotron.InlineKeyboardButton
for i := 1; i < weekday; i++ {
row = append(row, bot.Button(" ", "empty"))
row = append(row, Button(" ", "empty"))
}
for day := 1; day <= daysInMonth; day++ {
date := time.Date(s.year, s.month, day, 0, 0, 0, 0, mskLocation)
if date.Before(todayDate) {
row = append(row, bot.Button("-", "empty"))
row = append(row, Button("-", "empty"))
} else {
label := fmt.Sprintf("%d", day)
row = append(row, bot.Button(label, fmt.Sprintf("%sday:%04d-%02d-%02d", dtpCallbackPrefix, s.year, int(s.month), day)))
row = append(row, Button(label, fmt.Sprintf("%sday:%04d-%02d-%02d", dtpCallbackPrefix, s.year, int(s.month), day)))
}
if len(row) == 7 {
rows = append(rows, row)
@@ -221,17 +221,17 @@ func (s *DateTimePicker) calendarKeyboard() echotron.InlineKeyboardMarkup {
if len(row) > 0 {
for len(row) < 7 {
row = append(row, bot.Button(" ", "empty"))
row = append(row, Button(" ", "empty"))
}
rows = append(rows, row)
}
rows = append(rows, bot.Row(
bot.Button("← Назад", "back"),
bot.Button("Отмена", "cancel"),
rows = append(rows, Row(
Button("← Назад", "back"),
Button("Отмена", "cancel"),
))
return bot.Keyboard(rows...)
return Keyboard(rows...)
}
func (s *DateTimePicker) monthsKeyboard() echotron.InlineKeyboardMarkup {
@@ -239,25 +239,25 @@ func (s *DateTimePicker) monthsKeyboard() echotron.InlineKeyboardMarkup {
months := []string{"Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"}
for i := 0; i < 12; i += 3 {
rows = append(rows, bot.Row(
bot.Button(months[i], fmt.Sprintf("%smonth:%d", dtpCallbackPrefix, i+1)),
bot.Button(months[i+1], fmt.Sprintf("%smonth:%d", dtpCallbackPrefix, i+2)),
bot.Button(months[i+2], fmt.Sprintf("%smonth:%d", dtpCallbackPrefix, i+3)),
rows = append(rows, Row(
Button(months[i], fmt.Sprintf("%smonth:%d", dtpCallbackPrefix, i+1)),
Button(months[i+1], fmt.Sprintf("%smonth:%d", dtpCallbackPrefix, i+2)),
Button(months[i+2], fmt.Sprintf("%smonth:%d", dtpCallbackPrefix, i+3)),
))
}
rows = append(rows, bot.Row(
bot.Button("← Назад", "back"),
rows = append(rows, Row(
Button("← Назад", "back"),
))
return bot.Keyboard(rows...)
return Keyboard(rows...)
}
func (s *DateTimePicker) timeCombinedKeyboard() echotron.InlineKeyboardMarkup {
var rows [][]echotron.InlineKeyboardButton
rows = append(rows, bot.Row(bot.Button("Часы", "empty")))
rows = append(rows, Row(Button("Часы", "empty")))
for i := 0; i < 24; i += 6 {
rows = append(rows, bot.Row(
rows = append(rows, Row(
s.hourButton(i),
s.hourButton(i+1),
s.hourButton(i+2),
@@ -266,10 +266,10 @@ func (s *DateTimePicker) timeCombinedKeyboard() echotron.InlineKeyboardMarkup {
s.hourButton(i+5),
))
}
rows = append(rows, bot.Row(bot.Button("Минуты", "empty")))
rows = append(rows, Row(Button("Минуты", "empty")))
minutes := []int{0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55}
for i := 0; i < len(minutes); i += 6 {
rows = append(rows, bot.Row(
rows = append(rows, Row(
s.minuteButton(minutes[i]),
s.minuteButton(minutes[i+1]),
s.minuteButton(minutes[i+2]),
@@ -278,18 +278,18 @@ func (s *DateTimePicker) timeCombinedKeyboard() echotron.InlineKeyboardMarkup {
s.minuteButton(minutes[i+5]),
))
}
rows = append(rows, bot.Row(
bot.Button("← Назад", "back"),
bot.Button("Готово", dtpCallbackPrefix+"confirm"),
rows = append(rows, Row(
Button("← Назад", "back"),
Button("Готово", dtpCallbackPrefix+"confirm"),
))
return bot.Keyboard(rows...)
return Keyboard(rows...)
}
func (s *DateTimePicker) confirmKeyboard() echotron.InlineKeyboardMarkup {
return bot.Keyboard(
bot.Row(
bot.Button("← Назад", "back"),
bot.Button("Готово", dtpCallbackPrefix+"confirm"),
return Keyboard(
Row(
Button("← Назад", "back"),
Button("Готово", dtpCallbackPrefix+"confirm"),
),
)
}
@@ -426,23 +426,23 @@ func (s *DateTimePicker) confirmSelection(b *bot.Bot) {
func (s *DateTimePicker) hourButton(hour int) echotron.InlineKeyboardButton {
label := fmt.Sprintf("%02d", hour)
if s.isHourDisabled(hour) {
return bot.Button("-", "empty")
return Button("-", "empty")
}
if s.selectedHour != nil && *s.selectedHour == hour {
label = "● " + label
}
return bot.Button(label, fmt.Sprintf("%shour:%02d", dtpCallbackPrefix, hour))
return Button(label, fmt.Sprintf("%shour:%02d", dtpCallbackPrefix, hour))
}
func (s *DateTimePicker) minuteButton(minute int) echotron.InlineKeyboardButton {
label := fmt.Sprintf("%02d", minute)
if s.isMinuteDisabled(minute) {
return bot.Button("-", "empty")
return Button("-", "empty")
}
if s.selectedMinute != nil && *s.selectedMinute == minute {
label = "● " + label
}
return bot.Button(label, fmt.Sprintf("%smin:%02d", dtpCallbackPrefix, minute))
return Button(label, fmt.Sprintf("%smin:%02d", dtpCallbackPrefix, minute))
}
func (s *DateTimePicker) isHourDisabled(hour int) bool {
@@ -499,9 +499,9 @@ func (s *DateTimePicker) nextMonth() {
func (s *DateTimePicker) monthPrevButton() echotron.InlineKeyboardButton {
now := time.Now().In(mskLocation)
if s.year == now.Year() && s.month == now.Month() {
return bot.Button("-", "empty")
return Button("-", "empty")
}
return bot.Button("←", dtpCallbackPrefix+"month_prev")
return Button("←", dtpCallbackPrefix+"month_prev")
}
func daysInMonth(year int, month time.Month) int {