145 lines
9.3 KiB
HTML
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 %} |