diff --git a/handlers/dev/md.nonlabtemplate.handlers.go b/handlers/dev/md.nonlabtemplate.handlers.go index 2ee0a8b..4becc08 100644 --- a/handlers/dev/md.nonlabtemplate.handlers.go +++ b/handlers/dev/md.nonlabtemplate.handlers.go @@ -24,6 +24,8 @@ type MDNonLabTemplateServices interface { GetMDNonLabTemplateData(search string, currentPage int, rowPerPage int) ([]models.MDNonLabTemplate, int, error) DeleteDataMDNLT(id string) (models.MDNonLabTemplate, error) GetMDNonLabTemplateByID(id string) (models.MDNonLabTemplate, error) + SaveInMemoryDetail(kode string, name string) (models.MDNonLabTemplateDetail, error) + ListMemoryDetail() ([]models.MDNonLabTemplateDetail, error) } type MDNonLabTemplateHandler struct { @@ -123,6 +125,101 @@ func (mdnlt *MDNonLabTemplateHandler) HandleShowMDNonLabTemplateScreen(c echo.Co dev_mdnonlabtemplateview.AfterRequestContent(), ) + // modal add detail + // detailAddID := utils.GenerateRandomID("detailaddID") + tableDetailID := utils.GenerateRandomID("tabledetailID") + btnAddNamaID := utils.GenerateRandomID("btnaddnamaID") + btnAddDetailID := utils.GenerateRandomID("btnaddDetailID") + tableDetailPaginationID := utils.GenerateRandomID("tabledetailpaginationID") + // dialogDetailEditID := utils.GenerateRandomID("dialogeditid") + dialogDetailEditBodyID := utils.GenerateRandomID("dialogeditbodyid") + // dialogDetailDeleteID := utils.GenerateRandomID("dialogdeleteid") + dialogDetailDeleteBodyID := utils.GenerateRandomID("dialogdeletebodyid") + + btnSimpanDetail := dev_mdnonlabtemplateview.BtnAddDetail() + var listDetaill []models.MDNonLabTemplateDetail + tableDetail := dev_mdnonlabtemplateview.TableDetail(listDetaill, + tableDetailID, + "/dev/md/nonlabtemplate/detailedit", + "#"+dialogDetailEditBodyID, + "outerHTML", + "#dialogDetailEditBodyID, #dialogDetailEditID, #dialogDetailDeleteBodyID, #dialogDetailDeleteID", + "/dev/md/nonlabtemplate/detaildelete", + "#"+dialogDetailDeleteBodyID, + "outerHTML", + "#dialogDetailEditBodyID, #dialogDetailEditID, #dialogDetailDeleteBodyID, #dialogDetailDeleteID", + ) + + dialogAddBodyComp := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( + dialogAddBodyID, + models.CustomTextFieldv2Prm{ + Label: "Non Lab Template Name", + Name: "nonlabtemplateid", + Placeholder: "Non Lab Template Name", + Type: "hidden", + ID: "nonlabtemplateid", + }, + models.CustomTextFieldv2Prm{ + Label: "Template Name", + Name: "nonlabtemplatename", + Placeholder: "Template Name", + Type: "text", + ID: "nonlabtemplatename", + }, + models.CustomCheckboxv1Prm{ + Name: "nonlabtemplateflag", + ID: "nonlabtemplateflag", + Text: "Template Fisik", + Value: "N", + }, + models.CustomTextFieldv2Prm{ + // Label: "Template Name", + Name: "nonlabtemplatedetailkode", + Placeholder: "Kode", + Type: "text", + ID: "nonlabtemplatedetailkode", + }, + models.CustomTextFieldv2Prm{ + // Label: "Template Name", + Name: "nonlabtemplatedetailname", + Placeholder: "Detail Name", + Type: "text", + ID: "nonlabtemplatedetailname", + }, + btnSimpanDetail, + tableDetail, + dev_mdnonlabtemplateview.JSHideModal(""), + ) + + modalActioAddComp := dev_mdnonlabtemplateview.ActionFormMDNLT( + "/dev/md/nonlabtemplate/closeaddform", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + ) + + btnCloseModalAdd := dev_mdnonlabtemplateview.BtnCloseFormMDNLT( + "/dev/md/nonlabtemplate/closeaddform", + "#"+dialogAddBodyID, + "outerHTML", + "#"+dialogAddID, + ) + + modalAddFormComponent := dev_mdnonlabtemplateview.NonLabTemplateModalForm( + models.MDNonLabTemplateForm{ + IDComponent: "formnonlabtemplate", + Link: "/dev/md/nonlabtemplate/add", + HxTarget: "#" + dialogAddBodyID, + HxSwap: "outerHTML", + HxInclude: "#tableID, #paginationID, #searchID, #dialogAddBodyID, #dialogAddID, #dialogDeleteBodyID, #dialogEditBodyID, #" + searchID + ", #currpage" + paginationID, + ModalID: dialogAddID, + ModalTitle: "New - Nonlab Template", + DialogBody: dialogAddBodyComp, + DialogAction: modalActioAddComp, + ButtonCLose: btnCloseModalAdd, + }, + ) + // modal delete form dialogDeleteComp := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( dialogDeleteBodyID, @@ -141,11 +238,27 @@ func (mdnlt *MDNonLabTemplateHandler) HandleShowMDNonLabTemplateScreen(c echo.Co ID: "nonlabtemplatename", }, models.CustomCheckboxv1Prm{ - Label: "Non Lab Template Flag Fisik", Name: "nonlabtemplateflag", ID: "nonlabtemplateflag", + Text: "Template Fisik", Value: "N", }, + models.CustomTextFieldv2Prm{ + // Label: "Template Name", + Name: "nonlabtemplatedetailkode", + Placeholder: "Kode", + Type: "text", + ID: "nonlabtemplatedetailkode", + }, + models.CustomTextFieldv2Prm{ + // Label: "Template Name", + Name: "nonlabtemplatedetailname", + Placeholder: "Detail Name", + Type: "text", + ID: "nonlabtemplatedetailname", + }, + btnSimpanDetail, + tableDetail, dev_mdnonlabtemplateview.JSHideModal(""), ) @@ -188,10 +301,15 @@ func (mdnlt *MDNonLabTemplateHandler) HandleShowMDNonLabTemplateScreen(c echo.Co dialogEditBodyID, dialogDeleteID, dialogDeleteBodyID, + btnAddNamaID, + btnAddDetailID, + tableDetailID, + tableDetailPaginationID, breadcrumbComp, tableFilter, tableComp, tablePagination, + modalAddFormComponent, modalDeleteFormComponent, ) css := dev_mdnonlabtemplateview.CSSMDNonLabTemplate() @@ -310,6 +428,76 @@ func (mdnlt *MDNonLabTemplateHandler) HandleChangePageMDNonLabTemplate(c echo.Co return utils.ViewMulti(c, retval) } +// handle add +func (mdnlt *MDNonLabTemplateHandler) HandleCloseFormAdd(c echo.Context) error { + // logger, _ := zap.NewProduction() + dialogAddBodyID := c.FormValue("dialogAddBodyID") + // detailAddID := c.FormValue("detailAddID") + + tableDetailID := utils.GenerateRandomID("tabledetailID") + // dialogDetailEditID := utils.GenerateRandomID("dialogeditid") + dialogDetailEditBodyID := utils.GenerateRandomID("dialogeditbodyid") + // dialogDetailDeleteID := utils.GenerateRandomID("dialogdeleteid") + dialogDetailDeleteBodyID := utils.GenerateRandomID("dialogdeletebodyid") + + btnSimpanDetail := dev_mdnonlabtemplateview.BtnAddDetail() + + var listDetaill []models.MDNonLabTemplateDetail + tableDetail := dev_mdnonlabtemplateview.TableDetail(listDetaill, + tableDetailID, + "/dev/md/nonlabtemplate/detailedit", + "#"+dialogDetailEditBodyID, + "outerHTML", + "#dialogDetailEditBodyID, #dialogDetailEditID, #dialogDetailDeleteBodyID, #dialogDetailDeleteID", + "/dev/md/nonlabtemplate/detaildelete", + "#"+dialogDetailDeleteBodyID, + "outerHTML", + "#dialogDetailEditBodyID, #dialogDetailEditID, #dialogDetailDeleteBodyID, #dialogDetailDeleteID", + ) + + newForm := dev_mdnonlabtemplateview.BodyFormMDNonlabTemplate( + dialogAddBodyID, + models.CustomTextFieldv2Prm{ + Label: "Non Lab Template Name", + Name: "nonlabtemplateid", + Placeholder: "Non Lab Template Name", + Type: "hidden", + ID: "nonlabtemplateid", + }, + models.CustomTextFieldv2Prm{ + Label: "Non Lab Template Name", + Name: "nonlabtemplatename", + Placeholder: "Non Lab Template Name", + Type: "text", + ID: "nonlabtemplatename", + }, + models.CustomCheckboxv1Prm{ + Name: "nonlabtemplateflag", + ID: "nonlabtemplateflag", + Text: "Template Fisik", + Value: "N", + }, + models.CustomTextFieldv2Prm{ + // Label: "Template Name", + Name: "nonlabtemplatedetailkode", + Placeholder: "Kode", + Type: "text", + ID: "nonlabtemplatedetailkode", + }, + models.CustomTextFieldv2Prm{ + // Label: "Template Name", + Name: "nonlabtemplatedetailname", + Placeholder: "Detail Name", + Type: "text", + ID: "nonlabtemplatedetailname", + }, + btnSimpanDetail, + tableDetail, + dev_mdnonlabtemplateview.JSHideModal(""), + ) + return utils.View(c, newForm) +} + // handle delete func (mdnlt *MDNonLabTemplateHandler) HandleOpenFormDelete(c echo.Context) error { id := c.QueryParam("id") @@ -438,3 +626,57 @@ func (mdnlt *MDNonLabTemplateHandler) HandleDeleteMDNLT(c echo.Context) error { return utils.ViewMulti(c, retVal) } + +func (mdnlt *MDNonLabTemplateHandler) HandleAddDetail(c echo.Context) error { + logger, _ := zap.NewProduction() + defer logger.Sync() + + nonlabtemplatedetailkode := c.FormValue("nonlabtemplatedetailkode") + nonlabtemplatedetailname := c.FormValue("nonlabtemplatedetailname") + + tableDetailID := c.FormValue("tableDetailID") + // dialogDetailEditID := utils.GenerateRandomID("dialogeditid") + dialogDetailEditBodyID := utils.GenerateRandomID("dialogeditbodyid") + // dialogDetailDeleteID := utils.GenerateRandomID("dialogdeleteid") + dialogDetailDeleteBodyID := utils.GenerateRandomID("dialogdeletebodyid") + + respAdd, err := mdnlt.MDNonLabTemplateServices.SaveInMemoryDetail(nonlabtemplatedetailkode, nonlabtemplatedetailname) + if err != nil { + return err + } + + logger.Info("response save memory", zap.Any("return", respAdd)) + + updatedTable, err := mdnlt.MDNonLabTemplateServices.ListMemoryDetail() + if err != nil { + return err + } + + tableComponent := dev_mdnonlabtemplateview.TableDetail(updatedTable, + tableDetailID, + "/dev/md/nonlabtemplate/detailedit", + "#"+dialogDetailEditBodyID, + "outerHTML", + "#dialogDetailEditBodyID, #dialogDetailEditID, #dialogDetailDeleteBodyID, #dialogDetailDeleteID", + "/dev/md/nonlabtemplate/detaildelete", + "#"+dialogDetailDeleteBodyID, + "outerHTML", + "#dialogDetailEditBodyID, #dialogDetailEditID, #dialogDetailDeleteBodyID, #dialogDetailDeleteID", + ) + + return utils.View(c, tableComponent) +} + +func (mdnlt *MDNonLabTemplateHandler) HandleAddNama(c echo.Context) error { + logger, _ := zap.NewProduction() + + nama := c.FormValue("nonlabtemplatename") + fisik := c.FormValue("nonlabtemplateflag") + + logger.Info("Test Button Add nama", + zap.Any("nama", nama), + zap.Any("flag", fisik), + ) + + return nil +} diff --git a/handlers/routes.go b/handlers/routes.go index e91cb46..80d2ac0 100644 --- a/handlers/routes.go +++ b/handlers/routes.go @@ -287,6 +287,8 @@ func SetupRoutesDev(app *echo.Echo, appStore db.AppStore) { dev.GET("/md/nonlabtemplate/opendelete", devMDMRNonLabTemplateHandler.HandleOpenFormDelete) dev.POST("/md/nonlabtemplate/closedeleteform", devMDMRNonLabTemplateHandler.HandleCloseFormDelete) dev.POST("/md/nonlabtemplate/delete", devMDMRNonLabTemplateHandler.HandleDeleteMDNLT) + dev.POST("/md/nonlabtemplate/closeaddform", devMDMRNonLabTemplateHandler.HandleCloseFormAdd) + dev.POST("/md/nonlabtemplate/addnama", devMDMRNonLabTemplateHandler.HandleAddNama) // masterdata nat unit devMdNatUnitServices := dev_services.NewMdNatUnitServices(appStore) diff --git a/models/mdnonlabtemplate.models.go b/models/mdnonlabtemplate.models.go index 09df2ad..8d5b509 100644 --- a/models/mdnonlabtemplate.models.go +++ b/models/mdnonlabtemplate.models.go @@ -15,6 +15,21 @@ type MDNonLabTemplate struct { NonlabTemplateDeleteUserID string `db:"NonlabTemplateDeleteUserID"` } +type MDNonLabTemplateDetail struct { + NonlabTemplateDetailID int `db:"NonlabTemplateDetailID"` + NonlabTemplateDetailNonlabTemplateID int `db:"NonlabTemplateDetailNonlabTemplateID"` + NonlabTemplateDetailCode string `db:"NonlabTemplateDetailCode"` + NonlabTemplateDetailName string `db:"NonlabTemplateDetailName"` + NonlabTemplateDetailFlagActive string `db:"NonlabTemplateDetailFlagActive"` + NonlabTemplateDetailIsActive string `db:"NonlabTemplateDetailIsActive"` +} + +type InputDetailNonLabTemplate struct { + NonLabTemplateName string `db:"NonlabTemplateName"` + NonLabTemplateFlagFisik string `db:"NonlabTemplateFlagFisik"` + NonLabTemplatDetail []MDNonLabTemplateDetail +} + type MDNonLabTemplateForm struct { IDComponent string Link string diff --git a/services/dev/md.nonlabtemplate.services.go b/services/dev/md.nonlabtemplate.services.go index 282a03e..4b55675 100644 --- a/services/dev/md.nonlabtemplate.services.go +++ b/services/dev/md.nonlabtemplate.services.go @@ -6,6 +6,7 @@ import ( dbx "cpone/package/database" "fmt" "math" + "strconv" "strings" "go.uber.org/zap" @@ -13,11 +14,34 @@ import ( type MDNonLabTemplateServices struct { MDNonLabTemplateStore db.AppStore + DetailStore []models.MDNonLabTemplateDetail + addChan chan models.MDNonLabTemplateDetail + delChan chan models.MDNonLabTemplateDetail } func NewMDNonLabTemplateServices(uStore db.AppStore) *MDNonLabTemplateServices { - return &MDNonLabTemplateServices{ + aChan := make(chan models.MDNonLabTemplateDetail) + dChan := make(chan models.MDNonLabTemplateDetail) + + serv := MDNonLabTemplateServices{ MDNonLabTemplateStore: uStore, + DetailStore: []models.MDNonLabTemplateDetail{}, + addChan: aChan, + delChan: dChan, + } + + go serv.runner() + return &serv +} + +func (mdnlt *MDNonLabTemplateServices) runner() { + for { + select { + case x := <-mdnlt.addChan: + mdnlt.DetailStore = append(mdnlt.DetailStore, x) + case y := <-mdnlt.delChan: + mdnlt.DetailStore = append(mdnlt.DetailStore, y) + } } } @@ -112,6 +136,109 @@ func (mdnlt *MDNonLabTemplateServices) GetMDNonLabTemplateByID(id string) (model return ret, nil } +func (mdnlt *MDNonLabTemplateServices) GetListingDetailByID(id string) ([]models.MDNonLabTemplateDetail, error) { + logger, _ := zap.NewProduction() + var ret []models.MDNonLabTemplateDetail + + q := ` + SELECT + NonlabTemplateDetailID, + NonlabTemplateDetailNonlabTemplateID, + NonlabTemplateDetailCode, + NonlabTemplateDetailName, + NonlabTemplateDetailIsActive + FROM nonlab_template_detail + WHERE NonlabTemplateDetailIsActive = 'Y' + AND NonlabTemplateDetailNonlabTemplateID = ? + ` + + if err := dbx.Handlex.Select(&ret, q, id); err != nil { + defer logger.Sync() + logger.Error("Error get detail", + zap.String("ID", id), + zap.Error(err), + ) + return nil, fmt.Errorf("error get list detail: %v", err) + } + + return ret, nil +} + +func (mdnlt *MDNonLabTemplateServices) AddDataMDNLT(input models.InputDetailNonLabTemplate) (models.MDNonLabTemplate, error) { + logger, _ := zap.NewProduction() + var ret models.MDNonLabTemplate + + // cek duplicate non lab template name + var count int + prm := "%" + input.NonLabTemplateName + "%" + q := `SELECT COUNT(*) FROM nonlab_template WHERE NonlabTemplateIsActive = 'Y' AND NonlabTemplateName LIKE ?` + err := dbx.Handlex.Get(&count, q, prm) + if err != nil { + defer logger.Sync() + logger.Error("cek duplicate", zap.Any("name", input.NonLabTemplateName)) + return ret, fmt.Errorf("query failed to cek duplicate") + } + if count > 0 { + defer logger.Sync() + logger.Error("duplicate data", zap.Any("name", input.NonLabTemplateName)) + return ret, fmt.Errorf("duplicate code or name") + } + + // insert data + tx, err := dbx.Handlex.Beginx() + if err != nil { + return ret, err + } + defer tx.Rollback() + + qnlt := ` + INSERT INTO nonlab_template ( + NonlabTemplateName, + NonlabTemplateFlagFisik, + NonlabTemplateCreated + ) VALUES (?,?,NOW()); + ` + rsp := tx.MustExec(qnlt, input.NonLabTemplateName, input.NonLabTemplateFlagFisik) + insertedID, err := rsp.LastInsertId() + if err != nil { + defer logger.Sync() + logger.Error("failed insert data template", zap.Any("name", input.NonLabTemplateName), zap.Any("flag fisik", input.NonLabTemplateFlagFisik)) + return ret, fmt.Errorf("query failed insert data template") + } + + qry, err := tx.Preparex(` + INSERT INTO nonlab_template_detail ( + NonlabTemplateDetailNonlabTemplateID, + NonlabTemplateDetailCode, + NonlabTemplateDetailName, + NonlabTemplateDetailFlagActive + ) VALUES (?,?,?,?) + `) + if err != nil { + return ret, fmt.Errorf("query failed: %v", err) + } + defer qry.Close() + + for _, detail := range input.NonLabTemplatDetail { + _, err := qry.Exec( + insertedID, + detail.NonlabTemplateDetailCode, + detail.NonlabTemplateDetailName, + detail.NonlabTemplateDetailFlagActive, + ) + if err != nil { + return ret, fmt.Errorf("query insert detail failed: %v", err) + } + } + + if err := tx.Commit(); err != nil { + return ret, fmt.Errorf("commit query failed: %v", err) + } + + s := strconv.Itoa(int(insertedID)) + return mdnlt.GetMDNonLabTemplateByID(s) +} + func (mdnlt *MDNonLabTemplateServices) DeleteDataMDNLT(id string) (models.MDNonLabTemplate, error) { logger, _ := zap.NewProduction() var ret models.MDNonLabTemplate @@ -133,3 +260,18 @@ func (mdnlt *MDNonLabTemplateServices) DeleteDataMDNLT(id string) (models.MDNonL return mdnlt.GetMDNonLabTemplateByID(id) } + +func (mdnlt *MDNonLabTemplateServices) SaveInMemoryDetail(kode string, name string) (models.MDNonLabTemplateDetail, error) { + data := models.MDNonLabTemplateDetail{ + NonlabTemplateDetailCode: kode, + NonlabTemplateDetailName: name, + } + + mdnlt.addChan <- data + + return data, nil +} + +func (mdnlt *MDNonLabTemplateServices) ListMemoryDetail() ([]models.MDNonLabTemplateDetail, error) { + return mdnlt.DetailStore, nil +} diff --git a/views/dev/mdnonlabtemplate/mdnonlabtemplate.templ b/views/dev/mdnonlabtemplate/mdnonlabtemplate.templ index f56f6c9..c721aaa 100644 --- a/views/dev/mdnonlabtemplate/mdnonlabtemplate.templ +++ b/views/dev/mdnonlabtemplate/mdnonlabtemplate.templ @@ -14,10 +14,15 @@ templ MDNonLabTemplateScreen( dialogEditBodyID string, dialogDeleteID string, dialogDeleteBodyID string, + btnAddNamaID string, + btnAddDetailID string, + tableDetailID string, + tableDetailPaginationID string, breadcrumb templ.Component, filterComponent templ.Component, tableComponent templ.Component, paginationComponent templ.Component, + modalAddForm templ.Component, modalDeleteForm templ.Component, ) {