Merge branch '46-mvc' into 'master'
Resolve "Перевести на MVC контроллеры" Closes #46 See merge request romanov73/ng-tracker!22merge-requests/23/head
commit
503f7f68bc
@ -0,0 +1,64 @@
|
|||||||
|
package ru.ulstu.paper.controller;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PutMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import ru.ulstu.configuration.Constants;
|
||||||
|
import ru.ulstu.core.model.response.Response;
|
||||||
|
import ru.ulstu.paper.model.PaperDto;
|
||||||
|
import ru.ulstu.paper.model.PaperFilterDto;
|
||||||
|
import ru.ulstu.paper.service.PaperService;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static ru.ulstu.paper.controller.PaperRestController.URL;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(URL)
|
||||||
|
public class PaperRestController {
|
||||||
|
public static final String URL = Constants.API_1_0 + "papers";
|
||||||
|
|
||||||
|
private final PaperService paperService;
|
||||||
|
|
||||||
|
public PaperRestController(PaperService paperService) {
|
||||||
|
this.paperService = paperService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public Response<List<PaperDto>> getPapers() {
|
||||||
|
return new Response<>(paperService.findAllDto());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/{paper-id}")
|
||||||
|
public Response<PaperDto> getPaper(@PathVariable("paper-id") Integer paperId){
|
||||||
|
return new Response(paperService.findById(paperId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping
|
||||||
|
public Response<Integer> createPaper(@RequestBody @Valid PaperDto paperDto) throws IOException {
|
||||||
|
return new Response<>(paperService.create(paperDto));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping
|
||||||
|
public Response<Integer> updatePaper(@RequestBody @Valid PaperDto paperDto) throws IOException {
|
||||||
|
return new Response<>(paperService.update(paperDto));
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/{paper-id}")
|
||||||
|
public Response<Boolean> delete(@PathVariable("paper-id") Integer paperId) throws IOException {
|
||||||
|
paperService.delete(paperId);
|
||||||
|
return new Response<>(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/filter")
|
||||||
|
public Response<List<PaperDto>> filter(@RequestBody @Valid PaperFilterDto paperFilterDto) throws IOException {
|
||||||
|
return new Response<>(paperService.filter(paperFilterDto));
|
||||||
|
}
|
||||||
|
}
|
@ -1,24 +1,42 @@
|
|||||||
package ru.ulstu.paper.model;
|
package ru.ulstu.paper.model;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
import java.util.List;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
||||||
|
|
||||||
public class PaperFilterDto {
|
public class PaperFilterDto {
|
||||||
private final Integer authorId;
|
private List<PaperDto> papers;
|
||||||
private final Integer year;
|
private Integer filterAuthorId;
|
||||||
|
private Integer year;
|
||||||
|
|
||||||
@JsonCreator
|
public PaperFilterDto() {
|
||||||
public PaperFilterDto(@JsonProperty("authorId") Integer authorId,
|
}
|
||||||
@JsonProperty("year") Integer year) {
|
|
||||||
this.authorId = authorId;
|
public PaperFilterDto(List<PaperDto> paperDtos, Integer filterAuthorId, Integer year) {
|
||||||
|
this.papers = paperDtos;
|
||||||
|
this.filterAuthorId = filterAuthorId;
|
||||||
this.year = year;
|
this.year = year;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getAuthorId() {
|
public List<PaperDto> getPapers() {
|
||||||
return authorId;
|
return papers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPapers(List<PaperDto> papers) {
|
||||||
|
this.papers = papers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getFilterAuthorId() {
|
||||||
|
return filterAuthorId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilterAuthorId(Integer filterAuthorId) {
|
||||||
|
this.filterAuthorId = filterAuthorId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getYear() {
|
public Integer getYear() {
|
||||||
return year;
|
return year;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setYear(Integer year) {
|
||||||
|
this.year = year;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
package ru.ulstu.paper.model;
|
|
||||||
|
|
||||||
public class PaperStatusDto {
|
|
||||||
private final String id;
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
public PaperStatusDto(Paper.PaperStatus status) {
|
|
||||||
this.id = status.name();
|
|
||||||
this.name = status.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,144 +1,42 @@
|
|||||||
var urlPapers = "/api/1.0/papers";
|
/*<![CDATA[*/
|
||||||
var urlPaperStatuses = "/api/1.0/papers/statuses";
|
$(document).ready(function () {
|
||||||
var urlDeletePaper = "/api/1.0/papers/";
|
$(".paper-row").mouseenter(function (event) {
|
||||||
var urlFilterPaper = "/api/1.0/papers/filter"
|
var paperRow = $(event.target).closest(".paper-row");
|
||||||
|
|
||||||
function showPapers(papersElement, paperRowClass) {
|
|
||||||
getFromRest(urlPapers, function (paperList) {
|
|
||||||
paperList.forEach(function (paper, index) {
|
|
||||||
$(papersElement).parent().append("<div class='row text-left paper-row'>" +
|
|
||||||
" <div class='col'>" +
|
|
||||||
" <span class='fa-stack fa-1x'>\n" +
|
|
||||||
" <i class='fa fa-circle fa-stack-2x " + getPaperStatusClass(paper.status) + "'></i>" +
|
|
||||||
" <i class='fa fa-file-text-o fa-stack-1x fa-inverse'></i>" +
|
|
||||||
" </span>" +
|
|
||||||
" <a href='paper?id=" + paper.id + "" +
|
|
||||||
"'><span>" + (index + 1) + ". " + paper.title + "</span></a>" +
|
|
||||||
"<span class='remove-paper d-none pull-right' onclick=\"deletePaper(" + paper.id + ",'" + papersElement + "', '" + paperRowClass + "')\">" +
|
|
||||||
"<i class=\"fa fa-trash\" aria-hidden=\"true\"></i></span>" +
|
|
||||||
"</div></div>");
|
|
||||||
});
|
|
||||||
|
|
||||||
$(paperRowClass).mouseenter(function (event) {
|
|
||||||
var paperRow = $(event.target).closest(paperRowClass);
|
|
||||||
$(paperRow).css("background-color", "#f8f9fa");
|
|
||||||
$(paperRow).find(".remove-paper").removeClass("d-none");
|
|
||||||
|
|
||||||
});
|
|
||||||
$(paperRowClass).mouseleave(function (event) {
|
|
||||||
var paperRow = $(event.target).closest(paperRowClass);
|
|
||||||
$(paperRow).css("background-color", "white");
|
|
||||||
$(paperRow).closest(paperRowClass).find(".remove-paper").addClass("d-none");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterPapers(papersElement, paperRowClass, authorId, year) {
|
|
||||||
var paperData = JSON.stringify({
|
|
||||||
"authorId": authorId,
|
|
||||||
"year": year
|
|
||||||
});
|
|
||||||
postToRest(urlFilterPaper, paperData, function (data) {
|
|
||||||
$(paperRowClass).remove();
|
|
||||||
if(data.length > 0){
|
|
||||||
data.forEach(function (paper, index) {
|
|
||||||
$(papersElement).parent().append("<div class='row text-left paper-row'>" +
|
|
||||||
" <div class='col-md-11'>" +
|
|
||||||
" <span class='fa-stack fa-1x'>\n" +
|
|
||||||
" <i class='fa fa-circle fa-stack-2x " + getPaperStatusClass(paper.status) + "'></i>" +
|
|
||||||
" <i class='fa fa-file-text-o fa-stack-1x fa-inverse'></i>" +
|
|
||||||
" </span>" +
|
|
||||||
" <a href='paper?id=" + paper.id + "" +
|
|
||||||
"'><span>" + paper.title + "</span></a></div>" +
|
|
||||||
"<div class='col-md-1'>" +
|
|
||||||
"<span class='remove-paper d-none' onclick=\"deletePaper(" + paper.id + ",'" + papersElement + "', '" + paperRowClass + "')\">" +
|
|
||||||
"<i class=\"fa fa-trash\" aria-hidden=\"true\"></i></span>" +
|
|
||||||
" </div></div>");
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
$(paperRowClass).mouseenter(function (event) {
|
|
||||||
var paperRow = $(event.target).closest(paperRowClass);
|
|
||||||
$(paperRow).css("background-color", "#f8f9fa");
|
$(paperRow).css("background-color", "#f8f9fa");
|
||||||
$(paperRow).find(".remove-paper").removeClass("d-none");
|
$(paperRow).find(".remove-paper").removeClass("d-none");
|
||||||
|
|
||||||
});
|
});
|
||||||
$(paperRowClass).mouseleave(function (event) {
|
$(".paper-row").mouseleave(function (event) {
|
||||||
var paperRow = $(event.target).closest(paperRowClass);
|
var paperRow = $(event.target).closest(".paper-row");
|
||||||
$(paperRow).css("background-color", "white");
|
$(paperRow).css("background-color", "white");
|
||||||
$(paperRow).closest(paperRowClass).find(".remove-paper").addClass("d-none");
|
$(paperRow).closest(".paper-row").find(".remove-paper").addClass("d-none");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('a[data-confirm]').click(function(ev) {
|
||||||
|
var href = $(this).attr('href');
|
||||||
|
if (!$('#dataConfirmModal').length) {
|
||||||
|
$('#modalDelete').append('<div class="modal fade" id="dataConfirmModal" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true"\n' +
|
||||||
|
' >\n' +
|
||||||
|
' <div class="modal-dialog modal-sm">\n' +
|
||||||
|
' <div class="modal-content">\n' +
|
||||||
|
' <div class="modal-header">\n' +
|
||||||
|
' <h8 class="modal-title" id="myModalLabel">Удалить статью?</h8>\n' +
|
||||||
|
' <button type="button" class="close" data-dismiss="modal" aria-label="Закрыть"><span\n' +
|
||||||
|
' aria-hidden="true">×</span></button>\n' +
|
||||||
|
' </div>\n' +
|
||||||
|
|
||||||
|
' <div class="modal-footer">\n' +
|
||||||
|
' <a class="btn btn-primary" id="dataConfirmOK">Да</a>'+
|
||||||
|
' <button class="btn primary" data-dismiss="modal" aria-hidden="true">Нет</button>'+
|
||||||
|
' </div>\n' +
|
||||||
|
' </div>\n' +
|
||||||
|
' </div>\n' +
|
||||||
|
' </div>');
|
||||||
}
|
}
|
||||||
|
$('#dataConfirmModal').find('#myModalLabel').text($(this).attr('data-confirm'));
|
||||||
|
$('#dataConfirmOK').attr('href', href);
|
||||||
|
$('#dataConfirmModal').modal({show:true});
|
||||||
|
return false;
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
/*]]>*/
|
||||||
}
|
|
||||||
|
|
||||||
function deletePaper(id, papersElement, paperRowClass) {
|
|
||||||
$("#remove-paper-modal").modal('show');
|
|
||||||
|
|
||||||
$("#modal-btn-yes").on("click", function () {
|
|
||||||
deleteFromRest(urlDeletePaper + id, function () {
|
|
||||||
showFeedbackMessage("Статья удалена");
|
|
||||||
$(paperRowClass).remove();
|
|
||||||
showPapers(papersElement, paperRowClass);
|
|
||||||
});
|
|
||||||
$("#remove-paper-modal").modal('hide');
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#modal-btn-no").on("click", function () {
|
|
||||||
$("#remove-paper-modal").modal('hide');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function addPaper(title, status, datePublish, dateUpdate, deadline, comment, locked, tmpFileName, authors) {
|
|
||||||
var paperData = JSON.stringify({
|
|
||||||
"title": title,
|
|
||||||
"status": status,
|
|
||||||
"deadlineDate":deadline,
|
|
||||||
"comment": comment
|
|
||||||
});
|
|
||||||
postToRest(urlPapers, paperData, function (data) {
|
|
||||||
alert(data);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPaperStatusClass(status) {
|
|
||||||
switch (status) {
|
|
||||||
case 'DRAFT':
|
|
||||||
return "text-draft"
|
|
||||||
case 'ON_PREPARATION':
|
|
||||||
return "text-primary";
|
|
||||||
case 'ON_REVIEW':
|
|
||||||
return "text-primary";
|
|
||||||
case 'COMPLETED':
|
|
||||||
return "text-success";
|
|
||||||
case 'ATTENTION':
|
|
||||||
return "text-warning";
|
|
||||||
case 'FAILED':
|
|
||||||
return "text-failed";
|
|
||||||
default:
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showPaperDashboard(dashboardElement) {
|
|
||||||
getFromRest(urlPapers, function (paperList) {
|
|
||||||
paperList.forEach(function (paper, index) {
|
|
||||||
$(dashboardElement).append("<div class=\"col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3 dashboard-card\">" +
|
|
||||||
"<div class=\"row\">" +
|
|
||||||
"<div class=\"col-2\">" +
|
|
||||||
"<span class=\"fa-stack fa-1x\">" +
|
|
||||||
"<i class=\"fa fa-circle fa-stack-2x " + getPaperStatusClass(paper.status) + "\"></i>" +
|
|
||||||
"<i class=\"fa fa-file-text-o fa-stack-1x fa-inverse\"></i>" +
|
|
||||||
"</span>" +
|
|
||||||
"</div>" +
|
|
||||||
"<div class=\"col col-10 text-right\">" +
|
|
||||||
"<h7 class=\"service-heading\">" + paper.title + "</h7>" +
|
|
||||||
"<p class=\"text-muted\">" + paper.authorsString + "</p>" +
|
|
||||||
"</div>" +
|
|
||||||
"</div>" +
|
|
||||||
"</div>");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
@ -1,45 +1,25 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en"
|
<html lang="en"
|
||||||
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||||
layout:decorator="default">
|
layout:decorator="default" xmlns:th="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div class="container" layout:fragment="content">
|
<div class="container" layout:fragment="content">
|
||||||
<!-- Services -->
|
|
||||||
<section id="services">
|
<section id="services">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="col-lg-12 text-center">
|
<div class="col-lg-12 text-center">
|
||||||
<h2 class="section-heading text-uppercase">Статьи</h2>
|
<h2 class="section-heading text-uppercase">Статьи</h2>
|
||||||
|
<div th:replace="papers/fragments/paperNavigationFragment"/>
|
||||||
<div class="row justify-content-center">
|
|
||||||
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3">
|
|
||||||
<a href="./papers" class="btn btn-light toolbar-button"><i class="fa fa-list-alt"></i>
|
|
||||||
Список</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3">
|
|
||||||
<a href="./dashboard" class="btn btn-light toolbar-button"><i class="fa fa-newspaper-o"
|
|
||||||
aria-hidden="true"></i> Панель управления</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3">
|
|
||||||
<a href="./paper" class="btn btn-light toolbar-button"><i class="fa fa-plus-circle" aria-hidden="true"></i>
|
|
||||||
Добавить статью</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row justify-content-center" id="dashboard">
|
<div class="row justify-content-center" id="dashboard">
|
||||||
|
<th:block th:each="paper : ${papers}">
|
||||||
|
<div th:replace="papers/fragments/paperDashboardFragment :: titleLine(paper=${paper})"/>
|
||||||
|
</th:block>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<script src="/js/papers.js"></script>
|
|
||||||
<script>
|
|
||||||
$(document).ready(function () {
|
|
||||||
showPaperDashboard("#dashboard");
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -0,0 +1,43 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head th:fragment="headerfiles">
|
||||||
|
<meta charset="UTF-8"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div th:fragment="titleLine (paper)" class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3 dashboard-card">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-2">
|
||||||
|
<span class="fa-stack fa-1x">
|
||||||
|
<th:block th:switch="${paper.status.name()}">
|
||||||
|
<div th:case="'ATTENTION'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-warning"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'DRAFT'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-draft"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'ON_PREPARATION'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-primary"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'ON_REVIEW'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-primary"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'COMPLETED'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-success"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'FAILED'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-failed"></i>
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<i class="fa fa-file-text-o fa-stack-1x fa-inverse"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="col col-10 text-right">
|
||||||
|
<h7 class="service-heading" th:text="${paper.title}"> title</h7>
|
||||||
|
<p class="text-muted" th:text="${paper.authorsString}">authors</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,46 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head th:fragment="headerfiles">
|
||||||
|
<meta charset="UTF-8"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div th:fragment="titleLine (paper)" class="row text-left paper-row" style="background-color: white;">
|
||||||
|
<div class="col">
|
||||||
|
<span class="fa-stack fa-1x">
|
||||||
|
<th:block th:switch="${paper.status.name()}">
|
||||||
|
<div th:case="'ATTENTION'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-warning"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'DRAFT'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-draft"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'ON_PREPARATION'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-primary"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'ON_REVIEW'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-primary"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'COMPLETED'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-success"></i>
|
||||||
|
</div>
|
||||||
|
<div th:case="'FAILED'">
|
||||||
|
<i class="fa fa-circle fa-stack-2x text-failed"></i>
|
||||||
|
</div>
|
||||||
|
</th:block>
|
||||||
|
<i class="fa fa-file-text-o fa-stack-1x fa-inverse"></i>
|
||||||
|
</span>
|
||||||
|
<a th:href="@{'paper?id='+${paper.id}}">
|
||||||
|
<span class="h6" th:text="${paper.title}"/>
|
||||||
|
<span class="text-muted" th:text="${paper.authorsString}"/>
|
||||||
|
</a>
|
||||||
|
<input class="id-class" type="hidden" th:value="${paper.id}"/>
|
||||||
|
<a class="remove-paper pull-right d-none" th:href="@{'/papers/delete/'+${paper.id}}"
|
||||||
|
data-confirm="Удалить статью?">
|
||||||
|
<i class="fa fa-trash" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,27 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head th:fragment="headerfiles">
|
||||||
|
<meta charset="UTF-8"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3">
|
||||||
|
<a href="./papers" class="btn btn-light toolbar-button"><i class="fa fa-list-alt"></i>
|
||||||
|
Список</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3">
|
||||||
|
<a href="./dashboard" class="btn btn-light toolbar-button"><i class="fa fa-newspaper-o"
|
||||||
|
aria-hidden="true"></i> Панель
|
||||||
|
управления</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3">
|
||||||
|
<a href="./paper?id=0" class="btn btn-light toolbar-button"><i class="fa fa-plus-circle"
|
||||||
|
aria-hidden="true"></i>
|
||||||
|
Добавить статью</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue