Changeset 3c0f9a9 in Git for src/main


Ignore:
Timestamp:
02/07/22 19:57:58 (3 years ago)
Author:
Petar Partaloski <ppartaloski@…>
Branches:
main
Children:
ad4243e, c02189f
Parents:
7f36551
Message:

Added genre liking, fixed counter, improved paging, improved searches

Location:
src/main
Files:
5 added
18 edited

Legend:

Unmodified
Added
Removed
  • src/main/java/com/wediscussmovies/project/model/primarykeys/UserGenresPK.java

    r7f36551 r3c0f9a9  
    11package com.wediscussmovies.project.model.primarykeys;
     2
     3import lombok.Data;
    24
    35import javax.persistence.Column;
     
    68import java.io.Serializable;
    79
     10@Data
    811@Embeddable
    912public class UserGenresPK implements Serializable {
     
    3033        UserGenresPK that = (UserGenresPK) o;
    3134
    32 
    33 
    3435        return userId == that.userId && genreId == that.genreId;
    3536    }
  • src/main/java/com/wediscussmovies/project/querymodels/GenreLikes.java

    r7f36551 r3c0f9a9  
    33import lombok.Data;
    44
     5import javax.persistence.Entity;
     6import javax.persistence.Table;
     7import java.util.Comparator;
     8import java.util.Objects;
     9
    510@Data
    611public class GenreLikes {
    7 
     12    private Integer genreId;
    813    private String name;
    914    private Long likes;
    1015
    11     public GenreLikes(String name, Long likes) {
     16    public static Comparator<GenreLikes> sorter = Comparator.comparing(GenreLikes::getLikes).thenComparing(GenreLikes::getName).reversed();
     17
     18    public GenreLikes(Integer genreId, String name, Long likes) {
     19        this.genreId = genreId;
    1220        this.name = name;
    1321        this.likes = likes;
     22
     23    }
     24
     25    @Override
     26    public boolean equals(Object o) {
     27        if (this == o) return true;
     28        if (o == null || getClass() != o.getClass()) return false;
     29        GenreLikes that = (GenreLikes) o;
     30        return Objects.equals(genreId, that.genreId);
     31    }
     32
     33    @Override
     34    public int hashCode() {
     35        return Objects.hash(genreId);
    1436    }
    1537}
  • src/main/java/com/wediscussmovies/project/repository/GenreRepository.java

    r7f36551 r3c0f9a9  
    44import com.wediscussmovies.project.querymodels.GenreLikes;
    55import org.springframework.data.jpa.repository.JpaRepository;
     6import org.springframework.data.jpa.repository.Modifying;
    67import org.springframework.data.jpa.repository.Query;
     8import org.springframework.data.repository.query.Param;
    79import org.springframework.stereotype.Repository;
    810
    911import javax.transaction.Transactional;
     12import java.sql.Date;
    1013import java.util.List;
    1114
     
    1417     List<Genre> findAllByGenreType(String genre);
    1518
    16      @Query(value = "select new com.wediscussmovies.project.querymodels.GenreLikes(g.genreType, count(ug.id.userId)) from Genre g" +
     19     @Query(value = "select new com.wediscussmovies.project.querymodels.GenreLikes(g.genreId, g.genreType, count(ug.id.userId)) from Genre g" +
    1720             " left join UserGenres ug on ug.id.genreId = g.genreId" +
    18              " group by g.genreType" +
     21             " group by g.genreId, g.genreType" +
    1922             " order by count(ug.id.userId) desc")
    2023     @Transactional
    2124     List<GenreLikes> findAllWithLikes();
     25
     26     @Modifying
     27     @Query(value = "insert into project.user_genres (user_id,genre_id) values(:user_id,:genre_id)",nativeQuery = true)
     28     @Transactional
     29     void insertInto(@Param("user_id")Integer userId, @Param("genre_id")Integer genreId);
    2230}
  • src/main/java/com/wediscussmovies/project/repository/MovieRepository.java

    r7f36551 r3c0f9a9  
    44import com.wediscussmovies.project.model.Person;
    55import org.springframework.data.jpa.repository.JpaRepository;
     6import org.springframework.data.jpa.repository.Query;
    67import org.springframework.stereotype.Repository;
    78
     
    1314     List<Movie> findAllByDirector(Person director);
    1415     List<Movie> findAllByDirectorIsNull();
     16     @Query(value="select m.movieId from Movie m")
     17     List<Integer> findAllMovieIds();
    1518}
  • src/main/java/com/wediscussmovies/project/service/GenreService.java

    r7f36551 r3c0f9a9  
    1414    Genre save(String genreName);
    1515    List<GenreLikes> findAllWithLikes();
     16    void likeGenre(Integer genreId,Integer userId);
     17    void unlikeGenre(Integer genreId,Integer userId);
    1618
    1719}
  • src/main/java/com/wediscussmovies/project/service/MovieService.java

    r7f36551 r3c0f9a9  
    66import com.wediscussmovies.project.model.Person;
    77import com.wediscussmovies.project.model.User;
     8import org.springframework.data.jpa.repository.Query;
    89
    910import java.sql.Date;
     
    1617     List<Movie> searchByTitle(String title);
    1718     Movie findById(Integer id);
     19     List<Integer> listAllIds();
    1820     Movie save(String title, String description, String imageUrl, Date airingDate,Double  rating,
    1921                Integer directorId,List<Integer> actorIds,List<Integer> genreIds);
  • src/main/java/com/wediscussmovies/project/service/PersonService.java

    r7f36551 r3c0f9a9  
    55import com.wediscussmovies.project.model.Person;
    66import com.wediscussmovies.project.model.User;
     7import com.wediscussmovies.project.model.relation.MovieLikes;
    78
    89import java.sql.Date;
    910import java.util.List;
     11import java.util.stream.Collectors;
    1012
    1113public interface PersonService {
     
    2729    void deleteById(Integer id);
    2830    void addGradePerson(Integer personId, User user, Grade grade);
    29 
    3031}
  • src/main/java/com/wediscussmovies/project/service/impl/GenreServiceImpl.java

    r7f36551 r3c0f9a9  
    11package com.wediscussmovies.project.service.impl;
    22
     3import com.wediscussmovies.project.model.User;
    34import com.wediscussmovies.project.model.exception.GenreNotExistException;
     5import com.wediscussmovies.project.model.exception.UserNotExistException;
     6import com.wediscussmovies.project.model.primarykeys.GenreLikesPK;
     7import com.wediscussmovies.project.model.primarykeys.UserGenresPK;
     8import com.wediscussmovies.project.model.relation.MovieLikes;
     9import com.wediscussmovies.project.model.relation.UserGenres;
    410import com.wediscussmovies.project.querymodels.GenreLikes;
     11import com.wediscussmovies.project.repository.GenreLikesRepository;
    512import com.wediscussmovies.project.repository.GenreRepository;
    613import com.wediscussmovies.project.model.Genre;
     14import com.wediscussmovies.project.repository.UserRepository;
    715import com.wediscussmovies.project.service.GenreService;
    816import org.springframework.stereotype.Service;
     
    1321public class GenreServiceImpl implements GenreService {
    1422    private final GenreRepository genreRepository;
     23    private final UserRepository userRepository;
     24    private final GenreLikesRepository genreLikesRepository;
    1525
    16     public GenreServiceImpl(GenreRepository genreRepository) {
     26
     27    public GenreServiceImpl(GenreRepository genreRepository, UserRepository userRepository, GenreLikesRepository genreLikesRepository) {
    1728        this.genreRepository = genreRepository;
     29        this.userRepository = userRepository;
     30        this.genreLikesRepository = genreLikesRepository;
    1831    }
    1932
     
    3649    @Override
    3750    public List<GenreLikes> findAllWithLikes() {
    38         return this.genreRepository.findAllWithLikes();
     51        List<GenreLikes> genreLikesList = this.genreRepository.findAllWithLikes();
     52        genreLikesList.sort(GenreLikes.sorter);
     53        return genreLikesList;
    3954    }
    4055
     
    4358        return this.genreRepository.findAll();
    4459    }
     60
     61    @Override
     62    public void likeGenre(Integer genreId, Integer userId) {
     63        User user = this.userRepository.findById(userId).orElseThrow(() -> new UserNotExistException(userId.toString()));
     64        Genre genre = this.genreRepository.findById(genreId).orElseThrow(() -> new GenreNotExistException(genreId));
     65        this.genreLikesRepository.save(new UserGenres(genre, user));
     66    }
     67
     68    @Override
     69    public void unlikeGenre(Integer genreId, Integer userId) {
     70        UserGenresPK movieLikesPK = new UserGenresPK(userId, genreId);
     71        this.genreLikesRepository.deleteById(movieLikesPK);
     72    }
    4573}
  • src/main/java/com/wediscussmovies/project/service/impl/MovieServiceImpl.java

    r7f36551 r3c0f9a9  
    7676
    7777    @Override
     78    public List<Integer> listAllIds() {
     79        return this.movieRepository.findAllMovieIds();
     80    }
     81
     82    @Override
    7883    @Transactional
    7984    public Movie save(String title, String description, String imageUrl,
  • src/main/java/com/wediscussmovies/project/service/impl/PersonServiceImpl.java

    r7f36551 r3c0f9a9  
    99import com.wediscussmovies.project.model.primarykeys.PersonRatesPK;
    1010import com.wediscussmovies.project.model.relation.MovieActors;
    11 import com.wediscussmovies.project.model.relation.MovieRates;
    1211import com.wediscussmovies.project.model.relation.PersonRates;
    13 import com.wediscussmovies.project.repository.MovieActorsRepository;
    14 import com.wediscussmovies.project.repository.MovieRepository;
    15 import com.wediscussmovies.project.repository.PersonRatesRepository;
    16 import com.wediscussmovies.project.repository.PersonRepository;
     12import com.wediscussmovies.project.repository.*;
    1713import com.wediscussmovies.project.model.Person;
    1814import com.wediscussmovies.project.service.PersonService;
     
    3228    private final MovieActorsRepository movieActorsRepository;
    3329    private final PersonRatesRepository personRatesRepository;
    34 
    3530
    3631    public PersonServiceImpl(PersonRepository personRepository,
     
    156151
    157152
     153
     154
    158155    private void addActorForMovies(Person person, List<Integer> movieIds){
    159156
  • src/main/java/com/wediscussmovies/project/web/controller/GenreController.java

    r7f36551 r3c0f9a9  
    11package com.wediscussmovies.project.web.controller;
    22
     3import com.wediscussmovies.project.LoggedUser;
     4import com.wediscussmovies.project.model.Genre;
     5import com.wediscussmovies.project.model.User;
     6import com.wediscussmovies.project.model.relation.UserGenres;
     7import com.wediscussmovies.project.querymodels.GenreLikes;
     8import com.wediscussmovies.project.repository.GenreLikesRepository;
    39import com.wediscussmovies.project.service.GenreService;
    410import org.springframework.stereotype.Controller;
     
    713import org.springframework.web.bind.annotation.RequestMapping;
    814
     15import java.util.ArrayList;
     16import java.util.List;
     17
    918@Controller
    1019@RequestMapping("/genres")
    1120public class GenreController {
    1221    private final GenreService genreService;
     22    private final GenreLikesRepository genreLikesRepository;
    1323
    14     public GenreController(GenreService genreService) {
     24    public GenreController(GenreService genreService, GenreLikesRepository genreLikesRepository) {
    1525        this.genreService = genreService;
     26        this.genreLikesRepository = genreLikesRepository;
    1627    }
    1728    @GetMapping
    1829    public String getGenres(Model model){
    1930        model.addAttribute("genres",genreService.findAllWithLikes());
     31        model.addAttribute("allGenres", genreService.findAll());
    2032        model.addAttribute("contentTemplate","genres");
     33        addModelPropertiesForUser(model);
    2134        return "template";
    2235    }
     36
     37    private void addModelPropertiesForUser(Model model){
     38        User user = LoggedUser.getLoggedUser();
     39        List<UserGenres> genreLikesList = this.genreLikesRepository.findAllByUser(user);
     40        List<Genre> genres = new ArrayList<>();
     41        for(UserGenres g: genreLikesList){
     42            genres.add(genreService.findById(g.getId().getGenreId()));
     43        }
     44        model.addAttribute("likedGenres",genres);
     45        model.addAttribute("user",user);
     46    }
    2347}
  • src/main/java/com/wediscussmovies/project/web/controller/MovieController.java

    r7f36551 r3c0f9a9  
    99import com.wediscussmovies.project.service.PersonService;
    1010import com.wediscussmovies.project.web.DesignFrontMovies;
     11import com.wediscussmovies.project.web.PageFrontMovies;
    1112import lombok.Data;
    1213import org.springframework.format.annotation.DateTimeFormat;
     
    3738    }
    3839
    39     @GetMapping
     40    @GetMapping("/old")
    4041    public String getMovies(@RequestParam(required = false) String titleQuery, Model model,
    4142                            @RequestParam(required = false) String error){
     
    5556        model.addAttribute("movie_rows", movie_rows);
    5657        model.addAttribute("contentTemplate", "moviesList");
     58        if (error != null && !error.equals(" "))
     59            model.addAttribute("error",error);
     60        return "template";
     61    }
     62
     63
     64    @GetMapping
     65    public String getMoviesAlternative(@RequestParam(required = false) String titleQuery, Model model,
     66                            @RequestParam(required = false) String error, @RequestParam(required = false) String page){
     67        if (page==null){
     68            return "redirect:/movies?page=1";
     69        }
     70        addModelPropertiesForUser(model);
     71        List<Movie> movies = PageFrontMovies.getPagedMovies(page, movieService, model);
     72        List<List<Movie>> movie_rows = new ArrayList<>();
     73        DesignFrontMovies.designMovieList(movies,movie_rows);
     74        model.addAttribute("movies", movies);
     75        model.addAttribute("movie_rows", movie_rows);
     76        model.addAttribute("contentTemplate", "moviesListPaged");
    5777        if (error != null && !error.equals(" "))
    5878            model.addAttribute("error",error);
     
    160180    }
    161181    private void addModelProperties(Model model){
    162 
    163         model.addAttribute("directors",  personService.findAllDirectors());
     182        model.addAttribute("directors", personService.findAllDirectors());
    164183        model.addAttribute("actors", personService.findAllActors());
    165184        model.addAttribute("genres", genreService.findAll());
     
    169188        model.addAttribute("likedMovies",this.movieService.findLikedMoviesByUser(user));
    170189        model.addAttribute("user",user);
    171         }
     190    }
    172191
    173192}
  • src/main/java/com/wediscussmovies/project/web/controller/PersonController.java

    r7f36551 r3c0f9a9  
    11package com.wediscussmovies.project.web.controller;
    22
     3import com.wediscussmovies.project.LoggedUser;
    34import com.wediscussmovies.project.model.Person;
     5import com.wediscussmovies.project.model.User;
    46import com.wediscussmovies.project.service.MovieService;
    57import com.wediscussmovies.project.service.PersonService;
     
    135137    }
    136138
     139    private void addModelPropertiesForUser(Model model){
     140        User user = LoggedUser.getLoggedUser();
     141        model.addAttribute("user",user);
     142    }
     143
    137144
    138145}
  • src/main/resources/static/css/shared.css

    r7f36551 r3c0f9a9  
    7070    text-align: center;
    7171}
     72
     73#paging-section{
     74    width: 100%;
     75    clear: both;
     76    margin-bottom: 30px;
     77}
     78
     79#inner-paging{
     80    width: fit-content;
     81    margin: auto;
     82
     83}
     84
     85#button-sub, #button-add{
     86    width: 100px;
     87}
     88
     89#pageInput{
     90    font-size: 100%;
     91    text-align: center;
     92    width: 175px;
     93    margin: auto;
     94}
     95
     96#button-submit-page{
     97    margin: auto;
     98    text-align: center;
     99    margin-top: 7px;
     100    display: none;
     101}
     102
     103.visibility{
     104    transition: 200ms;
     105    opacity: 0;
     106}
  • src/main/resources/static/js/sharedScript.js

    r7f36551 r3c0f9a9  
    44    var elements = $(".elements")
    55    var elementGrade;
     6
     7
     8    $("#button-add").on("click", function (){
     9        itemInput = $("#pageInput")
     10        itemInput.val(Number(itemInput.val()) + 1);
     11        $("#button-submit-page").click()
     12    })
     13
     14    $("#button-sub").on("click", function (){
     15        itemInput = $("#pageInput")
     16        if(Number(itemInput.val()) > 1){
     17            itemInput.val(Number(itemInput.val()) - 1);
     18            $("#button-submit-page").click()
     19        }
     20    })
     21
     22    $("#searchTitle").on("keyup", function() {
     23        var value = $(this).val().toLowerCase();
     24        console.log(value)
     25        $(".elements div a .title").filter(function() {
     26            console.log($(this).text())
     27            if($(this).text().toLowerCase().indexOf(value) <= -1)
     28                $(this).parent().parent().parent().addClass("visibility")
     29            else
     30                $(this).parent().parent().parent().removeClass("visibility")
     31        });
     32    });
     33
     34
    635
    736
     
    3766
    3867
    39     $(".search-button-title").on("click",function (){
     68    /*$(".search-button-title").on("click",function (){
    4069        let filter = $("#searchTitle").val()
    4170        console.log(elements)
     
    5079            }
    5180        }
    52 
    53     })
     81    })*/
    5482
    5583
    5684   $(".search-button").on("click",function () {
    5785        let filter = $("#searchGenre").val()
    58        console.log(elements)
    59 
    6086       for (let item of elements) {
    6187            let genre = $(item).find(".card-genre")
     
    6490            for (let g of genre) {
    6591
    66                 if ($(g).text().toLowerCase() === filter.toLowerCase()) {
     92                if (( $(g).text().toLowerCase() === filter.toLowerCase() && !$(g).hasClass("visibility") && filter.trim().length != 0)) {
    6793                    visible = true
    68                     $(item).css("display","block")
     94                    $(item).removeClass("visibility")
    6995                    break;
    7096                }
    7197            }
    72             if (!visible)
    73                 $(item).css("display","none")
     98            if (!visible && filter.trim().length != 0)
     99                $(item).addClass("visibility")
     100            else
     101                $(item).removeClass("visibility")
     102
    74103        }
    75104    });
     
    117146        let url = "api/movies/unlike/"+ $(this).attr("movie-id")+"?userId="+ $(this).attr("user-id")
    118147        ajaxCallLike(url,button,'unlike','Немате оставено допаѓање на филмот!')
     148    })
     149    $(document.body).on("click",".button-add-genre-liked-list",function (){
     150        let button = $(this)
     151        let url = "api/genres/like/"+ $(this).attr("genre-id") + "?userId="+ $(this).attr("user-id")
     152        ajaxCallLikeGenre(url,button,'like','Веќе ви се допаѓа жанрот!')
     153    })
     154    $(document.body).on("click",".button-remove-genre-liked-list",function (){
     155        let button = $(this)
     156        let url = "api/genres/unlike/"+ $(this).attr("genre-id")+"?userId="+ $(this).attr("user-id")
     157        ajaxCallLikeGenre(url,button,'unlike','Немате оставено допаѓање на жанрот!')
    119158    })
    120159    $(".discussion-type").change(function (){
     
    157196
    158197                }
     198                $(button).remove()
    159199            }
    160200            else {
     
    180220    })
    181221}
     222
     223
     224
     225function ajaxCallLikeGenre(url,button,type,message){
     226    $.ajax({
     227        url:url,
     228        success:function (data){
     229            if (data){
     230                let el = $(button).parent().siblings().eq(3)
     231                console.log(el)
     232                if (type=="like") {
     233                    $(el).html(parseInt($(el).text()) + 1)
     234                    console.log("da")
     235                }
     236                else
     237                    $(el).html(parseInt($(el).text()) - 1)
     238                $(button).css("display","none")
     239                let userId = $(button).attr("user-id")
     240                let genreId=$(button).attr("genre-id")
     241                if (type==='like') {
     242                    $(button).parent().append("<a class='btn btn-danger button-remove-genre-liked-list' genre-id=" + genreId + " user-id=" + userId + ">💔</a>")
     243                    console.log("da")
     244                }
     245                else{
     246                    $(button).parent().append("<a class='btn btn-success button-add-genre-liked-list' genre-id=" + genreId + " user-id=" + userId + ">❤</a>")
     247                }
     248                let likes_sibling = $("#"+genreId+"genre")
     249                value_likes = Number(likes_sibling.text())
     250                if(type=="like")
     251                    value_likes+=1
     252                else
     253                    value_likes-=1
     254                likes_sibling.text(value_likes)
     255                $(button).remove()
     256            }
     257            else {
     258                $(button).parent().append("<div>" + message +" <button class='button-confirm'>Ок</button></div>")
     259            }
     260        }
     261    })
     262}
     263
     264
    182265function  ajaxCallRating(url,button,type){
    183266    model = {
  • src/main/resources/templates/genres.html

    r7f36551 r3c0f9a9  
    1 <div class="container mb-4">
    2   <div class="row">
    3     <div class="col-12">
    4       <div class="table-responsive">
    5         <table class="table table-striped">
    6           <thead>
    7           <tr>
    8             <th scope="col">Име</th>
    9             <th scope="col">Лајкови</th>
    10           </tr>
    11           </thead>
    12           <tbody>
    13           <tr th:each="genre : ${genres}" class="elements">
    14             <td th:text="${genre.getName()}"></td>
    15             <td th:text="${genre.getLikes()}"></td>
     1<div class="container mb-4" xmlns:sec="http://www.w3.org/1999/xhtml">
    162
    17           </tr>
    18           </tbody>
    19         </table>
     3    <div class="row">
     4      <div class="col-12">
     5        <div class="table-responsive">
     6          <table class="table table-striped">
     7            <thead>
     8            <tr>
     9              <th scope="col">Име</th>
     10              <th scope="col">Лајкови</th>
     11            </tr>
     12            </thead>
     13            <tbody>
     14            <tr th:each="genre : ${genres}" class="elements">
     15              <td th:text="${genre.getName()}"></td>
     16              <td th:text="${genre.getLikes()}" th:id="${genre.getGenreId()+'genre'}"></td>
     17              <td>
     18                <th:block sec:authorize="isAuthenticated()" th:each="g: ${allGenres}" th:if="${g.getGenreId() == genre.getGenreId()}">
     19                  <a class="btn btn-success button-add-genre-liked-list" th:genre-id="${g.getGenreId()}" th:user-id="${user.getUserId()}" th:if="${!likedGenres.contains(g)}">❤</a>
     20                  <a class="btn btn-danger button-remove-genre-liked-list" th:genre-id="${g.getGenreId()}" th:user-id="${user.getUserId()}" th:if="${likedGenres.contains(g)}">💔</a>
     21                </th:block>
     22              </td>
     23            </tr>
     24            </tbody>
     25          </table>
     26        </div>
    2027      </div>
    21     </div>
     28
    2229  </div>
    2330</div>
  • src/main/resources/templates/personShow.html

    r7f36551 r3c0f9a9  
    3030        </div>
    3131    </div>
     32    <div style="width: 45%; margin: 25px; float:left; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
     33        <h2>
     34            <span>Бројот на оцени кои филмот ги добил:</span>
     35            <span th:text="${movie.getRates().size()}"></span>
     36        </h2>
     37        <hr>
     38        <div th:each="rating: ${movie.getRates()}" style="margin-bottom: 10px; border: 2px solid gray; border-radius: 10px; background-color: lightblue; padding: 10px; border-radius: 10px; min-height: 130px;">
     39            <div style="width: 60%; float:left;">
     40                <p th:text="${rating.getReason()}" style="text-align: justify"></p>
     41            </div>
     42            <div style="width: 30%; float:right; background-color: darkorange; border-radius: 10px 30px; color: whitesmoke; padding: 10px;">
     43                <h2 style="text-align: center">Rated:</h2>
     44                <p th:text="${rating.getStarsRated() + ' out of 10 stars'}" style="text-align: center"></p>
     45            </div>
     46        </div>
     47    </div>
     48    <div style="width: 45%; margin: 25px; float:left; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
     49        <h2>
     50            <span>Бројот на лајкови кои филмот ги добил:</span>
     51            <span th:text="${movie.getLikes().size()}"></span>
     52        </h2>
     53        <hr>
     54        <div th:each="liked: ${movie.getLikes()}" style="margin-bottom: 10px; border: 2px solid gray; border-radius: 10px; background-color: lightblue; padding: 10px; border-radius: 10px; min-height: 60px;">
     55            <div style="width: 100%; float:left;">
     56                <h3  style="text-align: center">
     57                    <span th:text="${liked.getUser().getName() + ' ' + liked.getUser().getSurname()}"></span>
     58                    <span style="color: green; font-size: 100%" >✔</span>
     59                </h3>
     60            </div>
     61        </div>
     62    </div>
    3263</div>
  • src/main/resources/templates/personsList.html

    r7f36551 r3c0f9a9  
    5757
    5858                            </td>
     59
     60                            <a class="bottom-heart btn btn-success button-add-favourite-list"
     61                               th:movie-id="${person.getMovieId()}"
     62                               th:user-id="${user.getUserId()}"
     63                               th:if="${!likedPersons.contains(movie)}">❤</a>
     64
     65                            <a class="bottom-heart btn btn-danger button-remove-favourite-list"
     66                               th:movie-id="${person.getMovieId()}" th:user-id="${user.getUserId()}"
     67                               th:if="${likedPersons.contains(movie)}">💔</a>
     68
     69
    5970                            </th:block>
    6071
Note: See TracChangeset for help on using the changeset viewer.