wui_button.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // package wui_button -- WUI-кнопка.
  2. package wui_button
  3. import (
  4. "strings"
  5. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
  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) mL0.IResult[defs.ITxtFix]
  19. hx mWt.IWuiHx
  20. }
  21. // FnBtnBack -- функция обратного вызова для кнопки.
  22. type FnBtnBack func(map[string]string) mL0.IResult[defs.ITxtFix]
  23. // NewWuiButton -- возвращает новую WUI-кнопку.
  24. func NewWuiButton(text defs.ITxtFix, fnBack FnBtnBack) *WuiButton {
  25. helpers.Hassert(fnBack != nil, "NewWuiButton(): text=%q, fnBack==nil", []any{text})
  26. sf := &WuiButton{
  27. IWuiWidget: wui_widget.NewWuiWidget(),
  28. text: wui_text.NewWuiText(text),
  29. fnBack: fnBack,
  30. }
  31. sf.hx = wui_hx.NewWuiHx(defs.Txt("/wui/click/" + sf.Id().Get()))
  32. wCtx := wui_ctx.GetWuiCtx()
  33. wCtx.Set(sf.Id(), sf, "WUI-кнопка")
  34. _ = mWt.IWuiButton(sf)
  35. return sf
  36. }
  37. // Hx -- возвращает атрибуты HTMX.
  38. func (sf *WuiButton) Hx() mWt.IWuiHx {
  39. return sf.hx
  40. }
  41. // Text -- возвращает текст кнопки.
  42. func (sf *WuiButton) Text() mWt.IWuiText {
  43. return sf.text
  44. }
  45. // Click -- событие нажатия.
  46. func (sf *WuiButton) Click(dict map[string]string) mL0.IResult[defs.ITxtFix] {
  47. return sf.fnBack(dict)
  48. }
  49. const (
  50. strBeg = `<span id="{.id}" class="btn btn-primary" {.hx}>{.txt}</span>`
  51. )
  52. // Html -- возвращает HTML-представление текста.
  53. func (sf *WuiButton) Html() defs.ITxtFix {
  54. strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id().String())
  55. strRes = strings.ReplaceAll(strRes, "{.txt}", sf.text.String())
  56. strRes = strings.ReplaceAll(strRes, "{.hx}", sf.hx.String())
  57. return defs.Txt(strRes)
  58. }