// 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/lev0" "gitp78su.ipnodns.ru/svi/kern/v4/lev1" "gitp78su.ipnodns.ru/svi/kern/v4/lev2" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_button" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/http_api" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_module" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_monolit" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec" ) // ModuleWui -- модуль WUI. type ModuleWui struct { mod_spec.IKernelModule kCtx *lev2.KernCtx wCtx *wui_ctx.WuiCtx kServHttp kspec.IKernelServerHttp log *lev1.LogBuf } var ( mod *ModuleWui block sync.Mutex ) // GetModuleWui -- возвращает новый модуль WUI. func GetModuleWui() *ModuleWui { block.Lock() defer block.Unlock() if mod != nil { return mod } modName := mod_ent.LetModuleName("wui") sf := &ModuleWui{ kCtx: lev2.GetKernCtx(), wCtx: wui.GetWuiCtx(), IKernelModule: kmodule.NewKernelModule(modName), kServHttp: kserv_http.GetKernelServHttp(), } sf.log = sf.wCtx.Log() _ = page_monolit.GetPageMonolit() _ = page_module.GetPageModule() _ = http_api.NewHttpApi() optFiber := sf.kCtx.Get(lev0.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 := lev0.LetTxt("ModuleWui.Run(): module=%v, is run", sf.Name()).Get() sf.log.Info(msg) sf.kServHttp.Run() } // Log -- возвращает буферный лог. func (sf *ModuleWui) Log() *lev1.LogBuf { return sf.log } // IsWork -- признак работы модуля. func (sf *ModuleWui) IsWork() lev0.Bool { return sf.kCtx.Wg().IsWork() } // Получает событие из сети. func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) { url := lev0.LetTxt(req.RequestURI) id := strings.TrimPrefix(url.String(), "/wui/click/") optWidget := sf.wCtx.Get(lev0.LetTxt(id)) if optWidget == nil { err := lev0.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 := lev0.LetErr("ModuleWui.wuiClick(): widget(%T) not button", optWidget.Some()) sf.log.Err(strOut) _, _ = fmt.Fprint(resp, strOut) return } dict := map[lev0.Txt]lev0.Txt{} // headers := ctx.GetReqHeaders() for key, lstVal := range req.Header { if len(lstVal) >= 1 { dict[lev0.Txt(key)] = lev0.Txt(lstVal[0]) continue } } err := req.ParseForm() lev0.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[lev0.Txt(key)] = lev0.Txt(lstVal[0]) continue } } strOut := widget1.Click(dict) _, _ = fmt.Fprint(resp, strOut) }