added api endpoint for displaying user in admin
This commit is contained in:
parent
85a8f41da0
commit
b6c4cb1575
@ -27,4 +27,9 @@ public class AdminController {
|
|||||||
model.addAttribute("userNames", userService.getAllRegularUsers());
|
model.addAttribute("userNames", userService.getAllRegularUsers());
|
||||||
return "admin/change-passphrase";
|
return "admin/change-passphrase";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/users")
|
||||||
|
public String usersPage() {
|
||||||
|
return "admin/users";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,10 @@ import java.util.List;
|
|||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
|
||||||
|
import org.ros.chatto.dto.AdminUserDTO;
|
||||||
import org.ros.chatto.dto.ChatMessageDTO;
|
import org.ros.chatto.dto.ChatMessageDTO;
|
||||||
import org.ros.chatto.dto.ReencryptionDTO;
|
import org.ros.chatto.dto.ReencryptionDTO;
|
||||||
|
import org.ros.chatto.service.AdminService;
|
||||||
import org.ros.chatto.service.ChatService;
|
import org.ros.chatto.service.ChatService;
|
||||||
import org.ros.chatto.service.UserService;
|
import org.ros.chatto.service.UserService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -21,14 +23,17 @@ import org.springframework.web.bind.annotation.RequestBody;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/admin")
|
@RequestMapping("/api/admin")
|
||||||
|
@RequiredArgsConstructor
|
||||||
public class AdminRESTController {
|
public class AdminRESTController {
|
||||||
@Autowired
|
private final ChatService chatService;
|
||||||
private ChatService chatService;
|
|
||||||
|
|
||||||
@Autowired
|
private final UserService userService;
|
||||||
private UserService userService;
|
|
||||||
|
private final AdminService adminService;
|
||||||
|
|
||||||
@PostMapping(value = "/post/re-encrypt", consumes = { "application/json" })
|
@PostMapping(value = "/post/re-encrypt", consumes = { "application/json" })
|
||||||
public ResponseEntity<ReencryptionDTO> reencryptMessages(
|
public ResponseEntity<ReencryptionDTO> reencryptMessages(
|
||||||
@ -62,7 +67,7 @@ public class AdminRESTController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/get/users")
|
@GetMapping("/get/users")
|
||||||
public List<String> getAllOtherUsers(Principal principal) {
|
public List<AdminUserDTO> getAllOtherUsers(Principal principal) {
|
||||||
return userService.findAllOtherUsers(principal.getName());
|
return adminService.getOtherUsers(principal.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
17
src/main/java/org/ros/chatto/dto/AdminUserDTO.java
Normal file
17
src/main/java/org/ros/chatto/dto/AdminUserDTO.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package org.ros.chatto.dto;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class AdminUserDTO {
|
||||||
|
private int id;
|
||||||
|
private String userName;
|
||||||
|
private String role;
|
||||||
|
private Instant joinDate;
|
||||||
|
}
|
@ -3,6 +3,7 @@ package org.ros.chatto.repository;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import org.ros.chatto.dto.AdminUserDTO;
|
||||||
import org.ros.chatto.model.ChatUser;
|
import org.ros.chatto.model.ChatUser;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
@ -18,4 +19,8 @@ public interface UserRepository extends JpaRepository<ChatUser, Long> {
|
|||||||
|
|
||||||
@Query("select count(u) from ChatUser u")
|
@Query("select count(u) from ChatUser u")
|
||||||
public Long totalUsers();
|
public Long totalUsers();
|
||||||
|
|
||||||
|
@Query("select new org.ros.chatto.dto.AdminUserDTO(u.userID, u.userName, ur.role.name, u.joinDate )"
|
||||||
|
+ " from ChatUser u join u.userRoles ur ")
|
||||||
|
public List<AdminUserDTO> getOtherUsers(String principal);
|
||||||
}
|
}
|
||||||
|
20
src/main/java/org/ros/chatto/service/AdminService.java
Normal file
20
src/main/java/org/ros/chatto/service/AdminService.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package org.ros.chatto.service;
|
||||||
|
|
||||||
|
import java.security.Principal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.ros.chatto.dto.AdminUserDTO;
|
||||||
|
import org.ros.chatto.repository.UserRepository;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class AdminService {
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
|
||||||
|
public List<AdminUserDTO> getOtherUsers(String principal) {
|
||||||
|
return userRepository.getOtherUsers(principal);
|
||||||
|
}
|
||||||
|
}
|
213
src/main/resources/templates/admin/users.html
Normal file
213
src/main/resources/templates/admin/users.html
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<div th:replace="fragments/head :: headFragment">
|
||||||
|
<title id="pageTitle">Users</title>
|
||||||
|
</div>
|
||||||
|
<script src="https://code.jquery.com/jquery-2.1.4.min.js" th:if="false"></script>
|
||||||
|
<script src="http://blackpeppersoftware.github.io/thymeleaf-fragment.js/thymeleaf-fragment.js"
|
||||||
|
data-template-prefix="../" defer="defer" th:if="false"></script>
|
||||||
|
|
||||||
|
<th:block th:include="fragments/admin :: headFragment"></th:block>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.sidebar {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<!-- TODO
|
||||||
|
Make user admin / remove user from admin
|
||||||
|
Change E2E passphrase
|
||||||
|
Delete Messages
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- <div th:include="fragments/admin :: admin-sidebar"></div> -->
|
||||||
|
|
||||||
|
<body id="page-top">
|
||||||
|
|
||||||
|
<!-- Page Wrapper -->
|
||||||
|
<div id="wrapper">
|
||||||
|
|
||||||
|
|
||||||
|
<div th:include="fragments/admin :: sidebar-fragment"></div>
|
||||||
|
|
||||||
|
<!-- Content Wrapper -->
|
||||||
|
<div id="content-wrapper" class="d-flex flex-column" style="background-color: #333;">
|
||||||
|
|
||||||
|
<!-- Main Content -->
|
||||||
|
<div id="content">
|
||||||
|
|
||||||
|
<div th:include="fragments/admin :: topbar-fragment"></div>
|
||||||
|
|
||||||
|
<!-- Begin Page Content -->
|
||||||
|
<div class="container-fluid">
|
||||||
|
|
||||||
|
<!-- Page Heading -->
|
||||||
|
|
||||||
|
<!-- Content Row -->
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div class="col-lg-10 offset-lg-1">
|
||||||
|
|
||||||
|
<!-- Approach -->
|
||||||
|
<div class="card bg-dark border border-dark text-white shadow mb-4">
|
||||||
|
<div class="card-header bg-secondary border border-secondary py-3">
|
||||||
|
<h6 class="m-0 font-weight-bold text-white">Users</h6>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table data-toggle="table" class="text-white">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>User ID</th>
|
||||||
|
<th>User Name</th>
|
||||||
|
<th>Role</th>
|
||||||
|
<th>Registration Date</th>
|
||||||
|
<th>Action</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>1</td>
|
||||||
|
<td>Item 1</td>
|
||||||
|
<td>$1</td>
|
||||||
|
<td></td>
|
||||||
|
<td><button class="btn btn-info"><i
|
||||||
|
class="fas fa-ellipsis-h"></i></button></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2</td>
|
||||||
|
<td>Item 2</td>
|
||||||
|
<td>$2</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- /.container-fluid -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- End of Main Content -->
|
||||||
|
|
||||||
|
<div th:include="fragments/admin :: footer"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- End of Content Wrapper -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- End of Page Wrapper -->
|
||||||
|
|
||||||
|
<th:block th:include="fragments/admin :: modal"></th:block>
|
||||||
|
<div th:if="false">
|
||||||
|
<th:block th:include="admin :: modal"></th:block>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template id="users-table-template">
|
||||||
|
<tr>
|
||||||
|
<td>{{id}}</td>
|
||||||
|
<td>{{userName}}</td>
|
||||||
|
<td>{{role}}</td>
|
||||||
|
<td>{{joinDate}}</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -7,21 +7,43 @@
|
|||||||
<title id="pageTitle">Navbar Fragment</title>
|
<title id="pageTitle">Navbar Fragment</title>
|
||||||
</div> -->
|
</div> -->
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" th:if="false"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" th:if="false"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.bundle.js" th:if="false"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.bundle.js"
|
||||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css" th:if="false" rel="stylesheet" type="text/css">
|
th:if="false"></script>
|
||||||
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css" th:if="false"
|
||||||
|
rel="stylesheet" type="text/css">
|
||||||
<script src="https://code.jquery.com/jquery-2.1.4.min.js" th:if="false"></script>
|
<script src="https://code.jquery.com/jquery-2.1.4.min.js" th:if="false"></script>
|
||||||
<script src="http://blackpeppersoftware.github.io/thymeleaf-fragment.js/thymeleaf-fragment.js" defer="defer" th:if="false"></script>
|
<script src="http://blackpeppersoftware.github.io/thymeleaf-fragment.js/thymeleaf-fragment.js" defer="defer"
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css" th:if="false">
|
th:if="false"></script>
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css"
|
||||||
|
th:if="false">
|
||||||
|
|
||||||
<th:block th:fragment="headFragment">
|
<th:block th:fragment="headFragment">
|
||||||
<script th:src="@{/js/adminBundle.js}" src="../../static/js/adminBundle.js" defer="defer"></script>
|
<script th:src="@{/js/adminBundle.js}" src="../../static/js/adminBundle.js" defer="defer"></script>
|
||||||
<script th:src="@{/js/admin.js}" src="../../static/js/admin.js" defer="defer"></script>
|
<script th:src="@{/js/admin.js}" src="../../static/js/admin.js" defer="defer"></script>
|
||||||
<script th:src="@{/js/sb-admin-2.js}" src="../../static/js/sb-admin-2.js" defer="defer"></script>
|
<script th:src="@{/js/sb-admin-2.js}" src="../../static/js/sb-admin-2.js" defer="defer"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.js" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.js" defer></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.js" defer></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.js" defer></script>
|
||||||
|
|
||||||
<link th:href="@{/css/sb-admin-2.css}" href="../../static/css/sb-admin-2.css" rel="stylesheet">
|
<script src="https://code.jquery.com/jquery-3.3.1.min.js"
|
||||||
<link th:href="@{/css/admin-custom.css}" href="../../static/css/admin-custom.css" rel="stylesheet">
|
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous" defer></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
|
||||||
|
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"
|
||||||
|
defer></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
|
||||||
|
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"
|
||||||
|
defer></script>
|
||||||
|
<script src="https://unpkg.com/bootstrap-table@1.17.1/dist/bootstrap-table.min.js" defer></script>
|
||||||
|
|
||||||
|
|
||||||
|
<link href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" rel="stylesheet">
|
||||||
|
<link href="http://fonts.googleapis.com/css?family=Roboto:400,700,300" rel="stylesheet" type="text/css">
|
||||||
|
<link th:href="@{/css/sb-admin-2.css}" href="../../static/css/sb-admin-2.css" rel="stylesheet">
|
||||||
|
<link th:href="@{/css/admin-custom.css}" href="../../static/css/admin-custom.css" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
|
||||||
|
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css"
|
||||||
|
integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/bootstrap-table@1.17.1/dist/bootstrap-table.min.css">
|
||||||
</th:block>
|
</th:block>
|
||||||
|
|
||||||
|
|
||||||
@ -40,7 +62,8 @@
|
|||||||
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar">
|
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar">
|
||||||
|
|
||||||
<!-- Sidebar - Brand -->
|
<!-- Sidebar - Brand -->
|
||||||
<a class="sidebar-brand d-flex align-items-center justify-content-center" th:href="@{/admin}" href="../admin/home.html">
|
<a class="sidebar-brand d-flex align-items-center justify-content-center" th:href="@{/admin}"
|
||||||
|
href="../admin/home.html">
|
||||||
<div class="sidebar-brand-icon rotate-n-15">
|
<div class="sidebar-brand-icon rotate-n-15">
|
||||||
<i class="fas fa-laugh-wink"></i>
|
<i class="fas fa-laugh-wink"></i>
|
||||||
</div>
|
</div>
|
||||||
@ -67,15 +90,17 @@
|
|||||||
|
|
||||||
<!-- Nav Item - Pages Collapse Menu -->
|
<!-- Nav Item - Pages Collapse Menu -->
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseTwo">
|
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseOne"
|
||||||
|
aria-expanded="true" aria-controls="collapseTwo">
|
||||||
<i class="fas fa-fw fa-cog"></i>
|
<i class="fas fa-fw fa-cog"></i>
|
||||||
<span>Users</span>
|
<span>Users</span>
|
||||||
</a>
|
</a>
|
||||||
<div id="collapseOne" class="collapse" aria-labelledby="headingTwo" data-parent="#accordionSidebar">
|
<div id="collapseOne" class="collapse" aria-labelledby="headingTwo" data-parent="#accordionSidebar">
|
||||||
<div class="bg-dark py-2 collapse-inner rounded">
|
<div class="bg-dark py-2 collapse-inner rounded">
|
||||||
<h6 class="collapse-header">Settings:</h6>
|
<h6 class="collapse-header">Settings:</h6>
|
||||||
<a class="collapse-item" th:href="@{/admin/change-passphrase}" href="../admin/change-passphrase.html">Change Passphrase</a>
|
<a class="collapse-item" th:href="@{/admin/change-passphrase}"
|
||||||
<a class="collapse-item" href="cards.html">Cards</a>
|
href="../admin/change-passphrase.html">Change Passphrase</a>
|
||||||
|
<a class="collapse-item" th:href="@{/admin/users}">View users</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@ -91,7 +116,8 @@
|
|||||||
|
|
||||||
<!-- Nav Item - Pages Collapse Menu -->
|
<!-- Nav Item - Pages Collapse Menu -->
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="true" aria-controls="collapseTwo">
|
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseTwo"
|
||||||
|
aria-expanded="true" aria-controls="collapseTwo">
|
||||||
<i class="fas fa-fw fa-cog"></i>
|
<i class="fas fa-fw fa-cog"></i>
|
||||||
<span>Components</span>
|
<span>Components</span>
|
||||||
</a>
|
</a>
|
||||||
@ -106,11 +132,13 @@
|
|||||||
|
|
||||||
<!-- Nav Item - Utilities Collapse Menu -->
|
<!-- Nav Item - Utilities Collapse Menu -->
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseUtilities" aria-expanded="true" aria-controls="collapseUtilities">
|
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseUtilities"
|
||||||
|
aria-expanded="true" aria-controls="collapseUtilities">
|
||||||
<i class="fas fa-fw fa-wrench"></i>
|
<i class="fas fa-fw fa-wrench"></i>
|
||||||
<span>Utilities</span>
|
<span>Utilities</span>
|
||||||
</a>
|
</a>
|
||||||
<div id="collapseUtilities" class="collapse" aria-labelledby="headingUtilities" data-parent="#accordionSidebar">
|
<div id="collapseUtilities" class="collapse" aria-labelledby="headingUtilities"
|
||||||
|
data-parent="#accordionSidebar">
|
||||||
<div class="bg-dark py-2 collapse-inner rounded">
|
<div class="bg-dark py-2 collapse-inner rounded">
|
||||||
<h6 class="collapse-header">Custom Utilities:</h6>
|
<h6 class="collapse-header">Custom Utilities:</h6>
|
||||||
<a class="collapse-item" href="utilities-color.html">Colors</a>
|
<a class="collapse-item" href="utilities-color.html">Colors</a>
|
||||||
@ -131,11 +159,13 @@
|
|||||||
|
|
||||||
<!-- Nav Item - Pages Collapse Menu -->
|
<!-- Nav Item - Pages Collapse Menu -->
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapsePages" aria-expanded="true" aria-controls="collapsePages">
|
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapsePages"
|
||||||
|
aria-expanded="true" aria-controls="collapsePages">
|
||||||
<i class="fas fa-fw fa-folder"></i>
|
<i class="fas fa-fw fa-folder"></i>
|
||||||
<span>Pages</span>
|
<span>Pages</span>
|
||||||
</a>
|
</a>
|
||||||
<div id="collapsePages" class="collapse" aria-labelledby="headingPages" data-parent="#accordionSidebar">
|
<div id="collapsePages" class="collapse" aria-labelledby="headingPages"
|
||||||
|
data-parent="#accordionSidebar">
|
||||||
<div class="bg-dark py-2 collapse-inner rounded">
|
<div class="bg-dark py-2 collapse-inner rounded">
|
||||||
<h6 class="collapse-header">Login Screens:</h6>
|
<h6 class="collapse-header">Login Screens:</h6>
|
||||||
<a class="collapse-item" href="login.html">Login</a>
|
<a class="collapse-item" href="login.html">Login</a>
|
||||||
@ -187,17 +217,19 @@
|
|||||||
|
|
||||||
<!-- Sidebar Toggle (Topbar) -->
|
<!-- Sidebar Toggle (Topbar) -->
|
||||||
<button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3">
|
<button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3">
|
||||||
<i class="fa fa-bars"></i>
|
<i class="fa fa-bars"></i>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Topbar Search -->
|
<!-- Topbar Search -->
|
||||||
<form class="d-none d-sm-inline-block form-inline mr-auto ml-md-3 my-2 my-md-0 mw-100 navbar-search">
|
<form
|
||||||
|
class="d-none d-sm-inline-block form-inline mr-auto ml-md-3 my-2 my-md-0 mw-100 navbar-search">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" class="form-control bg-light border-0 small" placeholder="Search for..." aria-label="Search" aria-describedby="basic-addon2">
|
<input type="text" class="form-control bg-light border-0 small"
|
||||||
|
placeholder="Search for..." aria-label="Search" aria-describedby="basic-addon2">
|
||||||
<div class="input-group-append">
|
<div class="input-group-append">
|
||||||
<button class="btn btn-primary" type="button">
|
<button class="btn btn-primary" type="button">
|
||||||
<i class="fas fa-search fa-sm"></i>
|
<i class="fas fa-search fa-sm"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -208,18 +240,22 @@
|
|||||||
|
|
||||||
<!-- Nav Item - Search Dropdown (Visible Only XS) -->
|
<!-- Nav Item - Search Dropdown (Visible Only XS) -->
|
||||||
<li class="nav-item dropdown no-arrow d-sm-none">
|
<li class="nav-item dropdown no-arrow d-sm-none">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="searchDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<a class="nav-link dropdown-toggle" href="#" id="searchDropdown" role="button"
|
||||||
|
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<i class="fas fa-search fa-fw"></i>
|
<i class="fas fa-search fa-fw"></i>
|
||||||
</a>
|
</a>
|
||||||
<!-- Dropdown - Messages -->
|
<!-- Dropdown - Messages -->
|
||||||
<div class="dropdown-menu dropdown-menu-right p-3 shadow animated--grow-in" aria-labelledby="searchDropdown">
|
<div class="dropdown-menu dropdown-menu-right p-3 shadow animated--grow-in"
|
||||||
|
aria-labelledby="searchDropdown">
|
||||||
<form class="form-inline mr-auto w-100 navbar-search">
|
<form class="form-inline mr-auto w-100 navbar-search">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" class="form-control bg-light border-0 small" placeholder="Search for..." aria-label="Search" aria-describedby="basic-addon2">
|
<input type="text" class="form-control bg-light border-0 small"
|
||||||
|
placeholder="Search for..." aria-label="Search"
|
||||||
|
aria-describedby="basic-addon2">
|
||||||
<div class="input-group-append">
|
<div class="input-group-append">
|
||||||
<button class="btn btn-primary" type="button">
|
<button class="btn btn-primary" type="button">
|
||||||
<i class="fas fa-search fa-sm"></i>
|
<i class="fas fa-search fa-sm"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -234,13 +270,15 @@
|
|||||||
|
|
||||||
<!-- Nav Item - Alerts -->
|
<!-- Nav Item - Alerts -->
|
||||||
<li class="nav-item dropdown no-arrow mx-1">
|
<li class="nav-item dropdown no-arrow mx-1">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="alertsDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<a class="nav-link dropdown-toggle" href="#" id="alertsDropdown" role="button"
|
||||||
|
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<i class="fas fa-bell fa-fw"></i>
|
<i class="fas fa-bell fa-fw"></i>
|
||||||
<!-- Counter - Alerts -->
|
<!-- Counter - Alerts -->
|
||||||
<span class="badge badge-danger badge-counter">3+</span>
|
<span class="badge badge-danger badge-counter">3+</span>
|
||||||
</a>
|
</a>
|
||||||
<!-- Dropdown - Alerts -->
|
<!-- Dropdown - Alerts -->
|
||||||
<div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby="alertsDropdown">
|
<div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in"
|
||||||
|
aria-labelledby="alertsDropdown">
|
||||||
<h6 class="dropdown-header">
|
<h6 class="dropdown-header">
|
||||||
Alerts Center
|
Alerts Center
|
||||||
</h6>
|
</h6>
|
||||||
@ -252,7 +290,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="small text-gray-500">December 12, 2019</div>
|
<div class="small text-gray-500">December 12, 2019</div>
|
||||||
<span class="font-weight-bold">A new monthly report is ready to download!</span>
|
<span class="font-weight-bold">A new monthly report is ready to
|
||||||
|
download!</span>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a class="dropdown-item d-flex align-items-center" href="#">
|
<a class="dropdown-item d-flex align-items-center" href="#">
|
||||||
@ -277,63 +316,76 @@
|
|||||||
Spending Alert: We've noticed unusually high spending for your account.
|
Spending Alert: We've noticed unusually high spending for your account.
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a class="dropdown-item text-center small text-gray-500" href="#">Show All Alerts</a>
|
<a class="dropdown-item text-center small text-gray-500" href="#">Show All
|
||||||
|
Alerts</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!-- Nav Item - Messages -->
|
<!-- Nav Item - Messages -->
|
||||||
<li class="nav-item dropdown no-arrow mx-1">
|
<li class="nav-item dropdown no-arrow mx-1">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="messagesDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<a class="nav-link dropdown-toggle" href="#" id="messagesDropdown" role="button"
|
||||||
|
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<i class="fas fa-envelope fa-fw"></i>
|
<i class="fas fa-envelope fa-fw"></i>
|
||||||
<!-- Counter - Messages -->
|
<!-- Counter - Messages -->
|
||||||
<span class="badge badge-danger badge-counter">7</span>
|
<span class="badge badge-danger badge-counter">7</span>
|
||||||
</a>
|
</a>
|
||||||
<!-- Dropdown - Messages -->
|
<!-- Dropdown - Messages -->
|
||||||
<div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby="messagesDropdown">
|
<div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in"
|
||||||
|
aria-labelledby="messagesDropdown">
|
||||||
<h6 class="dropdown-header">
|
<h6 class="dropdown-header">
|
||||||
Message Center
|
Message Center
|
||||||
</h6>
|
</h6>
|
||||||
<a class="dropdown-item d-flex align-items-center" href="#">
|
<a class="dropdown-item d-flex align-items-center" href="#">
|
||||||
<div class="dropdown-list-image mr-3">
|
<div class="dropdown-list-image mr-3">
|
||||||
<img class="rounded-circle" src="https://source.unsplash.com/fn_BT9fwg_E/60x60" alt="">
|
<img class="rounded-circle"
|
||||||
|
src="https://source.unsplash.com/fn_BT9fwg_E/60x60" alt="">
|
||||||
<div class="status-indicator bg-success"></div>
|
<div class="status-indicator bg-success"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="font-weight-bold">
|
<div class="font-weight-bold">
|
||||||
<div class="text-truncate">Hi there! I am wondering if you can help me with a problem I've been having.</div>
|
<div class="text-truncate">Hi there! I am wondering if you can help me with
|
||||||
|
a problem I've been having.</div>
|
||||||
<div class="small text-gray-500">Emily Fowler · 58m</div>
|
<div class="small text-gray-500">Emily Fowler · 58m</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a class="dropdown-item d-flex align-items-center" href="#">
|
<a class="dropdown-item d-flex align-items-center" href="#">
|
||||||
<div class="dropdown-list-image mr-3">
|
<div class="dropdown-list-image mr-3">
|
||||||
<img class="rounded-circle" src="https://source.unsplash.com/AU4VPcFN4LE/60x60" alt="">
|
<img class="rounded-circle"
|
||||||
|
src="https://source.unsplash.com/AU4VPcFN4LE/60x60" alt="">
|
||||||
<div class="status-indicator"></div>
|
<div class="status-indicator"></div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="text-truncate">I have the photos that you ordered last month, how would you like them sent to you?</div>
|
<div class="text-truncate">I have the photos that you ordered last month,
|
||||||
|
how would you like them sent to you?</div>
|
||||||
<div class="small text-gray-500">Jae Chun · 1d</div>
|
<div class="small text-gray-500">Jae Chun · 1d</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a class="dropdown-item d-flex align-items-center" href="#">
|
<a class="dropdown-item d-flex align-items-center" href="#">
|
||||||
<div class="dropdown-list-image mr-3">
|
<div class="dropdown-list-image mr-3">
|
||||||
<img class="rounded-circle" src="https://source.unsplash.com/CS2uCrpNzJY/60x60" alt="">
|
<img class="rounded-circle"
|
||||||
|
src="https://source.unsplash.com/CS2uCrpNzJY/60x60" alt="">
|
||||||
<div class="status-indicator bg-warning"></div>
|
<div class="status-indicator bg-warning"></div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="text-truncate">Last month's report looks great, I am very happy with the progress so far, keep up the good work!</div>
|
<div class="text-truncate">Last month's report looks great, I am very happy
|
||||||
|
with the progress so far, keep up the good work!</div>
|
||||||
<div class="small text-gray-500">Morgan Alvarez · 2d</div>
|
<div class="small text-gray-500">Morgan Alvarez · 2d</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a class="dropdown-item d-flex align-items-center" href="#">
|
<a class="dropdown-item d-flex align-items-center" href="#">
|
||||||
<div class="dropdown-list-image mr-3">
|
<div class="dropdown-list-image mr-3">
|
||||||
<img class="rounded-circle" src="https://source.unsplash.com/Mv9hjnEUHR4/60x60" alt="">
|
<img class="rounded-circle"
|
||||||
|
src="https://source.unsplash.com/Mv9hjnEUHR4/60x60" alt="">
|
||||||
<div class="status-indicator bg-success"></div>
|
<div class="status-indicator bg-success"></div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="text-truncate">Am I a good boy? The reason I ask is because someone told me that people say this to all dogs, even if they aren't good...</div>
|
<div class="text-truncate">Am I a good boy? The reason I ask is because
|
||||||
|
someone told me that people say this to all dogs, even if they aren't
|
||||||
|
good...</div>
|
||||||
<div class="small text-gray-500">Chicken the Dog · 2w</div>
|
<div class="small text-gray-500">Chicken the Dog · 2w</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a class="dropdown-item text-center small text-gray-500" href="#">Read More Messages</a>
|
<a class="dropdown-item text-center small text-gray-500" href="#">Read More
|
||||||
|
Messages</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@ -341,7 +393,8 @@
|
|||||||
|
|
||||||
<!-- Nav Item - User Information -->
|
<!-- Nav Item - User Information -->
|
||||||
<li class="nav-item dropdown no-arrow">
|
<li class="nav-item dropdown no-arrow">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button"
|
||||||
|
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<span class="mr-2 d-none d-lg-inline text-white small" th:text="${#authentication.name}">Valerie Luna</span>
|
<span class="mr-2 d-none d-lg-inline text-white small" th:text="${#authentication.name}">Valerie Luna</span>
|
||||||
<img class="img-profile rounded-circle" src="https://source.unsplash.com/QAB-WJcbgJk/60x60">
|
<img class="img-profile rounded-circle" src="https://source.unsplash.com/QAB-WJcbgJk/60x60">
|
||||||
</a>
|
</a>
|
||||||
|
Loading…
Reference in New Issue
Block a user