wui_button.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // package wui_button -- WUI-кнопка.
  2. package wui_button
  3. import (
  4. "fmt"
  5. "strings"
  6. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_hx"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_text"
  10. mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_widget"
  12. )
  13. // WuiButton -- WUI-кнопка.
  14. type WuiButton struct {
  15. mWt.IWuiWidget
  16. text mWt.IWuiText
  17. fnBack func(map[string]string) *mL0.Result[string]
  18. hx mWt.IWuiHx
  19. }
  20. // FnBtnBack -- функция обратного вызова для кнопки.
  21. type FnBtnBack func(map[string]string) *mL0.Result[string]
  22. // NewWuiButton -- возвращает новую WUI-кнопку.
  23. func NewWuiButton(text string, fnBack FnBtnBack) *mL0.Result[*WuiButton] {
  24. if fnBack == nil {
  25. return mL0.NewErr[*WuiButton](fmt.Errorf("NewWuiButton(): text=%q, fnBack==nil", text))
  26. }
  27. sf := &WuiButton{
  28. IWuiWidget: wui_widget.NewWuiWidget(),
  29. text: wui_text.NewWuiText(text),
  30. fnBack: fnBack,
  31. }
  32. sf.hx = wui_hx.NewWuiHx("/wui/click/" + sf.Id())
  33. resWuiCtx := wui_ctx.GetWuiCtx()
  34. if resWuiCtx.IsErr() {
  35. err := fmt.Errorf("NewWuiButton(): text=%q, err=\n\t%w", text, resWuiCtx.Err())
  36. return mL0.NewErr[*WuiButton](err)
  37. }
  38. wCtx := resWuiCtx.Val()
  39. resSet := wCtx.Set(sf.Id(), sf, "WUI-кнопка")
  40. if resSet.IsErr() {
  41. err := fmt.Errorf("NewWuiButton(): text=%q, err=\n\t%w", text, resSet.Err())
  42. return mL0.NewErr[*WuiButton](err)
  43. }
  44. _ = mWt.IWuiButton(sf)
  45. return mL0.NewRes(sf)
  46. }
  47. // Hx -- возвращает атрибуты HTMX.
  48. func (sf *WuiButton) Hx() mWt.IWuiHx {
  49. return sf.hx
  50. }
  51. // Text -- возвращает текст кнопки.
  52. func (sf *WuiButton) Text() mWt.IWuiText {
  53. return sf.text
  54. }
  55. // Click -- событие нажатия.
  56. func (sf *WuiButton) Click(dict map[string]string) *mL0.Result[string] {
  57. return sf.fnBack(dict)
  58. }
  59. const (
  60. strBeg = `<span id="{.id}" class="btn btn-primary" {.hx}>{.txt}</span>`
  61. )
  62. // Html -- возвращает HTML-представление текста.
  63. func (sf *WuiButton) Html() string {
  64. strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id())
  65. strRes = strings.ReplaceAll(strRes, "{.txt}", sf.text.Get())
  66. strRes = strings.ReplaceAll(strRes, "{.hx}", sf.hx.String())
  67. return strRes
  68. }