Commit 2c1ef7be authored by Ashok Kumar K's avatar Ashok Kumar K

Implementation of Manage Designations page.

parent e4fcbdc8
......@@ -15,28 +15,30 @@ import org.springframework.web.servlet.view.InternalResourceViewResolver;
public class MvcConfiguration extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setViewNames("templates/**");
resolver.setSuffix(".html");
return resolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/WEB-INF/css/");
registry.addResourceHandler("/images/**").addResourceLocations("/WEB-INF/images/");
registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/js/");
registry.addResourceHandler("/controllers/**").addResourceLocations("/WEB-INF/controllers/");
registry.addResourceHandler("/fonts/**").addResourceLocations("/WEB-INF/fonts/");
registry.addResourceHandler("/reports/**").addResourceLocations("/WEB-INF/reports/");
registry.addResourceHandler("/templates/**").addResourceLocations("/WEB-INF/templates/");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public InternalResourceViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setViewNames("templates/**");
resolver.setSuffix(".html");
return resolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/WEB-INF/css/");
registry.addResourceHandler("/images/**").addResourceLocations("/WEB-INF/images/");
registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/js/");
registry.addResourceHandler("/controllers/**").addResourceLocations("/WEB-INF/controllers/");
registry.addResourceHandler("/fonts/**").addResourceLocations("/WEB-INF/fonts/");
registry.addResourceHandler("/reports/**").addResourceLocations("/WEB-INF/reports/");
registry.addResourceHandler("/templates/**").addResourceLocations("/WEB-INF/templates/");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
\ No newline at end of file
package com.nisum.myteam.controller;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import com.nisum.myteam.exception.handler.MyTeamException;
import com.nisum.myteam.exception.handler.ResponseDetails;
import com.nisum.myteam.model.dao.Designation;
import com.nisum.myteam.service.IDesignationService;
import com.nisum.myteam.service.IMasterDataService;
import com.nisum.myteam.utils.MyTeamUtils;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.nisum.myteam.exception.handler.MyTeamException;
import com.nisum.myteam.exception.handler.ResponseDetails;
import com.nisum.myteam.model.dao.Designation;
import com.nisum.myteam.service.IDesignationService;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@Validated
public class DesignationController {
@Autowired
IDesignationService designationService;
// @RequestMapping(value = "/getAllDesignations"
@RequestMapping(value = "/employees/designations/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> getAllDesignations(HttpServletRequest request) throws MyTeamException {
List<String> designations = designationService.getAllDesignations().stream()
.filter(e -> "Y".equalsIgnoreCase(e.getActiveStatus())).map(Designation::getDesignationName).sorted()
.collect(Collectors.toList());
ResponseDetails getRespDetails = new ResponseDetails(new Date(), 908, "Retrieved Designations successfully",
"Designations list", designations, request.getRequestURI(), "Employee Designation Details", null);
return new ResponseEntity<>(getRespDetails, HttpStatus.OK);
}
@Autowired
IDesignationService designationService;
@Autowired
IMasterDataService masterDataService;
// @RequestMapping(value = "/getAllDesignations"
@RequestMapping(value = "/employees/designations/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> getAllDesignations(HttpServletRequest request) throws MyTeamException {
List<String> designations = designationService.getAllDesignations().stream()
.filter(e -> "Y".equalsIgnoreCase(e.getActiveStatus())).map(Designation::getDesignationName).sorted()
.collect(Collectors.toList());
ResponseDetails getRespDetails = new ResponseDetails(new Date(), 908, "Retrieved Designations successfully",
"Designations list", designations, request.getRequestURI(), "Employee Designation Details", null);
return new ResponseEntity<>(getRespDetails, HttpStatus.OK);
}
@GetMapping("/designations")
public ResponseEntity<?> getDesignationsWithEmployeeCount(HttpServletRequest request) {
ResponseDetails response = new ResponseDetails(new Date(), 200, "Retrieved designations with employee count",
"Designations with employee count with active status", masterDataService.getDesignationsWithEmployeeCount(), request.getRequestURI(), "Designation Details with Employee count", null);
return new ResponseEntity<ResponseDetails>(response, HttpStatus.OK);
}
@PostMapping(value = "/designations", consumes = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<?> addDesignation(@RequestBody @NotBlank String designationName, HttpServletRequest request) throws Exception {
ResponseDetails response = new ResponseDetails(new Date(), 201, "Added designation successfully",
"created Designation '" + designationName + "'", masterDataService.addDesignation(designationName.trim()), request.getRequestURI(), "Added designation", null);
return new ResponseEntity<ResponseDetails>(response, HttpStatus.OK);
}
@PatchMapping(value = "/designations/status/{designationId}", consumes = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<?> changeDesignationStatus(@PathVariable("designationId") @NotBlank String designationId, @RequestBody @NotBlank String action, HttpServletRequest request) throws MyTeamException {
action = action.trim().toLowerCase();
ResponseDetails response = null;
if (action.equals(MyTeamUtils.TEXT_ENABLE) || action.equals(MyTeamUtils.TEXT_DISABLE)) {
masterDataService.changeDesignationStatus(designationId, action);
String msg = action.equals(MyTeamUtils.TEXT_ENABLE) ? "enabled" : "disabled";
response = new ResponseDetails(new Date(), 200, "Changed Designation status",
"Changed Designation status", null, request.getRequestURI(), "Changed designation status", null);
} else throw new MyTeamException("Invalid action");
return new ResponseEntity<ResponseDetails>(response, HttpStatus.OK);
}
@DeleteMapping(value = "/designations/{designationId}")
public ResponseEntity<?> deleteDesignation(@PathVariable @NotBlank String designationId, HttpServletRequest request) throws MyTeamException {
masterDataService.deleteDesignation(designationId.trim());
ResponseDetails response = new ResponseDetails(new Date(), 200, "Deleted designation",
"Deleted designation successfully", null, request.getRequestURI(), "Deleted designation", null);
return new ResponseEntity<ResponseDetails>(response, HttpStatus.OK);
}
}
package com.nisum.myteam.exception.handler;
import java.util.ArrayList;
import java.util.Date;
import java.util.stream.Collectors;
import javax.security.auth.login.AccountNotFoundException;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -36,15 +40,24 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
log.error("Exception occured due to: ", ex);
log.error("Exception occurred due to: ", ex);
ResponseDetails errorDetails = new ResponseDetails(new Date(), 502, "Internal Server error occured",
ex.getMessage(), null, request.getContextPath(), request.getDescription(false), null);
return new ResponseEntity<Object>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex,WebRequest request) {
String exceptionMessage=new ArrayList<>(ex.getConstraintViolations()).get(0).getMessage();
String invalidField=new ArrayList<>(ex.getConstraintViolations()).get(0).getPropertyPath().toString();
ResponseDetails errorDetails = new ResponseDetails(new Date(), 400, exceptionMessage,
invalidField+" : "+exceptionMessage, null, request.getContextPath(), request.getDescription(false), null);
return new ResponseEntity<>(errorDetails, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(AccountNotFoundException.class)
public final ResponseEntity<Object> handleUserNotFoundException(AccountNotFoundException ex, WebRequest request) {
log.error("Exception occured due to::", ex);
log.error("Exception occurred due to::", ex);
ResponseDetails errorDetails = new ResponseDetails(new Date(), 602,
"The Account you are looking for is not found", ex.getMessage(), null, request.getContextPath(),
request.getDescription(false), null);
......@@ -64,7 +77,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
log.error("The exception is occured due to ::", ex);
ResponseDetails errorDetails = new ResponseDetails(new Date(), 702, "Method Arguement is not validated",
ResponseDetails errorDetails = new ResponseDetails(new Date(), 702, "Method Argument is not validated",
"Validation Failed", null, request.getContextPath(), ex.getBindingResult().toString(), null);
return new ResponseEntity<Object>(errorDetails, HttpStatus.BAD_REQUEST);
}
......
......@@ -29,4 +29,11 @@ public class MasterData implements Serializable {
private String masterDataName;
private boolean activeStatus;
private String comments;
public MasterData(String masterDataType, String masterDataId, String masterDataName, boolean activeStatus) {
this.masterDataType = masterDataType;
this.masterDataId = masterDataId;
this.masterDataName = masterDataName;
this.activeStatus = activeStatus;
}
}
package com.nisum.myteam.model.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DesignationCountVO {
private String designationId;
private String designationName;
private int designationCount;
private boolean active;
}
package com.nisum.myteam.repository;
import com.nisum.myteam.model.dao.Employee;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
import java.util.Set;
import org.springframework.data.mongodb.repository.MongoRepository;
import com.nisum.myteam.model.dao.Employee;
public interface EmployeeRepo
extends MongoRepository<Employee, String> {
Employee findByEmployeeIdAndEmpStatus(String employeeId,String empStatus);
Employee findByEmployeeIdAndEmpStatus(String employeeId, String empStatus);
Employee findByEmailId(String emailId);
......@@ -18,7 +18,7 @@ public interface EmployeeRepo
Employee findByEmployeeName(String employeeName);
List<Employee> findByEmpStatusAndFunctionalGroup(String empStatus,
String functionalGroup);
String functionalGroup);
List<Employee> findByEmpStatusOrderByEmployeeNameAsc(String empStatus);
......@@ -28,7 +28,10 @@ public interface EmployeeRepo
List<Employee> findByEmpSubStatusOrderByEmployeeNameAsc(String subStatus);
List<Employee> findByEmpStatusAndShiftLikeOrderByEmployeeIdDesc(String status, String shift);
List<Employee> findByEmpStatusAndShiftLikeOrderByEmployeeIdDesc(String status,String shift);
List<Employee> findByDesignation(String designation);
int countByDesignation(String designation);
}
......@@ -5,8 +5,22 @@ import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
import com.nisum.myteam.model.dao.MasterData;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.repository.query.Param;
public interface MasterDataRepo extends MongoRepository<MasterData, String> {
List<MasterData> findByMasterDataTypeAndMasterDataNameAndActiveStatus(String masterDataType, String masterDataName, boolean activeStatus);
List<MasterData> findByMasterDataType(String masterDataType);
MasterData findByMasterDataTypeAndMasterDataIdAndActiveStatus(String masterDataType, String masterDataId, boolean activeStatus);
void deleteByMasterDataTypeAndMasterDataId(String masterDataType, String masterDataId);
boolean existsByMasterDataTypeAndMasterDataId(String masterDataType,String masterDataId);
MasterData findByMasterDataTypeAndMasterDataId(String masterDataType,String masterDataId);
boolean existsByMasterDataTypeAndMasterDataNameIgnoreCase(String masterDataType,String masterDataName);
}
\ No newline at end of file
......@@ -55,4 +55,8 @@ public interface IEmployeeService {
public List<Employee> getEmployeesByEmpStatusAndShift(String empStatus, String shift);
public List<Employee> getEmployeesByDesignation(String designation);
public int getEmployeesCountByDesignation(String designation);
}
......@@ -2,6 +2,8 @@ package com.nisum.myteam.service;
import java.util.List;
import com.nisum.myteam.model.dao.Designation;
import com.nisum.myteam.model.vo.DesignationCountVO;
import org.springframework.stereotype.Service;
import com.nisum.myteam.exception.handler.MyTeamException;
......@@ -14,4 +16,13 @@ public interface IMasterDataService {
List<MasterData> findByMasterDataTypeAndMasterDataNameAndActiveStatus(String masterDataType, String masterDataName,
boolean activeStatus);
List<DesignationCountVO> getDesignationsWithEmployeeCount();
DesignationCountVO addDesignation(String designationName) throws MyTeamException, Exception;
void deleteDesignation(String designationId) throws MyTeamException;
void changeDesignationStatus(String designationId,String action) throws MyTeamException;
}
......@@ -21,7 +21,6 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
......@@ -59,7 +58,7 @@ public class EmployeeService implements IEmployeeService {
@Autowired
private ISubStatusService subStatusService;
public Map<String , String> response = new HashMap<>();
public Map<String, String> response = new HashMap<>();
@Override
public Employee createEmployee(Employee employee, String loginEmpId) throws MyTeamException {
......@@ -163,10 +162,10 @@ public class EmployeeService implements IEmployeeService {
// }
// return employeeUpdated;
// }
@Override
public Employee updateEmployee(Employee employeeReq, String loginEmpId) throws ParseException {
// update all emp details to inactive if employee is inactive
Query query = new Query(Criteria.where("employeeId").is(employeeReq.getEmployeeId()));
Update update = new Update();
......@@ -203,7 +202,7 @@ public class EmployeeService implements IEmployeeService {
}
//update substatus
if(employeeReq.getEmpSubStatus()!=null) {
if (employeeReq.getEmpSubStatus() != null) {
HashMap<String, Object> substatus = (LinkedHashMap) employeeReq.getEmpSubStatus();
if (substatus.keySet().contains("subStatus") && substatus.get("subStatus") != null) {
EmployeeSubStatus latestSubStatus = new EmployeeSubStatus();
......@@ -215,22 +214,21 @@ public class EmployeeService implements IEmployeeService {
if (currentSubStatus != null) {
if (currentSubStatus.getSubStatus().equals(latestSubStatus.getSubStatus())) {
latestSubStatus.setId(currentSubStatus.getId());
subStatusService.updateExistingEmplyeeSubStatus(loginEmpId,latestSubStatus);
subStatusService.updateExistingEmplyeeSubStatus(loginEmpId, latestSubStatus);
} else {
response.put("messege", "Employee is already " + currentSubStatus.getSubStatus() + " from " + currentSubStatus.getFromDate() + " to " + currentSubStatus.getToDate());
}
} else {
currentSubStatus = subStatusService.getLatestEmployeeSubStatus(employeeReq.getEmployeeId());
if(currentSubStatus!=null && !currentSubStatus.getFromDate().before(new Date())) {
latestSubStatus.setId(currentSubStatus.getId());
subStatusService.updateExistingEmplyeeSubStatus(loginEmpId,latestSubStatus);
}
else {
subStatusService.addEmployeeSubStatus(loginEmpId,latestSubStatus);
currentSubStatus = subStatusService.getLatestEmployeeSubStatus(employeeReq.getEmployeeId());
if (currentSubStatus != null && !currentSubStatus.getFromDate().before(new Date())) {
latestSubStatus.setId(currentSubStatus.getId());
subStatusService.updateExistingEmplyeeSubStatus(loginEmpId, latestSubStatus);
} else {
subStatusService.addEmployeeSubStatus(loginEmpId, latestSubStatus);
}
}
}
}
}
......@@ -241,13 +239,13 @@ public class EmployeeService implements IEmployeeService {
options.returnNew(true);
options.upsert(true);
Employee employeeUpdated = mongoTemplate.findAndModify(query, update, options, Employee.class);
if(employeeReq.getEmpStatus().equals("In Active")){
resourceService.makeResourceInactive(employeeReq.getEmployeeId(),employeeReq.getEndDate());
if (employeeReq.getEmpStatus().equals("In Active")) {
resourceService.makeResourceInactive(employeeReq.getEmployeeId(), employeeReq.getEndDate());
}
response.put("messege" , "Employee has been updated");
response.put("messege", "Employee has been updated");
return employeeUpdated;
}
@Override
public Employee deleteEmployee(String employeeId) {
......@@ -313,6 +311,16 @@ public class EmployeeService implements IEmployeeService {
return employeeRepo.findByEmpStatusAndShiftLikeOrderByEmployeeIdDesc(empStatus, shift);
}
@Override
public List<Employee> getEmployeesByDesignation(String designation) {
return employeeRepo.findByDesignation(designation);
}
@Override
public int getEmployeesCountByDesignation(String designation) {
return employeeRepo.countByDesignation(designation);
}
public List<Employee> getManagers() throws MyTeamException {
List<Employee> activeEmpsList = getActiveEmployees();
List<Employee> managers = activeEmpsList.stream()
......@@ -346,7 +354,7 @@ public class EmployeeService implements IEmployeeService {
List<Employee> employeesList = employeeRepo.findAll(new Sort(Sort.Direction.ASC, "employeeName"));
employeesList.stream().forEach(e -> {
EmployeeSubStatus subStatus = subStatusService.getCurrentSubStatus(e.getEmployeeId());
if(subStatus!=null)
if (subStatus != null)
e.setEmpSubStatus((EmployeeSubStatus) subStatus);
else
e.setEmpSubStatus(null);
......@@ -355,13 +363,13 @@ public class EmployeeService implements IEmployeeService {
return employeesList;
} else if (status.equals("Vacation")) {
return employeesList.stream().filter(e -> e.getEmpSubStatus()!= null ||
(e.getEmpSubStatus()!=null && !e.getEmpSubStatus().equals("Resigned")) ||
(e.getEmpSubStatus()!=null && !e.getEmpSubStatus().equals(""))).collect(Collectors.toList());
return employeesList.stream().filter(e -> e.getEmpSubStatus() != null ||
(e.getEmpSubStatus() != null && !e.getEmpSubStatus().equals("Resigned")) ||
(e.getEmpSubStatus() != null && !e.getEmpSubStatus().equals(""))).collect(Collectors.toList());
} else if (status.equals("Resigned")) {
return employeeRepo.findByEmpSubStatusOrderByEmployeeNameAsc("Resigned");
} else {
return employeesList.stream().filter(e->e.getEmpStatus().equals(status)).collect(Collectors.toList());
return employeesList.stream().filter(e -> e.getEmpStatus().equals(status)).collect(Collectors.toList());
}
}
......@@ -470,9 +478,9 @@ public class EmployeeService implements IEmployeeService {
}
public Employee findByEmployeeIdAndEmpStatus(String active, String employeeId) {
// TODO Auto-generated method stub
return employeeRepo.findByEmployeeIdAndEmpStatus(employeeId, active);
}
public Employee findByEmployeeIdAndEmpStatus(String active, String employeeId) {
// TODO Auto-generated method stub
return employeeRepo.findByEmployeeIdAndEmpStatus(employeeId, active);
}
}
package com.nisum.myteam.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.nisum.myteam.exception.handler.MyTeamException;
import com.nisum.myteam.model.dao.MasterData;
import com.nisum.myteam.model.vo.DesignationCountVO;
import com.nisum.myteam.repository.MasterDataRepo;
import com.nisum.myteam.service.IEmployeeService;
import com.nisum.myteam.service.IMasterDataService;
import com.nisum.myteam.utils.MyTeamUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service("masterDataService")
public class MasterDataService implements IMasterDataService {
@Autowired
private MasterDataRepo masterDataRepo;
@Autowired
private MasterDataRepo masterDataRepo;
@Autowired
IEmployeeService employeeService;
@Override
public List<MasterData> getMasterData() throws MyTeamException {
return masterDataRepo.findAll();
}
@Override
public List<MasterData> findByMasterDataTypeAndMasterDataNameAndActiveStatus(String masterDataType, String masterDataName,
boolean activeStatus) {
return masterDataRepo.findByMasterDataTypeAndMasterDataNameAndActiveStatus(masterDataType, masterDataName,
activeStatus);
}
@Override
public List<DesignationCountVO> getDesignationsWithEmployeeCount() {
return masterDataRepo.findByMasterDataType(MyTeamUtils.TEXT_DESIGNATIONS).stream()
.map(designation -> new DesignationCountVO(designation.getMasterDataId(), designation.getMasterDataName(), employeeService.getEmployeesCountByDesignation(designation.getMasterDataName()), designation.isActiveStatus()))
.collect(Collectors.toList());
}
@Override
public DesignationCountVO addDesignation(String designationName) throws MyTeamException {
if (masterDataRepo.existsByMasterDataTypeAndMasterDataNameIgnoreCase(MyTeamUtils.TEXT_DESIGNATIONS, designationName)) {
List<MasterData> masterData = masterDataRepo.findByMasterDataTypeAndMasterDataNameAndActiveStatus(MyTeamUtils.TEXT_DESIGNATIONS, designationName, true);
if (masterData.size() > 0)
throw new MyTeamException("Designation '" + designationName + "' already exists");
else throw new MyTeamException("Designation '" + designationName + "' already exists and is inactive");
}
return masterDataRepo.findByMasterDataType(MyTeamUtils.TEXT_DESIGNATIONS).stream()
.map(MasterData::getMasterDataId)
.max(Comparator.comparing(Integer::parseInt))
.map(desId -> Integer.parseInt(desId) + 1)
.map(maxId -> masterDataRepo.save(new MasterData(MyTeamUtils.TEXT_DESIGNATIONS, maxId.toString(), designationName, true)))
.map(masterData -> new DesignationCountVO(masterData.getMasterDataId(), masterData.getMasterDataName(), 0, true))
.get();
}
@Override
public List<MasterData> getMasterData() throws MyTeamException {
return masterDataRepo.findAll();
}
@Override
public void deleteDesignation(String designationId) throws MyTeamException {
if (masterDataRepo.existsByMasterDataTypeAndMasterDataId(MyTeamUtils.TEXT_DESIGNATIONS, designationId)) {
MasterData masterData = Optional.ofNullable(masterDataRepo.findByMasterDataTypeAndMasterDataIdAndActiveStatus(MyTeamUtils.TEXT_DESIGNATIONS, designationId, false))
.orElseThrow(() -> new MyTeamException("Disable designation before deleting"));
masterDataRepo.delete(masterData);
} else
throw new MyTeamException("Designation doesn't exist");
}
@Override
public List<MasterData> findByMasterDataTypeAndMasterDataNameAndActiveStatus(String masterDataType, String masterDataName,
boolean activeStatus) {
return masterDataRepo.findByMasterDataTypeAndMasterDataNameAndActiveStatus(masterDataType, masterDataName,
activeStatus);
}
@Override
public void changeDesignationStatus(String designationId, String action) throws MyTeamException {
if (masterDataRepo.existsByMasterDataTypeAndMasterDataId(MyTeamUtils.TEXT_DESIGNATIONS, designationId)) {
MasterData masterData = masterDataRepo.findByMasterDataTypeAndMasterDataId(MyTeamUtils.TEXT_DESIGNATIONS, designationId);
if (action.equals(MyTeamUtils.TEXT_ENABLE) && !masterData.isActiveStatus()) {
masterData.setActiveStatus(true);
masterDataRepo.save(masterData);
} else if (action.equals(MyTeamUtils.TEXT_DISABLE) && masterData.isActiveStatus()) {
masterData.setActiveStatus(false);
masterDataRepo.save(masterData);
} else {
String msg = action.equals(MyTeamUtils.TEXT_ENABLE) ? "enabled" : "disabled";
throw new MyTeamException("Designation is already " + msg);
}
} else throw new MyTeamException("Designation doesn't exist");
}
}
......@@ -185,6 +185,7 @@ public class MyTeamUtils {
public final static String BILLING_START_DATE="billingStartDate";
public final static String BILLING_END_DATE="billingEndDate";
public final static String TEXT_DESIGNATIONS="designations";
public final static String TEXT_ENABLE="enable";
public final static String TEXT_DISABLE="disable";
}
myApp.controller("designationsController", function ($scope, appConfig, $http, uiGridConstants, $mdDialog) {
var TEXT_ENABLE = 'enable';
var TEXT_DISABLE = 'disable';
var TEXT_ENABLED = 'enabled';
var TEXT_DISABLED = 'disabled';
var actionsCellTemplate = '<div class="action-cell-template text-align-center" ng-show="grid.appScope.showActions(row)"><span id="action-container"><md-switch ng-model="row.entity.active" aria-label="Finished?" ng-change="grid.appScope.changeDesignationStatus(row,$event)" class="no-margin"></md-switch> <i class="fa fa-trash fa-2x delete-action-icon" aria-hidden="true" ng-show="!row.entity.active" ng-click="grid.appScope.deleteDesignation(row,$event)"></i></span></div>'
$scope.recordsToShow = "Active";
$scope.allRecords=[];
$scope.activeRecords = [];
$scope.inactiveRecords = [];
$scope.gridOptions = {
paginationPageSizes: [10, 20, 30, 40, 50, 100],
paginationPageSize: 10,
pageNumber: 1,
pageSize: 10,
enableFiltering: true,
headerCellClass: 'text-align-center',
columnDefs: [
{
field: 'designationName',
displayName: 'Designation',
enableColumnMenu: false,
enableSorting: true,
sort: { direction: uiGridConstants.ASC, priority: 1 },
enableFiltering: true,
headerCellClass: 'text-align-center'
},
{
field: 'designationCount',
displayName: 'Employee Count',
type: 'number',
enableColumnMenu: false,
enableSorting: true,
sortPriorityVisible:false,
sort: { direction: uiGridConstants.DESC, priority: 0 },
headerCellClass: 'text-align-center',
cellClass: 'text-align-center'
},
{
field: 'designationId',
name: 'Actions',
displayName: 'Actions',
cellTemplate: actionsCellTemplate,
enableColumnMenu: false,
enableSorting: false,
enableFiltering: false,
headerCellClass: 'text-align-center'
}
],
onRegisterApi: function (gridApi) {
$scope.gridApi = gridApi;
}
};
$scope.gridOptions.data = [];
$scope.getDesignationsWithEmployeeCount = function () {
$http.get(appConfig.appUri + "designations")
.then(function (response) {
let data = response.data.records;
for (element of data) {
$scope.allRecords.push(element);
if (element.active) $scope.activeRecords.push(element)
else $scope.inactiveRecords.push(element)
}
$scope.gridOptions.data = $scope.activeRecords;
if (data.length > 10) {
$scope.gridOptions.enablePaginationControls = true;
}
else {
$scope.gridOptions.enablePaginationControls = false;
}
}, function (response) {
showAlert("Something went wrong while fetching data!!!");
$scope.gridOptions.data = [];
});
};
$scope.showRecords = function (recordsToShow) {
if (recordsToShow==="All") $scope.gridOptions.data = $scope.allRecords;
else if (recordsToShow === "Active") $scope.gridOptions.data = $scope.activeRecords;
else $scope.gridOptions.data = $scope.inactiveRecords;
};
$scope.showAddDesignationDialog = function () {
$mdDialog
.show(
{
controller: AddDesignationController,
templateUrl: 'templates/addDesignation.html',
parent: angular.element(document.body),
clickOutsideToClose: false
})
.then(
function (result) {
});
};
function AddDesignationController($scope, $mdDialog) {
$scope.addDesignationDialogTitle = "Add Designation";
$scope.newDesignationName = "";
$scope.newDesignationValidationMessage = "";
$scope.addDesignation = function () {
let designationName = $scope.newDesignationName.trim();
if (isDesignationNameValid(designationName)) {
$http({
method: 'POST',
url: appConfig.appUri + "designations",
data: designationName,
headers: {
'Content-type': 'text/plain'
}
})
.then(function (response) {
let data = response.data.records;
addElementsToActiveRecords(data);
addElementsToAllRecords(data);
closeDialog();
showAlert("Designation with name \'" + data.designationName + "\' created successfully");
}, function (response) {
$scope.newDesignationValidationMessage = response.data.description;
});
}
}
var closeDialog = function () {
$scope.cancel();
}
$scope.cancel = function () {
resetTempFields();
$mdDialog.hide();
}
var isDesignationNameValid = function (designationName) {
let pattern = /^([a-zA-Z\d\s-]{1,30})$/;
if (!Boolean(designationName)) {
$scope.newDesignationValidationMessage = "designation name can't be empty";
return false;
}
else if (!pattern.test(designationName)) {
$scope.newDesignationValidationMessage = "designation name can contain alphanumeric, space and hyphen(-) upto 30 characters";
return false;
}
return true;
}
var resetTempFields = function () {
$scope.newDesignationName = "";
$scope.newDesignationValidationMessage = "";
}
};
$scope.changeDesignationStatus = function (row, ev) {
console.log(row.entity);
let designationData = row.entity;
let action = (!designationData.active) ? TEXT_DISABLE : TEXT_ENABLE;
var confirmChangeDesignationStatus = $mdDialog.confirm()
.title('Change Designation')
.textContent(action + ' \'' + designationData.designationName + '\'?')
.ariaLabel('Lucky day')
.targetEvent(ev)
.ok('CONFIRM')
.cancel('cancel');
$mdDialog.show(confirmChangeDesignationStatus)
.then(function () {
$http({
method: 'PATCH',
url: appConfig.appUri + "designations/status/" + designationData.designationId,
data: action,
headers: {
'Content-type': 'text/plain'
}
})
.then(function (response) {
console.log(response);
changeStatusInRecords(designationData);
showAlert("Designation \'" + designationData.designationName + "\' " + (designationData.active ? TEXT_ENABLED : TEXT_DISABLED));
}, function (response) {
console.log(response);
designationData.active=!designationData.active;
showAlert(response.data.description);
});
}, function () {
designationData.active=!designationData.active;
});
}
$scope.deleteDesignation = function (row, ev) {
designationData = row.entity;
var confirmDelete = $mdDialog.confirm()
.title('Delete Designation')
.textContent('Would you like to delete the designation \'' + designationData.designationName + '\'?')
.ariaLabel('Lucky day')
.targetEvent(ev)
.ok('CONFIRM')
.cancel('cancel');
$mdDialog.show(confirmDelete)
.then(function () {
$http({
method: 'DELETE',
url: appConfig.appUri + "designations/" + designationData.designationId,
responseType: 'text'
})
.then(function (response) {
console.log(response);
removeElementsFromInactiveRecords(row.entity);
removeElementsFromAllRecords(row.entity);
showAlert("Designation \'" + row.entity.designationName + "\' deleted");
}, function (response) {
console.log(response);
showAlert(response.data.description);
});
}, function () {
// alert("It Worked");
});
};
$scope.showActions = function (row) {
return row.entity.designationCount == 0;
}
var showAlert = function (message) {
$mdDialog.show($mdDialog.alert().parent(
angular.element(document
.querySelector('#popupContainer')))
.clickOutsideToClose(true).textContent(message)
.ariaLabel('Alert Dialog').ok('Ok'));
};
var changeStatusInRecords=function (designation){
if (designation.active) {
removeElementsFromInactiveRecords(designation);
addElementsToActiveRecords(designation);
} else {
removeElementsFromActiveRecords(designation);
addElementsToInactiveRecords(designation);
}
}
var addElementsToAllRecords = function (element) {
$scope.allRecords.push(element);
}
var addElementsToActiveRecords = function (element) {
$scope.activeRecords.push(element);
}
var addElementsToInactiveRecords = function (element) {
$scope.inactiveRecords.push(element)
}
var removeElementsFromAllRecords = function (element) {
var index = $scope.allRecords.indexOf(element);
$scope.allRecords.splice(index, 1);
}
var removeElementsFromActiveRecords = function (element) {
var index = $scope.activeRecords.indexOf(element);
$scope.activeRecords.splice(index, 1);
}
var removeElementsFromInactiveRecords = function (element) {
var index = $scope.inactiveRecords.indexOf(element);
$scope.inactiveRecords.splice(index, 1);
}
});
\ No newline at end of file
......@@ -320,6 +320,7 @@ myApp.controller("loginController",function($scope, myFactory, $compile, $window
menuItems.push({"menu" : "Manage Accounts","icon" : "fa fa fa-money fa-2x","path" : "templates/accounts.html"});
menuItems.push({"menu" : "Manage Domains","icon" : "fa fa fa-cubes fa-2x","path" : "templates/domains.html"});
menuItems.push({"menu" : "Manage Projects","icon" : "fa fa-tasks fa-2x","path" : "templates/projects.html"});
menuItems.push({"menu" : "Manage Designations","icon" : "fa fa-users fa-2x","path" : "templates/designations.html"});
//menuItems.push({"menu" : "Manage Team","icon" : "fa fa-sitemap fa-2x","path" : "templates/projectDetails.html"});
//menuItems.push({"menu" : "Manage Visa","icon" : "fa fa-empire fa-2x","path" : "templates/visaList.html"});
//menuItems.push({"menu" : "Manage Travels","icon" : "fa fa-tasks fa-2x","path" : "templates/onsiteTravelsList.html"});
......
......@@ -19,6 +19,9 @@ body {
.no-padding {
padding: 0;
}
.no-margin {
margin: 0;
}
.scroll-content {
height: 100%;
max-height: 500px;
......@@ -166,7 +169,7 @@ i.fa.fa-refresh:hover {
list-style: none;
}
#sidebar-wrapper .sidebar-nav li ul.manageGroup {
max-height: 205px;
max-height: 246px;
overflow: hidden;
height: auto;
padding: 0;
......@@ -747,3 +750,70 @@ cursor: pointer;
margin-left:15px;
padding:4px;
}
.to-lowercase{
text-transform: lowercase;
}
.to-uppercase{
text-transform: uppercase;
}
.text-align-center{
text-align: center;
}
#manage-designation .manage-designation-grid {
height: calc(100vh - 239px) !important;
}
#manage-designation .action-cell-template{
height: 100%;
position: relative;
}
#manage-designation #action-container{
position: absolute;
top: 12.5%;
bottom: 12.5%;
display: flex;
justify-content: flex-start;
width: 30%;
margin: 0 35%;
}
#manage-designation #action-container md-switch{
margin: 0 10px 0 0;
}
#manage-designation .delete-action-icon:hover{
color: red;
cursor:pointer
}
#manage-designation .ui-grid-sort-priority-number{
font-size: 0;
}
#manage-designation md-switch .md-bar {
background-color: #333; /* set not selected bar color */
}
#manage-designation md-switch.md-checked .md-bar {
background-color: #57cdeb; /* set selected bar color */
}
#manage-designation md-switch[disabled] .md-bar {
background-color: rgba(51, 51, 51, .15); /* set disabled bar color */
}
#manage-designation md-switch .md-thumb {
background-color: #e1e8ef; /* not selected switch color */
}
#manage-designation md-switch.md-checked .md-thumb {
background-color: #e1e8ef ;/* selected switch color */
}
#manage-designation md-switch[disabled] .md-thumb {
background-color: rgb(255,255,255); /* disabled switch color */
}
#manage-designation md-switch .md-ink-ripple {
color: #00b3e2; /* not selected switch ripple color */
}
#manage-designation md-switch.md-checked .md-ink-ripple {
color: #333; /* selected switch ripple color */
}
......@@ -2,7 +2,7 @@ var myApp = angular.module(
"myTimeApp",
[ "ngRoute", "ngCookies", "ui.grid", "ui.grid.pagination",
"ngMaterial", "ui.bootstrap", "pdf", 'ui.grid.selection', 'ui.grid.exporter','ui.grid.edit', 'ui.grid.cellNav','ngIdle' ]).config(
"ngMaterial", "ui.bootstrap", "pdf", 'ui.grid.selection', 'ui.grid.exporter','ui.grid.edit', 'ui.grid.cellNav','ngIdle' , 'ngSanitize']).config(
function($mdDateLocaleProvider) {
$mdDateLocaleProvider.formatDate = function(date) {
var day = date.getDate();
......
<md-dialog aria-label="Designation Template" style="width:520px;height:205px;">
<form ng-cloak name="myForm">
<md-toolbar>
<div class="md-toolbar-tools">
<h2>{{addDesignationDialogTitle}}</h2>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<i class="fa fa-times fa-2x" style="margin-top: 5px; font-size: 1.5em; float: left"></i>
</md-button>
</div>
</md-toolbar>
<md-dialog-content>
<div class="md-dialog-content">
<div class="form-group">
<div class="row">
<input type="text" class="form-control" id="designationName" name="designationName"
ng-model="newDesignationName" placeholder="designation name (contains alphanumerics, space, -)" ng-disabled="false" />
<div role="alert" style="text-align: center">
<span class="error" style="color: red;">{{newDesignationValidationMessage}}</span>
</div>
</div>
</div>
</div>
</md-dialog-content>
<md-dialog-actions layout="row">
<md-button class="md-raised md-accent" ng-click="cancel()" style="width:120px;">
Cancel </md-button>
<md-button class="md-raised" ng-click="addDesignation()" style="width:120px;">
ADD </md-button>
</md-dialog-actions>
</form>
</md-dialog>
\ No newline at end of file
<div class="md-padding" id="manage-designation" ng-controller="designationsController"
ng-init="getDesignationsWithEmployeeCount()">
<div class="row">
<div class="col-lg-12">
<h1 class="no-padding">Manage Designations
<span class="right">
<span style="font-size: 16px;">
<input type="radio" ng-model="recordsToShow" value="All"
ng-click="showRecords(recordsToShow)"> All
<input type="radio" ng-model="recordsToShow" value="Active"
ng-click="showRecords(recordsToShow)"> Active
<input type="radio" ng-model="recordsToShow" value="Inactive"
ng-click="showRecords(recordsToShow)"> Inactive
</span>
<md-button class="add-btn md-raised md-primary" ng-click="showAddDesignationDialog()">
<i class="fa fa-plus-circle"></i> Add Designation</md-button>
</span></h1>
</div>
</div>
<div class="form-horizontal">
<div class="row">
<div class="col-lg-12">
<div id="gridTest" ui-grid="gridOptions" ui-grid-pagination class="myGrid manage-designation-grid">
<div class="watermark" ng-show="!gridOptions.data.length">No
data available</div>
</div>
</div>
</div>
</div>
</div>
......@@ -85,6 +85,7 @@
<script src="controllers/DomainController.js"></script>
<script src="controllers/ReservedReportController.js"></script>
<script src="controllers/AllocationChangeController.js"></script>
<script src="controllers/DesignationsController.js"></script>
</head>
<body>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment