diff --git a/handlers/dev/md.nonlabtemplate.handlers.go b/handlers/dev/md.nonlabtemplate.handlers.go new file mode 100644 index 0000000..1b88a8d --- /dev/null +++ b/handlers/dev/md.nonlabtemplate.handlers.go @@ -0,0 +1,252 @@ +package dev_handlers + +import ( + breadcrumadmin "cpone/component/breadcrumbadmin" + "cpone/component/customtextfieldsearch" + navbarmenu "cpone/component/navbar" + "cpone/component/pagination" + sidebaruserprofile "cpone/component/sidebar_user_profile" + "cpone/models" + "cpone/services" + "cpone/utils" + dev_mdnonlabtemplateview "cpone/views/dev/mdnonlabtemplate" + "fmt" + "strconv" + + "github.com/a-h/templ" + "github.com/labstack/echo/v4" + "go.uber.org/zap" +) + +type MDNonLabTemplateServices interface { + GetMDNonLabTemplateBreadcrumb() (models.BreadCrumbV1, error) + GetMDNonLabTemplateData(search string, currentPage int, rowPerPage int) ([]models.MDNonLabTemplate, int, error) +} + +type MDNonLabTemplateHandler struct { + MDNonLabTemplateServices MDNonLabTemplateServices +} + +func NewMDNonLabTemplateHandler(nlt MDNonLabTemplateServices) *MDNonLabTemplateHandler { + return &MDNonLabTemplateHandler{ + MDNonLabTemplateServices: nlt, + } +} + +func (mdnlt *MDNonLabTemplateHandler) HandleShowMDNonLabTemplateScreen(c echo.Context) error { + logger, _ := zap.NewProduction() + + tableID := utils.GenerateRandomID("tableid") + paginationID := utils.GenerateRandomID("paginationid") + searchID := utils.GenerateRandomID("searchid") + dialogAddID := utils.GenerateRandomID("dialogaddid") + dialogAddBodyID := utils.GenerateRandomID("dialogaddbodyid") + dialogEditID := utils.GenerateRandomID("dialogeditid") + dialogEditBodyID := utils.GenerateRandomID("dialogeditbodyid") + dialogDeleteID := utils.GenerateRandomID("dialogdeleteid") + dialogDeleteBodyID := utils.GenerateRandomID("dialogdeletebodyid") + + dataMenu, err := services.GetMenu() + if err != nil { + fmt.Println(dataMenu) + return err + } + + dataUser, err := services.GetUserLogin() + if err != nil { + fmt.Println(dataUser) + return err + } + defer logger.Sync() + logger.Info("LOAD USER DEV", zap.Any("data", dataUser)) + + title := "Master Non-lab Template" + + dataBreadCrumb, err := mdnlt.MDNonLabTemplateServices.GetMDNonLabTemplateBreadcrumb() + if err != nil { + defer logger.Sync() + logger.Info("ERROR BREADCRUMB DEV", zap.Any("error", err)) + return err + } + defer logger.Sync() + logger.Info("LOAD BREADCRUMB DEV", zap.Any("data", dataBreadCrumb)) + + breadcrumbComp := breadcrumadmin.MainBreadcrumbAdminV1(dataBreadCrumb) + navbarmenuComp := navbarmenu.NavbarMenu(dataMenu) + navbaruserComp := navbarmenu.Navbar(dataUser) + sidebarusrComp := sidebaruserprofile.Navbaruserprofile(dataUser) + + dataList, totalPage, err := mdnlt.MDNonLabTemplateServices.GetMDNonLabTemplateData("", 1, 5) + if err != nil { + defer logger.Sync() + logger.Info("ERROR GET DATA DEV", zap.Any("error", err)) + return err + } + + tableComp := dev_mdnonlabtemplateview.TableNonLabTemplate(dataList, + tableID, + "/dev/md/nonlabtemplate/openedit", + "#"+dialogEditBodyID, + "outerHTML", + "#dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "/dev/md/nonlabtemplate/opendelete", + "#"+dialogDeleteBodyID, + "outerHTML", + "#dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + ) + + tableFilter := customtextfieldsearch.MainCustomTextFieldSearchV3(searchID, + "search", + "Cari Nama Template", + "text", + "/dev/md/nonlabtemplate/filter", + "input changed delay:500ms, search", + "#"+paginationID, + "#loadingcontent", "", + "outerHTML", + "#tableID, #paginationID, #searchID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + dev_mdnonlabtemplateview.BeforeRequestContent(), + dev_mdnonlabtemplateview.AfterRequestContent(), + ) + + tablePagination := pagination.PaginationV3(totalPage, + 1, + "/dev/md/nonlabtemplate/changepage", + paginationID, + "#tableID, #searchID, #"+searchID+", #paginationID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "#"+paginationID, + "outerHTML", "", "", + dev_mdnonlabtemplateview.BeforeRequestContent(), + dev_mdnonlabtemplateview.AfterRequestContent(), + ) + + content := dev_mdnonlabtemplateview.MDNonLabTemplateScreen( + tableID, + paginationID, + searchID, + dialogAddID, + dialogAddBodyID, + dialogEditID, + dialogEditBodyID, + dialogDeleteID, + dialogDeleteBodyID, + breadcrumbComp, + tableFilter, + tableComp, + tablePagination, + ) + css := dev_mdnonlabtemplateview.CSSMDNonLabTemplate() + js := dev_mdnonlabtemplateview.JSSMDNonLabTemplate() + + view := dev_mdnonlabtemplateview.ShowMDNonLabTemplate( + title, + content, + css, + js, + navbarmenuComp, + navbaruserComp, + sidebarusrComp, + ) + + return utils.View(c, view) +} + +func (mdnlt *MDNonLabTemplateHandler) HandleFilterMDNonLabTemplate(c echo.Context) error { + search := c.QueryParam("search") + searchID := c.QueryParam("searchID") + tableID := c.QueryParam("tableID") + paginationID := c.QueryParam("paginationID") + dialogEditBodyID := c.QueryParam("dialogEditBodyID") + dialogDeleteBodyID := c.QueryParam("dialogDeleteBodyID") + var retval []templ.Component + logger, _ := zap.NewProduction() + + dataList, totalPage, err := mdnlt.MDNonLabTemplateServices.GetMDNonLabTemplateData(search, 1, 5) + if err != nil { + defer logger.Sync() + logger.Info("ERROR GET DATA", zap.Any("error", err)) + return err + } + + tableComp := dev_mdnonlabtemplateview.TableNonLabTemplate(dataList, + tableID, + "/dev/md/nonlabtemplate/openedit", + "#"+dialogEditBodyID, + "outerHTML", + "#dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "/dev/md/nonlabtemplate/opendelete", + "#"+dialogDeleteBodyID, + "outerHTML", + "#dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + ) + + tablePagination := pagination.PaginationV3( + totalPage, + 1, + "/dev/md/nonlabtemplate/changepage", + paginationID, + "#tableID, #searchID, #"+searchID+", #paginationID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "#"+paginationID, + "outerHTML", "", "", + dev_mdnonlabtemplateview.BeforeRequestContent(), + dev_mdnonlabtemplateview.AfterRequestContent(), + ) + + retval = append(retval, tableComp) + retval = append(retval, tablePagination) + return utils.ViewMulti(c, retval) +} + +func (mdnlt *MDNonLabTemplateHandler) HandleChangePageMDNonLabTemplate(c echo.Context) error { + search := c.QueryParam("search") + pageparam := c.QueryParam("page") + tableID := c.QueryParam("tableID") + searchID := c.QueryParam("searchID") + paginationID := c.QueryParam("paginationID") + dialogEditBodyID := c.QueryParam("dialogEditBodyID") + dialogDeleteBodyID := c.QueryParam("dialogDeleteBodyID") + var retval []templ.Component + logger, _ := zap.NewProduction() + + page, err := strconv.Atoi(pageparam) + if err != nil { + defer logger.Sync() + logger.Info("ERROR CONVERT PAGE PARAM", zap.Any("page", page), zap.Any("error", err)) + return err + } + + dataList, totalPage, err := mdnlt.MDNonLabTemplateServices.GetMDNonLabTemplateData(search, page, 5) + if err != nil { + defer logger.Sync() + logger.Info("ERROR CONVERT PAGE PARAM", zap.Any("error", err)) + return err + } + + tableComp := dev_mdnonlabtemplateview.TableNonLabTemplate(dataList, + tableID, + "/dev/md/nonlabtemplate/openedit", + "#"+dialogEditBodyID, + "outerHTML", + "#dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "/dev/md/nonlabtemplate/opendelete", + "#"+dialogDeleteBodyID, + "outerHTML", + "#dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + ) + + tablePagination := pagination.PaginationV3( + totalPage, + page, + "/dev/md/nonlabtemplate/changepage", + paginationID, + "#tableID, #searchID, #"+searchID+", #paginationID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "#"+paginationID, + "outerHTML", "", "", + dev_mdnonlabtemplateview.BeforeRequestContent(), + dev_mdnonlabtemplateview.AfterRequestContent(), + ) + + retval = append(retval, tableComp) + retval = append(retval, tablePagination) + return utils.ViewMulti(c, retval) +} diff --git a/services/dev/md.nonlabtemplate.services.go b/services/dev/md.nonlabtemplate.services.go new file mode 100644 index 0000000..e04509d --- /dev/null +++ b/services/dev/md.nonlabtemplate.services.go @@ -0,0 +1,84 @@ +package dev_services + +import ( + "cpone/db" + "cpone/models" + dbx "cpone/package/database" + "fmt" + "math" + "strings" +) + +type MDNonLabTemplateServices struct { + MDNonLabTemplateStore db.AppStore +} + +func NewMDNonLabTemplateServices(uStore db.AppStore) *MDNonLabTemplateServices { + return &MDNonLabTemplateServices{ + MDNonLabTemplateStore: uStore, + } +} + +func (mdnlt *MDNonLabTemplateServices) GetMDNonLabTemplateBreadcrumb() (models.BreadCrumbV1, error) { + var ret models.BreadCrumbV1 + + breadcrumb := models.BreadCrumbV1{ + Title: "Master Non-lab Template", + Item: []models.ItemBreadCrumbV1{ + { + Item: "Dashboard", + Url: "/dev/dashboard", + }, + { + Item: "Master", + Url: "/dev/master", + }, + { + Item: "Non-lab Template", + Url: "", + }, + }, + } + + ret = breadcrumb + return ret, nil +} + +func (mdnlt *MDNonLabTemplateServices) GetMDNonLabTemplateData(search string, currentPage int, rowPerPage int) ([]models.MDNonLabTemplate, int, error) { + var ret []models.MDNonLabTemplate + var totalData int + + offset := (currentPage - 1) * rowPerPage + prm := "%" + strings.TrimSpace(search) + "%" + query := ` + SELECT COUNT(*) + FROM nonlab_template + WHERE NonlabTemplateIsActive = 'Y' + AND (NonlabTemplateName LIKE ?) + ` + if err := dbx.Handlex.Get(&totalData, query, prm); err != nil { + return nil, 0, fmt.Errorf("error querying databases: %v", err) + } + + query = ` + SELECT + NonlabTemplateID, + NonlabTemplateName, + NonlabTemplateFlagFisik, + NonlabTemplateIsActive, + NonlabTemplateCreated, + NonlabTemplateLastUpdated + FROM nonlab_template + WHERE NonlabTemplateIsActive = 'Y' + AND (NonlabTemplateName LIKE ?) + ORDER BY NonlabTemplateID ASC + LIMIT ? OFFSET ? + ` + if err := dbx.Handlex.Select(&ret, query, prm, rowPerPage, offset); err != nil { + return nil, 0, fmt.Errorf("error querying database: %v", err) + } + + totalPage := int(math.Ceil(float64(totalData) / float64(rowPerPage))) + + return ret, totalPage, nil +} diff --git a/views/dev/mdnonlabtemplate/mdnonlabtemplate.templ b/views/dev/mdnonlabtemplate/mdnonlabtemplate.templ index 44a7b4f..a2d5a0c 100644 --- a/views/dev/mdnonlabtemplate/mdnonlabtemplate.templ +++ b/views/dev/mdnonlabtemplate/mdnonlabtemplate.templ @@ -2,7 +2,6 @@ package dev_mdnonlabtemplateview import "cpone/component/customtextfield" import "cpone/models" -import "cpone/component/table" import "cpone/layout" templ MDNonLabTemplateScreen( @@ -82,11 +81,11 @@ templ MDNonLabTemplateScreen( @filterComponent