Commit 1d7bfc48 authored by ='s avatar =

Merge branch 'master' into hieunv

# Conflicts:
#	src/main/resources/application.properties
#	src/main/resources/public/index.html
#	src/main/resources/public/js/app.js
#	src/main/resources/public/layout/layout3.html
parents 8647db25 fcb3554c
......@@ -15,9 +15,9 @@
<description>Quản trị văn phòng sử dụng springboot API</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
......@@ -25,6 +25,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
......@@ -35,23 +36,33 @@
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.security</groupId>-->
<!-- <artifactId>spring-security-config</artifactId>-->
<!-- <version>${spring-security.version}</version>-->
<!-- <scope>runtime</scope>-->
<!-- </dependency>-->
</dependencies>
<build>
......
......@@ -2,7 +2,9 @@ package com.itsol.quantrivanphong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.web.filter.ShallowEtagHeaderFilter;
@SpringBootApplication
@EnableJpaAuditing
......@@ -11,5 +13,9 @@ public class QuantrivanphongApplication {
public static void main(String[] args) {
SpringApplication.run(QuantrivanphongApplication.class, args);
}
@Bean
public ShallowEtagHeaderFilter shallowEtagHeaderFilter() {
return new ShallowEtagHeaderFilter();
}
}
......@@ -13,12 +13,15 @@ public class CatalogiBusiness {
@Autowired
private CatalogiRepository catalogiRepository;
public Optional<Catalogi> findById(int id){
return catalogiRepository.findById(id);
public Catalogi findCatalogiById(int id){
return catalogiRepository.findCatalogiById(id);
}
public List<Catalogi> findAllCatalogi(){
return catalogiRepository.findAllCatalogi();
}
public Catalogi save(Catalogi catalogi){
return catalogiRepository.save(catalogi);
}
}
......@@ -18,24 +18,32 @@ public class NewsBusiness {
return newsRepository.findAllNews();
}
// Find News By News Id
public Optional<News> findById(int newsId){
return newsRepository.findById(newsId);
public News findNewsById(int newsId){
return newsRepository.findNewsById(newsId);
}
//Find news By Employee Id
public List<News> findByEmployeeId(int employeeId){
return newsRepository.findByEmployeeId(employeeId);
}
// FInd 4 latest news by câtlogiId
public List<News> findLatestNews(int catalogiId){
return newsRepository.getLatestNews(catalogiId);
}
// Find 4 latest news
public List<News> findAllLatestNews(){
return newsRepository.getAllLatestNews();
}
// Find news By Catalogi
public List<News> findByCatalogiId(int catalogiId){
return newsRepository.findByCatalogiId(catalogiId);
}
public Optional<News> findByIdAndEmployeeId(int id, int employeeId){
public News findNewsByIdAndEmployeeId(int id, int employeeId){
return newsRepository.findByIdAndEmployeeId(id,employeeId);
}
public Optional<News> findByIdAndAndCatalogiId(int id, int catalogiId){
public News findNewsByIdAndAndCatalogiId(int id, int catalogiId){
return newsRepository.findByIdAndAndCatalogiId(id,catalogiId);
}
......@@ -53,12 +61,15 @@ public class NewsBusiness {
return updateNews;
}
public String deleteNews(int employeeId,int newsId){
newsRepository.findByIdAndEmployeeId(employeeId,newsId).map(news ->{
newsRepository.delete(news);
return "ok";
}).orElseThrow(() -> new ResourceNotFoundException("News" ,"newsId",newsId));
return "Ok";
//
public String deleteNews(int newsId,int employeeId){
News news = newsRepository.findByIdAndEmployeeId(newsId,employeeId);
if(news == null){
throw new ResourceNotFoundException("News" ,"newsId",newsId);
}
newsRepository.delete(news);
return "ok";
}
}
......@@ -5,12 +5,13 @@ import com.itsol.quantrivanphong.exception.ResourceNotFoundException;
import com.itsol.quantrivanphong.model.Catalogi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/api")
public class CatalogiController {
@Autowired
private CatalogiBusiness catalogiBusiness;
......@@ -22,7 +23,16 @@ public class CatalogiController {
@GetMapping("/catalogies/{catalogiId}")
public Catalogi getCatalogiById(@PathVariable(value = "catalogiId") int catalogiId){
return catalogiBusiness.findById(catalogiId).orElseThrow(()-> new ResourceNotFoundException("Catalogi","catalogiId",catalogiId));
Catalogi catalogi = catalogiBusiness.findCatalogiById(catalogiId);
if(catalogi == null) {
throw new ResourceNotFoundException("Catalogi", "catalogiId", catalogiId);
}
return catalogi;
}
@PostMapping("/catalogi")
public Catalogi createCatalogi(@Valid@RequestBody Catalogi catalogi) {
return catalogiBusiness.save(catalogi);
}
}
......@@ -5,15 +5,19 @@ import com.itsol.quantrivanphong.access.homepage.business.CatalogiBusiness;
import com.itsol.quantrivanphong.access.homepage.business.NewsBusiness;
import com.itsol.quantrivanphong.exception.ResourceNotFoundException;
import com.itsol.quantrivanphong.manager.employee.business.EmployeeBusiness;
import com.itsol.quantrivanphong.model.Catalogi;
import com.itsol.quantrivanphong.model.Employee;
import com.itsol.quantrivanphong.model.News;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
@RequestMapping("/api")
public class NewsController {
......@@ -31,24 +35,56 @@ public class NewsController {
return ResponseEntity.ok(newsBusiness.findAllNews());
}
@GetMapping("/news/{newsId}")
public News getNewsById(@PathVariable(value = "newsId") int newsId){
return newsBusiness.findNewsById(newsId);
}
// get news by employeeId
@GetMapping("/news/employees/{employeeId}")
@GetMapping("/employees/{employeeId}/news")
public List<News> getAllNewsByEmployeeId(@PathVariable(value = "employeeId") int employeeId) {
return newsBusiness.findByEmployeeId(employeeId);
}
// get News by catalogiId
@GetMapping("/news/catalogi/{catalogiId}")
@GetMapping("/catalogi/{catalogiId}/news")
public List<News> getAllNewsByCatalogiId(@PathVariable(value="catalogiId") int catalogiId){
return newsBusiness.findByCatalogiId(catalogiId);
}
// get LatestNews by catalogiId
@GetMapping("/catalogi/{catalogiId}/latestNews")
public List<News> getLatestNews(@PathVariable(value="catalogiId") int catalogiId){
return newsBusiness.findLatestNews(catalogiId);
}
// create news by employeesId
@PostMapping("/news/employees/{employeeId}")
//get Latest news
@GetMapping("/catalogi/latestNews")
public List<News> getAllLatestNews(){
return newsBusiness.findAllLatestNews();
}
@GetMapping("/employees/{employeeId}/news/{newsId}")
public News getAllNewsByEmployeeId(@PathVariable(value = "employeeId") int employeeId,
@PathVariable (value = "newsId") int newsId) {
return newsBusiness.findNewsByIdAndEmployeeId(newsId,employeeId);
}
// create news by employeesId, categoriId
@PostMapping("/employees/{employeeId}/catalogies/{catalogiId}/news")
public News createNews(@PathVariable (value = "employeeId") int employeeId,
@PathVariable (value = "catalogiId") int catalogiId,
@Valid @RequestBody News news) {
Employee employee = employeeBusiness.findById(employeeId);
Employee employee = employeeBusiness.findById(employeeId);
Catalogi catalogi = catalogiBusiness.findCatalogiById(catalogiId);
if(employee == null){
throw new ResourceNotFoundException("Employee" ,"employeeId",employeeId);
}
if(catalogi==null){
throw new ResourceNotFoundException("Catalogi" ,"catalogiId",catalogiId);
}
news.setEmployee(employee);
news.setCatalogi(catalogi);
return newsBusiness.save(news);
}
......@@ -57,22 +93,22 @@ public class NewsController {
public News updateNews(@PathVariable (value = "employeeId") int employeeId,
@PathVariable (value = "newsId") int newsId,
@Valid @RequestBody News newsRequest) {
if(employeeBusiness.findById(employeeId) == null) {
if(employeeBusiness.findById(employeeId)==null) {
throw new ResourceNotFoundException("Employee" ,"employeeId",employeeId);
}
if (!newsBusiness.findById(newsId).isPresent()) {
if (newsBusiness.findNewsById(newsId)== null) {
throw new ResourceNotFoundException("News", "id", newsId);
}
return newsBusiness.updateNews(newsId,newsRequest);
}
//delete news by employeeId and newsId
@DeleteMapping("/employees/{employeeId}/news/{newsId}")
public ResponseEntity<?> deleteNews(@PathVariable (value = "employeeId") int employeeId,
@DeleteMapping("/HR/catagori/{catagoriId}/news/{newsId}")
public ResponseEntity<?> deleteNews(@PathVariable (value = "catagoriId") int catagoriId,
@PathVariable (value = "newsId") int newsId) {
if(!newsBusiness.findByIdAndEmployeeId(employeeId,newsId).isPresent()){
if(newsBusiness.findNewsByIdAndAndCatalogiId(newsId,catagoriId)== null){
throw new ResourceNotFoundException("News","newsId",newsId);
}
return ResponseEntity.ok(newsBusiness.deleteNews(employeeId,newsId));
return ResponseEntity.ok(newsBusiness.deleteNews(newsId,catagoriId));
}
}
......@@ -11,7 +11,6 @@ import java.util.List;
public interface CatalogiRepository extends JpaRepository<Catalogi, Integer> {
@Query("SELECT u from Catalogi u")
List<Catalogi> findAllCatalogi();
// @Query("SELECT u FROM Catalogi u where u.id=:id")
// Catalogi findCatalogiById(int id);
@Query("SELECT u FROM Catalogi u where u.id=:id")
Catalogi findCatalogiById(int id);
}
......@@ -14,8 +14,15 @@ public interface NewsRepository extends JpaRepository<News, Integer> {
List<News> findAllNews();
@Query("SELECT u FROM News u where u.id=:id")
News findNewsById(int id);
@Query(value="select * from News c where c.catalogi_id = ? ORDER BY c.created_at DESC limit 4",nativeQuery = true)
List<News> getLatestNews(int catalogiId);
@Query(value="select * from News c ORDER BY c.created_at DESC limit 4",nativeQuery = true)
List<News> getAllLatestNews();
List<News> findByEmployeeId(int employeeId);
List<News> findByCatalogiId(int catalogiId);
Optional<News> findByIdAndEmployeeId(int id,int employeeId);
Optional<News> findByIdAndAndCatalogiId(int id,int catalogiId);
News findByIdAndEmployeeId(int id,int employeeId);
News findByIdAndAndCatalogiId(int id,int catalogiId);
}
package com.itsol.quantrivanphong.manager.employee.business;
import com.itsol.quantrivanphong.model.Employee;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.validation.Validator;
import java.util.List;
public interface EmployeeBusiness extends Validator {
List<Employee> findAll();
......@@ -21,4 +24,8 @@ public interface EmployeeBusiness extends Validator {
void deleteById(int id);
boolean confirmEmployee(Employee employee);
public Page<Employee> findAll(Pageable pageable);
}
......@@ -4,6 +4,8 @@ import com.itsol.quantrivanphong.manager.employee.business.EmployeeBusiness;
import com.itsol.quantrivanphong.manager.employee.repository.EmployeeRepository;
import com.itsol.quantrivanphong.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.validation.Errors;
......@@ -15,7 +17,8 @@ public class EmployeeBusinessImpl implements EmployeeBusiness {
private EmployeeRepository employeeRepository;
@Override
public List<Employee> findAll() {
public List<Employee> findAll()
{
return employeeRepository.findAll();
}
......@@ -41,7 +44,7 @@ public class EmployeeBusinessImpl implements EmployeeBusiness {
@Override
public void save(Employee employee) {
employeeRepository.save(employee);
employeeRepository.save(employee);
}
@Override
......@@ -54,6 +57,12 @@ public class EmployeeBusinessImpl implements EmployeeBusiness {
return true;
}
@Override
public Page<Employee> findAll(Pageable pageable) {
return employeeRepository.findAll(pageable);
}
@Override
public boolean supports(Class<?> clazz) {
return Employee.class.isAssignableFrom(clazz);
......
package com.itsol.quantrivanphong.manager.employee.controller;
import com.itsol.quantrivanphong.manager.employee.business.EmployeeBusiness;
import com.itsol.quantrivanphong.manager.employee.util.PaginationUtil;
import com.itsol.quantrivanphong.model.Employee;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
......@@ -11,9 +15,12 @@ import org.springframework.web.util.UriComponentsBuilder;
import java.util.List;
@RestController
public class EmployeeController {
Logger logger = Logger.getLogger(EmployeeController.class);
@Autowired
//Retrieve Employee by id
private EmployeeBusiness employeeBusiness;
......@@ -26,7 +33,7 @@ public class EmployeeController {
System.out.println("Employee with id : " + id + " not found");
return new ResponseEntity<Employee>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<Employee>( employee ,HttpStatus.OK);
return new ResponseEntity<Employee>(employee, HttpStatus.OK);
}
//Retrieve all employee
......@@ -36,7 +43,7 @@ public class EmployeeController {
if (employees == null) {
return new ResponseEntity<List<Employee>>(HttpStatus.NO_CONTENT);
}
return new ResponseEntity<List<Employee>>( employees , null ,HttpStatus.OK);
return new ResponseEntity<List<Employee>>(employees, null, HttpStatus.OK);
}
//Update a Employee
......@@ -64,32 +71,43 @@ public class EmployeeController {
currentEmployee.setGraduationYear(employee.getGraduationYear());
currentEmployee.setPicture(employee.getPicture());
employeeBusiness.save(currentEmployee);
return new ResponseEntity<Employee>( currentEmployee ,HttpStatus.OK);
return new ResponseEntity<Employee>(currentEmployee, HttpStatus.OK);
}
//Create a Employee
@RequestMapping(value = "/list_employee", method = RequestMethod.POST)
public ResponseEntity<Void> createEmployee(@RequestBody Employee employee,
UriComponentsBuilder uriComponentsBuilder){
System.out.println("Create Employee "+ employee.getUsername());
UriComponentsBuilder uriComponentsBuilder) {
System.out.println("Create Employee " + employee.getUsername());
employeeBusiness.save(employee);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(uriComponentsBuilder.path("/employee/{id}").buildAndExpand(employee.getId()).toUri());
return new ResponseEntity<Void>( httpHeaders ,HttpStatus.CREATED);
httpHeaders.setLocation(uriComponentsBuilder.path("/employee/{id}").buildAndExpand(employee.getId()).toUri());
return new ResponseEntity<Void>(httpHeaders, HttpStatus.CREATED);
}
//Delete a Employee
@RequestMapping(value = "/employee/{id}" , method = RequestMethod.DELETE)
public ResponseEntity<Employee> deleteEmployee(@PathVariable("id") int id){
System.out.println("Fetching and deleting Employee with id :" + id );
@RequestMapping(value = "/employee/{id}", method = RequestMethod.DELETE)
public ResponseEntity<Employee> deleteEmployee(@PathVariable("id") int id) {
System.out.println("Fetching and deleting Employee with id :" + id);
Employee employee = employeeBusiness.findById(id);
if(employee == null) {
if (employee == null) {
System.out.println("Unable to delete. Employee with id :" + id + "not found");
return new ResponseEntity<Employee>(HttpStatus.NOT_FOUND);
}
employeeBusiness.deleteById(id);
return new ResponseEntity<Employee>(HttpStatus.NO_CONTENT);
return new ResponseEntity<Employee>(HttpStatus.NO_CONTENT);
}
// paging
@RequestMapping( value ="/paging_employee",params = {"page","size"}, method = RequestMethod.GET)
public ResponseEntity<List<Employee>> getAllEmployee(Pageable pageable) {
logger.info("Rest request to get a page of Employee");
Page<Employee> page = employeeBusiness.findAll(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/paging_employee");
return ResponseEntity.ok().headers(headers).body(page.getContent());
}
......
package com.itsol.quantrivanphong.manager.employee.repository;
import com.itsol.quantrivanphong.model.Employee;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
......@@ -16,7 +18,7 @@ public interface EmployeeRepository extends JpaRepository<Employee,Integer > {
public Employee findEmployeeByUsernameAndPassword(String username, String password);
Employee findByEmailAddress(String emailAddress);
Page<Employee> findByFirstName(String firstName, Pageable pageable);
//==================================================================================================================
......
package com.itsol.quantrivanphong.manager.employee.util;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpHeaders;
import org.springframework.web.util.UriComponentsBuilder;
public final class PaginationUtil {
private PaginationUtil() {
}
public static HttpHeaders generatePaginationHttpHeaders(Page page, String baseUrl) {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Total-Count", "" + Long.toString(page.getTotalElements()));
String link = "";
if ((page.getNumber() + 1) < page.getTotalPages()) {
link = "<" + generateUri(baseUrl, page.getNumber() + 1, page.getSize()) + ">; rel=\"next\",";
}
// prev link
if ((page.getNumber()) > 0) {
link += "<" + generateUri(baseUrl, page.getNumber() - 1, page.getSize()) + ">; rel=\"prev\",";
}
// last and first link
int lastPage = 0;
if (page.getTotalPages() > 0) {
lastPage = page.getTotalPages() - 1;
}
link += "<" + generateUri(baseUrl, lastPage, page.getSize()) + ">; rel=\"last\",";
link += "<" + generateUri(baseUrl, 0, page.getSize()) + ">; rel=\"first\"";
headers.add(HttpHeaders.LINK, link);
return headers;
}
private static String generateUri(String baseUrl, int page, int size) {
return UriComponentsBuilder.fromUriString(baseUrl).queryParam("page", page).queryParam("size", size).toUriString();
}
}
......@@ -5,6 +5,8 @@ import com.itsol.quantrivanphong.report.issue.common.AbstractEntityManagerDao;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
@Service
public class EmployeeRepositoryImpl extends AbstractEntityManagerDao<Integer, Employee> {
private Logger logger = Logger.getLogger(EmployeeRepositoryImpl.class);
......
package com.itsol.quantrivanphong.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.itsol.quantrivanphong.audit.DateAudit;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"},
allowGetters = true)
@Table(name = "catalogi")
public class Catalogi {
public class Catalogi extends DateAudit {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......@@ -30,10 +37,8 @@ public class Catalogi {
@Column(name = "descriptions")
private String descriptions;
@JsonIgnore
@OneToMany(mappedBy = "catalogi", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<News> newsList = new ArrayList<>();
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "catalogi")
private List<News> news = new ArrayList<>();
}
......@@ -30,6 +30,7 @@ public class Employee {
@Column(name = "password", length = 128)
private String password;
@Column(name = "confirm_password")
@Size(min = 5, max = 20)
private String confirmPassword;
......@@ -79,10 +80,11 @@ public class Employee {
@Column(name = "status", nullable = false)
private boolean status;
@JsonIgnore
// @JsonIgnore
@OneToMany(mappedBy = "employee", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<News> newsList = new ArrayList<>();
@JsonIgnore
@OneToMany(mappedBy = "employee", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<LeaveForm> leaveFormList = new ArrayList<>();
......
package com.itsol.quantrivanphong.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.itsol.quantrivanphong.audit.DateAudit;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
......@@ -37,15 +40,18 @@ public class News extends DateAudit {
@Column(name = "status")
private boolean status;
// @JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
// @JoinColumn(name = "catalogid", nullable = false)
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "catalogi_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Catalogi catalogi;
// @JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
// @JoinColumn(name = "employeeid", nullable = false)
private Employee employee;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Employee employee;
......
......@@ -26,11 +26,11 @@ public class LeaveFormBusiness {
return leaveFormRepository.findAll();
}
public String insertLeaveForm(int employee_Id, LeaveFormDTO leaveFormDTO, int leavetype_Id) {
public String addLeaveForm(LeaveFormDTO leaveFormDTO) {
String message;
Employee employee = employeeRepository.findEmployeeById(employee_Id);
LeaveType leaveType = leaveTypeRepository.findLeaveTypeById(leavetype_Id);
Employee employee = employeeRepository.findEmployeeById(leaveFormDTO.getEmployeeId());
LeaveType leaveType = leaveTypeRepository.findLeaveTypeById(leaveFormDTO.getLeaveTypeId());
if (employee != null) {
if (leaveType != null) {
......@@ -56,36 +56,32 @@ public class LeaveFormBusiness {
}
@Transactional
public String deleteLeaveForm(int emloyee_Id, int leaveform_Id) {
public String deleteLeaveForm(int leaveFormId) {
String message;
Employee employee = employeeRepository.findEmployeeById(emloyee_Id);
LeaveForm leaveForm = leaveFormRepository.findLeaveFormByEmployeeAndId(employee, leaveform_Id);
if (employee != null) {
if (leaveForm != null) {
leaveFormRepository.delete(leaveForm);
if (leaveFormRepository.findLeaveFormByEmployeeAndId(employee, leaveform_Id) != null) {
message = "Delete failed!";
} else {
message = "Delete success!";
}
LeaveForm leaveForm = leaveFormRepository.findLeaveFormById(leaveFormId);
if (leaveForm != null) {
leaveFormRepository.delete(leaveForm);
if (leaveFormRepository.findLeaveFormById(leaveFormId) != null) {
message = "Delete failed!";
} else {
message = "Leave Form does not exist";
message = "Delete success!";
}
} else {
message = "Employee does not exist";
message = "Leave Form does not exist";
}
return message;
}
@Transactional
public String updateLeaveForm(int employee_Id, int leavetype_Id, int leaveform_Id, LeaveFormDTO leaveFormDTO) {
public String updateLeaveForm(LeaveFormDTO leaveFormDTO) {
String message;
Employee employee = employeeRepository.findEmployeeById(employee_Id);
LeaveType leaveType = leaveTypeRepository.findLeaveTypeById(leavetype_Id);
LeaveForm leaveForm = leaveFormRepository.findLeaveFormByEmployeeAndLeaveTypeAndId(employee, leaveType, leaveform_Id);
Employee employee = employeeRepository.findEmployeeById(leaveFormDTO.getEmployeeId());
LeaveType leaveType = leaveTypeRepository.findLeaveTypeById(leaveFormDTO.getLeaveTypeId());
LeaveForm leaveForm = leaveFormRepository.findLeaveFormByEmployeeAndLeaveTypeAndId(employee, leaveType, leaveFormDTO.getId());
if (leaveType != null) {
if (leaveForm != null) {
int i = leaveFormRepository.updateLeaveForm(leaveFormDTO.getTitle(), leaveFormDTO.getContent(), leaveform_Id);
int i = leaveFormRepository.updateLeaveForm(leaveFormDTO.getTitle(), leaveFormDTO.getContent(), leaveFormDTO.getId());
if (i == 1) {
message = "Update success";
} else {
......@@ -102,17 +98,19 @@ public class LeaveFormBusiness {
}
@Transactional
public String updateLeaveFormStatus(int employee_Id, int leavetype_Id, int leaveform_Id) {
public String updateLeaveFormStatus(int leaveformId) {
String message;
Employee employee = employeeRepository.findEmployeeById(employee_Id);
LeaveType leaveType = leaveTypeRepository.findLeaveTypeById(leavetype_Id);
LeaveForm leaveForm = leaveFormRepository.findLeaveFormByEmployeeAndLeaveTypeAndId(employee, leaveType, leaveform_Id);
LeaveForm leaveForm = leaveFormRepository.findLeaveFormById(leaveformId);
if (leaveForm != null) {
int i = leaveFormRepository.updateLeaveFormStatus(leaveform_Id);
if (i == 1) {
message = "Update status success";
if (leaveForm.isStatus()) {
message = "Status can not change";
} else {
message = "Update status failed";
int i = leaveFormRepository.updateLeaveFormStatus(leaveformId);
if (i == 1) {
message = "Update status success";
} else {
message = "Update status failed";
}
}
} else {
message = "Leave Form does not exist";
......@@ -121,8 +119,8 @@ public class LeaveFormBusiness {
return message;
}
public List<LeaveForm> leaveFormById(int employee_Id) {
Employee employee = employeeRepository.findEmployeeById(employee_Id);
public List<LeaveForm> showLeaveFormByEmployeeId(int employeeId) {
Employee employee = employeeRepository.findEmployeeById(employeeId);
if (employee != null) {
if (leaveFormRepository.showLeaveFormById(employee) != null) {
return leaveFormRepository.showLeaveFormById(employee);
......@@ -133,4 +131,8 @@ public class LeaveFormBusiness {
return null;
}
}
public LeaveForm showLeaveFormById(int id) {
return leaveFormRepository.findLeaveFormById(id);
}
}
......@@ -5,10 +5,10 @@ import com.itsol.quantrivanphong.report.leaveform.business.LeaveFormBusiness;
import com.itsol.quantrivanphong.report.leaveform.dto.LeaveFormDTO;
import com.itsol.quantrivanphong.model.LeaveForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
......@@ -17,59 +17,63 @@ public class LeaveFormController {
@Autowired
LeaveFormBusiness leaveFormBusiness;
@GetMapping(path = "/leaveform")
@GetMapping(path = "/leaveform/show")
public ResponseEntity<List<LeaveForm>> showAllLeaveForm() {
return ResponseEntity.ok(leaveFormBusiness.findAll());
}
@PostMapping(path = "/{employee_Id}/leavetype/{leavetype_Id}/leaveform", consumes = "application/json", produces = "application/json")
public ResponseEntity<String> insertLeaveForm(@PathVariable int employee_Id, @Valid @RequestBody LeaveFormDTO leaveFormDTO, @PathVariable int leavetype_Id) {
@PostMapping(path = "/leaveform/add", consumes = "application/json", produces = "application/json")
public ResponseEntity addLeaveForm(@RequestBody LeaveFormDTO leaveFormDTO) {
String message;
try {
if (leaveFormDTO.getTitle().trim().equals("")) throw new InputException("Tiêu đề không được để trống");
if (leaveFormDTO.getContent().trim().equals("")) throw new InputException("Nội dung không được để trống");
message = leaveFormBusiness.insertLeaveForm(employee_Id, leaveFormDTO, leavetype_Id);
message = leaveFormBusiness.addLeaveForm(leaveFormDTO);
} catch (InputException e) {
message = e.getMessage();
}
return ResponseEntity.ok(message);
return ResponseEntity.ok(new Notification(200, message));
}
@DeleteMapping("/{employee_Id}/leaveform/{leaveform_Id}")
public ResponseEntity<String> deleteLeaveForm(@PathVariable int employee_Id, @Valid @PathVariable int leaveform_Id) {
return ResponseEntity.ok(leaveFormBusiness.deleteLeaveForm(employee_Id, leaveform_Id));
@DeleteMapping("/leaveform/delete/{leaveformId}")
public ResponseEntity deleteLeaveForm(@PathVariable int leaveformId) {
return ResponseEntity.ok(new Notification(200, leaveFormBusiness.deleteLeaveForm(leaveformId)));
}
@PostMapping(path = "/{employee_Id}/leavetype/{leavetype_Id}/leaveform/{leaveform_Id}", consumes = "application/json", produces = "application/json")
public ResponseEntity<String> updateLeaveForm(@PathVariable int employee_Id, @PathVariable int leavetype_Id, @PathVariable int leaveform_Id, @Valid @RequestBody LeaveFormDTO leaveFormDTO) {
@PostMapping(path = "/leaveform/update", consumes = "application/json", produces = "application/json")
public ResponseEntity updateLeaveForm(@RequestBody LeaveFormDTO leaveFormDTO) {
String message;
try {
if (leaveFormDTO.getTitle().trim().equals("")) throw new InputException("Tiêu đề không được để trống");
if (leaveFormDTO.getContent().trim().equals("")) throw new InputException("Nội dung không được để trống");
message = leaveFormBusiness.updateLeaveForm(employee_Id, leavetype_Id, leaveform_Id, leaveFormDTO);
message = leaveFormBusiness.updateLeaveForm(leaveFormDTO);
} catch (InputException e) {
message = e.getMessage();
}
return ResponseEntity.ok(message);
return ResponseEntity.ok(new Notification(200, message));
}
@PostMapping(path = "/{employee_Id}/leavetype/{leavetype_Id}/leaveform/{leaveform_Id}/status", consumes = "application/json", produces = "application/json")
public ResponseEntity<String> updateLeaveFormStatus(@PathVariable int employee_Id, @PathVariable int leavetype_Id, @PathVariable int leaveform_Id) {
@PostMapping(path = "/leaveform/{leaveformId}/status")
public ResponseEntity updateLeaveFormStatus(@PathVariable int leaveformId) {
String message;
message = leaveFormBusiness.updateLeaveFormStatus(employee_Id, leavetype_Id, leaveform_Id);
return ResponseEntity.ok(message);
message = leaveFormBusiness.updateLeaveFormStatus(leaveformId);
return ResponseEntity.ok(new Notification(200, message));
}
@GetMapping("/{employee_Id}/leaveform")
public ResponseEntity<List<LeaveForm>> showLeaveFormById(@PathVariable int employee_Id) {
if (leaveFormBusiness.leaveFormById(employee_Id) != null) {
return ResponseEntity.ok(leaveFormBusiness.leaveFormById(employee_Id));
@GetMapping("/leaveform/show/{employeeId}")
public ResponseEntity<List<LeaveForm>> showLeaveFormByEmployeeId(@PathVariable int employeeId) {
if (leaveFormBusiness.showLeaveFormByEmployeeId(employeeId) != null) {
return ResponseEntity.ok(leaveFormBusiness.showLeaveFormByEmployeeId(employeeId));
} else {
return null;
}
}
@GetMapping("/leaveform/{id}")
public ResponseEntity<LeaveForm> showLeaveFormById(@PathVariable int id) {
return ResponseEntity.ok(leaveFormBusiness.showLeaveFormById(id));
}
}
package com.itsol.quantrivanphong.report.leaveform.controller;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Notification {
private int status;
private String view;
}
......@@ -12,6 +12,6 @@ public class LeaveFormDTO {
private String title;
private String content;
private boolean status;
private int employee_id;
private int leave_type_id;
private int employeeId;
private int leaveTypeId;
}
......@@ -15,7 +15,7 @@ public interface LeaveFormRepository extends JpaRepository<LeaveForm, Integer> {
LeaveForm findLeaveFormByEmployeeAndId(Employee employee, int id);
// LeaveForm findLeaveFormById(int i);
LeaveForm findLeaveFormById(int i);
LeaveForm findLeaveFormByEmployeeAndLeaveTypeAndId(Employee employee, LeaveType leaveType, int id);
......
......@@ -21,9 +21,9 @@ public class TimeSheetBusiness {
EProjectRepository eProjectRepository;
@Autowired
EmployeeRepository employeeRepository;
public String insertTimeSheet(int employee_Id, TimeSheetDTO timeSheetDTO) {
public String addTimeSheet(TimeSheetDTO timeSheetDTO) {
String message;
Employee employee = employeeRepository.findEmployeeById(employee_Id);
Employee employee = employeeRepository.findEmployeeById(timeSheetDTO.getEmployeeId());
Eproject eproject = eProjectRepository.findEprojectByIdAndEmployee(timeSheetDTO.getEprojectId(), employee);
if (eproject != null) {
// SimpleDateFormat formatter= new SimpleDateFormat("dd-MM-yyyy HH:mm");
......@@ -34,7 +34,7 @@ public class TimeSheetBusiness {
timeSheet1.setContent(timeSheetDTO.getContent());
timeSheet1.setNote(timeSheetDTO.getNote());
timeSheet1.setEproject(eproject);
timeSheet1.setChecked("");
timeSheet1.setChecked("unapproved");
timeSheet1.setStatus(true);
TimeSheet timeSheet = timeSheetRepository.save(timeSheet1);
......@@ -49,14 +49,14 @@ public class TimeSheetBusiness {
return message;
}
public String deleteTimeSheet(int employee_Id, int timeSheet_Id) {
public String deleteTimeSheet(int timeSheetId) {
String message;
Employee employee = employeeRepository.findEmployeeById(employee_Id);
Eproject eproject = eProjectRepository.findEprojectByEmployee(employee);
TimeSheet timeSheet = timeSheetRepository.findTimeSheetByEprojectAndId(eproject, timeSheet_Id);
// Employee employee = employeeRepository.findEmployeeById(employee_Id);
// Eproject eproject = eProjectRepository.findEprojectByEmployee(employee);
TimeSheet timeSheet = timeSheetRepository.findTimeSheetById(timeSheetId);
if (timeSheet != null) {
timeSheetRepository.delete(timeSheet);
if (timeSheetRepository.findTimeSheetByEprojectAndId(eproject, timeSheet_Id) == null) {
if (timeSheetRepository.findTimeSheetById(timeSheetId) == null) {
message = "Delete success";
} else {
message = "Delete failed";
......@@ -72,15 +72,15 @@ public class TimeSheetBusiness {
}
@Transactional
public String updateTimeSheet(int employee_Id, TimeSheetDTO timeSheetDTO, int timesheet_Id) {
public String updateTimeSheet(TimeSheetDTO timeSheetDTO) {
String message;
Employee employee = employeeRepository.findEmployeeById(employee_Id);
Employee employee = employeeRepository.findEmployeeById(timeSheetDTO.getEmployeeId());
Eproject eproject = eProjectRepository.findEprojectByEmployee(employee);
TimeSheet timeSheet = timeSheetRepository.findTimeSheetByEprojectAndId(eproject, timesheet_Id);
TimeSheet timeSheet = timeSheetRepository.findTimeSheetByEprojectAndId(eproject, timeSheetDTO.getId());
if (eproject != null) {
if (timeSheet != null) {
int i = timeSheetRepository.updateTimeSheet(timeSheetDTO.getTitle(), timeSheetDTO.getContent()
, timeSheetDTO.getNote(), timesheet_Id);
, timeSheetDTO.getNote(), timeSheetDTO.getId());
if (i == 1) {
message = "Update success";
} else {
......@@ -95,10 +95,22 @@ public class TimeSheetBusiness {
return message;
}
@Transactional
public String updateCheck(TimeSheetDTO timeSheetDTO) {
String message;
int i = timeSheetRepository.updateCheck(timeSheetDTO.getChecked(), timeSheetDTO.getId());
if (i == 1) {
message = "Success";
} else {
message = "Failed";
}
return message;
}
// @Transactional
// public String updateLeaveFormStatus(TimeSheetDTO timeSheetDTO) {
// String message;
// TimeSheet timeSheet = timeSheetRepository.findTimeSheetById(timeSheetDTO.getId());
// TimeSheet timeSheet = timeSheetRepository.findTimeSheetByEmployeeId(timeSheetDTO.getId());
// if (timeSheet != null) {
// int i = timeSheetRepository.updateTimeSheetStatus(timeSheetDTO.isStatus(), timeSheetDTO.getId());
// if (i == 1) {
......@@ -113,8 +125,8 @@ public class TimeSheetBusiness {
// return message;
// }
public List<TimeSheet> findTimeSheetById(int employee_Id) {
Employee employee = employeeRepository.findEmployeeById(employee_Id);
public List<TimeSheet> findTimeSheetByEmployeeId(int employeeId) {
Employee employee = employeeRepository.findEmployeeById(employeeId);
Eproject eproject = eProjectRepository.findEprojectByEmployee(employee);
if (employee != null && eproject != null && timeSheetRepository.showTimeSheetByEproject(eproject) != null) {
return timeSheetRepository.showTimeSheetByEproject(eproject);
......@@ -122,4 +134,7 @@ public class TimeSheetBusiness {
return null;
}
}
public TimeSheet findTimeSheetById(int id) {
return timeSheetRepository.findTimeSheetById(id);
}
}
......@@ -2,13 +2,13 @@ package com.itsol.quantrivanphong.report.timesheet.controller;
import com.itsol.quantrivanphong.exception.InputException;
import com.itsol.quantrivanphong.model.TimeSheet;
import com.itsol.quantrivanphong.report.leaveform.controller.Notification;
import com.itsol.quantrivanphong.report.timesheet.business.TimeSheetBusiness;
import com.itsol.quantrivanphong.report.timesheet.dto.TimeSheetDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
......@@ -16,6 +16,19 @@ import java.util.List;
public class TimeSheetController {
@Autowired
TimeSheetBusiness timeSheetBusiness;
@PostMapping(path = "/timesheet/add", consumes = "application/json", produces = "application/json")
public ResponseEntity addTimeSheet(@RequestBody TimeSheetDTO timeSheetDTO) {
String message;
try {
if (timeSheetDTO.getTitle().trim().equals("")) throw new InputException("Tiêu đề không được để trống");
if (timeSheetDTO.getContent().trim().equals("")) throw new InputException("Nội dung không được để trống");
message = timeSheetBusiness.addTimeSheet(timeSheetDTO);
} catch (InputException e) {
message = e.getMessage();
}
return ResponseEntity.ok(new Notification(200, message));
}
// @PostMapping(path = "/timesheet", consumes = "application/json", produces = "application/json")
// public ResponseEntity<String> insertTimeSheet(@RequestBody TimeSheetDTO timeSheetDTO) {
// String message;
......@@ -30,29 +43,29 @@ public class TimeSheetController {
// return ResponseEntity.ok(message);
// }
@DeleteMapping("/{employee_Id}/timesheet/{timesheet_Id}")
public ResponseEntity<String> deleteTimeSheet(@PathVariable int employee_Id, @Valid @PathVariable int timesheet_Id) {
return ResponseEntity.ok(timeSheetBusiness.deleteTimeSheet(employee_Id, timesheet_Id));
@DeleteMapping("/timesheet/delete/{timesheetId}")
public ResponseEntity deleteTimeSheet(@PathVariable int timesheetId) {
return ResponseEntity.ok(new Notification(200, timeSheetBusiness.deleteTimeSheet(timesheetId)));
}
@GetMapping(path = "/timesheet")
@GetMapping(path = "/timesheet/show")
public List<TimeSheet> showAllTimeSheet() {
return timeSheetBusiness.findAll();
}
@PostMapping(path = "/{employee_Id}/timesheet/{timesheet_Id}", consumes = "application/json", produces = "application/json")
public ResponseEntity<String> updateTimeSheet(@PathVariable int employee_Id, @PathVariable int timesheet_Id, @Valid @RequestBody TimeSheetDTO timeSheetDTO) {
@PostMapping(path = "/timesheet/update", consumes = "application/json", produces = "application/json")
public ResponseEntity updateTimeSheet(@RequestBody TimeSheetDTO timeSheetDTO) {
String message;
try {
if (timeSheetDTO.getTitle().trim().equals("")) throw new InputException("Tiêu đề không được để trống");
if (timeSheetDTO.getContent().trim().equals("")) throw new InputException("Nội dung không được để trống");
message = timeSheetBusiness.updateTimeSheet(employee_Id, timeSheetDTO, timesheet_Id);
message = timeSheetBusiness.updateTimeSheet(timeSheetDTO);
} catch (InputException e) {
message = e.getMessage();
}
return ResponseEntity.ok(message);
return ResponseEntity.ok(new Notification(200, message));
}
// @PostMapping(path = "/update-status", consumes = "application/json", produces = "application/json")
......@@ -62,8 +75,19 @@ public class TimeSheetController {
// return ResponseEntity.ok(message);
// }
@GetMapping("/{employee_Id}/timesheet")
public ResponseEntity<List<TimeSheet>> showTimeSheetById(@PathVariable int employee_Id) {
return ResponseEntity.ok(timeSheetBusiness.findTimeSheetById(employee_Id));
@GetMapping("/timesheet/show/{employeeId}")
public ResponseEntity<List<TimeSheet>> showTimeSheetByEmployeeId(@PathVariable int employeeId) {
return ResponseEntity.ok(timeSheetBusiness.findTimeSheetByEmployeeId(employeeId));
}
@GetMapping("/timesheet/{id}")
public ResponseEntity<TimeSheet> showTimeSheetById(@PathVariable int id) {
return ResponseEntity.ok(timeSheetBusiness.findTimeSheetById(id));
}
@PostMapping(path = "/timesheet/update/check", consumes = "application/json", produces = "application/json")
public ResponseEntity<String> updateCheck(@RequestBody TimeSheetDTO timeSheetDTO) {
return ResponseEntity.ok(timeSheetBusiness.updateCheck(timeSheetDTO));
}
}
\ No newline at end of file
......@@ -9,12 +9,11 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class TimeSheetDTO {
private int id;
private int employeeId;
private String title;
private String content;
private String note;
private String checked;
private boolean status;
private int eprojectId;
private int employeeId;
}
......@@ -10,14 +10,18 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.List;
public interface TimeSheetRepository extends JpaRepository<TimeSheet, Integer> {
// TimeSheet findTimeSheetById(int id);
TimeSheet findTimeSheetById(int id);
// @Query("select ts from TimeSheet ts order by ts.createdAt desc")
// List<TimeSheet> getAllTimeSheet();
@Modifying
@Query("update TimeSheet ts set ts.title = ?1, ts.content = ?2, ts.note = ?3 where ts.id = ?4")
int updateTimeSheet(String title, String content, String note, int timesheet_Id);
int updateTimeSheet(String title, String content, String note, int timeSheetId);
@Modifying
@Query("update TimeSheet ts set ts.checked = ?1 where ts.id = ?2")
int updateCheck(String check, int timeSheetId);
// @Modifying
// @Query("update TimeSheet ts set ts.status = ?1 where ts.id = ?2")
......@@ -26,7 +30,7 @@ public interface TimeSheetRepository extends JpaRepository<TimeSheet, Integer> {
@Query("select ts from TimeSheet ts where ts.eproject = ?1")
List<TimeSheet> showTimeSheetByEproject(Eproject eproject);
TimeSheet findTimeSheetByEprojectAndId(Eproject eproject, int timeSheet_Id);
TimeSheet findTimeSheetByEprojectAndId(Eproject eproject, int timeSheetId);
//==================================================================================================================
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
table.dataTable {
clear: both;
margin-top: 6px !important;
margin-bottom: 6px !important;
max-width: none !important;
border-collapse: separate !important;
border-spacing: 0;
}
table.dataTable td,
table.dataTable th {
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
table.dataTable td.dataTables_empty,
table.dataTable th.dataTables_empty {
text-align: center;
}
table.dataTable.nowrap th,
table.dataTable.nowrap td {
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_length label {
font-weight: normal;
text-align: left;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_length select {
width: auto;
display: inline-block;
}
div.dataTables_wrapper div.dataTables_filter {
text-align: right;
}
div.dataTables_wrapper div.dataTables_filter label {
font-weight: normal;
white-space: nowrap;
text-align: left;
}
div.dataTables_wrapper div.dataTables_filter input {
margin-left: 0.5em;
display: inline-block;
width: auto;
}
div.dataTables_wrapper div.dataTables_info {
padding-top: 0.85em;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_paginate {
margin: 0;
white-space: nowrap;
text-align: right;
}
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
margin: 2px 0;
white-space: nowrap;
justify-content: flex-end;
}
div.dataTables_wrapper div.dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
margin-left: -100px;
margin-top: -26px;
text-align: center;
padding: 1em 0;
}
table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
table.dataTable thead > tr > td.sorting_asc,
table.dataTable thead > tr > td.sorting_desc,
table.dataTable thead > tr > td.sorting {
padding-right: 30px;
}
table.dataTable thead > tr > th:active,
table.dataTable thead > tr > td:active {
outline: none;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
cursor: pointer;
position: relative;
}
table.dataTable thead .sorting:before, table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:before,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:before,
table.dataTable thead .sorting_desc:after,
table.dataTable thead .sorting_asc_disabled:before,
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:before,
table.dataTable thead .sorting_desc_disabled:after {
position: absolute;
bottom: 0.9em;
display: block;
opacity: 0.3;
}
table.dataTable thead .sorting:before,
table.dataTable thead .sorting_asc:before,
table.dataTable thead .sorting_desc:before,
table.dataTable thead .sorting_asc_disabled:before,
table.dataTable thead .sorting_desc_disabled:before {
right: 1em;
content: "\2191";
}
table.dataTable thead .sorting:after,
table.dataTable thead .sorting_asc:after,
table.dataTable thead .sorting_desc:after,
table.dataTable thead .sorting_asc_disabled:after,
table.dataTable thead .sorting_desc_disabled:after {
right: 0.5em;
content: "\2193";
}
table.dataTable thead .sorting_asc:before,
table.dataTable thead .sorting_desc:after {
opacity: 1;
}
table.dataTable thead .sorting_asc_disabled:before,
table.dataTable thead .sorting_desc_disabled:after {
opacity: 0;
}
div.dataTables_scrollHead table.dataTable {
margin-bottom: 0 !important;
}
div.dataTables_scrollBody table {
border-top: none;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
div.dataTables_scrollBody table thead .sorting:before,
div.dataTables_scrollBody table thead .sorting_asc:before,
div.dataTables_scrollBody table thead .sorting_desc:before,
div.dataTables_scrollBody table thead .sorting:after,
div.dataTables_scrollBody table thead .sorting_asc:after,
div.dataTables_scrollBody table thead .sorting_desc:after {
display: none;
}
div.dataTables_scrollBody table tbody tr:first-child th,
div.dataTables_scrollBody table tbody tr:first-child td {
border-top: none;
}
div.dataTables_scrollFoot > .dataTables_scrollFootInner {
box-sizing: content-box;
}
div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
margin-top: 0 !important;
border-top: none;
}
@media screen and (max-width: 767px) {
div.dataTables_wrapper div.dataTables_length,
div.dataTables_wrapper div.dataTables_filter,
div.dataTables_wrapper div.dataTables_info,
div.dataTables_wrapper div.dataTables_paginate {
text-align: center;
}
}
table.dataTable.table-sm > thead > tr > th {
padding-right: 20px;
}
table.dataTable.table-sm .sorting:before,
table.dataTable.table-sm .sorting_asc:before,
table.dataTable.table-sm .sorting_desc:before {
top: 5px;
right: 0.85em;
}
table.dataTable.table-sm .sorting:after,
table.dataTable.table-sm .sorting_asc:after,
table.dataTable.table-sm .sorting_desc:after {
top: 5px;
}
table.table-bordered.dataTable th,
table.table-bordered.dataTable td {
border-left-width: 0;
}
table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
table.table-bordered.dataTable td:last-child,
table.table-bordered.dataTable td:last-child {
border-right-width: 0;
}
table.table-bordered.dataTable tbody th,
table.table-bordered.dataTable tbody td {
border-bottom-width: 0;
}
div.dataTables_scrollHead table.table-bordered {
border-bottom-width: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row {
margin: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
padding-left: 0;
}
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
padding-right: 0;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/*! DataTables Bootstrap 4 integration
* ©2011-2017 SpryMedia Ltd - datatables.net/license
*/
/**
* DataTables integration for Bootstrap 4. This requires Bootstrap 4 and
* DataTables 1.10 or newer.
*
* This file sets the defaults and adds options to DataTables to style its
* controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
* for further information.
*/
(function( factory ){
if ( typeof define === 'function' && define.amd ) {
// AMD
define( ['common/common/js/jquery', 'datatables.net'], function ($ ) {
return factory( $, window, document );
} );
}
else if ( typeof exports === 'object' ) {
// CommonJS
module.exports = function (root, $) {
if ( ! root ) {
root = window;
}
if ( ! $ || ! $.fn.dataTable ) {
// Require DataTables, which attaches to jQuery, including
// jQuery if needed and have a $ property so we can access the
// jQuery object that is used
$ = require('datatables.net')(root, $).$;
}
return factory( $, root, root.document );
};
}
else {
// Browser
factory( jQuery, window, document );
}
}(function( $, window, document, undefined ) {
'use strict';
var DataTable = $.fn.dataTable;
/* Set the defaults for DataTables initialisation */
$.extend( true, DataTable.defaults, {
dom:
"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
renderer: 'bootstrap'
} );
/* Default class modification */
$.extend( DataTable.ext.classes, {
sWrapper: "dataTables_wrapper dt-bootstrap4",
sFilterInput: "form-control form-control-sm",
sLengthSelect: "custom-select custom-select-sm form-control form-control-sm",
sProcessing: "dataTables_processing card",
sPageButton: "paginate_button page-item"
} );
/* Bootstrap paging button renderer */
DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
var api = new DataTable.Api( settings );
var classes = settings.oClasses;
var lang = settings.oLanguage.oPaginate;
var aria = settings.oLanguage.oAria.paginate || {};
var btnDisplay, btnClass, counter=0;
var attach = function( container, buttons ) {
var i, ien, node, button;
var clickHandler = function ( e ) {
e.preventDefault();
if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
api.page( e.data.action ).draw( 'page' );
}
};
for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
button = buttons[i];
if ( $.isArray( button ) ) {
attach( container, button );
}
else {
btnDisplay = '';
btnClass = '';
switch ( button ) {
case 'ellipsis':
btnDisplay = '&#x2026;';
btnClass = 'disabled';
break;
case 'first':
btnDisplay = lang.sFirst;
btnClass = button + (page > 0 ?
'' : ' disabled');
break;
case 'previous':
btnDisplay = lang.sPrevious;
btnClass = button + (page > 0 ?
'' : ' disabled');
break;
case 'next':
btnDisplay = lang.sNext;
btnClass = button + (page < pages-1 ?
'' : ' disabled');
break;
case 'last':
btnDisplay = lang.sLast;
btnClass = button + (page < pages-1 ?
'' : ' disabled');
break;
default:
btnDisplay = button + 1;
btnClass = page === button ?
'active' : '';
break;
}
if ( btnDisplay ) {
node = $('<li>', {
'class': classes.sPageButton+' '+btnClass,
'id': idx === 0 && typeof button === 'string' ?
settings.sTableId +'_'+ button :
null
} )
.append( $('<a>', {
'href': '#',
'aria-controls': settings.sTableId,
'aria-label': aria[ button ],
'data-dt-idx': counter,
'tabindex': settings.iTabIndex,
'class': 'page-link'
} )
.html( btnDisplay )
)
.appendTo( container );
settings.oApi._fnBindAction(
node, {action: button}, clickHandler
);
counter++;
}
}
}
};
// IE9 throws an 'unknown error' if document.activeElement is used
// inside an iframe or frame.
var activeEl;
try {
// Because this approach is destroying and recreating the paging
// elements, focus is lost on the select button which is bad for
// accessibility. So we want to restore focus once the draw has
// completed
activeEl = $(host).find(document.activeElement).data('dt-idx');
}
catch (e) {}
attach(
$(host).empty().html('<ul class="pagination"/>').children('ul'),
buttons
);
if ( activeEl !== undefined ) {
$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
}
};
return DataTable;
}));
/*!
DataTables Bootstrap 4 integration
©2011-2017 SpryMedia Ltd - datatables.net/license
*/
(function(b){"function"===typeof define&&define.amd?define(["common/common/js/jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a, d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b, a, d, m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
renderer:"bootstrap"});b.extend(f.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();
!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",
{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#","aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex,"class":"page-link"}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),s);i!==m&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
/*
* jQuery Easing v1.4.1 - http://gsgd.co.uk/sandbox/jquery/easing/
* Open source under the BSD License.
* Copyright © 2008 George McGinley Smith
* All rights reserved.
* https://raw.github.com/gdsmith/jquery-easing/master/LICENSE
*/
(function (factory) {
if (typeof define === "function" && define.amd) {
define(['common/common/js/jquery'], function ($) {
return factory($);
});
} else if (typeof module === "object" && typeof module.exports === "object") {
exports = factory(require('common/common/js/jquery'));
} else {
factory(jQuery);
}
})(function($){
// Preserve the original jQuery "swing" easing as "jswing"
$.easing.jswing = $.easing.swing;
var pow = Math.pow,
sqrt = Math.sqrt,
sin = Math.sin,
cos = Math.cos,
PI = Math.PI,
c1 = 1.70158,
c2 = c1 * 1.525,
c3 = c1 + 1,
c4 = ( 2 * PI ) / 3,
c5 = ( 2 * PI ) / 4.5;
// x is the fraction of animation progress, in the range 0..1
function bounceOut(x) {
var n1 = 7.5625,
d1 = 2.75;
if ( x < 1/d1 ) {
return n1*x*x;
} else if ( x < 2/d1 ) {
return n1*(x-=(1.5/d1))*x + 0.75;
} else if ( x < 2.5/d1 ) {
return n1*(x-=(2.25/d1))*x + 0.9375;
} else {
return n1*(x-=(2.625/d1))*x + 0.984375;
}
}
$.extend( $.easing,
{
def: 'easeOutQuad',
swing: function (x) {
return $.easing[$.easing.def](x);
},
easeInQuad: function (x) {
return x * x;
},
easeOutQuad: function (x) {
return 1 - ( 1 - x ) * ( 1 - x );
},
easeInOutQuad: function (x) {
return x < 0.5 ?
2 * x * x :
1 - pow( -2 * x + 2, 2 ) / 2;
},
easeInCubic: function (x) {
return x * x * x;
},
easeOutCubic: function (x) {
return 1 - pow( 1 - x, 3 );
},
easeInOutCubic: function (x) {
return x < 0.5 ?
4 * x * x * x :
1 - pow( -2 * x + 2, 3 ) / 2;
},
easeInQuart: function (x) {
return x * x * x * x;
},
easeOutQuart: function (x) {
return 1 - pow( 1 - x, 4 );
},
easeInOutQuart: function (x) {
return x < 0.5 ?
8 * x * x * x * x :
1 - pow( -2 * x + 2, 4 ) / 2;
},
easeInQuint: function (x) {
return x * x * x * x * x;
},
easeOutQuint: function (x) {
return 1 - pow( 1 - x, 5 );
},
easeInOutQuint: function (x) {
return x < 0.5 ?
16 * x * x * x * x * x :
1 - pow( -2 * x + 2, 5 ) / 2;
},
easeInSine: function (x) {
return 1 - cos( x * PI/2 );
},
easeOutSine: function (x) {
return sin( x * PI/2 );
},
easeInOutSine: function (x) {
return -( cos( PI * x ) - 1 ) / 2;
},
easeInExpo: function (x) {
return x === 0 ? 0 : pow( 2, 10 * x - 10 );
},
easeOutExpo: function (x) {
return x === 1 ? 1 : 1 - pow( 2, -10 * x );
},
easeInOutExpo: function (x) {
return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ?
pow( 2, 20 * x - 10 ) / 2 :
( 2 - pow( 2, -20 * x + 10 ) ) / 2;
},
easeInCirc: function (x) {
return 1 - sqrt( 1 - pow( x, 2 ) );
},
easeOutCirc: function (x) {
return sqrt( 1 - pow( x - 1, 2 ) );
},
easeInOutCirc: function (x) {
return x < 0.5 ?
( 1 - sqrt( 1 - pow( 2 * x, 2 ) ) ) / 2 :
( sqrt( 1 - pow( -2 * x + 2, 2 ) ) + 1 ) / 2;
},
easeInElastic: function (x) {
return x === 0 ? 0 : x === 1 ? 1 :
-pow( 2, 10 * x - 10 ) * sin( ( x * 10 - 10.75 ) * c4 );
},
easeOutElastic: function (x) {
return x === 0 ? 0 : x === 1 ? 1 :
pow( 2, -10 * x ) * sin( ( x * 10 - 0.75 ) * c4 ) + 1;
},
easeInOutElastic: function (x) {
return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ?
-( pow( 2, 20 * x - 10 ) * sin( ( 20 * x - 11.125 ) * c5 )) / 2 :
pow( 2, -20 * x + 10 ) * sin( ( 20 * x - 11.125 ) * c5 ) / 2 + 1;
},
easeInBack: function (x) {
return c3 * x * x * x - c1 * x * x;
},
easeOutBack: function (x) {
return 1 + c3 * pow( x - 1, 3 ) + c1 * pow( x - 1, 2 );
},
easeInOutBack: function (x) {
return x < 0.5 ?
( pow( 2 * x, 2 ) * ( ( c2 + 1 ) * 2 * x - c2 ) ) / 2 :
( pow( 2 * x - 2, 2 ) *( ( c2 + 1 ) * ( x * 2 - 2 ) + c2 ) + 2 ) / 2;
},
easeInBounce: function (x) {
return 1 - bounceOut( 1 - x );
},
easeOutBounce: bounceOut,
easeInOutBounce: function (x) {
return x < 0.5 ?
( 1 - bounceOut( 1 - 2 * x ) ) / 2 :
( 1 + bounceOut( 2 * x - 1 ) ) / 2;
}
});
});
(function(factory){if(typeof define==="function"&&define.amd){define(["common/common/js/jquery"],function($){return factory($)})}else if(typeof module==="object"&&typeof module.exports==="object"){exports=factory(require("common/common/js/jquery"))}else{factory(jQuery)}})(function($){$.easing.jswing=$.easing.swing;var pow=Math.pow,sqrt=Math.sqrt,sin=Math.sin,cos=Math.cos,PI=Math.PI,c1=1.70158,c2=c1*1.525,c3=c1+1,c4=2*PI/3,c5=2*PI/4.5;function bounceOut(x){var n1=7.5625,d1=2.75;if(x<1/d1){return n1*x*x}else if(x<2/d1){return n1*(x-=1.5/d1)*x+.75}else if(x<2.5/d1){return n1*(x-=2.25/d1)*x+.9375}else{return n1*(x-=2.625/d1)*x+.984375}}$.extend($.easing,{def:"easeOutQuad",swing:function(x){return $.easing[$.easing.def](x)},easeInQuad:function(x){return x*x},easeOutQuad:function(x){return 1-(1-x)*(1-x)},easeInOutQuad:function(x){return x<.5?2*x*x:1-pow(-2*x+2,2)/2},easeInCubic:function(x){return x*x*x},easeOutCubic:function(x){return 1-pow(1-x,3)},easeInOutCubic:function(x){return x<.5?4*x*x*x:1-pow(-2*x+2,3)/2},easeInQuart:function(x){return x*x*x*x},easeOutQuart:function(x){return 1-pow(1-x,4)},easeInOutQuart:function(x){return x<.5?8*x*x*x*x:1-pow(-2*x+2,4)/2},easeInQuint:function(x){return x*x*x*x*x},easeOutQuint:function(x){return 1-pow(1-x,5)},easeInOutQuint:function(x){return x<.5?16*x*x*x*x*x:1-pow(-2*x+2,5)/2},easeInSine:function(x){return 1-cos(x*PI/2)},easeOutSine:function(x){return sin(x*PI/2)},easeInOutSine:function(x){return-(cos(PI*x)-1)/2},easeInExpo:function(x){return x===0?0:pow(2,10*x-10)},easeOutExpo:function(x){return x===1?1:1-pow(2,-10*x)},easeInOutExpo:function(x){return x===0?0:x===1?1:x<.5?pow(2,20*x-10)/2:(2-pow(2,-20*x+10))/2},easeInCirc:function(x){return 1-sqrt(1-pow(x,2))},easeOutCirc:function(x){return sqrt(1-pow(x-1,2))},easeInOutCirc:function(x){return x<.5?(1-sqrt(1-pow(2*x,2)))/2:(sqrt(1-pow(-2*x+2,2))+1)/2},easeInElastic:function(x){return x===0?0:x===1?1:-pow(2,10*x-10)*sin((x*10-10.75)*c4)},easeOutElastic:function(x){return x===0?0:x===1?1:pow(2,-10*x)*sin((x*10-.75)*c4)+1},easeInOutElastic:function(x){return x===0?0:x===1?1:x<.5?-(pow(2,20*x-10)*sin((20*x-11.125)*c5))/2:pow(2,-20*x+10)*sin((20*x-11.125)*c5)/2+1},easeInBack:function(x){return c3*x*x*x-c1*x*x},easeOutBack:function(x){return 1+c3*pow(x-1,3)+c1*pow(x-1,2)},easeInOutBack:function(x){return x<.5?pow(2*x,2)*((c2+1)*2*x-c2)/2:(pow(2*x-2,2)*((c2+1)*(x*2-2)+c2)+2)/2},easeInBounce:function(x){return 1-bounceOut(1-x)},easeOutBounce:bounceOut,easeInOutBounce:function(x){return x<.5?(1-bounceOut(1-2*x))/2:(1+bounceOut(2*x-1))/2}})});
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
(function($) {
"use strict"; // Start of use strict
// Toggle the side navigation
$("#sidebarToggle").on('click', function(e) {
e.preventDefault();
$("body").toggleClass("sidebar-toggled");
$(".sidebar").toggleClass("toggled");
});
// Prevent the content wrapper from scrolling when the fixed side navigation hovered over
$('body.fixed-nav .sidebar').on('mousewheel DOMMouseScroll wheel', function(e) {
if ($(window).width() > 768) {
var e0 = e.originalEvent,
delta = e0.wheelDelta || -e0.detail;
this.scrollTop += (delta < 0 ? 1 : -1) * 30;
e.preventDefault();
}
});
// Scroll to top button appear
$(document).on('scroll', function() {
var scrollDistance = $(this).scrollTop();
if (scrollDistance > 100) {
$('.scroll-to-top').fadeIn();
} else {
$('.scroll-to-top').fadeOut();
}
});
// Smooth scrolling using jQuery easing
$(document).on('click', 'a.scroll-to-top', function(event) {
var $anchor = $(this);
$('html, body').stop().animate({
scrollTop: ($($anchor.attr('href')).offset().top)
}, 1000, 'easeInOutExpo');
event.preventDefault();
});
})(jQuery); // End of use strict
/*!
* Start Bootstrap - SB Admin v5.0.3 (https://startbootstrap.com/template-overviews/sb-admin)
* Copyright 2013-2019 Start Bootstrap
* Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-sb-admin/blob/master/LICENSE)
*/
!function(l){"use strict";l("#sidebarToggle").on("click",function(o){o.preventDefault(),l("body").toggleClass("sidebar-toggled"),l(".sidebar").toggleClass("toggled")}),l("body.fixed-nav .sidebar").on("mousewheel DOMMouseScroll wheel",function(o){if(768<l(window).width()){var e=o.originalEvent,t=e.wheelDelta||-e.detail;this.scrollTop+=30*(t<0?1:-1),o.preventDefault()}}),l(document).on("scroll",function(){100<l(this).scrollTop()?l(".scroll-to-top").fadeIn():l(".scroll-to-top").fadeOut()}),l(document).on("click","a.scroll-to-top",function(o){var e=l(this);l("html, body").stop().animate({scrollTop:l(e.attr("href")).offset().top},1e3,"easeInOutExpo"),o.preventDefault()})}(jQuery);
\ No newline at end of file
This diff is collapsed.
#myFooter {
background-color: #373a48;
color:white;
}
#myFooter .footer-copyright{
background-color: #383737;
padding-top:3px;
padding-bottom:3px;
text-align: center;
}
#myFooter .footer-copyright p{
margin:10px;
color: #ccc;
}
#myFooter ul{
list-style-type: none;
padding-left: 0;
line-height: 1.7;
}
#myFooter h5{
font-size: 18px;
color: white;
font-weight: bold;
margin-top: 30px;
}
#myFooter a{
color:#d2d1d1;
text-decoration: none;
}
#myFooter a:hover, #myFooter a:focus{
text-decoration: none;
color:white;
}
#myFooter .myCols{
text-align: center;
}
#myFooter .social-networks{
text-align: center;
padding-top: 30px;
padding-bottom: 38px;
}
#myFooter .social-networks a{
font-size: 32px;
margin-right: 5px;
margin-left: 5px;
color: #f9f9f9;
padding: 10px;
transition: 0.2s;
}
#myFooter .social-networks a:hover{
text-decoration: none;
}
#myFooter .facebook:hover{
color:#0077e2;
}
#myFooter .google:hover{
color:#ef1a1a;
}
#myFooter .twitter:hover{
color: #00aced;
}
@media screen and (max-width: 767px){
#myFooter {
text-align: center;
}
}
/* CSS used for positioning the footers at the bottom of the page. */
/* You can remove this. */
html{
height: 100% !important;
}
body{
display: flex;
display: -webkit-flex;
flex-direction: column;
-webkit-flex-direction: column;
height: 100%;
}
.content{
flex: 1 0 auto;
-webkit-flex: 1 0 auto;
min-height: 100px;
background-color: #F1F1F1;
}
#myFooter{
flex: 0 0 auto;
-webkit-flex: 0 0 auto;
}
\ No newline at end of file
.wrapper{position:relative}.sidebar-left{background-color:#222d32;margin:0;border:none;border-radius:0}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu a{color:#b8c7ce;text-decoration:none}.sidebar-menu > li{position:relative;margin:0;padding:0}.sidebar-menu > li > a{padding:12px 5px 12px 15px;display:block;font-size:14px;border-left:3px solid transparent}.sidebar-menu > li > a > .fa{width:20px}.sidebar-menu > li:hover > a,.sidebar-menu > li.active > a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.sidebar-menu > li > .treeview-menu{margin:0 1px;background:#2c3b41}.sidebar-menu > li .label,.sidebar-menu > li .badge{margin-top:3px;margin-right:5px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px;color:#4b646f;background:#1a2226}.sidebar-menu li > a > .fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;margin-top:3px}.sidebar-menu li.active > a > .fa-angle-left{transform:rotate(-90deg)}.sidebar-menu li.active > .treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu > li{margin:0}.sidebar-menu .treeview-menu > li > a{padding:5px 5px 5px 15px;display:block;font-size:14px;color:#8aa4af}.sidebar-menu .treeview-menu > li > a > .fa{width:20px}.sidebar-menu .treeview-menu > li > a > .fa-angle-left,.sidebar-menu .treeview-menu > li > a > .fa-angle-down{width:auto}.sidebar-menu .treeview-menu > li.active > a,.sidebar-menu .treeview-menu > li > a:hover{color:#fff}@media (min-width:768px){.sidebar-left{position:absolute;top:0;left:0;bottom:0;width:230px;height:100%;z-index:2016}.sidebar-left .navbar-header{float:none}.sidebar-left .navbar-collapse{padding:0}.content{position:relative;margin-left:200px;height:100%;min-height:100%}}
@charset "UTF-8";
/*!
Animate.css - http://daneden.me/animate
Licensed under the MIT license - http://opensource.org/licenses/MIT
Copyright (c) 2013 Daniel Eden
*/
@-webkit-keyframes flipInX {
0% {
-webkit-transform: perspective(400px) rotateX(90deg);
transform: perspective(400px) rotateX(90deg);
opacity: 0;
}
40% {
-webkit-transform: perspective(400px) rotateX(-10deg);
transform: perspective(400px) rotateX(-10deg);
}
70% {
-webkit-transform: perspective(400px) rotateX(10deg);
transform: perspective(400px) rotateX(10deg);
}
100% {
-webkit-transform: perspective(400px) rotateX(0deg);
transform: perspective(400px) rotateX(0deg);
opacity: 1;
}
}
@keyframes flipInX {
0% {
-webkit-transform: perspective(400px) rotateX(90deg);
-ms-transform: perspective(400px) rotateX(90deg);
transform: perspective(400px) rotateX(90deg);
opacity: 0;
}
40% {
-webkit-transform: perspective(400px) rotateX(-10deg);
-ms-transform: perspective(400px) rotateX(-10deg);
transform: perspective(400px) rotateX(-10deg);
}
70% {
-webkit-transform: perspective(400px) rotateX(10deg);
-ms-transform: perspective(400px) rotateX(10deg);
transform: perspective(400px) rotateX(10deg);
}
100% {
-webkit-transform: perspective(400px) rotateX(0deg);
-ms-transform: perspective(400px) rotateX(0deg);
transform: perspective(400px) rotateX(0deg);
opacity: 1;
}
}
.flipInX {
-webkit-backface-visibility: visible !important;
-ms-backface-visibility: visible !important;
backface-visibility: visible !important;
-webkit-animation-name: flipInX;
animation-name: flipInX;
}
This diff is collapsed.
#wrapper {
width: 100%;
}
#page-wrapper {
padding:5em 2em 2.5em;
background-color: #F1F1F1;
}
.navbar-top-links {
margin-right: 0;
}
.navbar-top-links li {
display: inline-block;
}
.navbar-top-links li:last-child {
margin-right: 15px;
}
.navbar-top-links li a {
padding: 15px;
min-height: 50px;
}
.navbar-top-links .dropdown-menu li {
display: block;
}
.navbar-top-links .dropdown-menu li:last-child {
margin-right: 0;
}
.navbar-top-links .dropdown-menu li a {
padding: 3px 20px;
min-height: 0;
}
.navbar-top-links .dropdown-menu li a div {
white-space: normal;
}
.navbar-top-links .dropdown-messages,
.navbar-top-links .dropdown-tasks,
.navbar-top-links .dropdown-alerts {
width: 310px;
min-width: 0;
}
.navbar-top-links .dropdown-messages {
margin-left: 5px;
}
.navbar-top-links .dropdown-tasks {
margin-left: -59px;
}
.navbar-top-links .dropdown-alerts {
margin-left: -123px;
}
.navbar-top-links .dropdown-user {
right: 0;
left: auto;
}
.sidebar .sidebar-nav.navbar-collapse {
padding-right: 0;
padding-left: 0;
}
.sidebar .sidebar-search {
padding: 15px;
}
.sidebar .arrow {
float: right;
}
.sidebar .fa.arrow:before {
content: "\f105";
}
.sidebar .active>a>.fa.arrow:before {
content: "\f107";
}
.sidebar .nav-second-level li,
.sidebar .nav-third-level li {
border-bottom: 0!important;
margin-bottom: 0;
}
.sidebar .nav-second-level li a {
padding:10px 0;
padding-left: 65px;
font-size: .9em;
}
.sidebar .nav-third-level li a {
padding-left: 52px;
}
@media(min-width:768px){
.navbar-top-links .dropdown-messages,
.navbar-top-links .dropdown-tasks,
.navbar-top-links .dropdown-alerts {
margin-left: auto;
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
/* #######################################################
HOW TO CREATE AN INTERACTIVE GRAPH USING CSS3 & JQUERY [TUTORIAL]
"How to create an Interactive Graph using CSS3 & jQuery [Tutorial]" was specially made for DesignModo by our friend Valeriu Timbuc.
Links:
http://vtimbuc.net
http://designmodo.com
http://vladimirkudinov.com
######################################################## */
/* Resets */
.graph-container,
.graph-container div,
.graph-container a,
.graph-container span {
margin: 0;
padding: 0;
}
/* Gradinet and Rounded Corners */
.graph-container, #tooltip, .graph-info a {
}
/* Graph Container */
.graph-container {
position: relative;
width: 100%;
height: 350px;
}
.graph-container > div {
position: absolute;
width: inherit;
height: inherit;
top: 0px;
left: 2px;
}
.graph-info {
width: 590px;
margin-bottom: 10px;
}
/* Text Styles */
#tooltip, .graph-info a {
height: 25px;
font-size: 12px;
line-height: 13px;
color: #999;
}
.tickLabel {
font-size: 1.2em;
color: #999;
}
/* Tooltip */
#tooltip {
position: absolute;
display: none;
padding: 5px 10px;
border: 1px solid #999;
}
/* Links */
.graph-info a {
position: relative;
display: inline-block;
float: left;
padding: 7px 10px 5px 30px;
margin-right: 10px;
text-decoration: none;
cursor: default;
}
/* Color Circle for Links */
.graph-info a:before {
position: absolute;
display: block;
content: '';
width: 8px;
height: 8px;
top: 13px;
left: 13px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
/* Colors For each Link */
.graph-info .visitors { border-bottom: 2px solid #67398C; }
.graph-info .returning { border-bottom: 2px solid #77b7c5; }
.graph-info .visitors:before { background: #67398C; }
.graph-info .returning:before { background: #67398C; }
/* Hide the First and Last Y Label */
.yAxis .tickLabel:first-child,
.yAxis .tickLabel:last-child { display: none; }
/* Clear Floats */
.graph-info:before, .graph-info:after,
.graph-container:before, .graph-container:after {
content: '';
display: block;
clear: both;
}
.graph-container h3{
font-size:1.5em;
color:#FFF;
margin-bottom:1em;
}
/*--media Quries for 1024px-laptops-*/
@media(max-width: 1024px) {
.graph-container {
height: 499px;
}
}
/*--media Quries for 768px-laptops-*/
@media (max-width:768px) {
.graph-container {
height: 430px;
margin: 1em;
width: 94%;
}
}
@media (max-width:320px) {
.graph-container {
height: 370px;
margin: 1em;
width: 94%;
}
}
\ No newline at end of file
.jqcandlestick-container {
position: relative;
cursor: none;
}
.jqcandlestick-canvas {
position: absolute;
display: block;
height: 100%;
width: 100%;
}
This diff is collapsed.
This diff is collapsed.
/*
* Owl Carousel Owl Demo Theme
* v1.24
*/
#owl-demo .item{
}
#owl-demo .item img{
display: block;
height: auto;
}
.owl-theme .owl-controls{
margin-top: 10px;
text-align: center;
}
/* Styling Next and Prev buttons */
.owl-theme .owl-controls .owl-buttons div{
color: #FFF;
display: inline-block;
zoom: 1;
margin: 5px;
padding: 3px 10px;
font-size: 12px;
width: 33px;
height: 54px;
}
.owl-next{
background: url(../images/divice-pagenations.png) no-repeat -35px 0px;
position: absolute;
right: -8%;
top: 30%;
}
.owl-prev{
background: url(../images/divice-pagenations.png) no-repeat 0px 0px;
position: absolute;
left: -16.5%;
top: 30%;
}
/* Clickable class fix problem with hover on touch devices */
/* Use it for non-touch hover action */
.owl-theme .owl-controls.clickable .owl-buttons div:hover{
filter: Alpha(Opacity=100);/*IE7 fix*/
opacity: 1;
text-decoration: none;
}
/* Styling Pagination*/
.owl-theme .owl-controls .owl-page{
display: inline-block;
zoom: 1;
*display: inline;/*IE7 life-saver */
}
.owl-theme .owl-controls .owl-page span{
display: block;
width: 12px;
height: 12px;
margin: 5px 3px;
filter: Alpha(Opacity=50);/*IE7 fix*/
opacity: 0.5;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
border-radius: 20px;
background: #337ab7;
}
.owl-theme .owl-controls .owl-page.active span,
.owl-theme .owl-controls.clickable .owl-page:hover span{
filter: Alpha(Opacity=100);/*IE7 fix*/
opacity: 1;
}
/* If PaginationNumbers is true */
.owl-theme .owl-controls .owl-page span.owl-numbers{
height: auto;
width: auto;
color: #FFF;
padding: 2px 10px;
font-size: 12px;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
border-radius: 30px;
}
/* preloading images */
.owl-item.loading{
min-height: 150px;
background: url(AjaxLoader.gif) no-repeat center center
}
/*
* Core Owl Carousel CSS File
* v1.24
*/
/* clearfix */
.owl-carousel .owl-wrapper:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
/* display none until init */
.owl-carousel{
display: none;
position: relative;
-ms-touch-action: pan-y;
}
.owl-carousel .owl-wrapper{
display: none;
position: relative;
-webkit-transform: translate3d(0px, 0px, 0px);
}
.owl-carousel .owl-wrapper-outer{
overflow: hidden;
position: relative;
width: 100%;
}
.owl-carousel .owl-wrapper-outer.autoHeight{
-webkit-transition: height 500ms ease-in-out;
-moz-transition: height 500ms ease-in-out;
-ms-transition: height 500ms ease-in-out;
-o-transition: height 500ms ease-in-out;
transition: height 500ms ease-in-out;
}
.owl-carousel .owl-item{
float: left;
padding: 0 10px;
}
.owl-controls .owl-page,
.owl-controls .owl-buttons div{
cursor: pointer;
}
.owl-controls {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
/* mouse grab icon */
.grabbing {
cursor:url(grabbing.png) 8 8, move;
}
/* fix */
.owl-carousel .owl-wrapper,
.owl-carousel .owl-item{
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-webkit-transform: translate3d(0,0,0);
-moz-transform: translate3d(0,0,0);
-ms-transform: translate3d(0,0,0);
}
/* CSS3 Transitions */
.owl-origin {
-webkit-perspective: 1200px;
-webkit-perspective-origin-x : 50%;
-webkit-perspective-origin-y : 50%;
-moz-perspective : 1200px;
-moz-perspective-origin-x : 50%;
-moz-perspective-origin-y : 50%;
perspective : 1200px;
}
/* fade */
.owl-fade-out {
z-index: 10;
-webkit-animation: fadeOut .7s both ease;
-moz-animation: fadeOut .7s both ease;
animation: fadeOut .7s both ease;
}
.owl-fade-in {
-webkit-animation: fadeIn .7s both ease;
-moz-animation: fadeIn .7s both ease;
animation: fadeIn .7s both ease;
}
/* backSlide */
.owl-backSlide-out {
-webkit-animation: backSlideOut 1s both ease;
-moz-animation: backSlideOut 1s both ease;
animation: backSlideOut 1s both ease;
}
.owl-backSlide-in {
-webkit-animation: backSlideIn 1s both ease;
-moz-animation: backSlideIn 1s both ease;
animation: backSlideIn 1s both ease;
}
/* goDown */
.owl-goDown-out {
-webkit-animation: scaleToFade .7s ease both;
-moz-animation: scaleToFade .7s ease both;
animation: scaleToFade .7s ease both;
}
.owl-goDown-in {
-webkit-animation: goDown .6s ease both;
-moz-animation: goDown .6s ease both;
animation: goDown .6s ease both;
}
/* scaleUp */
.owl-fadeUp-in {
-webkit-animation: scaleUpFrom .5s ease both;
-moz-animation: scaleUpFrom .5s ease both;
animation: scaleUpFrom .5s ease both;
}
.owl-fadeUp-out {
-webkit-animation: scaleUpTo .5s ease both;
-moz-animation: scaleUpTo .5s ease both;
animation: scaleUpTo .5s ease both;
}
/* Keyframes */
/*empty*/
@-webkit-keyframes empty {
0% {opacity: 1}
}
@-moz-keyframes empty {
0% {opacity: 1}
}
@keyframes empty {
0% {opacity: 1}
}
@-webkit-keyframes fadeIn {
0% { opacity:0; }
100% { opacity:1; }
}
@-moz-keyframes fadeIn {
0% { opacity:0; }
100% { opacity:1; }
}
@keyframes fadeIn {
0% { opacity:0; }
100% { opacity:1; }
}
@-webkit-keyframes fadeOut {
0% { opacity:1; }
100% { opacity:0; }
}
@-moz-keyframes fadeOut {
0% { opacity:1; }
100% { opacity:0; }
}
@keyframes fadeOut {
0% { opacity:1; }
100% { opacity:0; }
}
@-webkit-keyframes backSlideOut {
25% { opacity: .5; -webkit-transform: translateZ(-500px); }
75% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(-200%); }
100% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(-200%); }
}
@-moz-keyframes backSlideOut {
25% { opacity: .5; -moz-transform: translateZ(-500px); }
75% { opacity: .5; -moz-transform: translateZ(-500px) translateX(-200%); }
100% { opacity: .5; -moz-transform: translateZ(-500px) translateX(-200%); }
}
@keyframes backSlideOut {
25% { opacity: .5; transform: translateZ(-500px); }
75% { opacity: .5; transform: translateZ(-500px) translateX(-200%); }
100% { opacity: .5; transform: translateZ(-500px) translateX(-200%); }
}
@-webkit-keyframes backSlideIn {
0%, 25% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(200%); }
75% { opacity: .5; -webkit-transform: translateZ(-500px); }
100% { opacity: 1; -webkit-transform: translateZ(0) translateX(0); }
}
@-moz-keyframes backSlideIn {
0%, 25% { opacity: .5; -moz-transform: translateZ(-500px) translateX(200%); }
75% { opacity: .5; -moz-transform: translateZ(-500px); }
100% { opacity: 1; -moz-transform: translateZ(0) translateX(0); }
}
@keyframes backSlideIn {
0%, 25% { opacity: .5; transform: translateZ(-500px) translateX(200%); }
75% { opacity: .5; transform: translateZ(-500px); }
100% { opacity: 1; transform: translateZ(0) translateX(0); }
}
@-webkit-keyframes scaleToFade {
to { opacity: 0; -webkit-transform: scale(.8); }
}
@-moz-keyframes scaleToFade {
to { opacity: 0; -moz-transform: scale(.8); }
}
@keyframes scaleToFade {
to { opacity: 0; transform: scale(.8); }
}
@-webkit-keyframes goDown {
from { -webkit-transform: translateY(-100%); }
}
@-moz-keyframes goDown {
from { -moz-transform: translateY(-100%); }
}
@keyframes goDown {
from { transform: translateY(-100%); }
}
@-webkit-keyframes scaleUpFrom {
from { opacity: 0; -webkit-transform: scale(1.5); }
}
@-moz-keyframes scaleUpFrom {
from { opacity: 0; -moz-transform: scale(1.5); }
}
@keyframes scaleUpFrom {
from { opacity: 0; transform: scale(1.5); }
}
@-webkit-keyframes scaleUpTo {
to { opacity: 0; -webkit-transform: scale(1.5); }
}
@-moz-keyframes scaleUpTo {
to { opacity: 0; -moz-transform: scale(1.5); }
}
@keyframes scaleUpTo {
to { opacity: 0; transform: scale(1.5); }
}
/*----responsive-mediaquries-----*/
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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