wui_button.go 2.4 KB

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