mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2024-11-11 02:10:11 +01:00
Added functionality to set font size and font type in both frontend and backend. (#1783)
* Added variables * Added functionality to add font size and font type in both frontend and backend * new changes suggested has been added --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
This commit is contained in:
parent
d5b0f1f4ab
commit
c650a766a9
@ -31,6 +31,7 @@ public class SPdfApplication {
|
|||||||
|
|
||||||
@Autowired private Environment env;
|
@Autowired private Environment env;
|
||||||
|
|
||||||
|
|
||||||
@Autowired ApplicationProperties applicationProperties;
|
@Autowired ApplicationProperties applicationProperties;
|
||||||
|
|
||||||
private static String serverPortStatic;
|
private static String serverPortStatic;
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package stirling.software.SPDF.config.security;
|
package stirling.software.SPDF.config.security;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.MessageSource;
|
import org.springframework.context.MessageSource;
|
||||||
import org.springframework.context.i18n.LocaleContextHolder;
|
import org.springframework.context.i18n.LocaleContextHolder;
|
||||||
@ -13,6 +17,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.security.oauth2.core.user.OAuth2User;
|
import org.springframework.security.oauth2.core.user.OAuth2User;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import stirling.software.SPDF.config.DatabaseBackupInterface;
|
import stirling.software.SPDF.config.DatabaseBackupInterface;
|
||||||
import stirling.software.SPDF.config.security.session.SessionPersistentRegistry;
|
import stirling.software.SPDF.config.security.session.SessionPersistentRegistry;
|
||||||
import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface;
|
import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface;
|
||||||
@ -23,10 +28,6 @@ import stirling.software.SPDF.model.User;
|
|||||||
import stirling.software.SPDF.repository.AuthorityRepository;
|
import stirling.software.SPDF.repository.AuthorityRepository;
|
||||||
import stirling.software.SPDF.repository.UserRepository;
|
import stirling.software.SPDF.repository.UserRepository;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class UserService implements UserServiceInterface {
|
public class UserService implements UserServiceInterface {
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ public class PageNumbersController {
|
|||||||
"This operation takes an input PDF file and adds page numbers to it. Input:PDF Output:PDF Type:SISO")
|
"This operation takes an input PDF file and adds page numbers to it. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> addPageNumbers(@ModelAttribute AddPageNumbersRequest request)
|
public ResponseEntity<byte[]> addPageNumbers(@ModelAttribute AddPageNumbersRequest request)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
MultipartFile file = request.getFileInput();
|
MultipartFile file = request.getFileInput();
|
||||||
String customMargin = request.getCustomMargin();
|
String customMargin = request.getCustomMargin();
|
||||||
int position = request.getPosition();
|
int position = request.getPosition();
|
||||||
@ -52,7 +53,8 @@ public class PageNumbersController {
|
|||||||
int pageNumber = startingNumber;
|
int pageNumber = startingNumber;
|
||||||
byte[] fileBytes = file.getBytes();
|
byte[] fileBytes = file.getBytes();
|
||||||
PDDocument document = Loader.loadPDF(fileBytes);
|
PDDocument document = Loader.loadPDF(fileBytes);
|
||||||
|
float font_size = request.getFontSize();
|
||||||
|
String font_type = request.getFontType();
|
||||||
float marginFactor;
|
float marginFactor;
|
||||||
switch (customMargin.toLowerCase()) {
|
switch (customMargin.toLowerCase()) {
|
||||||
case "small":
|
case "small":
|
||||||
@ -73,7 +75,7 @@ public class PageNumbersController {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
float fontSize = 12.0f;
|
float fontSize = font_size;
|
||||||
if (pagesToNumber == null || pagesToNumber.length() == 0) {
|
if (pagesToNumber == null || pagesToNumber.length() == 0) {
|
||||||
pagesToNumber = "all";
|
pagesToNumber = "all";
|
||||||
}
|
}
|
||||||
@ -131,7 +133,20 @@ public class PageNumbersController {
|
|||||||
new PDPageContentStream(
|
new PDPageContentStream(
|
||||||
document, page, PDPageContentStream.AppendMode.APPEND, true, true);
|
document, page, PDPageContentStream.AppendMode.APPEND, true, true);
|
||||||
contentStream.beginText();
|
contentStream.beginText();
|
||||||
contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.HELVETICA), fontSize);
|
switch (font_type.toLowerCase()) {
|
||||||
|
case "helvetica":
|
||||||
|
contentStream.setFont(
|
||||||
|
new PDType1Font(Standard14Fonts.FontName.HELVETICA), fontSize);
|
||||||
|
break;
|
||||||
|
case "courier":
|
||||||
|
contentStream.setFont(
|
||||||
|
new PDType1Font(Standard14Fonts.FontName.COURIER), fontSize);
|
||||||
|
break;
|
||||||
|
case "times":
|
||||||
|
contentStream.setFont(
|
||||||
|
new PDType1Font(Standard14Fonts.FontName.TIMES_ROMAN), fontSize);
|
||||||
|
break;
|
||||||
|
}
|
||||||
contentStream.newLineAtOffset(x, y);
|
contentStream.newLineAtOffset(x, y);
|
||||||
contentStream.showText(text);
|
contentStream.showText(text);
|
||||||
contentStream.endText();
|
contentStream.endText();
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package stirling.software.SPDF.controller.web;
|
package stirling.software.SPDF.controller.web;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import java.time.Instant;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import java.time.temporal.ChronoUnit;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import java.util.*;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import java.util.stream.Collectors;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.Authentication;
|
||||||
@ -13,6 +13,14 @@ import org.springframework.security.oauth2.core.user.OAuth2User;
|
|||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import stirling.software.SPDF.config.security.session.SessionPersistentRegistry;
|
import stirling.software.SPDF.config.security.session.SessionPersistentRegistry;
|
||||||
import stirling.software.SPDF.model.*;
|
import stirling.software.SPDF.model.*;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2;
|
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2;
|
||||||
@ -22,11 +30,6 @@ import stirling.software.SPDF.model.provider.GoogleProvider;
|
|||||||
import stirling.software.SPDF.model.provider.KeycloakProvider;
|
import stirling.software.SPDF.model.provider.KeycloakProvider;
|
||||||
import stirling.software.SPDF.repository.UserRepository;
|
import stirling.software.SPDF.repository.UserRepository;
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.time.temporal.ChronoUnit;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Tag(name = "Account Security", description = "Account Security APIs")
|
@Tag(name = "Account Security", description = "Account Security APIs")
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package stirling.software.SPDF.model;
|
package stirling.software.SPDF.model;
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -9,6 +7,8 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "users")
|
@Table(name = "users")
|
||||||
public class User implements Serializable {
|
public class User implements Serializable {
|
||||||
|
@ -15,6 +15,9 @@ public class AddPageNumbersRequest extends PDFWithPageNums {
|
|||||||
allowableValues = {"small", "medium", "large"})
|
allowableValues = {"small", "medium", "large"})
|
||||||
private String customMargin;
|
private String customMargin;
|
||||||
|
|
||||||
|
private float fontSize;
|
||||||
|
private String fontType;
|
||||||
|
|
||||||
@Schema(description = "Position: 1 of 9 positions", minimum = "1", maximum = "9")
|
@Schema(description = "Position: 1 of 9 positions", minimum = "1", maximum = "9")
|
||||||
private int position;
|
private int position;
|
||||||
|
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
package stirling.software.SPDF.repository;
|
package stirling.software.SPDF.repository;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
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 org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
import stirling.software.SPDF.model.User;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
import stirling.software.SPDF.model.User;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface UserRepository extends JpaRepository<User, Long> {
|
public interface UserRepository extends JpaRepository<User, Long> {
|
||||||
|
@ -262,5 +262,4 @@ public class GeneralUtils {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
###########
|
###########
|
||||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
||||||
language.direction=ltr
|
language.direction=ltr
|
||||||
|
addPageNumbers.fontSize=Font Size
|
||||||
|
addPageNumbers.fontName=Font Name
|
||||||
pdfPrompt=Select PDF(s)
|
pdfPrompt=Select PDF(s)
|
||||||
multiPdfPrompt=Select PDFs (2+)
|
multiPdfPrompt=Select PDFs (2+)
|
||||||
multiPdfDropPrompt=Select (or drag & drop) all PDFs you require
|
multiPdfDropPrompt=Select (or drag & drop) all PDFs you require
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
###########
|
###########
|
||||||
# the direction that the language is written (ltr=left to right, rtl = right to left)
|
# the direction that the language is written (ltr=left to right, rtl = right to left)
|
||||||
language.direction=ltr
|
language.direction=ltr
|
||||||
|
addPageNumbers.fontSize=Font Size
|
||||||
|
addPageNumbers.fontName=Font Name
|
||||||
pdfPrompt=Select PDF(s)
|
pdfPrompt=Select PDF(s)
|
||||||
multiPdfPrompt=Select PDFs (2+)
|
multiPdfPrompt=Select PDFs (2+)
|
||||||
multiPdfDropPrompt=Select (or drag & drop) all PDFs you require
|
multiPdfDropPrompt=Select (or drag & drop) all PDFs you require
|
||||||
|
@ -1,140 +1,153 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="https://www.thymeleaf.org">
|
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="https://www.thymeleaf.org">
|
||||||
<head>
|
<head>
|
||||||
<th:block th:insert="~{fragments/common :: head(title=#{addPageNumbers.title}, header=#{addPageNumbers.header})}"></th:block>
|
<th:block th:insert="~{fragments/common :: head(title=#{addPageNumbers.title}, header=#{addPageNumbers.header})}"></th:block>
|
||||||
<style>
|
<style>
|
||||||
.a4container {
|
.a4container {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
aspect-ratio: 0.707/1;
|
aspect-ratio: 0.707/1;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pageNumber {
|
.pageNumber {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
color: #333;
|
color: #333;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background-color: #ccc;
|
background-color: #ccc;
|
||||||
width: 15%;
|
width: 15%;
|
||||||
height: 15%;
|
height: 15%;
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.pageNumber:hover {
|
.pageNumber:hover {
|
||||||
background-color: #eee;
|
background-color: #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
#myForm {
|
#myForm {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.selectedPosition {
|
.selectedPosition {
|
||||||
background-color: #0a0;
|
background-color: #0a0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.selectedPosition.selectedHovered {
|
.selectedPosition.selectedHovered {
|
||||||
background-color: #006600;
|
background-color: #006600;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<th:block th:insert="~{fragments/common :: game}"></th:block>
|
<th:block th:insert="~{fragments/common :: game}"></th:block>
|
||||||
<div id="page-container">
|
<div id="page-container">
|
||||||
<div id="content-wrap">
|
<div id="content-wrap">
|
||||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||||
<br><br>
|
<br><br>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row justify-content-center">
|
<div class="row justify-content-center">
|
||||||
<div class="col-md-6 bg-card">
|
<div class="col-md-6 bg-card">
|
||||||
<div class="tool-header">
|
<div class="tool-header">
|
||||||
<span class="material-symbols-rounded tool-header-icon other">123</span>
|
<span class="material-symbols-rounded tool-header-icon other">123</span>
|
||||||
<span class="tool-header-text" th:text="#{addPageNumbers.header}"></span>
|
<span class="tool-header-text" th:text="#{addPageNumbers.header}"></span>
|
||||||
</div>
|
|
||||||
<form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/misc/add-page-numbers'}">
|
|
||||||
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div>
|
|
||||||
<br>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="customMargin" th:text="#{addPageNumbers.selectText.2}"></label>
|
|
||||||
<select class="form-control" id="customMargin" name="customMargin">
|
|
||||||
<option value="small" th:text="#{sizes.small}"></option>
|
|
||||||
<option value="medium" selected th:text="#{sizes.medium}"></option>
|
|
||||||
<option value="large" th:text="#{sizes.large}"></option>
|
|
||||||
<option value="x-large" th:text="#{sizes.x-large}"></option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label th:text="#{addPageNumbers.selectText.3}"></label>
|
|
||||||
<div class="a4container">
|
|
||||||
<div class="pageNumber" id="1" style="top: 10%; left: 10%;">1</div>
|
|
||||||
<div class="pageNumber" id="2" style="top: 10%; left: 50%;">2</div>
|
|
||||||
<div class="pageNumber" id="3" style="top: 10%; left: 90%;">3</div>
|
|
||||||
<div class="pageNumber" id="4" style="top: 50%; left: 10%;">4</div>
|
|
||||||
<div class="pageNumber" id="5" style="top: 50%; left: 50%;">5</div>
|
|
||||||
<div class="pageNumber" id="6" style="top: 50%; left: 90%;">6</div>
|
|
||||||
<div class="pageNumber" id="7" style="top: 90%; left: 10%;">7</div>
|
|
||||||
<div class="pageNumber selectedPosition" id="8" style="top: 90%; left: 50%;">8</div>
|
|
||||||
<div class="pageNumber" id="9" style="top: 90%; left: 90%;">9</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="hidden" id="numberInput" name="position" value="8">
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="startingNumber" th:text="#{addPageNumbers.selectText.4}"></label>
|
|
||||||
<input type="number" class="form-control" id="startingNumber" name="startingNumber" min="1" required value="1">
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="pagesToNumber" th:text="#{addPageNumbers.selectText.5}"></label>
|
|
||||||
<input type="text" class="form-control" id="pagesToNumber" name="pagesToNumber" th:placeholder="#{addPageNumbers.numberPagesDesc}">
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="customText" th:text="#{addPageNumbers.selectText.6}"></label>
|
|
||||||
<input type="text" class="form-control" id="customText" name="customText" th:placeholder="#{addPageNumbers.customNumberDesc}">
|
|
||||||
</div>
|
|
||||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{addPageNumbers.submit}"></button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/misc/add-page-numbers'}">
|
||||||
|
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div>
|
||||||
|
<br>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="customMargin" th:text="#{addPageNumbers.selectText.2}"></label>
|
||||||
|
<select class="form-control" id="customMargin" name="customMargin">
|
||||||
|
<option value="small" th:text="#{sizes.small}"></option>
|
||||||
|
<option value="medium" selected th:text="#{sizes.medium}"></option>
|
||||||
|
<option value="large" th:text="#{sizes.large}"></option>
|
||||||
|
<option value="x-large" th:text="#{sizes.x-large}"></option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label th:text="#{addPageNumbers.selectText.3}"></label>
|
||||||
|
<div class="a4container">
|
||||||
|
<div class="pageNumber" id="1" style="top: 10%; left: 10%;">1</div>
|
||||||
|
<div class="pageNumber" id="2" style="top: 10%; left: 50%;">2</div>
|
||||||
|
<div class="pageNumber" id="3" style="top: 10%; left: 90%;">3</div>
|
||||||
|
<div class="pageNumber" id="4" style="top: 50%; left: 10%;">4</div>
|
||||||
|
<div class="pageNumber" id="5" style="top: 50%; left: 50%;">5</div>
|
||||||
|
<div class="pageNumber" id="6" style="top: 50%; left: 90%;">6</div>
|
||||||
|
<div class="pageNumber" id="7" style="top: 90%; left: 10%;">7</div>
|
||||||
|
<div class="pageNumber selectedPosition" id="8" style="top: 90%; left: 50%;">8</div>
|
||||||
|
<div class="pageNumber" id="9" style="top: 90%; left: 90%;">9</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="numberInput" name="position" value="8">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="fontSize" th:text="#{addPageNumbers.fontSize}"></label>
|
||||||
|
<input type="number" class="form-control" id="fontSize" name="fontSize" min="1" value="12" required>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="fontType" th:text="#{addPageNumbers.fontName}"></label>
|
||||||
|
<select class="form-control" id="fontType" name="fontType">
|
||||||
|
<option value="Times Roman">Times</option>
|
||||||
|
|
||||||
|
<option value="Helvetica">Helvetica</option>
|
||||||
|
<option value="Courier New">Courier</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="startingNumber" th:text="#{addPageNumbers.selectText.4}"></label>
|
||||||
|
<input type="number" class="form-control" id="startingNumber" name="startingNumber" min="1" required value="1">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="pagesToNumber" th:text="#{addPageNumbers.selectText.5}"></label>
|
||||||
|
<input type="text" class="form-control" id="pagesToNumber" name="pagesToNumber" th:placeholder="#{addPageNumbers.numberPagesDesc}">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="customText" th:text="#{addPageNumbers.selectText.6}"></label>
|
||||||
|
<input type="text" class="form-control" id="customText" name="customText" th:placeholder="#{addPageNumbers.customNumberDesc}">
|
||||||
|
</div>
|
||||||
|
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{addPageNumbers.submit}"></button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
|
||||||
let cells = document.querySelectorAll('.pageNumber');
|
|
||||||
let inputField = document.getElementById('numberInput');
|
|
||||||
|
|
||||||
cells.forEach(cell => {
|
|
||||||
cell.addEventListener('click', function(e) {
|
|
||||||
cells.forEach(cell => {
|
|
||||||
cell.classList.remove('selectedPosition'); // Remove selected class from all cells
|
|
||||||
cell.classList.remove('selectedHovered'); // Also remove selectedHovered class
|
|
||||||
});
|
|
||||||
let selectedLocation = e.target.id;
|
|
||||||
inputField.value = selectedLocation;
|
|
||||||
e.target.classList.add('selectedPosition'); // Add selected class to clicked cell
|
|
||||||
e.target.classList.add('selectedHovered'); // Add selectedHovered class
|
|
||||||
});
|
|
||||||
|
|
||||||
cell.addEventListener('mouseenter', function(e) {
|
|
||||||
if(e.target.classList.contains('selectedPosition')) {
|
|
||||||
e.target.classList.add('selectedHovered');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
cell.addEventListener('mouseleave', function(e) {
|
|
||||||
if(e.target.classList.contains('selectedPosition')) {
|
|
||||||
e.target.classList.remove('selectedHovered');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</div>
|
</div>
|
||||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
<script>
|
||||||
|
let cells = document.querySelectorAll('.pageNumber');
|
||||||
|
let inputField = document.getElementById('numberInput');
|
||||||
|
|
||||||
|
cells.forEach(cell => {
|
||||||
|
cell.addEventListener('click', function(e) {
|
||||||
|
cells.forEach(cell => {
|
||||||
|
cell.classList.remove('selectedPosition'); // Remove selected class from all cells
|
||||||
|
cell.classList.remove('selectedHovered'); // Also remove selectedHovered class
|
||||||
|
});
|
||||||
|
let selectedLocation = e.target.id;
|
||||||
|
inputField.value = selectedLocation;
|
||||||
|
e.target.classList.add('selectedPosition'); // Add selected class to clicked cell
|
||||||
|
e.target.classList.add('selectedHovered'); // Add selectedHovered class
|
||||||
|
});
|
||||||
|
|
||||||
|
cell.addEventListener('mouseenter', function(e) {
|
||||||
|
if(e.target.classList.contains('selectedPosition')) {
|
||||||
|
e.target.classList.add('selectedHovered');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
cell.addEventListener('mouseleave', function(e) {
|
||||||
|
if(e.target.classList.contains('selectedPosition')) {
|
||||||
|
e.target.classList.remove('selectedHovered');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
Loading…
Reference in New Issue
Block a user