forked from Hay1tsme/artemis
Basic working diva frontend with name editing and lv string editing. Working on playlog page
This commit is contained in:
parent
1b5b9d7f9a
commit
1f9c1798c4
@ -27,7 +27,13 @@ class DivaFrontend(FE_Base):
|
|||||||
|
|
||||||
def get_routes(self) -> List[Route]:
|
def get_routes(self) -> List[Route]:
|
||||||
return [
|
return [
|
||||||
Route("/", self.render_GET, methods=['GET'])
|
Route("/", self.render_GET, methods=['GET']),
|
||||||
|
Mount("/playlog", routes=[
|
||||||
|
Route("/", self.render_GET_playlog, methods=['GET']),
|
||||||
|
Route("/{index}", self.render_GET_playlog, methods=['GET']),
|
||||||
|
]),
|
||||||
|
Route("/update.name", self.update_name, methods=['POST']),
|
||||||
|
Route("/update.lv", self.update_lv, methods=['POST']),
|
||||||
]
|
]
|
||||||
|
|
||||||
async def render_GET(self, request: Request) -> bytes:
|
async def render_GET(self, request: Request) -> bytes:
|
||||||
@ -39,14 +45,138 @@ class DivaFrontend(FE_Base):
|
|||||||
usr_sesh = UserSession()
|
usr_sesh = UserSession()
|
||||||
|
|
||||||
if usr_sesh.user_id > 0:
|
if usr_sesh.user_id > 0:
|
||||||
profile = self.data.profile
|
profile = await self.data.profile.get_profile(usr_sesh.user_id, 1)
|
||||||
|
|
||||||
resp = Response(template.render(
|
resp = Response(template.render(
|
||||||
title=f"{self.core_config.server.name} | {self.nav_name}",
|
title=f"{self.core_config.server.name} | {self.nav_name}",
|
||||||
game_list=self.environment.globals["game_list"],
|
game_list=self.environment.globals["game_list"],
|
||||||
sesh=vars(usr_sesh),
|
sesh=vars(usr_sesh),
|
||||||
|
user_id=usr_sesh.user_id,
|
||||||
profile=profile
|
profile=profile
|
||||||
))
|
), media_type="text/html; charset=utf-8")
|
||||||
return resp
|
return resp
|
||||||
else:
|
else:
|
||||||
return RedirectResponse("/login")
|
return RedirectResponse("/login")
|
||||||
|
|
||||||
|
async def render_GET_playlog(self, request: Request) -> bytes:
|
||||||
|
template = self.environment.get_template(
|
||||||
|
"titles/diva/templates/diva_playlog.jinja"
|
||||||
|
)
|
||||||
|
usr_sesh = self.validate_session(request)
|
||||||
|
if not usr_sesh:
|
||||||
|
usr_sesh = UserSession()
|
||||||
|
|
||||||
|
if usr_sesh.user_id > 0:
|
||||||
|
path_index = request.path_params.get("index")
|
||||||
|
if not path_index or int(path_index) < 1:
|
||||||
|
index = 0
|
||||||
|
else:
|
||||||
|
index = int(path_index) - 1 # 0 and 1 are 1st page
|
||||||
|
user_id = usr_sesh.user_id
|
||||||
|
playlog_count = await self.data.score.get_user_playlogs_count(user_id)
|
||||||
|
if playlog_count < index * 20 :
|
||||||
|
return Response(template.render(
|
||||||
|
title=f"{self.core_config.server.name} | {self.nav_name}",
|
||||||
|
game_list=self.environment.globals["game_list"],
|
||||||
|
sesh=vars(usr_sesh),
|
||||||
|
score_count=0
|
||||||
|
), media_type="text/html; charset=utf-8")
|
||||||
|
playlog = await self.data.score.get_playlogs(user_id, index, 20) #Maybe change to the playlog instead of direct scores
|
||||||
|
playlog_with_title = []
|
||||||
|
for record in playlog:
|
||||||
|
song = await self.data.static.get_music_chart(record[2], record[3], record[4])
|
||||||
|
if song:
|
||||||
|
title = song[4]
|
||||||
|
artist = song[5]
|
||||||
|
else:
|
||||||
|
title = "Unknown"
|
||||||
|
artist = "Unknown"
|
||||||
|
playlog_with_title.append({
|
||||||
|
"raw": record,
|
||||||
|
"title": title,
|
||||||
|
"artist": artist
|
||||||
|
})
|
||||||
|
return Response(template.render(
|
||||||
|
title=f"{self.core_config.server.name} | {self.nav_name}",
|
||||||
|
game_list=self.environment.globals["game_list"],
|
||||||
|
sesh=vars(usr_sesh),
|
||||||
|
user_id=usr_sesh.user_id,
|
||||||
|
playlog=playlog_with_title,
|
||||||
|
playlog_count=playlog_count
|
||||||
|
), media_type="text/html; charset=utf-8")
|
||||||
|
else:
|
||||||
|
return RedirectResponse("/gate/", 300)
|
||||||
|
|
||||||
|
async def update_name(self, request: Request) -> Response:
|
||||||
|
usr_sesh = self.validate_session(request)
|
||||||
|
if not usr_sesh:
|
||||||
|
return RedirectResponse("/login")
|
||||||
|
|
||||||
|
form_data = await request.form()
|
||||||
|
new_name: str = form_data.get("new_name")
|
||||||
|
new_name_full = ""
|
||||||
|
|
||||||
|
if not new_name:
|
||||||
|
return RedirectResponse("/gate/?e=4", 303)
|
||||||
|
|
||||||
|
if len(new_name) > 8:
|
||||||
|
return RedirectResponse("/gate/?e=8", 303)
|
||||||
|
|
||||||
|
for x in new_name: # FIXME: This will let some invalid characters through atm
|
||||||
|
o = ord(x)
|
||||||
|
try:
|
||||||
|
if o == 0x20:
|
||||||
|
new_name_full += chr(0x3000)
|
||||||
|
elif o < 0x7F and o > 0x20:
|
||||||
|
new_name_full += chr(o + 0xFEE0)
|
||||||
|
elif o <= 0x7F:
|
||||||
|
self.logger.warn(f"Invalid ascii character {o:02X}")
|
||||||
|
return RedirectResponse("/gate/?e=4", 303)
|
||||||
|
else:
|
||||||
|
new_name_full += x
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.error(f"Something went wrong parsing character {o:04X} - {e}")
|
||||||
|
return RedirectResponse("/gate/?e=4", 303)
|
||||||
|
|
||||||
|
if not await self.data.profile.update_profile(usr_sesh.user_id, player_name=new_name_full):
|
||||||
|
return RedirectResponse("/gate/?e=999", 303)
|
||||||
|
|
||||||
|
return RedirectResponse("/game/diva", 303)
|
||||||
|
|
||||||
|
async def update_lv(self, request: Request) -> Response:
|
||||||
|
usr_sesh = self.validate_session(request)
|
||||||
|
if not usr_sesh:
|
||||||
|
return RedirectResponse("/login")
|
||||||
|
|
||||||
|
form_data = await request.form()
|
||||||
|
new_lv: str = form_data.get("new_lv")
|
||||||
|
new_lv_full = ""
|
||||||
|
|
||||||
|
if not new_lv:
|
||||||
|
return RedirectResponse("/gate/?e=4", 303)
|
||||||
|
|
||||||
|
if len(new_lv) > 8:
|
||||||
|
return RedirectResponse("/gate/?e=8", 303)
|
||||||
|
|
||||||
|
for x in new_lv: # FIXME: This will let some invalid characters through atm
|
||||||
|
o = ord(x)
|
||||||
|
try:
|
||||||
|
if o == 0x20:
|
||||||
|
new_lv_full += chr(0x3000)
|
||||||
|
elif o < 0x7F and o > 0x20:
|
||||||
|
new_lv_full += chr(o + 0xFEE0)
|
||||||
|
elif o <= 0x7F:
|
||||||
|
self.logger.warn(f"Invalid ascii character {o:02X}")
|
||||||
|
return RedirectResponse("/gate/?e=4", 303)
|
||||||
|
else:
|
||||||
|
new_lv_full += x
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.error(f"Something went wrong parsing character {o:04X} - {e}")
|
||||||
|
return RedirectResponse("/gate/?e=4", 303)
|
||||||
|
|
||||||
|
if not await self.data.profile.update_profile(usr_sesh.user_id, lv_str=new_lv_full):
|
||||||
|
return RedirectResponse("/gate/?e=999", 303)
|
||||||
|
|
||||||
|
return RedirectResponse("/game/diva", 303)
|
||||||
|
@ -102,7 +102,7 @@ class DivaProfileData(BaseData):
|
|||||||
self.logger.error(
|
self.logger.error(
|
||||||
f"update_profile: failed to update profile! profile: {aime_id}"
|
f"update_profile: failed to update profile! profile: {aime_id}"
|
||||||
)
|
)
|
||||||
return None
|
return result
|
||||||
|
|
||||||
async def get_profile(self, aime_id: int, version: int) -> Optional[List[Dict]]:
|
async def get_profile(self, aime_id: int, version: int) -> Optional[List[Dict]]:
|
||||||
"""
|
"""
|
||||||
|
@ -239,3 +239,23 @@ class DivaScoreData(BaseData):
|
|||||||
if result is None:
|
if result is None:
|
||||||
return None
|
return None
|
||||||
return result.fetchall()
|
return result.fetchall()
|
||||||
|
|
||||||
|
async def get_playlogs(self, user_id: int, idx: int = 0, limit: int = 0) -> Optional[List[Row]]:
|
||||||
|
sql = playlog.select(playlog.c.user == user_id)
|
||||||
|
|
||||||
|
if limit:
|
||||||
|
sql = sql.limit(limit)
|
||||||
|
if idx:
|
||||||
|
sql = sql.offset(idx)
|
||||||
|
|
||||||
|
result = await self.execute(sql)
|
||||||
|
if result:
|
||||||
|
return result.fetchall()
|
||||||
|
|
||||||
|
async def get_user_playlogs_count(self, aime_id: int) -> Optional[int]:
|
||||||
|
sql = select(func.count()).where(playlog.c.user == aime_id)
|
||||||
|
result = await self.execute(sql)
|
||||||
|
if result is None:
|
||||||
|
self.logger.warning(f"aimu_id {aime_id} has no scores ")
|
||||||
|
return None
|
||||||
|
return result.scalar()
|
||||||
|
@ -0,0 +1,195 @@
|
|||||||
|
.diva-header {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.diva-navi {
|
||||||
|
list-style-type: none;
|
||||||
|
padding: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #333;
|
||||||
|
text-align: center;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.diva-navi li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.diva-navi li a {
|
||||||
|
display: block;
|
||||||
|
color: white;
|
||||||
|
text-align: center;
|
||||||
|
padding: 14px 16px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.diva-navi li a:hover:not(.active) {
|
||||||
|
background-color: #111;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.diva-navi li a.active {
|
||||||
|
background-color: #4CAF50;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.diva-navi li.right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 600px) {
|
||||||
|
|
||||||
|
ul.diva-navi li.right,
|
||||||
|
ul.diva-navi li {
|
||||||
|
float: none;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
border-collapse: separate;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #555555;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
text-align: left;
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-rowdistinct tr:nth-child(even) {
|
||||||
|
background-color: #303030;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-rowdistinct tr:nth-child(odd) {
|
||||||
|
background-color: #555555;
|
||||||
|
}
|
||||||
|
|
||||||
|
caption {
|
||||||
|
text-align: center;
|
||||||
|
color: white;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-large {
|
||||||
|
margin: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-large th,
|
||||||
|
.table-large td {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-small {
|
||||||
|
width: 100%;
|
||||||
|
margin: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-small th,
|
||||||
|
.table-small td {
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-card {
|
||||||
|
background-color: #555555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-hover {
|
||||||
|
transition: all 0.2s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-hover:hover {
|
||||||
|
transform: scale(1.02);
|
||||||
|
}
|
||||||
|
|
||||||
|
.basic {
|
||||||
|
color: #28a745;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hard {
|
||||||
|
color: #ffc107;
|
||||||
|
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.expert {
|
||||||
|
color: #dc3545;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.master {
|
||||||
|
color: #dd09e8;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ultimate {
|
||||||
|
color: #000000;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.score {
|
||||||
|
color: #ffffff;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rainbow {
|
||||||
|
background: linear-gradient(to right, red, yellow, lime, aqua, blue, fuchsia) 0 / 5em;
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.platinum {
|
||||||
|
color: #FFFF00;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gold {
|
||||||
|
color: #FFFF00;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrolling-text {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrolling-text p {
|
||||||
|
white-space: nowrap;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrolling-text h6 {
|
||||||
|
white-space: nowrap;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrolling-text h5 {
|
||||||
|
white-space: nowrap;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrolling {
|
||||||
|
animation: scroll 10s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes scroll {
|
||||||
|
0% {
|
||||||
|
transform: translateX(100%);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateX(-100%);
|
||||||
|
}
|
||||||
|
}
|
17
titles/diva/templates/diva_header.jinja
Normal file
17
titles/diva/templates/diva_header.jinja
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<div class="diva-header">
|
||||||
|
<h1>diva</h1>
|
||||||
|
<ul class="diva-navi">
|
||||||
|
<li><a class="nav-link" href="/game/diva/">PROFILE</a></li>
|
||||||
|
<li><a class="nav-link" href="/game/diva/playlog/">RECORD</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
var currentPath = window.location.pathname;
|
||||||
|
if (currentPath === '/game/diva/') {
|
||||||
|
$('.nav-link[href="/game/diva/"]').addClass('active');
|
||||||
|
} else if (currentPath.startsWith('/game/diva/playlog/')) {
|
||||||
|
$('.nav-link[href="/game/diva/playlog/"]').addClass('active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
@ -3,12 +3,96 @@
|
|||||||
<style>
|
<style>
|
||||||
{% include 'titles/diva/templates/css/diva_style.css' %}
|
{% include 'titles/diva/templates/css/diva_style.css' %}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
{% include 'titles/diva/templates/diva_header.jinja' %}
|
||||||
|
{% if profile is defined and profile is not none and profile|length > 0 %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-lg-8 m-auto mt-3">
|
||||||
<h1>{{ title }}</h1>
|
<div class="card bg-card rounded">
|
||||||
<p>{{ description }}</p>
|
<table class="table-large table-rowdistinct">
|
||||||
|
<caption align="top" class="text-center">OVERVIEW</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Player name:</th>
|
||||||
|
<th>{{ profile[3] }}</th>
|
||||||
|
<th>
|
||||||
|
<button type="button" class="btn btn-primary btn-sm" data-bs-toggle="modal"
|
||||||
|
data-bs-target="#name_change">Edit</button>
|
||||||
|
</th>
|
||||||
|
<th>Level string:</th>
|
||||||
|
<th>{{ profile[4] }}</th>
|
||||||
|
<th>
|
||||||
|
<button type="button" class="btn btn-primary btn-sm" data-bs-toggle="modal"
|
||||||
|
data-bs-target="#lv_change">Edit</button>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Lvl:</td>
|
||||||
|
<td>{{ profile[5] }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Lvl points:</td>
|
||||||
|
<td>{{ profile[6] }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Vocaloid points:</td>
|
||||||
|
<td>{{ profile[7] }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if error is defined %}
|
||||||
|
{% include "core/templates/widgets/err_banner.jinja" %}
|
||||||
|
{% endif %}
|
||||||
|
{% elif sesh is defined and sesh is not none and sesh.user_id > 0 %}
|
||||||
|
No profile information found for this account.
|
||||||
|
{% else %}
|
||||||
|
Login to view profile information.
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="modal fade" id="name_change" tabindex="-1" aria-labelledby="name_change_label" data-bs-theme="dark"
|
||||||
|
aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Name change</h5>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form id="new_name_form" action="/game/diva/update.name" method="post" style="outline: 0;">
|
||||||
|
<label class="form-label" for="new_name">new name:</label>
|
||||||
|
<input class="form-control" aria-describedby="newNameHelp" form="new_name_form" id="new_name"
|
||||||
|
name="new_name" maxlength="14" type="text" required>
|
||||||
|
<div id="newNameHelp" class="form-text">name must be full-width character string.
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<input type=submit class="btn btn-primary" type="button" form="new_name_form">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal fade" id="lv_change" tabindex="-1" aria-labelledby="lv_change_label" data-bs-theme="dark"
|
||||||
|
aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Level string change</h5>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form id="new_lv_form" action="/game/diva/update.lv" method="post" style="outline: 0;">
|
||||||
|
<label class="form-label" for="new_lv">new level string:</label>
|
||||||
|
<input class="form-control" aria-describedby="newLvHelp" form="new_lv_form" id="new_lv" name="new_lv"
|
||||||
|
maxlength="14" type="text" required>
|
||||||
|
<div id="newLvHelp" class="form-text">level string must be full-width character string.
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<input type=submit class="btn btn-primary" type="button" form="new_lv_form">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
114
titles/diva/templates/diva_playlog.jinja
Normal file
114
titles/diva/templates/diva_playlog.jinja
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
{% extends "core/templates/index.jinja" %}
|
||||||
|
{% block content %}
|
||||||
|
<style>
|
||||||
|
{% include 'titles/diva/templates/css/diva_style.css' %}
|
||||||
|
</style>
|
||||||
|
<div class="container">
|
||||||
|
{% include 'titles/diva/templates/diva_header.jinja' %}
|
||||||
|
{% if playlog is defined and playlog is not none %}
|
||||||
|
<div class="row">
|
||||||
|
<h4 style="text-align: center;">Score counts: {{ playlog_count }}</h4>
|
||||||
|
{% set difficultyName = ['easy', 'normal', 'hard', 'extreme', 'extra extreme'] %}
|
||||||
|
{% for record in playlog %}
|
||||||
|
<div class="col-lg-6 mt-3">
|
||||||
|
<div class="card bg-card rounded card-hover">
|
||||||
|
<div class="col-8 scrolling-text">
|
||||||
|
<h5 class="card-text"> {{ record.title }} </h5>
|
||||||
|
<br>
|
||||||
|
<h6 class="card-text"> {{ record.artist }} </h6>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<h6 class="card-text"> {{ difficultyName[record.raw[4]] }} </h6>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% set playlog_pages = playlog_count // 20 + 1 %}
|
||||||
|
{% elif sesh is defined and sesh is not none and sesh.user_id > 0 %}
|
||||||
|
No Score information found for this account.
|
||||||
|
{% else %}
|
||||||
|
Login to view profile information.
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<footer class="navbar-fixed-bottom">
|
||||||
|
<nav aria-label="Score page navication">
|
||||||
|
<ul class="pagination justify-content-center mt-3">
|
||||||
|
<li class="page-item"><a id="prev_page" class="page-link" href="#">Previous</a></li>
|
||||||
|
<li class="page-item"><a id="first_page" class="page-link" href="/game/diva/playlog/">1</a></li>
|
||||||
|
<li class="page-item"><a id="prev_3_page" class="page-link" href="">...</a></li>
|
||||||
|
<li class="page-item"><a id="front_page" class="page-link" href="">2</a></li>
|
||||||
|
<li class="page-item"><a id="cur_page" class="page-link active" href="">3</a></li>
|
||||||
|
<li class="page-item"><a id="back_page" class="page-link" href="">4</a></li>
|
||||||
|
<li class="page-item"><a id="next_3_page" class="page-link" href="">...</a></li>
|
||||||
|
<li class="page-item"><a id="last_page" class="page-link" href="/game/diva/playlog/{{ playlog_pages }}">{{
|
||||||
|
playlog_pages }}</a></li>
|
||||||
|
<li class="page-item"><a id="next_page" class="page-link" href="#">Next</a></li>
|
||||||
|
 
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('.scrolling-text p, .scrolling-text h1, .scrolling-text h2, .scrolling-text h3, .scrolling-text h4, .scrolling-text h5, .scrolling-text h6').each(function () {
|
||||||
|
var parentWidth = $(this).parent().width();
|
||||||
|
var elementWidth = $(this).outerWidth();
|
||||||
|
var elementWidthWithPadding = $(this).outerWidth(true);
|
||||||
|
|
||||||
|
if (elementWidthWithPadding > parentWidth) {
|
||||||
|
$(this).addClass('scrolling');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var currentUrl = window.location.pathname;
|
||||||
|
var currentPage = parseInt(currentUrl.split('/').pop());
|
||||||
|
var rootUrl = '/game/diva/playlog/';
|
||||||
|
var scorePages = {{ playlog_pages }};
|
||||||
|
if (Number.isNaN(currentPage)) {
|
||||||
|
currentPage = 1;
|
||||||
|
}
|
||||||
|
$('#cur_page').text(currentPage);
|
||||||
|
$('#prev_page').attr('href', rootUrl + (currentPage - 1))
|
||||||
|
$('#next_page').attr('href', rootUrl + (currentPage + 1))
|
||||||
|
$('#front_page').attr('href', rootUrl + (currentPage - 1))
|
||||||
|
$('#front_page').text(currentPage - 1);
|
||||||
|
$('#back_page').attr('href', rootUrl + (currentPage + 1))
|
||||||
|
$('#back_page').text(currentPage + 1);
|
||||||
|
$('#prev_3_page').attr('href', rootUrl + (currentPage - 3))
|
||||||
|
$('#next_3_page').attr('href', rootUrl + (currentPage + 3))
|
||||||
|
if ((currentPage - 1) < 3) {
|
||||||
|
$('#prev_3_page').hide();
|
||||||
|
if ((currentPage - 1) < 2) {
|
||||||
|
$('#front_page').hide();
|
||||||
|
if (currentPage === 1) {
|
||||||
|
$('#first_page').hide();
|
||||||
|
$('#prev_page').addClass('disabled');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((scorePages - currentPage) < 3) {
|
||||||
|
$('#next_3_page').hide();
|
||||||
|
if ((scorePages - currentPage) < 2) {
|
||||||
|
$('#back_page').hide();
|
||||||
|
if (currentPage === scorePages) {
|
||||||
|
$('#last_page').hide();
|
||||||
|
$('#next_page').addClass('disabled');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#go_button').click(function () {
|
||||||
|
var pageNumber = parseInt($('#page_input').val());
|
||||||
|
|
||||||
|
if (!Number.isNaN(pageNumber) && pageNumber <= scorePages && pageNumber >= 0) {
|
||||||
|
var url = '/game/diva/playlog/' + pageNumber;
|
||||||
|
window.location.href = url;
|
||||||
|
} else {
|
||||||
|
$('#page_input').val('');
|
||||||
|
$('#page_input').attr('placeholder', 'invalid input!');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock content %}
|
Loading…
Reference in New Issue
Block a user