Commit 111fc1ef authored by Andreas Heimann's avatar Andreas Heimann

finished v1.1

parent c22b577a
......@@ -154,7 +154,7 @@ button:focus,
text-decoration: none;
}
.song-item .song-cover {
background: rgba(255, 255, 255, 0.1);
background: url("../img/defaultAlbumArt.jpg");
background-size: cover;
width: 100%;
padding-top: 100%;
......@@ -296,28 +296,3 @@ button:focus,
.user-item.inactive {
box-shadow: 0px 2px 10px 5px rgba(0, 0, 0, 0.2);
}
.tooltip {
position: absolute;
top: 0px;
left: 0px;
padding: 5px 10px;
background: #000000;
font-size: 14px;
border-radius: 4px;
pointer-events: none;
display: none;
}
.tooltip::before {
content: "";
position: absolute;
top: 8px;
left: -7px;
width: 0;
height: 0;
border-top: 7px solid transparent;
border-bottom: 7px solid transparent;
border-right: 7px solid #000;
}
.tooltip.active {
display: block;
}
......@@ -165,7 +165,7 @@ button, .button {
text-decoration: none;
& .song-cover {
background: rgba(255,255,255,0.1);
background: url("../img/defaultAlbumArt.jpg");
background-size: cover;
width: 100%;
padding-top: 100%;
......@@ -325,31 +325,3 @@ button, .button {
box-shadow: 0px 2px 10px 5px rgba(0, 0, 0, 0.2);
}
}
\ No newline at end of file
.tooltip {
position: absolute;
top: 0px;
left: 0px;
padding: 5px 10px;
background: #000000;
font-size: 14px;
border-radius: 4px;
pointer-events: none;
display: none;
&::before {
content: "";
position: absolute;
top: 8px;
left: -7px;
width: 0;
height: 0;
border-top: 7px solid transparent;
border-bottom: 7px solid transparent;
border-right: 7px solid #000;
}
&.active {
display: block;
}
}
\ No newline at end of file
......@@ -68,33 +68,43 @@
font-size: 32px;
margin-left: 20px;
}
.section-user-detail .user-detail-actions {
.section-user-detail .user-detail-actions,
.section-user-detail .user-detail-actions-moderation {
padding: 50px;
padding-top: 0px;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-gap: 25px;
}
.section-user-detail .user-detail-actions .button {
.section-user-detail .user-detail-actions.user-detail-actions-moderation,
.section-user-detail .user-detail-actions-moderation.user-detail-actions-moderation {
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
}
.section-user-detail .user-detail-actions .button,
.section-user-detail .user-detail-actions-moderation .button {
padding: 15px 0px;
font-size: 16px;
transition: 0.2s ease-in-out all, 0.1s ease-in-out transform;
}
.section-user-detail .user-detail-actions .button.button-primary {
.section-user-detail .user-detail-actions .button.button-primary,
.section-user-detail .user-detail-actions-moderation .button.button-primary {
background: #fff;
color: #222;
}
.section-user-detail .user-detail-actions .button.button-primary:hover {
.section-user-detail .user-detail-actions .button.button-primary:hover,
.section-user-detail .user-detail-actions-moderation .button.button-primary:hover {
background: #fff;
color: #222;
}
.section-user-detail .user-detail-actions .button:hover {
.section-user-detail .user-detail-actions .button:hover,
.section-user-detail .user-detail-actions-moderation .button:hover {
background: rgba(255, 255, 255, 0.2);
color: #fff;
opacity: 0.6;
transform: translateY(-4px);
}
.section-user-detail .user-detail-actions .button:active {
.section-user-detail .user-detail-actions .button:active,
.section-user-detail .user-detail-actions-moderation .button:active {
transform: translateY(-2px);
}
.section-user-detail .song-row-user {
......
......@@ -77,13 +77,16 @@
}
}
}
& .user-detail-actions {
& .user-detail-actions, & .user-detail-actions-moderation {
padding: 50px;
padding-top: 0px;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-gap: 25px;
&.user-detail-actions-moderation {
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
}
& .button {
padding: 15px 0px;
font-size: 16px;
......
......@@ -11,11 +11,27 @@ DOMtooltipElements.forEach(function(item) {
});
function ShowTooltip(_tooltipItem) {
let tooltipPosition = _tooltipItem.dataset.tooltipposition;
DOMtooltip.innerHTML = _tooltipItem.dataset.tooltip;
DOMtooltip.classList.add("active");
switch(tooltipPosition) {
default:
case "top":
DOMtooltip.classList.add("tooltip-top");
DOMtooltip.style.top = (_tooltipItem.clientY - (_tooltipItem.getBoundingClientRect().height - 15)) + "px";
DOMtooltip.style.left = (_tooltipItem.clientX + (_tooltipItem.getBoundingClientRect().width / 2) - (DOMtooltip.getBoundingClientRect().width / 2)) + "px";
break;
case "right":
DOMtooltip.classList.add("tooltip-right");
DOMtooltip.style.top = (_tooltipItem.getBoundingClientRect().y + (_tooltipItem.getBoundingClientRect().height / 2) - (DOMtooltip.getBoundingClientRect().height / 2)) + "px";
DOMtooltip.style.left = (_tooltipItem.getBoundingClientRect().x + _tooltipItem.getBoundingClientRect().width - 5) + "px";
break;
}
}
function HideTooltip(_tooltipItem) {
DOMtooltip.classList.remove("active");
DOMtooltip.classList.remove("tooltip-top");
DOMtooltip.classList.remove("tooltip-right");
}
\ No newline at end of file
......@@ -249,6 +249,7 @@ class APIController extends AbstractController
$data['id'] = $result->getId();
$data['username'] = $result->getUsername();
$data['isVerified'] = $result->getIsVerified();
$data['isPatreon'] = $result->getIsPatreon();
if($result->getCoverReference()) {
$data['avatar'] = $baseUrl."/uploads/avatar/".$result->getCoverReference();
} else {
......@@ -308,6 +309,7 @@ class APIController extends AbstractController
$oneResult['id'] = $result->getId();
$oneResult['username'] = $result->getUsername();
$oneResult['isVerified'] = $result->getIsVerified();
$oneResult['isPatreon'] = $result->getIsPatreon();
if($result->getCoverReference()) {
$oneResult['avatar'] = $baseUrl."/uploads/avatar/".$result->getCoverReference();
} else {
......
......@@ -512,6 +512,23 @@ class ModerationController extends AbstractController
return $this->redirectToRoute('user.detail', array('userId' => $userId));
}
/**
* @Route("/moderation/user/togglePatreon/{userId}", name="moderation.user.togglePatreon")
*/
public function userTogglePatreon(Request $request, int $userId)
{
$em = $this->getDoctrine()->getManager();
$data = [];
$userToToggle = $em->getRepository(user::class)->findOneBy(array('id' => $userId));
$userToToggle->setIsPatreon(!$userToToggle->getIsPatreon());
$em->persist($userToToggle);
$em->flush();
return $this->redirectToRoute('user.detail', array('userId' => $userId));
}
/**
* @Route("/moderation/user/toggleMod/{userId}", name="moderation.user.toggleMod")
*/
......
......@@ -122,7 +122,7 @@ class UploadController extends AbstractController
try {
// find cover
$coverFiles = glob($extractionPath.DIRECTORY_SEPARATOR."AlbumArt".DIRECTORY_SEPARATOR.$trackInfo->albumArtReference->assetName.".*");
if($coverFiles[0]) {
if(count($coverFiles) > 0) {
$fileType = explode(".", $coverFiles[0])[count(explode(".", $coverFiles[0])) - 1];
if(in_array($fileType, array('jpg', 'png'))) {
......
......@@ -30,9 +30,15 @@ class UserSettingsController extends AbstractController
switch($request->request->get('save')) {
case "general":
if($formData->get('email') != "" && $formData->get('username')) {
$existingUser = $em->getRepository(User::class)->findOneBy(array('username' => $formData->get('username'), 'email' => $formData->get('email')));
if($existingUser) {
$user->setEmail($formData->get('email'));
$user->setUsername($formData->get('username'));
$this->addFlash('success', 'Saved successfully!');
} else {
$this->addFlash('error', 'Email or username are already in use!');
}
} else {
$this->addFlash('error', 'Email and username can\'t be empty!');
}
......
......@@ -25,10 +25,15 @@
private $coverReference;
/**
* @ORM\Column(type="boolean")
* @ORM\Column(type="boolean", nullable=true)
*/
private $isVerified;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $isPatreon;
public function __construct()
{
parent::__construct();
......@@ -58,4 +63,16 @@
return $this;
}
public function getIsPatreon(): ?bool
{
return $this->isPatreon;
}
public function setIsPatreon(bool $isPatreon): self
{
$this->isPatreon = $isPatreon;
return $this;
}
}
\ No newline at end of file
......@@ -9,6 +9,9 @@
<!-- Meta Tags -->
<link rel="icon" type="image/png" href="{{ asset('assets/img/favicon.png') }}" />
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
<meta property="og:site_name" content="SpinSha.re"/>
<meta name="description" content="Songsharing service for the rhythm game Spin Rhythm XD" />
{% block meta %}{% endblock %}
<!-- Styles -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&display=swap" />
......@@ -20,24 +23,24 @@
<main>
<aside>
<nav>
<a class="item {% if app.request.attributes.get('_route') == 'index.index' %}active{% endif %}" href="{{ path('index.index') }}" data-tooltip="Home"><i class="mdi mdi-home-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'search.index' %}active{% endif %}" href="{{ path('search.index') }}" data-tooltip="Search"><i class="mdi mdi-magnify"></i></a>
<a class="item" href="https://www.patreon.com/spinshare" target="_blank" data-tooltip="Patreon"><i class="mdi mdi-patreon"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'index.client' %}active{% endif %}" href="{{ path('index.client') }}" data-tooltip="Download Client"><i class="mdi mdi-microsoft-windows"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'index.legal' %}active{% endif %}" href="{{ path('index.legal') }}" data-tooltip="Legal"><i class="mdi mdi-gavel"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'index.index' %}active{% endif %}" href="{{ path('index.index') }}" title="Home"><i class="mdi mdi-home-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'search.index' %}active{% endif %}" href="{{ path('search.index') }}" title="Search"><i class="mdi mdi-magnify"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'index.client' %}active{% endif %}" href="{{ path('index.client') }}" title="Download Client"><i class="mdi mdi-microsoft-windows"></i></a>
<a class="item" href="https://www.patreon.com/spinshare" target="_blank" title="Patreon" data-tooltipPosition="right"><i class="mdi mdi-patreon"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'index.legal' %}active{% endif %}" href="{{ path('index.legal') }}" title="Legal"><i class="mdi mdi-gavel"></i></a>
</nav>
<nav>
{% if is_granted("ROLE_USER") %}
{% if is_granted("ROLE_MODERATOR") or is_granted("ROLE_ADMIN") %}
<a class="item {% if app.request.attributes.get('_route') == 'moderation.index' %}active{% endif %}" href="{{ path('moderation.index') }}" data-tooltip="Moderator Dashboard"><i class="mdi mdi-shield-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'moderation.index' %}active{% endif %}" href="{{ path('moderation.index') }}" title="Moderator Dashboard"><i class="mdi mdi-shield-outline"></i></a>
{% endif %}
<a class="item {% if app.request.attributes.get('_route') == 'upload.index' %}active{% endif %}" href="{{ path('upload.index') }}" data-tooltip="Upload"><i class="mdi mdi-upload-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'user.settings' %}active{% endif %}" href="{{ path('user.settings') }}" data-tooltip="Settings"><i class="mdi mdi-cog-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'user.detail' and app.request.attributes.get('_route_params')['userId']|default('') == app.user.id %}active{% endif %}" href="{{ path('user.detail', {userId: app.user.id}) }}" data-tooltip="My Profile"><i class="mdi mdi-account-circle-outline"></i></a>
<a class="item" href="{{ path('fos_user_security_logout') }}" data-tooltip="Logout"><i class="mdi mdi-close-circle-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'upload.index' %}active{% endif %}" href="{{ path('upload.index') }}" title="Upload"><i class="mdi mdi-upload-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'user.settings' %}active{% endif %}" href="{{ path('user.settings') }}" title="Settings"><i class="mdi mdi-cog-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'user.detail' and app.request.attributes.get('_route_params')['userId']|default('') == app.user.id %}active{% endif %}" href="{{ path('user.detail', {userId: app.user.id}) }}" title="My Profile"><i class="mdi mdi-account-circle-outline"></i></a>
<a class="item" href="{{ path('fos_user_security_logout') }}" title="Logout"><i class="mdi mdi-close-circle-outline"></i></a>
{% else %}
<a class="item" href="{{ path('fos_user_security_login') }}" data-tooltip="Login/Register"><i class="mdi mdi-login-variant"></i></a>
<a class="item" href="{{ path('fos_user_security_login') }}" title="Login/Register"><i class="mdi mdi-login-variant"></i></a>
{% endif %}
</nav>
</aside>
......@@ -45,10 +48,7 @@
{% block content %}{% endblock %}
</main>
<div class="tooltip"></div>
<!-- Scripts -->
<script src="{{ asset('assets/js/tooltip.js') }}"></script>
{% block scripts %}{% endblock %}
</body>
</html>
\ No newline at end of file
......@@ -31,7 +31,7 @@
<div class="song-list">
{% for song in newSongs %}
<a class="song-item" href="{{ path('song.detail', {songId: song.id}) }}">
<div class="song-cover" style="background-image: url({{ asset('uploads/cover/' ~ song.fileReference ~ '.png?t=' ~ date().timestamp) }});">
<div class="song-cover" style="background-image: url({{ asset("uploads/cover/" ~ song.fileReference ~ ".png?v=" ~ date().timestamp) }}), url({{ asset("assets/img/defaultAlbumArt.jpg") }});">
<div class="song-charter-info">
<div class="song-charter"><i class="mdi mdi-account-circle"></i><span>{{ song.charter|default('Unknown') }}</span></div>
</div>
......@@ -58,7 +58,7 @@
<div class="song-list">
{% for song in popularSongs %}
<a class="song-item" href="{{ path('song.detail', {songId: song.id}) }}">
<div class="song-cover" style="background-image: url({{ asset('uploads/cover/' ~ song.fileReference ~ '.png?t=' ~ date().timestamp) }});">
<div class="song-cover" style="background-image: url({{ asset("uploads/cover/" ~ song.fileReference ~ ".png?v=" ~ date().timestamp) }}), url({{ asset("assets/img/defaultAlbumArt.jpg") }});">
<div class="song-charter-info">
<div class="song-charter"><i class="mdi mdi-account-circle"></i><span>{{ song.charter|default('Unknown') }}</span></div>
</div>
......
......@@ -9,7 +9,7 @@
<div class="title">Song</div>
<div class="report-data">
{% if reportSong is not null %}
<img src="{{ asset('uploads/cover/' ~ reportSong.fileReference ~ '.png?t=' ~ date().timestamp) }}" class="song-cover" alt="Song Cover" />
<img src="{{ asset("uploads/cover/" ~ reportSong.fileReference ~ ".png?v=" ~ date().timestamp) }}" class="song-cover" alt="Song Cover" />
<div class="report-item">
<div class="column">Title</div>
......
......@@ -8,7 +8,7 @@
<div class="box">
<div class="title">User</div>
<div class="report-data">
<img src="{{ reportUser.coverReference ? asset('uploads/avatar/' ~ reportUser.coverReference ~ '?t=' ~ date().timestamp) : asset('assets/img/defaultAvatar.jpg') }}" class="avatar-icon" alt="Avatar" />
<img src="{{ asset('uploads/avatar/' ~ reportUser.coverReference ~ '?t=' ~ date().timestamp) }}" class="avatar-icon" alt="Avatar" />
<div class="report-item">
<div class="column">Username</div>
......@@ -22,6 +22,10 @@
<div class="column">Is Verified?</div>
<div class="value">{{ reportUser.isVerified ? "Yes" : "No" }}</div>
</div>
<div class="report-item">
<div class="column">Is Patreon?</div>
<div class="value">{{ reportUser.isPatreon ? "Yes" : "No" }}</div>
</div>
<div class="report-item">
<div class="column">Last Login</div>
<div class="value">{{ reportUser.lastLogin|date('d/m/Y - H:i') }}</div>
......
......@@ -9,7 +9,7 @@
<div class="title">Report a song</div>
<div class="song-report">
<div class="song-item inactive">
<div class="song-cover" style="background-image: url({{ asset('uploads/cover/' ~ songToReport.fileReference ~ '.png?t=' ~ date().timestamp) }});">
<div class="song-cover" style="background-image: url({{ asset("uploads/cover/" ~ songToReport.fileReference ~ ".png?v=" ~ date().timestamp) }}), url({{ asset("assets/img/defaultAlbumArt.jpg") }});">
<div class="song-charter-info">
<div class="song-charter"><i class="mdi mdi-account-circle"></i><span>{{ songToReport.charter }}</span></div>
</div>
......
......@@ -9,7 +9,7 @@
<div class="title">Report a user</div>
<div class="user-report">
<div class="user-item inactive">
<div class="user-avatar" style="background-image: url({{ (userToReport.coverReference != "") ? asset('uploads/avatar/' ~ userToReport.coverReference ~ '?t=' ~ date().timestamp) : asset('assets/img/defaultAvatar.jpg') }})"></div>
<div class="user-avatar" style="background-image: url({{ asset('uploads/avatar/' ~ userToReport.coverReference ~ '?t=' ~ date().timestamp) }}), url({{ asset("assets/img/defaultAvatar.jpg") }});"></div>
<div class="user-metadata">
<div class="user-name">{{ userToReport.username }}</div>
</div>
......
......@@ -25,12 +25,15 @@
<div class="user-list">
{% for user in results.users %}
<a href="{{ path('user.detail', {userId: user.id}) }}" class="user-item">
<div class="user-avatar" style="background-image: url({{ (user.coverReference != "") ? asset('uploads/avatar/' ~ user.coverReference ~ '?t=' ~ date().timestamp) : asset('assets/img/defaultAvatar.jpg') }});"></div>
<div class="user-avatar" style="background-image: url({{ asset('uploads/avatar/' ~ user.coverReference ~ '?t=' ~ date().timestamp) }}), url({{ asset("assets/img/defaultAvatar.jpg") }});"></div>
<div class="user-metadata">
<div class="user-name">{{ user.userName }}</div>
{% if user.isVerified %}
<div class="user-badge"><i class="mdi mdi-check-decagram"></i></div>
{% endif %}
{% if user.isPatreon %}
<div class="user-badge"><i class="mdi mdi-patreon"></i></div>
{% endif %}
</div>
</a>
{% endfor %}
......@@ -45,7 +48,7 @@
<div class="song-list">
{% for song in results.songs %}
<a class="song-item" href="{{ path('song.detail', {songId: song.id}) }}">
<div class="song-cover" style="background-image: url({{ asset('uploads/cover/' ~ song.fileReference ~ '.png?t=' ~ date().timestamp) }});">
<div class="song-cover" style="background-image: url({{ asset("uploads/cover/" ~ song.fileReference ~ ".png?v=" ~ date().timestamp) }}), url({{ asset("assets/img/defaultAlbumArt.jpg") }});">
<div class="song-charter-info">
<div class="song-charter"><i class="mdi mdi-account-circle"></i><span>{{ song.charter|default('Unknown') }}</span></div>
</div>
......
......@@ -10,7 +10,7 @@
<p>Do you really want to remove your chart? <strong>This action cannot be undone!</strong></p>
</div>
<div class="song-item inactive">
<div class="song-cover" style="background-image: url({{ asset('uploads/cover/' ~ song.fileReference ~ '.png?t=' ~ date().timestamp) }});">
<div class="song-cover" style="background-image: url({{ asset("uploads/cover/" ~ song.fileReference ~ ".png?v=" ~ date().timestamp) }}), url({{ asset("assets/img/defaultAlbumArt.jpg") }});">
</div>
<div class="song-metadata">
<div class="song-title">{{ song.title|default('Untitles') }}</div>
......
......@@ -2,12 +2,19 @@
{% block title %}{{ song.title }}{% endblock %}
{% block meta %}
<meta property="og:title" content="{{ song.title }} on SpinSha.re"/>
<meta property="og:type" content="music.song"/>
<meta property="og:url" content="{{ path('song.detail', {songId: song.id}) }}"/>
<meta property="og:image" content="{{ asset("uploads/cover/" ~ song.fileReference ~ ".png?v=" ~ date().timestamp) }}"/>
{% endblock %}
{% block content %}
<section class="section-song-detail">
<div class="song-detail-background" style="background-image: url({{ asset('uploads/cover/' ~ song.fileReference ~ '.png?t=' ~ date().timestamp) }});">
<div class="song-detail-background" style="background-image: url({{ asset("uploads/cover/" ~ song.fileReference ~ ".png?v=" ~ date().timestamp) }}), url({{ asset("assets/img/defaultAlbumArt.jpg") }});">
<div class="song-detail-dim">
<div class="song-detail active">
<div class="song-cover" style="background-image: url({{ asset('uploads/cover/' ~ song.fileReference ~ '.png?t=' ~ date().timestamp) }});">
<div class="song-cover" style="background-image: url({{ asset("uploads/cover/" ~ song.fileReference ~ ".png?v=" ~ date().timestamp) }}), url({{ asset("assets/img/defaultAlbumArt.jpg") }});">
</div>
<div class="song-meta-data">
<div class="song-title">{{ song.title }}</div>
......@@ -30,12 +37,15 @@
</div>
<div class="song-uploader">
<a href="{{ path('user.detail', {userId: uploader.id}) }}" class="user-item">
<div class="user-avatar" style="background-image: url({{ (uploader.coverReference != "") ? asset('uploads/avatar/' ~ uploader.coverReference ~ '?t=' ~ date().timestamp) : asset('assets/img/defaultAvatar.jpg') }});"></div>
<div class="user-avatar" style="background-image: url({{ asset('uploads/avatar/' ~ uploader.coverReference ~ '?t=' ~ date().timestamp) }}), url({{ asset("assets/img/defaultAvatar.jpg") }});"></div>
<div class="user-metadata">
<div class="user-username">{{ uploader.username }}</div>
{% if uploader.isVerified %}
<div class="user-badge"><i class="mdi mdi-check-decagram"></i></div>
{% endif %}
{% if uploader.isPatreon %}
<div class="user-badge"><i class="mdi mdi-patreon"></i></div>
{% endif %}
</div>
</a>
</div>
......
......@@ -4,10 +4,10 @@
{% block content %}
<section class="section-user-detail">
<div class="user-detail-background" style="background-image: url({{ (user.coverReference != "") ? asset('uploads/avatar/' ~ user.coverReference ~ '?t=' ~ date().timestamp) : asset('assets/img/defaultAvatar.jpg') }});">
<div class="user-detail-background" style="background-image: url({{ asset('uploads/avatar/' ~ user.coverReference ~ '?t=' ~ date().timestamp) }}), url({{ asset("assets/img/defaultAvatar.jpg") }});">
<div class="user-detail-dim">
<div class="user-detail">
<div class="user-avatar" style="background-image: url({{ (user.coverReference != "") ? asset('uploads/avatar/' ~ user.coverReference ~ '?t=' ~ date().timestamp) : asset('assets/img/defaultAvatar.jpg') }});">
<div class="user-avatar" style="background-image: url({{ asset('uploads/avatar/' ~ user.coverReference ~ '?t=' ~ date().timestamp) }}), url({{ asset("assets/img/defaultAvatar.jpg") }});">
{% if app.user.id == user.id %}
<form method="post" action="" enctype="multipart/form-data" class="user-avatar-change">
<input typoe="hidden" name="save" value="changeAvatar" />
......@@ -19,7 +19,10 @@
<div class="user-meta-data">
<div class="user-name">{{ user.username }}</div>
{% if user.isVerified %}
<div class="user-badge"><i class="mdi mdi-check-decagram"></i></div>
<div class="user-badge" title="Verified"><i class="mdi mdi-check-decagram"></i></div>
{% endif %}
{% if user.isPatreon %}
<div class="user-badge" title="Patreon Supporter"><i class="mdi mdi-patreon"></i></div>
{% endif %}
</div>
</div>
......@@ -30,7 +33,7 @@
<a href="{{ path('report.user', {userId: user.id}) }}" class="button">Report</a>
</div>
{% if is_granted('ROLE_MODERATOR') and user.id != app.user.id %}
<div class="user-detail-actions">
<div class="user-detail-actions-moderation">
{% if user.enabled %}
<a href="{{ path('moderation.user.ban', {userId: user.id}) }}" class="button">Ban User</a>
{% else %}
......@@ -40,6 +43,7 @@
<a href="{{ path('moderation.user.toggleVerified', {userId: user.id}) }}" class="button">{{ user.isVerified ? "Unverify" : "Verify" }}</a>
{% if is_granted('ROLE_ADMIN') %}
<a href="{{ path('moderation.user.toggleMod', {userId: user.id}) }}" class="button">{{ ("ROLE_MODERATOR" in user.roles) ? "Demote to User" : "Promote to Mod" }}</a>
<a href="{{ path('moderation.user.togglePatreon', {userId: user.id}) }}" class="button">{{ user.isPatreon ? "Remove Patreon" : "Make Patreon" }}</a>
{% endif %}
</div>
{% endif %}
......@@ -51,7 +55,7 @@
<div class="song-list">
{% for song in uploads %}
<a class="song-item" href="{{ path('song.detail', {songId: song.id}) }}">
<div class="song-cover" style="background-image: url({{ asset('uploads/cover/' ~ song.fileReference ~ '.png?t=' ~ date().timestamp) }});">
<div class="song-cover" style="background-image: url({{ asset("uploads/cover/" ~ song.fileReference ~ ".png?v=" ~ date().timestamp) }}), url({{ asset("assets/img/defaultAlbumArt.jpg") }});">
<div class="song-charter-info">
<div class="song-charter"><i class="mdi mdi-account-circle"></i><span>{{ song.charter|default('Unknown') }}</span></div>
</div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment