Changeset c02189f in Git


Ignore:
Timestamp:
02/08/22 20:13:23 (3 years ago)
Author:
Petar Partaloski <ppartaloski@…>
Branches:
main
Children:
0226942, 3fe36de
Parents:
3c0f9a9
Message:

Added new core functionalities, fixed bugs and improved visual clarity

Files:
12 added
60 edited

Legend:

Unmodified
Added
Removed
  • src/main/java/com/wediscussmovies/project/configuration/SecurityConfig.java

    r3c0f9a9 rc02189f  
    2929        http.csrf().disable()
    3030                .authorizeRequests()
    31                 .antMatchers("/movies","/movies/**/","/actors","/persons/**/","/directors","/discussions","/discussions/**/","/discussions/all/**/","/replies","/register","/genres", "/css/**", "/js/**").permitAll()
     31                .antMatchers("/movies","/movies/**/","/actors","/persons/**/","/directors","/discussions","/discussions/**/","/discussions/all/**/","/replies","/register","/genres", "/css/**","/img/**", "/js/**").permitAll()
    3232                .anyRequest()
    3333                .authenticated()
  • src/main/java/com/wediscussmovies/project/model/Genre.java

    r3c0f9a9 rc02189f  
    2222    }
    2323
     24    public Genre(int genreId, String genreType) {
     25        this.genreId = genreId;
     26        this.genreType = genreType;
     27    }
     28
    2429    public Genre(String genreType) {
    2530        this.genreType = genreType;
  • src/main/java/com/wediscussmovies/project/model/Movie.java

    r3c0f9a9 rc02189f  
    6666    }
    6767
     68    public Movie(int movieId, String title, Double imdbRating, String imageUrl) {
     69        this.movieId = movieId;
     70        this.title = title;
     71        this.imdbRating = imdbRating;
     72        this.imageUrl = imageUrl;
     73    }
     74
     75    public String getDateFormatted(){
     76        String dob = airingDate.toString();
     77        String [] parts = dob.split("-");
     78        return parts[2]+"/"+parts[1]+"/"+parts[0];
     79    }
     80
    6881    @Override
    6982    public boolean equals(Object o) {
  • src/main/java/com/wediscussmovies/project/model/Person.java

    r3c0f9a9 rc02189f  
    66
    77import javax.persistence.*;
     8import javax.swing.text.DateFormatter;
    89import java.sql.Date;
     10import java.time.LocalDate;
     11import java.time.format.DateTimeFormatter;
    912import java.util.Collection;
    1013
     
    7376
    7477
     78    public String getDateFormatted(){
     79        String dob = dateOfBirth.toString();
     80        String [] parts = dob.split("-");
     81        return parts[2]+"/"+parts[1]+"/"+parts[0];
     82    }
     83
    7584
    7685    public Person(String name, String surname, Character type, Date dateOfBirth, String imageUrl, String description) {
  • src/main/java/com/wediscussmovies/project/repository/DiscussionRepository.java

    r3c0f9a9 rc02189f  
    44import com.wediscussmovies.project.model.Movie;
    55import com.wediscussmovies.project.model.Person;
     6import com.wediscussmovies.project.querymodels.DiscussionLikes;
     7import com.wediscussmovies.project.querymodels.GenreLikes;
    68import org.springframework.data.jpa.repository.JpaRepository;
     9import org.springframework.data.jpa.repository.Query;
    710import org.springframework.stereotype.Repository;
    811
     12import javax.transaction.Transactional;
    913import java.util.List;
    1014
     
    1418     List<Discussion> findAllByMovie(Movie movie);
    1519     List<Discussion> findAllByPerson (Person person);
     20
     21     @Query(value = "select new com.wediscussmovies.project.querymodels.DiscussionLikes(d.discussionId, count(dl.id.userId)) from Discussion d" +
     22             " left join DiscussionLikes dl on dl.id.discussionId = d.discussionId" +
     23             " group by d.discussionId" +
     24             " order by count(dl.id.userId) desc")
     25     @Transactional
     26     List<DiscussionLikes> findAllWithLikes();
    1627}
  • src/main/java/com/wediscussmovies/project/repository/GenreRepository.java

    r3c0f9a9 rc02189f  
    2828     @Transactional
    2929     void insertInto(@Param("user_id")Integer userId, @Param("genre_id")Integer genreId);
     30
     31     @Query(value = "select new com.wediscussmovies.project.model.Genre (g.genreId, g.genreType) from Genre g" +
     32     " ORDER BY g.genreType DESC")
     33     List<Genre> findAllSorted();
    3034}
  • src/main/java/com/wediscussmovies/project/repository/MovieRepository.java

    r3c0f9a9 rc02189f  
    33import com.wediscussmovies.project.model.Movie;
    44import com.wediscussmovies.project.model.Person;
     5import com.wediscussmovies.project.querymodels.GenreLikes;
     6import com.wediscussmovies.project.querymodels.MovieLikesQM;
    57import org.springframework.data.jpa.repository.JpaRepository;
    68import org.springframework.data.jpa.repository.Query;
     9import org.springframework.data.repository.query.Param;
    710import org.springframework.stereotype.Repository;
    811
     12import javax.transaction.Transactional;
    913import java.util.List;
     14import java.util.Optional;
    1015
    1116@Repository
     
    1621     @Query(value="select m.movieId from Movie m")
    1722     List<Integer> findAllMovieIds();
     23
     24     @Query(value="select new com.wediscussmovies.project.model.Movie(m.movieId, m.title, m.imdbRating, m.imageUrl) from Movie m" +
     25               " where m.movieId = :index")
     26     Optional<Movie> findBasicById(@Param("index")Integer index);
     27
     28
     29     @Query(value = "select new com.wediscussmovies.project.querymodels.MovieLikesQM(m.movieId, count(ml.id.userId)) from Movie m" +
     30             " left join MovieLikes ml on ml.id.movieId = m.movieId" +
     31             " group by m.movieId" +
     32             " order by count(ml.id.userId) desc")
     33     @Transactional
     34     List<MovieLikesQM> findAllWithLikes();
     35
     36     @Query(value = "select new com.wediscussmovies.project.querymodels.MovieLikesQM(m.movieId, count(ml.id.userId)) from Movie m" +
     37             " left join MovieLikes ml on ml.id.movieId = m.movieId" +
     38             " group by m.movieId" +
     39             " having m.movieId = :id")
     40     @Transactional
     41     List<MovieLikesQM> findLikesForMovie(@Param("id") Integer movie_id);
     42
     43
    1844}
  • src/main/java/com/wediscussmovies/project/service/DiscussionService.java

    r3c0f9a9 rc02189f  
    33import com.wediscussmovies.project.model.Discussion;
    44import com.wediscussmovies.project.model.User;
     5import com.wediscussmovies.project.querymodels.DiscussionLikes;
    56
    67import java.util.List;
     
    1617    void unlikeDiscussion(Integer discussionId,Integer userId);
    1718    List<Discussion> findAllForPersonOrMovie(Integer id,Character type);
     19
     20    List<Discussion> findLikedDiscussionsByUser(User user);
     21
     22    DiscussionLikes findLikesForDiscussionWithId(int discussionId);
     23
    1824}
  • src/main/java/com/wediscussmovies/project/service/MovieService.java

    r3c0f9a9 rc02189f  
    66import com.wediscussmovies.project.model.Person;
    77import com.wediscussmovies.project.model.User;
     8import com.wediscussmovies.project.querymodels.MovieLikesQM;
    89import org.springframework.data.jpa.repository.Query;
    910
     
    1718     List<Movie> searchByTitle(String title);
    1819     Movie findById(Integer id);
     20     Movie findBasicById(Integer id);
    1921     List<Integer> listAllIds();
    2022     Movie save(String title, String description, String imageUrl, Date airingDate,Double  rating,
     
    3537
    3638     void addGradeMovie(Integer movieId, User user, Grade grade);
     39
     40    MovieLikesQM findLikesForMovieById(int movieId);
    3741}
  • src/main/java/com/wediscussmovies/project/service/impl/DiscussionServiceImpl.java

    r3c0f9a9 rc02189f  
    55import com.wediscussmovies.project.model.exception.PersonNotExistException;
    66import com.wediscussmovies.project.model.exception.UserNotExistException;
    7 import com.wediscussmovies.project.repository.DiscussionRepository;
     7import com.wediscussmovies.project.model.primarykeys.DiscussionLikesPK;
     8import com.wediscussmovies.project.model.relation.DiscussionLikes;
     9import com.wediscussmovies.project.repository.*;
    810import com.wediscussmovies.project.model.Discussion;
    911import com.wediscussmovies.project.model.Movie;
    1012import com.wediscussmovies.project.model.Person;
    1113import com.wediscussmovies.project.model.User;
    12 import com.wediscussmovies.project.repository.MovieRepository;
    13 import com.wediscussmovies.project.repository.PersonRepository;
    14 import com.wediscussmovies.project.repository.UserRepository;
    1514import com.wediscussmovies.project.service.DiscussionService;
    16 import com.wediscussmovies.project.service.MovieService;
    17 import com.wediscussmovies.project.service.PersonService;
    18 import com.wediscussmovies.project.service.UserService;
    1915import org.springframework.stereotype.Service;
    2016
    2117import java.sql.Date;
    2218import java.time.LocalDate;
     19import java.util.ArrayList;
    2320import java.util.List;
    2421
     
    2724
    2825    private final DiscussionRepository discussionRepository;
     26    private final DiscussionLikesRepository discussionLikesRepository;
    2927    private final UserRepository userRepository;
    3028
     
    3230    private final PersonRepository personRepository;
    3331
    34     public DiscussionServiceImpl(DiscussionRepository discussionRepository, UserRepository userRepository,
     32    public DiscussionServiceImpl(DiscussionRepository discussionRepository, DiscussionLikesRepository discussionLikesRepository, UserRepository userRepository,
    3533                                 MovieRepository movieRepository, PersonRepository personRepository) {
    3634        this.discussionRepository = discussionRepository;
     35        this.discussionLikesRepository = discussionLikesRepository;
    3736        this.userRepository = userRepository;
    3837        this.movieRepository = movieRepository;
     
    9493    @Override
    9594    public void likeDiscussion(Integer discussionId, Integer userId) {
    96         //ova fali od dijagram
     95        Discussion discussion = discussionRepository.findById(discussionId).orElseThrow(() -> new DiscussionNotExistException(discussionId));
     96        User user = userRepository.findById(userId).orElseThrow(() -> new UserNotExistException(userId.toString()));
     97        this.discussionLikesRepository.save(new DiscussionLikes(discussion, user));
     98    }
     99
     100    @Override
     101    public List<Discussion> findLikedDiscussionsByUser(User user) {
     102        List<DiscussionLikes> likes = discussionLikesRepository.findAllByUser(user);
     103        List<Discussion> discussions = new ArrayList<>();
     104        for(DiscussionLikes dl: likes){
     105            discussions.add(dl.getDiscussion());
     106        }
     107        return discussions;
    97108    }
    98109
    99110    @Override
    100111    public void unlikeDiscussion(Integer discussionId, Integer userId) {
    101         // ova fali od dijagram
     112        DiscussionLikesPK pk = new DiscussionLikesPK(discussionId, userId);
     113        this.discussionLikesRepository.deleteById(pk);
    102114    }
     115
     116    @Override
     117    public com.wediscussmovies.project.querymodels.DiscussionLikes findLikesForDiscussionWithId(int discussionId) {
     118        return discussionRepository.findAllWithLikes().stream().filter(d ->  d.getDiscussionId().equals(discussionId)).findFirst().get();
     119    }
     120
    103121
    104122    @Override
  • src/main/java/com/wediscussmovies/project/service/impl/GenreServiceImpl.java

    r3c0f9a9 rc02189f  
    5656    @Override
    5757    public List<Genre> findAll() {
    58         return this.genreRepository.findAll();
     58        return this.genreRepository.findAllSorted();
    5959    }
    6060
  • src/main/java/com/wediscussmovies/project/service/impl/MovieServiceImpl.java

    r3c0f9a9 rc02189f  
    1313import com.wediscussmovies.project.model.relation.MovieLikes;
    1414import com.wediscussmovies.project.model.relation.MovieRates;
     15import com.wediscussmovies.project.querymodels.MovieLikesQM;
    1516import com.wediscussmovies.project.repository.*;
    1617import com.wediscussmovies.project.model.exception.MovieIdNotFoundException;
     
    7374    public Movie findById(Integer id) {
    7475        return this.movieRepository.findById(id).orElseThrow(() -> new MovieIdNotFoundException(id));
     76    }
     77
     78    @Override
     79    public Movie findBasicById(Integer id) {
     80        return this.movieRepository.findBasicById(id).orElseThrow(() -> new MovieIdNotFoundException(id));
     81    }
     82
     83    @Override
     84    public MovieLikesQM findLikesForMovieById(int movieId) {
     85        return this.movieRepository.findLikesForMovie(movieId).get(0);
    7586    }
    7687
  • src/main/java/com/wediscussmovies/project/service/impl/PersonServiceImpl.java

    r3c0f9a9 rc02189f  
    99import com.wediscussmovies.project.model.primarykeys.PersonRatesPK;
    1010import com.wediscussmovies.project.model.relation.MovieActors;
     11import com.wediscussmovies.project.model.relation.MovieLikes;
    1112import com.wediscussmovies.project.model.relation.PersonRates;
    1213import com.wediscussmovies.project.repository.*;
     
    2829    private final MovieActorsRepository movieActorsRepository;
    2930    private final PersonRatesRepository personRatesRepository;
    30 
    3131    public PersonServiceImpl(PersonRepository personRepository,
    3232                             MovieRepository movieRepository, MovieActorsRepository movieActorsRepository,
     
    152152
    153153
    154 
    155154    private void addActorForMovies(Person person, List<Integer> movieIds){
    156155
  • src/main/java/com/wediscussmovies/project/web/PageFrontMovies.java

    r3c0f9a9 rc02189f  
    3232
    3333        for(Integer id: movieIds){
    34             movies.add(movieService.findById(id));
     34            //Trying to improve load times by not pulling all things from the database, excluding un-needed stuff
     35            //
     36            //movies.add(movieService.findById(id));
     37            movies.add(movieService.findBasicById(id));
    3538        }
    3639        model.addAttribute("page", page);
  • src/main/java/com/wediscussmovies/project/web/controller/DiscussionController.java

    r3c0f9a9 rc02189f  
    55import com.wediscussmovies.project.model.Reply;
    66import com.wediscussmovies.project.model.User;
     7import com.wediscussmovies.project.model.relation.DiscussionLikes;
    78import com.wediscussmovies.project.service.DiscussionService;
    89import com.wediscussmovies.project.service.MovieService;
     
    1718import org.springframework.web.bind.annotation.*;
    1819
     20import java.util.ArrayList;
    1921import java.util.List;
    2022
     
    4648        model.addAttribute("contentTemplate", "discussionsList");
    4749        model.addAttribute("user",LoggedUser.getLoggedUser());
     50        this.addModelPropertiesForUser(model);
     51        this.addModelPropertiesLikes(model,null, discussions);
    4852        return "template";
    4953    }
     
    6266            model.addAttribute("user",LoggedUser.getLoggedUser());
    6367            model.addAttribute("replies",this.replyService.findAllByDiscussion(disc));
     68            addModelPropertiesLikes(model, disc, null);
     69            addModelPropertiesForUser(model);
    6470
    6571            return "template";
     
    171177
    172178    }
     179    private void addModelPropertiesForUser(Model model){
     180        User user = LoggedUser.getLoggedUser();
     181        model.addAttribute("likedDiscussions",this.discussionService.findLikedDiscussionsByUser(user));
     182        model.addAttribute("user",user);
     183    }
     184    private void addModelPropertiesLikes(Model model, Discussion discussion, List<Discussion> discussions){
     185        if(discussion==null){
     186            List<com.wediscussmovies.project.querymodels.DiscussionLikes> discussionLikes = new ArrayList<>();
     187            for(Discussion d: discussions){
     188                discussionLikes.add(discussionService.findLikesForDiscussionWithId(d.getDiscussionId()));
     189            }
     190            model.addAttribute("likes", discussionLikes);
     191        }
     192        else{
     193            model.addAttribute("likes",discussionService.findLikesForDiscussionWithId(discussion.getDiscussionId()).getLikes());
     194        }
     195    }
    173196
    174197
  • src/main/java/com/wediscussmovies/project/web/controller/MovieController.java

    r3c0f9a9 rc02189f  
    55import com.wediscussmovies.project.model.Person;
    66import com.wediscussmovies.project.model.User;
     7import com.wediscussmovies.project.querymodels.MovieLikesQM;
    78import com.wediscussmovies.project.service.GenreService;
    89import com.wediscussmovies.project.service.MovieService;
     
    2324import java.time.LocalDate;
    2425import java.util.ArrayList;
     26import java.util.HashMap;
     27import java.util.LinkedList;
    2528import java.util.List;
    2629
     
    3942
    4043    @GetMapping("/old")
    41     public String getMovies(@RequestParam(required = false) String titleQuery, Model model,
     44    public String getMoviesOld(@RequestParam(required = false) String titleQuery, Model model,
    4245                            @RequestParam(required = false) String error){
    4346        List<Movie> movies;
     
    5659        model.addAttribute("movie_rows", movie_rows);
    5760        model.addAttribute("contentTemplate", "moviesList");
     61        model.addAttribute("genres", genreService.findAll());
    5862        if (error != null && !error.equals(" "))
    5963            model.addAttribute("error",error);
     
    6367
    6468    @GetMapping
    65     public String getMoviesAlternative(@RequestParam(required = false) String titleQuery, Model model,
     69    public String getMovies(@RequestParam(required = false) String titleQuery, Model model,
    6670                            @RequestParam(required = false) String error, @RequestParam(required = false) String page){
    6771        if (page==null){
     
    7276        List<List<Movie>> movie_rows = new ArrayList<>();
    7377        DesignFrontMovies.designMovieList(movies,movie_rows);
     78        //addModelPropertiesForMoviesLikes(model, movies);
    7479        model.addAttribute("movies", movies);
    7580        model.addAttribute("movie_rows", movie_rows);
     81        model.addAttribute("genres", genreService.findAll());
    7682        model.addAttribute("contentTemplate", "moviesListPaged");
    7783        if (error != null && !error.equals(" "))
     
    8490        model.addAttribute("movie", movieService.findById(id));
    8591        addModelPropertiesForUser(model);
     92        model.addAttribute("likes", movieService.findLikesForMovieById(id).getLikes());
    8693        model.addAttribute("contentTemplate", "movieShow");
    8794        return "template";
     
    189196        model.addAttribute("user",user);
    190197    }
     198    private void addModelPropertiesForMoviesLikes(Model model, List<Movie> movies){
     199        HashMap<Integer,MovieLikesQM> movieLikes = new HashMap<>();
     200        for(Movie m: movies){
     201            movieLikes.put(m.getMovieId(),movieService.findLikesForMovieById(m.getMovieId()));
     202        }
     203        model.addAttribute("movieLikes", movieLikes);
     204    }
    191205
    192206}
  • src/main/java/com/wediscussmovies/project/web/controller/rest/MovieRestController.java

    r3c0f9a9 rc02189f  
    5252    public ResponseEntity addGrade(@PathVariable Integer movieId, @RequestBody Grade grade){
    5353        try {
     54            if(grade.getRating() < 5)
     55                grade.setRating(5);
     56            else if(grade.getRating()>10)
     57                grade.setRating(10);
    5458            this.movieService.addGradeMovie(movieId, LoggedUser.getLoggedUser(),grade);
    5559            return ResponseEntity.ok(true);
  • src/main/resources/static/css/shared.css

    r3c0f9a9 rc02189f  
    5252.bottom{
    5353    position: absolute;
    54     top: 80%;
     54    top: 75%;
    5555    margin:auto;
    5656    width: 100%;
     
    6060    background-color: rgba(0,0,0,0.25);
    6161}
    62 
    63 
    64 .bottom-heart{
     62.bottom h3, .bottom span{
     63    margin-bottom: 0px;
     64    margin-top: 0px;
     65}
     66.bottom span{
     67    font-size: 75%;
     68    margin-top: 5px;
     69}
     70
     71
     72.elements .card .btn{
    6573    top: 60%;
    6674    left: auto;
     
    105113    opacity: 0;
    106114}
     115
     116.person-movies-list{
     117    margin: auto;
     118    margin-top: 20px;
     119    padding: 10px;
     120    width: 80%;
     121    background-color: rgba(52, 58, 64, 0.7);
     122    border-radius: 10px;
     123    transition: 200ms;
     124    color: white;
     125}
     126
     127.person-movies-list:hover{
     128    background-color: rgba(52, 58, 64, 1);
     129}
     130
     131.person-movies-list ul{
     132    list-style-type: none;
     133}
     134
     135.person-movies-list ul li{
     136    color:black;
     137    background-color: rgba(255,255,255,0.7);
     138    padding: 12px;
     139    font-size: 120%;
     140    width: 80%;
     141    text-align: center;
     142    margin: auto;
     143    transition: 200ms;
     144    border-radius: 10px;
     145    margin-bottom: 5px;
     146    text-decoration: underline;
     147}
     148
     149.person-movies-list hr{
     150    color: white;
     151    background-color: white;
     152    border-color: white;
     153}
     154
     155.person-movies-list ul li:hover{
     156    background-color: rgba(255,255,255,1);
     157    text-decoration-color: blue;
     158}
     159
     160.genres-listing ul li:hover{
     161    background-color: rgba(222,128,128,1);
     162}
     163
     164.genres-listing ul li{
     165    background-color: rgba(192,128,128,0.7);
     166    text-decoration: none !important;
     167}
     168
     169.person-movies-list ul li a{
     170    color: black;
     171    transition: 250ms;
     172    text-decoration: underline;
     173    text-decoration-color: black;
     174}
     175
     176.person-movies-list ul li a:hover{
     177    color:blue;
     178}
     179
     180
     181#admin-buttons a{
     182    display: inline-block;
     183    width: 95%;
     184    margin: auto;
     185    margin-top: 10px;
     186    font-size: 125%;
     187    clear: both;
     188}
     189
     190#image-movie-section{
     191    height: fit-content;
     192    min-height: fit-content;
     193}
     194
     195#likes-showcase{
     196    background-color: rgba(192,128,128,0.7);
     197    border-radius: 10px;
     198    padding:10px;
     199    width: 60%;
     200    margin: auto;
     201    transition: 200ms;
     202    margin-top: 2%;
     203}
     204
     205#likes-showcase strong{
     206    font-size: 150%;
     207}
     208
     209#likes-showcase:hover{
     210    background-color: rgba(222,128,128,1);
     211}
     212
     213.invisible-search{
     214    display: none;
     215}
  • src/main/resources/static/js/sharedScript.js

    r3c0f9a9 rc02189f  
    44    var elements = $(".elements")
    55    var elementGrade;
    6 
     6    var first_time = true;
    77
    88    $("#button-add").on("click", function (){
     
    5656    $(".button-add-grade-movie").on("click",function (){
    5757        elementGrade = $(this)
    58         urlRating ="api/movies/grade/"+$(this).attr("movie-id")
     58        urlRating ="/api/movies/grade/"+$(this).attr("movie-id")
    5959        $("#dialog-rating").dialog("open")
    6060    })
    6161    $(".button-add-grade-person").on("click",function (){
    6262        elementGrade = $(this)
    63         urlRating ="api/persons/grade/"+$(this).attr("person-id")
     63        urlRating ="/api/persons/grade/"+$(this).attr("person-id")
    6464        $("#dialog-rating").dialog("open")
    6565    })
     
    8181    })*/
    8282
     83    $("#button_toggle_filters").on("click", function (){
     84        if(first_time){
     85            $("#filters_div").removeClass("invisible-search")
     86            first_time=false
     87        }
     88        else
     89            $("#filters_div").fadeToggle();
     90    })
    8391
    8492   $(".search-button").on("click",function () {
    85         let filter = $("#searchGenre").val()
     93       elements = $(".elements")
     94       let filter = $("#searchGenre").val()
     95       console.log('\''+filter+'\'')
     96       console.log(elements)
     97       if(filter.length==0){
     98           console.log("HERE")
     99           for (let item of elements) {
     100               $(item).removeClass("visibility")
     101           }
     102       }
    86103       for (let item of elements) {
    87             let genre = $(item).find(".card-genre")
     104           $(item).removeClass("visibility")
     105            let genre = $(item).children(".card-genre")
    88106            let visible = false;
    89 
     107            console.log(genre.length)
    90108            for (let g of genre) {
    91 
    92                 if (( $(g).text().toLowerCase() === filter.toLowerCase() && !$(g).hasClass("visibility") && filter.trim().length != 0)) {
     109                if (( $(g).text().toLowerCase() === filter.toLowerCase())){
     110                    console.log(item.text + ' ' + $(g).text())
    93111                    visible = true
    94112                    $(item).removeClass("visibility")
     
    96114                }
    97115            }
    98             if (!visible && filter.trim().length != 0)
     116            if(!visible){
    99117                $(item).addClass("visibility")
    100             else
    101                 $(item).removeClass("visibility")
     118            }
    102119
    103120        }
     
    106123    $(".button-delete-movie").on("click",function (){
    107124        let button = $(this)
    108         let url = "api/movies/delete/" + $(button).attr("movie-id")
     125        let url = "/api/movies/delete/" + $(button).attr("movie-id")
    109126        ajaxCallDelete(url,button)
    110127    })
    111128    $(".button-delete-actor").on("click",function (){
    112129        let button = $(this)
    113         let url  = "api/persons/delete/" + $(button).attr("person-id")
     130        let url  = "/api/persons/delete/" + $(button).attr("person-id")
    114131        ajaxCallDelete(url,button)
    115132    })
    116133    $(".button-delete-discussion").on("click",function (){
    117134        let button = $(this)
    118         let url = "api/discussions/delete/" + $(button).attr("discussion-id")
     135        let url = "/api/discussions/delete/" + $(button).attr("discussion-id")
    119136        ajaxCallDelete(url,button)
    120137    })
     
    139156    $(document.body).on("click",".button-add-favourite-list",function (){
    140157        let button = $(this)
    141         let url = "api/movies/like/"+ $(this).attr("movie-id") + "?userId="+ $(this).attr("user-id")
     158        let url = "/api/movies/like/"+ $(this).attr("movie-id") + "?userId="+ $(this).attr("user-id")
    142159        ajaxCallLike(url,button,'like','Веќе е филмот допаднат!')
    143160    })
    144161    $(document.body).on("click",".button-remove-favourite-list",function (){
    145162        let button = $(this)
    146         let url = "api/movies/unlike/"+ $(this).attr("movie-id")+"?userId="+ $(this).attr("user-id")
     163        let url = "/api/movies/unlike/"+ $(this).attr("movie-id")+"?userId="+ $(this).attr("user-id")
    147164        ajaxCallLike(url,button,'unlike','Немате оставено допаѓање на филмот!')
    148165    })
    149166    $(document.body).on("click",".button-add-genre-liked-list",function (){
    150167        let button = $(this)
    151         let url = "api/genres/like/"+ $(this).attr("genre-id") + "?userId="+ $(this).attr("user-id")
     168        let url = "/api/genres/like/"+ $(this).attr("genre-id") + "?userId="+ $(this).attr("user-id")
    152169        ajaxCallLikeGenre(url,button,'like','Веќе ви се допаѓа жанрот!')
    153170    })
    154171    $(document.body).on("click",".button-remove-genre-liked-list",function (){
    155172        let button = $(this)
    156         let url = "api/genres/unlike/"+ $(this).attr("genre-id")+"?userId="+ $(this).attr("user-id")
     173        let url = "/api/genres/unlike/"+ $(this).attr("genre-id")+"?userId="+ $(this).attr("user-id")
    157174        ajaxCallLikeGenre(url,button,'unlike','Немате оставено допаѓање на жанрот!')
     175    })
     176    $(document.body).on("click",".button-like-discussion",function (){
     177        let button = $(this)
     178        let url = "/api/discussions/like/"+ $(this).attr("discussion-id")+"?userId="+ $(this).attr("user-id")
     179        ajaxCallLikeDiscussion(url,button,'like','Веќе имате оставено допаѓање на дискусијата!')
     180    })
     181    $(document.body).on("click",".button-unlike-discussion",function (){
     182        let button = $(this)
     183        let url = "/api/discussions/unlike/"+ $(this).attr("discussion-id")+"?userId="+ $(this).attr("user-id")
     184        ajaxCallLikeDiscussion(url,button,'unlike','Немате оставено допаѓање на дискусијата!')
     185    })
     186    $(document.body).on("click",".button-like-discussion-alt",function (){
     187        let button = $(this)
     188        let url = "/api/discussions/like/"+ $(this).attr("discussion-id")+"?userId="+ $(this).attr("user-id")
     189        ajaxCallLikeDiscussionAlternative(url,button,'like','Веќе имате оставено допаѓање на дискусијата!')
     190    })
     191    $(document.body).on("click",".button-unlike-discussion-alt",function (){
     192        let button = $(this)
     193        let url = "/api/discussions/unlike/"+ $(this).attr("discussion-id")+"?userId="+ $(this).attr("user-id")
     194        ajaxCallLikeDiscussionAlternative(url,button,'unlike','Немате оставено допаѓање на дискусијата!')
    158195    })
    159196    $(".discussion-type").change(function (){
     
    189226                let movieId=$(button).attr("movie-id")
    190227                if (type==='like') {
    191                     $(button).parent().append("<a class='bottom-heart btn btn-danger button-remove-favourite-list' movie-id=" + movieId + " user-id=" + userId + ">💔</a>")
     228                    $(button).parent().append("<a class='btn btn-danger button-remove-favourite-list' movie-id=" + movieId + " user-id=" + userId + ">💔</a>")
    192229                    console.log("da")
    193230                }
    194231                else{
    195                     $(button).parent().append("<a class='bottom-heart btn btn-success button-add-favourite-list' movie-id=" + movieId + " user-id=" + userId + ">❤</a>")
    196 
    197                 }
     232                    $(button).parent().append("<a class='btn btn-success button-add-favourite-list' movie-id=" + movieId + " user-id=" + userId + ">❤</a>")
     233                }
     234                likes_count = $("#movie_likes_count")
     235                count = Number($(likes_count).text())
     236                if(type==="like")
     237                    count++
     238                else
     239                    count--
     240                likes_count.text(count)
    198241                $(button).remove()
    199242            }
     
    263306
    264307
     308
     309
     310function ajaxCallLikeDiscussion(url,button,type,message){
     311    $.ajax({
     312        url:url,
     313        success:function (data){
     314            if (data){
     315                let el = $(button).parent().siblings().eq(3)
     316                console.log(el)
     317                if (type=="like") {
     318                    $(el).html(parseInt($(el).text()) + 1)
     319                    console.log("da")
     320                }
     321                else
     322                    $(el).html(parseInt($(el).text()) - 1)
     323                $(button).css("display","none")
     324                let userId = $(button).attr("user-id")
     325                let discussionId=$(button).attr("discussion-id")
     326                if (type==='like') {
     327                    $(button).parent().append("<a class='btn btn-danger button-unlike-discussion' discussion-id=" + discussionId + " user-id=" + userId + ">💔</a>")
     328                    console.log("da")
     329                }
     330                else{
     331                    $(button).parent().append("<a class='btn btn-success button-like-discussion' discussion-id=" + discussionId + " user-id=" + userId + ">❤</a>")
     332                }
     333                var likes_count = $("#likes_count")
     334                var count = Number($(likes_count).text())
     335                if(type==='like')
     336                    count += 1
     337                else
     338                    count -= 1
     339                $(likes_count).text(count);
     340                $(button).remove()
     341            }
     342            else {
     343                $(button).parent().append("<div>" + message +" <button class='button-confirm'>Ок</button></div>")
     344            }
     345        }
     346    })
     347}
     348
     349
     350
     351function ajaxCallLikeDiscussionAlternative(url,button,type,message){
     352    $.ajax({
     353        url:url,
     354        success:function (data){
     355            if (data){
     356                let el = $(button).parent().siblings().eq(3)
     357                console.log(el)
     358                if (type=="like") {
     359                    $(el).html(parseInt($(el).text()) + 1)
     360                    console.log("da")
     361                }
     362                else
     363                    $(el).html(parseInt($(el).text()) - 1)
     364                $(button).css("display","none")
     365                let userId = $(button).attr("user-id")
     366                let discussionId=$(button).attr("discussion-id")
     367                if (type==='like') {
     368                    $(button).parent().append("<a class='btn btn-danger button-unlike-discussion-alt' discussion-id=" + discussionId + " user-id=" + userId + ">💔</a>")
     369                    console.log("da")
     370                }
     371                else{
     372                    $(button).parent().append("<a class='btn btn-success button-like-discussion-alt' discussion-id=" + discussionId + " user-id=" + userId + ">❤</a>")
     373                }
     374                var likes_count = $(button).parent().siblings(".likes_count").first()
     375                var count = Number(likes_count.text())
     376                if(type==='like')
     377                    count += 1
     378                else
     379                    count -= 1
     380                $(likes_count).text(count);
     381                $(button).remove()
     382            }
     383            else {
     384                $(button).parent().append("<div>" + message +" <button class='button-confirm'>Ок</button></div>")
     385            }
     386        }
     387    })
     388}
     389
     390
    265391function  ajaxCallRating(url,button,type){
    266392    model = {
  • src/main/resources/templates/discussion.html

    r3c0f9a9 rc02189f  
    11<div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
    22    <div style="width: 85%; text-align: justify; margin: auto; clear: both">
    3         <div>
    4             <h1 th:text="${disc.getTitle()}" style="width: 80%; float: left"></h1>
     3        <div style="background-color: rgba(128,128,128, 0.2); border-radius: 20px; padding: 20px">
     4            <h1 th:text="${disc.getTitle()}" style="width: 80%; display: inline; height: fit-content; clear: both"></h1>
    55        </div>
    6         <hr><br><br>
     6        <hr>
    77        <div>
    88            <h5 th:text="${disc.getText()}" style="width: 90%; margin: auto; background-color: lightblue; border-radius: 4px; padding: 20px"></h5>
    99        </div>
    10         <br><br><br>
     10        <br>
     11        <h4>
     12            <span th:if="${!disc.getUser().equals(user)}" sec:authorize="isAuthenticated()">
     13                <a class='btn btn-success button-like-discussion' th:if="${!likedDiscussions.contains(disc)}" th:discussion-id="${disc.getDiscussionId()}" th:user-id="${user.getUserId()}" >❤</a>
     14                <a class='btn btn-danger button-unlike-discussion' th:if="${likedDiscussions.contains(disc)}" th:discussion-id="${disc.getDiscussionId()}" th:user-id="${user.getUserId()}" >💔</a>
     15            </span>
     16            <span>Број на допаѓања:</span>
     17            <span th:text="${likes}" id="likes_count"></span>
     18        </h4>
     19        <br>
    1120        <h6 style="width: 60%; float:left;">
    1221            <span th:text="${'Поставено од: '+disc.getUser().getUsername()}"></span>
     
    1726        </h6>
    1827        <div style="float: right"  sec:authorize="isAuthenticated()">
    19         <a th:if="${disc.getUser().equals(user)}" class="btn btn-warning" th:href="@{'/discussions/add/{id}' (id=${disc.getDiscussionId()})}">Промени</a>
    20         <a th:if="${disc.getUser().equals(user)}" class="btn btn-danger button-delete-discussion" th:discussion-id="${disc.getDiscussionId()}">Избриши</a>
    21         <a class="btn btn-success" th:href="@{'/replies/add/{discussionId}' (discussionId=${disc.getDiscussionId()})}">Реплицирај</a>
    22         </div>
     28            <a th:if="${disc.getUser().equals(user)}" class="btn btn-warning" th:href="@{'/discussions/add/{id}' (id=${disc.getDiscussionId()})}">Промени</a>
     29            <a th:if="${disc.getUser().equals(user)}" class="btn btn-danger button-delete-discussion" th:discussion-id="${disc.getDiscussionId()}">Избриши</a>
     30            <a class="btn btn-success" th:href="@{'/replies/add/{discussionId}' (discussionId=${disc.getDiscussionId()})}">Реплицирај</a>
     31
     32        </div><br>
    2333    </div>
    2434    <table class="table table-striped" style="width: 70%; margin: auto;">
  • src/main/resources/templates/discussionsList.html

    r3c0f9a9 rc02189f  
    44    </div>
    55    <div class="container mb-4">
    6         <div class="row">
    76            <div class="col-12" th:if="${discussions.size() > 0}">
    87                <div class="table-responsive">
     
    109                        <thead>
    1110                        <tr>
     11                            <th scope="col">За</th>
    1212                            <th scope="col">Наслов</th>
    13                             <th scope="col">Опис</th>
     13                            <th scope="col">Допаѓања</th>
    1414                            <th scope="col">Датум</th>
    1515                            <th scope="col">Корисник</th>
     
    2727                        <tbody>
    2828                        <tr th:each="disc : ${discussions}" class="movie">
    29                             <td th:text="${disc.getMovie() != null ? disc.getMovie().getTitle() : disc.getPerson().getName() + ' ' + disc.getPerson().getSurname()}"></td>
     29                            <td th:text="${disc.getMovie() != null ? 'Филмот ' + disc.getMovie().getTitle() : 'Актерот ' + disc.getPerson().getName() + ' ' + disc.getPerson().getSurname()}"></td>
    3030                            <td>
    3131                                <a th:text="${disc.getTitle()}" th:href="@{'/discussions/{id}' (id=${disc.getDiscussionId()})}"></a>
    3232                            </td>
    33                             <td th:text="${disc.getText()}"></td>
     33                            <td th:each="like : ${likes}" th:if="${like.getDiscussionId().equals(disc.getDiscussionId())}" th:text="${like.getLikes()}" class="likes_count">
     34                            </td>
    3435                            <td th:text="${disc.getDate()}"></td>
    3536                            <td th:text="${disc.getUser().getUsername()}"></td>
     
    4041                            <td th:if="${!disc.getUser().equals(user)}"><a class="btn btn-success" th:href="@{'/replies/add/{discussionId}' (discussionId=${disc.getDiscussionId()})}">Реплицирај</a> </td>
    4142                            <td th:if="${!disc.getUser().equals(user)}">
    42                                 <a class="btn btn-success">👍 </a>
    43                                 <a class="btn btn-danger">👎</a>
     43                                <a class='btn btn-success button-like-discussion-alt' th:if="${!likedDiscussions.contains(disc)}" th:discussion-id="${disc.getDiscussionId()}" th:user-id="${user.getUserId()}" >❤</a>
     44                                <a class='btn btn-danger button-unlike-discussion-alt' th:if="${likedDiscussions.contains(disc)}" th:discussion-id="${disc.getDiscussionId()}" th:user-id="${user.getUserId()}" >💔</a>
    4445                            </td>
    4546                            </th:block>
    46 
    4747
    4848                        </tr>
     
    5151                </div>
    5252            </div>
    53         </div>
    5453    </div>
    5554
  • src/main/resources/templates/fragments/header.html

    r3c0f9a9 rc02189f  
    22    <nav class="navbar navbar-expand-md navbar-dark bg-dark">
    33        <div class="container">
    4             <a class="navbar-brand" href="/movies">Форум за филмови</a>
    54            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault"
    65                    aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
     
    2827                    </li>
    2928                </ul>
    30                 <form class="form-inline my-2 my-lg-0">
     29                <form class="form-inline my-2 my-lg-0 hidden">
    3130                    <div class="input-group input-group-sm">
    3231                        <input type="text" class="form-control" aria-label="Small"
  • src/main/resources/templates/fragments/searchBarGenre.html

    r3c0f9a9 rc02189f  
    1 <div>
    2       <label for="searchGenre" style="width: 150px;">Пребарај по жанр</label>
    3         <input id="searchGenre" type="text" placeholder="жанр">
    4         <button class="search-button">Пребарај</button>
     1<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" style="width:60%; margin: auto; margin-bottom: 10px">
     2        <select th:if="${genres!=null}" id="searchGenre" class="form-control" style="float: left; display: block; width: 50%">
     3            <option value="" selected>Сите</option>
     4            <option th:each="genre: ${genres}" th:value="${genre.getGenreType()}" th:text="${genre.getGenreType()}"></option>
     5        </select>
     6        <div class="input-group-append" style="width: 40%">
     7            <button class="btn btn-secondary  search-button" style="width: 100%">Филтрирај по жанр</button>
     8        </div>
    59</div>
  • src/main/resources/templates/fragments/searchBarName.html

    r3c0f9a9 rc02189f  
    1 <div>
    2     <label for="searchTitle" style="width: 150px;">Прабарај по име</label>
    3     <input id="searchTitle" type="text" placeholder="име">
    4     <button class="search-button-title">Пребарај</button>
     1<div style="width:60%; margin: auto;">
     2    <input id="searchTitle" class="form-control" style="float: left; display: block; width: 50%" type="text" placeholder="...">
     3
     4    <div class="input-group-append" style="width: 40%">
     5        <button class="btn btn-secondary search-button-title" style="width: 100%">Филтрирај по Наслов</button>
     6    </div>
     7
    58</div>
  • src/main/resources/templates/movieShow.html

    r3c0f9a9 rc02189f  
    1313<div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml" style="width: 80%; margin: auto">
    1414    <div>
    15         <div style="width: 30%; margin-right: 10px; padding:20px; border-right: 3px solid black; border-radius: 10px; float:left">
    16             <img th:src="${movie.getImageUrl()}" style="width: 90%; height: auto">
     15        <div style="width: 30%; margin-right: 10px; padding:20px; border-right: 3px solid black; border-radius: 10px; float:left" id="image-movie-section">
     16            <img th:src="${movie.getImageUrl()}" style="width: 90%; height: auto; clear: both; margin-bottom: 20px">
     17            <div id="admin-buttons">
     18                <a class="btn btn-primary" th:href="@{'/discussions/all/{id}?type=M' (id=${movie.getMovieId()})}" >Прегледај дискусии</a>
     19                <th:block sec:authorize="isAuthenticated()" >
     20                    <div>
     21                        <a class="btn btn-success button-add-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${!likedMovies.contains(movie)}">❤</a>
     22                        <a class="btn btn-danger button-remove-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${likedMovies.contains(movie)}">💔</a>
     23                    </div>
     24                    <a class="btn btn-secondary button-add-grade-movie" th:movie-id="${movie.getMovieId()}">Остави оценка</a>
     25                    <a class="btn btn-warning" th:href="@{'/movies/{id}/edit' (id=${movie.getMovieId()})}">Промени</a>
     26                    <a class="btn btn-danger button-delete-movie" th:movie-id="${movie.getMovieId()}">Избриши филм</a>
     27                </th:block>
     28            </div>
    1729        </div>
    1830
     
    2638            </h3>
    2739            <h3 th:text="${'IMDB оцена: ' + movie.getImdbRating()}"></h3>
    28             <h3 th:text="${'Прикажан на: ' + movie.getAiringDate()}"></h3>
     40            <h3 th:text="${'Прикажан на: ' + movie.getDateFormatted()}"></h3>
    2941
    3042            <div style="background-color: rgba(200,200,200,0.5); border-radius: 10px; padding:15px; ">
     
    3345            </div>
    3446
    35             <div>
     47            <div id="likes-showcase">
     48                <h4 style="text-align: center">
     49                    <span>Филмот му се допаднал на </span>
     50                    <strong th:text="${likes}" id="movie_likes_count"></strong>
     51                    <span> корисници</span>
     52                </h4>
     53            </div>
     54
     55            <div class="person-movies-list genres-listing">
    3656                <h3>Жанрови:</h3>
    3757                <ul>
     
    3959                </ul>
    4060            </div>
    41             <div>
     61            <div class="person-movies-list">
    4262                <h3>Актери:</h3>
    4363                <ul>
     
    4868        </div>
    4969    </div>
    50     <div id="admin-buttons">
    51         <a class="btn btn-primary" th:href="@{'/discussions/all/{id}?type=M' (id=${movie.getMovieId()})}" >Прегледај дискусии</a>
    52         <th:block sec:authorize="isAuthenticated()" >
    53             <a class="btn btn-success button-add-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${!likedMovies.contains(movie)}">Додади во омилена листа</a>
    54             <a class="btn btn-warning button-remove-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${likedMovies.contains(movie)}">Избриши од омилена листа</a>
    55             <a class="btn btn-success button-add-grade-movie" th:movie-id="${movie.getMovieId()}">Остави оценка</a>
    56             <a class="btn btn-warning" th:href="@{'/movies/{id}/edit' (id=${movie.getMovieId()})}">Промени</a>
    57             <a class="btn btn-danger button-delete-movie" th:movie-id="${movie.getMovieId()}">Избриши филм</a>
    58         </th:block>
    59     </div>
     70
    6071    <hr>
    6172    <div style="width: 45%; margin: 25px; float:left; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
     
    7081                </div>
    7182                <div style="width: 30%; float:right; background-color: darkorange; border-radius: 10px 30px; color: whitesmoke; padding: 10px;">
    72                     <h2 style="text-align: center">Rated:</h2>
    73                     <p th:text="${rating.getStarsRated() + ' out of 10 stars'}" style="text-align: center"></p>
     83                    <h2 style="text-align: center">Оценет:</h2>
     84                    <p th:text="${rating.getStarsRated() + ' од 10'}" style="text-align: center"></p>
    7485                </div>
    7586        </div>
     
    7788    <div style="width: 45%; margin: 25px; float:left; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
    7889        <h2>
    79             <span>Бројот на лајкови кои филмот ги добил:</span>
    80             <span th:text="${movie.getLikes().size()}"></span>
     90            <span>Лајковите кои филмот ги добил:</span>
    8191        </h2>
    8292        <hr>
  • src/main/resources/templates/moviesList.html

    r3c0f9a9 rc02189f  
    22
    33    <div style="width: 70%; margin: auto">
    4         <div th:replace="fragments/searchBarName"></div>
     4        <div th:replace="fragments/searchBarName"></div><br>
    55        <div th:replace="fragments/searchBarGenre"></div>
    66    </div>
  • src/main/resources/templates/moviesListPaged.html

    r3c0f9a9 rc02189f  
    11<div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
    2 
    3     <div style="width: 70%; margin: auto">
    4         <div th:replace="fragments/searchBarName"></div>
    5         <div th:replace="fragments/searchBarGenre"></div>
    6 
     2    <div style="margin:auto; width: 60%">
     3        <div style="width: 30%; margin: auto; height: 100%; margin-bottom: 10px">
     4            <a class="btn btn-outline-dark" style="height: 100%; width: 100%; font-size: 125%" id="button_toggle_filters">Прикажи филтрирање</a>
     5        </div>
     6        <div style="width: 100%; margin: auto; transition: 200ms" id="filters_div" class="invisible-search">
     7            <div th:replace="fragments/searchBarName"></div><br>
     8            <div th:replace="fragments/searchBarGenre"></div>
     9        </div>
    710    </div>
    8 
    911    <div id="paging-section">
    1012        <div id="inner-paging" class="input-group">
     
    2527            </div>
    2628        </div>
    27     </div><br><br><br>
     29    </div><br>
    2830
    2931    <div class="container mb-4">
     
    3436        <div class="row" th:each="row: ${movie_rows}" >
    3537            <div class="col-md-3 elements" th:each="movie: ${row}" >
     38                <span th:each="genre: ${movie.getGenres()}"  th:text="${genre?.getGenre()?.getGenreType()}" hidden class="card-genre"></span>
    3639                    <div class="card-body card bg-image" th:style="'background:url(' + ${movie.getImageUrl()} + ') no-repeat center #eee;'">
    3740                        <a class="card-text-center" style="color: white" th:href="@{'/movies/{id}' (id=${movie.getMovieId()})}" >
    3841                        <h3 class="card-title title" th:text="${movie.getTitle()}"></h3>
    3942                            <span th:each="genre: ${movie.getGenres()}"  th:text="${genre?.getGenre()?.getGenreType()}" hidden class="card-genre"></span>
    40 
    4143                        </a>
    42                         <h3 class="card-text bottom" th:text="${'Rated '+movie.getImdbRating()}"></h3>
     44                        <span class="card-text bottom">
     45                            <h3 th:text="${'Оценет '+movie.getImdbRating() + '/10'}"></h3>
     46                        </span>
    4347                        <th:block sec:authorize="isAuthenticated()">
    4448                            <a class="bottom-heart btn btn-success button-add-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${!likedMovies.contains(movie)}">❤</a>
  • src/main/resources/templates/personShow.html

    r3c0f9a9 rc02189f  
    11
    2 <div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml" style="width: 80%; margin: auto">
    3     <div>
    4 
     2<div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml" style="width: 70%; margin: auto">
     3    <div style="clear: both; margin-bottom: 10px; display:  inline-block">
    54        <div style="width: 60%; margin-left: 10px; padding:20px; float:left">
    65            <h1 th:text="${person.getName() + ' ' + person.getSurname()}" style="text-align: center; padding:10px; background-color: rgba(64,64,64,0.5); color:white; border-radius: 10px 0px"></h1>
    76            <hr>
    8             <h3 th:text="${'Born on: ' + person.getDateOfBirth()}"></h3>
     7            <h3 th:text="${'Роден на: ' + person.getDateFormatted()}"></h3>
    98            <div style="background-color: rgba(200,200,200,0.5); border-radius: 10px; padding:15px; ">
    10                 <h3>Description:</h3>
     9                <h3>Краток Опис:</h3>
    1110                <p th:text="${person.getDescription()}" style="text-align: justify"></p>
    1211            </div>
    1312
    14             <div th:if="${person.getType() == 'D'}">
    15                 <h3 >Directed movies:</h3>
     13            <div th:if="${person.getType().toString().contains('D')}" class="person-movies-list">
     14                <h3 >Режисирани филмови:</h3>
     15                <hr>
    1616                <ul>
    17                     <li th:each="movie: ${actor.getMovies()}"><a th:text="${movie.getTitle()}" th:href="@{'/movies/{id}' (id=${movie.getMovieId()})}" ></a></li>
     17                    <li th:each="movie: ${person.getMovies()}"><a th:text="${movie.getTitle()}" th:href="@{'/movies/{id}' (id=${movie.getMovieId()})}" ></a></li>
    1818                </ul>
    1919            </div>
    20             <div th:if="${person.getType() == 'A'}">
    21                 <h3 >Acted in movies:</h3>
     20            <div th:if="${person.getType().toString().contains('A')}" class="person-movies-list">
     21                <h3 >Се појавува во филмовите:</h3>
     22                <hr>
    2223                <ul>
    23                     <li th:each="movie: ${actor.getMovieActors()}" ><a th:text="${movie.getMovie().getTitle()}" th:href="@{'/movies/{id}' (id=${movie.getMovie().getMovieId()})}" ></a></li>
     24                    <li th:each="movie: ${person.getMovieActors()}" ><a th:text="${movie.getMovie().getTitle()}" th:href="@{'/movies/{id}' (id=${movie.getMovie().getMovieId()})}" ></a></li>
    2425                </ul>
    2526            </div>
    26 
    2727        </div>
    28         <div style="width: 30%; margin-left: 10px; padding:20px; border-left: 3px solid black; border-radius: 10px; float:left">
     28        <div style="width: 30%; margin-left: 10px; padding:20px; border-left: 3px solid black; border-radius: 10px; float:right">
    2929            <img th:src="${person.getImageUrl()}" style="width: 90%; height: auto">
    3030        </div>
    3131    </div>
    32     <div style="width: 45%; margin: 25px; float:left; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
     32    <br>
     33    <div style="clear:both; display: inline-block; width: 100%; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
    3334        <h2>
    34             <span>Бројот на оцени кои филмот ги добил:</span>
    35             <span th:text="${movie.getRates().size()}"></span>
     35            <span>Бројот на оцени кои личноста ги има добиено:</span>
     36            <span th:text="${person.getPersonRates().size()}"></span>
    3637        </h2>
    3738        <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 th:each="rating: ${person.getPersonRates()}" style="margin-bottom: 10px; border: 2px solid gray; border-radius: 10px; background-color: lightblue; padding: 10px; border-radius: 10px; min-height: 130px;">
    3940            <div style="width: 60%; float:left;">
    4041                <p th:text="${rating.getReason()}" style="text-align: justify"></p>
    4142            </div>
    4243            <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>
     44                <h2 style="text-align: center">Оценет со :</h2>
     45                <p th:text="${rating.getStarsRated() + ' од 10'}" style="text-align: center"></p>
    4546            </div>
    4647        </div>
    4748    </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>
     49
    6350</div>
  • src/main/resources/templates/personsList.html

    r3c0f9a9 rc02189f  
    55    </div>
    66    <div class="container mb-4">
    7         <div class="row">
    87            <div class="col-12" th:if="${persons.size() > 0}">
    98                <div class="table-responsive">
     
    4746                            <th:block sec:authorize="isAuthenticated()">
    4847                                <td>
    49                                     <a class="btn btn-primary button-add-grade-person" th:person-id="${person.getPersonId()}">Остави оценка</a>
     48                                    <a class="btn btn-secondary button-add-grade-person" th:person-id="${person.getPersonId()}">Остави оценка</a>
    5049
    5150                                </td>
    5251                            <td>
    53                                 <a class="btn btn-primary" th:href="@{'persons/edit/{personId}' (personId = ${person.getPersonId()})}">Промени</a>
     52                                <a class="btn btn-warning" th:href="@{'persons/edit/{personId}' (personId = ${person.getPersonId()})}">Промени</a>
    5453                            </td>
    5554                            <td>
    56                                 <a class="btn btn-primary button-delete-actor" th:person-id="${person.getPersonId()}">Избриши</a>
     55                                <a class="btn btn-danger button-delete-actor" th:person-id="${person.getPersonId()}">Избриши</a>
    5756
    5857                            </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>
    6858
    6959
     
    7565                </div>
    7666            </div>
    77         </div>
    7867    </div>
    7968
  • src/main/resources/templates/template.html

    r3c0f9a9 rc02189f  
    1616</head>
    1717<body>
    18 <section class="jumbotron text-center">
    19     <div class="container">
    20         <!--<img th:src="@{/img/logo.png}" style="opacity: 0.3; z-index: 5; position: absolute; margin: auto; height: 225px; width: auto; left: 42%; top: 2%">-->
    21         <h1 class="jumbotron-heading" style="z-index: -1">weDiscussMovies</h1>
     18<section class="jumbotron text-center" style="background: url('/img/cover.jpg') center; background-repeat: no-repeat; background-size: 100% auto; height: 280px; margin-bottom: 0px ">
     19    <div class="container" >
     20        <h1 class="jumbotron-heading" style="z-index: -1"></h1>
    2221    </div>
    2322</section>
  • target/classes/static/css/shared.css

    r3c0f9a9 rc02189f  
    5252.bottom{
    5353    position: absolute;
    54     top: 80%;
     54    top: 75%;
    5555    margin:auto;
    5656    width: 100%;
     
    6060    background-color: rgba(0,0,0,0.25);
    6161}
    62 
    63 
    64 .bottom-heart{
     62.bottom h3, .bottom span{
     63    margin-bottom: 0px;
     64    margin-top: 0px;
     65}
     66.bottom span{
     67    font-size: 75%;
     68    margin-top: 5px;
     69}
     70
     71
     72.elements .card .btn{
    6573    top: 60%;
    6674    left: auto;
     
    105113    opacity: 0;
    106114}
     115
     116.person-movies-list{
     117    margin: auto;
     118    margin-top: 20px;
     119    padding: 10px;
     120    width: 80%;
     121    background-color: rgba(52, 58, 64, 0.7);
     122    border-radius: 10px;
     123    transition: 200ms;
     124    color: white;
     125}
     126
     127.person-movies-list:hover{
     128    background-color: rgba(52, 58, 64, 1);
     129}
     130
     131.person-movies-list ul{
     132    list-style-type: none;
     133}
     134
     135.person-movies-list ul li{
     136    color:black;
     137    background-color: rgba(255,255,255,0.7);
     138    padding: 12px;
     139    font-size: 120%;
     140    width: 80%;
     141    text-align: center;
     142    margin: auto;
     143    transition: 200ms;
     144    border-radius: 10px;
     145    margin-bottom: 5px;
     146    text-decoration: underline;
     147}
     148
     149.person-movies-list hr{
     150    color: white;
     151    background-color: white;
     152    border-color: white;
     153}
     154
     155.person-movies-list ul li:hover{
     156    background-color: rgba(255,255,255,1);
     157    text-decoration-color: blue;
     158}
     159
     160.genres-listing ul li:hover{
     161    background-color: rgba(222,128,128,1);
     162}
     163
     164.genres-listing ul li{
     165    background-color: rgba(192,128,128,0.7);
     166    text-decoration: none !important;
     167}
     168
     169.person-movies-list ul li a{
     170    color: black;
     171    transition: 250ms;
     172    text-decoration: underline;
     173    text-decoration-color: black;
     174}
     175
     176.person-movies-list ul li a:hover{
     177    color:blue;
     178}
     179
     180
     181#admin-buttons a{
     182    display: inline-block;
     183    width: 95%;
     184    margin: auto;
     185    margin-top: 10px;
     186    font-size: 125%;
     187    clear: both;
     188}
     189
     190#image-movie-section{
     191    height: fit-content;
     192    min-height: fit-content;
     193}
     194
     195#likes-showcase{
     196    background-color: rgba(192,128,128,0.7);
     197    border-radius: 10px;
     198    padding:10px;
     199    width: 60%;
     200    margin: auto;
     201    transition: 200ms;
     202    margin-top: 2%;
     203}
     204
     205#likes-showcase strong{
     206    font-size: 150%;
     207}
     208
     209#likes-showcase:hover{
     210    background-color: rgba(222,128,128,1);
     211}
     212
     213.invisible-search{
     214    display: none;
     215}
  • target/classes/static/js/sharedScript.js

    r3c0f9a9 rc02189f  
    44    var elements = $(".elements")
    55    var elementGrade;
    6 
     6    var first_time = true;
    77
    88    $("#button-add").on("click", function (){
     
    5656    $(".button-add-grade-movie").on("click",function (){
    5757        elementGrade = $(this)
    58         urlRating ="api/movies/grade/"+$(this).attr("movie-id")
     58        urlRating ="/api/movies/grade/"+$(this).attr("movie-id")
    5959        $("#dialog-rating").dialog("open")
    6060    })
    6161    $(".button-add-grade-person").on("click",function (){
    6262        elementGrade = $(this)
    63         urlRating ="api/persons/grade/"+$(this).attr("person-id")
     63        urlRating ="/api/persons/grade/"+$(this).attr("person-id")
    6464        $("#dialog-rating").dialog("open")
    6565    })
     
    8181    })*/
    8282
     83    $("#button_toggle_filters").on("click", function (){
     84        if(first_time){
     85            $("#filters_div").removeClass("invisible-search")
     86            first_time=false
     87        }
     88        else
     89            $("#filters_div").fadeToggle();
     90    })
    8391
    8492   $(".search-button").on("click",function () {
    85         let filter = $("#searchGenre").val()
     93       elements = $(".elements")
     94       let filter = $("#searchGenre").val()
     95       console.log('\''+filter+'\'')
     96       console.log(elements)
     97       if(filter.length==0){
     98           console.log("HERE")
     99           for (let item of elements) {
     100               $(item).removeClass("visibility")
     101           }
     102       }
    86103       for (let item of elements) {
    87             let genre = $(item).find(".card-genre")
     104           $(item).removeClass("visibility")
     105            let genre = $(item).children(".card-genre")
    88106            let visible = false;
    89 
     107            console.log(genre.length)
    90108            for (let g of genre) {
    91 
    92                 if (( $(g).text().toLowerCase() === filter.toLowerCase() && !$(g).hasClass("visibility") && filter.trim().length != 0)) {
     109                if (( $(g).text().toLowerCase() === filter.toLowerCase())){
     110                    console.log(item.text + ' ' + $(g).text())
    93111                    visible = true
    94112                    $(item).removeClass("visibility")
     
    96114                }
    97115            }
    98             if (!visible && filter.trim().length != 0)
     116            if(!visible){
    99117                $(item).addClass("visibility")
    100             else
    101                 $(item).removeClass("visibility")
     118            }
    102119
    103120        }
     
    106123    $(".button-delete-movie").on("click",function (){
    107124        let button = $(this)
    108         let url = "api/movies/delete/" + $(button).attr("movie-id")
     125        let url = "/api/movies/delete/" + $(button).attr("movie-id")
    109126        ajaxCallDelete(url,button)
    110127    })
    111128    $(".button-delete-actor").on("click",function (){
    112129        let button = $(this)
    113         let url  = "api/persons/delete/" + $(button).attr("person-id")
     130        let url  = "/api/persons/delete/" + $(button).attr("person-id")
    114131        ajaxCallDelete(url,button)
    115132    })
    116133    $(".button-delete-discussion").on("click",function (){
    117134        let button = $(this)
    118         let url = "api/discussions/delete/" + $(button).attr("discussion-id")
     135        let url = "/api/discussions/delete/" + $(button).attr("discussion-id")
    119136        ajaxCallDelete(url,button)
    120137    })
     
    139156    $(document.body).on("click",".button-add-favourite-list",function (){
    140157        let button = $(this)
    141         let url = "api/movies/like/"+ $(this).attr("movie-id") + "?userId="+ $(this).attr("user-id")
     158        let url = "/api/movies/like/"+ $(this).attr("movie-id") + "?userId="+ $(this).attr("user-id")
    142159        ajaxCallLike(url,button,'like','Веќе е филмот допаднат!')
    143160    })
    144161    $(document.body).on("click",".button-remove-favourite-list",function (){
    145162        let button = $(this)
    146         let url = "api/movies/unlike/"+ $(this).attr("movie-id")+"?userId="+ $(this).attr("user-id")
     163        let url = "/api/movies/unlike/"+ $(this).attr("movie-id")+"?userId="+ $(this).attr("user-id")
    147164        ajaxCallLike(url,button,'unlike','Немате оставено допаѓање на филмот!')
    148165    })
    149166    $(document.body).on("click",".button-add-genre-liked-list",function (){
    150167        let button = $(this)
    151         let url = "api/genres/like/"+ $(this).attr("genre-id") + "?userId="+ $(this).attr("user-id")
     168        let url = "/api/genres/like/"+ $(this).attr("genre-id") + "?userId="+ $(this).attr("user-id")
    152169        ajaxCallLikeGenre(url,button,'like','Веќе ви се допаѓа жанрот!')
    153170    })
    154171    $(document.body).on("click",".button-remove-genre-liked-list",function (){
    155172        let button = $(this)
    156         let url = "api/genres/unlike/"+ $(this).attr("genre-id")+"?userId="+ $(this).attr("user-id")
     173        let url = "/api/genres/unlike/"+ $(this).attr("genre-id")+"?userId="+ $(this).attr("user-id")
    157174        ajaxCallLikeGenre(url,button,'unlike','Немате оставено допаѓање на жанрот!')
     175    })
     176    $(document.body).on("click",".button-like-discussion",function (){
     177        let button = $(this)
     178        let url = "/api/discussions/like/"+ $(this).attr("discussion-id")+"?userId="+ $(this).attr("user-id")
     179        ajaxCallLikeDiscussion(url,button,'like','Веќе имате оставено допаѓање на дискусијата!')
     180    })
     181    $(document.body).on("click",".button-unlike-discussion",function (){
     182        let button = $(this)
     183        let url = "/api/discussions/unlike/"+ $(this).attr("discussion-id")+"?userId="+ $(this).attr("user-id")
     184        ajaxCallLikeDiscussion(url,button,'unlike','Немате оставено допаѓање на дискусијата!')
     185    })
     186    $(document.body).on("click",".button-like-discussion-alt",function (){
     187        let button = $(this)
     188        let url = "/api/discussions/like/"+ $(this).attr("discussion-id")+"?userId="+ $(this).attr("user-id")
     189        ajaxCallLikeDiscussionAlternative(url,button,'like','Веќе имате оставено допаѓање на дискусијата!')
     190    })
     191    $(document.body).on("click",".button-unlike-discussion-alt",function (){
     192        let button = $(this)
     193        let url = "/api/discussions/unlike/"+ $(this).attr("discussion-id")+"?userId="+ $(this).attr("user-id")
     194        ajaxCallLikeDiscussionAlternative(url,button,'unlike','Немате оставено допаѓање на дискусијата!')
    158195    })
    159196    $(".discussion-type").change(function (){
     
    189226                let movieId=$(button).attr("movie-id")
    190227                if (type==='like') {
    191                     $(button).parent().append("<a class='bottom-heart btn btn-danger button-remove-favourite-list' movie-id=" + movieId + " user-id=" + userId + ">💔</a>")
     228                    $(button).parent().append("<a class='btn btn-danger button-remove-favourite-list' movie-id=" + movieId + " user-id=" + userId + ">💔</a>")
    192229                    console.log("da")
    193230                }
    194231                else{
    195                     $(button).parent().append("<a class='bottom-heart btn btn-success button-add-favourite-list' movie-id=" + movieId + " user-id=" + userId + ">❤</a>")
    196 
    197                 }
     232                    $(button).parent().append("<a class='btn btn-success button-add-favourite-list' movie-id=" + movieId + " user-id=" + userId + ">❤</a>")
     233                }
     234                likes_count = $("#movie_likes_count")
     235                count = Number($(likes_count).text())
     236                if(type==="like")
     237                    count++
     238                else
     239                    count--
     240                likes_count.text(count)
    198241                $(button).remove()
    199242            }
     
    263306
    264307
     308
     309
     310function ajaxCallLikeDiscussion(url,button,type,message){
     311    $.ajax({
     312        url:url,
     313        success:function (data){
     314            if (data){
     315                let el = $(button).parent().siblings().eq(3)
     316                console.log(el)
     317                if (type=="like") {
     318                    $(el).html(parseInt($(el).text()) + 1)
     319                    console.log("da")
     320                }
     321                else
     322                    $(el).html(parseInt($(el).text()) - 1)
     323                $(button).css("display","none")
     324                let userId = $(button).attr("user-id")
     325                let discussionId=$(button).attr("discussion-id")
     326                if (type==='like') {
     327                    $(button).parent().append("<a class='btn btn-danger button-unlike-discussion' discussion-id=" + discussionId + " user-id=" + userId + ">💔</a>")
     328                    console.log("da")
     329                }
     330                else{
     331                    $(button).parent().append("<a class='btn btn-success button-like-discussion' discussion-id=" + discussionId + " user-id=" + userId + ">❤</a>")
     332                }
     333                var likes_count = $("#likes_count")
     334                var count = Number($(likes_count).text())
     335                if(type==='like')
     336                    count += 1
     337                else
     338                    count -= 1
     339                $(likes_count).text(count);
     340                $(button).remove()
     341            }
     342            else {
     343                $(button).parent().append("<div>" + message +" <button class='button-confirm'>Ок</button></div>")
     344            }
     345        }
     346    })
     347}
     348
     349
     350
     351function ajaxCallLikeDiscussionAlternative(url,button,type,message){
     352    $.ajax({
     353        url:url,
     354        success:function (data){
     355            if (data){
     356                let el = $(button).parent().siblings().eq(3)
     357                console.log(el)
     358                if (type=="like") {
     359                    $(el).html(parseInt($(el).text()) + 1)
     360                    console.log("da")
     361                }
     362                else
     363                    $(el).html(parseInt($(el).text()) - 1)
     364                $(button).css("display","none")
     365                let userId = $(button).attr("user-id")
     366                let discussionId=$(button).attr("discussion-id")
     367                if (type==='like') {
     368                    $(button).parent().append("<a class='btn btn-danger button-unlike-discussion-alt' discussion-id=" + discussionId + " user-id=" + userId + ">💔</a>")
     369                    console.log("da")
     370                }
     371                else{
     372                    $(button).parent().append("<a class='btn btn-success button-like-discussion-alt' discussion-id=" + discussionId + " user-id=" + userId + ">❤</a>")
     373                }
     374                var likes_count = $(button).parent().siblings(".likes_count").first()
     375                var count = Number(likes_count.text())
     376                if(type==='like')
     377                    count += 1
     378                else
     379                    count -= 1
     380                $(likes_count).text(count);
     381                $(button).remove()
     382            }
     383            else {
     384                $(button).parent().append("<div>" + message +" <button class='button-confirm'>Ок</button></div>")
     385            }
     386        }
     387    })
     388}
     389
     390
    265391function  ajaxCallRating(url,button,type){
    266392    model = {
  • target/classes/templates/discussion.html

    r3c0f9a9 rc02189f  
    11<div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
    22    <div style="width: 85%; text-align: justify; margin: auto; clear: both">
    3         <div>
    4             <h1 th:text="${disc.getTitle()}" style="width: 80%; float: left"></h1>
     3        <div style="background-color: rgba(128,128,128, 0.2); border-radius: 20px; padding: 20px">
     4            <h1 th:text="${disc.getTitle()}" style="width: 80%; display: inline; height: fit-content; clear: both"></h1>
    55        </div>
    6         <hr><br><br>
     6        <hr>
    77        <div>
    88            <h5 th:text="${disc.getText()}" style="width: 90%; margin: auto; background-color: lightblue; border-radius: 4px; padding: 20px"></h5>
    99        </div>
    10         <br><br><br>
     10        <br>
     11        <h4>
     12            <span th:if="${!disc.getUser().equals(user)}" sec:authorize="isAuthenticated()">
     13                <a class='btn btn-success button-like-discussion' th:if="${!likedDiscussions.contains(disc)}" th:discussion-id="${disc.getDiscussionId()}" th:user-id="${user.getUserId()}" >❤</a>
     14                <a class='btn btn-danger button-unlike-discussion' th:if="${likedDiscussions.contains(disc)}" th:discussion-id="${disc.getDiscussionId()}" th:user-id="${user.getUserId()}" >💔</a>
     15            </span>
     16            <span>Број на допаѓања:</span>
     17            <span th:text="${likes}" id="likes_count"></span>
     18        </h4>
     19        <br>
    1120        <h6 style="width: 60%; float:left;">
    1221            <span th:text="${'Поставено од: '+disc.getUser().getUsername()}"></span>
     
    1726        </h6>
    1827        <div style="float: right"  sec:authorize="isAuthenticated()">
    19         <a th:if="${disc.getUser().equals(user)}" class="btn btn-warning" th:href="@{'/discussions/add/{id}' (id=${disc.getDiscussionId()})}">Промени</a>
    20         <a th:if="${disc.getUser().equals(user)}" class="btn btn-danger button-delete-discussion" th:discussion-id="${disc.getDiscussionId()}">Избриши</a>
    21         <a class="btn btn-success" th:href="@{'/replies/add/{discussionId}' (discussionId=${disc.getDiscussionId()})}">Реплицирај</a>
    22         </div>
     28            <a th:if="${disc.getUser().equals(user)}" class="btn btn-warning" th:href="@{'/discussions/add/{id}' (id=${disc.getDiscussionId()})}">Промени</a>
     29            <a th:if="${disc.getUser().equals(user)}" class="btn btn-danger button-delete-discussion" th:discussion-id="${disc.getDiscussionId()}">Избриши</a>
     30            <a class="btn btn-success" th:href="@{'/replies/add/{discussionId}' (discussionId=${disc.getDiscussionId()})}">Реплицирај</a>
     31
     32        </div><br>
    2333    </div>
    2434    <table class="table table-striped" style="width: 70%; margin: auto;">
  • target/classes/templates/discussionsList.html

    r3c0f9a9 rc02189f  
    44    </div>
    55    <div class="container mb-4">
    6         <div class="row">
    76            <div class="col-12" th:if="${discussions.size() > 0}">
    87                <div class="table-responsive">
     
    109                        <thead>
    1110                        <tr>
     11                            <th scope="col">За</th>
    1212                            <th scope="col">Наслов</th>
    13                             <th scope="col">Опис</th>
     13                            <th scope="col">Допаѓања</th>
    1414                            <th scope="col">Датум</th>
    1515                            <th scope="col">Корисник</th>
     
    2727                        <tbody>
    2828                        <tr th:each="disc : ${discussions}" class="movie">
    29                             <td th:text="${disc.getMovie() != null ? disc.getMovie().getTitle() : disc.getPerson().getName() + ' ' + disc.getPerson().getSurname()}"></td>
     29                            <td th:text="${disc.getMovie() != null ? 'Филмот ' + disc.getMovie().getTitle() : 'Актерот ' + disc.getPerson().getName() + ' ' + disc.getPerson().getSurname()}"></td>
    3030                            <td>
    3131                                <a th:text="${disc.getTitle()}" th:href="@{'/discussions/{id}' (id=${disc.getDiscussionId()})}"></a>
    3232                            </td>
    33                             <td th:text="${disc.getText()}"></td>
     33                            <td th:each="like : ${likes}" th:if="${like.getDiscussionId().equals(disc.getDiscussionId())}" th:text="${like.getLikes()}" class="likes_count">
     34                            </td>
    3435                            <td th:text="${disc.getDate()}"></td>
    3536                            <td th:text="${disc.getUser().getUsername()}"></td>
     
    4041                            <td th:if="${!disc.getUser().equals(user)}"><a class="btn btn-success" th:href="@{'/replies/add/{discussionId}' (discussionId=${disc.getDiscussionId()})}">Реплицирај</a> </td>
    4142                            <td th:if="${!disc.getUser().equals(user)}">
    42                                 <a class="btn btn-success">👍 </a>
    43                                 <a class="btn btn-danger">👎</a>
     43                                <a class='btn btn-success button-like-discussion-alt' th:if="${!likedDiscussions.contains(disc)}" th:discussion-id="${disc.getDiscussionId()}" th:user-id="${user.getUserId()}" >❤</a>
     44                                <a class='btn btn-danger button-unlike-discussion-alt' th:if="${likedDiscussions.contains(disc)}" th:discussion-id="${disc.getDiscussionId()}" th:user-id="${user.getUserId()}" >💔</a>
    4445                            </td>
    4546                            </th:block>
    46 
    4747
    4848                        </tr>
     
    5151                </div>
    5252            </div>
    53         </div>
    5453    </div>
    5554
  • target/classes/templates/fragments/header.html

    r3c0f9a9 rc02189f  
    22    <nav class="navbar navbar-expand-md navbar-dark bg-dark">
    33        <div class="container">
    4             <a class="navbar-brand" href="/movies">Форум за филмови</a>
    54            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault"
    65                    aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
     
    2827                    </li>
    2928                </ul>
    30                 <form class="form-inline my-2 my-lg-0">
     29                <form class="form-inline my-2 my-lg-0 hidden">
    3130                    <div class="input-group input-group-sm">
    3231                        <input type="text" class="form-control" aria-label="Small"
  • target/classes/templates/fragments/searchBarGenre.html

    r3c0f9a9 rc02189f  
    1 <div>
    2       <label for="searchGenre" style="width: 150px;">Пребарај по жанр</label>
    3         <input id="searchGenre" type="text" placeholder="жанр">
    4         <button class="search-button">Пребарај</button>
     1<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" style="width:60%; margin: auto; margin-bottom: 10px">
     2        <select th:if="${genres!=null}" id="searchGenre" class="form-control" style="float: left; display: block; width: 50%">
     3            <option value="" selected>Сите</option>
     4            <option th:each="genre: ${genres}" th:value="${genre.getGenreType()}" th:text="${genre.getGenreType()}"></option>
     5        </select>
     6        <div class="input-group-append" style="width: 40%">
     7            <button class="btn btn-secondary  search-button" style="width: 100%">Филтрирај по жанр</button>
     8        </div>
    59</div>
  • target/classes/templates/fragments/searchBarName.html

    r3c0f9a9 rc02189f  
    1 <div>
    2     <label for="searchTitle" style="width: 150px;">Прабарај по име</label>
    3     <input id="searchTitle" type="text" placeholder="име">
    4     <button class="search-button-title">Пребарај</button>
     1<div style="width:60%; margin: auto;">
     2    <input id="searchTitle" class="form-control" style="float: left; display: block; width: 50%" type="text" placeholder="...">
     3
     4    <div class="input-group-append" style="width: 40%">
     5        <button class="btn btn-secondary search-button-title" style="width: 100%">Филтрирај по Наслов</button>
     6    </div>
     7
    58</div>
  • target/classes/templates/movieShow.html

    r3c0f9a9 rc02189f  
    1313<div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml" style="width: 80%; margin: auto">
    1414    <div>
    15         <div style="width: 30%; margin-right: 10px; padding:20px; border-right: 3px solid black; border-radius: 10px; float:left">
    16             <img th:src="${movie.getImageUrl()}" style="width: 90%; height: auto">
     15        <div style="width: 30%; margin-right: 10px; padding:20px; border-right: 3px solid black; border-radius: 10px; float:left" id="image-movie-section">
     16            <img th:src="${movie.getImageUrl()}" style="width: 90%; height: auto; clear: both; margin-bottom: 20px">
     17            <div id="admin-buttons">
     18                <a class="btn btn-primary" th:href="@{'/discussions/all/{id}?type=M' (id=${movie.getMovieId()})}" >Прегледај дискусии</a>
     19                <th:block sec:authorize="isAuthenticated()" >
     20                    <div>
     21                        <a class="btn btn-success button-add-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${!likedMovies.contains(movie)}">❤</a>
     22                        <a class="btn btn-danger button-remove-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${likedMovies.contains(movie)}">💔</a>
     23                    </div>
     24                    <a class="btn btn-secondary button-add-grade-movie" th:movie-id="${movie.getMovieId()}">Остави оценка</a>
     25                    <a class="btn btn-warning" th:href="@{'/movies/{id}/edit' (id=${movie.getMovieId()})}">Промени</a>
     26                    <a class="btn btn-danger button-delete-movie" th:movie-id="${movie.getMovieId()}">Избриши филм</a>
     27                </th:block>
     28            </div>
    1729        </div>
    1830
     
    2638            </h3>
    2739            <h3 th:text="${'IMDB оцена: ' + movie.getImdbRating()}"></h3>
    28             <h3 th:text="${'Прикажан на: ' + movie.getAiringDate()}"></h3>
     40            <h3 th:text="${'Прикажан на: ' + movie.getDateFormatted()}"></h3>
    2941
    3042            <div style="background-color: rgba(200,200,200,0.5); border-radius: 10px; padding:15px; ">
     
    3345            </div>
    3446
    35             <div>
     47            <div id="likes-showcase">
     48                <h4 style="text-align: center">
     49                    <span>Филмот му се допаднал на </span>
     50                    <strong th:text="${likes}" id="movie_likes_count"></strong>
     51                    <span> корисници</span>
     52                </h4>
     53            </div>
     54
     55            <div class="person-movies-list genres-listing">
    3656                <h3>Жанрови:</h3>
    3757                <ul>
     
    3959                </ul>
    4060            </div>
    41             <div>
     61            <div class="person-movies-list">
    4262                <h3>Актери:</h3>
    4363                <ul>
     
    4868        </div>
    4969    </div>
    50     <div id="admin-buttons">
    51         <a class="btn btn-primary" th:href="@{'/discussions/all/{id}?type=M' (id=${movie.getMovieId()})}" >Прегледај дискусии</a>
    52         <th:block sec:authorize="isAuthenticated()" >
    53             <a class="btn btn-success button-add-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${!likedMovies.contains(movie)}">Додади во омилена листа</a>
    54             <a class="btn btn-warning button-remove-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${likedMovies.contains(movie)}">Избриши од омилена листа</a>
    55             <a class="btn btn-success button-add-grade-movie" th:movie-id="${movie.getMovieId()}">Остави оценка</a>
    56             <a class="btn btn-warning" th:href="@{'/movies/{id}/edit' (id=${movie.getMovieId()})}">Промени</a>
    57             <a class="btn btn-danger button-delete-movie" th:movie-id="${movie.getMovieId()}">Избриши филм</a>
    58         </th:block>
    59     </div>
     70
    6071    <hr>
    6172    <div style="width: 45%; margin: 25px; float:left; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
     
    7081                </div>
    7182                <div style="width: 30%; float:right; background-color: darkorange; border-radius: 10px 30px; color: whitesmoke; padding: 10px;">
    72                     <h2 style="text-align: center">Rated:</h2>
    73                     <p th:text="${rating.getStarsRated() + ' out of 10 stars'}" style="text-align: center"></p>
     83                    <h2 style="text-align: center">Оценет:</h2>
     84                    <p th:text="${rating.getStarsRated() + ' од 10'}" style="text-align: center"></p>
    7485                </div>
    7586        </div>
     
    7788    <div style="width: 45%; margin: 25px; float:left; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
    7889        <h2>
    79             <span>Бројот на лајкови кои филмот ги добил:</span>
    80             <span th:text="${movie.getLikes().size()}"></span>
     90            <span>Лајковите кои филмот ги добил:</span>
    8191        </h2>
    8292        <hr>
  • target/classes/templates/moviesList.html

    r3c0f9a9 rc02189f  
    22
    33    <div style="width: 70%; margin: auto">
    4         <div th:replace="fragments/searchBarName"></div>
     4        <div th:replace="fragments/searchBarName"></div><br>
    55        <div th:replace="fragments/searchBarGenre"></div>
    66    </div>
  • target/classes/templates/moviesListPaged.html

    r3c0f9a9 rc02189f  
    11<div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
    2 
    3     <div style="width: 70%; margin: auto">
    4         <div th:replace="fragments/searchBarName"></div>
    5         <div th:replace="fragments/searchBarGenre"></div>
    6 
     2    <div style="margin:auto; width: 60%">
     3        <div style="width: 30%; margin: auto; height: 100%; margin-bottom: 10px">
     4            <a class="btn btn-outline-dark" style="height: 100%; width: 100%; font-size: 125%" id="button_toggle_filters">Прикажи филтрирање</a>
     5        </div>
     6        <div style="width: 100%; margin: auto; transition: 200ms" id="filters_div" class="invisible-search">
     7            <div th:replace="fragments/searchBarName"></div><br>
     8            <div th:replace="fragments/searchBarGenre"></div>
     9        </div>
    710    </div>
    8 
    911    <div id="paging-section">
    1012        <div id="inner-paging" class="input-group">
     
    2527            </div>
    2628        </div>
    27     </div><br><br><br>
     29    </div><br>
    2830
    2931    <div class="container mb-4">
     
    3436        <div class="row" th:each="row: ${movie_rows}" >
    3537            <div class="col-md-3 elements" th:each="movie: ${row}" >
     38                <span th:each="genre: ${movie.getGenres()}"  th:text="${genre?.getGenre()?.getGenreType()}" hidden class="card-genre"></span>
    3639                    <div class="card-body card bg-image" th:style="'background:url(' + ${movie.getImageUrl()} + ') no-repeat center #eee;'">
    3740                        <a class="card-text-center" style="color: white" th:href="@{'/movies/{id}' (id=${movie.getMovieId()})}" >
    3841                        <h3 class="card-title title" th:text="${movie.getTitle()}"></h3>
    3942                            <span th:each="genre: ${movie.getGenres()}"  th:text="${genre?.getGenre()?.getGenreType()}" hidden class="card-genre"></span>
    40 
    4143                        </a>
    42                         <h3 class="card-text bottom" th:text="${'Rated '+movie.getImdbRating()}"></h3>
     44                        <span class="card-text bottom">
     45                            <h3 th:text="${'Оценет '+movie.getImdbRating() + '/10'}"></h3>
     46                        </span>
    4347                        <th:block sec:authorize="isAuthenticated()">
    4448                            <a class="bottom-heart btn btn-success button-add-favourite-list" th:movie-id="${movie.getMovieId()}" th:user-id="${user.getUserId()}" th:if="${!likedMovies.contains(movie)}">❤</a>
  • target/classes/templates/personShow.html

    r3c0f9a9 rc02189f  
    11
    2 <div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml" style="width: 80%; margin: auto">
    3     <div>
    4 
     2<div xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml" style="width: 70%; margin: auto">
     3    <div style="clear: both; margin-bottom: 10px; display:  inline-block">
    54        <div style="width: 60%; margin-left: 10px; padding:20px; float:left">
    65            <h1 th:text="${person.getName() + ' ' + person.getSurname()}" style="text-align: center; padding:10px; background-color: rgba(64,64,64,0.5); color:white; border-radius: 10px 0px"></h1>
    76            <hr>
    8             <h3 th:text="${'Born on: ' + person.getDateOfBirth()}"></h3>
     7            <h3 th:text="${'Роден на: ' + person.getDateFormatted()}"></h3>
    98            <div style="background-color: rgba(200,200,200,0.5); border-radius: 10px; padding:15px; ">
    10                 <h3>Description:</h3>
     9                <h3>Краток Опис:</h3>
    1110                <p th:text="${person.getDescription()}" style="text-align: justify"></p>
    1211            </div>
    1312
    14             <div th:if="${person.getType() == 'D'}">
    15                 <h3 >Directed movies:</h3>
     13            <div th:if="${person.getType().toString().contains('D')}" class="person-movies-list">
     14                <h3 >Режисирани филмови:</h3>
     15                <hr>
    1616                <ul>
    17                     <li th:each="movie: ${actor.getMovies()}"><a th:text="${movie.getTitle()}" th:href="@{'/movies/{id}' (id=${movie.getMovieId()})}" ></a></li>
     17                    <li th:each="movie: ${person.getMovies()}"><a th:text="${movie.getTitle()}" th:href="@{'/movies/{id}' (id=${movie.getMovieId()})}" ></a></li>
    1818                </ul>
    1919            </div>
    20             <div th:if="${person.getType() == 'A'}">
    21                 <h3 >Acted in movies:</h3>
     20            <div th:if="${person.getType().toString().contains('A')}" class="person-movies-list">
     21                <h3 >Се појавува во филмовите:</h3>
     22                <hr>
    2223                <ul>
    23                     <li th:each="movie: ${actor.getMovieActors()}" ><a th:text="${movie.getMovie().getTitle()}" th:href="@{'/movies/{id}' (id=${movie.getMovie().getMovieId()})}" ></a></li>
     24                    <li th:each="movie: ${person.getMovieActors()}" ><a th:text="${movie.getMovie().getTitle()}" th:href="@{'/movies/{id}' (id=${movie.getMovie().getMovieId()})}" ></a></li>
    2425                </ul>
    2526            </div>
    26 
    2727        </div>
    28         <div style="width: 30%; margin-left: 10px; padding:20px; border-left: 3px solid black; border-radius: 10px; float:left">
     28        <div style="width: 30%; margin-left: 10px; padding:20px; border-left: 3px solid black; border-radius: 10px; float:right">
    2929            <img th:src="${person.getImageUrl()}" style="width: 90%; height: auto">
    3030        </div>
    3131    </div>
    32     <div style="width: 45%; margin: 25px; float:left; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
     32    <br>
     33    <div style="clear:both; display: inline-block; width: 100%; background-color: rgb(200,200,200); padding: 10px; border-radius: 5px">
    3334        <h2>
    34             <span>Бројот на оцени кои филмот ги добил:</span>
    35             <span th:text="${movie.getRates().size()}"></span>
     35            <span>Бројот на оцени кои личноста ги има добиено:</span>
     36            <span th:text="${person.getPersonRates().size()}"></span>
    3637        </h2>
    3738        <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 th:each="rating: ${person.getPersonRates()}" style="margin-bottom: 10px; border: 2px solid gray; border-radius: 10px; background-color: lightblue; padding: 10px; border-radius: 10px; min-height: 130px;">
    3940            <div style="width: 60%; float:left;">
    4041                <p th:text="${rating.getReason()}" style="text-align: justify"></p>
    4142            </div>
    4243            <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>
     44                <h2 style="text-align: center">Оценет со :</h2>
     45                <p th:text="${rating.getStarsRated() + ' од 10'}" style="text-align: center"></p>
    4546            </div>
    4647        </div>
    4748    </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>
     49
    6350</div>
  • target/classes/templates/personsList.html

    r3c0f9a9 rc02189f  
    55    </div>
    66    <div class="container mb-4">
    7         <div class="row">
    87            <div class="col-12" th:if="${persons.size() > 0}">
    98                <div class="table-responsive">
     
    4746                            <th:block sec:authorize="isAuthenticated()">
    4847                                <td>
    49                                     <a class="btn btn-primary button-add-grade-person" th:person-id="${person.getPersonId()}">Остави оценка</a>
     48                                    <a class="btn btn-secondary button-add-grade-person" th:person-id="${person.getPersonId()}">Остави оценка</a>
    5049
    5150                                </td>
    5251                            <td>
    53                                 <a class="btn btn-primary" th:href="@{'persons/edit/{personId}' (personId = ${person.getPersonId()})}">Промени</a>
     52                                <a class="btn btn-warning" th:href="@{'persons/edit/{personId}' (personId = ${person.getPersonId()})}">Промени</a>
    5453                            </td>
    5554                            <td>
    56                                 <a class="btn btn-primary button-delete-actor" th:person-id="${person.getPersonId()}">Избриши</a>
     55                                <a class="btn btn-danger button-delete-actor" th:person-id="${person.getPersonId()}">Избриши</a>
    5756
    5857                            </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>
    6858
    6959
     
    7565                </div>
    7666            </div>
    77         </div>
    7867    </div>
    7968
  • target/classes/templates/template.html

    r3c0f9a9 rc02189f  
    1616</head>
    1717<body>
    18 <section class="jumbotron text-center">
    19     <div class="container">
    20         <!--<img th:src="@{/img/logo.png}" style="opacity: 0.3; z-index: 5; position: absolute; margin: auto; height: 225px; width: auto; left: 42%; top: 2%">-->
    21         <h1 class="jumbotron-heading" style="z-index: -1">weDiscussMovies</h1>
     18<section class="jumbotron text-center" style="background: url('/img/cover.jpg') center; background-repeat: no-repeat; background-size: 100% auto; height: 280px; margin-bottom: 0px ">
     19    <div class="container" >
     20        <h1 class="jumbotron-heading" style="z-index: -1"></h1>
    2221    </div>
    2322</section>
Note: See TracChangeset for help on using the changeset viewer.