diff --git a/handlers/dev/mastermenuuser.handlers.go b/handlers/dev/mastermenuuser.handlers.go index dfcfee2..ed64b71 100644 --- a/handlers/dev/mastermenuuser.handlers.go +++ b/handlers/dev/mastermenuuser.handlers.go @@ -13,7 +13,9 @@ import ( mastermenuuser "cpone/views/dev/mastermenuuser" mastermenuusergroup "cpone/views/dev/mastermenuusergroup" "fmt" + "strconv" + "github.com/a-h/templ" "github.com/labstack/echo/v4" "go.uber.org/zap" ) @@ -27,8 +29,9 @@ type MasterMenuUserService interface { // AddUserGroup(code string, name string) (models.UserGroupV1, error) // EditUserGroup(id string, code string, name string) (models.UserGroupV1, error) // DeleteUserGroup(id string) (models.UserGroupV1, error) - GetListMasterUserV2(search string, currentPage int, rowPerPage int) ([]models.MasterUser, int, error) + GetListMasterUserV2(search string, usergroup string, currentPage int, rowPerPage int) ([]models.MasterUser, int, error) // GetUserGroupByIDV1(id string) (models.UserGroupV1, error) + GetUserGroupData() ([]models.UserGroupV1, error) } func NewMasterMenuUserHandler(us MasterMenuUserService) *MasterMenuUserHandler { @@ -41,6 +44,65 @@ type MasterMenuUserHandler struct { MasterMenuUserService MasterMenuUserService } +// PAGINATION +func (lh *MasterMenuUserHandler) HandlerShowMasterMenuUserPaginationV1(c echo.Context) error { + logger, _ := zap.NewProduction() + + search := c.QueryParam("search") + usergroup := c.QueryParam("usergroup") + pageparam := c.QueryParam("page") + tableID := c.QueryParam("tableID") + searchID := c.QueryParam("searchID") + + dropdownID := c.QueryParam("dropdownID") + paginationID := c.QueryParam("paginationID") + dialogEditBodyID := c.QueryParam("dialogEditBodyID") + // dialogEditID := c.QueryParam("dialogEditID") + dialogDeleteBodyID := c.QueryParam("dialogDeleteBodyID") + // dialogDeleteID := c.QueryParam("dialogDeleteID") + 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 + } + + dataUserGroup, totalpage, err := lh.MasterMenuUserService.GetListMasterUserV2(search, usergroup, page, 5) + if err != nil { + defer logger.Sync() + logger.Info("ERROR GET USER GROUP", + zap.Any("error", err), + ) + fmt.Println(dataUserGroup) + return err + } + + contentUserGroupComponent := mastermenuuser.TableUser( + dataUserGroup, tableID, "/dev/usergroupshoweditform", + "#"+dialogEditBodyID, + "outerHTML", + "#dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "/dev/usergroupshowdeleteform", + "#"+dialogDeleteBodyID, + "outerHTML", + "#dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #dialogEditID") + + userGroupPaginationComponent := pagination.PaginationV2(totalpage, + page, + "/dev/userv1pagination", + paginationID, + // "#tableID, #searchID, #"+searchID+", #dropdownID, #"+dropdownID+", #paginationID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID, [name='search'], [name='usergroup']", + "#tableID, #searchID, #"+searchID+", #dropdownID, #"+dropdownID+", #paginationID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID, [name='search'], [name='usergroup']", + "#"+paginationID, "outerHTML", "", "") + + retval := []templ.Component{contentUserGroupComponent, userGroupPaginationComponent} + + return utils.ViewMulti(c, retval) +} + // LISTING FUNCTION INITIAL func (lh *MasterMenuUserHandler) HandlerShowMasterMenuUserV1(c echo.Context) error { @@ -64,7 +126,26 @@ func (lh *MasterMenuUserHandler) HandlerShowMasterMenuUserV1(c echo.Context) err return err } - dataUserGroup, totalpage, err := lh.MasterMenuUserService.GetListMasterUserV2("", 1, 5) + // dropdownUserGroupInitial := + + dataUserMasterInitialSelected, err := lh.MasterMenuUserService.GetUserGroupData() + fmt.Println(dataUserMasterInitialSelected) + fmt.Println(err) + if err != nil { + defer logger.Sync() + logger.Info("ERROR LIST USER MASTER Selected DEV", + zap.Any("error", err), + ) + fmt.Println(dataUserMasterInitialSelected) + return err + } + + var initialSelectedUserGroup string = "0" + if len(dataUserMasterInitialSelected) > 0 { + initialSelectedUserGroup = strconv.Itoa(dataUserMasterInitialSelected[0].M_UserGroupID) + } + + dataUserGroup, totalpage, err := lh.MasterMenuUserService.GetListMasterUserV2("", initialSelectedUserGroup, 1, 5) if err != nil { defer logger.Sync() logger.Info("ERROR GET USER GROUP", @@ -157,14 +238,15 @@ func (lh *MasterMenuUserHandler) HandlerShowMasterMenuUserV1(c echo.Context) err //filter user search component // customtextfieldsearch.MainCustomTextFieldSearchV1("#"+contentIDSearch, "q", "Cari Nama Staff / Email", "text", "/dev/searchuserv1?"+link, "input changed delay:500ms, search", "#"+contentID, "#indicator", "", contentIDHtmxExtension, "[name='usergroup']") - userFilterComp := customtextfieldsearch.MainCustomTextFieldSearchV2(searchID, + userFilterComp := customtextfieldsearch.MainCustomTextFieldSearchV2( + searchID, "search", "Cari Nama Staff / Email", "text", - "/dev/searchusergroupv1", + "/dev/searchuserv1", "input changed delay:500ms, search", "#"+paginationID, "", "", "outerHTML", - "#tableID, #paginationID, #searchID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID, [name='usergroup']") + "#tableID, #paginationID, #searchID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID, #dropdownID, [name='usergroup']") // filter user group dropdown listItemComponent := mastermenuuser.ItemDropdown(dataUserGroupAll) @@ -174,8 +256,8 @@ func (lh *MasterMenuUserHandler) HandlerShowMasterMenuUserV1(c echo.Context) err "#"+paginationID, "/dev/searchuserv1", "", - "change from:select[name='usergroup']", - "[name='search']", + "change from:select[name='usergroup'], input changed from:input[name='search']", + "#tableID, #paginationID, #searchID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID, #dropdownID, [name='search']", listItemComponent, ) @@ -183,9 +265,9 @@ func (lh *MasterMenuUserHandler) HandlerShowMasterMenuUserV1(c echo.Context) err userGroupPaginationComponent := pagination.PaginationV2( totalpage, 1, - "/dev/usergroupv1pagination", + "/dev/userv1pagination", paginationID, - "#tableID, #searchID, #"+searchID+", #paginationID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "#tableID, #searchID, #"+searchID+", #dropdownID, #"+dropdownID+", #paginationID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID, [name='search'], [name='usergroup']", "#"+paginationID, "outerHTML", "", "", ) @@ -223,3 +305,59 @@ func (lh *MasterMenuUserHandler) HandlerShowMasterMenuUserV1(c echo.Context) err return utils.View(c, si) } + +// SEARCH PROSES +func (lh *MasterMenuUserHandler) HandlerShowMasterMenuUserSearchV1(c echo.Context) error { + search := c.QueryParam("search") + usergroup := c.QueryParam("usergroup") + searchID := c.QueryParam("searchID") + dropdownID := c.QueryParam("dropdownID") + tableID := c.QueryParam("tableID") + paginationID := c.QueryParam("paginationID") + dialogEditBodyID := c.QueryParam("dialogEditBodyID") + // dialogEditID := c.QueryParam("dialogEditID") + dialogDeleteBodyID := c.QueryParam("dialogDeleteBodyID") + // dialogDeleteID := c.QueryParam("dialogDeleteID") + + logger, _ := zap.NewProduction() + + dataUserGroup, totalpage, err := lh.MasterMenuUserService.GetListMasterUserV2(search, usergroup, 1, 5) + if err != nil { + defer logger.Sync() + logger.Info("ERROR GET USER GROUP", + zap.Any("error", err), + ) + fmt.Println(dataUserGroup) + return err + } + + // totalPages := int(math.Ceil(float64(len(dataUserGroupFiltered)) / float64(rowPerPage))) + + contentUserGroupComponent := mastermenuuser.TableUser( + dataUserGroup, tableID, "/dev/usergroupshoweditform", + "#"+dialogEditBodyID, + "outerHTML", + "#dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID", + "/dev/usergroupshowdeleteform", + "#"+dialogDeleteBodyID, + "outerHTML", + "#dialogDeleteBodyID, #dialogDeleteID, #dialogEditBodyID, #dialogEditID") + + userGroupPaginationComponent := pagination.PaginationV2(totalpage, + 1, + "/dev/userv1pagination", + paginationID, + "#tableID, #searchID, #"+searchID+", #dropdownID, #"+dropdownID+", #paginationID, #dialogEditBodyID, #dialogEditID, #dialogDeleteBodyID, #dialogDeleteID, [name='search'], [name='usergroup']", + "#"+paginationID, + "outerHTML", + "", + "", + ) + + // swapTable := + // mastermenuusergroup.SwapTableUserGroup(userGroupPaginationComponent, contentUserGroupComponent) + retval := []templ.Component{contentUserGroupComponent, userGroupPaginationComponent} + + return utils.ViewMulti(c, retval) + // return utils.View(c, si) +} diff --git a/handlers/routes.go b/handlers/routes.go index 59992ec..fb64f5e 100644 --- a/handlers/routes.go +++ b/handlers/routes.go @@ -236,5 +236,7 @@ func SetupRoutesDev(app *echo.Echo, appStore db.AppStore) { devUSServices := dev_services.NewServicesMasterMenuUser(appStore) devUShandlers := dev_handlers.NewMasterMenuUserHandler(devUSServices) dev.GET("/userv1", devUShandlers.HandlerShowMasterMenuUserV1) + dev.GET("/searchuserv1", devUShandlers.HandlerShowMasterMenuUserSearchV1) + dev.GET("/userv1pagination", devUShandlers.HandlerShowMasterMenuUserPaginationV1) // dev.GET("/breadcrumbv1", devUShandlers) } diff --git a/services/dev/mastermenuuser.services.go b/services/dev/mastermenuuser.services.go index 22192e0..060e74d 100644 --- a/services/dev/mastermenuuser.services.go +++ b/services/dev/mastermenuuser.services.go @@ -804,27 +804,71 @@ func (su *ServicesMasterMenuUser) GetListMasterUserGroupSearch() ([]models.UserG } // versi 2 -func (su *ServicesMasterMenuUser) GetListMasterUserV2(search string, currentPage int, rowPerPage int) ([]models.MasterUser, int, error) { +func (su *ServicesMasterMenuUser) GetUserGroupData() ([]models.UserGroupV1, error) { + + logger, _ := zap.NewProduction() + defer logger.Sync() + + var userList []models.UserGroupV1 + + queryList := ` + SELECT * + FROM m_usergroup + WHERE M_UserGroupIsActive = 'Y' + order by M_UserGroupID ASC + LIMIT 0, 1 + ` + + logger.Info("QUERY SEARCH INITIAL DATA USERGROUP", + zap.String("query search", queryList), + ) + + if err := dbx.Handlex.Select(&userList, queryList); err != nil { + return nil, fmt.Errorf("error querying database initial USERGROUP: %v", err) + } + + return userList, nil +} + +func (su *ServicesMasterMenuUser) GetListMasterUserV2(search string, usergroup string, currentPage int, rowPerPage int) ([]models.MasterUser, int, error) { + + logger, _ := zap.NewProduction() + defer logger.Sync() + var userList []models.MasterUser var totalData int offset := (currentPage - 1) * rowPerPage + var searchUserGroup string = "" + if usergroup != "0" { + searchUserGroup = usergroup + } + prm := "%" + strings.TrimSpace(search) + "%" - querytotal := ` + + // search dropdown dan inputan search + if usergroup != "0" { + querytotal := ` SELECT COUNT(*) FROM m_user JOIN m_usergroup ON M_UserM_UserGroupID = M_UserGroupID AND M_UserIsActive = 'Y' AND M_UserGroupIsActive = 'Y' - AND (M_UserGroupCode LIKE ? OR M_UserGroupName LIKE ?) + AND (M_UserFullName LIKE ? OR M_UserEmail LIKE ?) + AND M_UserGroupID = ? JOIN r_reportgroup ON M_UserR_ReportGroupID = R_ReportGroupID AND R_ReportGroupIsActive = 'Y' ` - if err := dbx.Handlex.Get(&totalData, querytotal, prm, prm); err != nil { - return nil, 0, fmt.Errorf("error querying database: %v", err) - } - query := ` + + logger.Info("QUERY SEARCH INITIAL TOTAL COUNT", + zap.String("query search", querytotal), + ) + + if err := dbx.Handlex.Get(&totalData, querytotal, prm, prm, searchUserGroup); err != nil { + return nil, 0, fmt.Errorf("error querying database: %v", err) + } + query := ` SELECT ROW_NUMBER() OVER () AS nomor, M_UserID, @@ -851,7 +895,8 @@ func (su *ServicesMasterMenuUser) GetListMasterUserV2(search string, currentPage ON M_UserM_UserGroupID = M_UserGroupID AND M_UserIsActive = 'Y' AND M_UserGroupIsActive = 'Y' - AND (M_UserGroupCode LIKE ? OR M_UserGroupName LIKE ?) + AND (M_UserFullName LIKE ? OR M_UserEmail LIKE ?) + AND M_UserGroupID = ? JOIN r_reportgroup ON M_UserR_ReportGroupID = R_ReportGroupID AND R_ReportGroupIsActive = 'Y' @@ -859,9 +904,79 @@ func (su *ServicesMasterMenuUser) GetListMasterUserV2(search string, currentPage LIMIT ? OFFSET ? ` - if err := dbx.Handlex.Select(&userList, query, prm, prm, rowPerPage, offset); err != nil { - return nil, 0, fmt.Errorf("error querying database: %v", err) + logger.Info("QUERY SEARCH INITIAL", + zap.String("query search", query), + ) + + if err := dbx.Handlex.Select(&userList, query, prm, prm, searchUserGroup, rowPerPage, offset); err != nil { + return nil, 0, fmt.Errorf("error querying database: %v", err) + } + } else { + // search hanya inputan search + querytotal := ` + SELECT COUNT(*) + FROM m_user + JOIN m_usergroup + ON M_UserM_UserGroupID = M_UserGroupID + AND M_UserIsActive = 'Y' + AND M_UserGroupIsActive = 'Y' + AND (M_UserFullName LIKE ? OR M_UserEmail LIKE ?) + JOIN r_reportgroup + ON M_UserR_ReportGroupID = R_ReportGroupID + AND R_ReportGroupIsActive = 'Y' + ` + + logger.Info("QUERY SEARCH INITIAL TOTAL COUNT", + zap.String("query search", querytotal), + ) + + if err := dbx.Handlex.Get(&totalData, querytotal, prm, prm); err != nil { + return nil, 0, fmt.Errorf("error querying database: %v", err) + } + query := ` + SELECT + ROW_NUMBER() OVER () AS nomor, + M_UserID, + IFNULL(M_UserEmail, '') AS M_UserEmail, + IFNULL(M_UserFullName, '') AS M_UserFullName, + IFNULL(M_UserLastAccess, '') AS M_UserLastAccess, + IFNULL(M_UserIsLoggedIn, '') AS M_UserIsLoggedIn, + IFNULL(M_UserActiveToken, '') AS M_UserActiveToken, + IFNULL(M_UserExpiredToken, '') AS M_UserExpiredToken, + IFNULL(M_UserIsActive, '') AS M_UserIsActive, + IFNULL(M_UserCreated, '') AS M_UserCreated, + IFNULL(M_UserCreatedUserID, '') AS M_UserCreatedUserID, + IFNULL(M_UserLastUpdated, '') AS M_UserLastUpdated, + IFNULL(M_UserLastUpdatedUserID, '') AS M_UserLastUpdatedUserID, + IFNULL(M_UserDeletedUserID, '') AS M_UserDeletedUserID, + IFNULL(M_UserDeleted, '') AS M_UserDeleted, + IFNULL(M_UserGroupCode, '') AS M_UserGroupCode, + IFNULL(M_UserGroupName, '') AS M_UserGroupName, + IFNULL(M_UserM_UserGroupID, '') AS M_UserM_UserGroupID, + IFNULL(M_UserGroupID, '') AS M_UserGroupID, + M_UserIsActive + FROM m_user + JOIN m_usergroup + ON M_UserM_UserGroupID = M_UserGroupID + AND M_UserIsActive = 'Y' + AND M_UserGroupIsActive = 'Y' + AND (M_UserFullName LIKE ? OR M_UserEmail LIKE ?) + JOIN r_reportgroup + ON M_UserR_ReportGroupID = R_ReportGroupID + AND R_ReportGroupIsActive = 'Y' + order by M_UserID ASC + LIMIT ? OFFSET ? + ` + + logger.Info("QUERY SEARCH INITIAL", + zap.String("query search", query), + ) + + if err := dbx.Handlex.Select(&userList, query, prm, prm, rowPerPage, offset); err != nil { + return nil, 0, fmt.Errorf("error querying database: %v", err) + } } + totalPage := int(math.Ceil(float64(totalData) / float64(rowPerPage))) return userList, totalPage, nil diff --git a/views/dev/mastermenuuser/mastermenuuser.templ b/views/dev/mastermenuuser/mastermenuuser.templ index b6f9956..7c8a5cd 100644 --- a/views/dev/mastermenuuser/mastermenuuser.templ +++ b/views/dev/mastermenuuser/mastermenuuser.templ @@ -14,7 +14,7 @@ templ ContentMasterMenuUserV1( tableID string, paginationID string, searchID string, - searchIDDropdown string, + dropdownID string, dialogAddID string, dialogAddBodyID string, dialogEditID string, @@ -39,10 +39,10 @@ templ ContentMasterMenuUserV1( Name: "paginationID", Type: "hidden", Value: paginationID}) - @customtextfield.CustomTextFieldv2(models.CustomTextFieldv2Prm{ID: "searchIDDropdown", - Name: "searchIDDropdown", + @customtextfield.CustomTextFieldv2(models.CustomTextFieldv2Prm{ID: "dropdownID", + Name: "dropdownID", Type: "hidden", - Value: searchIDDropdown}) + Value: dropdownID}) @customtextfield.CustomTextFieldv2(models.CustomTextFieldv2Prm{ID: "searchID", Name: "searchID", Type: "hidden", diff --git a/views/dev/mastermenuuser/mastermenuuser_templ.go b/views/dev/mastermenuuser/mastermenuuser_templ.go index dde7397..45db6cc 100644 --- a/views/dev/mastermenuuser/mastermenuuser_templ.go +++ b/views/dev/mastermenuuser/mastermenuuser_templ.go @@ -24,7 +24,7 @@ func ContentMasterMenuUserV1( tableID string, paginationID string, searchID string, - searchIDDropdown string, + dropdownID string, dialogAddID string, dialogAddBodyID string, dialogEditID string, @@ -70,10 +70,10 @@ func ContentMasterMenuUserV1( if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = customtextfield.CustomTextFieldv2(models.CustomTextFieldv2Prm{ID: "searchIDDropdown", - Name: "searchIDDropdown", + templ_7745c5c3_Err = customtextfield.CustomTextFieldv2(models.CustomTextFieldv2Prm{ID: "dropdownID", + Name: "dropdownID", Type: "hidden", - Value: searchIDDropdown}).Render(ctx, templ_7745c5c3_Buffer) + Value: dropdownID}).Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }