wbutton.go 2.2 KB

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