// package mod_wui -- модуль WUI. package mod_wui import ( "fmt" "net/http" "strings" "sync" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/middleware/adaptor" "gitp78su.ipnodns.ru/svi/kern/v4/d0" "gitp78su.ipnodns.ru/svi/kern/v4/d1" "gitp78su.ipnodns.ru/svi/kern/v4/d2" "gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule" "gitp78su.ipnodns.ru/svi/kern/v4/d2/kserv_http" "gitp78su.ipnodns.ru/svi/kern/v4/d2/kspec" "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui" "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_button" "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_ctx" "gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent" "gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/http_api" "gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/page_module" "gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/page_monolit" "gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec" ) // ModuleWui -- модуль WUI. type ModuleWui struct { mod_spec.IKernelModule kCtx *d2.KernCtx wCtx *wui_ctx.WuiCtx kServHttp kspec.IKernelServerHttp log *d1.LogBuf } var ( mod *ModuleWui block sync.Mutex ) // GetModuleWui -- возвращает новый модуль WUI. func GetModuleWui() *ModuleWui { block.Lock() defer block.Unlock() if mod != nil { return mod } owner := d0.LetOwner(1, "isol_wui") modName := mod_ent.LetModuleName("wui") sf := &ModuleWui{ kCtx: d2.GetKernCtx(), wCtx: wui.GetWuiCtx(), IKernelModule: kmodule.NewKernelModule(owner, modName), kServHttp: kserv_http.GetKernelServHttp(), } sf.log = sf.wCtx.Log() _ = page_monolit.GetPageMonolit() _ = page_module.GetPageModule() _ = http_api.NewHttpApi() optFiber := sf.kCtx.Get(d0.LetTxt("fiberApp")) optFiber.Hassert("GetModuleWui(): mod='wui', not found fiberApp in kernel ctx") fibApp := optFiber.Some().Val().(*fiber.App) fibApp.Post("/wui/click/:id", adaptor.HTTPHandlerFunc(sf.wuiClick)) // adaptor.HTTPHandlerFunc(greet) mod = sf return sf } // Run -- запускает модуль в работу. func (sf *ModuleWui) Run() { msg := d0.LetTxt("ModuleWui.Run(): module=%v, is run", sf.Name()).Get() sf.log.Info(msg) sf.kServHttp.Run() } // Log -- возвращает буферный лог. func (sf *ModuleWui) Log() *d1.LogBuf { return sf.log } // IsWork -- признак работы модуля. func (sf *ModuleWui) IsWork() d0.Bool { return sf.kCtx.Wg().IsWork() } // Получает событие из сети. func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) { url := d0.LetTxt(req.RequestURI) id := strings.TrimPrefix(url.String(), "/wui/click/") optWidget := sf.wCtx.Get(d0.LetTxt(id)) if optWidget == nil { err := d0.LetErr("ModuleWui.wuiClick(): id(%v), widget not exists", id) sf.log.Err(err) _, _ = fmt.Fprint(resp, err) return } _widget1 := optWidget.Some() widget1, isOk := _widget1.Val().(*wui_button.WuiButton) if !isOk { strOut := d0.LetErr("ModuleWui.wuiClick(): widget(%T) not button", optWidget.Some()) sf.log.Err(strOut) _, _ = fmt.Fprint(resp, strOut) return } dict := map[d0.Txt]d0.Txt{} // headers := ctx.GetReqHeaders() for key, lstVal := range req.Header { if len(lstVal) >= 1 { dict[d0.Txt(key)] = d0.Txt(lstVal[0]) continue } } err := req.ParseForm() d0.If(err != nil). Hassert("ModuleWui.wuiClick(): in parse form, err=\n\t%v", err) // Получаем все form-значения // values := req.ParseForm() for key, lstVal := range req.Form { if len(lstVal) >= 1 { dict[d0.Txt(key)] = d0.Txt(lstVal[0]) continue } } strOut := widget1.Click(dict) _, _ = fmt.Fprint(resp, strOut) }