├── Procfile ├── screen-shots ├── home.png ├── login.png ├── newuser.png ├── search.png └── advanceSearch.png ├── src ├── main │ ├── webapp │ │ ├── WEB-INF │ │ │ ├── view │ │ │ │ ├── templates │ │ │ │ │ ├── copyright.jsp │ │ │ │ │ ├── footer.jsp │ │ │ │ │ ├── pageScript.jsp │ │ │ │ │ ├── userHeader.jsp │ │ │ │ │ └── header.jsp │ │ │ │ ├── user-home.jsp │ │ │ │ ├── login.jsp │ │ │ │ ├── create-user.jsp │ │ │ │ ├── error.jsp │ │ │ │ ├── 403.jsp │ │ │ │ ├── search.jsp │ │ │ │ └── home.jsp │ │ │ └── images │ │ │ │ └── ajax-loader.gif │ │ └── resources │ │ │ ├── images │ │ │ └── logo.png │ │ │ ├── js │ │ │ ├── edit.js │ │ │ └── app.js │ │ │ ├── css │ │ │ └── style.css │ │ │ └── bootstrap │ │ │ └── css │ │ │ ├── bootstrap-reboot.min.css │ │ │ ├── bootstrap-reboot.css │ │ │ ├── bootstrap-grid.min.css │ │ │ ├── bootstrap-reboot.min.css.map │ │ │ └── bootstrap-grid.css │ ├── java │ │ └── com │ │ │ └── user │ │ │ └── mngmnt │ │ │ ├── model │ │ │ ├── RoleNames.java │ │ │ ├── UserAdapter.java │ │ │ └── User.java │ │ │ ├── constants │ │ │ └── AppConstant.java │ │ │ ├── ServletInitializer.java │ │ │ ├── dto │ │ │ ├── LoginDTO.java │ │ │ ├── SearchDTO.java │ │ │ └── Response.java │ │ │ ├── exception │ │ │ └── GenericControllerAdvice.java │ │ │ ├── service │ │ │ ├── UserService.java │ │ │ ├── CustomUserDetailsService.java │ │ │ └── UserServiceImpl.java │ │ │ ├── Application.java │ │ │ ├── repository │ │ │ └── UserRepository.java │ │ │ ├── configuration │ │ │ ├── WebMvcConfiguration.java │ │ │ └── SecurityConfiguration.java │ │ │ ├── InitialSetup.java │ │ │ └── controller │ │ │ └── UserController.java │ └── resources │ │ └── application.properties └── test │ └── java │ └── com │ └── user │ └── mngmnt │ └── ApplicationTests.java ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── .travis.yml ├── .gitignore ├── pom.xml ├── Readme.MD ├── mvnw.cmd └── mvnw /Procfile: -------------------------------------------------------------------------------- 1 | web: java $JAVA_OPTS -jar target/user.management.system-0.0.1-SNAPSHOT.jar -Dserver.port=$PORT $JAR_OPTS -------------------------------------------------------------------------------- /screen-shots/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravisankarchinnam/user-management/HEAD/screen-shots/home.png -------------------------------------------------------------------------------- /screen-shots/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravisankarchinnam/user-management/HEAD/screen-shots/login.png -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/templates/copyright.jsp: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screen-shots/newuser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravisankarchinnam/user-management/HEAD/screen-shots/newuser.png -------------------------------------------------------------------------------- /screen-shots/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravisankarchinnam/user-management/HEAD/screen-shots/search.png -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravisankarchinnam/user-management/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /screen-shots/advanceSearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravisankarchinnam/user-management/HEAD/screen-shots/advanceSearch.png -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/model/RoleNames.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.model; 2 | 3 | public enum RoleNames { 4 | ADMIN, USER; 5 | } 6 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip 2 | -------------------------------------------------------------------------------- /src/main/webapp/resources/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravisankarchinnam/user-management/HEAD/src/main/webapp/resources/images/logo.png -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravisankarchinnam/user-management/HEAD/src/main/webapp/WEB-INF/images/ajax-loader.gif -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/constants/AppConstant.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.constants; 2 | 3 | public class AppConstant { 4 | 5 | public static final String SUCCESS = "success"; 6 | public static final String FAIL = "fail"; 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/templates/footer.jsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | jdk: 3 | - oraclejdk8 4 | # git strips the wrapper jar file so we have to force its download during the build 5 | install: 6 | - mvn -N io.takari:maven:wrapper 7 | - ./mvnw install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | .sts4-cache 12 | 13 | ### IntelliJ IDEA ### 14 | .idea 15 | *.iws 16 | *.iml 17 | *.ipr 18 | 19 | ### NetBeans ### 20 | /nbproject/private/ 21 | /build/ 22 | /nbbuild/ 23 | /dist/ 24 | /nbdist/ 25 | /.nb-gradle/ -------------------------------------------------------------------------------- /src/test/java/com/user/mngmnt/ApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class ApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/webapp/resources/js/edit.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $('.updateData').click(function () { 3 | console.log('updateData') 4 | var id = $(this).attr('id').substring(7); 5 | $('#fname_' + id).hide(); 6 | $('#text_fname_' + id).show(); 7 | $('#text_fname_' + id).focus(); 8 | $('#lname_' + id).hide(); 9 | $('#text_lname_' + id).show(); 10 | $(this).hide(); 11 | $('#save_' + id).show(); 12 | 13 | }); 14 | 15 | }); -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/ServletInitializer.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | public class ServletInitializer extends SpringBootServletInitializer { 7 | 8 | @Override 9 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 10 | return application.sources(Application.class); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/dto/LoginDTO.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.dto; 2 | 3 | public class LoginDTO { 4 | 5 | private String emailAddrss; 6 | private String pswd; 7 | 8 | public String getEmailAddrss() { 9 | return emailAddrss; 10 | } 11 | 12 | public void setEmailAddrss(String emailAddrss) { 13 | this.emailAddrss = emailAddrss; 14 | } 15 | 16 | public String getPswd() { 17 | return pswd; 18 | } 19 | 20 | public void setPswd(String pswd) { 21 | this.pswd = pswd; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/exception/GenericControllerAdvice.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.exception; 2 | 3 | import org.springframework.web.bind.annotation.ControllerAdvice; 4 | import org.springframework.web.bind.annotation.ExceptionHandler; 5 | 6 | @ControllerAdvice 7 | public class GenericControllerAdvice { 8 | 9 | @ExceptionHandler(Exception.class) 10 | public String assertionException(final Exception e) { 11 | e.printStackTrace(); 12 | return "redirect:/login?error=Something went wrong"; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/dto/SearchDTO.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.dto; 2 | 3 | public class SearchDTO { 4 | private String searchKeyword; 5 | private String criteria; 6 | 7 | public String getSearchKeyword() { 8 | return searchKeyword; 9 | } 10 | 11 | public void setSearchKeyword(String searchKeyword) { 12 | this.searchKeyword = searchKeyword; 13 | } 14 | 15 | public String getCriteria() { 16 | return criteria; 17 | } 18 | 19 | public void setCriteria(String criteria) { 20 | this.criteria = criteria; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.service; 2 | 3 | import com.user.mngmnt.model.User; 4 | import org.springframework.data.domain.Page; 5 | import org.springframework.data.domain.Pageable; 6 | 7 | import java.util.List; 8 | 9 | public interface UserService { 10 | User findUserByEmail(String email); 11 | 12 | void saveUser(User user); 13 | 14 | Boolean removeAll(); 15 | 16 | void removeById(Long id); 17 | 18 | User findById(Long id); 19 | 20 | Page searchByTerm(String name, Pageable pageable); 21 | 22 | Page listUsers(Pageable pageable); 23 | 24 | List searchBy(String keyword, String criteria); 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/Application.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.builder.SpringApplicationBuilder; 6 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 7 | 8 | @SpringBootApplication 9 | public class Application extends SpringBootServletInitializer{ 10 | 11 | @Override 12 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 13 | return application.sources(Application.class); 14 | } 15 | 16 | public static void main(String[] args) { 17 | SpringApplication.run(Application.class, args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/dto/Response.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.dto; 2 | 3 | public class Response { 4 | 5 | private int statusCode; 6 | private String status; 7 | private String redirectUrl; 8 | 9 | public Response(int statusCode, String status, String redirectUrl) { 10 | this.statusCode = statusCode; 11 | this.status = status; 12 | this.redirectUrl = redirectUrl; 13 | } 14 | 15 | public int getStatusCode() { 16 | return statusCode; 17 | } 18 | 19 | public void setStatusCode(int statusCode) { 20 | this.statusCode = statusCode; 21 | } 22 | 23 | public String getStatus() { 24 | return status; 25 | } 26 | 27 | public void setStatus(String status) { 28 | this.status = status; 29 | } 30 | 31 | public String getRedirectUrl() { 32 | return redirectUrl; 33 | } 34 | 35 | public void setRedirectUrl(String redirectUrl) { 36 | this.redirectUrl = redirectUrl; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/user-home.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | List Users 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 |
15 |

Only Admins can Perform operations

16 |
17 |
18 |
19 |
20 | 21 |
22 |
23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/repository/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.repository; 2 | 3 | import org.springframework.data.domain.Page; 4 | import org.springframework.data.domain.Pageable; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.data.jpa.repository.Query; 7 | import org.springframework.data.repository.query.Param; 8 | import org.springframework.stereotype.Repository; 9 | 10 | import com.user.mngmnt.model.User; 11 | 12 | import java.util.List; 13 | 14 | @Repository("userRepository") 15 | public interface UserRepository extends JpaRepository { 16 | 17 | User findByEmail(String email); 18 | 19 | List findByFirstNameIgnoreCaseContaining(String firstName); 20 | 21 | List findByLastNameIgnoreCaseContaining(String lastName); 22 | 23 | List findByEmailIgnoreCaseContaining(String email); 24 | 25 | @Query("SELECT t FROM User t WHERE " + 26 | "LOWER(t.lastName) LIKE LOWER(CONCAT('%',:searchTerm, '%')) OR " + 27 | "LOWER(t.firstName) LIKE LOWER(CONCAT('%',:searchTerm, '%'))") 28 | Page searchByTerm(@Param("searchTerm") String searchTerm, Pageable pageable); 29 | } 30 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | # =============================== 2 | # = DATABASE CONFIGURATION 3 | # =============================== 4 | spring.datasource.url=jdbc:h2:mem:user-app;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE 5 | #jdbc:h2:mem:user-app;MODE=Mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS USER 6 | spring.datasource.platform=h2 7 | spring.datasource.username=sa 8 | spring.datasource.password= 9 | spring.datasource.driver-class-name=org.h2.Driver 10 | # =============================== 11 | # = H2 DATABASE CONFIGURATION 12 | # =============================== 13 | spring.h2.console.enabled=true 14 | spring.h2.console.path=/h2-console 15 | # =============================== 16 | # = JPA / HIBERNATE 17 | # =============================== 18 | spring.jpa.show-sql=true 19 | spring.jpa.hibernate.ddl-auto=update 20 | # ============================================================== 21 | # = Global Constants 22 | # ============================================================== 23 | admin.first.name=Administrator 24 | admin.last.name=Admin 25 | admin.email.address=admin@gmail.com 26 | admin.password=admin 27 | max.result.per.page=2 28 | max.card.display.on.pagination.tray=2 29 | # enable remote access. 30 | spring.h2.console.settings.web-allow-others=true 31 | # HEROKU enabling default Port. 32 | server.port=${PORT:8080} -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/service/CustomUserDetailsService.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.security.core.userdetails.UserDetails; 5 | import org.springframework.security.core.userdetails.UserDetailsService; 6 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 7 | import org.springframework.stereotype.Service; 8 | 9 | import com.user.mngmnt.model.User; 10 | import com.user.mngmnt.model.UserAdapter; 11 | import com.user.mngmnt.repository.UserRepository; 12 | 13 | @Service("customUserDetailsService") 14 | public class CustomUserDetailsService implements UserDetailsService { 15 | 16 | private final UserRepository userRepository; 17 | 18 | @Autowired 19 | public CustomUserDetailsService(UserRepository userRepository) { 20 | this.userRepository = userRepository; 21 | } 22 | 23 | @Override 24 | public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 25 | User user = userRepository.findByEmail(username); 26 | if (user == null) { 27 | throw new UsernameNotFoundException(String.format("User with %s doesn't exist!", username)); 28 | } 29 | return new UserAdapter(user); 30 | } 31 | 32 | public User saveUser(User user) { 33 | return userRepository.save(user); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/configuration/WebMvcConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.configuration; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 6 | import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 7 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; 8 | import org.springframework.web.servlet.view.InternalResourceViewResolver; 9 | 10 | @Configuration 11 | public class WebMvcConfiguration extends WebMvcConfigurationSupport { 12 | 13 | @Override 14 | public void addViewControllers(ViewControllerRegistry registry) { 15 | registry.addViewController("/home").setViewName("home"); 16 | registry.addViewController("/").setViewName("home"); 17 | registry.addViewController("/login").setViewName("login"); 18 | } 19 | 20 | @Override 21 | public void addResourceHandlers(ResourceHandlerRegistry registry) { 22 | registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 23 | } 24 | 25 | @Bean 26 | public InternalResourceViewResolver viewResolver() { 27 | InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 28 | resolver.setPrefix("/WEB-INF/view/"); 29 | resolver.setSuffix(".jsp"); 30 | 31 | return resolver; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/webapp/resources/js/app.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $("input[type='password'][data-eye]").each(function (i) { 3 | var $this = $(this); 4 | 5 | $this.wrap($("
", { 6 | style: 'position:relative' 7 | })); 8 | $this.css({ 9 | paddingRight: 60 10 | }); 11 | $this.after($("
", { 12 | html: 'Show', 13 | class: 'btn btn-primary btn-sm', 14 | id: 'passeye-toggle-' + i, 15 | style: 'position:absolute;right:10px;top:50%;transform:translate(0,-50%);-webkit-transform:translate(0,-50%);-o-transform:translate(0,-50%);padding: 2px 7px;font-size:12px;cursor:pointer;' 16 | })); 17 | $this.after($("", { 18 | type: 'hidden', 19 | id: 'passeye-' + i 20 | })); 21 | $this.on("keyup paste", function () { 22 | $("#passeye-" + i).val($(this).val()); 23 | }); 24 | $("#passeye-toggle-" + i).on("click", function () { 25 | if ($this.hasClass("show")) { 26 | $("#passeye-toggle-0").html('Show') 27 | $this.attr('type', 'password'); 28 | $this.removeClass("show"); 29 | $(this).removeClass("btn-outline-primary"); 30 | } else { 31 | $this.attr('type', 'text'); 32 | $("#passeye-toggle-0").html('Hide') 33 | $this.val($("#passeye-" + i).val()); 34 | $this.addClass("show"); 35 | $(this).addClass("btn-outline-primary"); 36 | } 37 | }); 38 | }); 39 | }); -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/templates/pageScript.jsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 49 | 50 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/templates/userHeader.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/templates/header.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/model/UserAdapter.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.model; 2 | 3 | import java.util.Collection; 4 | import java.util.HashSet; 5 | import java.util.Set; 6 | 7 | import org.springframework.security.core.GrantedAuthority; 8 | import org.springframework.security.core.authority.SimpleGrantedAuthority; 9 | import org.springframework.security.core.userdetails.UserDetails; 10 | 11 | public class UserAdapter implements UserDetails { 12 | 13 | private static final long serialVersionUID = -1360188483928178893L; 14 | private User user; 15 | 16 | 17 | 18 | public UserAdapter(User user) { 19 | this.user = user; 20 | } 21 | 22 | 23 | 24 | @Override 25 | public Collection getAuthorities() { 26 | Set authorities = new HashSet(); 27 | authorities.add(new SimpleGrantedAuthority(user.getRoleName())); 28 | return authorities; 29 | } 30 | 31 | 32 | 33 | @Override 34 | public String getPassword() { 35 | return user.getPassword(); 36 | } 37 | 38 | 39 | 40 | @Override 41 | public String getUsername() { 42 | return user.getEmail(); 43 | } 44 | 45 | 46 | 47 | @Override 48 | public boolean isAccountNonExpired() { 49 | return true; 50 | } 51 | 52 | 53 | 54 | @Override 55 | public boolean isAccountNonLocked() { 56 | return true; 57 | } 58 | 59 | 60 | 61 | @Override 62 | public boolean isCredentialsNonExpired() { 63 | return true; 64 | } 65 | 66 | 67 | 68 | @Override 69 | public boolean isEnabled() { 70 | return true; 71 | } 72 | 73 | 74 | 75 | @Override 76 | public int hashCode() { 77 | return user.getId().intValue(); 78 | } 79 | 80 | 81 | 82 | @Override 83 | public boolean equals(Object obj) { 84 | UserAdapter other = (UserAdapter) obj; 85 | return user.getEmail().equals(other.user.getEmail()); 86 | } 87 | 88 | } -------------------------------------------------------------------------------- /src/main/webapp/resources/css/style.css: -------------------------------------------------------------------------------- 1 | .mySpace { 2 | padding-top: 20px; 3 | } 4 | 5 | html, body { 6 | height: 100%; 7 | } 8 | 9 | body.my-login-page { 10 | background-color: #f7f9fb; 11 | font-size: 12px; 12 | } 13 | li { 14 | list-style: none; 15 | } 16 | .my-login-page section { 17 | 18 | padding: 30px; 19 | } 20 | .input-error { 21 | border-color: red; 22 | } 23 | .my-login-page .brand { 24 | padding-top: 40px; 25 | width: 45%; 26 | overflow: hidden; 27 | margin: 0 auto; 28 | box-shadow: 0 0 40px rgba(0, 0, 0, .05); 29 | } 30 | 31 | .my-login-page .brand img { 32 | width: 100%; 33 | } 34 | 35 | .my-login-page .card-wrapper { 36 | width: 400px; 37 | } 38 | .my-login-page .card{ 39 | width: 100%; 40 | } 41 | .my-login-page .card, .my-login-page .card-header { 42 | border-color: transparent; 43 | box-shadow: 0 0 40px rgba(0, 0, 0, .05); 44 | } 45 | 46 | .my-login-page .card-header { 47 | padding: 30px 30px 0 30px; 48 | } 49 | 50 | .my-login-page .card.fat { 51 | padding: 10px; 52 | } 53 | 54 | .my-login-page .card .card-title { 55 | margin-bottom: 30px; 56 | text-align: center; 57 | } 58 | 59 | .my-login-page .form-control { 60 | border-width: 2.3px; 61 | } 62 | 63 | .my-login-page .form-group label { 64 | width: 100%; 65 | } 66 | 67 | .my-login-page .btn.btn-block { 68 | padding: 12px 10px; 69 | } 70 | 71 | .my-login-page .margin-top20 { 72 | margin-top: 20px; 73 | } 74 | 75 | .my-login-page .no-margin { 76 | margin: 0; 77 | } 78 | 79 | .my-login-page .footer { 80 | margin: 40px 0; 81 | color: #888; 82 | text-align: center; 83 | } 84 | 85 | .form-control#criteriaId { 86 | width: 100%; 87 | } 88 | 89 | @media screen and (max-width: 425px) { 90 | .my-login-page .card-wrapper { 91 | width: 90%; 92 | margin: 0 auto; 93 | } 94 | } 95 | 96 | @media screen and (max-width: 320px) { 97 | .my-login-page .card.fat { 98 | padding: 0; 99 | } 100 | 101 | .my-login-page .card.fat .card-body { 102 | padding: 15px; 103 | } 104 | } -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/service/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.service; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.data.domain.Page; 8 | import org.springframework.data.domain.Pageable; 9 | import org.springframework.security.crypto.password.PasswordEncoder; 10 | import org.springframework.stereotype.Service; 11 | 12 | import com.user.mngmnt.model.User; 13 | import com.user.mngmnt.repository.UserRepository; 14 | 15 | @Service("userService") 16 | public class UserServiceImpl implements UserService { 17 | 18 | @Autowired 19 | private UserRepository userRepository; 20 | 21 | @Autowired 22 | private PasswordEncoder bCryptPasswordEncoder; 23 | 24 | 25 | 26 | @Override 27 | public User findUserByEmail(String email) { 28 | return userRepository.findByEmail(email); 29 | } 30 | 31 | 32 | 33 | @Override 34 | public void saveUser(User user) { 35 | if (user.getId() == null) { 36 | user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); 37 | user.setActive(Boolean.TRUE); 38 | } 39 | userRepository.save(user); 40 | } 41 | 42 | 43 | 44 | @Override 45 | public Page listUsers(Pageable pageable) { 46 | return userRepository.findAll(pageable); 47 | } 48 | 49 | 50 | 51 | @Override 52 | public Page searchByTerm(String name, Pageable pageable) { 53 | return userRepository.searchByTerm(name, pageable); 54 | } 55 | 56 | 57 | 58 | @Override 59 | public Boolean removeAll() { 60 | userRepository.deleteAll(); 61 | return Boolean.TRUE; 62 | } 63 | 64 | 65 | 66 | @Override 67 | public void removeById(Long id) { 68 | userRepository.deleteById(id); 69 | } 70 | 71 | 72 | 73 | @Override 74 | public User findById(Long id) { 75 | return userRepository.findById(id).get(); 76 | } 77 | 78 | 79 | 80 | @Override 81 | public List searchBy(String keyword, String criteria) { 82 | if ("firstName".equals(criteria)) { 83 | return userRepository.findByFirstNameIgnoreCaseContaining(keyword); 84 | } else if ("lastName".equals(criteria)) { 85 | return userRepository.findByLastNameIgnoreCaseContaining(keyword); 86 | } else if ("email".equals(criteria)) { 87 | return userRepository.findByEmailIgnoreCaseContaining(keyword); 88 | } 89 | return new ArrayList<>(); 90 | 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/model/User.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.model; 2 | 3 | import javax.persistence.Column; 4 | import javax.persistence.Entity; 5 | import javax.persistence.GeneratedValue; 6 | import javax.persistence.GenerationType; 7 | import javax.persistence.Id; 8 | import javax.persistence.Table; 9 | 10 | @Entity 11 | @Table(name = "USER") 12 | public class User { 13 | 14 | @Id 15 | @GeneratedValue(strategy = GenerationType.AUTO) 16 | @Column(name = "id") 17 | private Long id; 18 | 19 | @Column(name = "firstName") 20 | private String firstName; 21 | 22 | @Column(name = "lastName") 23 | private String lastName; 24 | 25 | @Column(name = "email") 26 | private String email; 27 | 28 | @Column(name = "password") 29 | private String password; 30 | 31 | @Column(name = "roleName") 32 | private String roleName; 33 | 34 | @Column(name = "isActive") 35 | private boolean isActive; 36 | 37 | 38 | 39 | public User() { 40 | } 41 | 42 | 43 | 44 | public User(String pFirstName, String pLastName, String pEmail, String pPassword, String pRoleName, boolean pIsActive) { 45 | firstName = pFirstName; 46 | lastName = pLastName; 47 | email = pEmail; 48 | password = pPassword; 49 | roleName = pRoleName; 50 | isActive = pIsActive; 51 | } 52 | 53 | 54 | 55 | public Long getId() { 56 | return id; 57 | } 58 | 59 | 60 | 61 | public void setId(Long id) { 62 | this.id = id; 63 | } 64 | 65 | 66 | 67 | public String getFirstName() { 68 | return firstName; 69 | } 70 | 71 | 72 | 73 | public void setFirstName(String firstName) { 74 | this.firstName = firstName; 75 | } 76 | 77 | 78 | 79 | public String getLastName() { 80 | return lastName; 81 | } 82 | 83 | 84 | 85 | public void setLastName(String lastName) { 86 | this.lastName = lastName; 87 | } 88 | 89 | 90 | 91 | public String getEmail() { 92 | return email; 93 | } 94 | 95 | 96 | 97 | public void setEmail(String email) { 98 | this.email = email; 99 | } 100 | 101 | 102 | 103 | public String getPassword() { 104 | return password; 105 | } 106 | 107 | 108 | 109 | public void setPassword(String password) { 110 | this.password = password; 111 | } 112 | 113 | 114 | 115 | public String getRoleName() { 116 | return roleName; 117 | } 118 | 119 | 120 | 121 | public void setRoleName(String roleName) { 122 | this.roleName = roleName; 123 | } 124 | 125 | 126 | 127 | public boolean isActive() { 128 | return isActive; 129 | } 130 | 131 | 132 | 133 | public void setActive(boolean isActive) { 134 | this.isActive = isActive; 135 | } 136 | 137 | } 138 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.user.mngmnt 8 | user.management.system 9 | 0.0.1-SNAPSHOT 10 | war 11 | 12 | user.management.system 13 | User Management System - Create, update, delete 14 | 15 | 16 | Dr Panda 17 | http://www.drpanda.com 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-parent 23 | 2.0.4.RELEASE 24 | 25 | 26 | 27 | 28 | UTF-8 29 | UTF-8 30 | 1.8 31 | 32 | 33 | 34 | 35 | 36 | org.springframework.boot 37 | spring-boot-starter-web 38 | 39 | 40 | 41 | org.springframework.boot 42 | spring-boot-starter-data-jpa 43 | 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-starter-security 48 | 49 | 50 | 51 | com.h2database 52 | h2 53 | 54 | 55 | 56 | 57 | org.springframework.boot 58 | spring-boot-starter-tomcat 59 | provided 60 | 61 | 62 | 63 | org.springframework.boot 64 | spring-boot-starter-test 65 | test 66 | 67 | 68 | 69 | 70 | javax.servlet 71 | jstl 72 | 73 | 74 | 75 | 76 | org.apache.tomcat.embed 77 | tomcat-embed-jasper 78 | provided 79 | 80 | 81 | org.springframework.boot 82 | spring-boot-test-autoconfigure 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | org.springframework.boot 91 | spring-boot-maven-plugin 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Login Page 11 | 12 | 13 | 14 |
15 |
16 |
17 |
18 |
19 | 20 |
21 |
22 |
23 |

Admin Console

24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 40 |
41 | 42 |
43 | 44 | 46 |
47 | 48 |
49 | 50 |
51 | 52 | 53 |
54 |
55 |
56 | 57 |
58 |
59 |
60 |
61 | 62 | 63 | -------------------------------------------------------------------------------- /Readme.MD: -------------------------------------------------------------------------------- 1 | # Spring Boot Application. 2 | 3 | This Standalone Spring Boot Project is a User Management Systen for admins to perform operations on users. 4 | 5 | [![Build Status](https://travis-ci.org/ravisankarchinnam/user-management.svg?branch=master)](https://travis-ci.org/ravisankarchinnam/user-management) 6 | 7 | ## 1. Used Database - H2 8 | 9 | ## 2. Running as a Packaged Application (Following ways) 10 | Way-1 : java -jar target/user.management.system-0.0.1-SNAPSHOT.war 11 | 12 | Way-2 : mvn spring-boot:run (using maven) 13 | 14 | ## 3. Pass explicit value from command line while you go for run this app. 15 | for example, want to run app on 9090 port number instead of default(8080) 16 | 17 | Way-1 :- java -jar target/automation-job-offering-portal-0.0.1-SNAPSHOT.war --server.port=9090 18 | 19 | Way-2 :- mvn spring-boot:run -Drun.arguments="--server.port=9090,--spring.profiles.active=dev" 20 | 21 | ## 4. DB configuration are provided in /user.management.system/src/main/resources/application.properties file. 22 | 4.1. you can change it's value as per your convenient. as per explained in step-3. 23 | 24 | 4.1.1 for example, I want to change my db-user name, then I can do something likewise while I go for start my app, 25 | mvn spring-boot:run -Drun.arguments="--spring.datasource.username=newUserName" 26 | 27 | 28 | ## 5. To generate .war file we need to clean install our project by following command(Maven should be installed), 29 | Way-1 - mvn clean install 30 | 31 | Way-2 - if have eclipse(IDE) then following steps is enough to have packaged app file, (right click on project) -> Run -> Maven install which will generate 1-war file namely "user.management.system-0.0.1-SNAPSHOT.war" under 'target' directory 32 | 33 | ## 6. Once the application is started you can access http://localhost:8080/ 34 | username: admin@gmail.com 35 | password: admin 36 | 37 | 38 | ## RESULTS: 39 | 40 | Login: 41 | ![Login(https://github.com/ravisankarchinnam/user-management/tree/master/screen-shots/login.png) 42 | Home: 43 | ![Home]https://github.com/ravisankarchinnam/user-management/tree/master/screen-shots/home.png) 44 | Search: 45 | ![Search]https://github.com/ravisankarchinnam/user-management/tree/master/screen-shots/search.png) 46 | 47 | ![Advance Search]https://github.com/ravisankarchinnam/user-management/tree/master/screen-shots/advanceSearch.png) 48 | Create User: 49 | ![Create User]https://github.com/ravisankarchinnam/user-management/tree/master/screen-shots/newuser.png) 50 | 51 | 52 | 53 | ## Future Project Enhancement notes, 54 | 55 | Login/Logout functionality 56 | 1.1 Forgot password 57 | 58 | 1.2 reset password / change password 59 | 60 | 1.3 security question while go for change/reset password 61 | 62 | 1.3.1. email through user confirmation 63 | 1.3.2 OTP through user confirmation 64 | 65 | 1.4 user-profile management 66 | 1.4.1 profile pic 67 | 1.4.2 more details of users like, address1, addres2, pincode, mobile number...etc. 68 | 1.5 search functionality with auto-completion feature 69 | 1.6 Modern UI 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/create-user.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 2 | 3 | 4 | 5 | 6 | Create New User 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

Create New User Form

18 | 19 | 20 | 21 |
22 | 23 |
24 | 25 | 27 |
28 | 29 |
30 | 31 | 32 |
33 | 34 |
35 | 36 | 37 |
38 | 39 |
40 | 41 | 43 |
44 |
45 | 49 |
50 | 51 |
52 | 55 |
56 |
57 |
58 |
59 | 60 |
61 |
62 |
63 |
64 | 65 | 66 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/InitialSetup.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt; 2 | 3 | import com.user.mngmnt.model.RoleNames; 4 | import com.user.mngmnt.model.User; 5 | import com.user.mngmnt.service.UserService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.beans.factory.annotation.Value; 8 | import org.springframework.stereotype.Component; 9 | 10 | import javax.annotation.PostConstruct; 11 | 12 | @Component 13 | public class InitialSetup { 14 | 15 | @Autowired 16 | private UserService userService; 17 | 18 | @Value("${admin.first.name}") 19 | private String firstName; 20 | 21 | @Value("${admin.last.name}") 22 | private String lastName; 23 | 24 | @Value("${admin.email.address}") 25 | private String emailAddress; 26 | 27 | @Value("${admin.password}") 28 | private String password; 29 | 30 | 31 | 32 | @PostConstruct 33 | public void initIt() throws Exception { 34 | 35 | User dbUser = userService.findUserByEmail(emailAddress); 36 | 37 | if (dbUser == null) { 38 | User user = new User(); 39 | user.setFirstName(firstName); 40 | user.setLastName(lastName); 41 | user.setEmail(emailAddress); 42 | user.setPassword(password); 43 | user.setActive(Boolean.TRUE); 44 | user.setRoleName(RoleNames.ADMIN.name()); 45 | userService.saveUser(user); 46 | } 47 | loadUsers(); 48 | } 49 | 50 | 51 | 52 | private void loadUsers() { 53 | User user1 = new User("john", "doe", 54 | "john@doe.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 55 | userService.saveUser(user1); 56 | 57 | User user2 = new User("Smith", "Guard", 58 | "smith@gmail.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 59 | userService.saveUser(user2); 60 | 61 | User user3 = new User("Lannister", "Jammy", 62 | "jammy@gmail.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 63 | userService.saveUser(user3); 64 | 65 | User user4 = new User("Stark", "Arya", 66 | "arya@gmail.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 67 | userService.saveUser(user4); 68 | 69 | User user5 = new User("Bolton", "ramsay", 70 | "ramsay@gmail.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 71 | userService.saveUser(user5); 72 | 73 | User user6 = new User("Clarke", "gibbins", 74 | "clarke@gmail.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 75 | userService.saveUser(user6); 76 | 77 | User user7 = new User("Bob", "Marley", 78 | "Bob@doe.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 79 | userService.saveUser(user7); 80 | 81 | User user8 = new User("Octavia", "Marley", 82 | "octavia@gmail.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 83 | userService.saveUser(user8); 84 | 85 | User user9 = new User("Kane", "William", 86 | "Kane@gmail.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 87 | userService.saveUser(user9); 88 | 89 | User user10 = new User("Jon", "snow", 90 | "jonsnow@gmail.com", "123456", RoleNames.ADMIN.name(), Boolean.TRUE); 91 | userService.saveUser(user10); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/configuration/SecurityConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.configuration; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc; 5 | import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.ComponentScan; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 10 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 11 | import org.springframework.security.config.annotation.web.builders.WebSecurity; 12 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 13 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 14 | import org.springframework.security.core.userdetails.UserDetailsService; 15 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 16 | import org.springframework.security.crypto.password.PasswordEncoder; 17 | 18 | import com.user.mngmnt.model.RoleNames; 19 | import com.user.mngmnt.service.CustomUserDetailsService; 20 | import org.springframework.security.web.session.HttpSessionEventPublisher; 21 | 22 | @Configuration 23 | @EnableWebSecurity 24 | @ComponentScan(basePackageClasses = CustomUserDetailsService.class) 25 | @AutoConfigureWebMvc 26 | public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 27 | 28 | @Autowired 29 | private UserDetailsService userDetailsService; 30 | 31 | @Bean(name = "passwordEncoder") 32 | public PasswordEncoder passwordencoder() { 33 | return new BCryptPasswordEncoder(); 34 | } 35 | 36 | @Autowired 37 | public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 38 | auth.userDetailsService(userDetailsService).passwordEncoder(passwordencoder()); 39 | } 40 | 41 | @Override 42 | protected void configure(HttpSecurity http) throws Exception { 43 | http 44 | .authorizeRequests() 45 | .antMatchers("/console/**").permitAll() 46 | .antMatchers("/", "/addNewUser").authenticated() 47 | .antMatchers("/getAllUser/**", "/removeAll/**").hasAuthority(RoleNames.ADMIN.name()) 48 | .antMatchers("/removeAll/**", "/addNewUser/**", "/save/**", "/register/**", "/delete/**", "/page/**", "/next/**", "/search/**").hasAuthority(RoleNames.ADMIN.name()) 49 | .anyRequest().permitAll() 50 | .and() 51 | .formLogin().loginPage("/login") 52 | .defaultSuccessUrl("/") 53 | .usernameParameter("username") 54 | .passwordParameter("password") 55 | .and() 56 | .logout().logoutSuccessUrl("/login") 57 | .and() 58 | .exceptionHandling().accessDeniedPage("/403") 59 | .and() 60 | .csrf().disable(); 61 | 62 | http.sessionManagement() 63 | .maximumSessions(1) 64 | .maxSessionsPreventsLogin(true) 65 | .expiredUrl("/login?error=You are already logged in from somewhere"); 66 | } 67 | 68 | @Bean 69 | public ServletListenerRegistrationBean httpSessionEventPublisher() { 70 | return new ServletListenerRegistrationBean(new HttpSessionEventPublisher()); 71 | } 72 | 73 | @Override 74 | public void configure(WebSecurity web) throws Exception { 75 | web.ignoring().antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**"); 76 | } 77 | 78 | } 79 | -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | html{box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{box-sizing:inherit}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important} 2 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/error.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 404 Not Found 9 | 10 | 11 | 12 | 44 | 50 | 51 | 52 | 53 |
54 | 55 |
56 |

404 Not Found

57 |

We couldn't find what you're looking for on .

58 |

Take Me To The Homepage 59 | 65 |

66 |
67 |
68 |
69 |
70 |
71 |
72 |

What happened?

73 |

A 404 error status implies that the file or page that you're looking for could not be found.

74 |
75 |
76 |

What can I do?

77 |

If you're a site visitor

78 |

Please use your browser's back button and check that you're in the right place. If you need immediate assistance, please send us an email instead.

79 |

If you're the site owner

80 |

Please check that you're in the right place and get in touch with your website provider if you believe this to be an error.

81 |
82 |
83 |
84 |
85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/403.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 | 3 | 4 | Error Page 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 403 Forbidden 16 | 17 | 18 | 19 | 64 | 70 | 71 | 72 | 73 |
74 |
75 |

403 Forbidden

76 |

Sorry! You don't have access permissions for that on . 77 |

78 |

Take Me To The Homepage 79 | 85 |

86 |
87 |
88 |
89 |
90 |
91 |
92 |

What happened?

93 |

A 403 error status indicates that you don't have permission to access the file or page. 94 | In general, web servers and websites have directories and files that are not open to the public web 95 | for security reasons.

96 |
97 |
98 |

What can I do?

99 |

If you're a site visitor

100 |

Please use your browsers back button and check that you're in the right place. If you need immediate 101 | assistance, please send us an email instead.

102 |

If you're the site owner

103 |

Please check that you're in the right place and get in touch with your website provider if you 104 | believe this to be an error.

105 |
106 |
107 |
108 |
109 | 110 | 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 40 | 41 | @REM set %HOME% to equivalent of $HOME 42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 43 | 44 | @REM Execute a user defined script before this one 45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 49 | :skipRcPre 50 | 51 | @setlocal 52 | 53 | set ERROR_CODE=0 54 | 55 | @REM To isolate internal variables from possible post scripts, we use another setlocal 56 | @setlocal 57 | 58 | @REM ==== START VALIDATION ==== 59 | if not "%JAVA_HOME%" == "" goto OkJHome 60 | 61 | echo. 62 | echo Error: JAVA_HOME not found in your environment. >&2 63 | echo Please set the JAVA_HOME variable in your environment to match the >&2 64 | echo location of your Java installation. >&2 65 | echo. 66 | goto error 67 | 68 | :OkJHome 69 | if exist "%JAVA_HOME%\bin\java.exe" goto init 70 | 71 | echo. 72 | echo Error: JAVA_HOME is set to an invalid directory. >&2 73 | echo JAVA_HOME = "%JAVA_HOME%" >&2 74 | echo Please set the JAVA_HOME variable in your environment to match the >&2 75 | echo location of your Java installation. >&2 76 | echo. 77 | goto error 78 | 79 | @REM ==== END VALIDATION ==== 80 | 81 | :init 82 | 83 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 84 | @REM Fallback to current working directory if not found. 85 | 86 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 87 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 88 | 89 | set EXEC_DIR=%CD% 90 | set WDIR=%EXEC_DIR% 91 | :findBaseDir 92 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 93 | cd .. 94 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 95 | set WDIR=%CD% 96 | goto findBaseDir 97 | 98 | :baseDirFound 99 | set MAVEN_PROJECTBASEDIR=%WDIR% 100 | cd "%EXEC_DIR%" 101 | goto endDetectBaseDir 102 | 103 | :baseDirNotFound 104 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 105 | cd "%EXEC_DIR%" 106 | 107 | :endDetectBaseDir 108 | 109 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 110 | 111 | @setlocal EnableExtensions EnableDelayedExpansion 112 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 113 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 114 | 115 | :endReadAdditionalConfig 116 | 117 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 118 | 119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 121 | 122 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 123 | if ERRORLEVEL 1 goto error 124 | goto end 125 | 126 | :error 127 | set ERROR_CODE=1 128 | 129 | :end 130 | @endlocal & set ERROR_CODE=%ERROR_CODE% 131 | 132 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 133 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 134 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 135 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 136 | :skipRcPost 137 | 138 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 139 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 140 | 141 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 142 | 143 | exit /B %ERROR_CODE% 144 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/search.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | Search Page 6 | 7 | 8 | 9 |
10 |
11 |
12 |
13 |

Advanced Search Page

14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 26 | 33 | 38 | 39 |
Search KeywordSelect Search ByAction
23 | 25 | 27 | 32 | 34 | 37 |
40 |
41 |
42 |
43 |
44 |
45 | 46 |
47 |
48 |
49 |
50 |
51 |

Matched Users

52 |
53 |
54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 70 | 79 | 88 | 93 | 100 | 102 | 103 | 104 | 105 |
User IdFirst NameLast NameEmailAction
68 | 69 | 71 | 74 | 78 | 80 | 83 | 87 | 89 | 92 | 94 | 96 | 99 | 101 |
106 |
107 |
108 |
109 |
110 |
111 |
112 | 113 | 114 | -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | font-family: sans-serif; 4 | line-height: 1.15; 5 | -webkit-text-size-adjust: 100%; 6 | -ms-text-size-adjust: 100%; 7 | -ms-overflow-style: scrollbar; 8 | -webkit-tap-highlight-color: transparent; 9 | } 10 | 11 | *, 12 | *::before, 13 | *::after { 14 | box-sizing: inherit; 15 | } 16 | 17 | @-ms-viewport { 18 | width: device-width; 19 | } 20 | 21 | article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { 22 | display: block; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; 28 | font-size: 1rem; 29 | font-weight: normal; 30 | line-height: 1.5; 31 | color: #212529; 32 | background-color: #fff; 33 | } 34 | 35 | [tabindex="-1"]:focus { 36 | outline: none !important; 37 | } 38 | 39 | hr { 40 | box-sizing: content-box; 41 | height: 0; 42 | overflow: visible; 43 | } 44 | 45 | h1, h2, h3, h4, h5, h6 { 46 | margin-top: 0; 47 | margin-bottom: .5rem; 48 | } 49 | 50 | p { 51 | margin-top: 0; 52 | margin-bottom: 1rem; 53 | } 54 | 55 | abbr[title], 56 | abbr[data-original-title] { 57 | text-decoration: underline; 58 | -webkit-text-decoration: underline dotted; 59 | text-decoration: underline dotted; 60 | cursor: help; 61 | border-bottom: 0; 62 | } 63 | 64 | address { 65 | margin-bottom: 1rem; 66 | font-style: normal; 67 | line-height: inherit; 68 | } 69 | 70 | ol, 71 | ul, 72 | dl { 73 | margin-top: 0; 74 | margin-bottom: 1rem; 75 | } 76 | 77 | ol ol, 78 | ul ul, 79 | ol ul, 80 | ul ol { 81 | margin-bottom: 0; 82 | } 83 | 84 | dt { 85 | font-weight: bold; 86 | } 87 | 88 | dd { 89 | margin-bottom: .5rem; 90 | margin-left: 0; 91 | } 92 | 93 | blockquote { 94 | margin: 0 0 1rem; 95 | } 96 | 97 | dfn { 98 | font-style: italic; 99 | } 100 | 101 | b, 102 | strong { 103 | font-weight: bolder; 104 | } 105 | 106 | small { 107 | font-size: 80%; 108 | } 109 | 110 | sub, 111 | sup { 112 | position: relative; 113 | font-size: 75%; 114 | line-height: 0; 115 | vertical-align: baseline; 116 | } 117 | 118 | sub { 119 | bottom: -.25em; 120 | } 121 | 122 | sup { 123 | top: -.5em; 124 | } 125 | 126 | a { 127 | color: #007bff; 128 | text-decoration: none; 129 | background-color: transparent; 130 | -webkit-text-decoration-skip: objects; 131 | } 132 | 133 | a:hover { 134 | color: #0056b3; 135 | text-decoration: underline; 136 | } 137 | 138 | a:not([href]):not([tabindex]) { 139 | color: inherit; 140 | text-decoration: none; 141 | } 142 | 143 | a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover { 144 | color: inherit; 145 | text-decoration: none; 146 | } 147 | 148 | a:not([href]):not([tabindex]):focus { 149 | outline: 0; 150 | } 151 | 152 | pre, 153 | code, 154 | kbd, 155 | samp { 156 | font-family: monospace, monospace; 157 | font-size: 1em; 158 | } 159 | 160 | pre { 161 | margin-top: 0; 162 | margin-bottom: 1rem; 163 | overflow: auto; 164 | } 165 | 166 | figure { 167 | margin: 0 0 1rem; 168 | } 169 | 170 | img { 171 | vertical-align: middle; 172 | border-style: none; 173 | } 174 | 175 | svg:not(:root) { 176 | overflow: hidden; 177 | } 178 | 179 | a, 180 | area, 181 | button, 182 | [role="button"], 183 | input, 184 | label, 185 | select, 186 | summary, 187 | textarea { 188 | -ms-touch-action: manipulation; 189 | touch-action: manipulation; 190 | } 191 | 192 | table { 193 | border-collapse: collapse; 194 | } 195 | 196 | caption { 197 | padding-top: 0.75rem; 198 | padding-bottom: 0.75rem; 199 | color: #868e96; 200 | text-align: left; 201 | caption-side: bottom; 202 | } 203 | 204 | th { 205 | text-align: left; 206 | } 207 | 208 | label { 209 | display: inline-block; 210 | margin-bottom: .5rem; 211 | } 212 | 213 | button:focus { 214 | outline: 1px dotted; 215 | outline: 5px auto -webkit-focus-ring-color; 216 | } 217 | 218 | input, 219 | button, 220 | select, 221 | optgroup, 222 | textarea { 223 | margin: 0; 224 | font-family: inherit; 225 | font-size: inherit; 226 | line-height: inherit; 227 | } 228 | 229 | button, 230 | input { 231 | overflow: visible; 232 | } 233 | 234 | button, 235 | select { 236 | text-transform: none; 237 | } 238 | 239 | button, 240 | html [type="button"], 241 | [type="reset"], 242 | [type="submit"] { 243 | -webkit-appearance: button; 244 | } 245 | 246 | button::-moz-focus-inner, 247 | [type="button"]::-moz-focus-inner, 248 | [type="reset"]::-moz-focus-inner, 249 | [type="submit"]::-moz-focus-inner { 250 | padding: 0; 251 | border-style: none; 252 | } 253 | 254 | input[type="radio"], 255 | input[type="checkbox"] { 256 | box-sizing: border-box; 257 | padding: 0; 258 | } 259 | 260 | input[type="date"], 261 | input[type="time"], 262 | input[type="datetime-local"], 263 | input[type="month"] { 264 | -webkit-appearance: listbox; 265 | } 266 | 267 | textarea { 268 | overflow: auto; 269 | resize: vertical; 270 | } 271 | 272 | fieldset { 273 | min-width: 0; 274 | padding: 0; 275 | margin: 0; 276 | border: 0; 277 | } 278 | 279 | legend { 280 | display: block; 281 | width: 100%; 282 | max-width: 100%; 283 | padding: 0; 284 | margin-bottom: .5rem; 285 | font-size: 1.5rem; 286 | line-height: inherit; 287 | color: inherit; 288 | white-space: normal; 289 | } 290 | 291 | progress { 292 | vertical-align: baseline; 293 | } 294 | 295 | [type="number"]::-webkit-inner-spin-button, 296 | [type="number"]::-webkit-outer-spin-button { 297 | height: auto; 298 | } 299 | 300 | [type="search"] { 301 | outline-offset: -2px; 302 | -webkit-appearance: none; 303 | } 304 | 305 | [type="search"]::-webkit-search-cancel-button, 306 | [type="search"]::-webkit-search-decoration { 307 | -webkit-appearance: none; 308 | } 309 | 310 | ::-webkit-file-upload-button { 311 | font: inherit; 312 | -webkit-appearance: button; 313 | } 314 | 315 | output { 316 | display: inline-block; 317 | } 318 | 319 | summary { 320 | display: list-item; 321 | } 322 | 323 | template { 324 | display: none; 325 | } 326 | 327 | [hidden] { 328 | display: none !important; 329 | } 330 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /src/main/java/com/user/mngmnt/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package com.user.mngmnt.controller; 2 | 3 | import com.user.mngmnt.constants.AppConstant; 4 | import com.user.mngmnt.dto.Response; 5 | import com.user.mngmnt.dto.SearchDTO; 6 | import com.user.mngmnt.model.RoleNames; 7 | import com.user.mngmnt.model.User; 8 | import com.user.mngmnt.service.UserService; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.beans.factory.annotation.Value; 11 | import org.springframework.data.domain.Page; 12 | import org.springframework.data.domain.PageRequest; 13 | import org.springframework.data.domain.Sort; 14 | import org.springframework.security.core.authority.SimpleGrantedAuthority; 15 | import org.springframework.security.core.context.SecurityContextHolder; 16 | import org.springframework.stereotype.Controller; 17 | import org.springframework.util.StringUtils; 18 | import org.springframework.web.bind.annotation.*; 19 | import org.springframework.web.servlet.ModelAndView; 20 | 21 | import javax.servlet.http.HttpServletRequest; 22 | import javax.servlet.http.HttpServletResponse; 23 | import java.util.ArrayList; 24 | import java.util.Collection; 25 | import java.util.List; 26 | 27 | @Controller 28 | public class UserController { 29 | 30 | @Autowired 31 | private UserService userService; 32 | 33 | @Value("${max.result.per.page}") 34 | private int maxResults; 35 | 36 | @Value("${max.card.display.on.pagination.tray}") 37 | private int maxPaginationTraySize; 38 | 39 | 40 | 41 | @GetMapping("/") 42 | public ModelAndView home(@RequestParam(value = "page", defaultValue = "0", required = false) Integer page, 43 | @RequestParam(value = "size", defaultValue = "4", required = false) Integer size, 44 | HttpServletRequest request, HttpServletResponse response) { 45 | 46 | Collection authorities = (Collection) 47 | SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 48 | List list = new ArrayList<>(); 49 | authorities.forEach(e -> { 50 | list.add(e.getAuthority()); 51 | }); 52 | 53 | ModelAndView modelAndView = new ModelAndView(); 54 | if (list.contains(RoleNames.ADMIN.name())) { 55 | modelAndView.setViewName("home"); 56 | Page allUsers = userService.listUsers(PageRequest.of(page, size, Sort.by("firstName"))); 57 | modelAndView.addObject("allUsers", allUsers); 58 | modelAndView.addObject("maxTraySize", size); 59 | modelAndView.addObject("currentPage", page); 60 | } else { 61 | modelAndView.setViewName("user-home"); 62 | User user = userService.findUserByEmail(request.getUserPrincipal().getName()); 63 | modelAndView.addObject("currentUser", user); 64 | } 65 | 66 | return modelAndView; 67 | } 68 | 69 | 70 | 71 | @GetMapping("/searchBox") 72 | public ModelAndView searchByTerm(@RequestParam(value = "page", defaultValue = "0", required = false) Integer page, 73 | @RequestParam(value = "size", defaultValue = "4", required = false) Integer size, 74 | @RequestParam(value = "searchTerm", required = false) String searchTerm) { 75 | ModelAndView modelAndView = new ModelAndView(); 76 | modelAndView.setViewName("home"); 77 | Page allUsers = userService.searchByTerm(searchTerm.trim(), PageRequest.of(page, size, Sort.by("firstName"))); 78 | modelAndView.addObject("allUsers", allUsers); 79 | modelAndView.addObject("maxTraySize", size); 80 | modelAndView.addObject("currentPage", page); 81 | return modelAndView; 82 | } 83 | 84 | 85 | 86 | @GetMapping("/search") 87 | public ModelAndView search() { 88 | ModelAndView modelAndView = new ModelAndView(); 89 | modelAndView.setViewName("search"); 90 | return modelAndView; 91 | } 92 | 93 | 94 | 95 | @PostMapping("/searchSubmit") 96 | public ModelAndView searchSubmit(@ModelAttribute SearchDTO searchDto) { 97 | List result = userService.searchBy(searchDto.getSearchKeyword(), searchDto.getCriteria()); 98 | ModelAndView modelAndView = new ModelAndView(); 99 | modelAndView.setViewName("search"); 100 | modelAndView.addObject("result", result); 101 | return modelAndView; 102 | } 103 | 104 | 105 | 106 | @GetMapping("/addNewUser") 107 | public ModelAndView addNewUser() { 108 | ModelAndView modelAndView = new ModelAndView(); 109 | modelAndView.setViewName("create-user"); 110 | return modelAndView; 111 | } 112 | 113 | 114 | 115 | @ResponseBody 116 | @PostMapping("/save") 117 | public Response update(@RequestBody User user) { 118 | User dbUser = userService.findById(user.getId()); 119 | dbUser.setFirstName(user.getFirstName()); 120 | dbUser.setLastName(user.getLastName()); 121 | userService.saveUser(dbUser); 122 | return new Response(302, AppConstant.SUCCESS, "/"); 123 | } 124 | 125 | 126 | 127 | @PostMapping("/register") 128 | public String register(@ModelAttribute User user) { 129 | String result = "redirect:/"; 130 | User dbUser = userService.findUserByEmail(user.getEmail()); 131 | if (user.getFirstName() == null || user.getFirstName().trim().isEmpty()) { 132 | result = "redirect:/addNewUser?error=Enter valid fist name"; 133 | } else if (user.getLastName() == null || user.getLastName().trim().isEmpty()) { 134 | result = "redirect:/addNewUser?error=Enter valid last name"; 135 | } else if (user.getEmail() == null || user.getEmail().trim().isEmpty()) { 136 | result = "redirect:/addNewUser?error=Enter valid email"; 137 | } else if (user.getPassword() == null || user.getPassword().trim().isEmpty()) { 138 | result = "redirect:/addNewUser?error=Enter valid password"; 139 | } else if (StringUtils.isEmpty(user.getRoleName())) { 140 | result = "redirect:/addNewUser?error=Select a valid Role"; 141 | } 142 | if (dbUser == null) { 143 | userService.saveUser(user); 144 | } else { 145 | result = "redirect:/addNewUser?error=User Already Exists!"; 146 | } 147 | 148 | return result; 149 | } 150 | 151 | 152 | 153 | @GetMapping("/delete/{userId}") 154 | public String delete(@PathVariable Long userId) { 155 | userService.removeById(userId); 156 | return "redirect:/"; 157 | } 158 | 159 | 160 | 161 | @ResponseBody 162 | @GetMapping("/removeAll") 163 | public Boolean removeAll() { 164 | return userService.removeAll(); 165 | } 166 | 167 | 168 | 169 | @GetMapping("/403") 170 | public ModelAndView accessDenied() { 171 | ModelAndView modelAndView = new ModelAndView(); 172 | modelAndView.setViewName("403"); 173 | return modelAndView; 174 | } 175 | 176 | 177 | 178 | @GetMapping("/error") 179 | public ModelAndView error() { 180 | ModelAndView modelAndView = new ModelAndView(); 181 | modelAndView.setViewName("error"); 182 | return modelAndView; 183 | } 184 | 185 | } 186 | -------------------------------------------------------------------------------- /mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Migwn, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 204 | echo $MAVEN_PROJECTBASEDIR 205 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 206 | 207 | # For Cygwin, switch paths to Windows format before running java 208 | if $cygwin; then 209 | [ -n "$M2_HOME" ] && 210 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 211 | [ -n "$JAVA_HOME" ] && 212 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 213 | [ -n "$CLASSPATH" ] && 214 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 215 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 216 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 217 | fi 218 | 219 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 220 | 221 | exec "$JAVACMD" \ 222 | $MAVEN_OPTS \ 223 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 224 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 225 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 226 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/home.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | List All Users 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 |
15 |

List of Users

16 |
    17 |
  • 18 |
    19 | 21 | 22 | 23 | 24 |
    25 |
  • 26 |
  • 27 | Advanced Search 28 |
  • 29 |
30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 50 | 59 | 68 | 73 | 80 | 83 | 84 | 85 | 86 | 87 |
User IdFirst NameLast NameEmailAction
48 | 49 | 51 | 54 | 58 | 60 | 63 | 67 | 69 | 72 | 74 | 76 | 79 | 82 |
88 |
89 | 90 |
No users Found... Search again!
91 |
92 |
93 | 94 |
95 |
96 | 97 | 119 | 120 | 121 | <%----%> 160 |
161 |
162 |
163 | 164 | 165 | -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/css/bootstrap-grid.min.css: -------------------------------------------------------------------------------- 1 | @-ms-viewport{width:device-width}html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}} 2 | /*# sourceMappingURL=bootstrap-grid.min.css.map */ -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/css/bootstrap-reboot.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAoBA,KACE,WAAA,WACA,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAGF,EClBA,QADA,SDsBE,WAAA,QAKA,cAAgB,MAAA,aAIlB,QAAA,MAAA,OAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,IAAA,QACE,QAAA,MAQF,KACE,OAAA,EACA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KExBF,sBFiCE,QAAA,YASF,GACE,WAAA,YACA,OAAA,EACA,SAAA,QAYF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KC/CF,0BDyDA,YAEE,gBAAA,UACA,wBAAA,UAAA,OAAA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QCpDF,GDuDA,GCxDA,GD2DE,WAAA,EACA,cAAA,KAGF,MCvDA,MACA,MAFA,MD4DE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAGF,ECxDA,OD0DE,YAAA,OAGF,MACE,UAAA,IAQF,IC7DA,ID+DE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QGpLE,QHuLA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KGzLE,oCAAA,oCH4LA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EC/DJ,KACA,IDuEA,ICtEA,KD0EE,YAAA,SAAA,CAAA,UACA,UAAA,IAGF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,eACE,SAAA,OCjFF,cD+FA,ECjGA,KACA,OAEA,MACA,MACA,OACA,QACA,SDmGE,iBAAA,aAAA,aAAA,aAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBC7GF,ODgHA,MC9GA,SADA,OAEA,SDkHE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,OChHA,MDkHE,SAAA,QAGF,OChHA,ODkHE,eAAA,KC5GF,aACA,cDiHA,OCnHA,mBDuHE,mBAAA,OChHF,gCACA,+BACA,gCDkHA,yBAIE,QAAA,EACA,aAAA,KCjHF,qBDoHA,kBAEE,WAAA,WACA,QAAA,EAIF,iBCpHA,2BACA,kBAFA,iBD8HE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SEnIF,yCDGA,yCDsIE,OAAA,KEpIF,cF4IE,eAAA,KACA,mBAAA,KExIF,4CDGA,yCD8IE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UAGF,SACE,QAAA,KErJF,SF2JE,QAAA","sourcesContent":["// scss-lint:disable QualifyingElement, DuplicateProperty, VendorPrefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\nhtml {\n box-sizing: border-box; // 1\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: rgba(0,0,0,0); // 6\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit; // 1\n}\n\n// IE10+ doesn't honor `` in some cases.\n@at-root {\n @-ms-viewport { width: device-width; }\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; // Correct the inheritance and scaling of font size in all browsers.\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg:not(:root) {\n overflow: hidden; // Hide the overflow in IE\n}\n\n\n// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.\n//\n// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11\n// DON'T remove the click delay when `` is present.\n// However, they DO support removing the click delay via `touch-action: manipulation`.\n// See:\n// * https://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch\n// * http://caniuse.com/#feat=css-touch-action\n// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $text-muted;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment\n text-align: left;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: .5rem;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","html {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #868e96;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */","html {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #868e96;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","@mixin hover {\n // TODO: re-enable along with mq4-hover-shim\n// @if $enable-hover-media-query {\n// // See Media Queries Level 4: https://drafts.csswg.org/mediaqueries/#hover\n// // Currently shimmed by https://github.com/twbs/mq4-hover-shim\n// @media (hover: hover) {\n// &:hover { @content }\n// }\n// }\n// @else {\n// scss-lint:disable Indentation\n &:hover { @content }\n// scss-lint:enable Indentation\n// }\n}\n\n\n@mixin hover-focus {\n @if $enable-hover-media-query {\n &:focus { @content }\n @include hover { @content }\n } @else {\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin plain-hover-focus {\n @if $enable-hover-media-query {\n &,\n &:focus {\n @content\n }\n @include hover { @content }\n } @else {\n &,\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin hover-focus-active {\n @if $enable-hover-media-query {\n &:focus,\n &:active {\n @content\n }\n @include hover { @content }\n } @else {\n &:focus,\n &:active,\n &:hover {\n @content\n }\n }\n}\n"]} -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/css/bootstrap-grid.css: -------------------------------------------------------------------------------- 1 | @-ms-viewport { 2 | width: device-width; 3 | } 4 | 5 | html { 6 | box-sizing: border-box; 7 | -ms-overflow-style: scrollbar; 8 | } 9 | 10 | *, 11 | *::before, 12 | *::after { 13 | box-sizing: inherit; 14 | } 15 | 16 | .container { 17 | margin-right: auto; 18 | margin-left: auto; 19 | padding-right: 15px; 20 | padding-left: 15px; 21 | width: 100%; 22 | } 23 | 24 | @media (min-width: 576px) { 25 | .container { 26 | max-width: 540px; 27 | } 28 | } 29 | 30 | @media (min-width: 768px) { 31 | .container { 32 | max-width: 720px; 33 | } 34 | } 35 | 36 | @media (min-width: 992px) { 37 | .container { 38 | max-width: 960px; 39 | } 40 | } 41 | 42 | @media (min-width: 1200px) { 43 | .container { 44 | max-width: 1140px; 45 | } 46 | } 47 | 48 | .container-fluid { 49 | width: 100%; 50 | margin-right: auto; 51 | margin-left: auto; 52 | padding-right: 15px; 53 | padding-left: 15px; 54 | width: 100%; 55 | } 56 | 57 | .row { 58 | display: -ms-flexbox; 59 | display: flex; 60 | -ms-flex-wrap: wrap; 61 | flex-wrap: wrap; 62 | margin-right: -15px; 63 | margin-left: -15px; 64 | } 65 | 66 | .no-gutters { 67 | margin-right: 0; 68 | margin-left: 0; 69 | } 70 | 71 | .no-gutters > .col, 72 | .no-gutters > [class*="col-"] { 73 | padding-right: 0; 74 | padding-left: 0; 75 | } 76 | 77 | .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, 78 | .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, 79 | .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, 80 | .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, 81 | .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, 82 | .col-xl-auto { 83 | position: relative; 84 | width: 100%; 85 | min-height: 1px; 86 | padding-right: 15px; 87 | padding-left: 15px; 88 | } 89 | 90 | .col { 91 | -ms-flex-preferred-size: 0; 92 | flex-basis: 0; 93 | -ms-flex-positive: 1; 94 | flex-grow: 1; 95 | max-width: 100%; 96 | } 97 | 98 | .col-auto { 99 | -ms-flex: 0 0 auto; 100 | flex: 0 0 auto; 101 | width: auto; 102 | max-width: none; 103 | } 104 | 105 | .col-1 { 106 | -ms-flex: 0 0 8.333333%; 107 | flex: 0 0 8.333333%; 108 | max-width: 8.333333%; 109 | } 110 | 111 | .col-2 { 112 | -ms-flex: 0 0 16.666667%; 113 | flex: 0 0 16.666667%; 114 | max-width: 16.666667%; 115 | } 116 | 117 | .col-3 { 118 | -ms-flex: 0 0 25%; 119 | flex: 0 0 25%; 120 | max-width: 25%; 121 | } 122 | 123 | .col-4 { 124 | -ms-flex: 0 0 33.333333%; 125 | flex: 0 0 33.333333%; 126 | max-width: 33.333333%; 127 | } 128 | 129 | .col-5 { 130 | -ms-flex: 0 0 41.666667%; 131 | flex: 0 0 41.666667%; 132 | max-width: 41.666667%; 133 | } 134 | 135 | .col-6 { 136 | -ms-flex: 0 0 50%; 137 | flex: 0 0 50%; 138 | max-width: 50%; 139 | } 140 | 141 | .col-7 { 142 | -ms-flex: 0 0 58.333333%; 143 | flex: 0 0 58.333333%; 144 | max-width: 58.333333%; 145 | } 146 | 147 | .col-8 { 148 | -ms-flex: 0 0 66.666667%; 149 | flex: 0 0 66.666667%; 150 | max-width: 66.666667%; 151 | } 152 | 153 | .col-9 { 154 | -ms-flex: 0 0 75%; 155 | flex: 0 0 75%; 156 | max-width: 75%; 157 | } 158 | 159 | .col-10 { 160 | -ms-flex: 0 0 83.333333%; 161 | flex: 0 0 83.333333%; 162 | max-width: 83.333333%; 163 | } 164 | 165 | .col-11 { 166 | -ms-flex: 0 0 91.666667%; 167 | flex: 0 0 91.666667%; 168 | max-width: 91.666667%; 169 | } 170 | 171 | .col-12 { 172 | -ms-flex: 0 0 100%; 173 | flex: 0 0 100%; 174 | max-width: 100%; 175 | } 176 | 177 | .order-1 { 178 | -ms-flex-order: 1; 179 | order: 1; 180 | } 181 | 182 | .order-2 { 183 | -ms-flex-order: 2; 184 | order: 2; 185 | } 186 | 187 | .order-3 { 188 | -ms-flex-order: 3; 189 | order: 3; 190 | } 191 | 192 | .order-4 { 193 | -ms-flex-order: 4; 194 | order: 4; 195 | } 196 | 197 | .order-5 { 198 | -ms-flex-order: 5; 199 | order: 5; 200 | } 201 | 202 | .order-6 { 203 | -ms-flex-order: 6; 204 | order: 6; 205 | } 206 | 207 | .order-7 { 208 | -ms-flex-order: 7; 209 | order: 7; 210 | } 211 | 212 | .order-8 { 213 | -ms-flex-order: 8; 214 | order: 8; 215 | } 216 | 217 | .order-9 { 218 | -ms-flex-order: 9; 219 | order: 9; 220 | } 221 | 222 | .order-10 { 223 | -ms-flex-order: 10; 224 | order: 10; 225 | } 226 | 227 | .order-11 { 228 | -ms-flex-order: 11; 229 | order: 11; 230 | } 231 | 232 | .order-12 { 233 | -ms-flex-order: 12; 234 | order: 12; 235 | } 236 | 237 | @media (min-width: 576px) { 238 | .col-sm { 239 | -ms-flex-preferred-size: 0; 240 | flex-basis: 0; 241 | -ms-flex-positive: 1; 242 | flex-grow: 1; 243 | max-width: 100%; 244 | } 245 | .col-sm-auto { 246 | -ms-flex: 0 0 auto; 247 | flex: 0 0 auto; 248 | width: auto; 249 | max-width: none; 250 | } 251 | .col-sm-1 { 252 | -ms-flex: 0 0 8.333333%; 253 | flex: 0 0 8.333333%; 254 | max-width: 8.333333%; 255 | } 256 | .col-sm-2 { 257 | -ms-flex: 0 0 16.666667%; 258 | flex: 0 0 16.666667%; 259 | max-width: 16.666667%; 260 | } 261 | .col-sm-3 { 262 | -ms-flex: 0 0 25%; 263 | flex: 0 0 25%; 264 | max-width: 25%; 265 | } 266 | .col-sm-4 { 267 | -ms-flex: 0 0 33.333333%; 268 | flex: 0 0 33.333333%; 269 | max-width: 33.333333%; 270 | } 271 | .col-sm-5 { 272 | -ms-flex: 0 0 41.666667%; 273 | flex: 0 0 41.666667%; 274 | max-width: 41.666667%; 275 | } 276 | .col-sm-6 { 277 | -ms-flex: 0 0 50%; 278 | flex: 0 0 50%; 279 | max-width: 50%; 280 | } 281 | .col-sm-7 { 282 | -ms-flex: 0 0 58.333333%; 283 | flex: 0 0 58.333333%; 284 | max-width: 58.333333%; 285 | } 286 | .col-sm-8 { 287 | -ms-flex: 0 0 66.666667%; 288 | flex: 0 0 66.666667%; 289 | max-width: 66.666667%; 290 | } 291 | .col-sm-9 { 292 | -ms-flex: 0 0 75%; 293 | flex: 0 0 75%; 294 | max-width: 75%; 295 | } 296 | .col-sm-10 { 297 | -ms-flex: 0 0 83.333333%; 298 | flex: 0 0 83.333333%; 299 | max-width: 83.333333%; 300 | } 301 | .col-sm-11 { 302 | -ms-flex: 0 0 91.666667%; 303 | flex: 0 0 91.666667%; 304 | max-width: 91.666667%; 305 | } 306 | .col-sm-12 { 307 | -ms-flex: 0 0 100%; 308 | flex: 0 0 100%; 309 | max-width: 100%; 310 | } 311 | .order-sm-1 { 312 | -ms-flex-order: 1; 313 | order: 1; 314 | } 315 | .order-sm-2 { 316 | -ms-flex-order: 2; 317 | order: 2; 318 | } 319 | .order-sm-3 { 320 | -ms-flex-order: 3; 321 | order: 3; 322 | } 323 | .order-sm-4 { 324 | -ms-flex-order: 4; 325 | order: 4; 326 | } 327 | .order-sm-5 { 328 | -ms-flex-order: 5; 329 | order: 5; 330 | } 331 | .order-sm-6 { 332 | -ms-flex-order: 6; 333 | order: 6; 334 | } 335 | .order-sm-7 { 336 | -ms-flex-order: 7; 337 | order: 7; 338 | } 339 | .order-sm-8 { 340 | -ms-flex-order: 8; 341 | order: 8; 342 | } 343 | .order-sm-9 { 344 | -ms-flex-order: 9; 345 | order: 9; 346 | } 347 | .order-sm-10 { 348 | -ms-flex-order: 10; 349 | order: 10; 350 | } 351 | .order-sm-11 { 352 | -ms-flex-order: 11; 353 | order: 11; 354 | } 355 | .order-sm-12 { 356 | -ms-flex-order: 12; 357 | order: 12; 358 | } 359 | } 360 | 361 | @media (min-width: 768px) { 362 | .col-md { 363 | -ms-flex-preferred-size: 0; 364 | flex-basis: 0; 365 | -ms-flex-positive: 1; 366 | flex-grow: 1; 367 | max-width: 100%; 368 | } 369 | .col-md-auto { 370 | -ms-flex: 0 0 auto; 371 | flex: 0 0 auto; 372 | width: auto; 373 | max-width: none; 374 | } 375 | .col-md-1 { 376 | -ms-flex: 0 0 8.333333%; 377 | flex: 0 0 8.333333%; 378 | max-width: 8.333333%; 379 | } 380 | .col-md-2 { 381 | -ms-flex: 0 0 16.666667%; 382 | flex: 0 0 16.666667%; 383 | max-width: 16.666667%; 384 | } 385 | .col-md-3 { 386 | -ms-flex: 0 0 25%; 387 | flex: 0 0 25%; 388 | max-width: 25%; 389 | } 390 | .col-md-4 { 391 | -ms-flex: 0 0 33.333333%; 392 | flex: 0 0 33.333333%; 393 | max-width: 33.333333%; 394 | } 395 | .col-md-5 { 396 | -ms-flex: 0 0 41.666667%; 397 | flex: 0 0 41.666667%; 398 | max-width: 41.666667%; 399 | } 400 | .col-md-6 { 401 | -ms-flex: 0 0 50%; 402 | flex: 0 0 50%; 403 | max-width: 50%; 404 | } 405 | .col-md-7 { 406 | -ms-flex: 0 0 58.333333%; 407 | flex: 0 0 58.333333%; 408 | max-width: 58.333333%; 409 | } 410 | .col-md-8 { 411 | -ms-flex: 0 0 66.666667%; 412 | flex: 0 0 66.666667%; 413 | max-width: 66.666667%; 414 | } 415 | .col-md-9 { 416 | -ms-flex: 0 0 75%; 417 | flex: 0 0 75%; 418 | max-width: 75%; 419 | } 420 | .col-md-10 { 421 | -ms-flex: 0 0 83.333333%; 422 | flex: 0 0 83.333333%; 423 | max-width: 83.333333%; 424 | } 425 | .col-md-11 { 426 | -ms-flex: 0 0 91.666667%; 427 | flex: 0 0 91.666667%; 428 | max-width: 91.666667%; 429 | } 430 | .col-md-12 { 431 | -ms-flex: 0 0 100%; 432 | flex: 0 0 100%; 433 | max-width: 100%; 434 | } 435 | .order-md-1 { 436 | -ms-flex-order: 1; 437 | order: 1; 438 | } 439 | .order-md-2 { 440 | -ms-flex-order: 2; 441 | order: 2; 442 | } 443 | .order-md-3 { 444 | -ms-flex-order: 3; 445 | order: 3; 446 | } 447 | .order-md-4 { 448 | -ms-flex-order: 4; 449 | order: 4; 450 | } 451 | .order-md-5 { 452 | -ms-flex-order: 5; 453 | order: 5; 454 | } 455 | .order-md-6 { 456 | -ms-flex-order: 6; 457 | order: 6; 458 | } 459 | .order-md-7 { 460 | -ms-flex-order: 7; 461 | order: 7; 462 | } 463 | .order-md-8 { 464 | -ms-flex-order: 8; 465 | order: 8; 466 | } 467 | .order-md-9 { 468 | -ms-flex-order: 9; 469 | order: 9; 470 | } 471 | .order-md-10 { 472 | -ms-flex-order: 10; 473 | order: 10; 474 | } 475 | .order-md-11 { 476 | -ms-flex-order: 11; 477 | order: 11; 478 | } 479 | .order-md-12 { 480 | -ms-flex-order: 12; 481 | order: 12; 482 | } 483 | } 484 | 485 | @media (min-width: 992px) { 486 | .col-lg { 487 | -ms-flex-preferred-size: 0; 488 | flex-basis: 0; 489 | -ms-flex-positive: 1; 490 | flex-grow: 1; 491 | max-width: 100%; 492 | } 493 | .col-lg-auto { 494 | -ms-flex: 0 0 auto; 495 | flex: 0 0 auto; 496 | width: auto; 497 | max-width: none; 498 | } 499 | .col-lg-1 { 500 | -ms-flex: 0 0 8.333333%; 501 | flex: 0 0 8.333333%; 502 | max-width: 8.333333%; 503 | } 504 | .col-lg-2 { 505 | -ms-flex: 0 0 16.666667%; 506 | flex: 0 0 16.666667%; 507 | max-width: 16.666667%; 508 | } 509 | .col-lg-3 { 510 | -ms-flex: 0 0 25%; 511 | flex: 0 0 25%; 512 | max-width: 25%; 513 | } 514 | .col-lg-4 { 515 | -ms-flex: 0 0 33.333333%; 516 | flex: 0 0 33.333333%; 517 | max-width: 33.333333%; 518 | } 519 | .col-lg-5 { 520 | -ms-flex: 0 0 41.666667%; 521 | flex: 0 0 41.666667%; 522 | max-width: 41.666667%; 523 | } 524 | .col-lg-6 { 525 | -ms-flex: 0 0 50%; 526 | flex: 0 0 50%; 527 | max-width: 50%; 528 | } 529 | .col-lg-7 { 530 | -ms-flex: 0 0 58.333333%; 531 | flex: 0 0 58.333333%; 532 | max-width: 58.333333%; 533 | } 534 | .col-lg-8 { 535 | -ms-flex: 0 0 66.666667%; 536 | flex: 0 0 66.666667%; 537 | max-width: 66.666667%; 538 | } 539 | .col-lg-9 { 540 | -ms-flex: 0 0 75%; 541 | flex: 0 0 75%; 542 | max-width: 75%; 543 | } 544 | .col-lg-10 { 545 | -ms-flex: 0 0 83.333333%; 546 | flex: 0 0 83.333333%; 547 | max-width: 83.333333%; 548 | } 549 | .col-lg-11 { 550 | -ms-flex: 0 0 91.666667%; 551 | flex: 0 0 91.666667%; 552 | max-width: 91.666667%; 553 | } 554 | .col-lg-12 { 555 | -ms-flex: 0 0 100%; 556 | flex: 0 0 100%; 557 | max-width: 100%; 558 | } 559 | .order-lg-1 { 560 | -ms-flex-order: 1; 561 | order: 1; 562 | } 563 | .order-lg-2 { 564 | -ms-flex-order: 2; 565 | order: 2; 566 | } 567 | .order-lg-3 { 568 | -ms-flex-order: 3; 569 | order: 3; 570 | } 571 | .order-lg-4 { 572 | -ms-flex-order: 4; 573 | order: 4; 574 | } 575 | .order-lg-5 { 576 | -ms-flex-order: 5; 577 | order: 5; 578 | } 579 | .order-lg-6 { 580 | -ms-flex-order: 6; 581 | order: 6; 582 | } 583 | .order-lg-7 { 584 | -ms-flex-order: 7; 585 | order: 7; 586 | } 587 | .order-lg-8 { 588 | -ms-flex-order: 8; 589 | order: 8; 590 | } 591 | .order-lg-9 { 592 | -ms-flex-order: 9; 593 | order: 9; 594 | } 595 | .order-lg-10 { 596 | -ms-flex-order: 10; 597 | order: 10; 598 | } 599 | .order-lg-11 { 600 | -ms-flex-order: 11; 601 | order: 11; 602 | } 603 | .order-lg-12 { 604 | -ms-flex-order: 12; 605 | order: 12; 606 | } 607 | } 608 | 609 | @media (min-width: 1200px) { 610 | .col-xl { 611 | -ms-flex-preferred-size: 0; 612 | flex-basis: 0; 613 | -ms-flex-positive: 1; 614 | flex-grow: 1; 615 | max-width: 100%; 616 | } 617 | .col-xl-auto { 618 | -ms-flex: 0 0 auto; 619 | flex: 0 0 auto; 620 | width: auto; 621 | max-width: none; 622 | } 623 | .col-xl-1 { 624 | -ms-flex: 0 0 8.333333%; 625 | flex: 0 0 8.333333%; 626 | max-width: 8.333333%; 627 | } 628 | .col-xl-2 { 629 | -ms-flex: 0 0 16.666667%; 630 | flex: 0 0 16.666667%; 631 | max-width: 16.666667%; 632 | } 633 | .col-xl-3 { 634 | -ms-flex: 0 0 25%; 635 | flex: 0 0 25%; 636 | max-width: 25%; 637 | } 638 | .col-xl-4 { 639 | -ms-flex: 0 0 33.333333%; 640 | flex: 0 0 33.333333%; 641 | max-width: 33.333333%; 642 | } 643 | .col-xl-5 { 644 | -ms-flex: 0 0 41.666667%; 645 | flex: 0 0 41.666667%; 646 | max-width: 41.666667%; 647 | } 648 | .col-xl-6 { 649 | -ms-flex: 0 0 50%; 650 | flex: 0 0 50%; 651 | max-width: 50%; 652 | } 653 | .col-xl-7 { 654 | -ms-flex: 0 0 58.333333%; 655 | flex: 0 0 58.333333%; 656 | max-width: 58.333333%; 657 | } 658 | .col-xl-8 { 659 | -ms-flex: 0 0 66.666667%; 660 | flex: 0 0 66.666667%; 661 | max-width: 66.666667%; 662 | } 663 | .col-xl-9 { 664 | -ms-flex: 0 0 75%; 665 | flex: 0 0 75%; 666 | max-width: 75%; 667 | } 668 | .col-xl-10 { 669 | -ms-flex: 0 0 83.333333%; 670 | flex: 0 0 83.333333%; 671 | max-width: 83.333333%; 672 | } 673 | .col-xl-11 { 674 | -ms-flex: 0 0 91.666667%; 675 | flex: 0 0 91.666667%; 676 | max-width: 91.666667%; 677 | } 678 | .col-xl-12 { 679 | -ms-flex: 0 0 100%; 680 | flex: 0 0 100%; 681 | max-width: 100%; 682 | } 683 | .order-xl-1 { 684 | -ms-flex-order: 1; 685 | order: 1; 686 | } 687 | .order-xl-2 { 688 | -ms-flex-order: 2; 689 | order: 2; 690 | } 691 | .order-xl-3 { 692 | -ms-flex-order: 3; 693 | order: 3; 694 | } 695 | .order-xl-4 { 696 | -ms-flex-order: 4; 697 | order: 4; 698 | } 699 | .order-xl-5 { 700 | -ms-flex-order: 5; 701 | order: 5; 702 | } 703 | .order-xl-6 { 704 | -ms-flex-order: 6; 705 | order: 6; 706 | } 707 | .order-xl-7 { 708 | -ms-flex-order: 7; 709 | order: 7; 710 | } 711 | .order-xl-8 { 712 | -ms-flex-order: 8; 713 | order: 8; 714 | } 715 | .order-xl-9 { 716 | -ms-flex-order: 9; 717 | order: 9; 718 | } 719 | .order-xl-10 { 720 | -ms-flex-order: 10; 721 | order: 10; 722 | } 723 | .order-xl-11 { 724 | -ms-flex-order: 11; 725 | order: 11; 726 | } 727 | .order-xl-12 { 728 | -ms-flex-order: 12; 729 | order: 12; 730 | } 731 | } 732 | 733 | .flex-row { 734 | -ms-flex-direction: row !important; 735 | flex-direction: row !important; 736 | } 737 | 738 | .flex-column { 739 | -ms-flex-direction: column !important; 740 | flex-direction: column !important; 741 | } 742 | 743 | .flex-row-reverse { 744 | -ms-flex-direction: row-reverse !important; 745 | flex-direction: row-reverse !important; 746 | } 747 | 748 | .flex-column-reverse { 749 | -ms-flex-direction: column-reverse !important; 750 | flex-direction: column-reverse !important; 751 | } 752 | 753 | .flex-wrap { 754 | -ms-flex-wrap: wrap !important; 755 | flex-wrap: wrap !important; 756 | } 757 | 758 | .flex-nowrap { 759 | -ms-flex-wrap: nowrap !important; 760 | flex-wrap: nowrap !important; 761 | } 762 | 763 | .flex-wrap-reverse { 764 | -ms-flex-wrap: wrap-reverse !important; 765 | flex-wrap: wrap-reverse !important; 766 | } 767 | 768 | .justify-content-start { 769 | -ms-flex-pack: start !important; 770 | justify-content: flex-start !important; 771 | } 772 | 773 | .justify-content-end { 774 | -ms-flex-pack: end !important; 775 | justify-content: flex-end !important; 776 | } 777 | 778 | .justify-content-center { 779 | -ms-flex-pack: center !important; 780 | justify-content: center !important; 781 | } 782 | 783 | .justify-content-between { 784 | -ms-flex-pack: justify !important; 785 | justify-content: space-between !important; 786 | } 787 | 788 | .justify-content-around { 789 | -ms-flex-pack: distribute !important; 790 | justify-content: space-around !important; 791 | } 792 | 793 | .align-items-start { 794 | -ms-flex-align: start !important; 795 | align-items: flex-start !important; 796 | } 797 | 798 | .align-items-end { 799 | -ms-flex-align: end !important; 800 | align-items: flex-end !important; 801 | } 802 | 803 | .align-items-center { 804 | -ms-flex-align: center !important; 805 | align-items: center !important; 806 | } 807 | 808 | .align-items-baseline { 809 | -ms-flex-align: baseline !important; 810 | align-items: baseline !important; 811 | } 812 | 813 | .align-items-stretch { 814 | -ms-flex-align: stretch !important; 815 | align-items: stretch !important; 816 | } 817 | 818 | .align-content-start { 819 | -ms-flex-line-pack: start !important; 820 | align-content: flex-start !important; 821 | } 822 | 823 | .align-content-end { 824 | -ms-flex-line-pack: end !important; 825 | align-content: flex-end !important; 826 | } 827 | 828 | .align-content-center { 829 | -ms-flex-line-pack: center !important; 830 | align-content: center !important; 831 | } 832 | 833 | .align-content-between { 834 | -ms-flex-line-pack: justify !important; 835 | align-content: space-between !important; 836 | } 837 | 838 | .align-content-around { 839 | -ms-flex-line-pack: distribute !important; 840 | align-content: space-around !important; 841 | } 842 | 843 | .align-content-stretch { 844 | -ms-flex-line-pack: stretch !important; 845 | align-content: stretch !important; 846 | } 847 | 848 | .align-self-auto { 849 | -ms-flex-item-align: auto !important; 850 | align-self: auto !important; 851 | } 852 | 853 | .align-self-start { 854 | -ms-flex-item-align: start !important; 855 | align-self: flex-start !important; 856 | } 857 | 858 | .align-self-end { 859 | -ms-flex-item-align: end !important; 860 | align-self: flex-end !important; 861 | } 862 | 863 | .align-self-center { 864 | -ms-flex-item-align: center !important; 865 | align-self: center !important; 866 | } 867 | 868 | .align-self-baseline { 869 | -ms-flex-item-align: baseline !important; 870 | align-self: baseline !important; 871 | } 872 | 873 | .align-self-stretch { 874 | -ms-flex-item-align: stretch !important; 875 | align-self: stretch !important; 876 | } 877 | 878 | @media (min-width: 576px) { 879 | .flex-sm-row { 880 | -ms-flex-direction: row !important; 881 | flex-direction: row !important; 882 | } 883 | .flex-sm-column { 884 | -ms-flex-direction: column !important; 885 | flex-direction: column !important; 886 | } 887 | .flex-sm-row-reverse { 888 | -ms-flex-direction: row-reverse !important; 889 | flex-direction: row-reverse !important; 890 | } 891 | .flex-sm-column-reverse { 892 | -ms-flex-direction: column-reverse !important; 893 | flex-direction: column-reverse !important; 894 | } 895 | .flex-sm-wrap { 896 | -ms-flex-wrap: wrap !important; 897 | flex-wrap: wrap !important; 898 | } 899 | .flex-sm-nowrap { 900 | -ms-flex-wrap: nowrap !important; 901 | flex-wrap: nowrap !important; 902 | } 903 | .flex-sm-wrap-reverse { 904 | -ms-flex-wrap: wrap-reverse !important; 905 | flex-wrap: wrap-reverse !important; 906 | } 907 | .justify-content-sm-start { 908 | -ms-flex-pack: start !important; 909 | justify-content: flex-start !important; 910 | } 911 | .justify-content-sm-end { 912 | -ms-flex-pack: end !important; 913 | justify-content: flex-end !important; 914 | } 915 | .justify-content-sm-center { 916 | -ms-flex-pack: center !important; 917 | justify-content: center !important; 918 | } 919 | .justify-content-sm-between { 920 | -ms-flex-pack: justify !important; 921 | justify-content: space-between !important; 922 | } 923 | .justify-content-sm-around { 924 | -ms-flex-pack: distribute !important; 925 | justify-content: space-around !important; 926 | } 927 | .align-items-sm-start { 928 | -ms-flex-align: start !important; 929 | align-items: flex-start !important; 930 | } 931 | .align-items-sm-end { 932 | -ms-flex-align: end !important; 933 | align-items: flex-end !important; 934 | } 935 | .align-items-sm-center { 936 | -ms-flex-align: center !important; 937 | align-items: center !important; 938 | } 939 | .align-items-sm-baseline { 940 | -ms-flex-align: baseline !important; 941 | align-items: baseline !important; 942 | } 943 | .align-items-sm-stretch { 944 | -ms-flex-align: stretch !important; 945 | align-items: stretch !important; 946 | } 947 | .align-content-sm-start { 948 | -ms-flex-line-pack: start !important; 949 | align-content: flex-start !important; 950 | } 951 | .align-content-sm-end { 952 | -ms-flex-line-pack: end !important; 953 | align-content: flex-end !important; 954 | } 955 | .align-content-sm-center { 956 | -ms-flex-line-pack: center !important; 957 | align-content: center !important; 958 | } 959 | .align-content-sm-between { 960 | -ms-flex-line-pack: justify !important; 961 | align-content: space-between !important; 962 | } 963 | .align-content-sm-around { 964 | -ms-flex-line-pack: distribute !important; 965 | align-content: space-around !important; 966 | } 967 | .align-content-sm-stretch { 968 | -ms-flex-line-pack: stretch !important; 969 | align-content: stretch !important; 970 | } 971 | .align-self-sm-auto { 972 | -ms-flex-item-align: auto !important; 973 | align-self: auto !important; 974 | } 975 | .align-self-sm-start { 976 | -ms-flex-item-align: start !important; 977 | align-self: flex-start !important; 978 | } 979 | .align-self-sm-end { 980 | -ms-flex-item-align: end !important; 981 | align-self: flex-end !important; 982 | } 983 | .align-self-sm-center { 984 | -ms-flex-item-align: center !important; 985 | align-self: center !important; 986 | } 987 | .align-self-sm-baseline { 988 | -ms-flex-item-align: baseline !important; 989 | align-self: baseline !important; 990 | } 991 | .align-self-sm-stretch { 992 | -ms-flex-item-align: stretch !important; 993 | align-self: stretch !important; 994 | } 995 | } 996 | 997 | @media (min-width: 768px) { 998 | .flex-md-row { 999 | -ms-flex-direction: row !important; 1000 | flex-direction: row !important; 1001 | } 1002 | .flex-md-column { 1003 | -ms-flex-direction: column !important; 1004 | flex-direction: column !important; 1005 | } 1006 | .flex-md-row-reverse { 1007 | -ms-flex-direction: row-reverse !important; 1008 | flex-direction: row-reverse !important; 1009 | } 1010 | .flex-md-column-reverse { 1011 | -ms-flex-direction: column-reverse !important; 1012 | flex-direction: column-reverse !important; 1013 | } 1014 | .flex-md-wrap { 1015 | -ms-flex-wrap: wrap !important; 1016 | flex-wrap: wrap !important; 1017 | } 1018 | .flex-md-nowrap { 1019 | -ms-flex-wrap: nowrap !important; 1020 | flex-wrap: nowrap !important; 1021 | } 1022 | .flex-md-wrap-reverse { 1023 | -ms-flex-wrap: wrap-reverse !important; 1024 | flex-wrap: wrap-reverse !important; 1025 | } 1026 | .justify-content-md-start { 1027 | -ms-flex-pack: start !important; 1028 | justify-content: flex-start !important; 1029 | } 1030 | .justify-content-md-end { 1031 | -ms-flex-pack: end !important; 1032 | justify-content: flex-end !important; 1033 | } 1034 | .justify-content-md-center { 1035 | -ms-flex-pack: center !important; 1036 | justify-content: center !important; 1037 | } 1038 | .justify-content-md-between { 1039 | -ms-flex-pack: justify !important; 1040 | justify-content: space-between !important; 1041 | } 1042 | .justify-content-md-around { 1043 | -ms-flex-pack: distribute !important; 1044 | justify-content: space-around !important; 1045 | } 1046 | .align-items-md-start { 1047 | -ms-flex-align: start !important; 1048 | align-items: flex-start !important; 1049 | } 1050 | .align-items-md-end { 1051 | -ms-flex-align: end !important; 1052 | align-items: flex-end !important; 1053 | } 1054 | .align-items-md-center { 1055 | -ms-flex-align: center !important; 1056 | align-items: center !important; 1057 | } 1058 | .align-items-md-baseline { 1059 | -ms-flex-align: baseline !important; 1060 | align-items: baseline !important; 1061 | } 1062 | .align-items-md-stretch { 1063 | -ms-flex-align: stretch !important; 1064 | align-items: stretch !important; 1065 | } 1066 | .align-content-md-start { 1067 | -ms-flex-line-pack: start !important; 1068 | align-content: flex-start !important; 1069 | } 1070 | .align-content-md-end { 1071 | -ms-flex-line-pack: end !important; 1072 | align-content: flex-end !important; 1073 | } 1074 | .align-content-md-center { 1075 | -ms-flex-line-pack: center !important; 1076 | align-content: center !important; 1077 | } 1078 | .align-content-md-between { 1079 | -ms-flex-line-pack: justify !important; 1080 | align-content: space-between !important; 1081 | } 1082 | .align-content-md-around { 1083 | -ms-flex-line-pack: distribute !important; 1084 | align-content: space-around !important; 1085 | } 1086 | .align-content-md-stretch { 1087 | -ms-flex-line-pack: stretch !important; 1088 | align-content: stretch !important; 1089 | } 1090 | .align-self-md-auto { 1091 | -ms-flex-item-align: auto !important; 1092 | align-self: auto !important; 1093 | } 1094 | .align-self-md-start { 1095 | -ms-flex-item-align: start !important; 1096 | align-self: flex-start !important; 1097 | } 1098 | .align-self-md-end { 1099 | -ms-flex-item-align: end !important; 1100 | align-self: flex-end !important; 1101 | } 1102 | .align-self-md-center { 1103 | -ms-flex-item-align: center !important; 1104 | align-self: center !important; 1105 | } 1106 | .align-self-md-baseline { 1107 | -ms-flex-item-align: baseline !important; 1108 | align-self: baseline !important; 1109 | } 1110 | .align-self-md-stretch { 1111 | -ms-flex-item-align: stretch !important; 1112 | align-self: stretch !important; 1113 | } 1114 | } 1115 | 1116 | @media (min-width: 992px) { 1117 | .flex-lg-row { 1118 | -ms-flex-direction: row !important; 1119 | flex-direction: row !important; 1120 | } 1121 | .flex-lg-column { 1122 | -ms-flex-direction: column !important; 1123 | flex-direction: column !important; 1124 | } 1125 | .flex-lg-row-reverse { 1126 | -ms-flex-direction: row-reverse !important; 1127 | flex-direction: row-reverse !important; 1128 | } 1129 | .flex-lg-column-reverse { 1130 | -ms-flex-direction: column-reverse !important; 1131 | flex-direction: column-reverse !important; 1132 | } 1133 | .flex-lg-wrap { 1134 | -ms-flex-wrap: wrap !important; 1135 | flex-wrap: wrap !important; 1136 | } 1137 | .flex-lg-nowrap { 1138 | -ms-flex-wrap: nowrap !important; 1139 | flex-wrap: nowrap !important; 1140 | } 1141 | .flex-lg-wrap-reverse { 1142 | -ms-flex-wrap: wrap-reverse !important; 1143 | flex-wrap: wrap-reverse !important; 1144 | } 1145 | .justify-content-lg-start { 1146 | -ms-flex-pack: start !important; 1147 | justify-content: flex-start !important; 1148 | } 1149 | .justify-content-lg-end { 1150 | -ms-flex-pack: end !important; 1151 | justify-content: flex-end !important; 1152 | } 1153 | .justify-content-lg-center { 1154 | -ms-flex-pack: center !important; 1155 | justify-content: center !important; 1156 | } 1157 | .justify-content-lg-between { 1158 | -ms-flex-pack: justify !important; 1159 | justify-content: space-between !important; 1160 | } 1161 | .justify-content-lg-around { 1162 | -ms-flex-pack: distribute !important; 1163 | justify-content: space-around !important; 1164 | } 1165 | .align-items-lg-start { 1166 | -ms-flex-align: start !important; 1167 | align-items: flex-start !important; 1168 | } 1169 | .align-items-lg-end { 1170 | -ms-flex-align: end !important; 1171 | align-items: flex-end !important; 1172 | } 1173 | .align-items-lg-center { 1174 | -ms-flex-align: center !important; 1175 | align-items: center !important; 1176 | } 1177 | .align-items-lg-baseline { 1178 | -ms-flex-align: baseline !important; 1179 | align-items: baseline !important; 1180 | } 1181 | .align-items-lg-stretch { 1182 | -ms-flex-align: stretch !important; 1183 | align-items: stretch !important; 1184 | } 1185 | .align-content-lg-start { 1186 | -ms-flex-line-pack: start !important; 1187 | align-content: flex-start !important; 1188 | } 1189 | .align-content-lg-end { 1190 | -ms-flex-line-pack: end !important; 1191 | align-content: flex-end !important; 1192 | } 1193 | .align-content-lg-center { 1194 | -ms-flex-line-pack: center !important; 1195 | align-content: center !important; 1196 | } 1197 | .align-content-lg-between { 1198 | -ms-flex-line-pack: justify !important; 1199 | align-content: space-between !important; 1200 | } 1201 | .align-content-lg-around { 1202 | -ms-flex-line-pack: distribute !important; 1203 | align-content: space-around !important; 1204 | } 1205 | .align-content-lg-stretch { 1206 | -ms-flex-line-pack: stretch !important; 1207 | align-content: stretch !important; 1208 | } 1209 | .align-self-lg-auto { 1210 | -ms-flex-item-align: auto !important; 1211 | align-self: auto !important; 1212 | } 1213 | .align-self-lg-start { 1214 | -ms-flex-item-align: start !important; 1215 | align-self: flex-start !important; 1216 | } 1217 | .align-self-lg-end { 1218 | -ms-flex-item-align: end !important; 1219 | align-self: flex-end !important; 1220 | } 1221 | .align-self-lg-center { 1222 | -ms-flex-item-align: center !important; 1223 | align-self: center !important; 1224 | } 1225 | .align-self-lg-baseline { 1226 | -ms-flex-item-align: baseline !important; 1227 | align-self: baseline !important; 1228 | } 1229 | .align-self-lg-stretch { 1230 | -ms-flex-item-align: stretch !important; 1231 | align-self: stretch !important; 1232 | } 1233 | } 1234 | 1235 | @media (min-width: 1200px) { 1236 | .flex-xl-row { 1237 | -ms-flex-direction: row !important; 1238 | flex-direction: row !important; 1239 | } 1240 | .flex-xl-column { 1241 | -ms-flex-direction: column !important; 1242 | flex-direction: column !important; 1243 | } 1244 | .flex-xl-row-reverse { 1245 | -ms-flex-direction: row-reverse !important; 1246 | flex-direction: row-reverse !important; 1247 | } 1248 | .flex-xl-column-reverse { 1249 | -ms-flex-direction: column-reverse !important; 1250 | flex-direction: column-reverse !important; 1251 | } 1252 | .flex-xl-wrap { 1253 | -ms-flex-wrap: wrap !important; 1254 | flex-wrap: wrap !important; 1255 | } 1256 | .flex-xl-nowrap { 1257 | -ms-flex-wrap: nowrap !important; 1258 | flex-wrap: nowrap !important; 1259 | } 1260 | .flex-xl-wrap-reverse { 1261 | -ms-flex-wrap: wrap-reverse !important; 1262 | flex-wrap: wrap-reverse !important; 1263 | } 1264 | .justify-content-xl-start { 1265 | -ms-flex-pack: start !important; 1266 | justify-content: flex-start !important; 1267 | } 1268 | .justify-content-xl-end { 1269 | -ms-flex-pack: end !important; 1270 | justify-content: flex-end !important; 1271 | } 1272 | .justify-content-xl-center { 1273 | -ms-flex-pack: center !important; 1274 | justify-content: center !important; 1275 | } 1276 | .justify-content-xl-between { 1277 | -ms-flex-pack: justify !important; 1278 | justify-content: space-between !important; 1279 | } 1280 | .justify-content-xl-around { 1281 | -ms-flex-pack: distribute !important; 1282 | justify-content: space-around !important; 1283 | } 1284 | .align-items-xl-start { 1285 | -ms-flex-align: start !important; 1286 | align-items: flex-start !important; 1287 | } 1288 | .align-items-xl-end { 1289 | -ms-flex-align: end !important; 1290 | align-items: flex-end !important; 1291 | } 1292 | .align-items-xl-center { 1293 | -ms-flex-align: center !important; 1294 | align-items: center !important; 1295 | } 1296 | .align-items-xl-baseline { 1297 | -ms-flex-align: baseline !important; 1298 | align-items: baseline !important; 1299 | } 1300 | .align-items-xl-stretch { 1301 | -ms-flex-align: stretch !important; 1302 | align-items: stretch !important; 1303 | } 1304 | .align-content-xl-start { 1305 | -ms-flex-line-pack: start !important; 1306 | align-content: flex-start !important; 1307 | } 1308 | .align-content-xl-end { 1309 | -ms-flex-line-pack: end !important; 1310 | align-content: flex-end !important; 1311 | } 1312 | .align-content-xl-center { 1313 | -ms-flex-line-pack: center !important; 1314 | align-content: center !important; 1315 | } 1316 | .align-content-xl-between { 1317 | -ms-flex-line-pack: justify !important; 1318 | align-content: space-between !important; 1319 | } 1320 | .align-content-xl-around { 1321 | -ms-flex-line-pack: distribute !important; 1322 | align-content: space-around !important; 1323 | } 1324 | .align-content-xl-stretch { 1325 | -ms-flex-line-pack: stretch !important; 1326 | align-content: stretch !important; 1327 | } 1328 | .align-self-xl-auto { 1329 | -ms-flex-item-align: auto !important; 1330 | align-self: auto !important; 1331 | } 1332 | .align-self-xl-start { 1333 | -ms-flex-item-align: start !important; 1334 | align-self: flex-start !important; 1335 | } 1336 | .align-self-xl-end { 1337 | -ms-flex-item-align: end !important; 1338 | align-self: flex-end !important; 1339 | } 1340 | .align-self-xl-center { 1341 | -ms-flex-item-align: center !important; 1342 | align-self: center !important; 1343 | } 1344 | .align-self-xl-baseline { 1345 | -ms-flex-item-align: baseline !important; 1346 | align-self: baseline !important; 1347 | } 1348 | .align-self-xl-stretch { 1349 | -ms-flex-item-align: stretch !important; 1350 | align-self: stretch !important; 1351 | } 1352 | } 1353 | /*# sourceMappingURL=bootstrap-grid.css.map */ --------------------------------------------------------------------------------