Changeset 43c9090


Ignore:
Timestamp:
10/12/24 21:32:15 (5 weeks ago)
Author:
macagaso <gasoskamarija@…>
Branches:
master
Parents:
743de55
Message:

Updated version

Location:
src/main
Files:
5 added
39 edited

Legend:

Unmodified
Added
Removed
  • src/main/java/finki/it/terapijamkbackend/spring/controllers/AppointmentController.java

    r743de55 r43c9090  
    9494        try {
    9595            Long userId = appointmentService.updateAppointment(term);
    96             System.out.println(userId);
    9796            return ResponseEntity.ok(userId.toString());
    9897        } catch (Exception e) {
     
    120119        try {
    121120            appointmentService.deleteAppointmentByTerm(term);
    122             return ResponseEntity.noContent().build(); // Returns 204 No Content on success
     121            return ResponseEntity.noContent().build();
    123122        } catch (IllegalArgumentException e) {
    124             return ResponseEntity.notFound().build(); // Returns 404 Not Found if appointment doesn't exist
     123            return ResponseEntity.notFound().build();
    125124        }
    126125    }
     
    149148    }
    150149
    151 
    152150}
  • src/main/java/finki/it/terapijamkbackend/spring/controllers/AuthController.java

    r743de55 r43c9090  
    33import finki.it.terapijamkbackend.spring.dto.LoginResponse;
    44import finki.it.terapijamkbackend.spring.entities.User;
    5 import finki.it.terapijamkbackend.spring.entities.UserRole;
    65import finki.it.terapijamkbackend.spring.services.UserService;
    76import jakarta.servlet.http.Cookie;
     
    4948            Cookie usernameCookie = new Cookie("username", temp.getUsername());
    5049            usernameCookie.setPath("/");
    51             usernameCookie.setMaxAge(60*5);
     50            usernameCookie.setMaxAge(600);
    5251            response.addCookie(usernameCookie);
     52
     53            Cookie roleCookie = new Cookie("role", temp.getUserRole().toString());
     54            roleCookie.setPath("/");
     55            roleCookie.setMaxAge(600);
     56            response.addCookie(roleCookie);
    5357
    5458            return ResponseEntity.ok(loginResponse);
  • src/main/java/finki/it/terapijamkbackend/spring/controllers/CouponController.java

    r743de55 r43c9090  
    33import finki.it.terapijamkbackend.spring.services.CouponsService;
    44import jakarta.persistence.EntityNotFoundException;
    5 import jakarta.transaction.Transactional;
    65import org.springframework.beans.factory.annotation.Autowired;
    76import org.springframework.http.HttpStatus;
     
    2019    @PutMapping("/createCoupon")
    2120    public ResponseEntity<Coupon> updateCoupon(@RequestBody Coupon couponItem) {
    22         System.out.println(couponItem);
    2321        if (couponItem.getTitle() == null || couponItem.getCode() == null) {
    2422            return ResponseEntity.badRequest().build();
     
    5351        coupon.setCode(newCouponData.getCode());
    5452        coupon.setDescription(newCouponData.getDescription());
    55         couponService.save(coupon); // Save the updated coupon
     53        couponService.save(coupon);
    5654
    5755        return ResponseEntity.ok().build();
    5856    }
     57
     58
     59    @GetMapping("/getCouponNames")
     60    public ResponseEntity<List<String>> getCouponNames() {
     61        List<String> couponNames = couponService.getCouponNames();
     62        return ResponseEntity.ok(couponNames);
     63    }
    5964}
  • src/main/java/finki/it/terapijamkbackend/spring/controllers/EventController.java

    r743de55 r43c9090  
    11package finki.it.terapijamkbackend.spring.controllers;
    22
    3 import finki.it.terapijamkbackend.spring.entities.Coupon;
    43import finki.it.terapijamkbackend.spring.entities.Event;
    5 import finki.it.terapijamkbackend.spring.services.AppointmentService;
    64import finki.it.terapijamkbackend.spring.services.EventService;
    75import jakarta.persistence.EntityNotFoundException;
     
    2321    @PutMapping("/createEvent")
    2422    public ResponseEntity<Event> updateEvent(@RequestBody Event eventItem) {
    25         System.out.println(eventItem);
    2623        if (eventItem.getTitle() == null || eventItem.getText() == null) {
    2724            return ResponseEntity.badRequest().build();
     
    5754        event.setText(newEventData.getText());
    5855        event.setImgSrc(newEventData.getImgSrc());
    59         eventService.saveEvent(event); // Save the updated coupon
     56        eventService.saveEvent(event);
    6057
    6158        return ResponseEntity.ok().build();
  • src/main/java/finki/it/terapijamkbackend/spring/controllers/RequestController.java

    r743de55 r43c9090  
    3737    @GetMapping("/listAll")
    3838    public List<TermsResponse> getRequestsByUser(@RequestParam("username") String username) {
    39         System.out.println(username);
    4039        List<Request>terms=requestService.findRequestsByUsername(username);
    4140        return terms.stream()
  • src/main/java/finki/it/terapijamkbackend/spring/controllers/UserController.java

    r743de55 r43c9090  
    4545            response = new HashMap<>();
    4646            response.put("message", "User created successfully!");
    47             System.out.println(response);
    4847            return ResponseEntity.ok(response);
    4948        } catch (Exception e) {
     
    5453    @GetMapping("/editUser")
    5554    public ResponseEntity<User> getUser(@RequestParam String username) {
    56         User user = userService.getUserByUsername(username); // Fetch user data from service
     55        User user = userService.getUserByUsername(username);
    5756        if (user != null) {
    58             return ResponseEntity.ok(user); // Return user data as JSON
     57            return ResponseEntity.ok(user);
    5958        } else {
    60             return ResponseEntity.notFound().build(); // Handle user not found
     59            return ResponseEntity.notFound().build();
    6160        }
    6261    }
     
    7675            String oldUsername=getCookieValue(request, "username");
    7776            User user = userService.updateUser(oldUsername, updatedUser);
    78             return ResponseEntity.ok(user); // Return the updated user in the response
     77            return ResponseEntity.ok(user);
    7978        } catch (UserNotFoundException e) {
    80             return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); // Return a 404 if user is not found
     79            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
    8180        } catch (Exception e) {
    82             return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); // Return a 500 for other errors
     81            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    8382        }
    8483    }
  • src/main/java/finki/it/terapijamkbackend/spring/controllers/WebController.java

    r743de55 r43c9090  
    11package finki.it.terapijamkbackend.spring.controllers;
    22
     3import finki.it.terapijamkbackend.spring.services.UserService;
     4import org.springframework.beans.factory.annotation.Autowired;
    35import org.springframework.stereotype.Controller;
    46import org.springframework.web.bind.annotation.GetMapping;
    57
     8
    69@Controller
    710public class WebController {
    8 
    911    @GetMapping(path="/")
    1012    public String index() {
     
    5153        return "html/adminCoupons";
    5254    }
     55
     56    @GetMapping(path="/userInfo.html")
     57    public String userInfo() {
     58        return "html/userInfo";
     59    }
    5360}
  • src/main/java/finki/it/terapijamkbackend/spring/entities/Appointment.java

    r743de55 r43c9090  
    2626    private Long id;
    2727
    28     @ManyToOne(fetch = FetchType.LAZY)  // Fetch the related entity lazily to avoid loading all properties
     28    @ManyToOne(fetch = FetchType.LAZY)
    2929    @JoinColumn(name="request_id", referencedColumnName = "id")
    3030    @JsonIgnore
  • src/main/java/finki/it/terapijamkbackend/spring/entities/Event.java

    r743de55 r43c9090  
    2525
    2626    private String title;
     27    @Lob
     28    @Column(name = "text", columnDefinition = "TEXT")
    2729    private String text;
    28     @Lob // Indicates that this field can hold large data
    29     @Column(name = "img_src", columnDefinition = "TEXT") // Ensure column type is TEXT in database
     30    @Lob
     31    @Column(name = "img_src", columnDefinition = "TEXT")
    3032    private String imgSrc;
    3133
  • src/main/java/finki/it/terapijamkbackend/spring/services/CouponsService.java

    r743de55 r43c9090  
    99import java.util.List;
    1010import java.util.Optional;
     11import java.util.stream.Collectors;
    1112
    1213@Service
     
    3334        return couponRepository.findByTitle(identifier);
    3435    }
     36    public List<String> getCouponNames() {
     37        return couponRepository.findAll().stream()
     38                .map(Coupon::getCode)
     39                .collect(Collectors.toList());
     40    }
    3541
    3642    public void save(Coupon coupon) {
  • src/main/java/finki/it/terapijamkbackend/spring/services/EventService.java

    r743de55 r43c9090  
    11package finki.it.terapijamkbackend.spring.services;
    22
    3 import finki.it.terapijamkbackend.spring.entities.Coupon;
    43import finki.it.terapijamkbackend.spring.entities.Event;
    54import finki.it.terapijamkbackend.spring.repositories.EventRepository;
    6 import finki.it.terapijamkbackend.spring.repositories.UserRepository;
    75import jakarta.persistence.EntityNotFoundException;
    86import org.springframework.beans.factory.annotation.Autowired;
  • src/main/java/finki/it/terapijamkbackend/spring/services/RequestService.java

    r743de55 r43c9090  
    4141    public List<Request> findRequestsByUsername(String username) {
    4242       User user=userRepository.findByUsername(username).orElse(null);
    43         System.out.println(user.getId());
    4443        return requestRepository.findRequestsForFreeAppointments(user.getId());
    4544    }
  • src/main/java/finki/it/terapijamkbackend/spring/services/UserService.java

    r743de55 r43c9090  
    5858            }
    5959
    60             return userRepository.save(existingUser); // Save the updated user back to the database
     60            return userRepository.save(existingUser);
    6161        } else {
    6262            throw new UserNotFoundException("User not found with username: " + username);
  • src/main/resources/static/css/admin-terms.css

    r743de55 r43c9090  
    4444}
    4545#active{
    46     margin: 15px 0;
     46    padding: 15px;
    4747    display: flex;
    4848    flex-direction: column;
    4949    gap: 10px;
     50    border: 1px solid #ccc;
     51    border-radius: 5px;
     52    background-color: #f9f9f9;
    5053}
    5154#frame{
     
    7982    position: relative;
    8083    overflow: hidden;
    81     /* transform: scale(1.25); */
    8284}
    8385
     
    131133    cursor: pointer;
    132134    animation: to-top 1s forwards;
    133     /* border-radius: 50%; */
    134135}
    135136#frame > *:hover{
    136137    background-color:white;
    137     transition: background-color 0.3s, transform 0.3s;
    138138}
    139139
     
    276276    font-size: 14px;
    277277    height: 30px;
    278     width: 55px;
     278    width: 70px;
    279279    padding: 5px;
    280     overflow: hidden; /* Hide overflow if needed */
     280    overflow: hidden;
    281281}
    282282
     
    291291    width: 100%;
    292292    height: 100%;
    293     background-color: rgba(0, 0, 0, 0.5); /* Dark background */
     293    background-color: rgba(0, 0, 0, 0.5);
    294294    justify-content: center;
    295295    align-items: center;
     
    320320}
    321321
    322 #cancelBtn {
    323     background-color: #f44336; /* Red */
     322#cancelBtn, #temporal-deletion, #delete-approval{
     323    background-color: #ff6666;
    324324    color: white;
    325 }
    326 
    327 #approveBtn {
    328     background-color: #4CAF50; /* Green */
     325    max-width: fit-content;
     326}
     327
     328#approveBtn, #confirm-approval, #approve-carried-out{
     329    background-color: #4CAF50;
    329330    color: white;
    330331}
     
    390391    background-color: #f9f9f9;
    391392}
     393
    392394#creation > * {
    393395    padding-bottom: 10px;
     
    405407}
    406408
    407 #delete-all-free button {
    408     padding: 10px;
    409     background-color: #ff6666;
     409#authButton{
     410    position: absolute;
     411    left: 1145px;
     412    top: 21px;
     413    width: 150px;
    410414    color: white;
     415    background-color: red;
     416    padding: 10px;
    411417    border: none;
    412418    border-radius: 5px;
    413     cursor: pointer;
    414419}
    415420
     
    423428}
    424429
    425 
    426 
    427 /* Table styles */
    428430table {
    429     width: 320px;
     431    padding-top: 10px;
     432    width: fit-content;
    430433    border-collapse: collapse;
    431434    margin-bottom: 20px;
    432435}
    433436
    434 /* Table header styles */
    435 thead {
    436     background-color: #007BFF;
    437     color: white;
    438 }
    439 
    440 th {
     437
     438thead > tr {
    441439    padding: 10px;
    442440    text-align: left;
    443441}
    444 
    445 
    446442
    447443tbody tr {
     
    451447
    452448tbody tr:hover {
    453     background-color: #f1f1f1; /* Highlight row on hover */
     449    background-color: #f1f1f1;
    454450}
    455451
     
    457453    padding: 10px;
    458454}
     455
     456#request-assets, #appointment-assets
     457{
     458    display: flex;
     459    flex-direction: row;
     460    gap: 10px;
     461}
     462
     463h3{
     464    padding-top: 20px;
     465}
     466#summary{
     467    margin-top: 20px;
     468    padding: 15px;
     469    display: flex;
     470    flex-direction: column;
     471    border: 1px solid #ccc;
     472    border-radius: 5px;
     473    background-color: #f9f9f9;
     474}
     475#authButton{
     476    position: absolute;
     477    left: 1145px;
     478    top: 21px;
     479    width: 150px;
     480}
  • src/main/resources/static/css/admin.css

    r743de55 r43c9090  
    4141    padding: 30px;
    4242    display: grid;
    43     grid-template-columns: repeat(2, 1fr); /* Create two equal columns */
    44     gap: 20px;                          /* Space between grid items */
     43
     44    grid-template-columns: repeat(2, 1fr);
     45    gap: 20px;
    4546}
    4647#menu a {
    47     display: flex;                      /* Enable Flexbox for a */
    48     flex-direction: column;            /* Align icon and text vertically */
    49     align-items: center;               /* Center items horizontally */
     48    display: flex;
     49    flex-direction: column;
     50    align-items: center;
    5051    justify-content: center;
    51     text-decoration: none;             /* Remove underline from links */
    52     padding: 15px;                    /* Add padding inside each link */
    53     border: 1px solid #ccc;           /* Optional: border around each link */
     52    text-decoration: none;
     53    padding: 15px;
     54    border: 1px solid #ccc;
    5455    border-radius: 5px;
    5556    font-size: 30px; ;
    5657}
    5758#menu a:hover {
    58     background-color: white; /* Light blue background on hover */
     59    background-color: white;
    5960    transition: background-color 0.3s ease;
    6061    border: 1px solid black;
     
    6263
    6364#menu img {
    64     max-width: 50px;                  /* Limit the width of images */
    65     margin-bottom: 5px;               /* Space between image and text */
     65    max-width: 50px;
     66    margin-bottom: 5px;
    6667}
     68#authButton{
     69    position: absolute;
     70    left: 1145px;
     71    top: 21px;
     72    width: 150px;
     73    color: white;
     74    background-color: red;
     75    padding: 10px;
     76    border: none;
     77    border-radius: 5px;
     78}
  • src/main/resources/static/css/adminNews.css

    r743de55 r43c9090  
    2727}
    2828.news-item{
    29     display: flex; /* Aligns image and text in a row */
    30     flex-direction: column; /* Change to 'row' for horizontal layout */
    31     width: 260px;
     29    display: flex;
     30    flex-direction: column;
     31    width: 420px;
    3232    align-items: center;
    3333    justify-content: center;
    3434    margin: 0 15px 10px 0;
    3535    padding: 20px;
    36     border: 1px solid #ddd; /* Optional: Adds a border */
     36    border: 1px solid #ddd;
    3737    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
    3838}
     39.news-item > *{
     40    text-align: left;
     41}
    3942img{
    40     width: 100%; /* Make image responsive */
    41     max-width: 400px; /* Set a maximum width for the image */
    42     height: auto; /* Maintain aspect ratio */
    43     border-radius: 10px; /* Optional: Adds rounded corners */
     43    width: 100%;
     44    max-width: 400px;
     45    height: auto;
     46    border-radius: 10px;
    4447    margin-bottom: 15px;
    4548}
     
    4750    font-size: 1.2rem;
    4851    line-height: 1.5;
    49     text-align: center; /* Center the text */
     52    text-align: center;
    5053    color: #333;
    5154    margin: 0;
     
    5356@media (max-width: 768px) {
    5457    .news-item {
    55         flex-direction: column; /* Stack elements on smaller screens */
     58        flex-direction: column;
    5659    }
    5760}
     
    98101}
    99102
    100 /* Style for the upload button */
    101103#open-popup {
    102104    padding: 10px 20px;
     
    110112
    111113#image-popup {
    112     width: 400px; /* Set a width for the modal */
     114    width: 400px;
    113115    background-color: white;
    114116    border-radius: 8px;
     
    126128}
    127129
    128 /* Image preview area */
    129130#image-preview {
    130131    margin-top: 10px;
     
    133134}
    134135
    135 /* Style for buttons inside the popup */
    136136#image-popup button {
    137137    padding: 8px 15px;
     
    147147
    148148#edit-button, #save-button {
    149     background-color: #17a2b8; /* Blueish color */
     149    background-color: #17a2b8;
    150150}
    151151
    152152
    153 /* Overlay */
    154153#overlay {
    155     background: rgba(0, 0, 0, 0.5); /* Semi-transparent background */
    156     z-index: 999; /* Ensure it is behind the modal but above everything else */
     154    background: rgba(0, 0, 0, 0.5);
     155    z-index: 999;
    157156}
    158157
    159 /* Button hover effects */
    160158#image-popup button:hover, #open-popup:hover {
    161159    opacity: 0.9;
    162160}
    163161
    164 
    165 
    166 /* Cancel button */
    167162#cancel-button {
    168     background-color: #dc3545; /* Red color */
     163    background-color: #dc3545;
    169164}
    170165
    171 
     166#authButton{
     167    position: absolute;
     168    left: 1145px;
     169    top: 21px;
     170    width: 150px;
     171    color: white;
     172    background-color: red;
     173    padding: 10px;
     174    border: none;
     175    border-radius: 5px;
     176}
  • src/main/resources/static/css/calendar.css

    r743de55 r43c9090  
    1 /* Modal background */
    21#confirmation-modal {
    3     display: none; /* Hidden by default */
    4     position: absolute; /* Fixed positioning to center it on the page */
    5     z-index: 1000; /* Sit on top */
     2    display: none;
     3    position: absolute;
     4    z-index: 1000;
    65    left: 38%;
    76    top: 40%;
    8     width: 400px; /* Full width */
    9     overflow: auto; /* Enable scroll if needed */
    10     background-color: #fff; /* White background for the content */
    11     border-radius: 8px; /* Rounded corners */
    12     box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* Subtle shadow for depth */
    13     text-align: center; /* Center align text */
     7    width: 400px;
     8    overflow: auto;
     9    background-color: #fff;
     10    border-radius: 8px;
     11    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
     12    text-align: center;
    1413}
    1514.model-content{
     
    2423}
    2524
    26 /* Buttons */
    2725button {
    28     background-color: #3498db; /* Primary button color */
     26    background-color: #3498db;
    2927    border: none;
    3028    color: #fff;
     
    3836
    3937button:hover {
    40     background-color: #2980b9; /* Darker shade for hover effect */
    41     transform: scale(1.05); /* Slight scale effect on hover */
     38    background-color: #2980b9;
     39    transform: scale(1.05);
    4240}
    4341
    4442button:active {
    45     background-color: #1f77e4; /* Even darker shade when active */
    46 }
    47 
    48 /* Cancel button with different color */
     43    background-color: #1f77e4;
     44}
     45
    4946#cancel-booking {
    50     background-color: #e74c3c; /* Different color for cancel button */
     47    background-color: #e74c3c;
    5148}
    5249
    5350#cancel-booking:hover {
    54     background-color: #c0392b; /* Darker shade for hover effect */
     51    background-color: #c0392b;
    5552}
    5653
     
    118115#right-side > *{
    119116    margin:10px;
     117}
     118#right-side{
     119    position: relative;
     120    top: 50px;
     121    padding: 16px;
     122}
     123#hourly-terms{
     124    display: flex;
     125    flex-wrap: wrap;
     126    gap: 10px;
     127}
     128#right-side > *{
     129    margin-bottom: 5px;
    120130}
    121131
     
    176186    position: relative;
    177187    overflow: hidden;
    178     /* transform: scale(1.25); */
    179188}
    180189
     
    232241    cursor: pointer;
    233242    animation: to-top 1s forwards;
    234     /* border-radius: 50%; */
    235243}
    236244
     
    239247}
    240248
    241 .calendar-days div:hover span {
    242     transition: width 0.2s ease-in-out, height 0.2s ease-in-out;
    243 }
    244249
    245250.calendar-days div span:nth-child(1),
     
    250255}
    251256
    252 .calendar-days div:hover span:nth-child(1),
    253 .calendar-days div:hover span:nth-child(3) {
    254     height: 100%;
    255 }
    256 
    257257.calendar-days div span:nth-child(1) {
    258258    bottom: 0;
     
    272272}
    273273
    274 .calendar-days div:hover span:nth-child(2),
    275 .calendar-days div:hover span:nth-child(4) {
    276     width: 100%;
    277 }
    278274
    279275.calendar-days div span:nth-child(2) {
     
    287283}
    288284
    289 .calendar-days div:hover span:nth-child(2) {
    290     transition-delay: 0.2s;
    291 }
    292 
    293 .calendar-days div:hover span:nth-child(3) {
    294     transition-delay: 0.4s;
    295 }
    296 
    297 .calendar-days div:hover span:nth-child(4) {
    298     transition-delay: 0.6s;
    299 }
    300 
    301 .calendar-days div.curr-date,
    302 .calendar-days div.curr-date:hover {
     285.curr-date{
    303286    background-color: var(--blue);
    304287    color: var(--white);
     
    391374    }
    392375}
    393 
    394 
    395 
    396 
     376#authButton{
     377    position: absolute;
     378    left: 1145px;
     379    top: 21px;
     380    width: 150px;
     381    color: white;
     382    background-color: red;
     383    padding: 10px;
     384    border: none;
     385    border-radius: 5px;
     386}
     387
     388
     389
  • src/main/resources/static/css/index.css

    r743de55 r43c9090  
    6666
    6767.dropdown-content {
    68     display: none; /* Hide dropdown by default */
    69     position: absolute; /* Position relative to the list item */
     68    display: none;
     69    position: absolute;
    7070    left: 0;
    71     top: 100%; /* Position below the list item */
    72     background-color: white; /* Background color of the dropdown */
    73     border: 1px solid #ddd; /* Border of the dropdown */
    74     padding: 10px; /* Padding inside the dropdown */
    75     box-shadow: 0 2px 5px rgba(0,0,0,0.1); /* Optional shadow for dropdown */
    76     width: 100%; /* Full width of the list item */
     71    top: 100%;
     72    background-color: white;
     73    border: 1px solid #ddd;
     74    padding: 10px;
     75    box-shadow: 0 2px 5px rgba(0,0,0,0.1);
     76    width: 100%;
    7777}
    7878.icon-search{
     
    9898    justify-content: center;
    9999    height: 350px;
    100     /*background-color: #F3F0E7;*/
    101100    background-color: #F7F7F5;
    102101}
     
    108107.items-register{
    109108    font-family: "Kumbh Sans", sans-serif;
     109    position: absolute;
     110    left: 900px;
    110111}
    111112.items-register p{
     
    117118}
    118119
    119 .items-register{
    120     display:flex;
     120.form-imp{
     121    display: flex;
    121122    flex-direction: column;
    122123    align-items: center;
    123     /*background-color: #F3F0E7;*/
    124 }
    125 
    126 .form-imp{
    127     display: flex;
    128     flex-direction: column;
    129     align-items: center;
    130124    width: auto;
    131125    padding: 10px;
    132126}
    133127input , button {
    134     border-radius: 5px; /* Adjust the value to make the corners more or less rounded */
    135     padding: 7px; /* Optional: adds padding inside the input */
    136     border: 1px solid #9D9D9D; /* Optional: adds a border around the input */
     128    border-radius: 5px;
     129    padding: 7px;
     130    border: 1px solid #9D9D9D;
    137131}
    138132button{
     
    140134    color:white;
    141135}
     136#personalised{
     137    font-size: xx-large;
     138    font-family: "Caveat", cursive;
     139}
    142140.white-part{
     141    display: flex;
     142    flex-direction: column;
    143143    background-color: white;
    144144    width: 415px;
    145145    border-radius: 5px;
    146     padding: 7px;
     146    padding: 20px;
     147}
     148a {
     149    text-decoration: none;
     150}
     151.logged-in{
     152    padding: 20px;
     153    font-family: "Kumbh Sans", sans-serif;
    147154}
    148155.split-title{
     
    179186    align-items: center;
    180187    background-color: #F7F7F5;
    181     /*background-color: #F3F0E7;*/
    182188}
    183189.part2 > div{
     
    187193}
    188194.part2 > div:first-child {
    189     justify-content: flex-end; /* Align the content to the right */
     195    justify-content: flex-end;
    190196}
    191197
     
    217223    background-color: transparent;
    218224    color: darkgreen;
    219     border: 2px solid darkgreen; /* Set the border color and make it bold */
    220     border-radius: 12px; /* Make the borders rounded */
    221     font-weight: bold; /* Make the text bold */
    222     padding: 10px 20px; /* Add some padding for better appearance */
    223     cursor: pointer; /* Change the cursor to a pointer when hovered */
    224     font-family: "Kumbh Sans", sans-serif; /* Match the font family */
    225     font-size: 16px; /* Adjust font size as needed */
     225    border: 2px solid darkgreen;
     226    border-radius: 12px;
     227    font-weight: bold;
     228    padding: 10px 20px;
     229    cursor: pointer;
     230    font-family: "Kumbh Sans", sans-serif;
     231    font-size: 16px;
    226232}
    227233
     
    248254}
    249255.icons li img:hover {
    250     background-color: white; /* Change background color on hover */
    251     border-color: darkslategrey; /* Change border color on hover */
     256    background-color: white;
     257    border-color: darkslategrey;
    252258}
    253259.footer-left p img{
     
    272278}
    273279
    274 
    275 /*login*/
    276 
    277280.popup {
    278     display: none; /* Hide the form */
    279     position: fixed; /* Position it relative to the viewport */
    280     z-index: 2; /* Ensure it appears above other content */
     281    display: none;
     282    position: fixed;
     283    z-index: 2;
    281284    left: 50%;
    282285    top: 50%;
    283     transform: translate(-50%, -50%); /* Center it horizontally and vertically */
    284     width: 500px; /* Set a fixed width for the form */
    285     padding: 25px; /* Add some padding */
    286     background-color: white; /* Background color of the form */
    287     box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); /* Add a shadow for better visibility */
    288     border-radius: 10px; /* Slightly round the corners */
    289 }
    290 
    291 /* Style the close button */
     286    transform: translate(-50%, -50%);
     287    width: 500px;
     288    height: auto;
     289    padding: 25px;
     290    background-color: white;
     291    box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
     292    border-radius: 10px;
     293    font-family: "Kumbh Sans", sans-serif;
     294}
     295
    292296.popup .close-btn {
    293297    position: absolute;
     
    297301    cursor: pointer;
    298302}
    299 
    300 /* Add some basic styling for the form content */
     303#submit-btn{
     304    width: 120px;
     305    background-color: #10B981;
     306}
     307#loginForm > div > h2{
     308    text-align: center;
     309}
     310
    301311.popup-content {
    302     display: flex; /* Use flexbox for layout */
    303     flex-direction: column; /* Stack children vertically */
    304     align-items: stretch; /* Ensure all elements take the full width */
    305     text-align: center; /* Center the content */
     312    padding: 20px;
     313    width: 100%;
     314    display: flex;
     315    flex-direction: column;
     316    align-items: stretch;
    306317}
    307318
    308319.popup-content h2 {
    309     margin-bottom: 20px; /* Add some space below the title */
     320    margin-bottom: 20px;
    310321}
    311322
    312323.popup-content label {
    313     display: block; /* Make the labels block elements */
    314     margin-bottom: 10px; /* Add some space below the labels */
    315     text-align: left; /* Align the text to the left */
     324    display: block;
     325    margin-bottom: 10px;
     326    text-align: left;
    316327}
    317328
    318329.popup-content input {
    319     width: 100%; /* Make the inputs take up the full width */
    320     padding: 8px; /* Add some padding inside the inputs */
    321     margin-bottom: 20px; /* Add space below the inputs */
    322     border: 1px solid #ccc; /* Light border around inputs */
    323     border-radius: 5px; /* Slightly round the input corners */
     330    width: 100%;
     331    padding: 8px;
     332    margin-bottom: 20px;
     333    border: 1px solid #ccc;
     334    border-radius: 5px;
    324335}
    325336
    326337.popup-content button {
    327     padding: 10px 20px; /* Add padding to the button */
    328     background-color: #007BFF; /* Button background color */
    329     color: white; /* Button text color */
    330     border: none; /* Remove the default border */
    331     border-radius: 5px; /* Round the button corners */
    332     cursor: pointer; /* Add a pointer cursor on hover */
     338    padding: 10px 20px;
     339    background-color: #007BFF;
     340    color: white;
     341    border: none;
     342    border-radius: 5px;
     343    cursor: pointer;
    333344}
    334345
    335346.popup-content button:hover {
    336     background-color: #0056b3; /* Darken the button on hover */
     347    background-color: #0056b3;
    337348}
    338349body.no-scroll {
     
    340351}
    341352.dataForms{
    342     display: flex; /* Use flexbox for layout */
    343     flex-direction: column; /* Stack children vertically */
    344     align-items: stretch; /* Ensure all elements take the full width */
    345     text-align: center; /* Center the content */
    346 }
     353    display: flex;
     354    flex-direction: column;
     355    align-items: stretch;
     356    text-align: center;
     357
     358}
     359#links{
     360    padding: 10px;
     361    display: flex;
     362    flex-direction: column;
     363    gap: 5px;
     364    color: darkgreen;
     365}
     366.logged-in{
     367    position: absolute;
     368    left: 900px;
     369    padding: 30px;
     370}
     371a img{
     372    transform: rotate(-90deg);
     373    height: 20px;
     374    margin-right: 10px;
     375}
     376#signInForm{
     377    height: 500px;
     378    width: 700px;
     379}
     380#signInForm > div > form{
     381    display: grid;
     382    grid-template-columns: repeat(2, 1fr);
     383    grid-template-rows: repeat(3, 1fr);
     384    gap: 10px;
     385}
     386#authButton{
     387    position: absolute;
     388    left: 1145px;
     389    top: 21px;
     390    width: 150px;
     391    color: white;
     392    background-color: red;
     393    padding: 10px;
     394    border: none;
     395    border-radius: 5px;
     396}
     397
     398#create{
     399    width: 200px;
     400    padding: 15px;
     401    background-color: #10B981;
     402    position: absolute;
     403    top: 80%;
     404    left: 50%;
     405    transform: translate(-50%, -50%);
     406    margin-top: 20px;
     407}
  • src/main/resources/static/css/terms.css

    r743de55 r43c9090  
    44body{
    55    font-family: var(--font-family);
     6    background-color: #f3f8fe;
    67}
    7 #outer-frame{
    8     background-color: #f3f8fe;
    9     width: 100%;
    10     height: 100vh;
    11 }
     8
    129#header{
    1310    display: flex;
     
    1613#menu{
    1714    display: flex;
     15    gap: 10px;
    1816}
    1917#menu *{
    20     padding: 8px;
     18    padding: 10px;
     19    background-color: #17a2b8;
     20    border: 0;
     21    border-radius: 5px;
     22    color: white;
    2123}
    2224table td,
     
    2426    padding: 10px;
    2527}
    26 table{
    27     /*margin: 0 auto;*/
    28     width: 920px;
    29 }
     28
    3029
    3130#popup {
     
    6766    color: #fff;
    6867}
     68
     69table{
     70    border-collapse: collapse;
     71    table-layout: fixed;
     72    width: max-content;
     73}
     74
     75th, td {
     76    width: fit-content;
     77    text-align: center;
     78    border: 1px solid #ddd;
     79    padding: 12px;
     80}
     81
     82th {
     83    background-color: lightslategray;
     84    color: #fff;
     85
     86}
     87#frame{
     88    display: flex;
     89    flex-direction: column;
     90    gap: 10px;
     91}
     92#requestsTableBody{
     93    background-color: #eeeded;
     94}
     95#authButton{
     96    position: absolute;
     97    left: 1145px;
     98    top: 21px;
     99    width: 150px;
     100    color: white;
     101    background-color: red;
     102    padding: 10px;
     103    border: none;
     104    border-radius: 5px;
     105}
  • src/main/resources/static/css/users-view.css

    r743de55 r43c9090  
    1 /* General reset */
     1
    22* {
    33    margin: 0;
     
    66}
    77
    8 /* Styling for the entire page */
    98body {
    109    font-family: Arial, sans-serif;
     
    2019}
    2120
    22 /* Frame that contains the whole content */
    2321#frame {
    2422    width: 80%;
     
    3028}
    3129
    32 /* Header section */
    3330#header-part {
    3431    display: flex;
     
    3936}
    4037
    41 /* Dropdown and labels styling */
    4238label {
    4339    font-weight: bold;
     
    6056}
    6157
    62 /* Main part: the table */
    6358#main-part {
    6459    margin-top: 20px;
     
    9691}
    9792
    98 /* For responsiveness */
    9993@media (max-width: 768px) {
    10094    #header-part {
     
    111105    display: none;
    112106}
    113 /*.news-item{*/
    114 /*    display: flex; !* Aligns image and text in a row *!*/
    115 /*    !*flex-direction: column; !* Change to 'row' for horizontal layout *!*!*/
    116 /*    width: 300px;*/
    117 /*    align-items: center;*/
    118 /*    justify-content: center;*/
    119 /*    max-width: 800px; !* Limit max width to prevent stretching *!*/
    120 /*    margin: 0 auto; !* Centers the container *!*/
    121 /*    padding: 20px;*/
    122 /*    border: 1px solid #ddd; !* Optional: Adds a border *!*/
    123 /*    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);*/
    124 /*}*/
    125 /*img{*/
    126 /*    width: 100%; !* Make image responsive *!*/
    127 /*    max-width: 400px; !* Set a maximum width for the image *!*/
    128 /*    height: auto; !* Maintain aspect ratio *!*/
    129 /*    border-radius: 10px; !* Optional: Adds rounded corners *!*/
    130 /*    margin-bottom: 15px;*/
    131 /*}*/
    132 /*p{*/
    133 /*    font-size: 1.2rem;*/
    134 /*    line-height: 1.5;*/
    135 /*    text-align: center; !* Center the text *!*/
    136 /*    color: #333;*/
    137 /*    margin: 0;*/
    138 /*}*/
    139 /*@media (max-width: 768px) {*/
    140 /*    .news-item {*/
    141 /*        flex-direction: column; !* Stack elements on smaller screens *!*/
    142 /*    }*/
    143 /*}*/
     107button{
     108    padding: 5px;
     109}
     110#authButton{
     111    position: absolute;
     112    left: 1280px;
     113    top: 21px;
     114    width: 127px;
     115    color: white;
     116    background-color: red;
     117    padding: 10px;
     118    border: none;
     119    border-radius: 5px;
     120}
  • src/main/resources/static/js/admin-terms.js

    r743de55 r43c9090  
    11import { deleteAppointment, confirmCarriedOut, getUsersByTermExcept, removeRequestAndUpdateUser, removeAppointment, makeReservation ,displayDiv} from './shared.js';
    22
     3let lastClickedItem=null;
    34let calendar = document.querySelector('.calendar')
    45let importantDate;
     
    109110    }));
    110111
    111     await fetch(`/api/appointments/create`, {
     112    const response=await fetch(`/api/appointments/create`, {
    112113        method: 'POST',
    113114        headers: {
    114115            'Content-Type': 'application/json',
    115116        },
    116         body: JSON.stringify(requestBody) // Send all appointments in one request
     117        body: JSON.stringify(requestBody)
    117118    });
     119    if(response.ok){
     120        location.reload();
     121    }
     122
    118123}
    119124document.getElementById('create-appointments').addEventListener('click', async function () {
     
    124129    const interval = parseInt(document.getElementById('time-interval').value);
    125130
    126     if (!startDate || !endDate || !startTime || !endTime || !interval) {
     131    if (!startDate || !endDate || !startTime || !endTime || isNaN(interval)) {
    127132        alert("Please fill out all the fields.");
    128133        return;
     
    142147            const existingTimes = existingMapped.get(date);
    143148            if (checkOverlap(existingTimes, time)) {
    144                 conflictingAppointments.push(newAppointment);  // Add to conflict list if overlaps
     149                conflictingAppointments.push(newAppointment);
    145150            } else {
    146151                successfulAppointments.push(newAppointment);
     
    240245        requestedRow.appendChild(couponCodeTd);
    241246        requestedElement.appendChild(requestedRow);
    242         displayDiv(dateTime);
    243247    })
     248    displayDiv(dateTime);
    244249}
    245250function getAllRequests(dateTime,containerId){
     
    277282
    278283        itemDiv.addEventListener('click', async () => {
     284            document.getElementById("summary").style.display='none';
    279285            try{
    280 
     286                if(lastClickedItem){
     287                    lastClickedItem.style.backgroundColor="#f9f9f9";
     288                }
     289                lastClickedItem=itemDiv;
     290                itemDiv.style.backgroundColor="grey";
    281291                const isReserved=await isAppointmentReserved(item.localDateTime);
    282292                const isEmpty=await isAppointmentEmpty(item.localDateTime);
     
    285295                cleanData("requested")
    286296                if (isReserved) {
     297                    document.getElementById("summary").style.display='block';
    287298                    document.getElementById("approved-table").style.display = 'block';
    288299                    document.getElementById("requested-table").style.display = 'none';
     
    292303                    deleteBtn.setAttribute("term",item.localDateTime);
    293304                    deleteBtn.setAttribute("type","cancelledAppointmentByAdmin");
    294                     //da go isprogramirash delete-approval
    295305                    document.getElementById("delete-approval").addEventListener('click', function() {
    296306                        removeAppointment(item.localDateTime,"cancelledAppointmentByAdmin");
     
    307317                }
    308318                else if(!isEmpty){
     319                    document.getElementById("summary").style.display='block';
    309320                    document.getElementById("approved-table").style.display = 'none';
    310321                    document.getElementById("requested-table").style.display = 'block';
     
    316327                }
    317328                else{
     329                    document.getElementById("summary").style.display='none';
    318330                    document.getElementById("approved-table").style.display = 'none';
    319331                    document.getElementById("requested-table").style.display = 'none';
     
    365377    let currDate = new Date()
    366378
    367     // if (!month) month = currDate.getMonth()
    368379    console.log(month);
    369380    if (typeof month !== 'number') month = currDate.getMonth();
     
    374385    calendar_header_year.innerHTML = year
    375386
    376     // get first day of month
    377387
    378388    let first_day = new Date(year, month, 1)
     
    395405            }
    396406            day.addEventListener('click', () => {
     407                document.getElementById("summary").style.display='none';
    397408                let temp=document.getElementsByClassName('curr-date');
    398409                Array.from(temp).forEach(element => {
     
    458469    const otherPickersInterval = 30;
    459470
    460     for (let hour = 7; hour < 22; hour++) { // 0 to 23 for 24-hour format
     471    for (let hour = 7; hour < 22; hour++) {
    461472        for (let minutes = 0; minutes < 60; minutes++) {
    462473            const formattedHour = hour.toString().padStart(2, '0');
     
    504515        .then(data => {
    505516            console.log(data.message);
     517            location.reload();
    506518        })
    507519        .catch(error => {
     
    525537        if (response.ok) {
    526538            alert("Free appointments for the selected date range were deleted.");
     539            location.reload();
    527540        } else {
    528541            alert("An error occurred while trying to delete the appointments.");
  • src/main/resources/static/js/adminNewsCoupons.js

    r743de55 r43c9090  
    66let selectedImage;
    77let questionable;
     8let helper;
    89
    910let pageType;
     
    3839                    imagePreview.style.display='inline';
    3940                    imagePreview.innerHTML = `<img src="${e.target.result}" style="width: 100%; height: auto;">`;
    40                     selectedImage =e.target.result ; // Store the selected file
     41                    selectedImage =e.target.result ;
    4142
    4243                    console.log(selectedImage);
     
    300301        document.getElementById('text').value = param2;
    301302        let importantValue=newsItem.querySelector('img').getAttribute("data-attribute");
     303        selectedImage=importantValue;
    302304        document.getElementById('main-image').innerHTML=`<img src="${importantValue}" style="width: 20%; height: 20%;">`;
    303305    }
  • src/main/resources/static/js/authentication-shared.js

    r743de55 r43c9090  
    99
    1010function phoneCheck(phone){
    11     const phonePattern = /^07\d-\d{3}-\d{3}$/;
     11    const phonePattern = /^07\d\d{3}\d{3}$/;
    1212    if (!phonePattern.test(phone)) {
    1313        return false;
     
    3232    return regex.test(password);
    3333}
    34 export async function verificationCheck(userData) {
     34export async function verificationCheck(userData,condition) {
    3535    if (!usernameCheck(userData.username)) {
    3636        alert("Invalid username");
     
    5656        }
    5757    }
    58     const response = await fetch(`/api/users/checkDifferentUser`, {
    59         method: "POST",
    60         headers: {
    61             'Content-Type': 'application/json'
    62         },
    63         body: JSON.stringify(userData)
    64     });
    65     if (response.ok) {
    66         return true;
    67     } else {
    68         return false;
     58    if(condition!==false){
     59        const response = await fetch(`/api/users/checkDifferentUser`, {
     60            method: "POST",
     61            headers: {
     62                'Content-Type': 'application/json'
     63            },
     64            body: JSON.stringify(userData)
     65        });
     66        if (response.ok) {
     67            return true;
     68        } else {
     69            return false;
     70        }
    6971    }
    70 
     72    return true;
    7173}
  • src/main/resources/static/js/calendar.js

    r743de55 r43c9090  
     1let lastClickedItem=null;
    12let calendar = document.querySelector('.calendar')
    23
     
    1920        document.getElementById("last-check").innerHTML=window.selectedTime;
    2021        showModal();
     22        document.getElementById("coupon-type").selectedIndex=0;
     23        document.getElementById("medical-condition").innerHTML='';
     24
    2125    }
    2226
     
    7175function displayFreeAppointments(appointments) {
    7276    const container = document.getElementById('hourly-terms');
    73     container.innerHTML = ''; // Clear previous appointments
     77    container.innerHTML = '';
    7478
    7579    appointments.forEach(appointment => {
     
    8892
    8993        appointmentDiv.textContent = formattedTime;
    90         appointmentDiv.dataset.time = formattedDate+" "+formattedTime; // Store full date-time
     94        appointmentDiv.dataset.time = formattedDate+" "+formattedTime;
    9195
    9296        appointmentDiv.addEventListener('click', () => {
     97            if(lastClickedItem){
     98                lastClickedItem.style.backgroundColor="white";
     99            }
     100            lastClickedItem=appointmentDiv;
     101            lastClickedItem.style.backgroundColor="grey";
    93102            window.selectedTime = appointmentDiv.dataset.time;
    94103            document.getElementById('book-button').disabled = false;
     
    109118
    110119    let currDate = new Date()
    111     if (!month) month = currDate.getMonth()
     120
     121    if (typeof month !== 'number') month = currDate.getMonth();
    112122    if (!year) year = currDate.getFullYear()
    113123
     
    129139                            <span></span>`;
    130140            let selectedDate = `${year}-${(month + 1).toString().padStart(2, '0')}-${(i - first_day.getDay() + 1).toString().padStart(2, '0')}`;
    131             day.addEventListener('click', () => fetchFreeOrPendingAppointments(selectedDate));
     141            day.addEventListener('click', () => {
     142                let temp=document.getElementsByClassName('curr-date');
     143                Array.from(temp).forEach(element => {
     144                    element.classList.remove('curr-date');
     145                });
     146                day.classList.add('curr-date');
     147                document.getElementById("coupon-type").selectedIndex=0;
     148                document.getElementById("medical-condition").value='';
     149                fetchFreeOrPendingAppointments(selectedDate);
     150            })
    132151
    133152            if (i - first_day.getDay() + 1 === currDate.getDate() && year === currDate.getFullYear() && month === currDate.getMonth()) {
     
    176195
    177196
    178 
     197window.onload = async function () {
     198temp=document.getElementById("coupon-type");
     199    try{
     200        const response = await fetch(`/api/coupons/getCouponNames`);
     201        if (response.ok) {
     202            const couponNames = await response.json();
     203            console.log("Coupons:", couponNames);
     204
     205            couponNames.forEach(coupon => {
     206                const option = document.createElement("option");
     207                option.value = coupon;
     208                option.textContent = coupon;
     209                temp.appendChild(option);
     210            });
     211        } else {
     212            console.log(response.statusText);
     213        }
     214    }
     215    catch(error){
     216        console.error("Error fetching coupons:", error);
     217    }
     218
     219};
  • src/main/resources/static/js/editUser.js

    r743de55 r43c9090  
    33import { verificationCheck } from './authentication-shared.js';
    44
    5 let loggedPerson;
     5let loggedPerson,checkDifferent;
    66const modal = document.getElementById('popupModal');
    77const cancelBtn = document.getElementById('cancelBtn');
     
    7171        counter= user.carriedOut.length;
    7272    }
    73     console.log(counter);
    7473    return counter;
    7574}
     
    122121            buttonCell.appendChild(button1);
    123122            button2.textContent = "Потврди одржан";
    124             button2.addEventListener('click',()=>
    125                 function(){
     123            buttonCell.appendChild(button2);
     124            button2.addEventListener('click',()=> {
    126125                modal.style.display='flex';
    127                 approveBtn.addEventListener('click', () => {
    128                     const userInput = document.getElementById('userInput').value;
    129                     confirmCarriedOut(request.term,userInput);
    130                     modal.style.display = 'none'; // Close the modal after approval
    131                 });
     126                document.getElementById("userInput").disabled=false;
    132127            });
    133             buttonCell.appendChild(button2);
     128            approveBtn.addEventListener('click', () => {
     129                const userInput = document.getElementById('userInput').value;
     130                confirmCarriedOut(request.term,userInput);
     131                modal.style.display = 'none';
     132            });
     133
    134134        }
    135135
     
    146146    if(selectedValue==="requests"){
    147147        url=`/api/requests/listAll?username=${loggedPerson.username}`;
    148         tHeadArray=["Термин", "Опции"];
     148        tHeadArray=["Термин","Медицинска состојба","Опции"];
    149149        createHeader(tHeadArray);
    150150        getAll(url);
     
    153153        let testTemp="RESERVED";
    154154        url=`/api/appointments/listAll?username=${loggedPerson.username}&status=${testTemp}`;
    155         tHeadArray=["Термин", "Опции"];
     155        tHeadArray=["Термин","Медицинска состојба", "Опции"];
    156156        createHeader(tHeadArray);
    157157        getAll(url);
     
    230230        .catch(error => {
    231231            console.error('Error fetching user data:', error);
    232             return { name: '', surname: '' };  // return empty values on error
     232            return { name: '', surname: '' };
    233233        });
    234234}
     
    267267        if (cookieUsername) {
    268268            fetchUserData(cookieUsername,"USER").then(userData => {
    269                 const fullName = `${userData.name} ${userData.surname}`;
    270                 document.getElementById('cookie-name').innerHTML = fullName;
     269            console.log("success")
    271270            });
    272         } else {
    273             document.getElementById('cookie-name').textContent = 'Default Name';
    274271        }
    275272    }
     
    277274function saveProfileChanges() {
    278275    const userName = document.querySelector('input[name="username"]').value;
    279     console.log(userName);
     276    const phoneNum=document.querySelector('input[name="phone"]').value.replace(/-/g,"")
     277    console.log(phoneNum);
    280278    const updatedData = {
    281279        username: userName,
    282280        name: document.querySelector('input[name="firstName"]').value,
    283281        surname: document.querySelector('input[name="lastName"]').value,
    284         phone: document.querySelector('input[name="phone"]').value,
     282        phone: phoneNum,
    285283        age: document.querySelector('input[name="age"]').value
    286284    };
    287     if(!verificationCheck(updatedData)){
     285    if(!verificationCheck(updatedData,checkDifferent)){
    288286        return;
    289287    }
     
    299297        .then(data => {
    300298            alert('Profile updated successfully!');
    301             toggleEditing(false); // Disable fields after saving changes
     299            toggleEditing(false);
    302300            updateCookieUsername(userName);
    303301        })
     
    313311    };
    314312}
     313function removeOptions(){
     314    if(getRoleFromCookie()!=="ADMIN"){
     315        let temp=this;
     316        temp.removeChild(document.getElementById("requests"));
     317        temp.removeChild(document.getElementById("appointments"))
     318    }
     319}
    315320
    316321function toggleEditing(isEnabled) {
     
    322327
    323328window.onload = function(){
     329    checkDifferent=true;
    324330    updateProfile();
    325331    toggleEditing(false);
    326332    document.getElementById('edit-profile').addEventListener('click', function() {
    327333       const role=getQueryParams();
    328        if(role.param1 ==='ADMIN')
    329         toggleEditing(true);
     334       if(role.param1 ==='ADMIN'){
     335           toggleEditing(true);
     336           checkDifferent=false;
     337       }
     338
    330339    });
    331340    document.getElementById('saveChanges').addEventListener('click', saveProfileChanges);
    332341    document.getElementById("statusDropdown").addEventListener('change',createRowsBasedOnType);
    333 
    334 }
     342    document.getElementById("statusDropdown").addEventListener('click',removeOptions);
     343}
  • src/main/resources/static/js/index.js

    r743de55 r43c9090  
    11import { verificationCheck } from "./authentication-shared.js";
    2 
    32function toggleForm(formId, show) {
    43        const form = document.getElementById(formId);
     
    6059                });
    6160            }
     61            else{
     62                alert("Sign in successfull! Now log in!")
     63            }
    6264            return response.json();
    6365        })
    6466        .then(data => {
    65             console.log(data.message); // Handle success message
     67            console.log(data.message);
    6668        })
    6769        .catch(error => {
     
    9799            console.log('Parsed data:', data);
    98100            if (data.success) {
    99                 const name=data.name;
    100                 const surname=data.surname;
    101                 const personalisedSection=document.getElementById("personalised");
    102                 personalisedSection.innerHTML=`Добредојде, ${name} ${surname}!`;
    103101                updateUIBasedOnRole(data.userRole);
    104102            }
     
    108106        })
    109107        .finally(() => {
    110             // Close the form after handling the response
    111108            toggleForm('loginForm', false);
    112109        });
  • src/main/resources/static/js/shared.js

    r743de55 r43c9090  
    2121            if (!response.ok) {
    2222                throw new Error('Failed to delete the appointment');
     23            }
     24            else{
     25                location.reload();
    2326            }
    2427        })
     
    4750
    4851            if (updateResponse.ok) {
     52                location.reload();
    4953                console.log(`User updated successfully in carried_out`);
    5054            } else {
     
    136140
    137141            }
     142            location.reload();
    138143
    139144        } else {
     
    149154        if (response.ok) {
    150155            console.log('Appointment added successfully.');
     156            location.reload();
    151157        } else {
    152158            const text = await response.text();
     
    160166export function displayDiv(dateTime,username){
    161167    if (typeof username !== 'undefined'){
    162         makeReservation(dateTime,username);
     168        makeReservation(dateTime, username);
    163169    }
    164170    else{
    165         const inputValue = document.getElementById("username-approval");
    166         const approvedUser = inputValue.value;
    167         document.getElementById("confirm-approval").addEventListener('click',makeReservation(dateTime,approvedUser));
     171        let temp=document.getElementById("confirm-approval");
     172        temp.addEventListener('click',()=>{
     173            const approvedUser = document.getElementById("username-approval").value;
     174            makeReservation(dateTime,approvedUser)
     175        });
    168176    }
    169177}
  • src/main/resources/static/js/terms.js

    r743de55 r43c9090  
    5050    dialog.setAttribute("id","dialogPopUp");
    5151    const message = document.createElement('p');
    52     message.textContent = 'Are you sure you want to cancel the reservation?';
     52    message.textContent = 'Дали сте сигурни дека сакате да откажете?';
    5353    dialog.appendChild(message);
    5454    const yesButton = document.createElement('button');
     
    107107        row.appendChild(termCell);
    108108        const nameCell = document.createElement('td');
    109         nameCell.textContent = request.name; // Format date
     109        nameCell.textContent = request.name;
    110110        row.appendChild(nameCell);
    111111        const surnameCell = document.createElement('td');
    112         surnameCell.textContent = request.surname; // Format date
     112        surnameCell.textContent = request.surname;
    113113        row.appendChild(surnameCell);
    114114        const couponCodeCell = document.createElement('td');
     
    119119        row.appendChild(additionalInfoCell);
    120120        const usernameCell = document.createElement('td');
    121         usernameCell.textContent = request.username; // Format date
     121        usernameCell.textContent = request.username;
    122122        row.appendChild(usernameCell);
    123123        const buttonCell = document.createElement('td');
     
    139139    const oldHead = document.getElementById('initial-head');
    140140    if (thead) {
    141         console.log("cleaned")
    142141        thead.innerHTML = '';
    143142    }
     
    165164        const row = document.createElement('tr');
    166165        const termCell = document.createElement('td');
    167         termCell.textContent = replaceWithSpace(request.dateTime); // Format date
     166        termCell.textContent = replaceWithSpace(request.dateTime);
    168167        row.appendChild(termCell);
    169168        const userCell = document.createElement('td');
     
    171170        row.appendChild(userCell);
    172171        const adminCell = document.createElement('td');
    173         adminCell.textContent = request.adminNote; // Format date
     172        adminCell.textContent = request.adminNote;
    174173        row.appendChild(adminCell);
    175174        const statusCell = document.createElement('td');
  • src/main/resources/static/js/users-view.js

    r743de55 r43c9090  
    1212}
    1313function calculateAge(dateBirth){
    14     console.log(dateBirth);
    1514    const [year, month, day] = dateBirth.split('-').map(Number);
    1615    const birthDate = new Date(year, month - 1, day);
     
    5554        button.addEventListener('click',()=>{
    5655            let temp=user.username;
    57             console.log(temp);
    5856                const params = new URLSearchParams({ param1: 'ADMIN', param2: temp }).toString();
    5957                window.location.href = `editUser.html?${params}`;
     
    9088   document.getElementById("search-input-container").style.display = 'none';
    9189    const selectedValue = event.currentTarget.value;
    92     console.log(selectedValue);
    9390    if(selectedValue!=='defaultValue')
    9491    filterUsers("status",selectedValue).then(r => console.log(r));
     
    9895    setInitialSelectValue(userStatusElement);
    9996    const dataCheck = event.currentTarget.value;
    100     console.log(dataCheck);
    10197    updateSearchInputVisibility(dataCheck);
    10298
    10399    document.getElementById("search-button").addEventListener('click',function (){
    104100        let filterTemp=document.getElementById("search-input");
    105         console.log(filterTemp.value);
    106101        filterUsers(dataCheck,filterTemp.value).then(r => console.log(r));
    107102        filterTemp.value='';
  • src/main/resources/templates/html/admin-terms.html

    r743de55 r43c9090  
    88    Calendar
    99  </title>
     10  <script src="/js/cookie.js" defer></script>
    1011  <link rel="stylesheet" href="/css/admin-terms.css">
    1112</head>
    1213<body class="light">
     14<button id="authButton" style="display: none;"></button>
    1315<div id="content">
    1416  <h1>Преглед и менаџирање со термини</h1>
     17  <h3>Со клик врз датумот од календарот добивате преглед за термините</h3>
    1518  <div id="left-side">
    1619    <div id="calendar-main">
     
    8386  <div id="right-side">
    8487    <div id="active">
    85       <p>Тековни термини за ден <span id="insert-date"></span></p>
     88      <h3>Тековни термини за ден <span id="insert-date"></span></h3> <p>(доколку постои термин, со клик врз време, се добиваат информации и овозоможува менаџирање со термин)</p>
    8689      <div id="frame"></div>
     90      <button id="temporal-deletion" style="display: none;">Целосно бришење термин</button>
    8791    </div>
    88     <div id="summary">
     92    <div id="summary" style="display: none;">
    8993      <table id="requested-table" style="display: none;">
    90         <thead><th>Предложени</th></thead><tbody id="requested"></tbody>
     94        <thead><tr><th>Предложени</th></tr></thead><tbody id="requested"></tbody>
    9195      </table>
    9296      <table id="approved-table" style="display: none;">
    93         <thead><th>Одобрени</th></thead><tbody id="approved"></tbody>
     97        <thead><tr><th>Одобрени</th></tr></thead><tbody id="approved"></tbody>
    9498      </table>
    9599      <div id="request-assets" style="display: none;">
     
    113117        </div>
    114118      </div>
    115       <button id="temporal-deletion" style="display: none;">Целосно бришење термин</button>
    116119    </div>
    117120  </div>
  • src/main/resources/templates/html/admin.html

    r743de55 r43c9090  
    88    <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&display=swap" rel="stylesheet">
    99    <link rel="stylesheet" href="/css/admin.css">
     10    <script src="/js/cookie.js" defer></script>
    1011</head>
    1112<body>
     13<button id="authButton" style="display: none;"></button>
    1214<img id="second-image" src="/images/physiotherapy.jpg">
    1315<div id="frame">
  • src/main/resources/templates/html/adminCoupons.html

    r743de55 r43c9090  
    44  <meta charset="UTF-8">
    55  <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6  <script src="/js/cookie.js" defer></script>
    67  <link rel="stylesheet" href="/css/adminNews.css">
    78</head>
    89<body data-page="coupons">
     10<button id="authButton" style="display: none;"></button>
    911<h2>Купони...</h2>
    1012<div class="coupons-container">
  • src/main/resources/templates/html/adminNews.html

    r743de55 r43c9090  
    44  <meta charset="UTF-8">
    55  <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6  <script src="/js/cookie.js" defer></script>
    67  <link rel="stylesheet" href="/css/adminNews.css">
    78</head>
    89<body data-page="events">
     10<button id="authButton" style="display: none;"></button>
    911<h2>Настани, новости...</h2>
    1012<div class="news-container">
  • src/main/resources/templates/html/calendar.html

    r743de55 r43c9090  
    88        Calendar
    99    </title>
     10    <script src="/js/cookie.js" defer></script>
    1011    <link rel="stylesheet" href="/css/calendar.css">
    1112</head>
    1213<body class="light">
     14<button id="authButton" style="display: none;"></button>
    1315<div id="content">
    1416    <div id="personal-info">
    1517        <img id="admin-photo" src="/images/chicho-round.png">
    1618        <div id="first-box" class="white-space">
    17             <a><img src="/images/down.png">Кориснички профил</a>
    18             <a><img src="/images/down.png">Мои термини</a>
     19            <a href="editUser.html"><img src="/images/down.png">Кориснички профил</a>
     20            <a href="terms.html"><img src="/images/down.png">Мои термини</a>
    1921        </div>
    2022    </div>
     
    5557        </div>
    5658        <div id="right-side">
    57             <div id="hourly-terms">
    58 
    59             </div>
    6059            <div>
    61                 <label>Код на купон:</label><input id="coupon-type" type="text">
     60                <label>Код на купон:</label>
     61                <select id="coupon-type">
     62                    <option></option>
     63                </select>
    6264            </div>
    6365            <div>
    6466                <label>Медицинска состојба:</label> <input id="medical-condition" type="text">
    6567            </div>
     68            <div id="hourly-terms"></div>
    6669            <button id="book-button" disabled>Закажи</button>
    6770        </div>
  • src/main/resources/templates/html/coupons.html

    r743de55 r43c9090  
    1313        }
    1414    </style>
     15    <script src="/js/cookie.js" defer></script>
    1516</head>
    1617<body>
    17 
     18<button id="authButton" style="display: none;"></button>
    1819<table>
    1920
  • src/main/resources/templates/html/editUser.html

    r743de55 r43c9090  
    44    <meta charset="UTF-8">
    55    <title>Title</title>
     6    <link rel="stylesheet" href="/css/editUser.css">
     7    <script src="/js/cookie.js" defer></script>
    68</head>
    79<body>
    8 <div id="user-info" style="display: none;">
    9     <img/>
    10     <h1>Здраво <span id="cookie-name">име</span></h1>
    11     <h2>Ова е твојата профилна страница. Тука имаш преглед кон твоите лични податоци, а воедно можеш и да ги модифицираш</h2>
    12 </div>
    13 <button id="edit-profile">Измени профил</button>
    14 <div>
    15     <p>Информации за корисникот</p>
    16     <div>
    17         <p>Корисничко име</p>
    18         <input type="text" name="username" id="usernameSignIn"/>
     10<button id="authButton" style="display: none;"></button>
     11<h2>Информации за корисникот</h2>
     12<div id="content">
     13    <div id="main-part">
     14            <div id="container">
     15                <div id="left-side">
     16                    <div>
     17                        <p>Корисничко име</p>
     18                        <input type="text" name="username" id="usernameSignIn"/>
     19                    </div>
     20                    <div>
     21                        <p>Име</p>
     22                        <input type="text" id="name" name="firstName"/>
     23                    </div>
     24                    <div>
     25                        <p>Презиме</p>
     26                        <input type="text" id="surname" name="lastName"/>
     27                    </div>
     28                    <div>
     29                        <p>Година на раѓање</p>
     30                        <input type="date" id="age" name="age"/>
     31                    </div>
     32                </div>
     33                <div id="right-side">
     34                    <div>
     35                        <p>Телефон</p>
     36                        <input type="tel" id="phone" placeholder="07_-___-___" name="phone"/>
     37                    </div>
     38                    <button id="block-account" style="display: none;">Блокирај к.сметка</button>
     39                    <button id="edit-profile">Измени профил</button>
     40                    <button id="saveChanges">Зачувај</button>
     41                </div>
     42            </div>
     43        <div id="adminInfo-block" style="display: none;">
     44            <table id="stat-table">
     45                <thead>
     46                <tr>
     47                    <th>Состојба на термин</th>
     48                    <th>Број</th>
     49                </tr>
     50                </thead>
     51                <tbody>
     52                <tr>
     53                    <td>Одржани термини</td>
     54                    <td><span id="carried-out"></span></td>
     55                </tr>
     56                <tr>
     57                    <td>Одбиени предлози</td>
     58                    <td><span id="rejected"></span></td>
     59                </tr>
     60                <tr>
     61                    <td>Откажани предлози</td>
     62                    <td><span id="cancelledReqByUser"></span></td>
     63                </tr>
     64                <tr>
     65                    <td>Откажани термини(корисник)</td>
     66                    <td><span id="cancelledAppByUser"></span></td>
     67                </tr>
     68                <tr>
     69                    <td>Откажани термини(админ)</td>
     70                    <td><span id="cancelledAppByAdmin"></span></td>
     71                </tr>
     72                </tbody>
     73            </table>
     74        </div>
    1975    </div>
    20     <div>
    21         <p>Име</p>
    22         <input type="text" id="name" name="firstName"/>
    23     </div>
    24     <div>
    25         <p>Презиме</p>
    26         <input type="text" id="surname" name="lastName"/>
    27     </div>
    28     <div>
    29         <p>Телефон</p>
    30         <input type="tel" id="phone" placeholder="07_-___-___" name="phone"/>
    31     </div>
    32     <div>
    33         <p>Година на раѓање</p>
    34         <input type="date" id="age" name="age"/>
     76    <div id="table-part">
     77        <p>Информации за термини на корисникот</p>
     78        <select id="statusDropdown">
     79            <option value=""></option>
     80            <option value="requests" id="requests">Предложени термини</option>
     81            <option value="appointments" id="appointments">Прифатени термини</option>
     82            <option value="not-completed" id="not-completed">Неодржани термини</option>
     83            <option value="completed" id="completed">Одржени термини</option>
     84        </select>
     85        <table id="additional-table">
     86            <thead id="active-tableHead"></thead>
     87            <tbody id="active-table"></tbody>
     88        </table>
    3589    </div>
    3690</div>
    37 <button id="saveChanges">Зачувај</button>
    38 <p id="paramsDisplay"></p>
    39 <select id="statusDropdown">
    40     <option value=""></option>
    41     <option value="requests" id="requests">Предложени термини</option>
    42     <option value="appointments" id="appointments">Прифатени термини</option>
    43     <option value="not-completed" id="not-completed">Неодржани термини</option>
    44     <option value="completed" id="completed">Одржени термини</option>
    45 </select>
    46 <table>
    47     <thead id="active-tableHead"></thead>
    48     <tbody id="active-table"></tbody>
    49 </table>
    50 <div id="adminInfo-block" style="display: none;">
    51     <p>Број на одржани термини <span id="carried-out"></span></p>
    52     <p>Број на одбиени предлози за термин <span id="rejected"></span></p>
    53     <p>Број на откажани предлози за термин <span id="cancelledReqByUser"></span></p>
    54     <p>Број на откажани термини(корисник) <span id="cancelledAppByUser"></span></p>
    55     <p>Број на откажани термини(админ) <span id="cancelledAppByAdmin"></span></p>
    56 </div>
     91
    5792<div id="popupModal" class="modal" style="display: none;">
    5893    <div class="modal-content">
    5994        <span class="close">&times;</span>
    6095        <h2>Enter Your Details</h2>
    61         <input type="text" id="userInput" placeholder="Enter something...">
     96        <input type="text" id="userInput" required>
    6297        <div class="buttons">
    6398            <button id="cancelBtn">Cancel</button>
     
    66101    </div>
    67102</div>
    68 <button id="block-account" style="display: none;">Блокирај к.сметка</button>
     103
    69104<script type="module" src="/js/editUser.js"></script>
    70105</body>
  • src/main/resources/templates/html/index.html

    r743de55 r43c9090  
    1414  <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Dancing+Script:wght@400..700&family=Kumbh+Sans:wght@100..900&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&family=Libre+Bodoni:ital,wght@0,400..700;1,400..700&display=swap" rel="stylesheet">
    1515  <link rel="stylesheet" href="/css/index.css">
     16  <script src="/js/cookie.js" defer></script>
    1617</head>
    1718<body>
     
    5758    </nav>
    5859  </div>
     60  <button id="authButton" style="display: none;"></button>
    5961</header>
    60 
    61 
    6262<div class="main-content">
    6363  <div class="title">Енергијата зборува <span class="split-title">погласно од зборовите...</span></div>
     
    8080    <div class="white-part">
    8181      <p id="personalised"></p>
    82       <a href="calendar.html">Закажи термин</a>
    83       <a href="terms.html">Мои термини</a>
    84       <a href="editUser.html">Кориснички профил</a>
     82      <div id="links">
     83      <a href="calendar.html"><img src="/images/down.png">Закажи термин</a>
     84      <a href="terms.html"><img src="/images/down.png"> Мои термини</a>
     85      <a href="editUser.html"><img src="/images/down.png"> Кориснички профил</a>
     86      <a href="userInfo.html"><img src="/images/down.png"> Новости и купони</a>
     87      </div>
    8588    </div>
    8689  </div>
     
    153156        <label for="password">Лозинка:</label>
    154157        <input type="password" id="password" name="password" required>
    155         <button type="submit">Логирање</button>
     158        <button id="submit-btn" type="submit">Логирање</button>
    156159      </form>
    157160    </div>
     
    163166      <h2>Креирајте корисничка сметка</h2>
    164167      <form class="dataForms" method="post">
    165         <label for="name">Име:</label>
    166         <input type="name" id="name" name="name" required>
    167         <label for="surname">Презиме:</label>
    168         <input type="surname" id="surname" name="surname" required>
    169         <label for="phone">Телефон:</label>
    170         <input type="tel" id="phone" name="phone" placeholder="07_-___-___" required>
    171         <label for="age">Датум на раѓање:</label>
    172         <input type="date" id="age" name="age" required>
    173         <label for="usernameSignIn">Корисничко име:</label>
    174         <input type="username" id="usernameSignIn" name="username" required>
    175         <label for="passwordSignIn">Лозинка:</label>
    176         <input type="password" id="passwordSignIn" name="password" required>
    177         <button type="submit">Креирај</button>
     168        <div>
     169          <label for="name">Име:</label>
     170          <input type="name" id="name" name="name" required>
     171        </div>
     172        <div>
     173          <label for="surname">Презиме:</label>
     174          <input type="surname" id="surname" name="surname" required>
     175        </div>
     176        <div>
     177          <label for="phone">Телефон:</label>
     178          <input type="tel" id="phone" name="phone" placeholder="07_-___-___" required>
     179        </div>
     180        <div>
     181          <label for="age">Датум на раѓање:</label>
     182          <input type="date" id="age" name="age" required>
     183        </div>
     184        <div>
     185          <label for="usernameSignIn">Корисничко име:</label>
     186          <input type="username" id="usernameSignIn" name="username" required>
     187        </div>
     188        <div>
     189          <label for="passwordSignIn">Лозинка:</label>
     190          <input type="password" id="passwordSignIn" name="password" required>
     191        </div>
    178192      </form>
     193      <button id="create" type="submit">Креирај</button>
    179194    </div>
    180195  </div>
  • src/main/resources/templates/html/terms.html

    r743de55 r43c9090  
    55    <title>Title</title>
    66    <link rel="stylesheet" href="/css/terms.css">
     7    <script src="/js/cookie.js" defer></script>
    78</head>
    89<body>
    9 <div id="outer-frame">
     10<button id="authButton" style="display: none;"></button>
    1011    <div id="frame">
    1112        <div id="header">
    12             <div>Резервации</div>
    13             <div>
    14                 <button>Кориснички профил</button>
    15                 <button>Закажи термин</button>
    16             </div>
     13            <h2>Резервации</h2>
    1714        </div>
    1815
     
    2522
    2623        <table>
    27             <thead id="table-head">
    28             <tr id="initial-head">
    29 <!--                <th>Термин</th>-->
    30 <!--                <th>Име</th>-->
    31 <!--                <th>Презиме</th>-->
    32 <!--                <th>Купон</th>-->
    33 <!--                <th>Дополнителни информации</th>-->
    34 <!--                <th>Корисник</th>-->
    35 <!--                <th>Откажи</th>-->
    36             </tr>
    37             </thead>
    38             <tbody id="requestsTableBody">
    39 
    40             </tbody>
     24            <thead id="table-head"><tr id="initial-head"></tr></thead>
     25            <tbody id="requestsTableBody"></tbody>
    4126        </table>
    42 
    43 
    4427    </div>
    45 </div>
    4628<script src="/js/terms.js"></script>
    4729</body>
  • src/main/resources/templates/html/users-view.html

    r743de55 r43c9090  
    55  <title>Title</title>
    66  <link rel="stylesheet" href="/css/users-view.css">
     7  <script src="/js/cookie.js" defer></script>
    78</head>
    89<body>
     10<button id="authButton" style="display: none;"></button>
    911<div id="frame">
    1012  <div id="header-part">
Note: See TracChangeset for help on using the changeset viewer.