Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/SecurityConfiguration.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/SecurityConfiguration.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/SecurityConfiguration.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -30,5 +30,7 @@
         http.csrf(AbstractHttpConfigurer::disable)
                 .authorizeHttpRequests(request -> request
-                        .requestMatchers("/api/job-advertisements/all","/api/job-advertisements/view/**","/api/recruiter/info/**", "/api/auth/**").permitAll()
+                        // TO DO: FIX PERMISSIONS
+                        .requestMatchers("/api/job-advertisements/**","/api/job-advertisements/view/**","/api/recruiter/info/**",
+                                "/api/job-advertisements/apply/**","/api/auth/**", "/api/resume/**", "/api/my-applications/**", "/api/applications/{id}/update").permitAll()
                         //.requestMatchers("/api/job-advertisements/**").hasAnyAuthority(Role.ROLE_RECRUITER.name())
                         .anyRequest().authenticated())
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/ApplicationController.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/ApplicationController.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/ApplicationController.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,68 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.controllers;
+
+import lombok.AllArgsConstructor;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.Application;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationStatusDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.ApplicationService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api")
+@AllArgsConstructor
+@CrossOrigin(origins = "*")
+public class ApplicationController {
+    private final ApplicationService applicationService;
+
+    @GetMapping("/my-applications/{id}")
+    public ResponseEntity<?> findAllApplicationsByJobSeekerId(@PathVariable Long id) {
+        List<ApplicationDetailsDTO> applicationList = applicationService.findAllByJobSeekerId(id);
+        return new ResponseEntity<>(applicationList, HttpStatus.OK);
+    }
+
+    @GetMapping("/job-advertisements/{advertisement_id}/applications")
+    public ResponseEntity<?> findAllApplicationsByJobAdvertisementId(@PathVariable("advertisement_id") Long advertisementId) {
+        List<ApplicationDetailsDTO> applicationList = applicationService.findAllByJobAdvertisementId(advertisementId);
+        return new ResponseEntity<>(applicationList, HttpStatus.OK);
+    }
+
+    @PostMapping("/applications/{id}/update")
+    public ResponseEntity<?> updateApplicationStatus(@PathVariable("id") Long applicaitonId, @RequestBody ApplicationStatusDTO appStatusDTO) {
+        ApplicationStatusDTO applicationStatusDTO = applicationService.updateApplicationStatus(applicaitonId,appStatusDTO.getStatus());
+        return new ResponseEntity<>(applicationStatusDTO, HttpStatus.OK);
+    }
+
+    @GetMapping("/resume/{fileName:.+}")
+    public ResponseEntity<Resource> downloadResume(@PathVariable("fileName") String fileName) {
+        Resource resource = applicationService.loadResumeAsResource(fileName);
+        return ResponseEntity.ok()
+                .contentType(MediaType.APPLICATION_PDF)
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
+                .body(resource);
+    }
+
+    @PostMapping("/job-advertisements/apply")
+    public ResponseEntity<ApplicationDetailsDTO> submitApplication(
+            @RequestParam("jobSeekerId") Long jobSeekerId,
+            @RequestParam("jobAdId") Long jobAdId,
+            @RequestParam("resumeFile") MultipartFile resumeFile,
+            @RequestParam("answerOne") String answerOne,
+            @RequestParam("answerTwo") String answerTwo,
+            @RequestParam("answerThree") String answerThree,
+            @RequestParam("messageToRecruiter") String messageToRecruiter) {
+
+        ApplicationDTO applicationDTO = new ApplicationDTO(jobSeekerId, jobAdId, resumeFile, answerOne, answerTwo, answerThree, messageToRecruiter);
+        ApplicationDetailsDTO applicationDetailsDTO = applicationService.submitApplication(applicationDTO);
+        return new ResponseEntity<>(applicationDetailsDTO, HttpStatus.OK);
+    }
+
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobAdvertisementController.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobAdvertisementController.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobAdvertisementController.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -3,11 +3,16 @@
 
 import lombok.AllArgsConstructor;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.Application;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdFilterDTO;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdvertisementDTO;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.ApplicationService;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JobAdvertisementService;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
@@ -20,4 +25,5 @@
 
     private final JobAdvertisementService jobAdvertisementService;
+    private final ApplicationService applicationService;
 
     @PostMapping("/add")
@@ -45,4 +51,10 @@
     }
 
+    @PostMapping("/recruiter/{id}/filtered")
+    public ResponseEntity<?> filterJobAdvertisementsByRecruiterId(@PathVariable Long id, @RequestBody JobAdFilterDTO jobAdFilterDTO) {
+        List<JobAdDetailsDTO> jobAdDetailsDTOS = jobAdvertisementService.filterJobAdvertisementsByRecruiterId(id, jobAdFilterDTO);
+        return new ResponseEntity<>(jobAdDetailsDTOS, HttpStatus.OK);
+    }
+
     @GetMapping("/all")
     public ResponseEntity<?> findAllJobAdvertisements() {
@@ -51,8 +63,17 @@
     }
 
-    @GetMapping("/view/{id}")
+    @PostMapping("/filtered")
+    public ResponseEntity<?> filterJobAdvertisements(@RequestBody JobAdFilterDTO jobAdFilterDTO) {
+        List<JobAdDetailsDTO> jobAdDetailsDTOS = jobAdvertisementService.filterJobAdvertisements(jobAdFilterDTO);
+        return new ResponseEntity<>(jobAdDetailsDTOS, HttpStatus.OK);
+    }
+
+    @GetMapping("/{id}")
     public ResponseEntity<?> findJobAdvertisementById(@PathVariable Long id) {
         JobAdDetailsDTO jobAdDetailsDTO = jobAdvertisementService.findJobAdvertisementById(id);
         return new ResponseEntity<>(jobAdDetailsDTO, HttpStatus.OK);
     }
