Files
Mangarr/templates/manga/_manga_details.html.twig
Jérémy Guillot c56f72b813 Added:
- toogle chapter visibility
- delete chapter cbz
- preferred ContentSource.php and modal
- minor fixes
2024-07-21 22:21:04 +02:00

241 lines
14 KiB
Twig

{% block body %}
<div class="relative">
<div class="shadow-lg text-white">
<div class="relative h-96 bg-cover bg-center" style="background-image: url('{{ manga.imageUrl }}')">
<div class="absolute inset-0 bg-black opacity-50"></div>
<div class="absolute inset-0 flex flex-row justify-center p-4">
<div class="hidden mr-12 xl:block 2xl:block">
<img src="{{ manga.thumbnailUrl }}" alt="{{ manga.title }}" class="max-w-72 max-h-72 ml-4">
</div>
<div class="flex flex-col">
<div class="flex items-center mb-4">
<i class="fas fa-bookmark text-white text-3xl"></i>
<h1 class="text-3xl font-bold ml-4">{{ manga.title }}</h1>
</div>
<div class="flex items-center mb-4">
<span class="mr-4">{{ manga.publicationYear }}</span>
<span>Chapters: {{ manga.chapters.count }}</span>
</div>
<div class="flex items-center mb-4">
<i class="fas fa-folder text-gray-400 mr-2"></i>
<span
class="truncate">/media/mangas/{{ manga.title }} ({{ manga.publicationYear }})</span>
<span
class="ml-auto bg-green-600 py-1 px-2 rounded">{{ manga.status ?? 'Terminé' }}</span>
</div>
<div class="flex items-center mb-4">
{% set genre_count = 0 %}
{% for genre in manga.genres %}
{% if genre_count < 5 %}
<span class="bg-gray-700 py-1 px-2 rounded-sm mr-2">{{ genre }}</span>
{% set genre_count = genre_count + 1 %}
{% endif %}
{% endfor %}
{% if genre_count == 5 and manga.genres|length > 5 %}
<span class="bg-gray-700 py-1 px-2 rounded-sm mr-2">...</span>
{% endif %}
</div>
<div class="mb-4">
<div class="flex items-center mb-2">
<i class="fas fa-heart text-red-500 mr-2"></i>
<span>{{ manga.rating|round(2) }}</span>
</div>
<p>{{ manga.description|truncate(500) }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<turbo-frame id="chapter_list"
src="{{ fragment_uri(controller('App\\Controller\\MangaController::_chaptersByManga', {'id': manga.id})) }}"
>
</turbo-frame>
{# Modal d'édition #}
<twig:Modal
openTrigger="openEditModal"
closeTrigger="closeEditModal"
title="Edit Manga"
modalClass="w-full max-w-4xl"
>
{% block content %}
{{ form_start(form, {'action': path('app_manga_edit', {'id': manga.id}), 'attr': {'id': 'editForm', 'data-turbo-form': 'true'}}) }}
{% do form.alternativeSlugs.setRendered() %}
<div class="space-y-4 overflow-y-auto px-4">
{{ form_row(form.title, {'label_attr': {'class': 'block text-sm font-medium text-gray-700'}, 'row_attr': {'class': 'mt-1'}}) }}
{{ form_row(form.slug, {
'label_attr': {'class': 'block text-sm font-medium text-gray-700'},
'row_attr': {'class': 'mt-1'},
'attr': {
'class': 'w-full px-3 py-2 bg-gray-100 border border-gray-300 rounded-md focus:outline-none text-gray-500',
'readonly': true
}
}) }}
{{ form_row(form.publicationYear, {'label_attr': {'class': 'block text-sm font-medium text-gray-700'}, 'row_attr': {'class': 'mt-1'}}) }}
{{ form_row(form.description, {'label_attr': {'class': 'block text-sm font-medium text-gray-700'}, 'row_attr': {'class': 'mt-1'}}) }}
{{ form_row(form.author, {'label_attr': {'class': 'block text-sm font-medium text-gray-700'}, 'row_attr': {'class': 'mt-1'}}) }}
{{ form_row(form.status, {'label_attr': {'class': 'block text-sm font-medium text-gray-700'}, 'row_attr': {'class': 'mt-1'}}) }}
{{ form_row(form.rating, {'label_attr': {'class': 'block text-sm font-medium text-gray-700'}, 'row_attr': {'class': 'mt-1'}}) }}
<div {{ stimulus_controller('collection') }}>
<label class="block text-sm font-medium text-gray-700">Slugs alternatifs</label>
<div data-collection-target="container" class="grid grid-cols-4 gap-2 mt-1">
{% for slug in form.alternativeSlugs %}
<div
class="inline-flex items-center bg-gray-100 rounded-full px-3 py-1 text-sm collection-item">
{{ form_widget(slug, {'attr': {'class': 'bg-transparent border-none focus:outline-none focus:border-b focus:border-green-500 p-0 w-full'}}) }}
<button type="button" data-action="collection#remove"
class="ml-2 text-gray-500 hover:text-green-500 flex-shrink-0">
<i class="fas fa-times"></i>
</button>
</div>
{% endfor %}
</div>
<button type="button" data-action="collection#add"
class="mt-2 text-sm text-green-500 hover:text-green-700">
+ Ajouter un slug alternatif
</button>
<template data-collection-target="template">
<div
class="inline-flex items-center bg-gray-100 rounded-full px-3 py-1 text-sm collection-item">
{{ form_widget(form.alternativeSlugs.vars.prototype, {'attr': {'class': 'bg-transparent border-none focus:outline-none focus:border-b focus:border-green-500 p-0 w-full'}}) }}
<button type="button" data-action="collection#remove"
class="ml-2 text-gray-500 hover:text-green-500 flex-shrink-0">
<i class="fas fa-times"></i>
</button>
</div>
</template>
</div>
<div {{ stimulus_controller('collection') }}>
<label class="block text-sm font-medium text-gray-700">{{ form_label(form.genres) }}</label>
<div data-collection-target="container" class="grid grid-cols-4 gap-2 mt-1">
{% for genre in form.genres %}
<div
class="inline-flex items-center bg-gray-100 rounded-full px-3 py-1 text-sm collection-item">
{{ form_widget(genre, {'attr': {'class': 'bg-transparent border-none focus:outline-none focus:border-b focus:border-green-500 p-0 w-full'}}) }}
<button type="button" data-action="collection#remove"
class="ml-2 text-gray-500 hover:text-green-500 flex-shrink-0">
<i class="fas fa-times"></i>
</button>
</div>
{% endfor %}
</div>
<button type="button" data-action="collection#add"
class="mt-2 text-sm text-green-500 hover:text-green-700">
+ Ajouter un genre
</button>
<template data-collection-target="template">
<div
class="inline-flex items-center bg-gray-100 rounded-full px-3 py-1 text-sm collection-item">
{{ form_widget(form.genres.vars.prototype, {'attr': {'class': 'bg-transparent border-none focus:outline-none focus:border-b focus:border-green-500 p-0 w-full'}}) }}
<button type="button" data-action="collection#remove"
class="ml-2 text-gray-500 hover:text-green-500 flex-shrink-0">
<i class="fas fa-times"></i>
</button>
</div>
</template>
</div>
</div>
{{ form_end(form) }}
{% endblock %}
{% block footer %}
<button type="button" data-action="modal#close"
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
Cancel
</button>
<button type="submit" form="editForm"
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-600 text-base font-medium text-white hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 sm:ml-3 sm:w-auto sm:text-sm">
Save
</button>
{% endblock %}
</twig:Modal>
{# Modal de confirmation de suppression #}
<twig:Modal
openTrigger="openDeleteModal"
closeTrigger="closeDeleteModal"
title="Delete Manga"
>
<twig:block name="content">
<p class="text-sm text-gray-500">
Are you sure you want to delete this manga? This action cannot be undone.
</p>
</twig:block>
<twig:block name="footer">
<button
{{ stimulus_controller('toolbar', { mangaId: manga.id }) }}
{{ stimulus_action('toolbar', 'confirmDelete') }}
type="button"
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">
Delete
</button>
<button type="button" data-action="modal#close"
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
Cancel
</button>
</twig:block>
</twig:Modal>
<twig:Modal
openTrigger="openPreferredSourcesModal"
closeTrigger="closePreferredSourcesModal"
title="Manage Preferred Sources"
modalClass="w-full max-w-4xl"
>
{% block content %}
<div {{ stimulus_controller('preferred-sources', {
mangaId: manga.id,
preferredSources: manga.preferredSources|map(s => s.id)|json_encode,
allSources: contentSources|map(s => {
id: s.id,
name: s.cleanBaseUrl
})|json_encode
}) }}>
<div>
<h3 class="text-lg font-medium text-gray-900">Preferred Sources</h3>
<ul data-preferred-sources-target="preferredList" class="mt-2 space-y-2">
{% for source in manga.preferredSources %}
<li data-id="{{ source.id }}" draggable="true"
class="flex items-center justify-between p-2 bg-gray-100 rounded cursor-move">
<span>{{ source.cleanBaseUrl }}</span>
<button type="button" data-action="preferred-sources#removeSource"
data-source-id="{{ source.id }}" class="text-red-500 hover:text-red-700">
<i class="fas fa-times"></i>
</button>
</li>
{% endfor %}
</ul>
</div>
<div>
<h3 class="text-lg font-medium text-gray-900">Available Sources</h3>
<ul data-preferred-sources-target="availableList" class="mt-2 space-y-2">
{% for source in contentSources %}
{% if source not in manga.preferredSources %}
<li class="flex items-center justify-between p-2 bg-gray-100 rounded">
<span>{{ source.cleanBaseUrl }}</span>
<button type="button" data-action="preferred-sources#addSource"
data-source-id="{{ source.id }}"
class="text-green-500 hover:text-green-700">
<i class="fas fa-plus"></i>
</button>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
{% block footer %}
<button type="button" data-action="modal#close"
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
Close
</button>
{% endblock %}
</twig:Modal>
{% endblock %}