ATS/templates/forms/form_list.html
2026-02-01 13:38:06 +03:00

145 lines
9.3 KiB
HTML

{% extends "base.html" %}
{% block title %}Forms - University ATS{% endblock %}
{% block content %}
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex flex-col md:flex-row md:items-start md:justify-between gap-4 mb-6">
<div class="flex-1">
<h1 class="text-3xl font-bold text-gray-900 flex items-center gap-3">
<div class="bg-temple-red/10 p-3 rounded-xl">
<i data-lucide="layout-template" class="w-8 h-8 text-temple-red"></i>
</div>
Forms
</h1>
</div>
<a href="{% url 'form_builder' %}" class="inline-flex items-center gap-2 bg-temple-red hover:bg-[#7a1a29] text-white font-semibold px-6 py-3 rounded-xl transition shadow-sm hover:shadow-md">
<i data-lucide="plus" class="w-5 h-5"></i> Create New Form
</a>
</div>
<!-- Search and Filter -->
<div class="bg-white rounded-2xl shadow-sm border border-gray-100 mb-6">
<div class="p-6">
<form method="get" class="flex flex-col md:flex-row gap-4">
<div class="flex-1">
<div class="relative">
<input type="text" class="w-full px-4 py-2.5 pr-12 border border-gray-300 rounded-xl text-sm text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-temple-red/20 focus:border-temple-red transition" name="search" placeholder="Search forms..." value="{{ request.GET.search }}">
<button class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-temple-red transition" type="submit">
<i data-lucide="search" class="w-5 h-5"></i>
</button>
</div>
</div>
<div class="md:w-64">
<select class="w-full px-4 py-2.5 border border-gray-300 rounded-xl text-sm text-gray-900 bg-white focus:outline-none focus:ring-2 focus:ring-temple-red/20 focus:border-temple-red transition" name="sort">
<option value="-created_at">Latest First</option>
<option value="created_at">Oldest First</option>
<option value="title">Title (A-Z)</option>
<option value="-title">Title (Z-A)</option>
</select>
</div>
</form>
</div>
</div>
<!-- Forms List -->
{% if page_obj %}
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{% for form in page_obj %}
<div class="bg-white rounded-2xl shadow-sm border border-gray-100 hover:shadow-md transition-shadow">
<div class="p-6">
<div class="flex justify-between items-start mb-3">
<h5 class="text-lg font-bold text-gray-900 mb-1">{{ form.title }}</h5>
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-bold uppercase bg-emerald-100 text-emerald-800">Active</span>
</div>
<p class="text-sm text-gray-600 mb-4 line-clamp-2">
{{ form.description|truncatewords:15 }}
</p>
<div class="space-y-2 mb-4">
<div class="flex items-center gap-2 text-sm text-gray-600">
<i data-lucide="user" class="w-4 h-4 text-gray-400"></i>
{{ form.created_by.username }}
</div>
<div class="flex items-center gap-2 text-sm text-gray-600">
<i data-lucide="calendar" class="w-4 h-4 text-gray-400"></i>
{{ form.created_at|date:"M d, Y" }}
</div>
<div class="flex items-center gap-2 text-sm text-gray-600">
<i data-lucide="bar-chart-3" class="w-4 h-4 text-gray-400"></i>
{{ form.submissions.count }} submissions
</div>
</div>
</div>
<div class="border-t border-gray-100 p-4 bg-gray-50/50">
<div class="flex flex-wrap gap-2">
{% if form.created_by == user %}
<a href="{% url 'edit_form' form.slug %}" class="inline-flex items-center gap-1 border border-amber-300 text-amber-700 hover:bg-amber-50 px-3 py-2 rounded-lg text-xs font-semibold transition">
<i data-lucide="edit-3" class="w-3 h-3"></i> Edit
</a>
{% endif %}
<a href="{% url 'form_preview' form.slug %}" class="inline-flex items-center gap-1 border border-temple-red text-temple-red hover:bg-temple-red/10 px-3 py-2 rounded-lg text-xs font-semibold transition" target="_blank">
<i data-lucide="eye" class="w-3 h-3"></i> Preview
</a>
<a href="{% url 'form_embed' form.slug %}" class="inline-flex items-center gap-1 border border-gray-300 text-gray-600 hover:bg-gray-100 px-3 py-2 rounded-lg text-xs font-semibold transition" target="_blank">
<i data-lucide="code-2" class="w-3 h-3"></i> Embed
</a>
<a href="{% url 'form_submissions' form.slug %}" class="inline-flex items-center gap-1 border border-blue-300 text-blue-700 hover:bg-blue-50 px-3 py-2 rounded-lg text-xs font-semibold transition">
<i data-lucide="list" class="w-3 h-3"></i> Submissions
</a>
</div>
</div>
</div>
{% endfor %}
</div>
<!-- Pagination -->
{% if page_obj.has_other_pages %}
<div class="bg-white rounded-2xl shadow-sm border border-gray-100 p-4 mt-6">
<div class="flex flex-col md:flex-row justify-between items-center gap-4">
<div class="text-sm text-gray-600">
Showing page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
</div>
<nav aria-label="Forms pagination" class="flex items-center gap-2">
{% if page_obj.has_previous %}
<a href="?page=1{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}{% if request.GET.sort %}&sort={{ request.GET.sort }}{% endif %}" class="px-3 py-2 bg-white border border-gray-200 rounded-lg text-sm text-gray-700 hover:bg-gray-50 transition" aria-label="First">
<i data-lucide="chevrons-left" class="w-4 h-4"></i>
</a>
<a href="?page={{ page_obj.previous_page_number }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}{% if request.GET.sort %}&sort={{ request.GET.sort }}{% endif %}" class="px-3 py-2 bg-white border border-gray-200 rounded-lg text-sm text-gray-700 hover:bg-gray-50 transition" aria-label="Previous">
<i data-lucide="chevron-left" class="w-4 h-4"></i>
</a>
{% endif %}
<span class="px-4 py-2 bg-temple-red text-white rounded-lg text-sm font-semibold">
{{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}{% if request.GET.sort %}&sort={{ request.GET.sort }}{% endif %}" class="px-3 py-2 bg-white border border-gray-200 rounded-lg text-sm text-gray-700 hover:bg-gray-50 transition" aria-label="Next">
<i data-lucide="chevron-right" class="w-4 h-4"></i>
</a>
<a href="?page={{ page_obj.paginator.num_pages }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}{% if request.GET.sort %}&sort={{ request.GET.sort }}{% endif %}" class="px-3 py-2 bg-white border border-gray-200 rounded-lg text-sm text-gray-700 hover:bg-gray-50 transition" aria-label="Last">
<i data-lucide="chevrons-right" class="w-4 h-4"></i>
</a>
{% endif %}
</nav>
</div>
</div>
{% endif %}
{% else %}
<div class="bg-white rounded-2xl shadow-sm border border-gray-100 p-12 text-center">
<i data-lucide="layout-template" class="w-16 h-16 text-temple-red mx-auto mb-4"></i>
<h3 class="text-xl font-semibold text-gray-900 mb-2">No forms found</h3>
<p class="text-gray-500 mb-6">Create your first form to get started.</p>
<a href="{% url 'form_builder' %}" class="inline-flex items-center gap-2 bg-temple-red hover:bg-[#7a1a29] text-white font-semibold px-6 py-3 rounded-xl transition shadow-sm hover:shadow-md">
<i data-lucide="plus" class="w-5 h-5"></i> Create Form
</a>
</div>
{% endif %}
</div>
<script>
lucide.createIcons();
</script>
{% endblock %}