add conferences
This commit is contained in:
parent
5ae17fbe83
commit
b662437afe
@ -0,0 +1,71 @@
|
||||
package ru.ulstu.conference.controller;
|
||||
|
||||
import ru.ulstu.conference.model.Conference;
|
||||
import ru.ulstu.conference.service.ConferenceService;
|
||||
import ru.ulstu.core.util.FacesUtil;
|
||||
import ru.ulstu.user.service.UserService;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.faces.view.ViewScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Named
|
||||
@ViewScoped
|
||||
public class ConferenceDashboardView {
|
||||
@Inject
|
||||
private ConferenceService conferenceService;
|
||||
|
||||
@Inject
|
||||
private UserService userService;
|
||||
|
||||
private List<Conference> conferences;
|
||||
|
||||
private List<Conference> selectedConferences = new ArrayList<>();
|
||||
|
||||
private String newConferenceTitle;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
conferences = conferenceService.findAllActiveByCurrentUser();
|
||||
}
|
||||
|
||||
public List<Conference> getConferences() {
|
||||
return conferences;
|
||||
}
|
||||
|
||||
public void create() {
|
||||
conferenceService.createByTitle(newConferenceTitle);
|
||||
FacesUtil.showInfoMessage("Статья создана", newConferenceTitle);
|
||||
newConferenceTitle = "";
|
||||
conferences = conferenceService.findAllActiveByCurrentUser();
|
||||
}
|
||||
|
||||
public void deleteSelected() {
|
||||
conferenceService.delete(selectedConferences);
|
||||
conferences = conferenceService.findAllActiveByCurrentUser();
|
||||
FacesUtil.showInfoMessage("Было удалено статей: " + selectedConferences.size(), "");
|
||||
}
|
||||
|
||||
public String getNewConferenceTitle() {
|
||||
return newConferenceTitle;
|
||||
}
|
||||
|
||||
public void setNewConferenceTitle(String newConferenceTitle) {
|
||||
this.newConferenceTitle = newConferenceTitle;
|
||||
}
|
||||
|
||||
public List<Conference> getSelectedConferences() {
|
||||
return selectedConferences;
|
||||
}
|
||||
|
||||
public void setSelectedConferences(List<Conference> selectedConferences) {
|
||||
this.selectedConferences = selectedConferences;
|
||||
}
|
||||
|
||||
public String getCurrentUser() {
|
||||
return userService.getCurrentUser().getUserAbbreviate();
|
||||
}
|
||||
}
|
@ -0,0 +1,89 @@
|
||||
package ru.ulstu.conference.controller;
|
||||
|
||||
import ru.ulstu.conference.model.Conference;
|
||||
import ru.ulstu.conference.service.ConferenceService;
|
||||
import ru.ulstu.core.navigation.Page;
|
||||
import ru.ulstu.core.util.FacesUtil;
|
||||
import ru.ulstu.deadline.model.Deadline;
|
||||
import ru.ulstu.deadline.service.DeadlineService;
|
||||
import ru.ulstu.user.model.User;
|
||||
import ru.ulstu.user.service.UserService;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.faces.view.ViewScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Named
|
||||
@ViewScoped
|
||||
public class ConferenceView implements Serializable {
|
||||
@Inject
|
||||
private ConferenceService conferenceService;
|
||||
|
||||
@Inject
|
||||
private DeadlineService deadlineService;
|
||||
|
||||
@Inject
|
||||
private UserService userService;
|
||||
|
||||
private Conference conference;
|
||||
|
||||
private Date newDeadlineDate;
|
||||
|
||||
private String newDeadlineDescription;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
conference = conferenceService.findOne(Integer.valueOf(FacesUtil.getRequestParams().get("id")));
|
||||
newDeadlineDescription = "";
|
||||
newDeadlineDate = new Date();
|
||||
FacesUtil.showInfoMessage("Статья открыта", "");
|
||||
}
|
||||
|
||||
public Conference getConference() {
|
||||
return conference;
|
||||
}
|
||||
|
||||
public void setConference(Conference conference) {
|
||||
this.conference = conference;
|
||||
}
|
||||
|
||||
public List<User> getAuthors() {
|
||||
return userService.findAll();
|
||||
}
|
||||
|
||||
public String save() {
|
||||
conferenceService.save(conference);
|
||||
FacesUtil.showInfoMessage("Статья сохранена", "");
|
||||
return Page.CONFERENCE_LIST + "?faces-redirect=true";
|
||||
}
|
||||
|
||||
public Date getNewDeadlineDate() {
|
||||
return newDeadlineDate;
|
||||
}
|
||||
|
||||
public void setNewDeadlineDate(Date newDeadlineDate) {
|
||||
this.newDeadlineDate = newDeadlineDate;
|
||||
}
|
||||
|
||||
public String getNewDeadlineDescription() {
|
||||
return newDeadlineDescription;
|
||||
}
|
||||
|
||||
public void setNewDeadlineDescription(String newDeadlineDescription) {
|
||||
this.newDeadlineDescription = newDeadlineDescription;
|
||||
}
|
||||
|
||||
public void deleteDeadline(Deadline deadline) {
|
||||
conference.getDeadlines().remove(deadline);
|
||||
}
|
||||
|
||||
public void addDeadline() {
|
||||
conference.getDeadlines().add(deadlineService.create(newDeadlineDescription, newDeadlineDate));
|
||||
newDeadlineDescription = "";
|
||||
newDeadlineDate = new Date();
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package ru.ulstu.conference.controller;
|
||||
|
||||
import ru.ulstu.conference.model.Conference;
|
||||
import ru.ulstu.conference.service.ConferenceService;
|
||||
import ru.ulstu.core.util.FacesUtil;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.faces.view.ViewScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Named
|
||||
@ViewScoped
|
||||
public class ConferencesView {
|
||||
@Inject
|
||||
private ConferenceService conferenceService;
|
||||
|
||||
private List<Conference> conferences;
|
||||
|
||||
private List<Conference> selectedConferences = new ArrayList<>();
|
||||
|
||||
private String newConferenceTitle;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
conferences = conferenceService.findAll();
|
||||
}
|
||||
|
||||
public void create() {
|
||||
conferenceService.createByTitle(newConferenceTitle);
|
||||
FacesUtil.showInfoMessage("Конференция создана", newConferenceTitle);
|
||||
newConferenceTitle = "";
|
||||
conferences = conferenceService.findAll();
|
||||
}
|
||||
|
||||
public void deleteSelected() {
|
||||
conferenceService.delete(selectedConferences);
|
||||
conferences = conferenceService.findAll();
|
||||
FacesUtil.showInfoMessage("Было удалено конференций: " + selectedConferences.size(), "");
|
||||
}
|
||||
|
||||
public List<Conference> getConferences() {
|
||||
return conferences;
|
||||
}
|
||||
|
||||
public String getNewConferenceTitle() {
|
||||
return newConferenceTitle;
|
||||
}
|
||||
|
||||
public void setNewConferenceTitle(String newConferenceTitle) {
|
||||
this.newConferenceTitle = newConferenceTitle;
|
||||
}
|
||||
|
||||
public List<Conference> getSelectedConferences() {
|
||||
return selectedConferences;
|
||||
}
|
||||
|
||||
public void setSelectedConferences(List<Conference> selectedConferences) {
|
||||
this.selectedConferences = selectedConferences;
|
||||
}
|
||||
}
|
@ -17,8 +17,6 @@ import javax.persistence.DiscriminatorValue;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.JoinTable;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.OrderBy;
|
||||
import javax.persistence.Table;
|
||||
@ -63,18 +61,21 @@ public class Conference extends BaseEntity implements UserActivity, EventSource
|
||||
@OrderBy("date")
|
||||
private List<Deadline> deadlines = new ArrayList<>();
|
||||
|
||||
@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
|
||||
@JoinTable(name = "paper_conference",
|
||||
joinColumns = {@JoinColumn(name = "conference_id")},
|
||||
inverseJoinColumns = {@JoinColumn(name = "paper_id")})
|
||||
@Fetch(FetchMode.SUBSELECT)
|
||||
@OneToMany(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "conference_id")
|
||||
private List<Paper> papers = new ArrayList<>();
|
||||
|
||||
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
|
||||
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "conference_id", unique = true)
|
||||
@Fetch(FetchMode.SUBSELECT)
|
||||
private List<ConferenceUser> users = new ArrayList<>();
|
||||
|
||||
public Conference() {
|
||||
}
|
||||
|
||||
public Conference(@NotBlank String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
@ -69,6 +69,8 @@ public class ConferenceUser extends BaseEntity {
|
||||
|
||||
public ConferenceUser(User user) {
|
||||
this.user = user;
|
||||
this.deposit = Deposit.REPORT;
|
||||
this.participation = Participation.INTRAMURAL;
|
||||
}
|
||||
|
||||
@JsonCreator
|
||||
|
@ -22,13 +22,14 @@ import ru.ulstu.user.model.User;
|
||||
import ru.ulstu.user.service.UserService;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import static org.springframework.util.ObjectUtils.isEmpty;
|
||||
import static ru.ulstu.core.util.StreamApiUtils.convert;
|
||||
|
||||
@ -110,30 +111,44 @@ public class ConferenceService extends BaseService {
|
||||
return true;
|
||||
}
|
||||
|
||||
public Conference save(Conference conference) {
|
||||
if (isEmpty(conference.getId())) {
|
||||
return create(conference);
|
||||
} else {
|
||||
return update(conference);
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public Conference create(ConferenceDto conferenceDto) throws IOException {
|
||||
Conference newConference = copyFromDto(new Conference(), conferenceDto);
|
||||
newConference = conferenceRepository.save(newConference);
|
||||
conferenceNotificationService.sendCreateNotification(newConference);
|
||||
eventService.createFromObject(newConference, Collections.emptyList(), false, "конференции");
|
||||
return newConference;
|
||||
return create(copyFromDto(new Conference(), conferenceDto));
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public Conference create(Conference conference) {
|
||||
conference = conferenceRepository.save(conference);
|
||||
conferenceNotificationService.sendCreateNotification(conference);
|
||||
return conference;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
private Conference update(ConferenceDto conferenceDto) throws IOException {
|
||||
Conference conference = conferenceRepository.getOne(conferenceDto.getId());
|
||||
List<Deadline> oldDeadlines = conference.getDeadlines().stream()
|
||||
return update(copyFromDto(conferenceRepository.getOne(conferenceDto.getId()), conferenceDto));
|
||||
}
|
||||
|
||||
@Transactional
|
||||
private Conference update(Conference conference) {
|
||||
Conference oldConference = conferenceRepository.getOne(conference.getId());
|
||||
List<Deadline> oldDeadlines = oldConference.getDeadlines().stream()
|
||||
.map(this::copyDeadline)
|
||||
.collect(Collectors.toList());
|
||||
Date oldBeginDate = conference.getBeginDate();
|
||||
Date oldEndDate = conference.getEndDate();
|
||||
conferenceRepository.save(copyFromDto(conference, conferenceDto));
|
||||
eventService.updateConferenceDeadlines(conference);
|
||||
conferenceRepository.save(conference);
|
||||
sendNotificationAfterUpdateDeadlines(conference, oldDeadlines);
|
||||
if (!conference.getBeginDate().equals(oldBeginDate) || !conference.getEndDate().equals(oldEndDate)) {
|
||||
conferenceNotificationService.updateConferencesDatesNotification(conference, oldBeginDate, oldEndDate);
|
||||
}
|
||||
conferenceDto.getRemovedDeadlineIds().forEach(deadlineService::remove);
|
||||
return conference;
|
||||
}
|
||||
|
||||
@ -147,6 +162,12 @@ public class ConferenceService extends BaseService {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public boolean delete(List<Conference> conferences) {
|
||||
conferences.forEach(conference -> delete(conference.getId()));
|
||||
return true;
|
||||
}
|
||||
|
||||
public ConferenceDto addDeadline(ConferenceDto conferenceDto) {
|
||||
conferenceDto.getDeadlines().add(new Deadline());
|
||||
return conferenceDto;
|
||||
@ -246,7 +267,7 @@ public class ConferenceService extends BaseService {
|
||||
conferenceRepository.updatePingConference(conferenceDto.getId());
|
||||
}
|
||||
|
||||
private Conference findOne(Integer conferenceId) {
|
||||
public Conference findOne(Integer conferenceId) {
|
||||
return conferenceRepository.getOne(conferenceId);
|
||||
}
|
||||
|
||||
@ -315,4 +336,20 @@ public class ConferenceService extends BaseService {
|
||||
public Conference getActiveConferenceByUser(User user) {
|
||||
return conferenceRepository.findActiveByUser(user);
|
||||
}
|
||||
|
||||
public Conference createByTitle(String newConferenceTitle) {
|
||||
Conference conference = new Conference(newConferenceTitle);
|
||||
conference.getUsers().add(new ConferenceUser(userService.getCurrentUser()));
|
||||
conference.getDeadlines().add(deadlineService.createWithOffset(new Date(), 1, ChronoUnit.WEEKS));
|
||||
return save(conference);
|
||||
}
|
||||
|
||||
public List<Conference> findAllActiveByCurrentUser() {
|
||||
return findAllActive()
|
||||
.stream()
|
||||
.filter(conference -> conference.getUsers()
|
||||
.stream()
|
||||
.anyMatch(user -> user.getUser().equals(userService.getCurrentUser())))
|
||||
.collect(toList());
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,9 @@ public class Page {
|
||||
public static final String GRANT_DASHBOARD = "/grant/dashboard.xhtml";
|
||||
public static final String USER_LIST = "/admin/users.xhtml";
|
||||
public static final String LOGOUT = "/logout";
|
||||
public static final String CONFERENCE = "/conference/conference.xhtml";
|
||||
public static final String CONFERENCE_DASHBOARD = "/conference/dashboard.xhtml";
|
||||
public static final String CONFERENCE_LIST = "/conference/conferences.xhtml";
|
||||
public static final String PROJECT_DASHBOARD = "/conference/dashboard.xhtml";
|
||||
|
||||
public String getIndex() {
|
||||
@ -59,4 +61,12 @@ public class Page {
|
||||
public String getProjectDashboard() {
|
||||
return PROJECT_DASHBOARD;
|
||||
}
|
||||
|
||||
public String getConference() {
|
||||
return CONFERENCE;
|
||||
}
|
||||
|
||||
public String getConferenceList() {
|
||||
return CONFERENCE_LIST;
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ import javax.persistence.Enumerated;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.OrderBy;
|
||||
import javax.persistence.Temporal;
|
||||
@ -126,8 +127,9 @@ public class Paper extends BaseEntity implements UserActivity, EventSource {
|
||||
@Column(name = "latex_text")
|
||||
private String latexText;
|
||||
|
||||
@ManyToMany(mappedBy = "papers")
|
||||
private List<Conference> conferences;
|
||||
@ManyToOne()
|
||||
@JoinColumn(name = "conference_id")
|
||||
private Conference conference;
|
||||
|
||||
@ManyToMany(mappedBy = "papers")
|
||||
private List<Grant> grants;
|
||||
@ -251,12 +253,12 @@ public class Paper extends BaseEntity implements UserActivity, EventSource {
|
||||
this.latexText = latexText;
|
||||
}
|
||||
|
||||
public List<Conference> getConferences() {
|
||||
return conferences;
|
||||
public Conference getConference() {
|
||||
return conference;
|
||||
}
|
||||
|
||||
public void setConferences(List<Conference> conferences) {
|
||||
this.conferences = conferences;
|
||||
public void setConference(Conference conference) {
|
||||
this.conference = conference;
|
||||
}
|
||||
|
||||
public List<Grant> getGrants() {
|
||||
@ -321,12 +323,12 @@ public class Paper extends BaseEntity implements UserActivity, EventSource {
|
||||
Objects.equals(files, paper.files) &&
|
||||
Objects.equals(authors, paper.authors) &&
|
||||
Objects.equals(latexText, paper.latexText) &&
|
||||
Objects.equals(conferences, paper.conferences) &&
|
||||
Objects.equals(conference, paper.conference) &&
|
||||
Objects.equals(grants, paper.grants);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(super.hashCode(), title, status, type, createDate, updateDate, deadlines, comment, url, locked, events, files, authors, latexText, conferences, grants);
|
||||
return Objects.hash(super.hashCode(), title, status, type, createDate, updateDate, deadlines, comment, url, locked, events, files, authors, latexText, conference, grants);
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ public interface PaperRepository extends JpaRepository<Paper, Integer> {
|
||||
|
||||
List<Paper> findByStatusNot(Paper.PaperStatus status);
|
||||
|
||||
List<Paper> findByConferencesIsNullAndStatusNot(Paper.PaperStatus status);
|
||||
List<Paper> findByConferenceIsNullAndStatusNot(Paper.PaperStatus status);
|
||||
|
||||
List<Paper> findByIdNotInAndConferencesIsNullAndStatusNot(List<Integer> paperIds, Paper.PaperStatus status);
|
||||
List<Paper> findByIdNotInAndConferenceIsNullAndStatusNot(List<Integer> paperIds, Paper.PaperStatus status);
|
||||
}
|
||||
|
@ -334,9 +334,9 @@ public class PaperService {
|
||||
|
||||
public List<Paper> findAllNotSelect(List<Integer> paperIds) {
|
||||
if (!paperIds.isEmpty()) {
|
||||
return sortPapers(paperRepository.findByIdNotInAndConferencesIsNullAndStatusNot(paperIds, COMPLETED));
|
||||
return sortPapers(paperRepository.findByIdNotInAndConferenceIsNullAndStatusNot(paperIds, COMPLETED));
|
||||
} else {
|
||||
return sortPapers(paperRepository.findByConferencesIsNullAndStatusNot(COMPLETED));
|
||||
return sortPapers(paperRepository.findByConferenceIsNullAndStatusNot(COMPLETED));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,10 @@
|
||||
<p:menuitem value="Мои гранты" icon="fa fa-calendar" url="#{page.grantDashboard}"/>
|
||||
<p:menuitem value="Все гранты" icon="fa fa-file-o" url="#{page.grantList}"/>
|
||||
</p:submenu>
|
||||
<p:submenu label="Конференции" icon="fa fa-file-text-o">
|
||||
<p:menuitem value="Мои конференции" icon="fa fa-calendar" url="#{page.conferenceDashboard}"/>
|
||||
<p:menuitem value="Все конференции" icon="fa fa-file-o" url="#{page.conferenceList}"/>
|
||||
</p:submenu>
|
||||
<p:menuitem value="Пользователи" icon="fa fa-calendar" url="#{page.userList}"/>
|
||||
|
||||
<f:facet name="options">
|
||||
|
@ -0,0 +1,124 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:p="http://primefaces.org/ui"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html"
|
||||
>
|
||||
<ui:composition template="/basicTemplate.xhtml">
|
||||
<ui:define name="header">
|
||||
Редактирование конференции
|
||||
</ui:define>
|
||||
<ui:define name="content">
|
||||
<style>
|
||||
#mainForm\:conferencePanel > tbody > tr {
|
||||
border: none;
|
||||
}
|
||||
|
||||
#mainForm\:conferencePanel > tbody > tr > td {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.ui-editor.ui-widget-content {
|
||||
background: white !important;
|
||||
}
|
||||
</style>
|
||||
<p:panel id="panel" header="Редактирование конференции: #{conferenceView.conference.title}"
|
||||
style="margin-bottom:10px;">
|
||||
<div class="ui-fluid">
|
||||
<div class="ui-g">
|
||||
<div class="ui-md-3 ui-g-12">
|
||||
<h:outputLabel value="Название:"/>
|
||||
</div>
|
||||
<div class="ui-md-7 ui-g-12">
|
||||
<p:inputText id="name" required="true" value="#{conferenceView.conference.title}"/>
|
||||
<p:message for="name"/>
|
||||
</div>
|
||||
|
||||
<div class="ui-md-3 ui-g-12">
|
||||
<h:outputLabel value="Ссылка:"/>
|
||||
</div>
|
||||
<div class="ui-md-7 ui-g-12">
|
||||
<p:inputText id="url" required="true" value="#{conferenceView.conference.url}"/>
|
||||
<p:message for="url"/>
|
||||
</div>
|
||||
|
||||
<div class="ui-md-2 ui-g-12">
|
||||
|
||||
</div>
|
||||
<div class="ui-md-3 ui-g-12">
|
||||
<!-- <p:outputLabel for="authors" value="Авторы:"/>-->
|
||||
</div>
|
||||
<div class="ui-md-7 ui-g-12">
|
||||
<!-- <p:selectCheckboxMenu id="authors" value="#{conferenceView.conference.users}" multiple="true"-->
|
||||
<!-- converter="#{conferenceUserConverter}">-->
|
||||
<!-- <f:attribute name="collectionType" value="java.util.HashSet"/>-->
|
||||
<!-- <f:selectItems value="#{conferenceView.authors}"-->
|
||||
<!-- var="author"-->
|
||||
<!-- itemLabel="#{author.userAbbreviate}"-->
|
||||
<!-- itemValue="#{author}"/>-->
|
||||
<!-- </p:selectCheckboxMenu>-->
|
||||
</div>
|
||||
<div class="ui-md-3 ui-g-12">
|
||||
<!-- <p:outputLabel for="authors" value="Ключевые даты:"/>-->
|
||||
</div>
|
||||
<div class="ui-md-7 ui-g-12">
|
||||
<div class="ui-fluid">
|
||||
<div class="ui-g">
|
||||
<ui:repeat value="#{conferenceView.conference.deadlines}" var="deadline">
|
||||
<div class="ui-md-5 ui-g-12">
|
||||
<p:datePicker value="#{deadline.date}" pattern="dd.MM.yyyy"/>
|
||||
</div>
|
||||
<div class="ui-md-5 ui-g-12">
|
||||
<p:inputText value="#{deadline.description}"/>
|
||||
</div>
|
||||
<div class="ui-md-1 ui-g-12">
|
||||
<p:commandButton icon="pi pi-times">
|
||||
<p:ajax update="mainForm" process="@this"
|
||||
listener="#{conferenceView.deleteDeadline(deadline)}"/>
|
||||
</p:commandButton>
|
||||
</div>
|
||||
</ui:repeat>
|
||||
<div class="ui-md-5 ui-g-12">
|
||||
<p:datePicker value="#{conferenceView.newDeadlineDate}" placeholder="Введите дату"
|
||||
pattern="dd.MM.yyyy"/>
|
||||
</div>
|
||||
<div class="ui-md-5 ui-g-12">
|
||||
<p:inputText value="#{conferenceView.newDeadlineDescription}"
|
||||
placeholder="Описание ключевой даты"/>
|
||||
</div>
|
||||
<div class="ui-md-1 ui-g-12">
|
||||
<p:commandButton icon="pi pi-check">
|
||||
<p:ajax update="mainForm" process="@this"
|
||||
listener="#{conferenceView.addDeadline()}"/>
|
||||
</p:commandButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui-md-3 ui-g-12">
|
||||
<p:outputLabel for="comment" value="Комментарий:"/>
|
||||
</div>
|
||||
<div class="ui-md-7 ui-g-12">
|
||||
<p:editor id="comment" widgetVar="editor2" value="#{conferenceView.conference.description}"
|
||||
height="300"
|
||||
style="margin-bottom:10px" placeholder="Комментарий"/>
|
||||
</div>
|
||||
<div class="ui-md-2 ui-g-12">
|
||||
<p>
|
||||
Конференция создана
|
||||
</p>
|
||||
<p>
|
||||
Конференция обновлена
|
||||
</p>
|
||||
</div>
|
||||
<div class="ui-md-5 ui-g-12">
|
||||
<p:commandButton action="#{conferenceView.save}" value="Сохранить" ajax="true" process="@form"
|
||||
update="messages @form"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</p:panel>
|
||||
</ui:define>
|
||||
</ui:composition>
|
||||
</html>
|
@ -0,0 +1,10 @@
|
||||
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:p="http://java.sun.com/jsf/html">
|
||||
<span class="fa-stack fa-1x big-icon" title="#{conference.status.statusName}">
|
||||
<i class="fa fa-circle #{conference.status.elementClass} fa-stack-2x"></i>
|
||||
<i class="fa fa-file-text-o fa-stack-1x fa-inverse"></i>
|
||||
</span>
|
||||
<ui:fragment rendered="#{shortMode != true}">
|
||||
<p:outputText value="#{conference.status.statusName}"/>
|
||||
</ui:fragment>
|
||||
</ui:composition>
|
@ -0,0 +1,79 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:p="http://primefaces.org/ui"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core">
|
||||
<ui:composition template="/basicTemplate.xhtml">
|
||||
<ui:define name="content">
|
||||
<style>
|
||||
.ui-datatable .ui-datatable-header {
|
||||
text-align: right !important;
|
||||
}
|
||||
</style>
|
||||
<p:panel id="panel" header="Все конференции" style="margin-bottom:10px;">
|
||||
|
||||
<div class="ui-fluid">
|
||||
<div class="ui-g">
|
||||
<div class="ui-md-5 ui-g-12">
|
||||
<p:inputText placeholder="Создать новую коференцию" id="newConferenceName"
|
||||
value="#{conferencesView.newConferenceTitle}" required="true"
|
||||
requiredMessage="Введите название новой конференции"/>
|
||||
<p:message for="newConferenceName"/>
|
||||
</div>
|
||||
<div class="ui-md-2 ui-g-12">
|
||||
<p:commandButton action="#{conferencesView.create}" value="Создать" ajax="true" process="@form"
|
||||
update="messages @form mainForm:conferencesTable"/>
|
||||
|
||||
</div>
|
||||
<div class="ui-md-3 ui-g-12">
|
||||
<p:commandButton value="Удалить выделенные" id="conferencesRemoveButton"
|
||||
disabled="#{conferencesView.selectedConferences.isEmpty()}"
|
||||
action="#{conferencesView.deleteSelected}" ajax="true"
|
||||
process="mainForm:conferencesRemoveButton"
|
||||
update="messages mainForm:conferencesTable">
|
||||
<p:confirm header="Подтверждение" message="Удалить выделенные конференции?"
|
||||
icon="pi pi-exclamation-triangle"/>
|
||||
</p:commandButton>
|
||||
</div>
|
||||
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
|
||||
<p:commandButton value="Да" type="button" styleClass="ui-confirmdialog-yes" icon="pi pi-check"/>
|
||||
<p:commandButton value="Нет" type="button" styleClass="ui-confirmdialog-no" icon="pi pi-times"/>
|
||||
</p:confirmDialog>
|
||||
</div>
|
||||
|
||||
<p:dataTable value="#{conferencesView.conferences}" var="conference" paginator="true"
|
||||
paginatorPosition="bottom"
|
||||
rows="10" id="conferencesTable"
|
||||
widgetVar="conferencesTable" emptyMessage="Не найдено подходящих конференций"
|
||||
selection="#{conferencesView.selectedConferences}" rowKey="#{conference.id}">
|
||||
<f:facet name="header">
|
||||
<p:outputPanel>
|
||||
<h:outputText value="Поиск:"/>
|
||||
<p:inputText id="globalFilter" onkeyup="PF('conferencesTable').filter()" style="width:150px"
|
||||
placeholder="Строка поиска..."/>
|
||||
</p:outputPanel>
|
||||
</f:facet>
|
||||
<p:ajax event="rowSelect" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"/>
|
||||
<p:ajax event="rowSelectCheckbox" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"/>
|
||||
<p:ajax event="rowUnselectCheckbox" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"/>
|
||||
<p:ajax event="rowUnselect" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"/>
|
||||
<p:ajax event="toggleSelect" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"
|
||||
partialSubmit="true"/>
|
||||
<p:column selectionMode="multiple" style="width:16px;text-align:center"/>
|
||||
<p:column headerText="Название" filterBy="#{conference.title}" filterMatchMode="contains">
|
||||
<h:outputLink value="#{page.conference}">
|
||||
#{conference.title}
|
||||
<f:param name="id" value="#{conference.id}"/>
|
||||
</h:outputLink>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
</div>
|
||||
</p:panel>
|
||||
</ui:define>
|
||||
</ui:composition>
|
||||
</html>
|
@ -0,0 +1,81 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:p="http://primefaces.org/ui"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core">
|
||||
<ui:composition template="/basicTemplate.xhtml">
|
||||
<ui:define name="content">
|
||||
<style>
|
||||
.ui-datatable .ui-datatable-header {
|
||||
text-align: right !important;
|
||||
}
|
||||
</style>
|
||||
<p:panel id="panel" header="Активные конференции пользователя #{conferenceDashboardView.currentUser}"
|
||||
style="margin-bottom:10px;">
|
||||
|
||||
<div class="ui-fluid">
|
||||
<div class="ui-g">
|
||||
<div class="ui-md-5 ui-g-12">
|
||||
<p:inputText placeholder="Создать новую конференцию" id="newConferenceName"
|
||||
value="#{conferenceDashboardView.newConferenceTitle}" required="true"
|
||||
requiredMessage="Введите название новой конференции"/>
|
||||
<p:message for="newConferenceName"/>
|
||||
</div>
|
||||
<div class="ui-md-2 ui-g-12">
|
||||
<p:commandButton action="#{conferenceDashboardView.create}" value="Создать" ajax="true"
|
||||
process="@form"
|
||||
update="messages @form mainForm:conferencesTable"/>
|
||||
|
||||
</div>
|
||||
<div class="ui-md-3 ui-g-12">
|
||||
<p:commandButton value="Удалить выделенные" id="conferencesRemoveButton"
|
||||
disabled="#{conferenceDashboardView.selectedConferences.isEmpty()}"
|
||||
action="#{conferenceDashboardView.deleteSelected}" ajax="true"
|
||||
process="mainForm:conferencesRemoveButton"
|
||||
update="messages mainForm:conferencesTable">
|
||||
<p:confirm header="Подтверждение" message="Удалить выделенные конференции?"
|
||||
icon="pi pi-exclamation-triangle"/>
|
||||
</p:commandButton>
|
||||
</div>
|
||||
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
|
||||
<p:commandButton value="Да" type="button" styleClass="ui-confirmdialog-yes" icon="pi pi-check"/>
|
||||
<p:commandButton value="Нет" type="button" styleClass="ui-confirmdialog-no" icon="pi pi-times"/>
|
||||
</p:confirmDialog>
|
||||
</div>
|
||||
|
||||
<p:dataTable value="#{conferenceDashboardView.conferences}" var="conference" paginator="true"
|
||||
paginatorPosition="bottom"
|
||||
rows="10" id="conferencesTable"
|
||||
widgetVar="conferencesTable" emptyMessage="Не найдено подходящих конференций"
|
||||
selection="#{conferenceDashboardView.selectedConferences}" rowKey="#{conference.id}">
|
||||
<f:facet name="header">
|
||||
<p:outputPanel>
|
||||
<h:outputText value="Поиск:"/>
|
||||
<p:inputText id="globalFilter" onkeyup="PF('conferencesTable').filter()" style="width:150px"
|
||||
placeholder="Строка поиска..."/>
|
||||
</p:outputPanel>
|
||||
</f:facet>
|
||||
<p:ajax event="rowSelect" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"/>
|
||||
<p:ajax event="rowSelectCheckbox" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"/>
|
||||
<p:ajax event="rowUnselectCheckbox" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"/>
|
||||
<p:ajax event="rowUnselect" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"/>
|
||||
<p:ajax event="toggleSelect" update="mainForm:conferencesRemoveButton"
|
||||
process="mainForm:conferencesTable"
|
||||
partialSubmit="true"/>
|
||||
<p:column selectionMode="multiple" style="width:16px;text-align:center"/>
|
||||
<p:column headerText="Название" filterBy="#{conference.title}" filterMatchMode="contains">
|
||||
<h:outputLink value="#{page.conference}">
|
||||
#{conference.title}
|
||||
<f:param name="id" value="#{conference.id}"/>
|
||||
</h:outputLink>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
</div>
|
||||
</p:panel>
|
||||
</ui:define>
|
||||
</ui:composition>
|
||||
</html>
|
@ -6,14 +6,14 @@
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<title>Страница не найдена</title>
|
||||
<h:outputStylesheet name="css/styles.css"/>
|
||||
<h:outputStylesheet name="css/style.css"/>
|
||||
</h:head>
|
||||
<h:body>
|
||||
<h:body styleClass="black">
|
||||
<div class="ui-g">
|
||||
<div class="ui-g-5"></div>
|
||||
<div class="ui-g-2">
|
||||
<p:panel header="Страница не найдена" style="margin-bottom:20px">
|
||||
<h:link outcome="#{page.INDEX}" styleClass="btn btn-primary">
|
||||
<h:link outcome="#{page.index}" styleClass="btn btn-primary">
|
||||
<i class="fa fa-home fa-4"></i> Вернуться на главную
|
||||
</h:link>
|
||||
</p:panel>
|
||||
|
@ -33,7 +33,7 @@
|
||||
action="#{grantDashboardView.deleteSelected}" ajax="true"
|
||||
process="mainForm:grantsRemoveButton"
|
||||
update="messages mainForm:grantsTable">
|
||||
<p:confirm header="Подтверждение" message="Удалить выделенные статьи?"
|
||||
<p:confirm header="Подтверждение" message="Удалить выделенные гранты?"
|
||||
icon="pi pi-exclamation-triangle"/>
|
||||
</p:commandButton>
|
||||
</div>
|
||||
|
@ -0,0 +1,13 @@
|
||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||
<changeSet author="orion" id="20200427_164000-1">
|
||||
<addColumn tableName="paper">
|
||||
<column name="conference_id" type="integer"/>
|
||||
</addColumn>
|
||||
<addForeignKeyConstraint baseTableName="paper" baseColumnNames="conference_id" constraintName="fk_conference"
|
||||
referencedTableName="conference" referencedColumnNames="id"/>
|
||||
<dropTable tableName="paper_conference"/>
|
||||
</changeSet>
|
||||
</databaseChangeLog>
|
7
src/main/resources/db/0.1.0/changelog.xml
Normal file
7
src/main/resources/db/0.1.0/changelog.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
|
||||
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||
<include file="db/0.1.0/changelog-20200427_164000-schema.xml"/>
|
||||
</databaseChangeLog>
|
@ -55,4 +55,5 @@
|
||||
<include file="db/changelog-20190601_000001-schema.xml"/>
|
||||
<include file="db/changelog-20190605_000000-schema.xml"/>
|
||||
<include file="db/changelog-20190607_000002-schema.xml"/>
|
||||
<include file="db/0.1.0/changelog.xml"/>
|
||||
</databaseChangeLog>
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Была создана новая конференция: "<a th:href="@{|${baseUrl}/conferences/conference?id=${conference.id}|}">
|
||||
Была создана новая конференция: "<a th:href="@{|${baseUrl}/conference/conference.xhtml?id=${conference.id}|}">
|
||||
<span th:text="${conference.title}">Title</span></a>".
|
||||
<br/>
|
||||
Спешите принять участие!
|
||||
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Приближается дедлайн конференции "<a th:href="@{|${baseUrl}/conferences/conference?id=${conference.id}|}">
|
||||
Приближается дедлайн конференции "<a th:href="@{|${baseUrl}/conference/conference.xhtml?id=${conference.id}|}">
|
||||
<span th:text="${conference.title}">Title</span></a>".
|
||||
</p>
|
||||
<p>
|
||||
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Конференция "<a th:href="@{|${baseUrl}/conferences/conference?id=${conference.id}|}">
|
||||
Конференция "<a th:href="@{|${baseUrl}/conference/conference.xhtml?id=${conference.id}|}">
|
||||
<span th:text="${conference.title}">Title</span></a>" была пропингована
|
||||
<b><span th:text="${conference.ping}"></span></b> раз.
|
||||
<br/>
|
||||
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Даты проведения конференции "<a th:href="@{|${baseUrl}/conferences/conference?id=${conference.id}|}">
|
||||
Даты проведения конференции "<a th:href="@{|${baseUrl}/conference/conference.xhtml?id=${conference.id}|}">
|
||||
<span th:text="${conference.title}">Title</span></a>" изменились с <br/>
|
||||
"<span th:text="${#dates.format(oldBeginDate, 'dd.MM.yyyy')}">oldBeginDate</span>"
|
||||
-
|
||||
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Дедлайны конференции "<a th:href="@{|${baseUrl}/conferences/conference?id=${conference.id}|}">
|
||||
Дедлайны конференции "<a th:href="@{|${baseUrl}/conference /conference.xhtml?id=${conference.id}|}">
|
||||
<span th:text="${conference.title}">Title</span></a>" притерпели изменения.
|
||||
<br/>
|
||||
Ознакомтесь с изменениями.
|
||||
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Состав рабочей группы гранта "<a th:href="@{|${baseUrl}/grants/grant?id=${grant.id}|}"><span
|
||||
Состав рабочей группы гранта "<a th:href="@{|${baseUrl}/grants/grant.xhtml?id=${grant.id}|}"><span
|
||||
th:text="${grant.title}">Title</span></a>" сменился с
|
||||
" <span th:each="author : ${oldAuthors}" th:text="${author.lastName + ' '}">oldAuthors</span>"
|
||||
на " <span th:each="author : ${grant.authors}" th:text="${author.lastName + ' '}">newAuthors</span>".
|
||||
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Был добавлен новый грант: "<a th:href="@{|${baseUrl}/grants/grant?id=${grant.id}|}">
|
||||
Был добавлен новый грант: "<a th:href="@{|${baseUrl}/grants/grant.xhtml?id=${grant.id}|}">
|
||||
<span th:text="${grant.title}">Title</span></a>".
|
||||
<br/>
|
||||
</p>
|
||||
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Приближается дедлайн гранта "<a th:href="@{|${baseUrl}/grants/grant?id=${grant.id}|}"><span
|
||||
Приближается дедлайн гранта "<a th:href="@{|${baseUrl}/grants/grant.xhtml?id=${grant.id}|}"><span
|
||||
th:text="${grant.title}">Title</span></a>".
|
||||
</p>
|
||||
<p>
|
||||
|
@ -10,7 +10,7 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Руководитель гранта "<a th:href="@{|${baseUrl}/grants/grant?id=${grant.id}|}"><span
|
||||
Руководитель гранта "<a th:href="@{|${baseUrl}/grants/grant.xhtml?id=${grant.id}|}"><span
|
||||
th:text="${grant.title}">Title</span></a>" сменился с
|
||||
"<span th:text="${oldLeader.lastName} ">oldLeader</span>"
|
||||
на "<span th:text="${grant.leader.lastName}">newLeader</span>".
|
||||
|
@ -10,7 +10,8 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Вам нужно поработать над статьей "<a th:href="@{|${baseUrl}/papers/paper?id=${paper.id}|}"><span th:text="${paper.title}">Title</span></a>".
|
||||
Вам нужно поработать над статьей "<a th:href="@{|${baseUrl}/papers/paper.xhtml?id=${paper.id}|}"><span
|
||||
th:text="${paper.title}">Title</span></a>".
|
||||
</p>
|
||||
<div th:with="nextDeadline=${paper.nextDeadline}" th:remove="tag">
|
||||
<p th:if="${nextDeadline.isPresent()}">
|
||||
|
@ -10,7 +10,8 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Приближается дедлайн статьи "<a th:href="@{|${baseUrl}/papers/paper?id=${paper.id}|}"><span th:text="${paper.title}">Title</span></a>".
|
||||
Приближается дедлайн статьи "<a th:href="@{|${baseUrl}/papers/paper.xhtml?id=${paper.id}|}"><span
|
||||
th:text="${paper.title}">Title</span></a>".
|
||||
</p>
|
||||
<p>
|
||||
Срок исполнения: <b><span th:text="${#dates.format(paper.nextDeadline.get().date, 'dd.MM.yyyy')}"></span></b>.
|
||||
|
@ -10,7 +10,8 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Статья "<a th:href="@{|${baseUrl}/papers/paper?id=${paper.id}|}"><span th:text="${paper.title}">Title</span></a>" провалена.
|
||||
Статья "<a th:href="@{|${baseUrl}/papers/paper.xhtml?id=${paper.id}|}"><span
|
||||
th:text="${paper.title}">Title</span></a>" провалена.
|
||||
Предыдущий статус - "<span th:text="${oldStatus.statusName}">oldStatus</span>".
|
||||
</p>
|
||||
<p>
|
||||
|
@ -10,8 +10,10 @@
|
||||
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||
</p>
|
||||
<p>
|
||||
Статус статьи "<a th:href="@{|${baseUrl}/papers/paper?id=${paper.id}|}"><span th:text="${paper.title}">Title</span></a>" сменился с
|
||||
"<span th:text="${oldStatus.statusName}">oldStatus</span>" на "<span th:text="${paper.status.statusName}">newStatus</span>".
|
||||
Статус статьи "<a th:href="@{|${baseUrl}/papers/paper.xhtml?id=${paper.id}|}"><span
|
||||
th:text="${paper.title}">Title</span></a>" сменился с
|
||||
"<span th:text="${oldStatus.statusName}">oldStatus</span>" на "<span
|
||||
th:text="${paper.status.statusName}">newStatus</span>".
|
||||
</p>
|
||||
<p>
|
||||
Regards,
|
||||
|
Loading…
Reference in New Issue
Block a user