diff --git a/README.md b/README.md index 53af6cf6c531a328fa4f5ff85e0c4bc46ad3c54a..5fae8e81c19fb79afaf82459b9aad305626770bb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Articleprocessor GROBID version 1.0 -- The main program runs at : *http://localhost:8080/api/grobid/upload* +- The main program runs at : *http://localhost:8080/upload* or *http://localhost:8080* - H2 database can be found on : *http://localhost:8080/h2-console/login.jsp?jsessionid=9af0ea4b83284ff0a4574769b0336943* - Password for the DBS can be found in : `resources/application.properties` - GROBID server available on address *http://158.196.98.65:8080/* at university network diff --git a/data/demo.mv.db b/data/demo.mv.db index cdc1df6ef55c635c76b86ef4d112f3c653d51549..53e4acaf43988a7bf54f4217885dc9ae2549665d 100644 Binary files a/data/demo.mv.db and b/data/demo.mv.db differ diff --git a/data/demo.trace.db b/data/demo.trace.db index de95b7428015061cb9a0889ca92dfcc37f4ad17b..bfff73f89d0b4a7472efd180b2cfc24560fbe703 100644 --- a/data/demo.trace.db +++ b/data/demo.trace.db @@ -676,3 +676,65 @@ Wrong user name or password [28000-232] at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) ... 50 more +2025-04-25 19:03:53.157120+02:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Nesprávne pouĹľĂvateÄľskĂ© meno alebo heslo +Wrong user name or password [28000-232] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:344) + at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:124) + at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:291) + at org.h2.server.web.WebServer.getConnection(WebServer.java:811) + at org.h2.server.web.WebApp.login(WebApp.java:1038) + at org.h2.server.web.WebApp.process(WebApp.java:226) + at org.h2.server.web.WebApp.processRequest(WebApp.java:176) + at org.h2.server.web.JakartaWebServlet.doGet(JakartaWebServlet.java:129) + at org.h2.server.web.JakartaWebServlet.doPost(JakartaWebServlet.java:166) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:1575) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Nesprávne pouĹľĂvateÄľskĂ© meno alebo heslo +Wrong user name or password [28000-232] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 50 more +2025-04-25 20:50:38.587546+02:00 jdbc[3]: exception +org.h2.jdbc.JdbcSQLDataException: Hodnota je prĂliš dlhá pre stÄşpec "TITLE CHARACTER VARYING(255)": "'He received the PhD degree from the National University of Singapore and his ad... (448)" +Value too long for column "TITLE CHARACTER VARYING(255)": "'He received the PhD degree from the National University of Singapore and his ad... (448)"; SQL statement: +insert into documents (abstract_text,category_id,content,doi,publication_year,publisher,status,target,title,id) values (?,?,?,?,?,?,?,?,?,default) [22001-232] diff --git a/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java b/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java index 548225f11197a1953683107783e5491efcfd4dd3..c3fd1d863ecd9d52b02797d22c9b171c97ae9588 100644 --- a/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java +++ b/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java @@ -2,15 +2,20 @@ package com.dre0059.articleprocessor.controller; import com.dre0059.articleprocessor.GrobidClient; import com.dre0059.articleprocessor.model.Dokument; +import com.dre0059.articleprocessor.model.Tag; +import com.dre0059.articleprocessor.repository.TagRepository; import com.dre0059.articleprocessor.service.CategoryService; import com.dre0059.articleprocessor.service.HeaderService; import com.dre0059.articleprocessor.service.ReferenceService; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -29,6 +34,7 @@ public class FileUploadController { private final ReferenceService referenceService; private final CategoryService categoryService; + public FileUploadController(GrobidClient grobidClient, HeaderService headerService, ReferenceService referenceService, CategoryService categoryService) { this.grobidClient = grobidClient; this.headerService = headerService; @@ -45,7 +51,11 @@ public class FileUploadController { @PostMapping("/api/upload") @ResponseBody - public ResponseEntity<?> handleFileUpload(@RequestParam("file") MultipartFile file, @RequestParam("categoryId") String categoryId) { + public ResponseEntity<?> handleFileUpload( + @RequestParam("file") MultipartFile file, + @RequestParam("categoryId") String categoryId, + @RequestParam("tags") List<String> tags) { + if (file.isEmpty()) { return ResponseEntity.badRequest().body("No file uploaded!"); } @@ -68,7 +78,7 @@ public class FileUploadController { String references = grobidClient.processReferences(tmpFile); //System.out.println("GROBID Reference processed: " + references); - Dokument savedDocument = headerService.processHeader(header, categoryId, tmpFile); + Dokument savedDocument = headerService.processHeader(header, categoryId, tags, tmpFile); //System.out.println("Header saved to database."); referenceService.extractReferences(references); diff --git a/src/main/java/com/dre0059/articleprocessor/controller/TagController.java b/src/main/java/com/dre0059/articleprocessor/controller/TagController.java new file mode 100644 index 0000000000000000000000000000000000000000..b7893b9bee8409ab704951db1ca7be6d5a73ad2d --- /dev/null +++ b/src/main/java/com/dre0059/articleprocessor/controller/TagController.java @@ -0,0 +1,31 @@ +package com.dre0059.articleprocessor.controller; + +import com.dre0059.articleprocessor.repository.TagRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api") +public class TagController { + //@Autowired + private final TagRepository tagRepository; + + public TagController(TagRepository tagRepository) { + this.tagRepository = tagRepository; + } + + @GetMapping("/tags") + public List<Map<String, String>> getTags(@RequestParam("term") String term) { + return tagRepository.findByTitleContainingIgnoreCase(term).stream() + .map(tag -> Map.of("id", tag.getTitle(), "text", tag.getTitle())) // pouĹľijeme title ako ID pre select2 + .collect(Collectors.toList()); + + } +} diff --git a/src/main/java/com/dre0059/articleprocessor/dto/DocumentDto.java b/src/main/java/com/dre0059/articleprocessor/dto/DocumentDto.java index 95d2875498e020efdc732fd52b475539b69c13d0..eba2f7da9b754970afb954b2c71f8d1da6011032 100644 --- a/src/main/java/com/dre0059/articleprocessor/dto/DocumentDto.java +++ b/src/main/java/com/dre0059/articleprocessor/dto/DocumentDto.java @@ -3,6 +3,9 @@ package com.dre0059.articleprocessor.dto; import lombok.Getter; import lombok.Setter; +import java.util.ArrayList; +import java.util.List; + @Getter @Setter public class DocumentDto { @@ -15,5 +18,5 @@ public class DocumentDto { private String publisher; private String target; - + private List<TagDto> tags; } diff --git a/src/main/java/com/dre0059/articleprocessor/dto/TagDto.java b/src/main/java/com/dre0059/articleprocessor/dto/TagDto.java new file mode 100644 index 0000000000000000000000000000000000000000..06bd1b07b7ef84311abb1aaa9c4d2178685b62c4 --- /dev/null +++ b/src/main/java/com/dre0059/articleprocessor/dto/TagDto.java @@ -0,0 +1,11 @@ +package com.dre0059.articleprocessor.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class TagDto { + private Long id; + private String title; +} diff --git a/src/main/java/com/dre0059/articleprocessor/mapper/DocumentMapper.java b/src/main/java/com/dre0059/articleprocessor/mapper/DocumentMapper.java index 8d9af72199e1221bf28a7b8d7dd11645f5538062..2823a862b169014073c98e0c804516baf8e4d7f1 100644 --- a/src/main/java/com/dre0059/articleprocessor/mapper/DocumentMapper.java +++ b/src/main/java/com/dre0059/articleprocessor/mapper/DocumentMapper.java @@ -8,7 +8,7 @@ import java.util.List; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring", uses = {TagMapper.class}) public interface DocumentMapper { //@Mapping(target = "publication_year", source = "year") @@ -28,4 +28,6 @@ public interface DocumentMapper { } } + + } diff --git a/src/main/java/com/dre0059/articleprocessor/mapper/TagMapper.java b/src/main/java/com/dre0059/articleprocessor/mapper/TagMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..824318d9536753eb8af47a19ece4657ab4d46487 --- /dev/null +++ b/src/main/java/com/dre0059/articleprocessor/mapper/TagMapper.java @@ -0,0 +1,18 @@ +package com.dre0059.articleprocessor.mapper; + +import com.dre0059.articleprocessor.dto.TagDto; +import com.dre0059.articleprocessor.model.Tag; +import org.mapstruct.Mapper; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface TagMapper { + TagDto toTagDto(Tag tag); + + Tag toTag(TagDto tagDto); + + List<TagDto> toTagDtoList(List<Tag> tags); + List<Tag> toTagList(List<TagDto> tagDtos); + +} diff --git a/src/main/java/com/dre0059/articleprocessor/model/Dokument.java b/src/main/java/com/dre0059/articleprocessor/model/Dokument.java index 0969142429d23a7effdef4880ac1e1390cead349..4017d5c1b6b4a8b2c6990e39bce5c51cffe9d57f 100644 --- a/src/main/java/com/dre0059/articleprocessor/model/Dokument.java +++ b/src/main/java/com/dre0059/articleprocessor/model/Dokument.java @@ -63,10 +63,20 @@ public class Dokument { joinColumns = @JoinColumn(name = "ID_document"), inverseJoinColumns = @JoinColumn(name = "ID_author") ) - @Cascade(org.hibernate.annotations.CascadeType.ALL) private List<Author> authors = new ArrayList<>(); + @ManyToMany + @JoinTable( + name = "document_tag", + joinColumns = @JoinColumn(name = "document_id"), + inverseJoinColumns = @JoinColumn(name = "tag_id") + ) + @Cascade(org.hibernate.annotations.CascadeType.ALL) + private List<Tag> tags = new ArrayList<>(); + + + public Dokument() {} public Dokument(String title, Integer year, String doi,String publisher, String status) { diff --git a/src/main/java/com/dre0059/articleprocessor/model/Tag.java b/src/main/java/com/dre0059/articleprocessor/model/Tag.java index 0ae537790ae3bd1cc2c7b2c2ae83c25d2cc56f3e..aba082fa143b358a436f4f21d9cb530853b51c95 100644 --- a/src/main/java/com/dre0059/articleprocessor/model/Tag.java +++ b/src/main/java/com/dre0059/articleprocessor/model/Tag.java @@ -7,8 +7,10 @@ import lombok.NoArgsConstructor; import lombok.Setter; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + @Entity -@AllArgsConstructor @NoArgsConstructor @Getter @Setter @@ -21,4 +23,10 @@ public class Tag { @Column(nullable = false, unique = true) private String title; + @ManyToMany(mappedBy = "tags") + private List<Dokument> documents = new ArrayList<>(); + + public Tag(String title) { + this.title = title; + } } diff --git a/src/main/java/com/dre0059/articleprocessor/repository/DocumentRepository.java b/src/main/java/com/dre0059/articleprocessor/repository/DocumentRepository.java index 84557ad5e69a9fe722093d3490d910eb819878a4..fb94ac6e3f7840c731f70154964d91e91d0e67fd 100644 --- a/src/main/java/com/dre0059/articleprocessor/repository/DocumentRepository.java +++ b/src/main/java/com/dre0059/articleprocessor/repository/DocumentRepository.java @@ -2,6 +2,7 @@ package com.dre0059.articleprocessor.repository; import com.dre0059.articleprocessor.model.*; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -14,6 +15,9 @@ import java.util.Optional; @Repository public interface DocumentRepository extends JpaRepository<Dokument, Long> { + @EntityGraph(attributePaths = {"tags"}) + Optional<Dokument> findWithTagsById(Long id); + @Query( "SELECT COUNT(d) > 0 " + "FROM Dokument d " + diff --git a/src/main/java/com/dre0059/articleprocessor/repository/TagRepository.java b/src/main/java/com/dre0059/articleprocessor/repository/TagRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..60134394ea3b0af29fce98829e6bd36e6bdfe050 --- /dev/null +++ b/src/main/java/com/dre0059/articleprocessor/repository/TagRepository.java @@ -0,0 +1,15 @@ +package com.dre0059.articleprocessor.repository; + +import com.dre0059.articleprocessor.model.Tag; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface TagRepository extends JpaRepository<Tag, Long> { + Optional<Tag> findByTitle(String title); + + List<Tag> findByTitleContainingIgnoreCase(String term); // musĂ vracaĹĄ List<Tag> + Optional<Tag> findByTitleIgnoreCase(String title); + +} diff --git a/src/main/java/com/dre0059/articleprocessor/service/DocumentService.java b/src/main/java/com/dre0059/articleprocessor/service/DocumentService.java index fb9a2606c6f9e4dce1e3264847ad2c147a269c28..c5cb5c07981e0d3b22bfd2a224a7f4d99d255d00 100644 --- a/src/main/java/com/dre0059/articleprocessor/service/DocumentService.java +++ b/src/main/java/com/dre0059/articleprocessor/service/DocumentService.java @@ -32,7 +32,9 @@ public class DocumentService { @Transactional public DocumentDto getDocumentById(Long documentId) { - Dokument dokument = documentRepository.findById(documentId).orElse(null); + //Dokument dokument = documentRepository.findById(documentId).orElse(null); + Dokument dokument = documentRepository.findWithTagsById(documentId) + .orElseThrow(() -> new IllegalArgumentException("Dokument not found with id: " + documentId)); // PouĹľitie mappera na konverziu dokumentu do DTO DocumentDto documentDto = documentMapper.toDocumentDto(dokument); diff --git a/src/main/java/com/dre0059/articleprocessor/service/HeaderService.java b/src/main/java/com/dre0059/articleprocessor/service/HeaderService.java index 828ac3e507b3d6104d4b35712c784d0536e3fb20..13ec99789d6ebb1f904368caadbc25fa673fd270 100644 --- a/src/main/java/com/dre0059/articleprocessor/service/HeaderService.java +++ b/src/main/java/com/dre0059/articleprocessor/service/HeaderService.java @@ -4,6 +4,7 @@ import com.dre0059.articleprocessor.dto.CategoryDto; import com.dre0059.articleprocessor.model.Author; import com.dre0059.articleprocessor.model.Category; import com.dre0059.articleprocessor.model.Dokument; +import com.dre0059.articleprocessor.model.Tag; import com.dre0059.articleprocessor.repository.AuthorRepository; import com.dre0059.articleprocessor.repository.CategoryRepository; import com.dre0059.articleprocessor.repository.DocumentRepository; @@ -16,6 +17,8 @@ import java.util.Map; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; + +import com.dre0059.articleprocessor.repository.TagRepository; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -33,8 +36,7 @@ public class HeaderService { private final AuthorRepository authorRepository; private final ReferenceService referenceService; private final CategoryRepository categoryRepository; - - //public Dokument(String title, Integer year, String doi, String abstractText, Integer pages, String publisher) { + private final TagRepository tagRepository; private String title; private Integer year; @@ -47,14 +49,19 @@ public class HeaderService { private String author; @Autowired - public HeaderService(DocumentRepository documentRepository, AuthorRepository authorRepository, ReferenceService referenceService, CategoryRepository categoryRepository) { + public HeaderService(DocumentRepository documentRepository, + AuthorRepository authorRepository, + ReferenceService referenceService, + CategoryRepository categoryRepository, + TagRepository tagRepository) { this.documentRepository = documentRepository; this.authorRepository = authorRepository; this.referenceService = referenceService; this.categoryRepository = categoryRepository; + this.tagRepository = tagRepository; } - public Dokument processHeader(String header, String categoryId, File pdfFile) { + public Dokument processHeader(String header, String categoryId, List<String> tags, File pdfFile) { this.title = this.parseHeaderFields(header, "title"); if(!this.parseHeaderFields(header, "doi").equals("Not found")){ @@ -101,6 +108,24 @@ public class HeaderService { System.out.println("Category: " + category); dokument.setCategory(category); + + List<Tag> tagEntities = new ArrayList<>(); + for (String tagName : tags) { + String lowerCase = tagName.trim().toLowerCase(); // konverzia na lowercase + + Optional<Tag> existingTag = tagRepository.findByTitleIgnoreCase(lowerCase); + + Tag tag = existingTag.orElseGet(() -> { + Tag newTag = new Tag(lowerCase); + return tagRepository.save(newTag); // uloĹľĂme novĂ˝ iba ak neexistuje + }); + + tagEntities.add(tag); + } + dokument.setTags(tagEntities); + + + try { dokument.setContent(FileUtils.readFileToByteArray(pdfFile)); } catch (IOException e) { diff --git a/src/main/resources/static/assets/img/background.png b/src/main/resources/static/assets/img/background.png deleted file mode 100644 index ba6a0290dd6308ef63b080ce4a8efa32f4270de5..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/background.png and /dev/null differ diff --git a/src/main/resources/static/assets/img/bg-showcase-1.jpg b/src/main/resources/static/assets/img/bg-showcase-1.jpg deleted file mode 100644 index 85985b93351ffe5c309b7b91bace7e836df80f5a..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/bg-showcase-1.jpg and /dev/null differ diff --git a/src/main/resources/static/assets/img/bg-showcase-2.jpg b/src/main/resources/static/assets/img/bg-showcase-2.jpg deleted file mode 100644 index 66a1c18c79156cafca97215d58015a46c5ea9093..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/bg-showcase-2.jpg and /dev/null differ diff --git a/src/main/resources/static/assets/img/bg-showcase-3.jpg b/src/main/resources/static/assets/img/bg-showcase-3.jpg deleted file mode 100644 index b429f32a0a769f2072fcec9495fe9cb2392e19f0..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/bg-showcase-3.jpg and /dev/null differ diff --git a/src/main/resources/static/assets/img/bg_pdf.png b/src/main/resources/static/assets/img/bg_pdf.png deleted file mode 100644 index c41708c36a1a16cfd554615ee458c8eb6630b9ea..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/bg_pdf.png and /dev/null differ diff --git a/src/main/resources/static/assets/img/bg_pdf1.png b/src/main/resources/static/assets/img/bg_pdf1.png deleted file mode 100644 index 34daa81ff3c7a9dc129476649fe14b77718d5e6a..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/bg_pdf1.png and /dev/null differ diff --git a/src/main/resources/static/assets/img/testimonials-1.jpg b/src/main/resources/static/assets/img/testimonials-1.jpg deleted file mode 100644 index 00127dfcd2b24221fee3a60d503b0f486f6e7ae4..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/testimonials-1.jpg and /dev/null differ diff --git a/src/main/resources/static/assets/img/testimonials-2.jpg b/src/main/resources/static/assets/img/testimonials-2.jpg deleted file mode 100644 index c180690d49238f55046295b83ea8046c2b53e6bc..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/testimonials-2.jpg and /dev/null differ diff --git a/src/main/resources/static/assets/img/testimonials-3.jpg b/src/main/resources/static/assets/img/testimonials-3.jpg deleted file mode 100644 index 5fea6d7b1e1b22d25ec77c1da371212f666ea6b1..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/assets/img/testimonials-3.jpg and /dev/null differ diff --git a/src/main/resources/templates/upload-success.html b/src/main/resources/templates/upload-success.html index 98923b0006c4a01b13836ff8ec0b7b70dbce399c..9beeb4f11e76946a30adfa550d0b9f057666fbd6 100644 --- a/src/main/resources/templates/upload-success.html +++ b/src/main/resources/templates/upload-success.html @@ -4,6 +4,7 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Upload Success</title> + <link rel="icon" type="image/x-icon" href="assets/favicon.ico" /> </head> <body> <h1>Upload Successful</h1> diff --git a/src/main/resources/templates/upload.html b/src/main/resources/templates/upload.html index 8f3647c66e4fcf2089f88eba3e30647c36fb1d29..180dcc82df3537db8d7db0f03d8a292fd3ccb6a7 100644 --- a/src/main/resources/templates/upload.html +++ b/src/main/resources/templates/upload.html @@ -7,6 +7,7 @@ <link rel="icon" type="image/x-icon" href="assets/favicon.ico" /> <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" type="text/css" /> <link href="https://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css" /> + <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" /> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> @@ -71,10 +72,14 @@ <form action="/api/grobid/upload" method="post" id="uploadForm" enctype="multipart/form-data"> <label for="fileInput" class="form-label">Choose PDF file:</label> <input class="form-control" type="file" id="fileInput" name="file" accept="application/pdf"> + <label for="category" class="form-label mt-3">Select Category:</label> <select class="form-select" id="category" name="category"> <option th:each="c: ${categories}" th:value="${c.getId()}" th:text="${c.getId() + ' ' + c.getName()}"></option> </select> + + <label for="tags" class="form-label mt-3">Tags:</label> + <select class="form-select" id="tags" name="tags" multiple="multiple" style="width: 100%"></select> </form> </div> </div> @@ -97,7 +102,12 @@ <h3>Response:</h3> <pre id="json-output" class="bg-light p-3 border rounded"></pre> </div> + +<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script> + + <script> + // NáhÄľad PDF sĂşboru document.getElementById('fileInput').addEventListener('change', function(event) { const file = event.target.files[0]; if (file && file.type === 'application/pdf') { @@ -107,18 +117,56 @@ preview.style.display = 'block'; document.getElementById('upload-button-wrapper').style.display = 'block'; - // Scroll hneÄŹ po vĂ˝bere sĂşboru preview.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else { alert('Please, choose a valid PDF file.'); } }); + // Inicializácia SELECT2 pre tagy + $(document).ready(function() { + $('#tags').select2({ + placeholder: "Add or select tags", + tags: true, + tokenSeparators: [','], + ajax: { + url: '/api/tags', + dataType: 'json', + delay: 250, + data: function (params) { + return { + term: params.term.toLowerCase() // đź‘ pošli lowercase na server + }; + }, + processResults: function (data) { + return { + results: data + }; + }, + cache: true + }, + createTag: function (params) { + let term = $.trim(params.term.toLowerCase()); // đź‘ vytváraj lowercase tagy + + if (term === '') { + return null; + } + + return { + id: term, + text: term, + newTag: true + }; + } + }); + + }); + // Odoslanie formulára $('#uploadForm').submit(function(event) { event.preventDefault(); - // animovane bodky + // animovanĂ© bodky let dotCount = 0; const dotsElement = document.getElementById('dots'); const dotInterval = setInterval(() => { @@ -126,21 +174,23 @@ dotsElement.textContent = ' .'.repeat(dotCount); }, 500); - // Zobraz správy o spracovanĂ document.getElementById('processing-message').style.display = 'block'; - const fileInput = $('#fileInput')[0].files[0]; const category = $('#category').val(); + const tags = $('#tags').val(); // Pole stringov z Select2 + if (!fileInput) { alert("Please select a PDF file first."); $('#processing-message').hide(); + clearInterval(dotInterval); return; } const formData = new FormData(); formData.append("file", fileInput); formData.append("categoryId", category); + formData.append("tags",tags); // DĂ´leĹľitĂ©! $.ajax({ url: "/api/upload", @@ -150,10 +200,8 @@ contentType: false, success: function(response) { clearInterval(dotInterval); - $('#processing-message').hide(); - console.log("Upload success:", response); if (response.id) { window.location.href = '/view/' + response.id; } else { @@ -162,16 +210,14 @@ }, error: function() { clearInterval(dotInterval); - $('#processing-message').hide(); alert("Error processing PDF."); } }); }); +</script> - -</script> <section class="features-icons bg-light text-center mt-5"> <div class="container"> <div class="row"> diff --git a/src/main/resources/templates/view-pdf.html b/src/main/resources/templates/view-pdf.html index 09832b8a690e9700ccac5d2579a59f66921ab818..5ba8eab3f7943976b070525bc110453509cc599c 100644 --- a/src/main/resources/templates/view-pdf.html +++ b/src/main/resources/templates/view-pdf.html @@ -4,6 +4,7 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>View single PDF</title> + <link rel="icon" type="image/x-icon" href="assets/favicon.ico" /> <!-- Bootstrap CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="/styles.css">