+
+
+
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/Application.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/Application.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/Application.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,76 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications;
+
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.ApplicationStatus;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.JobSeeker;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+
+@Entity
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Table(name = "applications")
+public class Application {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @ManyToOne
+    private JobSeeker jobSeeker;
+
+    @ManyToOne
+    private JobAdvertisement jobAdvertisement;
+
+    @Column(name = "resume_file_name", nullable = false)
+    private String resumeFileName;
+
+    @ElementCollection
+    private List<String> questionAnswers;
+
+    private String message;
+
+    private LocalDateTime submittedOn;
+
+    @Enumerated(EnumType.STRING)
+    private ApplicationStatus status;
+
+    public Application(JobSeeker jobSeeker, JobAdvertisement jobAdvertisement, String resumeFileName, List<String> answers, String message) {
+        this.jobSeeker = jobSeeker;
+        this.jobAdvertisement = jobAdvertisement;
+        this.resumeFileName = resumeFileName;
+        this.questionAnswers = answers;
+        this.message = message;
+        submittedOn = LocalDateTime.now();
+        this.status = ApplicationStatus.PROPOSED;
+    }
+
+    public static ApplicationDetailsDTO mapToApplicationDetailsDTO (Application application) {
+        return new ApplicationDetailsDTO(
+                application.getId(),
+                application.getJobSeeker().getId(),
+                application.getJobSeeker().getName(),
+                application.getJobSeeker().getEmail(),
+                application.getJobSeeker().getPhoneNumber(),
+                application.getJobAdvertisement().getRecruiter().getName(),
+                application.getJobAdvertisement().getRecruiter().getEmail(),
+                application.getJobAdvertisement().getRecruiter().getPhoneNumber(),
+                application.getJobAdvertisement().getId(),
+                application.getJobAdvertisement().getTitle(),
+                application.getQuestionAnswers(),
+                application.getResumeFileName(),
+                application.getMessage(),
+                application.getSubmittedOn(),
+                application.getStatus().name()
+        );
+    }
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationDTO.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationDTO.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationDTO.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+@Data
+@AllArgsConstructor
+public class ApplicationDTO {
+    private Long jobSeekerId;
+    private Long jobAdId;
+    private MultipartFile resumeFile;
+    private String answerOne;
+    private String answerTwo;
+    private String answerThree;
+    private String messageToRecruiter;
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationDetailsDTO.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationDetailsDTO.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationDetailsDTO.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,30 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO;
+
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.ApplicationStatus;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+public class ApplicationDetailsDTO {
+    private Long id;
+    private Long jobSeekerId;
+    private String jobSeekerName;
+    private String jobSeekerEmail;
+    private String jobSeekerPhoneNumber;
+    private String recruiterName;
+    private String recruiterEmail;
+    private String recruiterPhoneNumber;
+    private Long jobAdId;
+    private String jobAdTitle;
+    private List<String> questionAnswers;
+    private String fileName;
+    private String message;
+    private LocalDateTime submittedOn;
+    private String status;
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationStatusDTO.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationStatusDTO.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/DTO/ApplicationStatusDTO.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ApplicationStatusDTO {
+    Long id;
+    String status;
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/ApplicationStatus.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/ApplicationStatus.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/enumerations/ApplicationStatus.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,5 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations;
+
+public enum ApplicationStatus {
+    PROPOSED, UNDER_REVIEW, ACCEPTED, DENIED
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdFilterDTO.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdFilterDTO.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/DTO/JobAdFilterDTO.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class JobAdFilterDTO {
+    String searchTerm;
+    String industry;
+    String sortOrder;
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/JobAdvertisement.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/JobAdvertisement.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/job_advertisements/JobAdvertisement.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -8,4 +8,5 @@
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.JobType;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
 
@@ -20,5 +21,5 @@
 public class JobAdvertisement {
 
-    public JobAdvertisement(User recruiter, String title, String description, String industry, int startingSalary, LocalDate activeUntil, JobType jobType, EmploymentStatus employmentStatus) {
+    public JobAdvertisement(Recruiter recruiter, String title, String description, String industry, int startingSalary, LocalDate activeUntil, JobType jobType, EmploymentStatus employmentStatus) {
         this.recruiter = recruiter;
         this.title = title;
@@ -38,5 +39,5 @@
 
     @ManyToOne
-    private User recruiter;
+    private Recruiter recruiter;
 
     private String title;
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/ApplicationRepository.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/ApplicationRepository.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/ApplicationRepository.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories;
+
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.Application;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface ApplicationRepository extends JpaRepository<Application, Long> {
+    List<Application> findAllByJobAdvertisementId(Long jobId);
+    List<Application> findAllByJobSeekerId(Long jobId);
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/RecruiterRepository.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/RecruiterRepository.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/repositories/RecruiterRepository.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -5,5 +5,7 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.Optional;
+
 public interface RecruiterRepository extends JpaRepository<Recruiter, Long> {
-    Recruiter findRecruiterByEmail(String email);
+    Optional<Recruiter> findRecruiterByEmail(String email);
 }
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/ApplicationServiceImpl.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/ApplicationServiceImpl.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/ApplicationServiceImpl.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,119 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.impl;
+
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationStatusDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.ApplicationStatus;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.JobSeeker;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.JobSeekerRepository;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.UrlResource;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.Application;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.ApplicationRepository;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.JobAdvertisementRepository;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.UserRepository;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.ApplicationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+//@RequiredArgsConstructor
+public class ApplicationServiceImpl implements ApplicationService {
+    private final Path fileStorageLocation;
+
+    private final UserRepository userRepository;
+    private final ApplicationRepository applicationRepository;
+    private final JobAdvertisementRepository jobAdvertisementRepository;
+    private final JobSeekerRepository jobSeekerRepository;
+
+    @Autowired
+    public ApplicationServiceImpl(@Value("${file.upload-dir}") String uploadDir, UserRepository userRepository, ApplicationRepository applicationRepository, JobAdvertisementRepository jobAdvertisementRepository,
+                                  JobSeekerRepository jobSeekerRepository) {
+        this.fileStorageLocation = Paths.get(uploadDir).toAbsolutePath().normalize();
+
+        try {
+            Files.createDirectories(this.fileStorageLocation);
+        } catch (IOException ex) {
+            throw new RuntimeException("Could not create the directory where the uploaded files will be stored.", ex);
+        }
+
+        this.userRepository = userRepository;
+        this.applicationRepository = applicationRepository;
+        this.jobAdvertisementRepository = jobAdvertisementRepository;
+        this.jobSeekerRepository = jobSeekerRepository;
+    }
+
+    @Override
+    public ApplicationDetailsDTO submitApplication(ApplicationDTO applicationDTO) {
+
+        if (applicationDTO.getResumeFile().isEmpty()) {
+            throw new RuntimeException("Failed to store empty file.");
+        }
+
+        Path targetLocation = this.fileStorageLocation.resolve(applicationDTO.getResumeFile().getOriginalFilename());
+        try {
+            Files.copy(applicationDTO.getResumeFile().getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        JobSeeker jobSeeker = jobSeekerRepository.findById(applicationDTO.getJobSeekerId()).orElseThrow(() -> new IllegalArgumentException("User not found"));
+        JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(applicationDTO.getJobAdId()).orElseThrow(() -> new IllegalArgumentException("Job Ad not found"));
+
+        List<String> answers = new ArrayList<>();
+        answers.add(applicationDTO.getAnswerOne());
+        answers.add(applicationDTO.getAnswerTwo());
+        answers.add(applicationDTO.getAnswerThree());
+
+        Application application = new Application(jobSeeker, jobAdvertisement, applicationDTO.getResumeFile().getOriginalFilename(), answers, applicationDTO.getMessageToRecruiter());
+        applicationRepository.save(application);
+        return Application.mapToApplicationDetailsDTO(application);
+    }
+
+    @Override
+    public List<ApplicationDetailsDTO> findAllByJobAdvertisementId(Long jobId) {
+        List<Application> applications =  applicationRepository.findAllByJobAdvertisementId(jobId);
+        return applications.stream().map(Application::mapToApplicationDetailsDTO).toList();
+    }
+
+    @Override
+    public List<ApplicationDetailsDTO> findAllByJobSeekerId(Long jobSeekerId) {
+       List<Application> applications = applicationRepository.findAllByJobSeekerId(jobSeekerId);
+       return applications.stream().map(Application::mapToApplicationDetailsDTO).toList();
+    }
+
+    @Override
+    public Resource loadResumeAsResource(String fileName) {
+        try {
+            Path filePath = fileStorageLocation.resolve(fileName).normalize();
+            Resource resource = new UrlResource(filePath.toUri());
+            if (resource.exists()) {
+                return resource;
+            } else {
+                throw new RuntimeException("File not found " + fileName);
+            }
+        } catch (IOException ex) {
+            throw new RuntimeException("File not found " + fileName, ex);
+        }
+    }
+
+    @Override
+    public ApplicationStatusDTO updateApplicationStatus(Long id, String status) {
+       Application application = applicationRepository.findById(id).orElse(null);
+        System.out.println(status);
+       application.setStatus(ApplicationStatus.valueOf(status));
+       applicationRepository.save(application);
+       return new ApplicationStatusDTO(id, status);
+    }
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JobAdvertisementServiceImpl.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JobAdvertisementServiceImpl.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JobAdvertisementServiceImpl.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -5,8 +5,11 @@
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.JobType;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdFilterDTO;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdvertisementDTO;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.JobAdvertisementRepository;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.RecruiterRepository;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.UserRepository;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JobAdvertisementService;
@@ -15,4 +18,5 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Comparator;
 import java.util.List;
 
@@ -22,8 +26,9 @@
     private final UserRepository userRepository;
     private final JobAdvertisementRepository jobAdvertisementRepository;
+    private final RecruiterRepository recruiterRepository;
 
     @Override
     public JobAdDetailsDTO addJobAdvertisement(JobAdvertisementDTO jobAdvertisementDTO) {
-        User recruiter = userRepository.findByEmail(jobAdvertisementDTO.getEmail()).orElseThrow(() -> new IllegalArgumentException("User not found"));
+        Recruiter recruiter = recruiterRepository.findRecruiterByEmail(jobAdvertisementDTO.getEmail()).orElseThrow(() -> new IllegalArgumentException("User not found"));
         JobAdvertisement jobAdvertisement = new JobAdvertisement(
                 recruiter,
@@ -35,5 +40,5 @@
                 JobType.valueOf(jobAdvertisementDTO.getJobType()),
                 EmploymentStatus.valueOf(jobAdvertisementDTO.getEmploymentStatus())
-                );
+        );
         jobAdvertisementRepository.save(jobAdvertisement);
         return JobAdvertisement.mapToJobAdDetailsDTO(jobAdvertisement);
@@ -79,15 +84,35 @@
 
     @Override
+    public List<JobAdDetailsDTO> filterJobAdvertisements(JobAdFilterDTO jobAdFilterDTO) {
+        List<JobAdvertisement> filteredJobAds = jobAdvertisementRepository.findAll();
+        filteredJobAds = filter(filteredJobAds, jobAdFilterDTO);
+
+        return filteredJobAds.stream()
+                .map(JobAdvertisement::mapToJobAdDetailsDTO)
+                .toList();
+    }
+
+    private List<JobAdvertisement> filter(List<JobAdvertisement> filteredJobAdvertisements, JobAdFilterDTO jobAdFilterDTO) {
+        return filteredJobAdvertisements.stream()
+                .filter(jobAd -> jobAd.getTitle().toLowerCase().contains(jobAdFilterDTO.getSearchTerm().toLowerCase()))
+                .filter(jobAd -> jobAdFilterDTO.getIndustry().equals("all") || jobAd.getIndustry().equals(jobAdFilterDTO.getIndustry()))
+                .sorted(getComparator(jobAdFilterDTO.getSortOrder()))
+                .toList();
+    }
+
+    private Comparator<JobAdvertisement> getComparator(String sortOrder) {
+        return switch (sortOrder) {
+            case "date_newest" -> Comparator.comparing(JobAdvertisement::getPostedOn).reversed();
+            case "date_oldest" -> Comparator.comparing(JobAdvertisement::getPostedOn);
+            case "salary_highest" -> Comparator.comparing(JobAdvertisement::getStartingSalary).reversed();
+            case "salary_lowest" -> Comparator.comparing(JobAdvertisement::getStartingSalary);
+            default -> Comparator.comparing(JobAdvertisement::getPostedOn); // Default sorting order
+        };
+    }
+
+
+    @Override
     public List<JobAdDetailsDTO> findAllJobAdvertisementsByRecruiterId(Long recruiterId) {
         List<JobAdvertisement> jobAdvertisementList = jobAdvertisementRepository.findAllByRecruiterId(recruiterId);
-//        jobAdvertisementList.forEach(jobAdvertisement -> {
-//            if (!jobAdvertisement.isJobAdActive() && jobAdvertisement.isActive()) {
-//                jobAdvertisement.setActive(false);
-//                jobAdvertisementRepository.save(jobAdvertisement);
-//            } else if (jobAdvertisement.isJobAdActive() && !jobAdvertisement.isActive()) {
-//                jobAdvertisement.setActive(true);
-//                jobAdvertisementRepository.save(jobAdvertisement);
-//            }
-//        });
 
         return jobAdvertisementList.stream()
@@ -95,4 +120,14 @@
                 .toList();
     }
+
+    @Override
+    public List<JobAdDetailsDTO> filterJobAdvertisementsByRecruiterId(Long recruiterId, JobAdFilterDTO jobAdFilterDTO) {
+        List<JobAdvertisement> filteredJobAds = jobAdvertisementRepository.findAllByRecruiterId(recruiterId);
+        filteredJobAds = filter(filteredJobAds, jobAdFilterDTO);
+        return filteredJobAds.stream()
+                .map(JobAdvertisement::mapToJobAdDetailsDTO)
+                .toList();
+    }
+
     @Override
     public JobAdDetailsDTO findJobAdvertisementById(Long id) {
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/ApplicationService.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/ApplicationService.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/ApplicationService.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,18 @@
+package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef;
+
+
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.Application;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.applications.DTO.ApplicationStatusDTO;
+import org.springframework.core.io.Resource;
+
+import java.util.List;
+
+public interface ApplicationService {
+    ApplicationDetailsDTO submitApplication(ApplicationDTO applicationDTO);
+    List<ApplicationDetailsDTO> findAllByJobAdvertisementId(Long jobId);
+    List<ApplicationDetailsDTO> findAllByJobSeekerId(Long jobSeekerId);
+    Resource loadResumeAsResource(String fileName);
+    ApplicationStatusDTO updateApplicationStatus(Long id, String status);
+}
Index: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JobAdvertisementService.java
===================================================================
--- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JobAdvertisementService.java	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/JobAdvertisementService.java	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -2,4 +2,5 @@
 
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
+import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdFilterDTO;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdvertisementDTO;
 import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
@@ -14,5 +15,7 @@
 
     List<JobAdDetailsDTO> findAllJobAdvertisements();
+    List<JobAdDetailsDTO> filterJobAdvertisements(JobAdFilterDTO jobAdFilterDTO);
     List<JobAdDetailsDTO> findAllJobAdvertisementsByRecruiterId(Long recruiterId);
+    List<JobAdDetailsDTO> filterJobAdvertisementsByRecruiterId(Long recruiterId, JobAdFilterDTO jobAdFilterDTO);
     JobAdDetailsDTO findJobAdvertisementById(Long id);
 
Index: jobvista-backend/src/main/resources/application.properties
===================================================================
--- jobvista-backend/src/main/resources/application.properties	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-backend/src/main/resources/application.properties	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -6,6 +6,13 @@
 spring.datasource.password=postgres
 
-spring.jpa.hibernate.ddl-auto=create-drop
+#spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.hibernate.ddl-auto=update
 spring.jpa.show-sql=true
 
 spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
+
+file.upload-dir=./uploads
+
+spring.servlet.multipart.enabled=true
+spring.servlet.multipart.max-file-size=2MB
+spring.servlet.multipart.max-request-size=2MB
Index: jobvista-frontend/package-lock.json
===================================================================
--- jobvista-frontend/package-lock.json	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/package-lock.json	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -19,4 +19,6 @@
         "axios": "^1.6.8",
         "formik": "^2.4.6",
+        "primereact": "^10.6.6",
+        "quill": "^2.0.2",
         "react": "^18.3.1",
         "react-dom": "^18.3.1",
@@ -8930,4 +8932,9 @@
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
     },
+    "node_modules/fast-diff": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+      "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="
+    },
     "node_modules/fast-glob": {
       "version": "3.3.2",
@@ -13088,8 +13095,18 @@
       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
     },
+    "node_modules/lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+    },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
       "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+    },
+    "node_modules/lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
     },
     "node_modules/lodash.memoize": {
@@ -13848,4 +13865,9 @@
         "tslib": "^2.0.3"
       }
+    },
+    "node_modules/parchment": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz",
+      "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A=="
     },
     "node_modules/parent-module": {
@@ -15324,4 +15346,26 @@
       }
     },
+    "node_modules/primereact": {
+      "version": "10.6.6",
+      "resolved": "https://registry.npmjs.org/primereact/-/primereact-10.6.6.tgz",
+      "integrity": "sha512-+C0Bt6vS/jh09DQVS4UXpVctbvqJDUC3t3mVdGmhmIINYD8kdfL3fvc3bUGniGxkKKzwkSYdAQXhZlcgj8LUgw==",
+      "dependencies": {
+        "@types/react-transition-group": "^4.4.1",
+        "react-transition-group": "^4.4.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "@types/react": "^17.0.0 || ^18.0.0",
+        "react": "^17.0.0 || ^18.0.0",
+        "react-dom": "^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
@@ -15453,4 +15497,36 @@
         }
       ]
+    },
+    "node_modules/quill": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.2.tgz",
+      "integrity": "sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==",
+      "dependencies": {
+        "eventemitter3": "^5.0.1",
+        "lodash-es": "^4.17.21",
+        "parchment": "^3.0.0",
+        "quill-delta": "^5.1.0"
+      },
+      "engines": {
+        "npm": ">=8.2.3"
+      }
+    },
+    "node_modules/quill-delta": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz",
+      "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
+      "dependencies": {
+        "fast-diff": "^1.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.isequal": "^4.5.0"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      }
+    },
+    "node_modules/quill/node_modules/eventemitter3": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
     },
     "node_modules/raf": {
Index: jobvista-frontend/package.json
===================================================================
--- jobvista-frontend/package.json	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/package.json	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -14,4 +14,6 @@
     "axios": "^1.6.8",
     "formik": "^2.4.6",
+    "primereact": "^10.6.6",
+    "quill": "^2.0.2",
     "react": "^18.3.1",
     "react-dom": "^18.3.1",
Index: jobvista-frontend/src/App.css
===================================================================
--- jobvista-frontend/src/App.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/App.css	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -4,4 +4,5 @@
 .App {
   background-color: rgb(243, 242, 241);
+  //background-color: #EBF2FC;
   height: 100vh;
   overflow-y: auto;
@@ -40,5 +41,5 @@
 
 .react-responsive-modal-overlay {
-  backdrop-filter: blur(2px);
+  backdrop-filter: blur(3px);
 }
 
@@ -47,4 +48,27 @@
 .col {
   height: 280px !important;
+}
+
+.add-new-card {
+  border-radius: 8px;
+  background-color: transparent;
+  border: 3px dashed grey;
+  transition: all 0.3s ease;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+  transform: translate(0, 0);
+  height: 260px;
+  width: 100%;
+  color: grey;
+  font-family: Ubuntu;
+  text-transform: uppercase;
+}
+.add-new-card h3 {
+  font-size: 25px;
+}
+.add-new-card:hover {
+  /*transform: translate(0, 8px);*/
+  /*box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);*/
+  color: black;
+  border: 3px dashed black;
 }
 
Index: jobvista-frontend/src/auth/RoutesConfig.js
===================================================================
--- jobvista-frontend/src/auth/RoutesConfig.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/auth/RoutesConfig.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -7,4 +7,6 @@
 import {JobAdvertisements} from "../views/job_advertisements/JobAdvertisements";
 import {JobAdDetails} from "../views/job_advertisements/JobAdDetails";
+import {ApplicationsByJobAd} from "../views/applications/ApplicationsByJobAd";
+import {ApplicationsByJobSeeker} from "../views/applications/ApplicationsByJobSeeker";
 export const RoutesConfig = () => {
 
@@ -16,6 +18,7 @@
                 <Route path="/signup/job-seeker" element={<SignUpJobSeekerForm/>}></Route>
                 <Route path="/my-job-advertisements" element={<JobAdvertisements/>}></Route>
-                <Route path="/job-advertisements/view/:id" element={<JobAdDetails/>}></Route>
-                <Route path="/my-job-advertisements/view/:id" element={<JobAdDetails/>}></Route>
+                <Route path="/my-applications" element={<ApplicationsByJobSeeker/>}></Route>
+                <Route path="/job-advertisements/:id" element={<JobAdDetails/>}></Route>
+                <Route path="/my-job-advertisements/:advertisement_id/applications" element={<ApplicationsByJobAd/>}></Route>
             </Routes>
     )
Index: jobvista-frontend/src/redux/actionTypes.js
===================================================================
--- jobvista-frontend/src/redux/actionTypes.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/redux/actionTypes.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -9,3 +9,12 @@
 export const DELETE_JOB_ADVERTISEMENT = "DELETE_JOB_ADVERTISEMENT"
 export const FETCH_JOB_ADVERTISEMENTS = "FETCH_JOB_ADVERTISEMENTS"
+export const FILTER_JOB_ADVERTISEMENTS = "FILTER_JOB_ADVERTISEMENTS"
 export const FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER = "FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER"
+export const FILTER_JOB_ADVERTISEMENTS_BY_RECRUITER = "FILTER_JOB_ADVERTISEMENTS_BY_RECRUITER"
+export const SUBMIT_APPLICATION = "SUBMIT_APPLICATION"
+export const UPDATE_APPLICATION_STATUS = "UPDATE_APPLICATION_STATUS"
+export const FETCH_APPLICATIONS_BY_JOB_ID = "FETCH_APPLICATIONS_BY_JOB_ID"
+export const FETCH_APPLICATIONS_BY_JOB_SEEKER_ID = "FETCH_APPLICATIONS_BY_JOB_SEEKER_ID"
+export const DOWNLOAD_RESUME = "DOWNLOAD_RESUME"
+
+
Index: jobvista-frontend/src/redux/actions/applicationActions.js
===================================================================
--- jobvista-frontend/src/redux/actions/applicationActions.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-frontend/src/redux/actions/applicationActions.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,94 @@
+import axios from "../../axios/axiosInstance";
+import {
+    CURRENT_USER,
+    FETCH_APPLICATIONS_BY_JOB_ID,
+    FETCH_APPLICATIONS_BY_JOB_SEEKER_ID,
+    SUBMIT_APPLICATION, UPDATE_APPLICATION_STATUS
+} from "../actionTypes";
+
+export const ApplicationActions = {
+    submitApplication: (application, callback) => {
+        return dispatch => {
+            axios.post("/job-advertisements/apply", application, {
+                headers: {
+                    'Content-Type': 'multipart/form-data'
+                }
+            })
+                .then(response => {
+                    dispatch({
+                        type: SUBMIT_APPLICATION,
+                        application: response.data
+                    })
+                    callback(true, response)
+                }).catch(error => {
+                callback(false, error)
+                console.log(error)
+            })
+        }
+
+    },
+    updateApplicationStatus: (id, status, callback) => {
+        console.log(status)
+      return dispatch => {
+            // TO DO: REFACTOR
+          axios.post("/applications/" + id + "/update", {
+              id: id,
+              status: status
+          })
+              .then(response => {
+                  dispatch({
+                      type: UPDATE_APPLICATION_STATUS,
+                      application: response.data,
+                  })
+                  callback(true, response)
+              }).catch(error => {
+              callback(false, error)
+          })
+      }
+    },
+    fetchApplicationsByJobSeeker: (callback) => {
+      return dispatch => {
+          let currentUser = JSON.parse(localStorage.getItem(CURRENT_USER));
+          axios.get("/my-applications/" + currentUser.id)
+              .then(response => {
+                  dispatch({
+                      type: FETCH_APPLICATIONS_BY_JOB_SEEKER_ID,
+                      applicationsByJobSeeker: response.data
+                  })
+                  callback(true, response)
+              }).catch(error => {
+                  callback(false, error)
+          })
+      }
+    },
+
+    fetchApplicationsByJobAdId: (jobAdId, callback) => {
+        return dispatch => {
+            axios.get("/job-advertisements/" + jobAdId + "/applications")
+                .then(response => {
+                        dispatch({
+                            type: FETCH_APPLICATIONS_BY_JOB_ID,
+                            applicationsByJobAdId: response.data
+                        })
+                        callback(true, response)
+                    }
+                ).catch(error => {
+                callback(false, error)
+            })
+        }
+    },
+    downloadResume: (fileName, callback) => {
+        return dispatch => {
+            return axios.get("/resume/" + fileName, {responseType: "blob"})
+                .then(response => {
+                    const blob = new Blob([response.data], { type: 'application/pdf' });
+                    const url = window.URL.createObjectURL(blob);
+                    callback(true, url);
+                })
+
+                .catch(error => {
+                    callback(false, error)
+                })
+        }
+    }
+}
Index: jobvista-frontend/src/redux/actions/jobAdvertisementActions.js
===================================================================
--- jobvista-frontend/src/redux/actions/jobAdvertisementActions.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/redux/actions/jobAdvertisementActions.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -4,5 +4,5 @@
     CURRENT_USER, DELETE_JOB_ADVERTISEMENT, EDIT_JOB_ADVERTISEMENT,
     FETCH_JOB_ADVERTISEMENTS,
-    FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER
+    FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER, FILTER_JOB_ADVERTISEMENTS
 } from "../actionTypes";
 
@@ -10,5 +10,9 @@
     addJobAdvertisement: (jobAdvertisement, callback) => {
         return dispatch => {
-            axios.post("/job-advertisements/add", jobAdvertisement)
+            axios.post("/job-advertisements/add",  jobAdvertisement, {
+                headers: {
+                    'Content-Type': 'application/json'
+                },
+            })
                 .then(response => {
                     dispatch({
@@ -52,10 +56,10 @@
     },
     fetchJobAdvertisementById: (id, callback) => {
-        axios.get("/job-advertisements/view/" + id)
+        axios.get("/job-advertisements/" + id)
             .then(response => {
                 callback(true, response)
             }).catch(error => {
-                callback(false, error)
-            })
+            callback(false, error)
+        })
     },
 
@@ -74,6 +78,14 @@
         }
     },
+    filterJobAdvertisements: (filter, callback) => {
+        axios.post("/job-advertisements/filtered", filter)
+            .then(response => {
+                callback(true, response)
+            }).catch((error) => {
+            callback(false, error)        })
 
-    fetchJobAdvertisementsByRecruiter: (id, callback) => {
+    },
+
+    fetchJobAdvertisementsByRecruiter: (callback) => {
         return dispatch => {
             let currentUser = JSON.parse(localStorage.getItem(CURRENT_USER));
@@ -86,8 +98,19 @@
                     callback(true, response)
                 }).catch((error) => {
-                console.log("ERROR")
                 callback(false, error)
             })
         }
+    },
+
+    filterJobAdvertisementsByRecruiter: (filter, callback) => {
+
+        let currentUser = JSON.parse(localStorage.getItem(CURRENT_USER));
+        axios.post("/job-advertisements/recruiter/" + currentUser.id + "/filtered", filter)
+            .then(response => {
+                callback(true, response)
+            }).catch((error) => {
+            callback(false, error)
+        })
+
     },
 
Index: jobvista-frontend/src/redux/reducers/applicationReducer.js
===================================================================
--- jobvista-frontend/src/redux/reducers/applicationReducer.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-frontend/src/redux/reducers/applicationReducer.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,50 @@
+import {
+    CURRENT_USER,
+    FETCH_APPLICATIONS_BY_JOB_ID,
+    FETCH_APPLICATIONS_BY_JOB_SEEKER_ID,
+    SUBMIT_APPLICATION, UPDATE_APPLICATION_STATUS
+} from "../actionTypes";
+
+const initialState = {
+    applicationsByJobSeeker: [],
+    applicationsByJobAdId: []
+}
+
+let currentUser = JSON.parse(localStorage.getItem(CURRENT_USER))
+
+export const ApplicationReducer = (state = initialState, action) => {
+    let applications;
+
+    switch (action.type) {
+        case SUBMIT_APPLICATION:
+            return {
+                ...state,
+                applicationsByJobSeeker: [...state.applicationsByJobSeeker, action.application]
+            }
+        case UPDATE_APPLICATION_STATUS:
+            return {
+                ...state,
+                applicationsByJobAdId: state.applicationsByJobAdId.map(application =>
+                application.id === action.application.id ?
+                    {...application, status: action.application.status} :
+                    application
+                )
+            }
+        case FETCH_APPLICATIONS_BY_JOB_ID:
+            return {
+                ...state,
+                applicationsByJobAdId: action.applicationsByJobAdId
+            }
+        case FETCH_APPLICATIONS_BY_JOB_SEEKER_ID:
+            return {
+                ...state,
+                applicationsByJobSeeker: action.applicationsByJobSeeker
+            }
+        default:
+            return {
+                ...state,
+            };
+    }
+}
+
+export default ApplicationReducer
Index: jobvista-frontend/src/redux/reducers/jobAdvertisementReducer.js
===================================================================
--- jobvista-frontend/src/redux/reducers/jobAdvertisementReducer.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/redux/reducers/jobAdvertisementReducer.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -3,5 +3,5 @@
     CURRENT_USER, DELETE_JOB_ADVERTISEMENT, EDIT_JOB_ADVERTISEMENT,
     FETCH_JOB_ADVERTISEMENTS,
-    FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER
+    FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER, FILTER_JOB_ADVERTISEMENTS, FILTER_JOB_ADVERTISEMENTS_BY_RECRUITER
 } from "../actionTypes";
 import {sortElementsByDateCreated} from "../../utils/utils";
@@ -48,4 +48,5 @@
             }
 
+
         case FETCH_JOB_ADVERTISEMENTS_BY_RECRUITER:
             return {
Index: jobvista-frontend/src/redux/store.js
===================================================================
--- jobvista-frontend/src/redux/store.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/redux/store.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -3,4 +3,5 @@
 import authReducer from "./reducers/authReducer";
 import jobAdReducer from "./reducers/jobAdvertisementReducer";
+import applicationReducer from "./reducers/applicationReducer"
 
 // const rootReducer = combineReducers({
@@ -16,5 +17,6 @@
     reducer: {
         auth: authReducer,
-        jobAd: jobAdReducer
+        jobAd: jobAdReducer,
+        appl: applicationReducer
     },
 });
Index: jobvista-frontend/src/utils/utils.js
===================================================================
--- jobvista-frontend/src/utils/utils.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/utils/utils.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -3,5 +3,11 @@
 export const sortElementsByDateCreated = (array) => {
     return array.slice().sort((a, b) => {
-        return new Date(b.postedAt).getTime() - new Date(a.postedAt).getTime()
+        return new Date(b.postedOn).getTime() - new Date(a.postedOn).getTime()
+    });
+}
+
+export const sortElementsBySubmissionDate = (array) => {
+    return array.slice().sort((a, b) => {
+        return new Date(b.postedOn).getTime() - new Date(a.postedOn).getTime()
     });
 }
Index: jobvista-frontend/src/views/applications/Applications.css
===================================================================
--- jobvista-frontend/src/views/applications/Applications.css	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-frontend/src/views/applications/Applications.css	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,130 @@
+.applications-container {
+    width: 65% !important;
+    max-width: 1500px !important;
+    margin: auto;
+}
+
+.application-title {
+    font-family: Ubuntu;
+    text-transform: uppercase;
+    margin: 25px auto;
+    display: flex;
+    justify-content: center;
+}
+.application-title h1 {
+    font-weight: bold;
+}
+
+/*.application-title span {*/
+/*    font-weight: bold;*/
+/*    */
+/*}*/
+
+.application-card {
+    font-family: Poppins;
+     border: 1px solid lightgray;
+    border-radius: 8px;
+    background-color: white;
+    transition: all 0.3s ease;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+    transform: translate(0, 0);
+    height: auto;
+    padding: 20px 20px;
+    display: flex;
+    justify-content: center;
+    margin: 15px 0;
+}
+
+.application-card .left-box {
+    width: 55%;
+    display: inline-block;
+}
+
+.application-card .left-box .jobAd-title {
+    font-weight: 600;
+    /*text-transform: uppercase;*/
+    font-family: 'Segoe UI', sans-serif;
+    font-size: 22px;
+}
+
+.application-card .left-box .contact-info {
+    display: inline-flex;
+    gap: 10px;
+}
+.application-card .left-box .contact-info .contact-item {
+    display: inline-flex;
+    align-items: center;
+    gap: 5px;
+}
+
+.application-card .right-box {
+    width: 45%;
+    display: inline-flex;
+    justify-content: end;
+    align-items: center;
+    gap: 10px;
+}
+
+.application-card .right-box .select {
+    width: 35%;
+    display: inline-block;
+}
+
+.application-button {
+    border: 0;
+    border-radius: 8px;
+    width: auto;
+    background-color: rgba(207, 235, 255, 1);
+    color: black;
+    font-weight: bold;
+    padding: 5px 10px;
+    transition: 0.2s;
+}
+.application-button:hover {
+    background-color: rgb(187, 215, 235);
+}
+
+/*.application-card:hover {*/
+/*    transform: translate(0, 8px);*/
+/*    box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);*/
+/*}*/
+
+.multi-button button{
+    /*font-size: 5vmin;*/
+    padding: .5em 1em;
+    background: #fff;
+    color: #4A5568;
+    border: 0px solid #A0AEC0;
+    //margin: .1em;
+    transition: background .2s ease, color .2s ease, box-shadow .2s ease, transform .2s ease;
+    box-shadow: 0 0 0 #BEE3F8;
+    transform: translateY(0);
+}
+.multi-button button:first-of-type{
+    border-radius: .5em 0 0 .5em;
+}
+.multi-button button:last-of-type{
+    border-radius: 0 .5em .5em 0;
+}
+.multi-button button i{
+    color: #A0AEC0;
+    margin-right: .3em;
+    transition: all .2s ease-out;
+}
+.multi-button:hover button{
+    color: #A0AEC0;
+}
+
+.multi-button:hover button:hover{
+    background: #D53F8C;
+    color: #fff;
+    box-shadow: 0 0 0.8em 0 rgba(213, 63, 140, .8);
+    transform: translateY(-.2em);
+}
+.multi-button:hover button i{
+    color: #CBD5E0;
+}
+.multi-button:hover button:hover i{
+    color: #FED7E2;
+    transform: rotate(-10deg);
+}
Index: jobvista-frontend/src/views/applications/ApplicationsByJobAd.js
===================================================================
--- jobvista-frontend/src/views/applications/ApplicationsByJobAd.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-frontend/src/views/applications/ApplicationsByJobAd.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,87 @@
+import {useDispatch} from "react-redux";
+import {useEffect, useState} from "react";
+import {useParams} from "react-router";
+import {ApplicationActions} from "../../redux/actions/applicationActions";
+import {ViewApplicationDetails} from "./ViewApplicationDetails";
+import "./Applications.css"
+import Select from "react-select";
+
+export const ApplicationsByJobAd = () => {
+
+    const dispatch = useDispatch();
+    let {advertisement_id} = useParams();
+    const [applicationsByJobAd, setApplicationsByJobAd] = useState([]);
+    const [jobAdTitle, setJobAdTitle] = useState("");
+
+    useEffect(() => {
+        dispatch(ApplicationActions.fetchApplicationsByJobAdId(advertisement_id, (success, reponse) => {
+            if (success && reponse.data.length > 0) {
+                setApplicationsByJobAd(reponse.data)
+                setJobAdTitle(reponse.data[0].jobAdTitle)
+            }
+        }))
+    }, [])
+
+    const options = [
+        {value: 'PROPOSED', label: <span><i className="fa-solid fa-paper-plane"></i> Proposed</span>},
+        {value: 'UNDER_REVIEW', label: <span><i className="fa-solid fa-file-pen"></i> Under Review</span>},
+        {value: 'ACCEPTED', label: <span><i className="fa-solid fa-user-check"></i> Accepted</span>},
+        {value: 'DENIED', label: <span><i className="fa-solid fa-user-slash"></i> Denied</span>}
+    ];
+
+    let handleDefaultStatus = (status) => {
+        return options.find(option => option.value === status);
+    }
+
+    let handleChangeStatus = (selectedOption, id) => {
+        dispatch(ApplicationActions.updateApplicationStatus(id, selectedOption.value, (success, response) => {
+            if(success) {
+                console.log("Status updated.")
+            }
+        }))
+    }
+
+
+    return (<div className="applications-container">
+        <div className="application-title">
+            {jobAdTitle ?
+                <h1>Applications for <span>{jobAdTitle}</span></h1> :
+                <h1></h1>
+            }
+
+        </div>
+
+        {applicationsByJobAd && applicationsByJobAd.map((application, index) => (
+            <div className="application-card">
+                <div className="left-box">
+                    <span>Submitted on <b>{new Date(application.submittedOn).toLocaleString('default', {
+                        day: 'numeric',
+                        month: 'long',
+                        year: 'numeric'
+                    })}</b></span>
+                    <br/><br/>
+                    <div className="contact-info">
+                        <div className="contact-item">
+                            <i className="fa-solid fa-user"></i> <span>{application.jobSeekerName}</span>
+                        </div>
+                        <div className="contact-item">
+                            <i className="fa-solid fa-envelope"></i> <span>{application.jobSeekerEmail}</span>
+                        </div>
+                        <div className="contact-item">
+                            <i className="fa-solid fa-phone"></i> <span>{application.jobSeekerPhoneNumber}</span>
+                        </div>
+                    </div>
+                </div>
+
+                <div className="right-box">
+                    <ViewApplicationDetails application={application}/>
+                    <div className="select">
+                        <Select options={options}  onChange={(selectedOption) => handleChangeStatus(selectedOption, application.id)} defaultValue={handleDefaultStatus(application.status)}/>
+                    </div>
+
+                </div>
+            </div>
+       ))}
+
+    </div>)
+}
Index: jobvista-frontend/src/views/applications/ApplicationsByJobSeeker.js
===================================================================
--- jobvista-frontend/src/views/applications/ApplicationsByJobSeeker.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-frontend/src/views/applications/ApplicationsByJobSeeker.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,82 @@
+import {useDispatch, useSelector} from "react-redux";
+import {useEffect, useState} from "react";
+import {ApplicationActions} from "../../redux/actions/applicationActions";
+import {ViewApplicationDetails} from "./ViewApplicationDetails";
+import Select from "react-select";
+
+export const ApplicationsByJobSeeker = () => {
+    const dispatch = useDispatch();
+    const [applicationsByJobSeeker, setApplicationsByJobSeeker] = useState([]);
+    let applicationsByJobSeekerState = useSelector(state => state.appl.applicationsByJobSeeker);
+    const [dispatched, setDispatched] = useState(false);
+
+    useEffect(() => {
+        if(!dispatched && applicationsByJobSeekerState.length === 0) {
+            dispatch(ApplicationActions.fetchApplicationsByJobSeeker((success, response) => {
+                if(success && response.data.length > 0) {
+                    setApplicationsByJobSeeker(response.data);
+                }
+                console.log("Fetch applications by job seeker GET")
+            }))
+            setDispatched(true)
+        } else {
+            setApplicationsByJobSeeker(applicationsByJobSeekerState);
+            console.log("Fetch applications by job seeker STATE")
+        }
+    }, [applicationsByJobSeekerState])
+
+    const options = [
+        {value: 'PROPOSED', label: <span><i className="fa-solid fa-paper-plane"></i> Proposed</span>},
+        {value: 'UNDER_REVIEW', label: <span><i className="fa-solid fa-file-pen"></i> Under Review</span>},
+        {value: 'ACCEPTED', label: <span><i className="fa-solid fa-user-check"></i> Accepted</span>},
+        {value: 'DENIED', label: <span><i className="fa-solid fa-user-slash"></i> Denied</span>}
+    ];
+
+    let handleDefaultValue = (status) => {
+        return options.find(option => option.value === status);
+    }
+
+
+
+    return (
+        <div className="applications-container">
+            <div className="application-title">
+
+            </div>
+            {applicationsByJobSeeker && applicationsByJobSeeker.map((application, index) => (
+                <div key={index} className="application-card">
+                    <div className="left-box">
+                        <span className="jobAd-title">{application.jobAdTitle}</span>
+                        <br/>
+                        <br/>
+                        <div className="contact-info">
+                            <div className="contact-item">
+                                <i className="fa-solid fa-building"></i> <span>{application.recruiterName}</span>
+                            </div>
+                            <div className="contact-item">
+                                <i className="fa-solid fa-envelope"></i> <span>{application.recruiterEmail}</span>
+                            </div>
+                            <div className="contact-item">
+                                <i className="fa-solid fa-phone"></i> <span>{application.recruiterPhoneNumber}</span>
+                            </div>
+                            <span> • Submitted on <b>{new Date(application.submittedOn).toLocaleString('default', {
+                                day: 'numeric',
+                                month: 'long',
+                                year: 'numeric'
+                            })}</b></span>
+                        </div>
+                    </div>
+
+                    <div className="right-box">
+                        <ViewApplicationDetails application={application}/>
+                        <div className="select">
+                            <Select isDisabled={true} options={options} defaultValue={handleDefaultValue(application.status)}/>
+                        </div>
+
+                    </div>
+                </div>
+            ))}
+
+        </div>
+    )
+}
Index: jobvista-frontend/src/views/applications/ApplyToJobAdModal.js
===================================================================
--- jobvista-frontend/src/views/applications/ApplyToJobAdModal.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-frontend/src/views/applications/ApplyToJobAdModal.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,125 @@
+import React, {useState} from "react";
+import "../job_advertisements/Form.css";
+
+import 'react-responsive-modal/styles.css';
+import {Modal} from 'react-responsive-modal';
+import Select from "react-select";
+
+//Validation
+import * as yup from "yup";
+import {yupResolver} from "@hookform/resolvers/yup";
+import {Controller, useForm} from "react-hook-form";
+
+
+import {employmentStatusOptions, industryOptions, jobTypeOptions} from "../selectOptions";
+import {useDispatch, useSelector} from "react-redux";
+import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+import Roles from "../../enumerations/Roles";
+import {ApplicationActions} from "../../redux/actions/applicationActions";
+
+
+export const ApplyToJobAdModal = (props) => {
+    const {jobAd, role} = props
+    const [modal, setModal] = useState(false);
+    const dispatch = useDispatch();
+    const auth = useSelector(state => state.auth.currentUser)
+
+    const [resumeFile, setResumeFile] = useState(null);
+    const toggleModal = () => {
+        setModal(!modal);
+    };
+
+    const schema = yup.object().shape({
+        answerOne: yup.string().required("Please answer the question"),
+        answerTwo: yup.string().required("Please answer the question"),
+        answerThree: yup.string().required("Please answer the question"),
+        messageToRecruiter: yup.string(),
+    })
+
+    const {register, handleSubmit, control, formState: {errors}} = useForm({
+        resolver: yupResolver(schema),
+    });
+
+    const submitApplication = async (values) => {
+        try {
+            const formData = new FormData();
+            formData.append('jobSeekerId', auth.id);
+            formData.append('jobAdId', jobAd.id);
+            formData.append('resumeFile', resumeFile);
+            formData.append('answerOne', values.answerOne);
+            formData.append('answerTwo', values.answerTwo);
+            formData.append('answerThree', values.answerThree);
+            formData.append('messageToRecruiter', values.messageToRecruiter);
+
+            dispatch(ApplicationActions.submitApplication(
+                formData,(success, response) => {
+                    if(success) {
+                        console.log("Job Advertisement added")
+                        toggleModal()
+                    }
+                }
+            ))
+        } catch (err) {
+            console.error(err)
+        }
+    }
+    let minimumDate = new Date();
+    minimumDate.setDate(minimumDate.getDate() + 1);
+
+    return (<div className="modal-wrap">
+        {role===Roles.JOBSEEKER &&
+            <>
+                {jobAd.active && <button onClick={toggleModal} className="card-button apply">Apply now</button> }
+                {!jobAd.active && <button className="card-button apply disabled">Apply now</button> }
+            </>
+        }
+        <Modal open={modal} onClose={toggleModal} center >
+            <div className="head-modal">
+                <h3>Applying to {jobAd.title} at {jobAd.recruiterName}</h3>
+                <i className="fa-solid fa-x btn-close-modal" onClick={toggleModal}></i>
+            </div>
+
+            <div className="modal-content" >
+                <form onSubmit={handleSubmit(submitApplication)}>
+                    <div className="row">
+                        <div className="col-md-6">
+                            <label className="label">Why are you interested in joining our company?</label>
+                            <textarea type="text" placeholder="Write your answer here..."
+                                      {...register("answerOne")} className="applictaion-textarea"/>
+                            <p style={{color: "red"}}>{errors.answerOne?.message}</p>
+
+                            <label className="label">What makes you a good fit for this position?</label>
+                            <textarea type="text" placeholder="Write your answer here..."
+                                      {...register("answerTwo")} className="applictaion-textarea"/>
+                            <p style={{color: "red"}}>{errors.answerTwo?.message}</p>
+
+                            <label className="label">What do you hope to achieve in your first 6 months in this role?</label>
+                            <textarea type="text"  placeholder="Write your answer here..."
+                                   {...register("answerThree")} className="applictaion-textarea"/>
+                            <p style={{color: "red"}}>{errors.answerThree?.message}</p>
+
+                        </div>
+                        <div className="col-md-6">
+                            <label htmlFor="start">Curriculum vitae (CV)</label>
+                            <br/>
+                            <input {...register("file")} onChange={(e) => setResumeFile(e.target.files[0])} required type="file" id="fileUpload" accept=".pdf"/>
+
+                            <br/>
+                            <label className="label">Message to the recruiter</label>
+                            <textarea type="text" placeholder="Optional..."
+                                      {...register("messageToRecruiter")} className="applictaion-textarea"/>
+
+                            <br/><br/>
+                            <p style={{color: "red"}}>Please note that your personal data from your account will be used to identify and process your application.</p>
+                        </div>
+                    </div>
+
+                    <div className="aligned">
+                        <button className="submit-btn"> Submit</button>
+                    </div>
+
+                </form>
+            </div>
+        </Modal>
+    </div>)
+}
Index: jobvista-frontend/src/views/applications/ViewApplicationDetails.js
===================================================================
--- jobvista-frontend/src/views/applications/ViewApplicationDetails.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
+++ jobvista-frontend/src/views/applications/ViewApplicationDetails.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -0,0 +1,84 @@
+import React, {useEffect, useState} from "react";
+import "../job_advertisements/Form.css";
+
+import 'react-responsive-modal/styles.css';
+import {Modal} from 'react-responsive-modal';
+import Select from "react-select";
+
+//Validation
+import * as yup from "yup";
+import {yupResolver} from "@hookform/resolvers/yup";
+import {Controller, useForm} from "react-hook-form";
+
+
+import {employmentStatusOptions, industryOptions, jobTypeOptions} from "../selectOptions";
+import {useDispatch, useSelector} from "react-redux";
+import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+import Roles from "../../enumerations/Roles";
+import {ApplicationActions} from "../../redux/actions/applicationActions";
+
+
+export const ViewApplicationDetails = (props) => {
+    const {application} = props
+    const [modal, setModal] = useState(false);
+    const dispatch = useDispatch();
+    const auth = useSelector(state => state.auth.currentUser)
+    const [resumeUrl, setResumeUrl] = useState("");
+
+    //const [resumeFile, setResumeFile] = useState(null);
+    const toggleModal = () => {
+        setModal(!modal);
+    };
+
+    useEffect(() => {
+        if(application) {
+            dispatch(ApplicationActions.downloadResume(application.fileName, (success, response) => {
+                if(success) {
+                    setResumeUrl(response);
+                }
+            }))
+        }
+    }, [application])
+
+    return (<div className="modal-wrap">
+        <button onClick={toggleModal} className="application-button">View application</button>
+        <Modal open={modal} onClose={toggleModal} center >
+            <div className="head-modal">
+                <h3>{application.jobSeekerName}'s application for {application.jobAdTitle}</h3>
+                <i className="fa-solid fa-x btn-close-modal" onClick={toggleModal}></i>
+            </div>
+
+            <div className="modal-content" >
+                <form>
+                    <div className="row">
+                        <div className="col-md-6">
+                            <label className="label">Why are you interested in joining our company?</label>
+                            <textarea disabled type="text" defaultValue={application.questionAnswers[0]} disabled placeholder="Write your answer here..." className="applictaion-textarea"/>
+
+
+                            <label className="label">What makes you a good fit for this position?</label>
+                            <textarea disabled type="text" defaultValue={application.questionAnswers[1]}  placeholder="Write your answer here..." className="applictaion-textarea"/>
+
+
+                            <label className="label">What do you hope to achieve in your first 6 months in this role?</label>
+                            <textarea disabled type="text" defaultValue={application.questionAnswers[2]}  placeholder="Write your answer here..." className="applictaion-textarea"/>
+
+                        </div>
+                        <div className="col-md-6">
+                            <label htmlFor="start">Curriculum vitae (CV)</label>
+                            <br/>
+                            <a className="resume-link" href={resumeUrl} target="_blank" rel="noopener noreferrer">{application.fileName}</a>
+                            <br/>
+
+                            <br/>
+                            <label className="label">Message to the recruiter</label>
+                            <textarea disabled type="text" defaultValue={application.message} placeholder="Optional..." className="applictaion-textarea"/>
+
+                        </div>
+                    </div>
+
+                </form>
+            </div>
+        </Modal>
+    </div>)
+}
Index: jobvista-frontend/src/views/dashboard/Dashboard.css
===================================================================
--- jobvista-frontend/src/views/dashboard/Dashboard.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/dashboard/Dashboard.css	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -11,7 +11,8 @@
 }
 
-
-.head-dashboard-box .head-component {
-    display: inline;
+.head-dashboard-box .filter-container {
+    display: inline-flex;
+    justify-content: center;
+    gap: 10px;
 }
 
@@ -19,5 +20,6 @@
 .head-dashboard-box .search-container {
     position: relative;
-    float: left;
+    /*float: left;*/
+    display: inline-block;
 }
 .head-dashboard-box .search-container .search-input {
@@ -26,12 +28,12 @@
     padding: 5px 30px;
     border-radius: 10px;
-    margin-right: 15px;
+    /*margin-right: 15px;*/
 }
 
-.search-container .search-input:focus {
+.head-dashboard-box .search-container .search-input:focus {
     outline-color: #6367ef;
 }
 
-.search-container i {
+.head-dashboard-box .search-container i {
     left: 10px;
     position: absolute;
@@ -39,8 +41,8 @@
 }
 
-.item {
-    width: 35%;
+.head-dashboard-box .item {
+    width: 20%;
     display: inline-block;
-    margin-left: 10px;
-    float: right;
+    /*margin-left: 10px;*/
+    /*float: left !important;*/
 }
Index: jobvista-frontend/src/views/dashboard/Dashboard.js
===================================================================
--- jobvista-frontend/src/views/dashboard/Dashboard.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/dashboard/Dashboard.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -20,6 +20,6 @@
 
     const [role, setRole] = useState("");
-    const [sortOrder, setSortOrder] = useState("newest");
-    const [selectedDateRange, setSelectedDateRange] = useState("all");
+    const [selectedSortOrder, setSelectedSortOrder] = useState("date_newest");
+    const [selectedIndustry, setSelectedIndustry] = useState("all");
     const [searchTerm, setSearchTerm] = useState("");
     const [dispatched, setDispatched] = useState(false)
@@ -32,5 +32,5 @@
 
     useEffect(() => {
-        if(!dispatched && jobAdvertisementsState.length == 0) {
+        if (!dispatched && jobAdvertisementsState.length == 0) {
             dispatch(JobAdvertisementActions.fetchJobAdvertisements((success, response) => {
                 if (success && response.data.length > 0) {
@@ -39,5 +39,4 @@
                 setDispatched(true)
                 console.log("Fetch all job advertisements GET")
-                console.log(response.data)
             }))
 
@@ -46,6 +45,19 @@
             console.log("Fetch all job advertisements STATE")
         }
-    }, [])
+    }, [jobAdvertisementsState])
 
+    let filterJobAdvertisements = () => {
+        JobAdvertisementActions.filterJobAdvertisements(
+            {
+                searchTerm: searchTerm,
+                industry: selectedIndustry,
+                sortOrder: selectedSortOrder
+            }, (success, response) => {
+                if (success) {
+                    setJobAdvertisements(response.data);
+                }
+            }
+        )
+    }
 
     return (
@@ -53,22 +65,20 @@
             <div className="head-dashboard-box">
                 <div className="row">
-                    <div className="col-md-3">
-                        <div className="search-container head-component">
-                            <i className="fa-solid fa-magnifying-glass blue-colored"></i>
+                    <div className="col-md-12 filter-container">
+                        <div className="search-container">
+                            <i className="fa-solid fa-magnifying-glass search-icon"></i>
                             <input
                                 className="search-input"
                                 type="text"
                                 placeholder="Search job advertisement by title..."
-                                //value={searchTerm}
-                                //onChange={event => setSearchTerm(event.target.value)}
+                                value={searchTerm}
+                                onChange={event => setSearchTerm(event.target.value)}
                             />
                         </div>
-                    </div>
-                    <div className="col-md-9">
                         <div className="sort-section item">
                             <Select
                                 defaultValue={{value: "all", label: "All industries"}}
-                                //value={sortOrder.value}
-                                //onChange ={option => setSortOrder(option.value)}
+                                value={selectedIndustry.value}
+                                onChange={option => setSelectedIndustry(option.value)}
                                 options={industryOptionsFilter}
                                 className="sort-range sort"
@@ -78,20 +88,24 @@
                             <Select
                                 defaultValue={{value: "newest", label: "Date (Newest First)"}}
-                                //value={sortOrder.value}
-                                //onChange ={option => setSortOrder(option.value)}
-                                options = {sortOptions}
+                                value={selectedSortOrder.value}
+                                onChange={option => setSelectedSortOrder(option.value)}
+                                options={sortOptions}
                                 className="sort-range sort"
                             />
                         </div>
-                        <div className="date-range-section item">
-                            <Select
-                                defaultValue={{value: "all", label: "Lifetime"}}
-                                //value={selectedDateRange.value}
-                                //onChange={option => setSelectedDateRange(option.value)}
-                                options={dataRangeOptions}
-                                className="date-range sort"
-                            />
-                        </div>
+                        <button onClick={filterJobAdvertisements} className="btn-open-modal">Find jobs</button>
                     </div>
+                    {/*<div className="col-md-3">*/}
+
+                    {/*<div className="date-range-section item">*/}
+                    {/*    <Select*/}
+                    {/*        defaultValue={{value: "all", label: "Lifetime"}}*/}
+                    {/*        //value={selectedDateRange.value}*/}
+                    {/*        //onChange={option => setSelectedDateRange(option.value)}*/}
+                    {/*        options={dataRangeOptions}*/}
+                    {/*        className="date-range sort"*/}
+                    {/*    />*/}
+                    {/*</div>*/}
+                    {/*</div>*/}
                 </div>
             </div>
@@ -104,22 +118,25 @@
                                 <div className="card-head">
                                     <span className="hourly-salary"><b>${jobAd.startingSalary}/hr</b></span>
-                                    <span className="job-type"> {jobAd.jobType===JobType.JOB ? "Job" : "Internship"}</span>
+                                    <span
+                                        className="job-type"> {jobAd.jobType === JobType.JOB ? "Job" : "Internship"}</span>
                                     {!jobAd.active && <span className="expired">Expired</span>}
                                 </div>
                                 <div className="card-body">
                                     <h5 className="card-title">{jobAd.title}</h5>
-                                    <span>{jobAd.industry} • <span style={{color: "black", fontWeight: "bold"}}>{formatRelativeTime(jobAd.postedOn)}</span></span>
+                                    <span>{jobAd.industry} • <span style={{
+                                        color: "black",
+                                        fontWeight: "bold"
+                                    }}>{formatRelativeTime(jobAd.postedOn)}</span></span>
                                     <div className="card-info">
-                                        <span><i className="fa-solid fa-building" style={{color: "#000000"}}></i> Company: <span style={{color: "black", fontWeight: "bold"}}>{jobAd.recruiterName}</span></span> <br/>
+                                        <span><i className="fa-solid fa-building"
+                                                 style={{color: "#000000"}}></i> Company: <span style={{
+                                            color: "black",
+                                            fontWeight: "bold"
+                                        }}>{jobAd.recruiterName}</span></span> <br/>
                                     </div>
 
                                     <div className="aligned">
-                                        <Link to={`/job-advertisements/view/${jobAd.id}`} className="card-button">Read more</Link>
-                                        {role===Roles.JOBSEEKER &&
-                                            <>
-                                                {jobAd.active && <button className="card-button">Apply now</button> }
-                                                {!jobAd.active && <button className="card-button disabled">Apply now</button> }
-                                            </>
-                                        }
+                                        <Link to={`/job-advertisements/${jobAd.id}`} className="card-button">Read
+                                            more</Link>
                                     </div>
 
Index: jobvista-frontend/src/views/job_advertisements/AddJobAdModal.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/AddJobAdModal.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/AddJobAdModal.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -1,4 +1,6 @@
 import React, {useState} from "react";
 import "./Form.css";
+
+import { Editor } from 'primereact/editor';
 
 import 'react-responsive-modal/styles.css';
@@ -19,4 +21,5 @@
 export const AddJobAdModal = () => {
     const [modal, setModal] = useState(false);
+    const [text, setText] = useState("");
     const dispatch = useDispatch();
     const auth = useSelector(state => state.auth.currentUser)
@@ -52,5 +55,5 @@
                     employmentStatus: values.employmentStatus.value,
                 }, (success, response) => {
-                    if(success) {
+                    if (success) {
                         console.log("Job Advertisement added")
                         toggleModal()
@@ -66,80 +69,99 @@
 
     return (<div className="modal-wrap">
-            <button onClick={toggleModal} className="btn-open-modal">POST ADVERTISEMENT</button>
-            <Modal open={modal} onClose={toggleModal} center classNames="job-advertisement-modal">
-                <div className="head-modal">
-                    <h3>Post Job Advertisement</h3>
-                    <i className="fa-solid fa-x btn-close-modal" onClick={toggleModal}></i>
-                </div>
+        <div className="col">
+            <button onClick={toggleModal} className="add-new-card">
+                <h3>+ Post Advertisement</h3>
+            </button>
+        </div>
+        {/*<button onClick={toggleModal} className="btn-open-modal">POST ADVERTISEMENT</button>*/}
+        <Modal open={modal} onClose={toggleModal} center classNames="job-advertisement-modal">
+            <div className="head-modal">
+                <h3>Post Job Advertisement</h3>
+                <i className="fa-solid fa-x btn-close-modal" onClick={toggleModal}></i>
+            </div>
 
-                <div className="modal-content">
-                    <form onSubmit={handleSubmit(addJobAdvertisement)}>
-                        <div className="row">
-                            <div className="col-md-7">
+            <div className="modal-content">
+                <form onSubmit={handleSubmit(addJobAdvertisement)}>
+                    <div className="row">
+                        <div className="col-md-7">
 
-                                <label className="label">Job title:</label>
-                                <input type="text" {...register("title")}/>
-                                <p style={{color: "red"}}>{errors.title?.message}</p>
+                            <label className="label">Job title:</label>
+                            <input type="text" {...register("title")}/>
+                            <p style={{color: "red"}}>{errors.title?.message}</p>
 
-                                <label className="label">Job description:</label>
-                                <textarea type="text" placeholder="Describe the job position and all the requirements"
-                                          className="description-textarea" {...register("description")}/>
-                                <p style={{color: "red"}}>{errors.description?.message}</p>
-                            </div>
-
-                            <div className="col-md-5">
-                                <label className="label">Hourly rate:</label>
-                                <input {...register("startingSalary")}/>
-                                <p style={{color: "red"}}>{errors.startingSalary?.message}</p>
-
-                                <label className="label">Industry:</label>
-                                <Controller
-                                    name="industry"
-                                    control={control}
-                                    render={({ field })  => (<Select
-                                            {...field}
-                                            options={industryOptions}
-                                        />)}
-                                />
-                                <p style={{color: "red"}}>{errors.industry?.message}</p>
-
-                                <label className="label">Job type:</label>
-                                <Controller
-                                    name="jobType"
-                                    control={control}
-                                    render={({ field }) => (<Select
-                                            {...field}
-                                            options={jobTypeOptions}
-                                        />)}
-                                />
-                                <p style={{color: "red"}}>{errors.jobType?.message}</p>
-
-                                <label className="label">Employment status</label>
-                                <Controller
-                                    name="employmentStatus"
-                                    control={control}
-                                    render={({ field }) => (<Select
-                                            {...field}
-                                            options={employmentStatusOptions}
-                                        />)}
-                                />
-                                <p style={{color: "red"}}>{errors.employmentStatus?.message}</p>
-
-                                <label htmlFor="start">Active until:</label>
-                                <input type="date" defaultValue={minimumDate.toLocaleDateString('en-CA')}
-                                       min={minimumDate.toLocaleDateString('en-CA')} onChange={(event) => console.log(event.target.value)}
-                                       {...register("date")}/>
+                            <label className="label">Job description:</label>
+                            {/*<textarea type="text" placeholder="Describe the job position and all the requirements"*/}
+                            {/*          className="description-textarea" {...register("description")}/>*/}
 
 
-                            </div>
+                            <Controller
+                                name="description"
+                                control={control}
+                                render={({ field }) => (
+                                    <Editor
+                                        value={field.value}
+                                        onTextChange={(e) => field.onChange(e.htmlValue)}
+                                        style={{ height: '300px', fontSize: "16px", fontFamily: "Segoe UI" }}
+                                    />
+                                )}
+                            />
+                            <p style={{color: "red"}}>{errors.description?.message}</p>
                         </div>
 
-                        <div className="aligned">
-                            <button className="submit-btn"> Submit</button>
+                        <div className="col-md-5">
+                            <label className="label">Hourly rate:</label>
+                            <input {...register("startingSalary")}/>
+                            <p style={{color: "red"}}>{errors.startingSalary?.message}</p>
+
+                            <label className="label">Industry:</label>
+                            <Controller
+                                name="industry"
+                                control={control}
+                                render={({field}) => (<Select
+                                    {...field}
+                                    options={industryOptions}
+                                />)}
+                            />
+                            <p style={{color: "red"}}>{errors.industry?.message}</p>
+
+                            <label className="label">Job type:</label>
+                            <Controller
+                                name="jobType"
+                                control={control}
+                                render={({field}) => (<Select
+                                    {...field}
+                                    options={jobTypeOptions}
+                                />)}
+                            />
+                            <p style={{color: "red"}}>{errors.jobType?.message}</p>
+
+                            <label className="label">Employment status</label>
+                            <Controller
+                                name="employmentStatus"
+                                control={control}
+                                render={({field}) => (<Select
+                                    {...field}
+                                    options={employmentStatusOptions}
+                                />)}
+                            />
+                            <p style={{color: "red"}}>{errors.employmentStatus?.message}</p>
+
+                            <label htmlFor="start">Active until:</label>
+                            <input type="date" defaultValue={minimumDate.toLocaleDateString('en-CA')}
+                                   min={minimumDate.toLocaleDateString('en-CA')}
+                                   onChange={(event) => console.log(event.target.value)}
+                                   {...register("date")}/>
+
+
                         </div>
+                    </div>
 
-                    </form>
-                </div>
-            </Modal>
-        </div>)
+                    <div className="aligned">
+                        <button className="submit-btn"> Submit</button>
+                    </div>
+
+                </form>
+            </div>
+        </Modal>
+    </div>)
 }
Index: jobvista-frontend/src/views/job_advertisements/EditJobAdModal.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/EditJobAdModal.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/EditJobAdModal.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -15,4 +15,5 @@
 import {useDispatch, useSelector} from "react-redux";
 import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
+import {Editor} from "primereact/editor";
 
 
@@ -85,6 +86,20 @@
 
                             <label className="label">Job description:</label>
-                            <textarea type="text" defaultValue={jobAd.props.description} placeholder="Describe the job position and all the requirements"
-                                      className="description-textarea" {...register("description")}/>
+                            {/*<textarea type="text" defaultValue={jobAd.props.description} placeholder="Describe the job position and all the requirements"*/}
+                            {/*          className="description-textarea" {...register("description")}/>*/}
+
+                            <Controller
+                                name="description"
+                                control={control}
+                                render={({ field }) => (
+                                    <Editor
+                                        defaultValue={jobAd.props.description}
+                                        value={jobAd.props.description}
+                                        onTextChange={(e) => field.onChange(e.htmlValue)}
+                                        style={{ height: '300px', fontSize: "16px", fontFamily: "Segoe UI" }}
+                                    />
+                                )}
+                            />
+
                             <p style={{color: "red"}}>{errors.description?.message}</p>
                         </div>
Index: jobvista-frontend/src/views/job_advertisements/Form.css
===================================================================
--- jobvista-frontend/src/views/job_advertisements/Form.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/Form.css	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -12,5 +12,5 @@
     font-weight: 600;
     float: right;
-    margin-left: 10px;
+    /*margin-left: 10px;*/
 }
 
@@ -87,5 +87,19 @@
 .description-textarea {
     height: 285px;
+}
 
+.applictaion-textarea {
+    height: 100px;
+}
+
+.resume-link {
+    display: block;
+    padding: 5px 10px;
+    width: 100%;
+    border-radius: 3px;
+    border: 1px solid lightgrey;
+}
+.custom {
+    margin-top: 10px;
 }
 
@@ -161,6 +175,16 @@
 }
 
+.ql-snow .ql-picker.ql-font {
+    display: none;
+}
+.ql-toolbar.ql-snow .ql-picker-options {
+    background-color: white;
+}
+.ql-snow .ql-tooltip {
+    transform: translateX(100px) !important;
+}
 
 
 
 
+
Index: jobvista-frontend/src/views/job_advertisements/JobAdDetails.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/JobAdDetails.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/JobAdDetails.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -9,4 +9,5 @@
 import {formatRelativeTime} from "../../utils/utils";
 import {AddJobAdModal} from "./AddJobAdModal";
+import {ApplyToJobAdModal} from "../applications/ApplyToJobAdModal";
 
 
@@ -52,5 +53,5 @@
 
                     <p><i className="fa-solid fa-money-check-dollar"></i> <span>Hourly rate: ${jobAd.startingSalary}</span></p>
-                    <p><i className="fa-solid fa-briefcase"></i> Employment status: {jobAd.employmentStatus===EmploymentStatus.FULL_TIME ? "Full-time" : "Part-time"}</p>
+                    <p><i className="fa-solid fa-briefcase"></i> Employment status: {jobAd.employmentStatus==="FULL_TIME" ? "Full-time" : "Part-time"}</p>
                     <p><i className="fa-solid fa-calendar-days"></i> Active until: {new Date(jobAd.activeUntil).toLocaleString('default', { day: 'numeric', month: 'long',  year: 'numeric' })}</p>
 
@@ -59,12 +60,5 @@
                         <p dangerouslySetInnerHTML={{ __html: jobAd.description.replace(/\n/g, "<br>") }}></p>
                     )}
-
-
-                    {role===Roles.JOBSEEKER &&
-                        <>
-                            {jobAd.active && <button className="card-button apply">Apply now</button> }
-                            {!jobAd.active && <button className="card-button apply disabled">Apply now</button> }
-                        </>
-                    }
+                    <ApplyToJobAdModal jobAd={jobAd} role={role}/>
 
                 </div>
@@ -76,9 +70,9 @@
                     {/*TO DO - AFTER IMPLEMENTING FORM FOR UPDATING PERSONAL INFO*/}
                     <h4>About the company</h4>
-                    <p>As a pioneering Swiss software company, we provide innovative IT products and tailored digital solutions. We bring decades of experience in designing, developing, and implementing highly scalable, secure, and user-centric software.
+                    <p>
+                        For over two decades, we have been harnessing technology to drive meaningful change.  Working side by side with leading brands, we build strategies, products and solutions tailored to unique needs –regardless of industry, region or scale. By combining world-class engineering, industry expertise and a people-centric mindset, we consult and partner with our customers to create technological solutions that drive innovation and transform businesses.
                         <br/><br/>
-                        Working across the banking, payment, mobility, health, and publishing industries, we are experts at delivering seamless and secure user journeys within these privacy-driven environments. Our business-critical applications are designed to overcome complexity and drive growth.
-                        <br/><br/>
-                        We are based in Zurich, Switzerland, and have offices elsewhere in Europe, Asia, and the Middle East. Founded in 1996, we are a business of 800 experts, enabling our clients to create value with trusted software..
+                        From ideation to production, we support our customers with bespoke solutions across various industries, including payments, insurance, finance and banking, technology, media and entertainment, telecommunications, retail and consumer goods, supply chain and logistics, healthcare and life sciences, energy and resources, government, automotive and travel.
+
                     </p>
                     <p><span><i className="fa-solid fa-envelope"></i> {recruiterDetails.email}</span> • <span>
Index: jobvista-frontend/src/views/job_advertisements/JobAdvertisements.css
===================================================================
--- jobvista-frontend/src/views/job_advertisements/JobAdvertisements.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/JobAdvertisements.css	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -1,45 +1,0 @@
-.head-job-advertisements-box {
-    height: 10%;
-    width: 100%;
-    background-color: #fff;
-    border-radius: 12px;
-    padding: 15px 20px;
-    margin-bottom: 20px;
-    margin-top: 30px;
-    height: auto;
-}
-
-
-.head-job-advertisements-box .head-component {
-    display: inline;
-}
-
-
-.head-job-advertisements-box .search-container {
-    position: relative;
-    float: left;
-}
-.head-job-advertisements-box .search-container .search-input {
-    width: 400px;
-    display: inline;
-    padding: 5px 30px;
-    border-radius: 10px;
-    margin-right: 15px;
-}
-
-.search-container .search-input:focus {
-    outline-color: #6367ef;
-}
-
-.search-container i {
-    left: 10px;
-    position: absolute;
-    top: 10px;
-}
-
-.item {
-    width: 25%;
-    display: inline-block;
-    margin-left: 10px;
-    float: right;
-}
Index: jobvista-frontend/src/views/job_advertisements/JobAdvertisements.js
===================================================================
--- jobvista-frontend/src/views/job_advertisements/JobAdvertisements.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/job_advertisements/JobAdvertisements.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -6,5 +6,5 @@
 import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
 import {formatRelativeTime, sortElementsByDateCreated} from "../../utils/utils";
-import {dataRangeOptions, industryOptions, sortOptions} from "../selectOptions";
+import {dataRangeOptions, industryOptions, industryOptionsFilter, sortOptions} from "../selectOptions";
 import Select from "react-select";
 import {DeleteJobAdModal} from "./DeleteJobAdModal";
@@ -13,5 +13,5 @@
 import JobType from "../../enumerations/JobType";
 
-export const JobAdvertisements = () => {
+export const JobAdvertisements = (props) => {
 
     const dispatch = useDispatch();
@@ -21,6 +21,6 @@
 
     const [role, setRole] = useState("");
-    const [sortOrder, setSortOrder] = useState("newest");
-    const [selectedDateRange, setSelectedDateRange] = useState("all");
+    const [selectedSortOrder, setSelectedSortOrder] = useState("date_newest");
+    const [selectedIndustry, setSelectedIndustry] = useState("all");
     const [searchTerm, setSearchTerm] = useState("");
     const [dispatched, setDispatched] = useState(false)
@@ -35,5 +35,5 @@
     useEffect(() => {
         if (!dispatched && jobAdvertisementsByRecruiterState.length === 0) {
-            dispatch(JobAdvertisementActions.fetchJobAdvertisementsByRecruiter("deleteThis", (success, response) => {
+            dispatch(JobAdvertisementActions.fetchJobAdvertisementsByRecruiter((success, response) => {
                 if (success && response.data.length > 0) {
                     setJobAdvertisementsByRecruiter(sortElementsByDateCreated(response.data))
@@ -49,45 +49,57 @@
     }, [jobAdvertisementsByRecruiterState])
 
+    let filterJobAdvertisements = () => {
+        JobAdvertisementActions.filterJobAdvertisementsByRecruiter(
+            {
+                searchTerm: searchTerm,
+                industry: selectedIndustry,
+                sortOrder: selectedSortOrder
+            }, (success, response) => {
+                if (success) {
+                    setJobAdvertisementsByRecruiter(response.data);
+                }
+            }
+        )
+    }
+
     return (
         <div className="container">
-            <div className="head-job-advertisements-box">
+            <div className="head-dashboard-box">
                 <div className="row">
-                    <div className="col-md-3">
-                        <div className="search-container head-component">
-                            <i className="fa-solid fa-magnifying-glass blue-colored"></i>
+                    <div className="col-md-12 filter-container">
+                        <div className="search-container">
+                            <i className="fa-solid fa-magnifying-glass search-icon"></i>
                             <input
                                 className="search-input"
                                 type="text"
                                 placeholder="Search job advertisement by title..."
-                                //value={searchTerm}
-                                //onChange={event => setSearchTerm(event.target.value)}
+                                value={searchTerm}
+                                onChange={event => setSearchTerm(event.target.value)}
                             />
                         </div>
-                    </div>
-                    <div className="col-md-9">
-
-                        <AddJobAdModal/>
+                        <div className="sort-section item">
+                            <Select
+                                defaultValue={{value: "all", label: "All industries"}}
+                                value={selectedIndustry.value}
+                                onChange={option => setSelectedIndustry(option.value)}
+                                options={industryOptionsFilter}
+                                className="sort-range sort"
+                            />
+                        </div>
                         <div className="sort-section item">
                             <Select
                                 defaultValue={{value: "newest", label: "Date (Newest First)"}}
-                                //value={sortOrder.value}
-                                //onChange ={option => setSortOrder(option.value)}
+                                value={selectedSortOrder.value}
+                                onChange={option => setSelectedSortOrder(option.value)}
                                 options={sortOptions}
                                 className="sort-range sort"
                             />
                         </div>
-                        <div className="date-range-section item">
-                            <Select
-                                defaultValue={{value: "all", label: "Lifetime"}}
-                                //value={selectedDateRange.value}
-                                //onChange={option => setSelectedDateRange(option.value)}
-                                options={dataRangeOptions}
-                                className="date-range sort"
-                            />
-                        </div>
+                        <button onClick={filterJobAdvertisements} className="btn-open-modal">Find jobs</button>
                     </div>
                 </div>
             </div>
             <div className="row row-cols-1 row-cols-md-4 g-4">
+                <AddJobAdModal/>
 
                 {jobAdvertisementsByRecruiter &&
@@ -97,5 +109,6 @@
                                 <div className="card-head">
                                     <span className="hourly-salary"><b>${jobAd.startingSalary}/hr</b></span>
-                                    <span className="job-type"> {jobAd.jobType===JobType.JOB ? "Job" : "Internship"}</span>
+                                    <span
+                                        className="job-type"> {jobAd.jobType === JobType.JOB ? "Job" : "Internship"}</span>
                                     {!jobAd.active && <span className="expired">Expired</span>}
                                     <div className="card-management-btns">
@@ -106,11 +119,19 @@
                                 <div className="card-body">
                                     <h5 className="card-title">{jobAd.title}</h5>
-                                    <span>{jobAd.industry} • <span style={{color: "black", fontWeight: "bold"}}>{formatRelativeTime(jobAd.postedOn)}</span></span>
+                                    <span>{jobAd.industry} • <span style={{
+                                        color: "black",
+                                        fontWeight: "bold"
+                                    }}>{formatRelativeTime(jobAd.postedOn)}</span></span>
                                     <div className="card-info">
-                                        <span><i className="fa-solid fa-building" style={{color: "#000000"}}></i> Company: <span style={{color: "black", fontWeight: "bold"}}>{jobAd.recruiterName}</span></span> <br/>
+                                        <span><i className="fa-solid fa-building"
+                                                 style={{color: "#000000"}}></i> Company: <span style={{
+                                            color: "black",
+                                            fontWeight: "bold"
+                                        }}>{jobAd.recruiterName}</span></span> <br/>
                                     </div>
 
                                     <div className="aligned">
-                                        <Link to={`/my-job-advertisements/view/${jobAd.id}`} className="card-button solo">View applications</Link>
+                                        <Link to={`/my-job-advertisements/${jobAd.id}/applications`}
+                                              className="card-button solo">View applications</Link>
                                     </div>
 
Index: jobvista-frontend/src/views/selectOptions.js
===================================================================
--- jobvista-frontend/src/views/selectOptions.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/selectOptions.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -58,7 +58,7 @@
 
 export const sortOptions = [
-    { value: "newest", label: "Date (Newest First)" },
-    { value: "oldest", label: "Date (Oldest First)" },
-    { value: "highest", label: "Salary (High to Low)" },
-    { value: "lowest", label: "Salary (Low to High)" },
+    { value: "date_newest", label: "Date (Newest First)" },
+    { value: "date_oldest", label: "Date (Oldest First)" },
+    { value: "salary_highest", label: "Salary (High to Low)" },
+    { value: "salary_lowest", label: "Salary (Low to High)" },
 ]
Index: jobvista-frontend/src/views/static/Header.css
===================================================================
--- jobvista-frontend/src/views/static/Header.css	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/static/Header.css	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -20,4 +20,5 @@
     height: 80px;
     background-color: #535C91;
+    font-family: Poppins, sans-serif;
 }
 
Index: jobvista-frontend/src/views/static/Header.js
===================================================================
--- jobvista-frontend/src/views/static/Header.js	(revision 19398adb44637736271a04ab58b1f528cc33908f)
+++ jobvista-frontend/src/views/static/Header.js	(revision 28b3398dcd7f9cfd044c2cb7923434b06037fee2)
@@ -38,6 +38,6 @@
                         {role==Roles.JOBSEEKER &&
                             <>
-                                <NavLink to="/applications" className="nav-item nav-link" >Applications</NavLink>
-                                <NavLink to="/favoritejobs" className="nav-item nav-link" >Saved</NavLink>
+                                <NavLink to="/my-applications" className="nav-item nav-link" >My Applications</NavLink>
+                                {/*<NavLink to="/favoritejobs" className="nav-item nav-link" >Saved</NavLink>*/}
                             </>
 
@@ -45,10 +45,10 @@
                         {role==Roles.RECRUITER &&
                             <>
-                                <NavLink to="/my-job-advertisements" className="nav-item nav-link" >Job Advertisements</NavLink>
-                                <NavLink to="/favoritejobs" className="nav-item nav-link" >Saved</NavLink>
+                                <NavLink to="/my-job-advertisements" className="nav-item nav-link" >My Advertisements</NavLink>
+                                {/*<NavLink to="/favoritejobs" className="nav-item nav-link" >Saved</NavLink>*/}
                             </>
                         }
                         <NavLink to="/about" className="nav-item nav-link">About</NavLink>
-                        <NavLink to="/contact" className="nav-item nav-link">Contact</NavLink>
+                        <NavLink to="/contact" className="nav-item nav-link">Support</NavLink>
                     </ul>
 
