#73 merge dev into jdk11

pull/161/head
Anton Romanov 5 years ago
commit 2cf3e52596

@ -15,6 +15,7 @@ before_script:
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh - mkdir -p ~/.ssh
- chmod 700 ~/.ssh - chmod 700 ~/.ssh
- git log --pretty="%cn;%cd;%s" > src/main/resources/commits.log
build: build:
stage: build stage: build

@ -7,6 +7,7 @@
2. Создать новую функцию автоматизированной системы управления задчами - интеллектуальную постановку задач исполнителям. 2. Создать новую функцию автоматизированной системы управления задчами - интеллектуальную постановку задач исполнителям.
3. Получить платформу для обкатки научных проектов магистрантов по созданию интеллектуальны систем. 3. Получить платформу для обкатки научных проектов магистрантов по созданию интеллектуальны систем.
4. Получить проект для обучения бакалавров современым технологиям разработки. 4. Получить проект для обучения бакалавров современым технологиям разработки.
5. Создать систему хранения и трансляции опыта между участниками научной группы.
[Демо версия доступна здесь](http://193.110.3.124:8080) [Демо версия доступна здесь](http://193.110.3.124:8080)

@ -0,0 +1,19 @@
package ru.ulstu.conference.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import ru.ulstu.conference.service.ConferenceService;
import springfox.documentation.annotations.ApiIgnore;
@Controller()
@RequestMapping(value = "/conferences")
@ApiIgnore
public class ConferenceController {
private final ConferenceService conferenceService;
public ConferenceController(ConferenceService paperService) {
this.conferenceService = paperService;
}
}

@ -0,0 +1,11 @@
package ru.ulstu.conference.model;
import ru.ulstu.core.model.BaseEntity;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "conference")
public class Conference extends BaseEntity {
}

@ -0,0 +1,4 @@
package ru.ulstu.conference.model;
public class ConferenceDto {
}

@ -0,0 +1,4 @@
package ru.ulstu.conference.model;
public class ConferenceFilterDto {
}

@ -0,0 +1,7 @@
package ru.ulstu.conference.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import ru.ulstu.conference.model.Conference;
public interface ConferenceRepository extends JpaRepository<Conference, Integer> {
}

@ -0,0 +1,7 @@
package ru.ulstu.conference.service;
import org.springframework.stereotype.Service;
@Service
public class ConferenceNotificationService {
}

@ -0,0 +1,17 @@
package ru.ulstu.conference.service;
import org.springframework.stereotype.Service;
import ru.ulstu.conference.repository.ConferenceRepository;
import ru.ulstu.deadline.service.DeadlineService;
@Service
public class ConferenceService {
private final ConferenceRepository conferenceRepository;
private final DeadlineService deadlineService;
public ConferenceService(ConferenceRepository conferenceRepository,
DeadlineService deadlineService) {
this.conferenceRepository = conferenceRepository;
this.deadlineService = deadlineService;
}
}

@ -10,10 +10,11 @@ public class MvcConfiguration implements WebMvcConfigurer {
@Override @Override
public void addViewControllers(ViewControllerRegistry registry) { public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/{articlename:\\w+}"); registry.addViewController("/{articlename:\\w+}");
//registry.addViewController("/admin/{articlename:\\w+}"); registry.addViewController("/admin/{articlename:\\w+}");
registry.addViewController("/papers/{articlename:\\w+}"); registry.addViewController("/papers/{articlename:\\w+}");
registry.addViewController("/grants/{articlename:\\w+}"); registry.addViewController("/grants/{articlename:\\w+}");
registry.addViewController("/conferences/{articlename:\\w+}"); registry.addViewController("/conferences/{articlename:\\w+}");
registry.addViewController("/students/{articlename:\\w+}");
registry.addRedirectViewController("/", "/index"); registry.addRedirectViewController("/", "/index");
registry.addRedirectViewController("/default", "/index"); registry.addRedirectViewController("/default", "/index");
} }

@ -13,6 +13,7 @@ import org.springframework.web.multipart.MultipartFile;
import ru.ulstu.configuration.Constants; import ru.ulstu.configuration.Constants;
import ru.ulstu.core.model.response.Response; import ru.ulstu.core.model.response.Response;
import ru.ulstu.file.model.FileData; import ru.ulstu.file.model.FileData;
import ru.ulstu.file.model.FileDataDto;
import ru.ulstu.file.service.FileService; import ru.ulstu.file.service.FileService;
import java.io.IOException; import java.io.IOException;
@ -51,7 +52,7 @@ public class FileController {
} }
@PostMapping("/uploadTmpFile") @PostMapping("/uploadTmpFile")
public Response<String> upload(@RequestParam("file") MultipartFile multipartFile) throws IOException { public Response<FileDataDto> upload(@RequestParam("file") MultipartFile multipartFile) throws IOException {
return new Response(fileService.uploadToTmpDir(multipartFile)); return new Response(fileService.createFromMultipartFile(multipartFile));
} }
} }

@ -0,0 +1,76 @@
package ru.ulstu.file.model;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class FileDataDto {
private Integer id;
private String name;
private String fileName;
private String tmpFileName;
private boolean deleted;
public FileDataDto() {
}
@JsonCreator
public FileDataDto(@JsonProperty("id") Integer id,
@JsonProperty("name") String name,
@JsonProperty("fileName") String fileName,
@JsonProperty("tmpFileName") String tmpFileName) {
this.id = id;
this.name = name;
this.fileName = fileName;
this.tmpFileName = tmpFileName;
}
public FileDataDto(FileData fileData) {
this.id = fileData.getId();
this.name = fileData.getName();
}
public FileDataDto(String fileName, String tmpFileName) {
this.fileName = fileName;
this.tmpFileName = tmpFileName;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getTmpFileName() {
return tmpFileName;
}
public void setTmpFileName(String tmpFileName) {
this.tmpFileName = tmpFileName;
}
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
}

@ -1,15 +1,20 @@
package ru.ulstu.file.service; package ru.ulstu.file.service;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import ru.ulstu.file.model.FileData; import ru.ulstu.file.model.FileData;
import ru.ulstu.file.model.FileDataDto;
import ru.ulstu.file.repostory.FileRepository; import ru.ulstu.file.repostory.FileRepository;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.UUID;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
@ -29,13 +34,13 @@ public class FileService {
public FileData createFileFromTmp(String tmpFileName) throws IOException { public FileData createFileFromTmp(String tmpFileName) throws IOException {
FileData fileData = new FileData(); FileData fileData = new FileData();
fileData.setData(getTmpFile(tmpFileName)); fileData.setData(getTmpFile(tmpFileName));
fileData.setName(getTmpFileName(tmpFileName)); fileData.setSize(getTmpFileSize(tmpFileName));
fileData.setCreateDate(new Date()); fileData.setCreateDate(new Date());
return fileRepository.save(fileData); return fileRepository.save(fileData);
} }
public String uploadToTmpDir(MultipartFile multipartFile) throws IOException { public String uploadToTmpDir(MultipartFile multipartFile) throws IOException {
String tmpFileName = String.valueOf(System.currentTimeMillis()); String tmpFileName = String.valueOf(System.currentTimeMillis()) + UUID.randomUUID();
Files.write(getTmpFilePath(tmpFileName), multipartFile.getBytes()); Files.write(getTmpFilePath(tmpFileName), multipartFile.getBytes());
String meta = multipartFile.getOriginalFilename() + "\n" + multipartFile.getSize(); String meta = multipartFile.getOriginalFilename() + "\n" + multipartFile.getSize();
Files.write(getTmpFileMetaPath(tmpFileName), meta.getBytes(UTF_8)); Files.write(getTmpFileMetaPath(tmpFileName), meta.getBytes(UTF_8));
@ -78,4 +83,39 @@ public class FileService {
public void deleteFile(FileData fileData) { public void deleteFile(FileData fileData) {
fileRepository.delete(fileData); fileRepository.delete(fileData);
} }
public List<FileData> saveOrCreate(List<FileDataDto> fileDtos) throws IOException {
List<FileData> files = new ArrayList<>();
for (FileDataDto file : fileDtos) {
files.add(file.getId() != null ? update(file) : create(file));
}
return files;
}
@Transactional
public FileData update(FileDataDto fileDataDto) {
FileData file = fileRepository.findOne(fileDataDto.getId());
return fileRepository.save(copyFromDto(file, fileDataDto));
}
@Transactional
public FileData create(FileDataDto fileDataDto) throws IOException {
FileData newFile = createFileFromTmp(fileDataDto.getTmpFileName());
copyFromDto(newFile, fileDataDto);
return fileRepository.save(newFile);
}
private FileData copyFromDto(FileData fileData, FileDataDto fileDataDto) {
fileData.setName(fileDataDto.getName());
return fileData;
}
@Transactional
public void delete(Integer fileId) {
fileRepository.delete(fileRepository.findOne(fileId));
}
public FileDataDto createFromMultipartFile(MultipartFile multipartFile) throws IOException {
return new FileDataDto(multipartFile.getOriginalFilename(), uploadToTmpDir(multipartFile));
}
} }

@ -13,6 +13,7 @@ import ru.ulstu.deadline.model.Deadline;
import ru.ulstu.grant.model.Grant; import ru.ulstu.grant.model.Grant;
import ru.ulstu.grant.model.GrantDto; import ru.ulstu.grant.model.GrantDto;
import ru.ulstu.grant.service.GrantService; import ru.ulstu.grant.service.GrantService;
import springfox.documentation.annotations.ApiIgnore;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
@ -28,6 +29,7 @@ import static ru.ulstu.grant.controller.Navigation.hasErrors;
@Controller() @Controller()
@RequestMapping(value = "/grants") @RequestMapping(value = "/grants")
@ApiIgnore
public class GrantController { public class GrantController {
private final GrantService grantService; private final GrantService grantService;

@ -6,9 +6,11 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import ru.ulstu.core.controller.AdviceController; import ru.ulstu.core.controller.AdviceController;
import ru.ulstu.user.service.UserService; import ru.ulstu.user.service.UserService;
import springfox.documentation.annotations.ApiIgnore;
@Controller() @Controller()
@RequestMapping(value = "/index") @RequestMapping(value = "/index")
@ApiIgnore
public class IndexController extends AdviceController { public class IndexController extends AdviceController {
public IndexController(UserService userService) { public IndexController(UserService userService) {
super(userService); super(userService);

@ -15,6 +15,7 @@ import ru.ulstu.paper.model.PaperDto;
import ru.ulstu.paper.model.PaperFilterDto; import ru.ulstu.paper.model.PaperFilterDto;
import ru.ulstu.paper.service.PaperService; import ru.ulstu.paper.service.PaperService;
import ru.ulstu.user.model.User; import ru.ulstu.user.model.User;
import springfox.documentation.annotations.ApiIgnore;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
@ -28,6 +29,7 @@ import static org.springframework.util.StringUtils.isEmpty;
@Controller() @Controller()
@RequestMapping(value = "/papers") @RequestMapping(value = "/papers")
@ApiIgnore
public class PaperController { public class PaperController {
private final PaperService paperService; private final PaperService paperService;

@ -6,6 +6,7 @@ import ru.ulstu.core.model.BaseEntity;
import ru.ulstu.core.model.UserContainer; import ru.ulstu.core.model.UserContainer;
import ru.ulstu.deadline.model.Deadline; import ru.ulstu.deadline.model.Deadline;
import ru.ulstu.file.model.FileData; import ru.ulstu.file.model.FileData;
import ru.ulstu.timeline.model.Event;
import ru.ulstu.user.model.User; import ru.ulstu.user.model.User;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
@ -16,7 +17,6 @@ import javax.persistence.Enumerated;
import javax.persistence.FetchType; import javax.persistence.FetchType;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany; import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import javax.persistence.OrderBy; import javax.persistence.OrderBy;
import javax.persistence.Temporal; import javax.persistence.Temporal;
@ -75,11 +75,18 @@ public class Paper extends BaseEntity implements UserContainer {
private String comment; private String comment;
private String url;
private Boolean locked = false; private Boolean locked = false;
@ManyToOne @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "file_id") @JoinColumn(name = "paper_id")
private FileData fileData; private List<Event> events = new ArrayList<>();
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "paper_id", unique = true)
@Fetch(FetchMode.SUBSELECT)
private List<FileData> files = new ArrayList<>();
@ManyToMany(fetch = FetchType.EAGER) @ManyToMany(fetch = FetchType.EAGER)
private Set<User> authors = new HashSet<>(); private Set<User> authors = new HashSet<>();
@ -132,12 +139,12 @@ public class Paper extends BaseEntity implements UserContainer {
this.locked = locked; this.locked = locked;
} }
public FileData getFileData() { public List<FileData> getFiles() {
return fileData; return files;
} }
public void setFileData(FileData fileData) { public void setFiles(List<FileData> files) {
this.fileData = fileData; this.files = files;
} }
public String getTitle() { public String getTitle() {
@ -156,6 +163,22 @@ public class Paper extends BaseEntity implements UserContainer {
this.authors = authors; this.authors = authors;
} }
public List<Event> getEvents() {
return events;
}
public void setEvents(List<Event> events) {
this.events = events;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override @Override
public Set<User> getUsers() { public Set<User> getUsers() {
return getAuthors(); return getAuthors();

@ -3,6 +3,7 @@ package ru.ulstu.paper.model;
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import ru.ulstu.file.model.FileDataDto;
import ru.ulstu.deadline.model.Deadline; import ru.ulstu.deadline.model.Deadline;
import ru.ulstu.user.model.UserDto; import ru.ulstu.user.model.UserDto;
@ -29,11 +30,9 @@ public class PaperDto {
@NotEmpty @NotEmpty
private List<Deadline> deadlines = new ArrayList<>(); private List<Deadline> deadlines = new ArrayList<>();
private String comment; private String comment;
private String url;
private Boolean locked; private Boolean locked;
private String tmpFileName; private List<FileDataDto> files = new ArrayList<>();
private Integer fileId;
private String fileName;
private Date fileCreateDate;
private Set<Integer> authorIds; private Set<Integer> authorIds;
private Set<UserDto> authors; private Set<UserDto> authors;
private Integer filterAuthorId; private Integer filterAuthorId;
@ -50,8 +49,9 @@ public class PaperDto {
@JsonProperty("updateDate") Date updateDate, @JsonProperty("updateDate") Date updateDate,
@JsonProperty("deadlines") List<Deadline> deadlines, @JsonProperty("deadlines") List<Deadline> deadlines,
@JsonProperty("comment") String comment, @JsonProperty("comment") String comment,
@JsonProperty("url") String url,
@JsonProperty("locked") Boolean locked, @JsonProperty("locked") Boolean locked,
@JsonProperty("tmpFileName") String tmpFileName, @JsonProperty("files") List<FileDataDto> files,
@JsonProperty("authorIds") Set<Integer> authorIds, @JsonProperty("authorIds") Set<Integer> authorIds,
@JsonProperty("authors") Set<UserDto> authors) { @JsonProperty("authors") Set<UserDto> authors) {
this.id = id; this.id = id;
@ -61,11 +61,9 @@ public class PaperDto {
this.updateDate = updateDate; this.updateDate = updateDate;
this.deadlines = deadlines; this.deadlines = deadlines;
this.comment = comment; this.comment = comment;
this.url = url;
this.locked = locked; this.locked = locked;
this.tmpFileName = tmpFileName; this.files = files;
this.fileId = null;
this.fileName = null;
this.fileCreateDate = null;
this.authors = authors; this.authors = authors;
} }
@ -77,11 +75,9 @@ public class PaperDto {
this.updateDate = paper.getUpdateDate(); this.updateDate = paper.getUpdateDate();
this.deadlines = paper.getDeadlines(); this.deadlines = paper.getDeadlines();
this.comment = paper.getComment(); this.comment = paper.getComment();
this.url = paper.getUrl();
this.locked = paper.getLocked(); this.locked = paper.getLocked();
this.tmpFileName = null; this.files = convert(paper.getFiles(), FileDataDto::new);
this.fileId = paper.getFileData() == null ? null : paper.getFileData().getId();
this.fileName = paper.getFileData() == null ? null : paper.getFileData().getName();
this.fileCreateDate = paper.getFileData() == null ? null : paper.getFileData().getCreateDate();
this.authorIds = convert(paper.getAuthors(), user -> user.getId()); this.authorIds = convert(paper.getAuthors(), user -> user.getId());
this.authors = convert(paper.getAuthors(), UserDto::new); this.authors = convert(paper.getAuthors(), UserDto::new);
} }
@ -150,36 +146,12 @@ public class PaperDto {
this.locked = locked; this.locked = locked;
} }
public String getTmpFileName() { public List<FileDataDto> getFiles() {
return tmpFileName; return files;
} }
public void setTmpFileName(String tmpFileName) { public void setFiles(List<FileDataDto> files) {
this.tmpFileName = tmpFileName; this.files = files;
}
public Integer getFileId() {
return fileId;
}
public void setFileId(Integer fileId) {
this.fileId = fileId;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public Date getFileCreateDate() {
return fileCreateDate;
}
public void setFileCreateDate(Date fileCreateDate) {
this.fileCreateDate = fileCreateDate;
} }
public Set<UserDto> getAuthors() { public Set<UserDto> getAuthors() {
@ -198,6 +170,14 @@ public class PaperDto {
this.authorIds = authorIds; this.authorIds = authorIds;
} }
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getAuthorsString() { public String getAuthorsString() {
return StringUtils.abbreviate(authors return StringUtils.abbreviate(authors
.stream() .stream()

@ -5,11 +5,13 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import ru.ulstu.deadline.model.Deadline; import ru.ulstu.deadline.model.Deadline;
import ru.ulstu.deadline.service.DeadlineService; import ru.ulstu.deadline.service.DeadlineService;
import ru.ulstu.file.model.FileDataDto;
import ru.ulstu.file.service.FileService; import ru.ulstu.file.service.FileService;
import ru.ulstu.paper.model.Paper; import ru.ulstu.paper.model.Paper;
import ru.ulstu.paper.model.PaperDto; import ru.ulstu.paper.model.PaperDto;
import ru.ulstu.paper.model.PaperFilterDto; import ru.ulstu.paper.model.PaperFilterDto;
import ru.ulstu.paper.repository.PaperRepository; import ru.ulstu.paper.repository.PaperRepository;
import ru.ulstu.timeline.service.EventService;
import ru.ulstu.user.model.User; import ru.ulstu.user.model.User;
import ru.ulstu.user.service.UserService; import ru.ulstu.user.service.UserService;
@ -19,8 +21,8 @@ import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;
import static org.springframework.util.ObjectUtils.isEmpty; import static org.springframework.util.ObjectUtils.isEmpty;
import static ru.ulstu.core.util.StreamApiUtils.convert; import static ru.ulstu.core.util.StreamApiUtils.convert;
import static ru.ulstu.paper.model.Paper.PaperStatus.ATTENTION; import static ru.ulstu.paper.model.Paper.PaperStatus.ATTENTION;
@ -38,17 +40,20 @@ public class PaperService {
private final UserService userService; private final UserService userService;
private final DeadlineService deadlineService; private final DeadlineService deadlineService;
private final FileService fileService; private final FileService fileService;
private final EventService eventService;
public PaperService(PaperRepository paperRepository, public PaperService(PaperRepository paperRepository,
FileService fileService, FileService fileService,
PaperNotificationService paperNotificationService, PaperNotificationService paperNotificationService,
UserService userService, UserService userService,
DeadlineService deadlineService) { DeadlineService deadlineService,
EventService eventService) {
this.paperRepository = paperRepository; this.paperRepository = paperRepository;
this.fileService = fileService; this.fileService = fileService;
this.paperNotificationService = paperNotificationService; this.paperNotificationService = paperNotificationService;
this.userService = userService; this.userService = userService;
this.deadlineService = deadlineService; this.deadlineService = deadlineService;
this.eventService = eventService;
} }
public List<Paper> findAll() { public List<Paper> findAll() {
@ -65,7 +70,7 @@ public class PaperService {
return findAllDto() return findAllDto()
.stream() .stream()
.filter(paper -> paper.getStatus() != COMPLETED && paper.getStatus() != FAILED) .filter(paper -> paper.getStatus() != COMPLETED && paper.getStatus() != FAILED)
.collect(Collectors.toList()); .collect(toList());
} }
public PaperDto findOneDto(Integer id) { public PaperDto findOneDto(Integer id) {
@ -77,20 +82,22 @@ public class PaperService {
Paper newPaper = copyFromDto(new Paper(), paperDto); Paper newPaper = copyFromDto(new Paper(), paperDto);
newPaper = paperRepository.save(newPaper); newPaper = paperRepository.save(newPaper);
paperNotificationService.sendCreateNotification(newPaper); paperNotificationService.sendCreateNotification(newPaper);
eventService.createFromPaper(newPaper);
return newPaper.getId(); return newPaper.getId();
} }
private Paper copyFromDto(Paper paper, PaperDto paperDto) throws IOException { private Paper copyFromDto(Paper paper, PaperDto paperDto) throws IOException {
paper.setComment(paperDto.getComment()); paper.setComment(paperDto.getComment());
paper.setUrl(paperDto.getUrl());
paper.setCreateDate(paper.getCreateDate() == null ? new Date() : paper.getCreateDate()); paper.setCreateDate(paper.getCreateDate() == null ? new Date() : paper.getCreateDate());
paper.setLocked(paperDto.getLocked()); paper.setLocked(paperDto.getLocked());
paper.setStatus(paperDto.getStatus() == null ? DRAFT : paperDto.getStatus()); paper.setStatus(paperDto.getStatus() == null ? DRAFT : paperDto.getStatus());
paper.setTitle(paperDto.getTitle()); paper.setTitle(paperDto.getTitle());
paper.setUpdateDate(new Date()); paper.setUpdateDate(new Date());
paper.setDeadlines(deadlineService.saveOrCreate(paperDto.getDeadlines())); paper.setDeadlines(deadlineService.saveOrCreate(paperDto.getDeadlines()));
if (paperDto.getTmpFileName() != null) { paper.setFiles(fileService.saveOrCreate(paperDto.getFiles().stream()
paper.setFileData(fileService.createFileFromTmp(paperDto.getTmpFileName())); .filter(f -> !f.isDeleted())
} .collect(toList())));
paper.getAuthors().clear(); paper.getAuthors().clear();
if (paperDto.getAuthorIds() != null && !paperDto.getAuthorIds().isEmpty()) { if (paperDto.getAuthorIds() != null && !paperDto.getAuthorIds().isEmpty()) {
paperDto.getAuthorIds().forEach(authorIds -> paper.getAuthors().add(userService.findById(authorIds))); paperDto.getAuthorIds().forEach(authorIds -> paper.getAuthors().add(userService.findById(authorIds)));
@ -103,10 +110,14 @@ public class PaperService {
Paper paper = paperRepository.getOne(paperDto.getId()); Paper paper = paperRepository.getOne(paperDto.getId());
Paper.PaperStatus oldStatus = paper.getStatus(); Paper.PaperStatus oldStatus = paper.getStatus();
Set<User> oldAuthors = new HashSet<>(paper.getAuthors()); Set<User> oldAuthors = new HashSet<>(paper.getAuthors());
if (paperDto.getTmpFileName() != null && paper.getFileData() != null) {
fileService.deleteFile(paper.getFileData()); for (FileDataDto file : paperDto.getFiles().stream()
.filter(f -> f.isDeleted() && f.getId() != null)
.collect(toList())) {
fileService.delete(file.getId());
} }
paperRepository.save(copyFromDto(paper, paperDto)); paperRepository.save(copyFromDto(paper, paperDto));
eventService.updatePaperDeadlines(paper);
paper.getAuthors().forEach(author -> { paper.getAuthors().forEach(author -> {
if (!oldAuthors.contains(author)) { if (!oldAuthors.contains(author)) {
@ -124,9 +135,6 @@ public class PaperService {
@Transactional @Transactional
public void delete(Integer paperId) throws IOException { public void delete(Integer paperId) throws IOException {
Paper paper = paperRepository.getOne(paperId); Paper paper = paperRepository.getOne(paperId);
if (paper.getFileData() != null) {
fileService.deleteFile(paper.getFileData());
}
paperRepository.delete(paper); paperRepository.delete(paper);
} }
@ -146,6 +154,7 @@ public class PaperService {
paper = paperRepository.save(paper); paper = paperRepository.save(paper);
paperNotificationService.sendCreateNotification(paper); paperNotificationService.sendCreateNotification(paper);
eventService.createFromPaper(paper);
return paper; return paper;
} }
@ -165,7 +174,7 @@ public class PaperService {
return statusCompareResult; return statusCompareResult;
} }
return paper1.getTitle().compareTo(paper2.getTitle()); return paper1.getTitle().compareTo(paper2.getTitle());
}).collect(Collectors.toList()); }).collect(toList());
} }
public PaperDto findPaper(int id) { public PaperDto findPaper(int id) {
@ -179,7 +188,7 @@ public class PaperService {
&& (paper.getStatus() == ON_PREPARATION && (paper.getStatus() == ON_PREPARATION
|| paper.getStatus() == DRAFT || paper.getStatus() == DRAFT
|| paper.getStatus() == ATTENTION)) || paper.getStatus() == ATTENTION))
.collect(Collectors.toList()); .collect(toList());
papers.forEach(paper -> { papers.forEach(paper -> {
Paper.PaperStatus oldStatus = paper.getStatus(); Paper.PaperStatus oldStatus = paper.getStatus();
paper.setStatus(Paper.PaperStatus.FAILED); paper.setStatus(Paper.PaperStatus.FAILED);

@ -1,6 +1,8 @@
package ru.ulstu.timeline.model; package ru.ulstu.timeline.model;
import org.hibernate.validator.constraints.NotBlank;
import ru.ulstu.core.model.BaseEntity; import ru.ulstu.core.model.BaseEntity;
import ru.ulstu.paper.model.Paper;
import ru.ulstu.user.model.User; import ru.ulstu.user.model.User;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
@ -15,7 +17,6 @@ import javax.persistence.ManyToOne;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import javax.persistence.Temporal; import javax.persistence.Temporal;
import javax.persistence.TemporalType; import javax.persistence.TemporalType;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -71,6 +72,10 @@ public class Event extends BaseEntity {
@JoinColumn(name = "child_id") @JoinColumn(name = "child_id")
private List<Event> parents; private List<Event> parents;
@ManyToOne
@JoinColumn(name = "paper_id")
private Paper paper;
public String getTitle() { public String getTitle() {
return title; return title;
} }
@ -150,4 +155,12 @@ public class Event extends BaseEntity {
public void setParents(List<Event> parents) { public void setParents(List<Event> parents) {
this.parents = parents; this.parents = parents;
} }
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
} }

@ -2,9 +2,10 @@ package ru.ulstu.timeline.model;
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import javax.validation.constraints.NotBlank;
import ru.ulstu.paper.model.PaperDto;
import ru.ulstu.user.model.UserDto; import ru.ulstu.user.model.UserDto;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -23,6 +24,7 @@ public class EventDto {
private final Date updateDate; private final Date updateDate;
private final String description; private final String description;
private final List<UserDto> recipients; private final List<UserDto> recipients;
private PaperDto paperDto;
@JsonCreator @JsonCreator
public EventDto(@JsonProperty("id") Integer id, public EventDto(@JsonProperty("id") Integer id,
@ -33,6 +35,7 @@ public class EventDto {
@JsonProperty("createDate") Date createDate, @JsonProperty("createDate") Date createDate,
@JsonProperty("updateDate") Date updateDate, @JsonProperty("updateDate") Date updateDate,
@JsonProperty("description") String description, @JsonProperty("description") String description,
@JsonProperty("paperDto") PaperDto paperDto,
@JsonProperty("recipients") List<UserDto> recipients) { @JsonProperty("recipients") List<UserDto> recipients) {
this.id = id; this.id = id;
this.title = title; this.title = title;
@ -43,6 +46,7 @@ public class EventDto {
this.updateDate = updateDate; this.updateDate = updateDate;
this.description = description; this.description = description;
this.recipients = recipients; this.recipients = recipients;
this.paperDto = paperDto;
} }
public EventDto(Event event) { public EventDto(Event event) {
@ -54,6 +58,7 @@ public class EventDto {
this.createDate = event.getCreateDate(); this.createDate = event.getCreateDate();
this.updateDate = event.getUpdateDate(); this.updateDate = event.getUpdateDate();
this.description = event.getDescription(); this.description = event.getDescription();
this.paperDto = new PaperDto(event.getPaper());
this.recipients = convert(event.getRecipients(), UserDto::new); this.recipients = convert(event.getRecipients(), UserDto::new);
} }
@ -92,4 +97,12 @@ public class EventDto {
public Date getExecuteDate() { public Date getExecuteDate() {
return executeDate; return executeDate;
} }
public PaperDto getPaperDto() {
return paperDto;
}
public void setPaperDto(PaperDto paperDto) {
this.paperDto = paperDto;
}
} }

@ -6,6 +6,7 @@ import javax.persistence.CascadeType;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Entity @Entity
@ -13,7 +14,7 @@ public class Timeline extends BaseEntity {
@OneToMany(cascade = CascadeType.ALL) @OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "timeline_id") @JoinColumn(name = "timeline_id")
private List<Event> events; private List<Event> events = new ArrayList<>();
public List<Event> getEvents() { public List<Event> getEvents() {
return events; return events;

@ -2,6 +2,7 @@ package ru.ulstu.timeline.repository;
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;
import ru.ulstu.paper.model.Paper;
import ru.ulstu.timeline.model.Event; import ru.ulstu.timeline.model.Event;
import java.util.List; import java.util.List;
@ -12,4 +13,6 @@ public interface EventRepository extends JpaRepository<Event, Integer> {
@Query("SELECT e FROM Event e WHERE e.executeDate > CURRENT_DATE ORDER BY e.executeDate") @Query("SELECT e FROM Event e WHERE e.executeDate > CURRENT_DATE ORDER BY e.executeDate")
List<Event> findAllFuture(); List<Event> findAllFuture();
List<Event> findAllByPaper(Paper paper);
} }

@ -34,6 +34,10 @@ public class EventScheduler {
Map<String, Object> variables = ImmutableMap.of("description", event.getDescription()); Map<String, Object> variables = ImmutableMap.of("description", event.getDescription());
event.getRecipients() event.getRecipients()
.forEach(recipient -> mailService.sendEmailFromTemplate(variables, recipient, "eventNotification", event.getTitle())); .forEach(recipient -> mailService.sendEmailFromTemplate(variables, recipient, "eventNotification", event.getTitle()));
if (event.getPeriod() == null) {
event.setStatus(Event.EventStatus.COMPLETED);
eventService.save(event);
}
}); });
} }

@ -1,15 +1,22 @@
package ru.ulstu.timeline.service; package ru.ulstu.timeline.service;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import ru.ulstu.deadline.model.Deadline;
import ru.ulstu.paper.model.Paper;
import ru.ulstu.timeline.model.Event; import ru.ulstu.timeline.model.Event;
import ru.ulstu.timeline.model.EventDto; import ru.ulstu.timeline.model.EventDto;
import ru.ulstu.timeline.model.Timeline;
import ru.ulstu.timeline.repository.EventRepository; import ru.ulstu.timeline.repository.EventRepository;
import ru.ulstu.user.model.UserDto; import ru.ulstu.user.model.UserDto;
import ru.ulstu.user.service.UserService; import ru.ulstu.user.service.UserService;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import static ru.ulstu.core.util.StreamApiUtils.convert; import static ru.ulstu.core.util.StreamApiUtils.convert;
@ -17,11 +24,14 @@ import static ru.ulstu.core.util.StreamApiUtils.convert;
public class EventService { public class EventService {
private final EventRepository eventRepository; private final EventRepository eventRepository;
private final TimelineService timelineService;
private final UserService userService; private final UserService userService;
public EventService(EventRepository eventRepository, public EventService(EventRepository eventRepository,
@Lazy TimelineService timelineService,
UserService userService) { UserService userService) {
this.eventRepository = eventRepository; this.eventRepository = eventRepository;
this.timelineService = timelineService;
this.userService = userService; this.userService = userService;
} }
@ -56,6 +66,11 @@ public class EventService {
return eventRepository.save(copyFromDto(event, eventDto)).getId(); return eventRepository.save(copyFromDto(event, eventDto)).getId();
} }
@Transactional
public Event save(Event event) {
return eventRepository.save(event);
}
@Transactional @Transactional
public void delete(Integer eventId) { public void delete(Integer eventId) {
Event event = eventRepository.getOne(eventId); Event event = eventRepository.getOne(eventId);
@ -84,6 +99,36 @@ public class EventService {
eventRepository.save(parentEvent); eventRepository.save(parentEvent);
} }
public void createFromPaper(Paper newPaper) {
List<Timeline> timelines = timelineService.findAll();
Timeline timeline = timelines.isEmpty() ? new Timeline() : timelines.get(0);
for (Deadline deadline : newPaper.getDeadlines()
.stream()
.filter(d -> d.getDate().after(new Date()) || DateUtils.isSameDay(d.getDate(), new Date()))
.collect(Collectors.toList())) {
Event newEvent = new Event();
newEvent.setTitle("Дедлайн статьи");
newEvent.setStatus(Event.EventStatus.NEW);
newEvent.setExecuteDate(deadline.getDate());
newEvent.setCreateDate(new Date());
newEvent.setUpdateDate(new Date());
newEvent.setDescription("Дедлайн '" + deadline.getDescription() + "' cтатьи '" + newPaper.getTitle() + "'");
newEvent.setRecipients(new ArrayList(newPaper.getAuthors()));
newEvent.setPaper(newPaper);
eventRepository.save(newEvent);
timeline.getEvents().add(newEvent);
timelineService.save(timeline);
}
}
public void updatePaperDeadlines(Paper paper) {
eventRepository.delete(eventRepository.findAllByPaper(paper));
createFromPaper(paper);
}
public List<Event> findByCurrentDate() { public List<Event> findByCurrentDate() {
return eventRepository.findByCurrentDate(); return eventRepository.findByCurrentDate();
} }

@ -23,15 +23,24 @@ public class TimelineService {
this.eventService = eventService; this.eventService = eventService;
} }
public List<TimelineDto> findAll() { public List<TimelineDto> findAllDto() {
return convert(timelineRepository.findAll(), TimelineDto::new); return convert(timelineRepository.findAll(), TimelineDto::new);
} }
public List<Timeline> findAll() {
return timelineRepository.findAll();
}
@Transactional @Transactional
public int create(TimelineDto timelineDto) { public int create(TimelineDto timelineDto) {
return timelineRepository.save(copyFromDto(new Timeline(), timelineDto)).getId(); return timelineRepository.save(copyFromDto(new Timeline(), timelineDto)).getId();
} }
@Transactional
public Timeline save(Timeline timeline) {
return timelineRepository.save(timeline);
}
private Timeline copyFromDto(Timeline timeline, TimelineDto timelineDto) { private Timeline copyFromDto(Timeline timeline, TimelineDto timelineDto) {
timeline.setEvents(eventService.findByIds(convert(timelineDto.getEvents(), EventDto::getId))); timeline.setEvents(eventService.findByIds(convert(timelineDto.getEvents(), EventDto::getId)));
return timeline; return timeline;

@ -1,489 +1,298 @@
Anton Romanov;Thu Mar 15 11:10:34 2018 +0400;change to date time Anton Romanov;Thu Mar 28 14:59:35 2019 +0400;partially restored commits page
romanov73;Thu Mar 15 11:03:19 2018 +0400;read commits in constructor Anton Romanov;Wed Mar 27 13:27:49 2019 +0400;#33 small external link
romanov73;Thu Mar 15 09:12:07 2018 +0400;add commits page Anton Romanov;Wed Mar 27 09:07:02 2019 +0000;Update README.md
Romanov Anton;Wed Mar 14 20:26:54 2018 +0000;Update README.md Anton Romanov;Wed Mar 27 07:58:58 2019 +0000;Merge branch '33-paper-url' into 'dev'
Romanov Anton;Wed Mar 14 20:16:53 2018 +0000;Update README.md Семенова Мария;Sat Mar 23 12:23:30 2019 +0400;#33 link in new tab
Romanov Anton;Wed Mar 14 20:08:09 2018 +0000;Update README.md Семенова Мария;Sat Mar 23 12:04:51 2019 +0400;Merge branch 'dev' into 33-paper-url
Romanov Anton;Wed Mar 14 20:00:58 2018 +0000;Update README.md Anton Romanov;Fri Mar 22 10:36:09 2019 +0000;Merge branch '13-paper-files' into 'dev'
Romanov Anton;Wed Mar 14 19:50:22 2018 +0000;Update README.md Anton Romanov;Fri Mar 22 13:58:03 2019 +0400;#13 reduce of code
Romanov Anton;Wed Mar 14 19:34:17 2018 +0000;Update README.md Anton Romanov;Fri Mar 22 13:52:06 2019 +0400;#13 fix condition
Romanov Anton;Wed Mar 14 19:20:42 2018 +0000;Update README.md Семенова Мария;Fri Mar 22 13:21:32 2019 +0400;#13 streams refactoring
Romanov Anton;Wed Mar 14 18:59:18 2018 +0000;Update README.md Семенова Мария;Fri Mar 22 09:32:21 2019 +0400;#13 rename 'deleted', move creating fileDto to service
Romanov Anton;Wed Mar 14 18:47:17 2018 +0000;Update README.md Семенова Мария;Thu Mar 21 18:26:28 2019 +0400;#13 fileDataDto instead of Object[]
Romanov Anton;Wed Mar 14 18:35:37 2018 +0000;Update README.md Семенова Мария;Tue Mar 19 17:59:19 2019 +0400;#13 some refactoring
Romanov Anton;Wed Mar 14 18:33:54 2018 +0000;Update README.md Семенова Мария;Tue Mar 19 17:41:02 2019 +0400;Merge branch 'dev' into 13-paper-files
Romanov Anton;Wed Mar 14 18:29:27 2018 +0000;Update README.md Семенова Мария;Mon Mar 18 23:31:33 2019 +0400;#33 url in paper
Romanov Anton;Wed Mar 14 18:21:18 2018 +0000;Update README.md Anton Romanov;Mon Mar 18 22:35:01 2019 +0400;merge deploy environments
Romanov Anton;Wed Mar 14 18:19:27 2018 +0000;Update README.md Anton Romanov;Mon Mar 18 22:25:28 2019 +0400;add environment
Romanov Anton;Wed Mar 14 18:16:06 2018 +0000;Update README.md Семенова Мария;Mon Mar 18 21:02:26 2019 +0400;#13 download files
romanov73;Wed Mar 14 21:28:10 2018 +0400;fix using constant Семенова Мария;Mon Mar 18 19:17:28 2019 +0400;#13 add files to db
Aleksey Filippov;Wed Mar 14 20:07:25 2018 +0400;some fixes after merge Семенова Мария;Mon Mar 18 18:39:15 2019 +0400;#13 addNewFile js function
Aleksey Filippov;Wed Mar 14 19:52:45 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into odin-ui Семенова Мария;Mon Mar 18 16:13:22 2019 +0400;Merge branch 'dev' into 13-paper-files
Aleksey Filippov;Wed Mar 14 19:48:45 2018 +0400;refactoring of odin paginator Семенова Мария;Mon Mar 18 16:02:55 2019 +0400;#13 file list on paper page
romanov73;Wed Mar 14 18:43:16 2018 +0400;Merge branch 'develop' into 36-rest Anton Romanov;Mon Mar 18 11:08:15 2019 +0000;Merge branch '50-refactorForGrants' into 'dev'
romanov73;Wed Mar 14 18:17:02 2018 +0400;Merge branch 'develop' into 36-rest T-Midnight;Mon Mar 18 14:27:54 2019 +0400;Delete DeadlineDTO and update usages
Aleksey Filippov;Wed Mar 14 18:11:00 2018 +0400;fix null value check in formatter Семенова Мария;Mon Mar 18 13:00:34 2019 +0400;#13 add fileDataDto
Aleksey Filippov;Wed Mar 14 18:06:16 2018 +0400;fix odin paginator style, fix odin negative file Семенова Мария;Mon Mar 18 11:07:30 2019 +0400;#13 change model, schema
romanov73;Wed Mar 14 18:04:47 2018 +0400;rename entities T-Midnight;Fri Mar 15 12:24:02 2019 +0400;Add new status for grant
Aleksey Filippov;Wed Mar 14 17:58:59 2018 +0400;improve odin table look T-Midnight;Fri Mar 15 12:19:25 2019 +0400;Rename title
romanov73;Wed Mar 14 17:47:45 2018 +0400;fix db changelogs T-Midnight;Fri Mar 15 12:19:01 2019 +0400;Create Navigation class to avoid "magic strings" and code duplication
romanov73;Wed Mar 14 17:47:20 2018 +0400;fix db changelogs Anton Romanov;Wed Mar 13 07:16:32 2019 +0000;Merge branch '72-link-to-timetable' into 'dev'
Gleb;Wed Mar 14 08:50:23 2018 +0000;Merge branch '48-' into 'develop' Anton Romanov;Tue Mar 12 14:44:11 2019 +0400;add patronymic
funny73;Wed Mar 14 12:28:55 2018 +0400;Поправил отображение подразделения при редактировании смены Anton Romanov;Tue Mar 12 13:40:48 2019 +0400;display user in filter
Aleksey Filippov;Wed Mar 14 00:02:24 2018 +0400;move navbar to the left, move odin css to separate file Anton Romanov;Tue Mar 12 12:51:59 2019 +0300;add service methods
Aleksey Filippov;Tue Mar 13 23:26:33 2018 +0400;some style fixes Anton Romanov;Tue Mar 12 12:35:09 2019 +0300;add timetable link
Aleksey Filippov;Tue Mar 13 23:22:37 2018 +0400;move version panel to navbar Anton Romanov;Mon Mar 11 10:49:07 2019 +0000;Merge branch '54-view-conference' into 'dev'
funny73;Tue Mar 13 20:41:41 2018 +0400;Поправил валидацию сменности Nightblade73;Mon Mar 11 14:43:32 2019 +0400;#54 deleted edit btn
romanov73;Tue Mar 13 17:26:54 2018 +0400;fix offsetable page request Nightblade73;Mon Mar 11 12:58:40 2019 +0400;#54 add back link, css fixes
romanov73;Tue Mar 13 17:26:02 2018 +0400;fix table constructor Nightblade73;Mon Mar 11 11:36:00 2019 +0400;#54 add custom paper-list
romanov73;Tue Mar 13 17:24:56 2018 +0400;fix checking empty value Nightblade73;Sun Mar 10 22:15:09 2019 +0400;#54 add custom deadline-list, add edit-button, add edit and delete icons
Romanov Anton;Tue Mar 13 13:09:41 2018 +0000;Merge branch 'odin-ui' into '36-rest' Nightblade73;Thu Mar 7 22:50:37 2019 +0400;#54 add member list
Aleksey Filippov;Tue Mar 13 16:59:27 2018 +0400;notes updated Nightblade73;Wed Mar 6 20:51:46 2019 +0400;#54 part of make-up
Aleksey Filippov;Tue Mar 13 16:56:00 2018 +0400;odin refactoring Nightblade73;Wed Mar 6 16:48:51 2019 +0400;#54 add transitions
Aleksey Filippov;Tue Mar 13 16:53:38 2018 +0400;odin refactoring Anton Romanov;Wed Mar 6 16:40:33 2019 +0400;fix login
romanov73;Tue Mar 13 15:27:17 2018 +0400;fix tool load calc Nightblade73;Wed Mar 6 16:27:25 2019 +0400;#50 creating html page, changing href
romanov73;Tue Mar 13 14:46:46 2018 +0400;fix area load calc Anton Romanov;Wed Mar 6 12:25:34 2019 +0000;Merge branch '29-page-header' into 'dev'
Aleksey Filippov;Tue Mar 13 13:38:23 2018 +0400;some fixes Anton Romanov;Wed Mar 6 16:19:43 2019 +0400;fix css
romanov73;Tue Mar 13 13:33:25 2018 +0400;Merge remote-tracking branch 'origin/develop' into develop Anton Romanov;Wed Mar 6 14:36:46 2019 +0300;fix props
romanov73;Tue Mar 13 13:33:07 2018 +0400;fix tools count calc Anton Romanov;Wed Mar 6 14:35:09 2019 +0300;fix props
Aleksey Filippov;Tue Mar 13 13:12:09 2018 +0400;some odin refactoring user;Wed Mar 6 14:25:02 2019 +0300;header fix
Aleksey Filippov;Tue Mar 13 13:11:41 2018 +0400;some offsetablepagerequest fix Anton Romanov;Mon Mar 4 10:28:46 2019 +0400;fix code
Aleksey Filippov;Tue Mar 13 13:06:48 2018 +0400;add offsetablepagerequest Anton Romanov;Mon Mar 4 10:24:30 2019 +0400;fix code
Aleksey Filippov;Tue Mar 13 07:27:12 2018 +0000;Merge branch '51-rest-points' into '36-rest' Anton Romanov;Fri Mar 1 11:27:57 2019 +0400;fix branch
romanov73;Tue Mar 13 11:22:02 2018 +0400;fix by comment: remove default version id Anton Romanov;Fri Mar 1 11:22:25 2019 +0400;add links to papers
romanov73;Tue Mar 13 00:04:50 2018 +0400;fix path Anton Romanov;Fri Mar 1 11:21:25 2019 +0400;add links to papers
romanov73;Mon Mar 12 23:55:05 2018 +0400;add tool square dictionary Anton Romanov;Sun Feb 3 14:54:02 2019 +0000;Update README.md
romanov73;Mon Mar 12 23:36:49 2018 +0400;add dictionary pages Anton Romanov;Thu Jan 17 01:01:26 2019 +0400;filter dashboard papers
romanov73;Mon Mar 12 23:18:01 2018 +0400;sort second level menu items by name Anton Romanov;Thu Jan 17 00:57:34 2019 +0400;fix failed conditions
romanov73;Mon Mar 12 23:11:22 2018 +0400;fix menu Anton Romanov;Tue Jan 8 19:55:27 2019 +0000;Update README.md
romanov73;Mon Mar 12 22:52:15 2018 +0400;add stream api utils and converter for "map ... collect" Anton Romanov;Tue Jan 8 19:36:36 2019 +0000;Update README.md
funny73;Mon Mar 12 20:01:47 2018 +0400;Добавил свойство базового изделия для изделия Anton Romanov;Sat Jan 5 08:01:07 2019 +0400;fix notifications
romanov73;Mon Mar 12 19:46:52 2018 +0400;refactor units Anton Romanov;Fri Jan 4 17:41:48 2019 +0400;fix notifications
romanov73;Mon Mar 12 19:36:57 2018 +0400;refactor tool types and work types Anton Romanov;Sun Dec 30 19:23:11 2018 +0400;some layout fix
romanov73;Mon Mar 12 19:20:23 2018 +0400;refactor tools Anton Romanov;Sun Dec 30 19:22:51 2018 +0400;sort deadlines
romanov73;Mon Mar 12 19:07:09 2018 +0400;refactor stages Anton Romanov;Sat Dec 29 09:58:37 2018 +0400;fix enum field name
romanov73;Mon Mar 12 18:53:26 2018 +0400;refactor positions Anton Romanov;Fri Dec 28 10:04:42 2018 +0000;Merge branch '35-' into 'master'
romanov73;Mon Mar 12 18:27:36 2018 +0400;refactor employees Anton Romanov;Fri Dec 28 14:00:09 2018 +0400;some refactor
romanov73;Mon Mar 12 18:26:49 2018 +0400;refactor employees Anton Romanov;Fri Dec 28 13:57:20 2018 +0400;some refactor
romanov73;Mon Mar 12 18:09:38 2018 +0400;refactor categories T-Midnight;Tue Dec 25 12:50:14 2018 +0400;Create model folder for grant
Aleksey Filippov;Mon Mar 12 17:32:06 2018 +0400;todo added T-Midnight;Tue Dec 25 02:44:50 2018 +0400;Hide button "Add Project" when project already exists (not perfect)
Aleksey Filippov;Mon Mar 12 17:29:51 2018 +0400;paginator added to odin T-Midnight;Tue Dec 25 00:14:38 2018 +0400;Made button "delete grant" visible
Aleksey Filippov;Mon Mar 12 17:29:06 2018 +0400;notes updated T-Midnight;Mon Dec 24 23:39:19 2018 +0400;Rename table grant to grants
funny73;Mon Mar 12 16:29:13 2018 +0400;Добавил сущность изделие без привязки к производственной программе T-Midnight;Mon Dec 24 15:20:57 2018 +0400;Update classes
funny73;Mon Mar 12 15:16:35 2018 +0400;Переименовал сущность Product на ProductOnProgram Ещё немного переименования T-Midnight;Mon Dec 24 15:18:52 2018 +0400;Add thymeleaf template
funny73;Mon Mar 12 14:39:52 2018 +0400;Переименовал сущность Product на ProductOnProgram T-Midnight;Mon Dec 24 13:05:37 2018 +0400;Create service&repository for Project
Aleksey Filippov;Mon Mar 12 13:44:42 2018 +0400;add formatters and initial form support to odin T-Midnight;Mon Dec 24 11:07:02 2018 +0400;Create js for grants
Aleksey Filippov;Mon Mar 12 13:44:16 2018 +0400;userlistdto refactoring T-Midnight;Mon Dec 24 11:03:03 2018 +0400;Create html fragments
Aleksey Filippov;Mon Mar 12 13:43:59 2018 +0400;dateutils improvements T-Midnight;Sun Dec 23 02:22:41 2018 +0400;Create Controller&Service
Aleksey Filippov;Mon Mar 12 13:43:43 2018 +0400;add support of localdatetime type to odin T-Midnight;Sun Dec 23 02:22:31 2018 +0400;Update ProjectDto
Aleksey Filippov;Mon Mar 12 13:42:54 2018 +0400;odin backend example added T-Midnight;Sun Dec 23 02:22:24 2018 +0400;Add constructor
Aleksey Filippov;Mon Mar 12 13:42:12 2018 +0400;notes updated T-Midnight;Sun Dec 23 02:22:06 2018 +0400;Add function getNextDeadline()
funny73;Mon Mar 12 12:16:02 2018 +0400;Поправил всплывающие сообщения при работе с "Категориями" T-Midnight;Sat Dec 22 18:03:18 2018 +0400;Create GrantRepository
Aleksey Filippov;Mon Mar 12 11:25:51 2018 +0400;some refactoring T-Midnight;Sat Dec 22 03:31:43 2018 +0400;Create setters for GrantDto
Aleksey Filippov;Mon Mar 12 11:25:30 2018 +0400;odinid annotation added Anton Romanov;Fri Dec 21 00:07:26 2018 +0400;fix display paper title
Aleksey Filippov;Sun Mar 11 15:23:49 2018 +0400;notes updated Anton Romanov;Thu Dec 20 23:30:25 2018 +0400;fix paper status template
Aleksey Filippov;Sun Mar 11 15:18:45 2018 +0400;some fixes Anton Romanov;Wed Dec 19 01:29:54 2018 +0400;try to fix template resolvers, step 4
Aleksey Filippov;Sun Mar 11 15:09:57 2018 +0400;simple table draw support added, some refactoring Anton Romanov;Wed Dec 19 01:00:08 2018 +0400;try to fix template resolvers, step 3
Aleksey Filippov;Sun Mar 11 15:08:22 2018 +0400;add user id field to userlistdto Anton Romanov;Wed Dec 19 00:44:12 2018 +0400;try to fix template resolvers, step 2
Aleksey Filippov;Sun Mar 11 14:32:50 2018 +0400;add jsonproperty annotation support Anton Romanov;Wed Dec 19 00:22:36 2018 +0400;try to fix template resolvers
Aleksey Filippov;Sun Mar 11 13:38:45 2018 +0400;some template fixes Anton Romanov;Wed Dec 19 00:11:39 2018 +0400;Merge remote-tracking branch 'origin/master'
Aleksey Filippov;Sun Mar 11 13:33:09 2018 +0400;some balance page fixes Anton Romanov;Wed Dec 19 00:09:07 2018 +0400;try to fix gradlew
Aleksey Filippov;Sun Mar 11 13:25:58 2018 +0400;add jsonignore annotation support Anton Romanov;Tue Dec 18 23:02:48 2018 +0400;sort filtered papers
Aleksey Filippov;Thu Mar 8 14:16:20 2018 +0400;some odin improvements Anton Romanov;Tue Dec 18 18:45:43 2018 +0000;Merge branch '47-statuses' into 'master'
Aleksey Filippov;Wed Mar 7 16:03:04 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest Anton Romanov;Tue Dec 18 22:42:34 2018 +0400;add statuses
Aleksey Filippov;Wed Mar 7 16:01:21 2018 +0400;odin submodule for basic types added, some refactoring Anton Romanov;Tue Dec 18 18:18:25 2018 +0000;Merge branch '46-mvc' into 'master'
romanov73;Tue Mar 6 22:52:02 2018 +0400;remove old packages Anton Romanov;Tue Dec 18 22:15:21 2018 +0400;fix filer
romanov73;Tue Mar 6 19:12:27 2018 +0400;add tool type crud Anton Romanov;Tue Dec 18 19:40:23 2018 +0400;fix scripts
romanov73;Tue Mar 6 13:09:51 2018 +0400;add version crud Anton Romanov;Tue Dec 18 19:23:15 2018 +0400;show authors
romanov73;Tue Mar 6 10:48:36 2018 +0400;add unit crud Anton Romanov;Tue Dec 18 18:47:15 2018 +0400;confirm delete paper
romanov73;Mon Mar 5 16:58:37 2018 +0400;fix tree Anton Romanov;Tue Dec 18 18:05:30 2018 +0400;add papers navigation
romanov73;Mon Mar 5 16:38:37 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest Anton Romanov;Mon Dec 17 17:56:48 2018 +0400;fix submit form
romanov73;Mon Mar 5 16:38:21 2018 +0400;employee crud Anton Romanov;Mon Dec 17 17:29:06 2018 +0400;fix email notification
Aleksey Filippov;Mon Mar 5 15:43:49 2018 +0400;some fixes Anton Romanov;Mon Dec 17 17:28:52 2018 +0400;fix route
Aleksey Filippov;Mon Mar 5 15:39:53 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest Anton Romanov;Mon Dec 17 13:46:08 2018 +0400;edit deadlines
Aleksey Filippov;Mon Mar 5 15:39:33 2018 +0400;user reset password function added, some refactoring Anton Romanov;Fri Dec 14 16:00:46 2018 +0400;Merge branch 'master' into 46-mvc
romanov73;Mon Mar 5 15:29:16 2018 +0400;fix delete category Anton Romanov;Fri Dec 14 16:00:33 2018 +0400;Merge branch 'master' into 46-mvc
Aleksey Filippov;Mon Mar 5 15:08:27 2018 +0400;user change password function added, some refactoring Anton Romanov;Tue Dec 11 11:14:21 2018 +0000;Merge branch '36-' into 'master'
romanov73;Mon Mar 5 15:08:17 2018 +0400;add category crud Anton Romanov;Tue Dec 11 15:08:35 2018 +0400;move classes, add deadline to entities, fix db changelogs
romanov73;Mon Mar 5 14:07:10 2018 +0400;add tree component T-Midnight;Sat Dec 8 23:53:38 2018 +0400;Create model for grant, deadline and project
Aleksey Filippov;Mon Mar 5 11:30:22 2018 +0400;user delete function added, some refactoring Anton Romanov;Wed Dec 5 18:08:47 2018 +0400;save authors
Aleksey Filippov;Mon Mar 5 11:18:23 2018 +0400;user update function added Anton Romanov;Wed Dec 5 17:36:53 2018 +0400;fix npe
Aleksey Filippov;Mon Mar 5 11:18:06 2018 +0400;some refactoring Anton Romanov;Wed Dec 5 17:06:56 2018 +0400;format dates
Aleksey Filippov;Mon Mar 5 10:06:04 2018 +0400;add user activation function Anton Romanov;Wed Dec 5 16:51:26 2018 +0400;fix create paper
Aleksey Filippov;Mon Mar 5 09:48:22 2018 +0400;add scheduler for users Anton Romanov;Wed Dec 5 06:00:33 2018 +0000;add rest controller
Aleksey Filippov;Mon Mar 5 09:48:07 2018 +0400;add activateddate field to userentity Anton Romanov;Tue Dec 4 14:49:23 2018 +0400;fix js
Aleksey Filippov;Mon Mar 5 09:47:25 2018 +0400;notes file updated Anton Romanov;Tue Dec 4 14:48:39 2018 +0400;show status
Aleksey Filippov;Mon Mar 5 09:47:11 2018 +0400;some refactoring Anton Romanov;Tue Dec 4 14:13:01 2018 +0400;add validation
Aleksey Filippov;Mon Mar 5 09:21:49 2018 +0400;thymeleaf cache settings added Anton Romanov;Tue Dec 4 11:35:51 2018 +0400;pass values for paper
Aleksey Filippov;Mon Mar 5 09:21:11 2018 +0400;notes file added Anton Romanov;Mon Nov 26 23:07:14 2018 +0400;load paper
Aleksey Filippov;Mon Mar 5 09:20:57 2018 +0400;some refactoring Anton Romanov;Fri Nov 23 16:40:15 2018 +0000;Merge branch '14-filter-frontend' into 'master'
Aleksey Filippov;Mon Mar 5 08:37:01 2018 +0400;some refactoring Anton Romanov;Fri Nov 23 20:37:24 2018 +0400;fix failed commit
romanov73;Mon Mar 5 00:08:02 2018 +0400;add callbacks on version getters Anton Romanov;Fri Nov 23 16:24:26 2018 +0000;Merge branch '10-savePaper' into 'master'
romanov73;Mon Mar 5 00:07:34 2018 +0400;fix npe Anton Romanov;Fri Nov 23 16:45:40 2018 +0400;show paper list in mvc
romanov73;Sun Mar 4 01:13:57 2018 +0400;fix column style Alyona;Fri Nov 23 14:17:16 2018 +0400;filter
romanov73;Sun Mar 4 01:06:38 2018 +0400;fix table style Alyona;Fri Nov 23 14:12:37 2018 +0400;Merge branch 'master' into 14-filter-frontend
romanov73;Sun Mar 4 00:27:14 2018 +0400;add balance dto + draw employee balance Alyona;Fri Nov 23 14:10:49 2018 +0400;Merge remote-tracking branch 'origin/master'
romanov73;Sat Mar 3 22:43:06 2018 +0400;add balance services Alyona;Fri Nov 23 14:10:36 2018 +0400;Merge branch 'master' of C:\Users\катя\IdeaProjects\ng-tracker with conflicts.
romanov73;Sat Mar 3 16:31:19 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest Elena;Fri Nov 23 14:05:23 2018 +0400;задача 10(new)
romanov73;Sat Mar 3 16:31:04 2018 +0400;add employee balance table Elena;Fri Nov 23 13:53:20 2018 +0400;задача 10
Aleksey Filippov;Sat Mar 3 15:54:23 2018 +0400;some user support improvements Elena;Fri Nov 23 12:39:36 2018 +0400;Merge branch 'master' into 10-savePaper
Aleksey Filippov;Sat Mar 3 15:53:20 2018 +0400;edit migration files, need manual fix of databasechangelog table Anton Romanov;Thu Nov 22 21:48:36 2018 +0400;fix colors
Aleksey Filippov;Sat Mar 3 15:51:58 2018 +0400;add application properties handler Anton Romanov;Thu Nov 22 21:31:41 2018 +0400;fix colors
Aleksey Filippov;Sat Mar 3 15:51:19 2018 +0400;disable tests Anton Romanov;Thu Nov 22 21:06:58 2018 +0400;add paper status
Aleksey Filippov;Sat Mar 3 13:49:32 2018 +0400;some refactoring Anton Romanov;Thu Nov 22 11:20:08 2018 +0400;Merge remote-tracking branch 'origin/master'
romanov73;Fri Mar 2 18:10:23 2018 +0400;add balance page Anton Romanov;Thu Nov 22 11:19:50 2018 +0400;add mertica
Aleksey Filippov;Fri Mar 2 18:04:39 2018 +0400;some refactoring Anton Romanov;Wed Nov 21 15:47:26 2018 +0400;remove empty page
Aleksey Filippov;Fri Mar 2 17:51:41 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest Anton Romanov;Wed Nov 21 15:47:14 2018 +0400;add toolbar
Aleksey Filippov;Fri Mar 2 17:50:59 2018 +0400;advicecontroller improvements Anton Romanov;Wed Nov 21 15:42:20 2018 +0400;Merge remote-tracking branch 'origin/master'
Aleksey Filippov;Fri Mar 2 17:50:39 2018 +0400;some mvc improvements Anton Romanov;Wed Nov 21 11:42:47 2018 +0000;Merge branch '31-' into 'master'
romanov73;Fri Mar 2 15:15:46 2018 +0400;add dtos Anton Romanov;Wed Nov 21 15:40:20 2018 +0400;close failed papers
romanov73;Fri Mar 2 15:02:38 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest T-Midnight;Wed Nov 21 15:28:41 2018 +0400;Create grant page
Aleksey Filippov;Fri Mar 2 14:54:33 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest Anton Romanov;Wed Nov 21 08:51:11 2018 +0000;Merge branch '30-main-grants-page' into 'master'
Aleksey Filippov;Fri Mar 2 14:53:39 2018 +0400;add migrations Anton Romanov;Wed Nov 21 12:46:42 2018 +0400;Merge remote-tracking branch 'origin/master'
Aleksey Filippov;Fri Mar 2 14:53:30 2018 +0400;some core improvements Anton Romanov;Wed Nov 21 12:46:27 2018 +0400;notify if paper deadline in future
Aleksey Filippov;Fri Mar 2 14:53:13 2018 +0400;some users improvements T-Midnight;Mon Nov 19 12:16:39 2018 +0400;Update dashboard for grants
romanov73;Fri Mar 2 12:42:54 2018 +0400;add category service Anton Romanov;Mon Nov 19 08:21:22 2018 +0400;fix for remove event
romanov73;Fri Mar 2 12:37:51 2018 +0400;fix unit service Anton Romanov;Mon Nov 19 07:46:02 2018 +0400;fix event create conditions
romanov73;Fri Mar 2 11:24:11 2018 +0400;add unit controller Anton Romanov;Sun Nov 18 14:29:41 2018 +0400;fix delete button
romanov73;Thu Mar 1 23:19:42 2018 +0400;fix versions panel Anton Romanov;Sat Nov 17 12:31:22 2018 +0400;fix delete button
romanov73;Thu Mar 1 22:50:57 2018 +0400;Merge branch 'develop' into 36-rest Anton Romanov;Sat Nov 17 11:56:52 2018 +0400;show events
romanov73;Thu Mar 1 22:50:37 2018 +0400;Merge branch 'develop' into 36-rest Anton Romanov;Wed Nov 14 17:14:56 2018 +0400;fix build script for netbeans
Romanov Anton;Thu Mar 1 18:31:03 2018 +0000;Merge branch '29-' into 'develop' Anton Romanov;Wed Nov 14 17:04:40 2018 +0400;show toolbar buttons
romanov73;Thu Mar 1 22:25:49 2018 +0400;change versions Anton Romanov;Wed Nov 14 17:04:29 2018 +0400;show toolbar buttons
romanov73;Thu Mar 1 20:14:22 2018 +0400;show version select Anton Romanov;Wed Nov 14 17:04:13 2018 +0400;show paper status
romanov73;Thu Mar 1 19:56:24 2018 +0400;add old models, add versions controller Anton Romanov;Wed Nov 14 17:03:22 2018 +0400;fix code
romanov73;Thu Mar 1 19:55:59 2018 +0400;add old models, add versions controller Anton Romanov;Wed Nov 14 15:18:22 2018 +0400;fix code
romanov73;Thu Mar 1 19:04:47 2018 +0400;save menu to session Anton Romanov;Wed Nov 14 15:15:23 2018 +0400;read dashboard
romanov73;Thu Mar 1 18:50:00 2018 +0400;add favicon Alyona;Wed Nov 14 08:55:46 2018 +0400;filter
funny73;Thu Mar 1 18:01:43 2018 +0400;1) Поправил имена колонок и таблицы для смен под постгрес 2) Исправил ошибку в имени переменной thidShift ->thirdShift Anton Romanov;Tue Nov 13 11:46:25 2018 +0000;Merge branch '14-DB-filter' into 'master'
romanov73;Thu Mar 1 16:03:03 2018 +0400;add menu and restore changelogs Anton Romanov;Tue Nov 13 15:41:18 2018 +0400;filter papers
funny73;Thu Mar 1 15:33:36 2018 +0400;Добавил распорядок смен для каждого подразделения. Смена назначается на месяц. Есть возможность сохранить любой вариант комбинирования 1,2 и 3 смены. Например (1,3); (2); ()... Добавлен интерфейс для просмотра и редактирования распорядка смен по каждому подразделению. Добавлена валидация - для каждого месяца может быть только один распорядок смен. Anton Romanov;Sun Nov 11 14:28:51 2018 +0400;Merge remote-tracking branch 'origin/master'
Aleksey Filippov;Thu Mar 1 15:23:06 2018 +0400;migrate to webjars Anton Romanov;Sun Nov 11 12:43:27 2018 +0400;move class
Aleksey Filippov;Thu Mar 1 13:31:16 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest Anton Romanov;Sat Nov 10 21:44:36 2018 +0000;Merge branch '20-' into 'master'
Aleksey Filippov;Thu Mar 1 13:30:55 2018 +0400;create migrations for user models Anton Romanov;Sun Nov 11 01:31:27 2018 +0400;fix scheduler
Aleksey Filippov;Thu Mar 1 13:30:09 2018 +0400;old code refactoring Anton Romanov;Sun Nov 11 01:29:06 2018 +0400;refactor and db changes
romanov73;Thu Mar 1 12:51:14 2018 +0400;add basic menu from rest Anton Romanov;Sat Nov 10 23:15:35 2018 +0400;delete paper
romanov73;Thu Mar 1 11:51:17 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest T-Midnight;Sat Nov 10 21:55:09 2018 +0400;Create dashboard for grants
romanov73;Thu Mar 1 11:50:59 2018 +0400;try to fix ci: 3 remove tests Anton Romanov;Sat Nov 10 21:43:52 2018 +0400;add route
Aleksey Filippov;Thu Mar 1 11:50:25 2018 +0400;Merge remote-tracking branch 'origin/36-rest' into 36-rest Alyona;Sat Nov 10 20:28:17 2018 +0400;fix
Aleksey Filippov;Thu Mar 1 11:49:59 2018 +0400;moved to new database Alyona;Fri Nov 9 15:43:42 2018 +0400;fix
romanov73;Thu Mar 1 11:45:40 2018 +0400;try to fix ci: 2 change image Elena;Fri Nov 9 15:43:25 2018 +0400;Задача №10
romanov73;Thu Mar 1 11:44:42 2018 +0400;try to fix ci: 1 Anton Romanov;Fri Nov 9 15:37:58 2018 +0400;remove styles from email template
romanov73;Thu Mar 1 11:15:52 2018 +0400;fix csrf tokens Alyona;Fri Nov 9 15:29:48 2018 +0400;Merge remote-tracking branch 'origin/master'
Aleksey Filippov;Thu Mar 1 00:25:43 2018 +0400;initial user management support added Anton Romanov;Fri Nov 9 15:21:03 2018 +0400;move styles to body
romanov73;Wed Feb 28 22:26:00 2018 +0400;save current version in local storage Anton Romanov;Fri Nov 9 11:15:00 2018 +0000;Merge branch '21-Event-status' into 'master'
romanov73;Wed Feb 28 18:40:57 2018 +0400;add ajax datatable Anton Romanov;Fri Nov 9 15:08:10 2018 +0400;Merge branch 'master' into 21-Event-status
romanov73;Wed Feb 28 18:01:23 2018 +0400;add static index page with menu Anton Romanov;Fri Nov 9 15:05:39 2018 +0400;fix styles
Romanov Anton;Tue Feb 27 16:53:04 2018 +0000;Merge branch '33-' into 'develop' Anton Romanov;Fri Nov 9 14:53:24 2018 +0400;add styles in email templates
romanov73;Tue Feb 27 20:50:44 2018 +0400;calc area balance Alyona;Fri Nov 9 14:51:19 2018 +0400;added period event
romanov73;Tue Feb 27 17:36:31 2018 +0400;remove unused panel Alyona;Fri Nov 9 14:48:21 2018 +0400;added period event
Romanov Anton;Tue Feb 27 13:06:02 2018 +0000;Merge branch '32-' into 'develop' Elena;Fri Nov 9 13:43:08 2018 +0400;Merge branch 'master' into 10-savePaper
romanov73;Tue Feb 27 17:02:35 2018 +0400;calc tool balance Elena;Fri Nov 9 13:42:28 2018 +0400;Задача №10
romanov73;Tue Feb 27 15:45:39 2018 +0400;calc tool balance Alyona;Fri Nov 9 13:30:31 2018 +0400;Merge remote-tracking branch 'origin/master'
romanov73;Tue Feb 27 12:16:41 2018 +0400;calc tool power Anton Romanov;Fri Nov 9 10:04:50 2018 +0400;add notification templates
romanov73;Tue Feb 27 11:40:59 2018 +0400;use tool types in dto Anton Romanov;Fri Nov 9 09:16:24 2018 +0400;move to notification service
romanov73;Tue Feb 27 11:29:05 2018 +0400;fix dtos Anton Romanov;Fri Nov 9 08:39:00 2018 +0400;fix scheduler code to use service
romanov73;Mon Feb 26 23:50:53 2018 +0400;inherit dtos Anton Romanov;Thu Nov 8 21:58:10 2018 +0400;add toolbar
romanov73;Mon Feb 26 15:38:00 2018 +0400;fix services for balance calculation Anton Romanov;Thu Nov 8 20:34:09 2018 +0400;fix paths
Aleksey Filippov;Mon Feb 26 15:00:48 2018 +0400;move from maven to gradle, move from javaee to spring boot Anton Romanov;Thu Nov 8 20:08:26 2018 +0400;add config parameter
romanov73;Thu Feb 22 18:03:35 2018 +0400;Add menu resource Anton Romanov;Thu Nov 8 19:39:22 2018 +0400;Merge remote-tracking branch 'origin/master'
Romanov Anton;Tue Feb 20 18:12:55 2018 +0000;Merge branch 'balance-different-dto' into 'develop' Anton Romanov;Thu Nov 8 19:36:50 2018 +0400;add paper create strategy
romanov73;Tue Feb 20 22:09:33 2018 +0400;restore tests Anton Romanov;Tue Nov 6 10:39:25 2018 +0000;Update README.md
romanov73;Tue Feb 20 21:46:45 2018 +0400;filter employees by stage Anton Romanov;Tue Nov 6 14:10:00 2018 +0400;fix ci
romanov73;Tue Feb 20 21:21:27 2018 +0400;filter employees by workload Anton Romanov;Thu Nov 1 12:53:19 2018 +0400;fix imports
romanov73;Tue Feb 20 20:58:23 2018 +0400;Merge branch 'develop' into balance-different-dto Alyona;Wed Oct 31 20:06:27 2018 +0400;changelog
funny73;Tue Feb 20 19:52:24 2018 +0400;Add shift unit model Add link to unit view Alyona;Wed Oct 31 19:35:23 2018 +0400;Merge branch 'master' into 21-Event-status
romanov73;Tue Feb 20 16:14:09 2018 +0400;Important fix using coefficient Alyona;Wed Oct 31 19:33:21 2018 +0400;Merge branch 'master' of C:\Users\катя\IdeaProjects\ng-tracker with conflicts.
romanov73;Mon Feb 19 19:00:07 2018 +0400;partially fix ajustment Alyona;Tue Oct 30 23:59:42 2018 +0400;added event status
romanov73;Mon Feb 19 18:24:10 2018 +0400;Modify dto for using with different periods and work types Anton Romanov;Tue Oct 30 19:32:00 2018 +0000;Merge branch '4-show-time-line' into 'master'
Romanov Anton;Mon Feb 19 08:11:39 2018 +0000;Merge branch '30-' into 'develop' Anton Romanov;Tue Oct 30 23:29:18 2018 +0400;Merge branch 'master' into 4-show-time-line
romanov73;Mon Feb 19 12:09:05 2018 +0400;Add work type to position Anton Romanov;Tue Oct 30 23:26:55 2018 +0400;fix db
Romanov Anton;Wed Feb 14 20:57:35 2018 +0000;Merge branch '34-' into 'develop' Anton Romanov;Tue Oct 30 23:07:01 2018 +0400;Revert "remove liquibase"
romanov73;Thu Feb 15 00:51:24 2018 +0400;fixes by comments Anton Romanov;Tue Oct 30 23:04:49 2018 +0400;Merge remote-tracking branch 'origin/4-show-time-line' into 4-show-time-line
romanov73;Thu Feb 15 00:47:21 2018 +0400;merge fields Anton Romanov;Tue Oct 30 23:04:21 2018 +0400;Revert "remove liquibase"
romanov73;Wed Feb 14 23:42:35 2018 +0400;Merge branch 'develop' into 34-gleb Anton Romanov;Sat Oct 27 21:00:43 2018 +0000;Merge branch '11-Message-about-deadlines' into 'master'
romanov73;Wed Feb 14 21:05:51 2018 +0400;add clock Anton Romanov;Sat Oct 27 21:00:01 2018 +0000;Merge branch '12-' into 'master'
Romanov Anton;Wed Feb 14 16:49:29 2018 +0000;Merge branch '45-balance-employee-recomendations' into 'develop' Alyona;Sun Oct 28 00:33:00 2018 +0400;fix
romanov73;Wed Feb 14 20:46:59 2018 +0400;cleanup code Alyona;Sun Oct 28 00:26:09 2018 +0400;fix
romanov73;Wed Feb 14 18:25:42 2018 +0400;reduce code Alyona;Sun Oct 28 00:17:16 2018 +0400;fix
romanov73;Wed Feb 14 18:24:59 2018 +0400;adjust additional employees Alyona;Sun Oct 28 00:15:42 2018 +0400;fix
romanov73;Wed Feb 14 17:22:10 2018 +0400;move employees from other units Alyona;Sat Oct 27 23:50:12 2018 +0400;fix
romanov73;Tue Feb 13 23:59:09 2018 +0400;fix save product name Alyona;Sat Oct 27 23:46:49 2018 +0400;fix
romanov73;Tue Feb 13 23:28:30 2018 +0400;add converter, fix UI and backing for add complex object Anton Romanov;Sat Oct 27 23:25:27 2018 +0400;- make scheduler as a service - reformat code - fix cyrillic letter
romanov73;Tue Feb 13 22:10:59 2018 +0400;Merge branch 'develop' into 34-gleb Anton Romanov;Sat Oct 27 23:16:14 2018 +0400;add database column
funny73;Tue Feb 13 18:07:25 2018 +0400;Add stage to workload Alyona;Sat Oct 27 23:11:07 2018 +0400;class for send messages about update paper
funny73;Tue Feb 13 16:05:45 2018 +0400;Add stage to category Alyona;Sat Oct 27 22:32:51 2018 +0400;add deadlineSсheduler
romanov73;Tue Feb 13 13:20:16 2018 +0400;add map of all units balances Alyona;Sat Oct 27 22:24:10 2018 +0400;add deadlineDate to models
romanov73;Tue Feb 13 11:24:50 2018 +0400;move method Anton Romanov;Thu Oct 25 10:27:57 2018 +0400;some fix
romanov73;Tue Feb 13 00:35:30 2018 +0400;add dialog Anton Romanov;Thu Oct 25 04:59:51 2018 +0000;Merge branch '8-' into 'master'
romanov73;Mon Feb 12 22:59:49 2018 +0400;filter only workshops and manufactures Alyona;Thu Oct 25 08:53:48 2018 +0400;finish deadline
romanov73;Mon Feb 12 22:04:55 2018 +0400;rename employees Alyona;Thu Oct 25 08:53:29 2018 +0400;finish deadline
romanov73;Mon Feb 12 17:34:37 2018 +0400;fix font size Alyona;Thu Oct 25 08:44:25 2018 +0400;Merge branch 'master' into 8-Deadline
romanov73;Mon Feb 12 16:59:16 2018 +0400;fix versions panel width Alyona;Thu Oct 25 08:41:37 2018 +0400;partially add deadline
Romanov Anton;Mon Feb 12 12:47:04 2018 +0000;Merge branch '41-' into 'develop' Anton Romanov;Thu Oct 18 07:25:58 2018 +0000;Merge branch '7-dates-Matveeva' into 'master'
romanov73;Mon Feb 12 16:43:06 2018 +0400;change to working hours Anton Romanov;Thu Oct 18 11:21:26 2018 +0400;use html5 datetime pickers
romanov73;Mon Feb 12 14:05:36 2018 +0400;remove constructor Elena;Thu Oct 18 10:38:04 2018 +0400;Задача №7
romanov73;Mon Feb 12 14:05:13 2018 +0400;Merge remote-tracking branch 'origin/develop' into develop Anton Romanov;Thu Oct 18 04:49:10 2018 +0000;Merge branch '6-authors-list-Matveeva' into 'master'
romanov73;Mon Feb 12 14:04:57 2018 +0400;fix selects Anton Romanov;Thu Oct 11 19:49:16 2018 +0400;fix buttons size
Romanov Anton;Mon Feb 12 09:20:05 2018 +0000;Merge branch '39-work-type-code' into 'develop' Anton Romanov;Thu Oct 11 15:39:57 2018 +0400;fix styles
Aleksey Filippov;Mon Feb 12 13:16:36 2018 +0400;add migration for work type code Anton Romanov;Thu Oct 11 10:03:44 2018 +0400;load paper statuses
Aleksey Filippov;Mon Feb 12 13:16:28 2018 +0400;add work type code support to xhtml Anton Romanov;Thu Oct 11 09:05:41 2018 +0400;fix progress background
Aleksey Filippov;Mon Feb 12 13:16:12 2018 +0400;add work type code Elena;Wed Oct 10 23:09:45 2018 +0400;Задача №6
Romanov Anton;Mon Feb 12 08:25:47 2018 +0000;Update README.md Anton Romanov;Wed Oct 10 13:18:24 2018 +0000;Merge branch '5-' into 'master'
Romanov Anton;Mon Feb 12 08:25:35 2018 +0000;Update README.md Anton Romanov;Wed Oct 10 17:05:54 2018 +0400;fix paper view
Romanov Anton;Mon Feb 12 08:07:30 2018 +0000;Update README.md Elena;Wed Oct 10 15:30:47 2018 +0400;Задача №5 new
Romanov Anton;Mon Feb 12 07:10:38 2018 +0000;Merge branch '40-' into 'develop' Elena;Wed Oct 10 10:09:07 2018 +0400;Merge branch 'master' into 5-Matveeva-Page
Aleksey Filippov;Mon Feb 12 11:08:13 2018 +0400;add migration for position type Elena;Thu Oct 4 10:39:27 2018 +0400;Задача №5
Aleksey Filippov;Mon Feb 12 11:07:45 2018 +0400;add position type support to xhtml Anton Romanov;Tue Oct 2 07:46:40 2018 +0000;Merge branch '27-file-upload' into 'master'
Aleksey Filippov;Mon Feb 12 11:07:23 2018 +0400;move position converter from boundary to view Anton Romanov;Tue Oct 2 11:11:13 2018 +0400;Merge branch 'master' into 27-file-upload
Aleksey Filippov;Mon Feb 12 11:06:55 2018 +0400;add position type converter Anton Romanov;Tue Oct 2 10:58:41 2018 +0400;add messages
Aleksey Filippov;Mon Feb 12 11:06:35 2018 +0400;add position type to backing Anton Romanov;Mon Oct 1 13:54:11 2018 +0400;add example for file uploading
Aleksey Filippov;Mon Feb 12 11:06:00 2018 +0400;add position type support to service Anton Romanov;Sat Sep 29 09:22:48 2018 +0400;minimize scripts
Aleksey Filippov;Mon Feb 12 11:05:44 2018 +0400;add position type to model Anton Romanov;Thu Sep 27 21:32:16 2018 +0400;fix error pages
Romanov Anton;Mon Feb 12 07:02:32 2018 +0000;Merge branch '33-' into 'develop' Anton Romanov;Thu Sep 27 16:01:02 2018 +0000;Merge branch 'refactor-ui' into 'master'
romanov73;Mon Feb 12 14:58:51 2018 +0400;refactor Anton Romanov;Thu Sep 27 12:11:25 2018 +0400;move pages
romanov73;Mon Feb 12 14:58:33 2018 +0400;add human hours coefficient Anton Romanov;Thu Sep 27 10:35:22 2018 +0400;some refactor
romanov73;Mon Feb 12 14:56:43 2018 +0400;fix api name Anton Romanov;Thu Sep 27 06:08:53 2018 +0000;Merge branch '3-ui' into 'master'
romanov73;Mon Feb 12 00:58:15 2018 +0400;add balance button Anton Romanov;Thu Sep 27 10:03:00 2018 +0400;Merge branch 'master' into 3-ui
romanov73;Sun Feb 11 01:36:15 2018 +0400;add tools balance prototype Anton Romanov;Thu Sep 27 10:02:49 2018 +0400;Merge branch 'master' into 3-ui
romanov73;Sat Feb 10 23:09:33 2018 +0400;move enum Alyona;Wed Sep 26 16:44:36 2018 +0400;Merge branch 'master' into 5-Page-of-paper
romanov73;Sat Feb 10 23:02:36 2018 +0400;refactor Alyona;Wed Sep 26 16:41:33 2018 +0400;Merge branch 'master' into 23-dashboard
romanov73;Sat Feb 10 22:54:28 2018 +0400;add quarter Anton Romanov;Wed Sep 26 12:22:38 2018 +0000;Merge branch '23-dashboard' into 'master'
romanov73;Sat Feb 10 22:42:14 2018 +0400;refactor Alyona;Wed Sep 26 16:11:43 2018 +0400;Merge branch 'master' into 23-dashboard
romanov73;Sat Feb 10 20:52:46 2018 +0400;Merge branch 'develop' into 33-balance-area Alyona;Wed Sep 26 16:11:19 2018 +0400;Merge branch 'master' into 23-dashboard
romanov73;Sat Feb 10 20:52:32 2018 +0400;Merge branch 'develop' into 33-balance-area Alyona;Wed Sep 26 16:04:31 2018 +0400;add paper page
Romanov Anton;Sat Feb 10 16:14:26 2018 +0000;Merge branch '31-map-2-dto' into 'develop' Anton Romanov;Wed Sep 26 11:55:20 2018 +0000;Merge branch '24-paper-page' into 'master'
romanov73;Sat Feb 10 19:35:17 2018 +0400;fixes after Almaz consultation Alyona;Tue Sep 25 17:13:01 2018 +0400;Alyona-Test
romanov73;Sat Feb 10 14:25:00 2018 +0400;fix npe Elena;Tue Sep 25 16:45:01 2018 +0400;Тестовое задание
romanov73;Sat Feb 10 13:50:21 2018 +0400;add filter by work type Anton Romanov;Sat Sep 22 06:56:33 2018 +0000;Update README.md
romanov73;Sat Feb 10 13:08:56 2018 +0400;rename field Anton Romanov;Sat Sep 8 10:19:21 2018 +0400;change ports
romanov73;Sat Feb 10 13:08:38 2018 +0400;filter by all children Anton Romanov;Sat Sep 8 10:07:21 2018 +0400;Merge remote-tracking branch 'origin/4-show-time-line' into 4-show-time-line
Aleksey Filippov;Sat Feb 10 11:26:17 2018 +0400;some fixes Anton Romanov;Sat Sep 8 09:54:14 2018 +0400;Merge branch 'master' into 4-show-time-line
Aleksey Filippov;Sat Feb 10 11:26:06 2018 +0400;add dto for total balance Anton Romanov;Sat Sep 8 09:53:34 2018 +0400;path to timeline
Aleksey Filippov;Sat Feb 10 11:11:58 2018 +0400;add dto for employee load by unit Anton Romanov;Sat Sep 8 09:50:13 2018 +0400;fix papers font
Aleksey Filippov;Sat Feb 10 10:30:11 2018 +0400;getEmployeesByUnit method refactoring Anton Romanov;Thu Sep 6 19:14:04 2018 +0000;Update README.md
romanov73;Sat Feb 10 00:22:37 2018 +0400;add other type of balance area Anton Romanov;Thu Sep 6 23:01:39 2018 +0400;add variable
romanov73;Fri Feb 9 22:03:39 2018 +0400;add tools balance Anton Romanov;Thu Sep 6 22:50:34 2018 +0400;deploy on vps
romanov73;Fri Feb 9 19:50:21 2018 +0400;divide balance page Anton Romanov;Wed Sep 5 21:58:04 2018 +0400;add timeline page
Aleksey Filippov;Fri Feb 9 16:37:18 2018 +0400;adapt backing and view to areas and employee experience dtos Anton Romanov;Wed Sep 5 14:50:49 2018 +0400;sort papers
Aleksey Filippov;Fri Feb 9 16:36:18 2018 +0400;add dto for employee experience Anton Romanov;Wed Sep 5 13:45:20 2018 +0400;fix paper colors
Aleksey Filippov;Fri Feb 9 16:35:51 2018 +0400;add dto for areas Anton Romanov;Wed Sep 5 13:31:51 2018 +0400;add method for create paper
Aleksey Filippov;Fri Feb 9 14:57:01 2018 +0400;some ui fixes Anton Romanov;Wed Sep 5 11:27:22 2018 +0400;get paper list
Aleksey Filippov;Fri Feb 9 14:55:36 2018 +0400;move db methods from getters to init Anton Romanov;Sun Jun 10 13:43:40 2018 +0400;add timeline page
romanov73;Thu Feb 8 01:20:12 2018 +0400;add areas panel Anton Romanov;Sun Jun 10 01:53:32 2018 +0400;fix time
romanov73;Thu Feb 8 01:19:13 2018 +0400;add areas panel Anton Romanov;Sun Jun 10 01:49:38 2018 +0400;send notification
romanov73;Thu Feb 8 01:02:39 2018 +0400;add global preloader Anton Romanov;Sun Jun 10 01:12:28 2018 +0400;add event controller
romanov73;Thu Feb 8 00:57:46 2018 +0400;select default unit Anton Romanov;Sat Jun 9 22:58:32 2018 +0400;remove liquibase
romanov73;Thu Feb 8 00:57:23 2018 +0400;add preloader Anton Romanov;Sat Jun 9 22:41:00 2018 +0400;fix ports
romanov73;Wed Feb 7 22:46:44 2018 +0400;change id Aleksey Filippov;Sun May 20 08:05:21 2018 +0200;delete orphaned files, migrate to webjars, some fixes and refactoring
Romanov Anton;Wed Feb 7 13:53:35 2018 +0000;Merge branch '23-' into 'develop' Anton Romanov;Sat May 5 14:49:34 2018 +0400;add paper authors
Romanov Anton;Wed Feb 7 13:49:27 2018 +0000;Merge branch 'deploy-fixes' into 'develop' Anton Romanov;Sat May 5 11:17:13 2018 +0400;add paper status
funny73;Wed Feb 7 17:34:41 2018 +0400;UDP modify AirplaneKitCounter to double Anton Romanov;Sat May 5 11:14:37 2018 +0400;fix papers delete
Aleksey Filippov;Wed Feb 7 17:33:23 2018 +0400;some wildfly deploy fixes Anton Romanov;Sat May 5 10:57:02 2018 +0400;fix papers crud
funny73;Wed Feb 7 17:19:22 2018 +0400;Modify AirplaneKitCounter to double -> Workload.java Anton Romanov;Sat May 5 00:39:18 2018 +0400;fix paper controller
funny73;Wed Feb 7 17:00:10 2018 +0400;Add AirplaneKitCounter to balance view -> BalanceEmployeeService.java Modify Worckload total Value (Value * AirplaneKitCounter) -> BalanceService.java Anton Romanov;Sat May 5 00:24:48 2018 +0400;add file uploading
funny73;Wed Feb 7 14:13:35 2018 +0400;Add AirplaneKitCounter to view Anton Romanov;Fri May 4 18:09:29 2018 +0400;add big logo
funny73;Wed Feb 7 14:13:15 2018 +0400;Add AirplaneKitCounter to model Workload Anton Romanov;Fri May 4 18:04:09 2018 +0400;add paper controller
funny73;Wed Feb 7 14:12:15 2018 +0400;Changelog for airplainetKitCounter Anton Romanov;Fri May 4 17:54:46 2018 +0400;add ci
Romanov Anton;Wed Feb 7 06:54:55 2018 +0000;Merge branch '22-' into 'develop' Anton Romanov;Fri May 4 17:23:22 2018 +0400;gitignore
romanov73;Wed Feb 7 14:47:34 2018 +0400;add unit types Anton Romanov;Fri May 4 17:08:20 2018 +0400;add java code
Romanov Anton;Tue Feb 6 22:43:40 2018 +0000;Merge branch '25-' into 'develop' Anton Romanov;Mon Apr 30 00:47:50 2018 +0400;add works
romanov73;Wed Feb 7 02:41:34 2018 +0400;filter balance by unit Anton Romanov;Sun Apr 29 20:48:05 2018 +0400;add paper page
romanov73;Wed Feb 7 02:06:46 2018 +0400;filter balance by unit Anton Romanov;Sun Apr 29 20:46:54 2018 +0400;add paper page
romanov73;Wed Feb 7 02:05:10 2018 +0400;filter balance by unit Anton Romanov;Sun Apr 29 20:44:47 2018 +0400;add paper page
romanov73;Wed Feb 7 00:41:01 2018 +0400;add method get all unit children Anton Romanov;Sun Apr 29 18:24:42 2018 +0400;add papers page
romanov73;Tue Feb 6 23:26:18 2018 +0400;add filter by unit in balance results Anton Romanov;Sun Apr 29 17:09:58 2018 +0400;fix menu and sources
romanov73;Tue Feb 6 21:26:45 2018 +0400;refactor work with tree of menu items Anton Romanov;Sun Apr 29 00:49:37 2018 +0400;fix title page
romanov73;Tue Feb 6 21:08:01 2018 +0400;refactor work with tree Anton Romanov;Sat Apr 28 23:30:38 2018 +0400;fix title page
romanov73;Tue Feb 6 21:07:22 2018 +0400;fix update after remove enum key Anton Romanov;Sat Apr 28 22:50:26 2018 +0400;copy from landing
romanov73;Tue Feb 6 20:03:31 2018 +0400;rename method
Gleb;Tue Feb 6 15:07:04 2018 +0000;Merge branch '17-' into 'develop'
romanov73;Tue Feb 6 21:15:12 2018 +0400;fix inf.
funny73;Tue Feb 6 19:02:36 2018 +0400;Add changelog for units with unit_type == 'Корпус', unit_type='Цех'
funny73;Tue Feb 6 18:19:50 2018 +0400;Remove "Korpus" from "Tip podrazdeleniya"
Romanov Anton;Tue Feb 6 11:31:43 2018 +0000;Merge branch '24-' into 'develop'
romanov73;Tue Feb 6 19:01:21 2018 +0400;add user
Romanov Anton;Thu Feb 1 19:45:21 2018 +0000;Merge branch 'wildfly-deploy' into 'develop'
Aleksey Filippov;Thu Feb 1 23:24:34 2018 +0400;add wildfly-maven-plugin, remove maven-glassfish-plugin
romanov73;Thu Feb 1 19:51:24 2018 +0400;add todos
Romanov Anton;Wed Jan 31 15:03:39 2018 +0000;Merge branch 'master' into 'develop'
romanov73;Wed Jan 31 18:53:27 2018 +0400;fix round
romanov73;Wed Jan 31 18:43:33 2018 +0400;fix round
romanov73;Wed Jan 31 18:38:33 2018 +0400;add balance by employees
romanov73;Wed Jan 31 18:30:18 2018 +0400;add balance by employees
Romanov Anton;Wed Jan 31 13:02:52 2018 +0000;Merge branch 'develop' into 'master'
Romanov Anton;Wed Jan 31 12:58:00 2018 +0000;Merge branch '4-' into 'develop'
romanov73;Wed Jan 31 16:47:51 2018 +0400;add balance by employees
romanov73;Wed Jan 31 00:47:39 2018 +0400;add calculation employee loads
romanov73;Wed Jan 31 00:47:25 2018 +0400;add calculation employee loads
romanov73;Wed Jan 31 00:47:08 2018 +0400;add calculation employee loads
romanov73;Wed Jan 31 00:46:53 2018 +0400;add calculation employee loads
romanov73;Wed Jan 31 00:45:59 2018 +0400;add interface for edit additional fields
romanov73;Wed Jan 31 00:45:04 2018 +0400;add comparable for using in tree map
romanov73;Wed Jan 31 00:44:33 2018 +0400;add fields for production program
romanov73;Wed Jan 31 00:43:56 2018 +0400;move interface to base entity
romanov73;Wed Jan 31 00:43:21 2018 +0400;add database fields for production program
romanov73;Wed Jan 31 00:42:55 2018 +0400;add dynamic columns
romanov73;Tue Jan 30 15:11:12 2018 +0400;add work type for workload
romanov73;Tue Jan 30 14:55:56 2018 +0400;add comments
romanov73;Tue Jan 30 03:00:28 2018 +0400;show by production program
romanov73;Tue Jan 30 00:07:31 2018 +0400;add employee available capacity
romanov73;Mon Jan 29 23:42:06 2018 +0400;fix units hierarchy bypass
romanov73;Mon Jan 29 23:28:28 2018 +0400;divide logic
romanov73;Mon Jan 29 22:59:45 2018 +0400;add employee experience table
romanov73;Mon Jan 29 22:15:29 2018 +0400;fix calc areas
romanov73;Mon Jan 29 21:57:23 2018 +0400;fix calc employee experience
romanov73;Mon Jan 29 21:12:52 2018 +0400;calc employee experience by units
romanov73;Mon Jan 29 14:01:36 2018 +0400;add employee experience
Romanov Anton;Mon Jan 29 06:04:01 2018 +0000;Update README.md
Romanov Anton;Sun Jan 28 16:16:56 2018 +0000;Merge branch 'develop' into 'master'
Romanov Anton;Sun Jan 28 16:06:14 2018 +0000;Merge branch '3-' into 'develop'
romanov73;Sun Jan 28 19:53:21 2018 +0400;remove product work types edit
romanov73;Sun Jan 28 19:41:31 2018 +0400;fix months select
romanov73;Sun Jan 28 19:06:10 2018 +0400;fix year select
romanov73;Sun Jan 28 04:28:21 2018 +0400;fix program edit
romanov73;Sun Jan 28 04:27:55 2018 +0400;add product backend
romanov73;Sun Jan 28 04:26:53 2018 +0400;add table and fields
Romanov Anton;Sat Jan 27 08:11:15 2018 +0000;Merge branch '9-' into 'develop'
romanov73;Sat Jan 27 15:28:22 2018 +0400;sort menu items, change logo
Romanov Anton;Sat Jan 27 05:55:52 2018 +0000;Update README.md
romanov73;Sat Jan 20 00:12:44 2018 +0400;fix versions select
Romanov Anton;Fri Jan 19 04:27:48 2018 +0000;Merge branch 'tool-square-catalog' into 'master'
Aleksey Filippov;Fri Jan 19 01:11:50 2018 +0400;add tool square catalog migration
Aleksey Filippov;Thu Jan 18 02:20:48 2018 +0400;add tool square catalog
romanov73;Thu Jan 11 21:22:14 2018 +0400;fix rest path
romanov73;Tue Jan 9 03:44:10 2018 +0400;fixes
romanov73;Tue Jan 9 00:09:27 2018 +0400;fix unit name
romanov73;Tue Jan 9 00:07:47 2018 +0400;fix year
romanov73;Mon Jan 8 19:16:28 2018 +0400;add short view
romanov73;Mon Jan 8 11:55:30 2018 +0400;fix
romanov73;Mon Jan 8 01:24:37 2018 +0400;fill work type by tool name
romanov73;Mon Jan 8 00:23:00 2018 +0400;ui fixes
romanov73;Sun Jan 7 23:54:40 2018 +0400;fix units hierarchy, add unit type, calc areas balance
romanov73;Sat Jan 6 22:51:11 2018 +0400;remove versions
romanov73;Sat Jan 6 22:06:03 2018 +0400;fix edit program
romanov73;Sat Jan 6 21:40:11 2018 +0400;add title image
romanov73;Sat Jan 6 18:04:27 2018 +0400;add production program input
romanov73;Wed Jan 3 21:05:48 2018 +0400;change wizard to tabs
romanov73;Wed Jan 3 01:03:05 2018 +0400;add wizard
romanov73;Sat Dec 30 02:02:42 2017 +0400;fix tools loading
romanov73;Sat Dec 30 01:46:01 2017 +0400;fix tools loading
romanov73;Sat Dec 30 01:32:33 2017 +0400;fix tools loading
romanov73;Sat Dec 30 01:28:24 2017 +0400;fix tools loading
romanov73;Sat Dec 30 00:54:26 2017 +0400;fix employee loading
romanov73;Fri Dec 29 19:04:14 2017 +0400;fix unit select
romanov73;Fri Dec 29 17:19:10 2017 +0400;fix unit select
romanov73;Fri Dec 29 01:40:38 2017 +0400;add cache
romanov73;Fri Dec 29 01:27:18 2017 +0400;add cache
romanov73;Fri Dec 29 01:14:09 2017 +0400;add cache
romanov73;Fri Dec 29 01:12:17 2017 +0400;change color
romanov73;Fri Dec 29 00:50:57 2017 +0400;add ci
romanov73;Fri Dec 29 00:48:10 2017 +0400;add ci
romanov73;Fri Dec 29 00:34:36 2017 +0400;add ci
romanov73;Fri Dec 29 00:31:22 2017 +0400;add ci
romanov73;Fri Dec 29 00:18:51 2017 +0400;add ci
romanov73;Fri Dec 29 00:16:44 2017 +0400;add ci
romanov73;Fri Dec 29 00:13:33 2017 +0400;add ci
romanov73;Fri Dec 29 00:09:51 2017 +0400;fix menus
Romanov Anton;Thu Dec 28 19:47:02 2017 +0000;Merge branch 'balance-example' into 'master'
romanov73;Thu Dec 28 23:44:52 2017 +0400;add other dictionaries
romanov73;Sat Dec 23 10:40:41 2017 +0400;add tool and work types
romanov73;Sat Dec 23 09:12:38 2017 +0400;fix menu item
romanov73;Sat Dec 23 09:12:23 2017 +0400;fix employee load
romanov73;Sat Dec 23 08:51:18 2017 +0400;add employee category
romanov73;Sat Dec 23 08:22:10 2017 +0400;add categories dictionary
romanov73;Fri Dec 22 12:38:08 2017 +0400;add menu item
romanov73;Fri Dec 22 12:31:26 2017 +0400;add employee category
romanov73;Fri Dec 22 09:55:31 2017 +0400;fix calendar
romanov73;Fri Dec 22 09:33:56 2017 +0400;fix date
romanov73;Thu Dec 21 16:38:20 2017 +0400;fix for context path change
romanov73;Thu Dec 21 13:58:02 2017 +0400;fluid panel
romanov73;Wed Dec 20 20:50:17 2017 +0400;fix context path
romanov73;Wed Dec 20 17:12:19 2017 +0400;fix displaying position
romanov73;Wed Dec 20 17:10:14 2017 +0400;load employees from file
romanov73;Wed Dec 20 15:09:54 2017 +0400;fix tool loading
romanov73;Mon Dec 18 18:18:04 2017 +0400;add resource versions
romanov73;Mon Dec 18 17:36:50 2017 +0400;add resource
romanov73;Mon Dec 18 17:07:47 2017 +0400;add swagger
romanov73;Sat Dec 16 09:42:46 2017 +0400;add new version
romanov73;Fri Dec 15 19:50:46 2017 +0400;fix title
romanov73;Fri Dec 15 19:24:13 2017 +0400;fix title
romanov73;Fri Dec 15 11:57:18 2017 +0400;add menu items
romanov73;Fri Dec 15 11:52:01 2017 +0400;add positions dictionary
romanov73;Fri Dec 15 11:29:02 2017 +0400;fix select for employee
romanov73;Fri Dec 15 10:35:12 2017 +0400;add employee backing
romanov73;Fri Dec 15 09:36:33 2017 +0400;fix 500 error page
romanov73;Thu Dec 14 22:26:45 2017 +0400;fix mapping
romanov73;Thu Dec 14 22:49:44 2017 +0400;add employee
romanov73;Thu Dec 14 22:37:30 2017 +0400;add employee
romanov73;Thu Dec 14 14:12:03 2017 +0400;fix crud service
romanov73;Thu Dec 14 12:51:59 2017 +0400;fix table style
romanov73;Thu Dec 14 12:22:48 2017 +0400;remove border for grid
romanov73;Thu Dec 14 12:20:14 2017 +0400;add version_id for units
romanov73;Thu Dec 14 11:49:53 2017 +0400;fix font size
romanov73;Thu Dec 14 11:08:46 2017 +0400;add unit fields
romanov73;Thu Dec 14 10:23:01 2017 +0400;KISS units hierarchy
romanov73;Wed Dec 13 19:04:05 2017 +0400;refresh page
romanov73;Wed Dec 13 17:43:54 2017 +0400;add version
romanov73;Wed Dec 13 01:46:05 2017 +0400;body width
romanov73;Wed Dec 13 01:45:17 2017 +0400;add menu item
romanov73;Tue Dec 12 22:20:07 2017 +0400;fix tree
romanov73;Tue Dec 12 20:02:20 2017 +0400;fix login
romanov73;Tue Dec 12 19:29:03 2017 +0400;add unit tree
romanov73;Tue Dec 12 18:23:38 2017 +0400;add unit dictionary
romanov73;Tue Dec 12 16:18:03 2017 +0400;add filter
romanov73;Tue Dec 12 14:13:31 2017 +0400;fix menu session
romanov73;Tue Dec 12 00:10:47 2017 +0400;remove bootstrap
romanov73;Mon Dec 11 21:53:18 2017 +0400;add unit select
romanov73;Mon Dec 11 19:49:15 2017 +0400;add menu item and role
romanov73;Mon Dec 11 19:37:38 2017 +0400;fix permissions
romanov73;Mon Dec 11 17:08:39 2017 +0400;refactor and add tools dictionary backing
romanov73;Mon Dec 11 17:08:04 2017 +0400;refactor and add tools dictionary backing
romanov73;Mon Dec 11 17:07:27 2017 +0400;refactor and add tools dictionary backing
romanov73;Mon Dec 11 14:12:24 2017 +0400;add tools dictionary page
romanov73;Sat Dec 9 09:54:45 2017 +0400;add global exception hadler
romanov73;Sat Nov 25 13:52:33 2017 +0400;add monitoring
romanov73;Sat Nov 25 13:21:18 2017 +0400;fix xls and xlsx
romanov73;Sat Nov 25 12:39:45 2017 +0400;upload tools
romanov73;Fri Nov 24 22:16:27 2017 +0400;save tools
romanov73;Fri Nov 24 13:06:21 2017 +0400;fix message
romanov73;Fri Nov 24 12:11:43 2017 +0400;add loading from xlsx
romanov73;Fri Nov 17 19:43:35 2017 +0400;add message
romanov73;Fri Nov 17 15:11:22 2017 +0400;fix button
romanov73;Fri Nov 17 10:15:42 2017 +0400;add registration service
romanov73;Thu Nov 16 21:35:04 2017 +0400;add push script
romanov73;Thu Nov 16 20:54:49 2017 +0400;fix named query execution
romanov73;Sun Nov 12 22:19:03 2017 +0400;sort menu items
romanov73;Sat Nov 11 15:09:35 2017 +0400;fix title
romanov73;Sat Nov 11 14:54:25 2017 +0400;fix table
romanov73;Sat Nov 11 14:35:38 2017 +0400;fix style attribute
romanov73;Sat Nov 11 14:08:56 2017 +0400;show user sessions
romanov73;Sat Nov 11 13:51:34 2017 +0400;rename service
romanov73;Fri Nov 10 22:03:25 2017 +0400;fix update tree
romanov73;Fri Nov 10 14:29:25 2017 +0400;edit menu items
romanov73;Fri Nov 10 12:17:24 2017 +0400;set bootstrap theme for primefaces
romanov73;Thu Nov 9 23:40:40 2017 +0400;fix saving entitites
romanov73;Thu Nov 9 23:27:42 2017 +0400;fix saving entitites
romanov73;Thu Nov 9 20:51:19 2017 +0400;fix titles
romanov73;Thu Nov 9 18:00:45 2017 +0400;fix login page title
romanov73;Thu Nov 9 13:36:21 2017 +0400;commit log
romanov73;Thu Nov 9 07:31:37 2017 +0400;reverse sort commits
romanov73;Thu Nov 9 00:27:48 2017 +0400;sort commits
romanov73;Wed Nov 8 23:16:07 2017 +0400;extend commits log
romanov73;Wed Nov 8 21:42:16 2017 +0400;fix styles
romanov73;Wed Nov 8 19:17:08 2017 +0400;add logout
romanov73;Wed Nov 8 19:13:17 2017 +0400;add logout
romanov73;Wed Nov 8 20:18:35 2017 +0400;Merge branch 'master' of gitlab.com:romanov73/balance
romanov73;Wed Nov 8 20:17:55 2017 +0400;add database diagramm
Romanov Anton;Wed Nov 8 04:13:39 2017 +0000;Update README.md
Romanov Anton;Wed Nov 8 04:11:33 2017 +0000;Update README.md
romanov73;Wed Nov 8 07:48:13 2017 +0400;Merge remote-tracking branch 'origin/master'
Romanov Anton;Tue Nov 7 18:05:04 2017 +0000;Update README.md
romanov73;Tue Nov 7 22:01:50 2017 +0400;add example of permissions validation
romanov73;Tue Nov 7 20:56:31 2017 +0400;rename project
romanov73;Wed Oct 11 21:37:49 2017 +0400;reverse sort commits
romanov73;Wed Oct 11 21:32:19 2017 +0400;fix read resource as file
romanov73;Wed Oct 11 20:23:10 2017 +0400;Merge remote-tracking branch 'origin/master'
romanov73;Wed Oct 11 20:22:52 2017 +0400;add commits log
Romanov Anton;Tue Oct 10 20:47:29 2017 +0000;Update README.md
romanov73;Fri Oct 6 01:55:57 2017 +0400;add menu to platform

@ -0,0 +1,12 @@
<?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="masha" id="20190318_000000-1">
<dropColumn columnName="file_id" tableName="paper"/>
<addColumn tableName="file">
<column name="paper_id" type="integer"/>
</addColumn>
</changeSet>
</databaseChangeLog>

@ -0,0 +1,10 @@
<?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="masha" id="20190319_000001-1">
<addColumn tableName="paper">
<column name="url" type="varchar(255)"></column>
</addColumn>
</changeSet>
</databaseChangeLog>

@ -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="masha" id="20190327_000000-1">
<addColumn tableName="event">
<column name="paper_id" type="integer"/>
</addColumn>
<addForeignKeyConstraint baseTableName="event" baseColumnNames="paper_id"
constraintName="fk_event_paper_id" referencedTableName="paper"
referencedColumnNames="id"/>
</changeSet>
</databaseChangeLog>

@ -0,0 +1,55 @@
<?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="nastya" id="20190331_000000-1">
<createTable tableName="tag">
<column name="id" type="integer">
<constraints nullable="false"/>
</column>
<column name="tagname" type="varchar(255)"/>
</createTable>
<addPrimaryKey columnNames="id" constraintName="pk_tag" tableName="tag"/>
</changeSet>
<changeSet author="nastya" id="20190331_000000-2">
<createTable tableName="task">
<column name="id" type="integer">
<constraints nullable="false"/>
</column>
<column name="user_id" type="integer"/>
<column name="title" type="varchar(255)"/>
<column name="description" type="varchar(255)"/>
<column name="status" type="varchar(255)"/>
<column name="deadline_date" type="timestamp"/>
<column name="create_date" type="timestamp"/>
<column name="update_date" type="timestamp"/>
</createTable>
<addPrimaryKey columnNames="id" constraintName="pk_task" tableName="task"/>
<addForeignKeyConstraint baseTableName="task" baseColumnNames="user_id"
constraintName="fk_user_task_id" referencedTableName="users"
referencedColumnNames="id"/>
</changeSet>
<changeSet author="nastya" id="20190331_000000-3">
<createTable tableName="task_tags">
<column name="task_id" type="integer"/>
<column name="tag_id" type="integer"/>
</createTable>
<addForeignKeyConstraint baseTableName="task_tags" baseColumnNames="task_id"
constraintName="fk_task_id" referencedTableName="task"
referencedColumnNames="id"/>
<addForeignKeyConstraint baseTableName="task_tags" baseColumnNames="tag_id"
constraintName="fk_tag_id" referencedTableName="tag"
referencedColumnNames="id"/>
</changeSet>
<changeSet author="nastya" id="20190331_000000-4">
<addColumn tableName="deadline">
<column name="task_id" type="integer"/>
</addColumn>
<addForeignKeyConstraint baseTableName="deadline" baseColumnNames="task_id"
constraintName="fk_deadlines_task" referencedTableName="task"
referencedColumnNames="id"/>
</changeSet>
</databaseChangeLog>

@ -0,0 +1,63 @@
<?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="vova" id="20190331_000010-1">
<createTable tableName="conference">
<column name="id" type="integer">
<constraints nullable="false"/>
</column>
<column name="title" type="varchar(300)"/>
<column name="description" type="varchar(500)"/>
<column name="url" type="varchar(255)"/>
<column name="ping" type="integer"/>
<column name="begin_date" type="timestamp"/>
<column name="end_date" type="timestamp"/>
</createTable>
<addPrimaryKey columnNames="id" constraintName="pk_conference" tableName="conference"/>
</changeSet>
<changeSet author="vova" id="20190331_000010-2">
<createTable tableName="paper_conference">
<column name="conference_id" type="integer"/>
<column name="paper_id" type="integer"/>
</createTable>
<addForeignKeyConstraint baseTableName="paper_conference" baseColumnNames="conference_id"
constraintName=" fk_paper_conference_conference" referencedTableName="conference"
referencedColumnNames="id"/>
<addForeignKeyConstraint baseTableName="paper_conference" baseColumnNames="paper_id"
constraintName="fk_paper_conference_paper" referencedTableName="paper"
referencedColumnNames="id"/>
</changeSet>
<changeSet author="vova" id="20190331_000010-3">
<createTable tableName="users_conference">
<column name="conference_id" type="integer"/>
<column name="users_id" type="integer"/>
<column name="participation" type="boolean"/>
<column name="deposit" type="varchar(255)"/>
</createTable>
<addForeignKeyConstraint baseTableName="users_conference" baseColumnNames="conference_id"
constraintName=" fk_users_conference_conference" referencedTableName="conference"
referencedColumnNames="id"/>
<addForeignKeyConstraint baseTableName="users_conference" baseColumnNames="users_id"
constraintName="fk_users_conference_users" referencedTableName="users"
referencedColumnNames="id"/>
</changeSet>
<changeSet author="vova" id="20190331_000010-4">
<addColumn tableName="deadline">
<column name="conference_id" type="integer"/>
</addColumn>
<addForeignKeyConstraint baseTableName="deadline" baseColumnNames="conference_id"
constraintName=" fk_deadlines_conference" referencedTableName="conference"
referencedColumnNames="id"/>
</changeSet>
<changeSet author="orion" id="20190331_000010-5">
<addColumn tableName="conference">
<column name="version" type="integer"/>
</addColumn>
</changeSet>
</databaseChangeLog>

@ -18,5 +18,10 @@
<include file="db/changelog-20181111_000000-schema.xml"/> <include file="db/changelog-20181111_000000-schema.xml"/>
<include file="db/changelog-20181208_000000-schema.xml"/> <include file="db/changelog-20181208_000000-schema.xml"/>
<include file="db/changelog-20181224_000000-schema.xml"/> <include file="db/changelog-20181224_000000-schema.xml"/>
<include file="db/changelog-20190318_000000-schema.xml"/>
<include file="db/changelog-20190318_000001-schema.xml"/>
<include file="db/changelog-20190327_000000-schema.xml"/>
<include file="db/changelog-20190331_000000-schema.xml"/>
<include file="db/changelog-20190331_000010-schema.xml"/>
<include file="db/common/changelog-20190312_130000-schema.xml"/> <include file="db/common/changelog-20190312_130000-schema.xml"/>
</databaseChangeLog> </databaseChangeLog>

@ -1,94 +1,122 @@
.col-lg-12 a{ body {
position: absolute; min-width: 400px;
font-size: smaller;
} }
.col-lg-12 a img{
width: 36px;
height: 33px;
}
.form-group textarea{
.form-group textarea {
min-height: 206px; min-height: 206px;
max-height: 463px; max-height: 463px;
} }
.deadline-list {
.deadline-list{
height: 200px; height: 200px;
padding: 0px; padding: 0px;
overflow-y: scroll; overflow-y: scroll;
} }
.deadline{ .deadline {
margin: 0; margin: 0;
height: 40px;
} }
.deadline-text{ .deadline-text {
flex: 1; flex: 1;
} }
.member-list{ .member-list {
height: 200px; height: 200px;
padding: 0px; padding: 0px;
overflow-y: scroll; overflow-y: scroll;
} }
.member{ .member {
margin: 0; margin: 0;
} }
.paper-list{ .paper-list {
height: 200px; height: 200px;
padding: 0px; padding: 0px;
overflow-y: scroll; overflow-y: scroll;
} }
.paper{ .paper {
margin: 0; margin: 0;
} }
.paper-name{ .paper-name {
flex: 1; flex: 1;
} }
.paper-name span{ .paper-name span {
margin: 6px 15px; margin: 6px 15px;
display: inline-block; display: inline-block;
} }
.icon{ .icon {
width: 38px; width: 38px;
height: 38px; height: 38px;
padding: 2px; padding: 2px;
cursor: pointer; cursor: pointer;
} }
.icon-delete{ .icon-delete {
background-color: #f44; background-color: #f44;
} }
.icon-paper{ .icon-delete:hover {
height: 26px; background-color: #ff2929;
width: 26px; transition: background-color .15s ease-in-out;
float: right;
margin: 5px;
} }
.grey-border{ .icon-paper {
height: 26px;
width: 26px;
float: right;
margin: 5px;
}
.grey-border {
color: #495057; color: #495057;
background-clip: padding-box; background-clip: padding-box;
border: 1px solid #ced4da; border: 1px solid #ced4da;
border-radius: .25rem; border-radius: .25rem;
transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out; transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
}
#add-paper{
margin-left: 10px;
} }
#cancel-button{ #cancel-button {
position: relative; position: relative;
font-size: 1rem; font-size: 1rem;
} }
.paper-control button {
margin: 0 0 10px 10px;
float: right;
}
@media (max-width: 1199px) {
.paper-control {
display: block!important;
}
}
@media (max-width: 991px) {
.dates-panel {
display: block!important;
}
.date {
margin-bottom: 10px;
}
}
@media (max-width: 768px) {
.dashboard-elements {
display: block!important;
}
.dashboard-right {
margin-bottom: 10px;
}
}

@ -0,0 +1,226 @@
.odin-unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.odin-kill-padding {
padding: 0;
}
.odin-input-group {
padding-left: 15px !important;
padding-right: 15px !important;
}
.odin-closable .fa {
font-size: 1.5em;
margin-top: -1px;
}
.odin-closable .fa:hover:before {
content: "\f057";
}
/*
Odin Toolbar
*/
.odin-toolbar {
padding-left: 1px;
padding-bottom: 4px;
}
.odin-toolbar .odin-btn {
float: none !important;
}
.odin-btn {
min-width: 112px;
margin-right: 3px;
}
@media (min-width: 768px) {
.odin-btn {
min-width: 150px;
}
}
/*
Odin Paginator
*/
.odin-paginator {
margin: 0;
margin-top: 5px;
text-align: center;
}
.odin-paginator-content {
display: inline-block;
}
.odin-paginator-content a {
cursor: pointer;
color: black;
float: left;
padding: 6px 16px;
text-decoration: none;
transition: background-color .3s;
border-radius: 4px;
}
.odin-paginator-content i {
color: black;
float: left;
padding: 6px 16px;
}
.odin-paginator-content a.active {
background-color: #4CAF50;
color: white;
}
.odin-paginator-content a:hover:not(.active) {
background-color: #ddd;
}
/*
Odin Formatters
*/
.odin-negative {
color: red;
font-weight: bold;
}
/*
Odin Table
*/
.odin-table {
min-height: 324px;
border: 1px solid #ddd;
padding: 0;
margin: 0 0 0 1px;
background-color: #f8f8f8;
}
.odin-table > table {
margin-bottom: 0;
}
.odin-table > table > tbody > tr {
background-color: #fff;
}
.odin-table-pointed-line {
cursor: pointer;
}
.odin-table-selected-line {
background-color: #5bc0de !important;
}
.odin-table-selected-line:hover {
background-color: #6bd0ee !important;
}
/*
Odin Form
*/
.odin-form {
display: none;
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
top: 0;
left: 0;
bottom: 0;
right: 0;
z-index: 1500;
background: rgba(0, 0, 0, 0.5);
}
.odin-form .panel {
position: relative;
max-height: 95%;
max-width: 95%;
overflow: auto;
}
@media (min-width: 768px) {
.odin-form .panel {
max-width: 55%;
}
}
.odin-form .panel-footer {
padding: 5px 7px;
}
.odin-form .odin-btn {
float: right;
}
.odin-checkbox {
width: 20px;
height: 20px;
}
.odin-form .tab-pane {
padding-top: 5px;
}
/*
Odin Confirm Box
*/
.odin-confirm-box {
display: none;
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
top: 0;
left: 0;
bottom: 0;
right: 0;
z-index: 2000;
background: rgba(0, 0, 0, 0.5);
}
.odin-confirm-box .panel {
position: relative;
max-width: 95%;
}
.odin-confirm-box .panel-footer {
text-align: center;
}
@media (min-width: 768px) {
.odin-confirm-box .panel {
max-width: 25%;
}
}
.odin-confirm-box .panel-body {
text-align: center;
}
/*
Odin Table Box
*/
.odin-table-box {
z-index: 2500;
}
/*
Odin Simple Box
*/
@media (min-width: 768px) {
.odin-simple-form .panel {
max-width: 35%;
}
}

@ -0,0 +1,5 @@
#files-list .row > div:nth-child(6) {
display: flex;
justify-content: center;
flex-direction: column;
}

@ -0,0 +1,24 @@
.bootstrap-tagsinput{
width: 100%;
padding: .375rem .75rem;
}
.bootstrap-tagsinput .label{
display: inline;
padding: .2em .6em .3em;
font-size: 75%;
font-weight: 700;
line-height: 2.5;
color: #fff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: .25em;
}
.bootstrap-tagsinput .label-info{
background-color: orange;
}

@ -0,0 +1,27 @@
$(document).ready(function () {
$('.data-href-js').click( function() {
window.location = $(this).attr('data-href');
});
$('.circle').parent().click( function() {
$(this).children('.circle').toggleClass('circle-active');
});
$('.checkbox-js').parent().click( function() {
$(this).children('.checkbox').toggleClass('selected');
});
$('#select-all-js').click( function() {
$(this).toggleClass('selected');
var childNodes = $('.conference-item .form-check .checkbox')
.each(function(i, elem) {
if ($(this).hasClass('selected') && !$('#select-all-js').hasClass('selected')) {
$(this).toggleClass('selected');
} else if (!$(this).hasClass('selected') && $('#select-all-js').hasClass('selected')){
$(this).toggleClass('selected');
}
});
});
});

@ -0,0 +1,13 @@
/* exported contextPath */
var contextPath = "";
var apiVersion = "/api/1.0";
var basePath = contextPath + apiVersion;
/* exported uiLocale */
var uiLocale = "ru";
/* exported urlVersions */
var urlVersions = basePath + "/versions";
/* exported urlCommits */
var urlCommits = basePath + "/commits";

@ -1,7 +1,9 @@
// from config.js // from config.js
/* global urlVersions */ /* global urlVersions */
var urlFileUpload = "/api/1.0/papers/uploadTmpFile"; var urlFileUpload = "/api/1.0/files/uploadTmpFile";
var urlFileDownload = "/api/1.0/files/download/";
var urlFileDownloadTmp = "/api/1.0/files/download-tmp/";
/* exported MessageTypesEnum */ /* exported MessageTypesEnum */
var MessageTypesEnum = { var MessageTypesEnum = {
@ -86,20 +88,18 @@ function getFromRest(url, callBack, errorCallBack) {
} }
/* exported getFromRestWithVersion */ /* exported getFromRestWithVersion */
function getFromRestWithVersion(url, callBack, errorCallBack) { function getFromRest(url, callBack, errorCallBack) {
getFromRestWithVersionAndParams(url, "", callBack, errorCallBack); getFromRestWithParams(url, "", callBack, errorCallBack);
} }
/* exported getFromRestWithVersionAndParams */ /* exported getFromRestWithVersionAndParams */
function getFromRestWithVersionAndParams(url, params, callBack, errorCallBack) { function getFromRestWithParams(url, params, callBack, errorCallBack) {
getCurrentVersion(function (version) { $.ajax({
$.ajax({ url: url + "?" + params,
url: url + "?versionId=" + version + params, cache: false,
cache: false, success: function (response) {
success: function (response) { errorHandler(response, callBack, errorCallBack);
errorHandler(response, callBack, errorCallBack); }
}
});
}); });
} }
@ -189,32 +189,6 @@ function deleteFromRest(url, callBack, completeCallback, errorCallBack) {
}); });
} }
/* exported getCurrentVersion */
function getCurrentVersion(callBack, errorCallBack) {
var version = localStorage.getItem("currentVersion");
if (($("#select-versions")[0].options.length > 0)
&& ($("#select-versions option[value='" + version + "']").length === 0)) {
localStorage.removeItem("currentVersion");
version = "";
}
if (isEmpty(version)) {
getFromRest(urlVersions,
function (versions) {
if (isEmpty(versions) || versions.count === 0) {
return;
}
var currentVersion = versions.items[0];
localStorage.setItem("currentVersion", currentVersion.id);
callBack(currentVersion.id);
},
errorCallBack);
} else {
callBack(version);
}
}
/* exported fillSelect */ /* exported fillSelect */
function fillSelect(selectElement, values) { function fillSelect(selectElement, values) {
$(selectElement).html(""); $(selectElement).html("");

@ -42,6 +42,7 @@ function FileLoader(args) {
div.append(fileLabel); div.append(fileLabel);
var fileInput = $("<input>") var fileInput = $("<input>")
.attr("type", "file") .attr("type", "file")
.attr("multiple", '')
.hide(); .hide();
fileInput.change(function () { fileInput.change(function () {
var files = $(this).prop("files"); var files = $(this).prop("files");
@ -75,20 +76,22 @@ function FileLoader(args) {
showFeedbackMessage(ALERT_CHOOSE_FILE, MessageTypesEnum.DANGER); showFeedbackMessage(ALERT_CHOOSE_FILE, MessageTypesEnum.DANGER);
return; return;
} }
var currentFile = files[0]; for (var i = 0; i < files.length; i++) {
if (!isEmpty(fileExtensions) && fileExtensions.indexOf(getFileExt(currentFile)) === -1) { var currentFile = files[i];
showFeedbackMessage(ALERT_UNKNOWN_FILE_EXT, MessageTypesEnum.DANGER); if (!isEmpty(fileExtensions) && fileExtensions.indexOf(getFileExt(currentFile)) === -1) {
return; showFeedbackMessage(ALERT_UNKNOWN_FILE_EXT, MessageTypesEnum.DANGER);
} return;
if (currentFile.size === 0) { }
showFeedbackMessage(ALERT_EMPTY_FILE, MessageTypesEnum.DANGER); if (currentFile.size === 0) {
return; showFeedbackMessage(ALERT_EMPTY_FILE, MessageTypesEnum.DANGER);
} return;
if (currentFile.size / SIZE_TO_MB > MAX_FILE_SIZE_MB) { }
showFeedbackMessage(ALERT_MAX_FILE + " " + MAX_FILE_SIZE_MB + "Mb", MessageTypesEnum.DANGER); if (MAX_FILE_SIZE_MB != -1 && currentFile.size / SIZE_TO_MB > MAX_FILE_SIZE_MB) {
return; showFeedbackMessage(ALERT_MAX_FILE + " " + MAX_FILE_SIZE_MB + "Mb", MessageTypesEnum.DANGER);
return;
}
upload(currentFile);
} }
upload(currentFile);
}); });
buttonGroup.append(uploadButton); buttonGroup.append(uploadButton);

File diff suppressed because it is too large Load Diff

@ -0,0 +1,43 @@
/*<![CDATA[*/
$(document).ready(function () {
$(".task-row").mouseenter(function (event) {
var taskRow = $(event.target).closest(".task-row");
$(taskRow).css("background-color", "#f8f9fa");
$(taskRow).find(".remove-task").removeClass("d-none");
});
$(".task-row").mouseleave(function (event) {
var taskRow = $(event.target).closest(".task-row");
$(taskRow).css("background-color", "white");
$(taskRow).closest(".task-row").find(".remove-task").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">&times;</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;
});
});
/*]]>*/

@ -0,0 +1,165 @@
<script type="text/template" id="createButton">
<button type="button" class="btn btn-success odin-btn"><i class="fa fa-plus-square-o"></i> <span>{0}</span></button>
</script>
<script type="text/template" id="editButton">
<button type="button" class="btn btn-info odin-btn"><i class="fa fa-pencil-square-o"></i> <span>{0}</span></button>
</script>
<script type="text/template" id="deleteButton">
<button type="button" class="btn btn-danger odin-btn"><i class="fa fa-trash-o"></i> <span>{0}</span></button>
</script>
<script type="text/template" id="okButton">
<button type="button" class="btn btn-success odin-btn"><span>{0}</span></button>
</script>
<script type="text/template" id="cancelButton">
<button type="button" class="btn btn-danger odin-btn"><span>{0}</span></button>
</script>
<script type="text/template" id="basicButton">
<button type="button" class="btn btn-basic odin-btn"><span>{0}</span></button>
</script>
<script type="text/template" id="buttonGroup">
<div class="input-group-btn">
</div>
</script>
<script type="text/template" id="chooseButton">
<button type="button" class="btn btn-default odin-choose-btn">
<i class="fa fa-ellipsis-h"></i>
</button>
</script>
<script type="text/template" id="clearButton">
<button type="button" class="btn btn-default odin-clear-btn">
<i class="fa fa-close"></i>
</button>
</script>
<script type="text/template" id="emptyDiv">
<div>
</div>
</script>
<script type="text/template" id="anchor">
<a href="{0}">{1}</a>
</script>
<script type="text/template" id="toolbar">
<div class="odin-toolbar">
</div>
</script>
<script type="text/template" id="paginator">
<div class="odin-paginator">
<div class="odin-paginator-content">
</div>
</div>
</script>
<script type="text/template" id="paginatorButton">
<a id="odin-paginator-{0}">{1}</a>
</script>
<script type="text/template" id="paginatorSeparator">
<i class="fa fa-ellipsis-h"></i>
</script>
<script type="text/template" id="tableBoolean">
<i class="fa {0}"></i>
</script>
<script type="text/template" id="tableNumericNegative">
<span class="odin-negative">{0}</span>
</script>
<script type="text/template" id="table">
<div class="table-responsive odin-table">
<table class="table table-bordered table-condensed">
<thead>
</thead>
<tbody>
</tbody>
</table>
</div>
</script>
<script type="text/template" id="tableLine">
<tr></tr>
</script>
<script type="text/template" id="tableHeadColumn">
<th class="col-xs-1">{0}</th>
</script>
<script type="text/template" id="tableBodyColumn">
<td></td>
</script>
<script type="text/template" id="formInputGroup">
<div class="form-group clearfix">
</div>
</script>
<script type="text/template" id="formLabel">
<label class="col-lg-2 control-label" for="{0}">{1}</label>
</script>
<script type="text/template" id="formInputWrapper">
<div class="col-lg-10">
</div>
</script>
<script type="text/template" id="formInputCheckbox">
<input type="checkbox" class="odin-checkbox" id="{0}" {1}>
</script>
<script type="text/template" id="formInput">
<input class="form-control" id="{0}" value="{1}" type="{2}">
</script>
<script type="text/template" id="form">
<form class="odin-form">
</form>
</script>
<script type="text/template" id="formConfirm">
<div class="odin-confirm-box">
</div>
</script>
<script type="text/template" id="formSimple">
<div class="odin-form">
</div>
</script>
<script type="text/template" id="formPanel">
<div class="panel panel-default">
</div>
</script>
<script type="text/template" id="formHeader">
<div class="panel-heading odin-unselectable odin-closable">
<span id="caption"></span>
<i class="fa fa-times-circle-o fa-pull-right"></i>
</div>
</script>
<script type="text/template" id="formContent">
<div class="panel-body">
</div>
</script>
<script type="text/template" id="formFooter">
<div class="panel-footer clearfix">
</div>
</script>
<script type="text/template" id="choseTable">
<div id="table-block" class=\"panel-body odin-kill-padding\"></div>
</script>
<script type="text/template" id="formTabs">
<ul class="nav nav-tabs">
<li class="active">
<a data-toggle="tab" href="#{0}">{1}</a>
</li>
</ul>
<div class="tab-content">
<div id="{0}" class="tab-pane active">
</div>
</div>
</script>
<script type="text/template" id="formTab">
<li>
<a data-toggle="tab" href="#{0}">{1}</a>
</li>
</script>
<script type="text/template" id="formTabContent">
<div id="{0}" class="tab-pane">
</div>
</script>
<script type="text/template" id="copyForm">
<div class="form-group clearfix">
<label class="col-lg-2 control-label" for="fromVersion">Из версии</label>
<div class="col-lg-10">
<select class="form-control" id="fromVersion" required="required">
</select>
</div>
</div>
<div class="form-group clearfix">
<label class="col-lg-2 control-label" for="version">В версию</label>
<div class="col-lg-10">
<input class="form-control" id="version" disabled="disabled">
</div>
</div>
</script>

@ -7,9 +7,13 @@
</head> </head>
<body> <body>
<div class="container" layout:fragment="content"> <div class="container" layout:fragment="content">
<div id="commits-tab"> <section id="commits">
<div class="container">
<div id="commits-tab">
</div> </div>
</div>
</section>
</div> </div>
<th:block layout:fragment="scripts"> <th:block layout:fragment="scripts">
<script th:inline="javascript"> <script th:inline="javascript">

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="default" xmlns:th="">
<head>
<link rel="stylesheet" type="text/css" href="../css/conference.css"/>
</head>
<body>
<div layout:fragment="content">
<section id="conference">
<div class="container">
<div class="row">
<div class="col-lg-12">
<h3 class="section-heading text-uppercase text-center">Актуальные конференции</h3>
<div th:replace="conferences/fragments/confNavigationFragment"/>
</div>
</div>
<hr/>
<div class="row">
<div class="col-lg-12">
</div>
</div>
</div>
</section>
</div>
</body>
</html>

@ -1,7 +1,7 @@
<!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:decorate="~{default}"> layout:decorate="~{default}" xmlns:th="">
<head> <head>
<link rel="stylesheet" type="text/css" href="../css/conference.css"/> <link rel="stylesheet" type="text/css" href="../css/conference.css"/>
</head> </head>
@ -11,19 +11,16 @@
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<a class="d-flex align-items-center" href="/conferences/conferences">
<img class="icon" src="/img/conference/back.png"/>
Назад к списку конференций
</a>
<h3 class="section-heading text-uppercase text-center">Редактирование конференции</h3> <h3 class="section-heading text-uppercase text-center">Редактирование конференции</h3>
<div th:replace="conferences/fragments/confNavigationFragment"/>
</div> </div>
</div> </div>
<hr/> <hr/>
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<form id="paper-form" method="post"> <form id="conference-form" method="post">
<div class="row">
<div class="row">
<div class="col-md-7 col-sm-12"> <div class="col-md-7 col-sm-12">
<input type="hidden" name="id"/> <input type="hidden" name="id"/>
@ -47,14 +44,16 @@
<div class="form-group"> <div class="form-group">
<label for="deadlines">Дедлайны:</label> <label for="deadlines">Дедлайны:</label>
<div class="deadline-list form-control" id="deadlines"> <div class="deadline-list form-control list-group" id="deadlines">
<div class="row deadline grey-border">
<input class="form-control deadline-text" type="text" <div class="deadline d-flex p-0 list-group-item list-group-horizontal">
<input class="deadline-text col-md list-group-item" type="text"
placeholder="Текст дедлайна"/> placeholder="Текст дедлайна"/>
<input type="date"/> <input class="list-group-item" type="date"/>
<img class="icon grey-border icon-delete" src="/img/conference/delete.png" <img class="icon icon-delete grey-border" src="/img/conference/delete.png"
alt="Удалить"/> alt="Удалить"/>
</div> </div>
</div> </div>
</div> </div>
@ -69,39 +68,45 @@
<div class="form-group"> <div class="form-group">
<label for="dates">Дата проведения:</label> <label for="dates">Дата проведения:</label>
<div class="row" id="dates"> <div class="row" id="dates">
<div class="col"> <div class="d-flex col justify-content-between dates-panel">
<input type="date" id="date-begin"/> <div class="date">
- <input class="grey-border form-control" type="date" id="date-begin"/>
<input type="date" id="date-end"/> </div>
<div class="date">
<input class="grey-border form-control" type="date" id="date-end"/>
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="members">Участники:</label> <label for="members">Участники:</label>
<div class="member-list form-control" id="members"> <div class="member-list form-control list-group" id="members">
<div class="row member grey-border"> <div class="member d-flex list-group-item justify-content-between p-1">
<div class="col-5 member-name"> <div class="member-name">
Пользователь 1 Пользователь 1
</div> </div>
<div class="col-3 member-participation"> <div class="member-participation">
очная очная
</div> </div>
<div class="col member-deposit"> <div class="member-deposit">
статья статья
</div> </div>
</div> </div>
<div class="row member grey-border">
<div class="col-5 member-name"> <div class="member d-flex list-group-item justify-content-between p-1">
Пользователь 2 <div class="member-name">
Пользователь 1
</div> </div>
<div class="col-3 member-participation"> <div class="member-participation">
заочная очная
</div> </div>
<div class="col member-deposit"> <div class="member-deposit">
доклад доклад
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@ -114,20 +119,20 @@
<div class="form-group"> <div class="form-group">
<label for="papers">Статьи:</label> <label for="papers">Статьи:</label>
<div class="paper-list form-control" id="papers"> <div class="paper-list form-control list-group" id="papers">
<div class="row paper grey-border"> <div class="paper d-flex list-group-item p-0">
<div class="paper-name grey-border"> <a class="paper-name" href="/papers/papers">
<span> <span>
Имя статьи Имя статьи
</span> </span>
<img class="icon-paper" src="/img/conference/paper.png"/> <img class="icon-paper" src="/img/conference/paper.png"/>
</div> </a>
<img class="icon grey-border icon-delete" src="/img/conference/delete.png" <img class="icon grey-border icon-delete" src="/img/conference/delete.png"
alt="Удалить"/> alt="Удалить"/>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group d-flex justify-content-end"> <div class="paper-control form-group d-flex justify-content-end">
<button id="attach-paper" class="btn btn-primary" <button id="attach-paper" class="btn btn-primary"
type="button"> type="button">
Прикрепить статью Прикрепить статью

@ -1,20 +1,51 @@
<!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:decorate="~{default}"> layout:decorate="~{default}" xmlns:th="">
<head> <head>
</head> </head>
<body> <body>
<div layout:fragment="content"> <div layout:fragment="content">
<form id="conferences-form" method="post">
<section id="conferences">
<div class="container">
<div class="row" id="conference-list">
<div class="col-lg-12 text-center">
<h3 class="section-heading text-uppercase">Конференции</h3>
<div th:replace="conferences/fragments/confNavigationFragment"/>
</div>
</div>
<hr/>
<div class="row">
<div class="col-md-9 col-sm-12">
<a href="./conference" style=" </div>
top: 100px; <div class="col-md-3 col-sm-12">
position: absolute; <div class="filter">
width: 100px; <h5>Фильтр:</h5>
height: 50px; <select class="form-control" id="author"
">нажать</a> onchange="this.form.submit();">
</div> <option value="">Все авторы</option>
<option>lastName
</option>
</select>
<select class="form-control" id="year"
onchange="this.form.submit();">
<option value="">Все годы</option>
<option>year
</option>
</select>
</div>
</div>
</div>
</div>
</section>
<div id="modalDelete"/>
</form>
<script></script>
</div>
</body> </body>
</html>
</html>

@ -0,0 +1,21 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="headerfiles">
<meta charset="UTF-8"/>
</head>
<body>
<div th:fragment="confDashboard (conference)" class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3 dashboard-card">
<div class="row">
<div class="col-2">
</div>
<div class="col col-10 text-right">
<h7 class="service-heading"> title</h7>
<p class="text-muted"></p>
</div>
</div>
</div>
</body>
</html>

@ -0,0 +1,23 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="headerfiles">
<meta charset="UTF-8"/>
</head>
<body>
<div th:fragment="confLine (conference)" class="row text-left paper-row" style="background-color: white;">
<div class="col">
<a href="/conference">
<span class="h6"></span>
<span class="text-muted"></span>
</a>
<input class="id-class" type="hidden"/>
<a class="remove-paper pull-right d-none"
data-confirm="Удалить статью?">
<i class="fa fa-trash" aria-hidden="true"></i>
</a>
</div>
</div>
</body>
</html>

@ -0,0 +1,29 @@
<!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 control-panel">
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3">
<a href="./conferences" 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="./actual" 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="./conference?id=0" class="btn btn-light toolbar-button">
<i class="fa fa-plus-circle" aria-hidden="true"></i>
Добавить конференцию</a>
</div>
</div>
</body>
</html>

@ -23,6 +23,7 @@
<!-- Custom styles for this template --> <!-- Custom styles for this template -->
<link rel="stylesheet" href="/css/agency.css"/> <link rel="stylesheet" href="/css/agency.css"/>
<link rel="stylesheet" href="/css/odin.css"/>
<!-- Bootstrap core JavaScript --> <!-- Bootstrap core JavaScript -->
<script src="/webjars/jquery/3.3.1-1/jquery.min.js"></script> <script src="/webjars/jquery/3.3.1-1/jquery.min.js"></script>
<script src="/webjars/bootstrap/4.1.0/js/bootstrap.bundle.min.js"></script> <script src="/webjars/bootstrap/4.1.0/js/bootstrap.bundle.min.js"></script>
@ -94,6 +95,10 @@
</footer> </footer>
<script src="/js/core.js"></script> <script src="/js/core.js"></script>
<script src="/js/config.js"></script>
<script src="/js/odin.js"></script>
<th:block layout:fragment="scripts">
</th:block>
<!-- Yandex.Metrika counter --> <!-- Yandex.Metrika counter -->
<script type="text/javascript" > <script type="text/javascript" >
(function (d, w, c) { (function (d, w, c) {

@ -0,0 +1,17 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="headerfiles">
<meta charset="UTF-8"/>
</head>
<body>
<div th:fragment="noRecords(entities, noRecordsMessage, url)" class="col-12 text-center"
style="background-color: white;">
<div th:if="*{#lists.isEmpty(entities)}">
<div th:text="'Еще не создано ни'+${noRecordsMessage}"/>
<a th:href="@{${url}+'?id=0'}">
Перейдите по ссылке, чтобы добавить
</a>
</div>
</div>
</body>
</html>

@ -17,6 +17,7 @@
<div th:replace="grants/fragments/grantDashboardFragment :: grantDashboard(grant=${grant})"/> <div th:replace="grants/fragments/grantDashboardFragment :: grantDashboard(grant=${grant})"/>
</th:block> </th:block>
</div> </div>
<div th:replace="fragments/noRecordsFragment :: noRecords(entities=${grants}, noRecordsMessage=' одного гранта', url='grant')"/>
</div> </div>
</section> </section>
</div> </div>

@ -24,6 +24,7 @@
</div> </div>
<div class="col-md-3 col-sm-12"> <div class="col-md-3 col-sm-12">
</div> </div>
<div th:replace="fragments/noRecordsFragment :: noRecords(entities=${grants}, noRecordsMessage=' одного гранта', url='grant')"/>
</div> </div>
</div> </div>
</section> </section>

@ -88,7 +88,7 @@
</div> </div>
</div> </div>
<div class="col-md-4 col-sm-6 portfolio-item"> <div class="col-md-4 col-sm-6 portfolio-item">
<a class="portfolio-link" data-toggle="modal" href="/students"> <a class="portfolio-link" href="./students/tasks">
<div class="portfolio-hover"> <div class="portfolio-hover">
<div class="portfolio-hover-content"> <div class="portfolio-hover-content">
<i class="fa fa-arrow-right fa-3x"></i> <i class="fa fa-arrow-right fa-3x"></i>

@ -18,6 +18,7 @@
<div th:replace="papers/fragments/paperDashboardFragment :: paperDashboard(paper=${paper})"/> <div th:replace="papers/fragments/paperDashboardFragment :: paperDashboard(paper=${paper})"/>
</th:block> </th:block>
</div> </div>
<div th:replace="fragments/noRecordsFragment :: noRecords(entities=${papers}, noRecordsMessage=' одной статьи', url='paper')"/>
</div> </div>
</section> </section>
</div> </div>

@ -10,7 +10,13 @@
<span th:replace="papers/fragments/paperStatusFragment :: paperStatus(paperStatus=${paper.status})"/> <span th:replace="papers/fragments/paperStatusFragment :: paperStatus(paperStatus=${paper.status})"/>
</div> </div>
<div class="col col-10 text-right"> <div class="col col-10 text-right">
<h7 class="service-heading" th:text="${paper.title}"> title</h7> <p th:if="${paper.url!=null and paper.url!=''}"><a target="_blank" th:href="${paper.url}"><i
class="fa fa-external-link fa-1x"
aria-hidden="true"></i></a></p>
<p th:unless="${paper.url!=null and paper.url!=''}"><i class="fa fa-fw fa-2x" aria-hidden="true"></i></p>
<a th:href="'paper?id='+${paper.id}">
<h7 class="service-heading" th:text="${paper.title}"> title</h7>
</a>
<p class="text-muted" th:text="${paper.authorsString}">authors</p> <p class="text-muted" th:text="${paper.authorsString}">authors</p>
</div> </div>
</div> </div>

@ -3,7 +3,7 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{default}" xmlns:th="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/html"> layout:decorate="~{default}" xmlns:th="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/html">
<head> <head>
<link rel="stylesheet" href="../css/paper.css"/>
</head> </head>
<body> <body>
@ -50,6 +50,13 @@
th:field="*{comment}"></textarea> th:field="*{comment}"></textarea>
</div> </div>
<div class="form-group">
<label for="title">Ссылка на сайт конференции:</label>
<input class="form-control" id="url" type="text"
placeholder="Url"
th:field="*{url}"/>
</div>
<div class="form-group"> <div class="form-group">
<label>Дедлайны:</label> <label>Дедлайны:</label>
<div class="row" th:each="deadline, rowStat : *{deadlines}"> <div class="row" th:each="deadline, rowStat : *{deadlines}">
@ -91,6 +98,34 @@
<p th:if="${#fields.hasErrors('authorIds')}" th:errors="*{authorIds}" <p th:if="${#fields.hasErrors('authorIds')}" th:errors="*{authorIds}"
class="alert alert-danger">Incorrect title</p> class="alert alert-danger">Incorrect title</p>
</div> </div>
<div class="form-group" id="files-list">
<label>Файлы:</label>
<th:block th:each="file, rowStat : *{files}">
<div class="row" th:id="|files${rowStat.index}|"
th:style="${file.deleted} ? 'display: none;' :''">
<input type="hidden" th:field="*{files[__${rowStat.index}__].id}"/>
<input type="hidden" th:field="*{files[__${rowStat.index}__].deleted}"/>
<input type="hidden" th:field="*{files[__${rowStat.index}__].name}"/>
<input type="hidden" th:field="*{files[__${rowStat.index}__].tmpFileName}"/>
<div class="col-2">
<a class="btn btn-danger float-right"
th:onclick="|$('#files${rowStat.index}\\.deleted').val('true'); $('#files${rowStat.index}').hide(); |">
<span aria-hidden="true"><i class="fa fa-times"/></span>
</a>
</div>
<div class="col-10">
<a th:onclick="${file.id==null} ? 'downloadFile('+${file.tmpFileName}+',null,\''+${file.name}+'\')':
'downloadFile(null,'+${file.id}+',\''+${file.name}+'\')' "
href="javascript:void(0)"
th:text="*{files[__${rowStat.index}__].name}">
</a>
</div>
</div>
</th:block>
</div>
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="locked" <input type="checkbox" class="form-check-input" id="locked"
th:field="*{locked}"/> th:field="*{locked}"/>
@ -166,16 +201,103 @@
new FileLoader({ new FileLoader({
div: "loader", div: "loader",
url: urlFileUpload, url: urlFileUpload,
maxSize: 1.5, maxSize: -1,
extensions: ["doc", "docx", "xls", "jpg", "pdf", "txt", "png"], extensions: [],
callback: function (response) { callback: function (response) {
showFeedbackMessage("Файл успешно загружен"); showFeedbackMessage("Файл успешно загружен");
console.debug(response); console.debug(response);
addNewFile(response);
} }
}); });
$('.selectpicker').selectpicker(); $('.selectpicker').selectpicker();
}); });
/*]]>*/ /*]]>*/
function addNewFile(fileDto) {
var fileNumber = $("#files-list div.row").length;
var newFileRow = $("<div/>")
.attr("id", 'files' + fileNumber)
.addClass("row");
var idInput = $("<input/>")
.attr("type", "hidden")
.attr("id", "files" + fileNumber + ".id")
.attr("value", '')
.attr("name", "files[" + fileNumber + "].id");
newFileRow.append(idInput);
var flagInput = $("<input/>")
.attr("type", "hidden")
.attr("id", "files" + fileNumber + ".deleted")
.attr("value", "false")
.attr("name", "files[" + fileNumber + "].deleted");
newFileRow.append(flagInput);
var nameInput = $("<input/>")
.attr("type", "hidden")
.attr("id", "files" + fileNumber + ".name")
.attr("value", fileDto.fileName)
.attr("name", "files[" + fileNumber + "].name");
newFileRow.append(nameInput);
var tmpFileNameInput = $("<input/>")
.attr("type", "hidden")
.attr("id", "files" + fileNumber + ".tmpFileName")
.attr("value", fileDto.tmpFileName)
.attr("name", "files[" + fileNumber + "].tmpFileName");
newFileRow.append(tmpFileNameInput);
var nextDiv = $("<div/>")
.addClass("col-2");
var nextA = $("<a/>")
.addClass("btn btn-danger float-right")
.attr("onclick", "$('#files" + fileNumber + "\\\\.deleted').val('true'); $('#files" + fileNumber + "').hide();")
.append(($("<span/>").attr("aria-hidden", "true")).append($("<i/>").addClass("fa fa-times")))
;
nextDiv.append(nextA)
newFileRow.append(nextDiv);
var nameDiv = $("<div/>")
.addClass("col-10")
.append($("<a/>").text(fileDto.fileName)
.attr("href", 'javascript:void(0)')
.attr("onclick", "downloadFile('" + fileDto.tmpFileName + "',null,'" + fileDto.fileName + "')"));
newFileRow.append(nameDiv);
$("#files-list").append(newFileRow);
}
function downloadFile(tmpName, fileId, downloadName) {
let xhr = new XMLHttpRequest();
if (fileId != null) xhr.open('GET', urlFileDownload + fileId);
if (tmpName != null) xhr.open('GET', urlFileDownloadTmp + tmpName);
xhr.responseType = 'blob';
var formData = new FormData();
if (fileId != null) formData.append("file-id", fileId);
if (tmpName != null) formData.append("tmp-file-name", tmpName);
xhr.send(formData);
xhr.onload = function () {
if (this.status == 200) {
console.debug(this.response);
var blob = new Blob([this.response], {type: '*'});
let a = document.createElement("a");
a.style = "display: none";
document.body.appendChild(a);
let url = window.URL.createObjectURL(blob);
a.href = url;
a.download = downloadName;
a.click();
window.URL.revokeObjectURL(url);
} else {
}
}
}
</script> </script>
</div> </div>

@ -43,6 +43,7 @@
</div> </div>
</div> </div>
</div> </div>
<div th:replace="fragments/noRecordsFragment :: noRecords(entities=${filteredPapers.papers}, noRecordsMessage=' одной статьи', url='paper')"/>
</div> </div>
</section> </section>

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="default" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<div class="container" layout:fragment="content">
<section id="services">
<div class="container">
<div class="col-lg-12 text-center">
<h2 class="section-heading text-uppercase">Работа со студентами</h2>
<div th:replace="students/fragments/taskNavigationFragment"/>
</div>
<hr/>
<div class="row justify-content-center" id="dashboard">
<div th:replace="students/fragments/taskDashboardFragment"/>
<!--<th:block th:each="task : ${tasks}">-->
<!--<div th:replace="students/fragments/taskDashboardFragment :: taskDashboard(task=${task})"/>-->
<!--</th:block>-->
</div>
</div>
</section>
</div>
</body>
</html>

@ -0,0 +1,24 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="headerfiles">
<meta charset="UTF-8"/>
</head>
<body>
<div th:fragment="taskDashboard (task)" 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 th:replace="students/fragments/taskStatusFragment :: taskStatus(taskStatus=${task.status})"/>-->
<span th:replace="students/fragments/taskStatusFragment"/>
</div>
<div class="col col-10 text-right">
<!--<h7 class="service-heading" th:text="${task.title}"> title</h7>-->
<!--<p class="text-muted" th:text="${task.typeString}">authors</p>-->
<h7 class="service-heading" th:text="Title"> title</h7>
<p class="text-muted" th:text="Type">type</p>
</div>
</div>
</div>
</body>
</html>

@ -0,0 +1,22 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="headerfiles">
<meta charset="UTF-8"/>
</head>
<body>
<div class="row text-left task-row" style="background-color: white;">
<div class="col">
<span th:replace="students/fragments/taskStatusFragment"/>
<a th:href="@{'task?id='+ 1}">
<span class="h6" >Первая хадач</span>
<span class="text-muted">Курсовая работа</span>
</a>
<input class="id-class" type="hidden" th:value="1" />
<a class="remove-task pull-right d-none" th:href="@{'/students/delete/'+1}"
data-confirm="Удалить задачу?">
<i class="fa fa-trash" aria-hidden="true"></i>
</a>
</div>
</div>
</body>
</html>

@ -0,0 +1,25 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="headerfiles">
</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="./tasks" 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="./task" class="btn btn-light toolbar-button"><i class="fa fa-plus-circle"
aria-hidden="true"></i>
Добавить задачу</a>
</div>
</div>
</body>
</html>

@ -0,0 +1,38 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="headerfiles">
<meta charset="UTF-8"/>
</head>
<body>
<span th:fragment="taskStatus (taskStatus)" class="fa-stack fa-1x">
<!--<th:block th:switch="${taskStatus.name()}">-->
<th:block th:switch="'ON_PREPARATION'">
<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-review"></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>
<div th:case="'ACCEPTED'">
<i class="fa fa-circle fa-stack-2x text-accepted"></i>
</div>
<div th:case="'NOT_ACCEPTED'">
<i class="fa fa-circle fa-stack-2x text-not-accepted"></i>
</div>
</th:block>
<i class="fa fa-check fa-stack-1x fa-inverse"></i>
</span>
</body>
</html>

@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="en"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="default" xmlns:th="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/html">
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-tagsinput/0.8.0/bootstrap-tagsinput.css"/>
<link rel="stylesheet" href="../css/tasks.css"/>
</head>
<body>
<div class="container" layout:fragment="content">
<section id="paper">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading text-uppercase">Редактирование задачи</h2>
<div th:replace="students/fragments/taskNavigationFragment"/>
</div>
</div>
<hr/>
<div class="row">
<div class="col-lg-12">
<form id="task-form" method="post">
<div class="row">
<div class="col-md-7 col-sm-12">
<input type="hidden" name="id"/>
<div class="form-group">
<label for="title">Название:</label>
<input class="form-control" id="title" type="text" placeholder="Название задачи"/>
<p class="help-block text-danger"></p>
</div>
<div class="form-group">
<label for="status">Статус:</label>
<select class="form-control" id="status">
<option>Status</option>
</select>
</div>
<div class="form-group">
<label for="comment">Описание задачи:</label>
<textarea class="form-control" rows="3" id="comment"></textarea>
</div>
<div class="form-group">
<label for="tags">Теги:</label>
<input class="form-control" data-role="tagsinput" placeholder="Теги задачи" id="tags"/>
</div>
<div class="form-group">
<label>Дедлайны задачи:</label>
<div class="row">
<input type="hidden" />
<div class="col-6">
<input type="date" class="form-control" name="deadline"/>
</div>
<div class="col-4">
<input class="form-control" type="text" placeholder="Описание"/>
</div>
<div class="col-2">
<a class="btn btn-danger float-right"><span
aria-hidden="true"><i class="fa fa-times"/></span>
</a>
</div>
</div>
</div>
<div class="form-group">
<input type="submit" id="addDeadline" name="addDeadline" class="btn btn-primary" value="Добавить
дедлайн"/>
</div>
<div class="clearfix"></div>
<div class="form-group">
<button id="sendMessageButton" name="save" class="btn btn-success text-uppercase"
type="submit">
Сохранить
</button>
<button id="cancelButton" class="btn btn-default text-uppercase" href="/students/tasks">
Отмена
</button>
</div>
</div>
<div class="col-md-4 offset-md-1 col-sm-12 offset-sm-0">
<div class="form-group">
<div class="row">
<div class="col">
<h6 class="my-0">Дата создания:</h6>
</div>
<div class="col">
<small class="text-muted">
<!--th:text="${taskDto.createDate == null ? '' : #dates.format(taskDto.createDate, 'dd.MM.yyyy HH:mm')}">-->
text
</small>
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col">
<h6 class="my-0">Дата изменения:</h6>
</div>
<div class="col">
<small class="text-muted">
<!--th:text="${paperDto.updateDate == null ? '' : #dates.format(paperDto.updateDate, 'dd.MM.yyyy HH:mm')}">-->
text
</small>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-tagsinput/0.8.0/bootstrap-tagsinput.min.js"></script>
</div>
</body>
</html>

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="en" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="default" xmlns:th="">
<head>
<link rel="stylesheet" href="../css/tasks.css"/>
</head>
<body>
<div class="container" layout:fragment="content">
<form id="tasks-form" method="post" th:action="@{'/tasks/tasks'}">
<input th:type="hidden" name="taskDeleteId" id="taskDeleteId"/>
<section id="tasks">
<div class="container">
<div class="row" id="task-list">
<div class="col-lg-12 text-center">
<h2 class="section-heading text-uppercase">Работа со студентами</h2>
<div th:replace="students/fragments/taskNavigationFragment"/>
</div>
</div>
<hr/>
<div class="row">
<div class="col-md-9 col-sm-12">
<th:block>
<div th:replace="students/fragments/taskLineFragment"/>
</th:block>
</div>
<div class="col-md-3 col-sm-12">
<div class="filter">
<h5>Фильтр:</h5>
<select class="form-control" id="status"
onchange="this.form.submit();">
<option value="">Все статусы</option>
<!--<option th:each="author: ${allAuthors}" th:value="${author.id}"-->
<!--th:text="${author.lastName}">lastName-->
<!--</option>-->
</select>
<select class="form-control" id="tags"
onchange="this.form.submit();">
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<option value="">Все типы</option>
<!--<option th:each="year: ${allYears}" th:value="${year}"-->
<!--th:text="${year}">year-->
<!--</option>-->
</select>
</div>
</div>
</div>
</div>
</section>
<div id="modalDelete"/>
</form>
<script src="/js/tasks.js"></script>
</div>
</body>
</html>
Loading…
Cancel
Save