init torrent categories feature #26

This commit is contained in:
ghost 2023-11-04 06:26:01 +02:00
parent 35babed517
commit 701b448cd6
18 changed files with 1113 additions and 77 deletions

View file

@ -0,0 +1,109 @@
{% extends 'default/layout.html.twig' %}
{% block title %}{{'Edit categories'|trans }} - {{'Torrent'|trans }} #{{ torrentId }} - {{ name }}{% endblock %}
{% block main_content %}
<div class="padding-24-px margin-y-8-px border-radius-3-px background-color-night">
<div class="margin-b-16-px padding-b-16-px border-bottom-default">
<h1>
{{'Edit categories for torrent' | trans }}
<a href="{{ path('torrent_info', { torrentId : torrentId }) }}">#{{ torrentId }}</a>
</h1>
</div>
<form name="categories" method="post" action="{{ path('torrent_categories_edit', { torrentId : torrentId }) }}">
<div class="margin-y-16-px">
<label for="categories">
{{'Content category'|trans }}
</label>
<sub class="opacity-0 parent-hover-opacity-09" title="{{ 'This torrent have selected categories' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
</svg>
</sub>
{% for error in form.categories.error %}
<div class="text-color-red margin-y-8-px">
{{ error }}
</div>
{% endfor %}
<div class="margin-t-8-px margin-b-16-px">
{% for category in categories | sort %}
<div class="margin-t-8-px margin-b-4-px margin-r-8-px display-inline-block min-width-120-px">
{% if category in form.categories.attribute.value %}
<input type="checkbox" name="categories[]" id="{{ category }}" value="{{ category }}" checked="checked" />
{% else %}
<input type="checkbox" name="categories[]" id="{{ category }}" value="{{ category }}" />
{% endif %}
<label class="margin-l-4-px" for="{{ category }}">
{{ category | u.title }}
</label>
</div>
{% endfor %}
{#
<option class="padding-x-8-px padding-y-8-px" value="other">
{{'Other...'|trans }}
</option>
#}
</div>
<div class="margin-b-16-px border-bottom-default"></div>
</div>
<div class="text-right">
<a class="margin-r-8-px" href="{{ path('torrent_info', { torrentId : torrentId }) }}">
{{'cancel'|trans }}
</a>
<input class="button-green" type="submit" value="{{'Submit'|trans }}" />
</div>
</form>
</div>
{% for edition in editions %}
<div class="padding-x-24-px padding-y-16-px margin-y-8-px border-radius-3-px {% if edition.active %}background-color-night-light{% else %}background-color-night{% endif %} ">
{% if edition.active %}
{{ edition.added | format_ago }}
{% else %}
<a href="{{ path('torrent_categories_edit', { torrentId : torrentId, torrentCategoriesId : edition.id }) }}">
{{ edition.added | format_ago }}
</a>
{% endif %}
{{ 'by'|trans }}
<a href="{{ path('user_info', { userId : edition.user.id }) }}">
<img class="border-radius-50 border-color-default vertical-align-middle" src="{{ edition.user.identicon }}" alt="{{'identicon'|trans }}" />
</a>
<div class="float-right">
{% if session.moderator or session.owner %}
<a class="margin-r-8-px text-color-red" href="{{ path('torrent_categories_delete', { torrentId : torrentId, torrentCategoriesId : edition.id }) }}" title="{{ 'Delete' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-x-circle" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
<path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"/>
</svg>
</a>
{% endif %}
{% if edition.approved %}
{% if session.moderator %}
<a href="{{ path('torrent_categories_approve', { torrentId : torrentId, torrentCategoriesId : edition.id }) }}" title="{{ 'Disapprove' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z"/>
</svg>
</a>
{% else %}
<span title="{{ 'Approved' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z"/>
</svg>
</span>
{% endif %}
{% else %}
{% if session.moderator %}
<a href="{{ path('torrent_categories_approve', { torrentId : torrentId, torrentCategoriesId : edition.id }) }}" title="{{ 'Approve' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-hourglass" viewBox="0 0 16 16">
<path d="M2 1.5a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-1v1a4.5 4.5 0 0 1-2.557 4.06c-.29.139-.443.377-.443.59v.7c0 .213.154.451.443.59A4.5 4.5 0 0 1 12.5 13v1h1a.5.5 0 0 1 0 1h-11a.5.5 0 1 1 0-1h1v-1a4.5 4.5 0 0 1 2.557-4.06c.29-.139.443-.377.443-.59v-.7c0-.213-.154-.451-.443-.59A4.5 4.5 0 0 1 3.5 3V2h-1a.5.5 0 0 1-.5-.5zm2.5.5v1a3.5 3.5 0 0 0 1.989 3.158c.533.256 1.011.791 1.011 1.491v.702c0 .7-.478 1.235-1.011 1.491A3.5 3.5 0 0 0 4.5 13v1h7v-1a3.5 3.5 0 0 0-1.989-3.158C8.978 9.586 8.5 9.052 8.5 8.351v-.702c0-.7.478-1.235 1.011-1.491A3.5 3.5 0 0 0 11.5 3V2h-7z"/>
</svg>
</a>
{% else %}
<span title="{{ 'Waiting for approve' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-hourglass" viewBox="0 0 16 16">
<path d="M2 1.5a.5.5 0 0 1 .5-.5h11a.5.5 0 0 1 0 1h-1v1a4.5 4.5 0 0 1-2.557 4.06c-.29.139-.443.377-.443.59v.7c0 .213.154.451.443.59A4.5 4.5 0 0 1 12.5 13v1h1a.5.5 0 0 1 0 1h-11a.5.5 0 1 1 0-1h1v-1a4.5 4.5 0 0 1 2.557-4.06c.29-.139.443-.377.443-.59v-.7c0-.213-.154-.451-.443-.59A4.5 4.5 0 0 1 3.5 3V2h-1a.5.5 0 0 1-.5-.5zm2.5.5v1a3.5 3.5 0 0 0 1.989 3.158c.533.256 1.011.791 1.011 1.491v.702c0 .7-.478 1.235-1.011 1.491A3.5 3.5 0 0 0 4.5 13v1h7v-1a3.5 3.5 0 0 0-1.989-3.158C8.978 9.586 8.5 9.052 8.5 8.351v-.702c0-.7.478-1.235 1.011-1.491A3.5 3.5 0 0 0 11.5 3V2h-7z"/>
</svg>
</span>
{% endif %}
{% endif %}
</div>
</div>
{% endfor %}
{% endblock %}

View file

@ -24,7 +24,7 @@
</div>
{% endfor %}
<div class="margin-t-8-px margin-b-16-px">
{% for locale in locales %}
{% for locale in locales | sort %}
<div class="margin-t-8-px margin-b-4-px margin-r-8-px display-inline-block min-width-120-px">
{% if locale in form.locales.attribute.value %}
<input type="checkbox" name="locales[]" id="{{ locale }}" value="{{ locale }}" checked="checked" />

View file

@ -339,12 +339,28 @@
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
</svg>
</a>
{{ 'Locales' | trans }}
{{ 'Locale' | trans }}
<div class="padding-b-8-px border-bottom-default"></div>
<div class="padding-t-16-px text-left">
{% if torrent.locales %}
<div class="padding-y-4-px">
{% for i, locale in torrent.locales %}{% if i > 0 %},{% endif %} {{ locale|locale_name(locale)|u.title }}{% endfor %}
{% for i, locale in torrent.locales | sort %}{% if i > 0 %},{% endif %} {{ locale | locale_name(locale) | u.title }}{% endfor %}
</div>
{% endif %}
</div>
</div>
<div class="text-right">
<a class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_categories_edit', { torrentId : torrent.id }) }}" title="{{'Edit'|trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
</svg>
</a>
{{ 'Category' | trans }}
<div class="padding-b-8-px border-bottom-default"></div>
<div class="padding-t-16-px text-left">
{% if torrent.categories %}
<div class="padding-y-4-px">
{% for i, category in torrent.categories | sort %}{% if i > 0 %},{% endif %} {{ category | u.title }}{% endfor %}
</div>
{% endif %}
</div>

View file

@ -31,7 +31,7 @@
</div>
{% endfor %}
</div>
{% for locale in locales %}
{% for locale in locales | sort %}
<div class="margin-t-8-px margin-b-4-px margin-r-8-px display-inline-block min-width-120-px">
{% if locale in form.locales.attribute.value %}
<input type="checkbox" name="locales[]" id="{{ locale }}" value="{{ locale }}" checked="checked" />
@ -48,9 +48,42 @@
#}
</div>
<div class="margin-b-16-px border-bottom-default"></div>
<div class="margin-y-16-px">
<div class="margin-b-8-px">
<label for="categories">
{{'Content category' | trans }}
</label>
<sub class="opacity-0 parent-hover-opacity-09" title="{{ 'This torrent have selected categories' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
</svg>
</sub>
{% for error in form.categories.error %}
<div class="text-color-red margin-y-8-px">
{{ error }}
</div>
{% endfor %}
</div>
{% for category in categories | sort %}
<div class="margin-t-8-px margin-b-4-px margin-r-8-px display-inline-block min-width-120-px">
{% if category in form.categories.attribute.value %}
<input type="checkbox" name="categories[]" id="{{ category }}" value="{{ category }}" checked="checked" />
{% else %}
<input type="checkbox" name="categories[]" id="{{ category }}" value="{{ category }}" />
{% endif %}
<label class="margin-l-4-px" for="{{ category }}">
{{ category | u.title }}
</label>
</div>
{% endfor %}
{#
{{'Other...'|trans }}
#}
</div>
<div class="margin-b-16-px border-bottom-default"></div>
<div>
<input type="checkbox" name="sensitive" id="sensitive" value="true" {% if form.sensitive.attribute.value %}checked="checked"{% endif %} />
<label for="sensitive">
<label class="margin-l-4-px" for="sensitive">
{{'Sensitive'|trans }}
</label>
<sub class="opacity-0 parent-hover-opacity-09" title="{{ 'Mark torrent content as sensitive' | trans }}">

View file

@ -172,7 +172,15 @@
{{ 'Languages' | trans }}
</td>
<td class="width-80 line-height-20-px">
{% for i, locale in user.locales %}{% if i > 0 %},{% endif %} {{ locale|locale_name(locale)|u.title }}{% endfor %}
{% for i, locale in user.locales | sort %}{% if i > 0 %},{% endif %} {{ locale | locale_name(locale) | u.title }}{% endfor %}
</td>
</tr>
<tr>
<td class="width-20">
{{ 'Categories' | trans }}
</td>
<td class="width-80 line-height-20-px">
{% for i, category in user.categories | sort %}{% if i > 0 %},{% endif %} {{ category | u.title }}{% endfor %}
</td>
</tr>
<tr>

View file

@ -89,7 +89,7 @@
<td class="padding-t-16-px padding-b-8-px">
{% for locale in locales %}
<div class="margin-t-4-px margin-b-8-px margin-r-8-px display-inline-block min-width-120-px">
{% if locale in user.locales %}
{% if locale in user.locales | sort %}
<input name="locales[]" id="{{ locale }}" type="checkbox" value="{{ locale }}" checked="checked" />
{% else %}
<input name="locales[]" id="{{ locale }}" type="checkbox" value="{{ locale }}" />
@ -102,10 +102,31 @@
</td>
</tr>
<tr>
<td class="padding-y-12-px">
<td class="padding-y-16-px">
<div class="margin-t-4-px">
{{ 'Categories' | trans }}
</div>
</td>
<td class="padding-t-16-px padding-b-8-px border-top-default">
{% for category in categories | sort %}
<div class="margin-t-4-px margin-b-8-px margin-r-8-px display-inline-block min-width-120-px">
{% if category in user.categories %}
<input name="categories[]" id="{{ category }}" type="checkbox" value="{{ category }}" checked="checked" />
{% else %}
<input name="categories[]" id="{{ category }}" type="checkbox" value="{{ category }}" />
{% endif %}
<label class="margin-x-4-px" for="{{ category }}">
{{ category | u.title | trans }}
</label>
</div>
{% endfor %}
</td>
</tr>
<tr>
<td class="padding-y-16-px">
{{ 'Sensitive' | trans }}
</td>
<td class="padding-y-12-px border-top-default">
<td class="padding-t-16-px padding-b-8-px border-top-default">
<div class="margin-r-8-px">
{% if user.sensitive %}
<input name="sensitive" id="sensitive" type="checkbox" value="true" checked="checked" />