6 changed files with 183 additions and 3 deletions
			
			
		@ -0,0 +1,48 @@ | 
				
			|||||
 | 
					<?php | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					use App\Enumerators\SessionElement; | 
				
			||||
 | 
					use App\Wrappers\DatabaseInteractions; | 
				
			||||
 | 
					use App\Wrappers\SessionWrapper; | 
				
			||||
 | 
					use App\Wrappers\SQLQueryBuilderWrapper; | 
				
			||||
 | 
					use App\Wrappers\TwigWrapper; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					require_once __DIR__ . "/../../vendor/autoload.php"; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					$db = new DatabaseInteractions(); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					$danceDetails = $db->RunOneSelect( | 
				
			||||
 | 
					    queryBuilder: SQLQueryBuilderWrapper::SELECT_ONE( | 
				
			||||
 | 
					        table: 'Dances', | 
				
			||||
 | 
					        id: $_GET["dance-id"] | 
				
			||||
 | 
					    ) | 
				
			||||
 | 
					        ->cols(cols: [ | 
				
			||||
 | 
					            'SUM(CASE WHEN T_DR.Rating = 1 THEN 1 ELSE 0 END) AS Likes', | 
				
			||||
 | 
					            'SUM(CASE WHEN T_DR.Rating = -1 THEN 1 ELSE 0 END) AS Dislikes', | 
				
			||||
 | 
					        ]) | 
				
			||||
 | 
					        ->join( | 
				
			||||
 | 
					            join: 'LEFT', | 
				
			||||
 | 
					            spec: 'DanceRatings AS T_DR', | 
				
			||||
 | 
					            cond: 'T.ID=T_DR.DanceID', | 
				
			||||
 | 
					        ) | 
				
			||||
 | 
					); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					$danceSteps = $db->RunSelect( | 
				
			||||
 | 
					    queryBuilder: SQLQueryBuilderWrapper::SELECT( | 
				
			||||
 | 
					        table: 'DanceSteps' | 
				
			||||
 | 
					    ) | 
				
			||||
 | 
					        ->where(cond: 'T.DanceID=:__dance_id__') | 
				
			||||
 | 
					        ->orderBy(spec: [ | 
				
			||||
 | 
					            'T.BarCountAtStart ASC', | 
				
			||||
 | 
					        ]) | 
				
			||||
 | 
					        ->bindValue(name: '__dance_id__', value: $_GET["dance-id"]) | 
				
			||||
 | 
					); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					TwigWrapper::RenderTwig( | 
				
			||||
 | 
					    target: "Pages/dance/uuid.html.twig", | 
				
			||||
 | 
					    arguments: [ | 
				
			||||
 | 
					        "DanceDetails"=>$danceDetails, | 
				
			||||
 | 
					        "DanceSteps"=>$danceSteps, | 
				
			||||
 | 
					    ] | 
				
			||||
 | 
					); | 
				
			||||
 | 
					
 | 
				
			||||
@ -0,0 +1,84 @@ | 
				
			|||||
 | 
					{% extends "/Bases/StandardWebPage.html.twig" %} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					{% block content %} | 
				
			||||
 | 
					    <script> | 
				
			||||
 | 
					        function VoteOnDance(type) | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            API_GET('/V1/RateDance.php?dance-id={{ DanceDetails.ID }}&type='+type) | 
				
			||||
 | 
					                .then(payload => { | 
				
			||||
 | 
					                    console.log(payload); | 
				
			||||
 | 
					                    document.getElementById('LikeButton').classList.remove('active'); | 
				
			||||
 | 
					                    document.getElementById('DislikeButton').classList.remove('active'); | 
				
			||||
 | 
					                    if(payload['NewVoteValue'] === -1) | 
				
			||||
 | 
					                        document.getElementById('DislikeButton').classList.add('active'); | 
				
			||||
 | 
					                    else if(payload['NewVoteValue'] === 1) | 
				
			||||
 | 
					                        document.getElementById('LikeButton').classList.add('active'); | 
				
			||||
 | 
					                    document.getElementById('LikeCount').innerHTML = payload['LikeCount']; | 
				
			||||
 | 
					                    document.getElementById('DislikeCount').innerHTML = payload['DislikeCount']; | 
				
			||||
 | 
					                }) | 
				
			||||
 | 
					                .catch(error => { | 
				
			||||
 | 
					                    console.error("Error fetching ABC data:", error); | 
				
			||||
 | 
					                }); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    </script> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <div class="InnerContent"> | 
				
			||||
 | 
					        <div> | 
				
			||||
 | 
					            <div class="container"> | 
				
			||||
 | 
					                <div class="left"> | 
				
			||||
 | 
					                    <div class="DLContainer"> | 
				
			||||
 | 
					                        <h2>{{ "Dance Overview"|translate }}</h2> | 
				
			||||
 | 
					                        <dl> | 
				
			||||
 | 
					                            <dt>{{ "Number of Steps"|translate }}</dt> | 
				
			||||
 | 
					                            <dd>{{ DanceSteps|length }}</dd> | 
				
			||||
 | 
					                        </dl> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                    <div id="RatingContainer"> | 
				
			||||
 | 
					                        <h2>{{ "Rating"|translate }}</h2> | 
				
			||||
 | 
					                        <div class="RatingButtons"> | 
				
			||||
 | 
					                            {% if _SESSION_.IS_LOGGED_IN %} | 
				
			||||
 | 
					                                <button id="DislikeButton" onclick="VoteOnDance('DISLIKE');" {% if MyVote == -1 %}class="active"{% endif %}>👎</button> | 
				
			||||
 | 
					                                <button id="LikeButton" onclick="VoteOnDance('LIKE');" {% if MyVote == 1 %}class="active"{% endif %}>👍</button> | 
				
			||||
 | 
					                            {% else %} | 
				
			||||
 | 
					                                <em>{{ "Log in to vote"|translate }}</em> | 
				
			||||
 | 
					                            {% endif %} | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                        <div class="Counts"> | 
				
			||||
 | 
					                            | | 
				
			||||
 | 
					                            <span>👎 <span id="DislikeCount">{{ DanceDetails.Dislikes }}</span></span> | 
				
			||||
 | 
					                            | | 
				
			||||
 | 
					                            <span>👍 <span id="LikeCount">{{ DanceDetails.Likes }}</span></span> | 
				
			||||
 | 
					                            | | 
				
			||||
 | 
					                            <span>⭐ <span id="BookmarkCount">{{ DanceDetails.Bookmarks }}</span></span> | 
				
			||||
 | 
					                            | | 
				
			||||
 | 
					                        </div> | 
				
			||||
 | 
					                    </div> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div class="center"> | 
				
			||||
 | 
					                    <table> | 
				
			||||
 | 
					                        <thead> | 
				
			||||
 | 
					                        <tr> | 
				
			||||
 | 
					                            <th>bar from</th> | 
				
			||||
 | 
					                            <th>bar until</th> | 
				
			||||
 | 
					                            <th>step</th> | 
				
			||||
 | 
					                        </tr> | 
				
			||||
 | 
					                        </thead> | 
				
			||||
 | 
					                        <tbody> | 
				
			||||
 | 
					                        {% for step in DanceSteps %} | 
				
			||||
 | 
					                            <tr> | 
				
			||||
 | 
					                                <td>{{ step.BarCountAtStart }}</td> | 
				
			||||
 | 
					                                <td>{{ step.BarCountAtEnd }}</td> | 
				
			||||
 | 
					                                <td>{{ step.Description }}</td> | 
				
			||||
 | 
					                            </tr> | 
				
			||||
 | 
					                        {% endfor %} | 
				
			||||
 | 
					                        </tbody> | 
				
			||||
 | 
					                    </table> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					                <div class="right"> | 
				
			||||
 | 
					                </div> | 
				
			||||
 | 
					            </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					{% endblock %} | 
				
			||||
@ -1,7 +1,22 @@ | 
				
			|||||
{% extends "/Bases/StandardWebPage.html.twig" %} | 
					{% extends "/Bases/StandardWebPage.html.twig" %} | 
				
			||||
 | 
					
 | 
				
			||||
{% block content %} | 
					{% block content %} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <script src="/Static/JS/ThirdParty/abcjs-basic.js"></script> | 
				
			||||
    <div class="InnerContent"> | 
					    <div class="InnerContent"> | 
				
			||||
        <h1>Dance Search</h1> | 
					        <h1>Dance Search</h1> | 
				
			||||
 | 
					        <input type="text" id="SearchInput" placeholder="Search for a dance..."> | 
				
			||||
 | 
					        <div id="AlgoliaResults"></div> | 
				
			||||
    </div> | 
					    </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    <script> | 
				
			||||
 | 
					        document.getElementById("SearchInput").addEventListener("input", (event) => { | 
				
			||||
 | 
					            const query = event.target.value; | 
				
			||||
 | 
					            if (query.trim().length > 0) { | 
				
			||||
 | 
					                searchDances(query); | 
				
			||||
 | 
					            } else { | 
				
			||||
 | 
					                document.getElementById("AlgoliaResults").innerHTML = ""; | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        }); | 
				
			||||
 | 
					    </script> | 
				
			||||
{% endblock %} | 
					{% endblock %} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue