|
1 | 1 | {% extends 'shopyo_dashboard/dashboard_base.html' %} |
2 | 2 |
|
| 3 | +{% block title %}Contact Messages{% endblock %} |
3 | 4 |
|
4 | | -{%block content%} |
5 | | -<br> |
6 | | -<div class="container"> |
| 5 | +{% block content %} |
| 6 | +<div class="space-y-8" x-data="{ selectedMessage: null, modalOpen: false }"> |
| 7 | + <!-- Header --> |
| 8 | + <div class="flex flex-col md:flex-row justify-between items-end md:items-center gap-4 border-b border-slate-100 dark:border-slate-800 pb-8"> |
| 9 | + <div> |
| 10 | + <h1 class="text-3xl font-black text-slate-900 dark:text-white tracking-tight uppercase">Contact Messages</h1> |
| 11 | + <p class="text-slate-500 dark:text-slate-400 font-medium text-xs uppercase tracking-widest mt-1">Manage inquiries from your website</p> |
| 12 | + </div> |
| 13 | + </div> |
7 | 14 |
|
8 | | - <div class="card"> |
9 | | - <div class="card-body"> |
10 | | - <table class="table"> |
| 15 | + <!-- Table --> |
| 16 | + <div class="bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-3xl overflow-hidden shadow-sm"> |
| 17 | + <div class="overflow-x-auto"> |
| 18 | + <table class="w-full text-left border-collapse"> |
11 | 19 | <thead> |
12 | | - <th>Name</th> |
13 | | - <th>Mail</th> |
14 | | - <th>Date</th> |
15 | | - <th>Info</th> |
| 20 | + <tr class="bg-slate-50/50 dark:bg-slate-800/50 border-b border-slate-100 dark:border-slate-800"> |
| 21 | + <th class="px-6 py-4 text-[10px] font-black text-slate-400 uppercase tracking-[0.2em]">Name</th> |
| 22 | + <th class="px-6 py-4 text-[10px] font-black text-slate-400 uppercase tracking-[0.2em]">Email</th> |
| 23 | + <th class="px-6 py-4 text-[10px] font-black text-slate-400 uppercase tracking-[0.2em]">Date</th> |
| 24 | + <th class="px-6 py-4 text-[10px] font-black text-slate-400 uppercase tracking-[0.2em] text-right">Actions</th> |
| 25 | + </tr> |
16 | 26 | </thead> |
17 | | - <tbody> |
18 | | - {%for message in messages.items%} |
19 | | - <tr> |
20 | | - <td>{{message.name}}</td> |
21 | | - <td>{{message.email}}</td> |
22 | | - <td>{{message.created_date}}</td> |
23 | | - <td> |
24 | | - <button |
25 | | - type="button" |
26 | | - class="btn btn-primary" |
27 | | - data-bs-toggle="modal" |
28 | | - data-bs-target="#modal-{{message.id}}" |
29 | | - > |
30 | | - view message |
| 27 | + <tbody class="divide-y divide-slate-100 dark:divide-slate-800"> |
| 28 | + {% for message in messages.items %} |
| 29 | + <tr class="hover:bg-slate-50/50 dark:hover:bg-slate-800/30 transition-colors group"> |
| 30 | + <td class="px-6 py-4"> |
| 31 | + <span class="text-xs font-bold text-slate-900 dark:text-white">{{ message.name }}</span> |
| 32 | + </td> |
| 33 | + <td class="px-6 py-4 text-xs text-slate-500 dark:text-slate-400"> |
| 34 | + {{ message.email }} |
| 35 | + </td> |
| 36 | + <td class="px-6 py-4 text-[10px] font-bold text-slate-400 uppercase tracking-wider"> |
| 37 | + {{ message.created_date.strftime('%Y-%m-%d %H:%M') if message.created_date else '' }} |
| 38 | + </td> |
| 39 | + <td class="px-6 py-4 text-right"> |
| 40 | + <button |
| 41 | + @click="selectedMessage = { name: '{{ message.name }}', email: '{{ message.email }}', content: `{{ message.message | replace('\n', '<br>') | safe }}` }; modalOpen = true" |
| 42 | + class="inline-flex items-center gap-2 px-4 py-2 rounded-xl bg-primary/10 text-primary hover:bg-primary hover:text-white text-[10px] font-black uppercase tracking-widest transition-all"> |
| 43 | + <i class="fas fa-eye"></i> |
| 44 | + View |
31 | 45 | </button> |
32 | 46 | </td> |
33 | 47 | </tr> |
34 | | - <!-- Modal --> |
35 | | - <div class="modal fade" id="modal-{{message.id}}" tabindex="-1" aria-hidden="true"> |
36 | | - <div class="modal-dialog" role="document"> |
37 | | - <div class="modal-content"> |
38 | | - <div class="modal-header"> |
39 | | - <h5 class="modal-title" id="exampleModalLabel1">Message</h5> |
40 | | - <button |
41 | | - type="button" |
42 | | - class="btn-close" |
43 | | - data-bs-dismiss="modal" |
44 | | - aria-label="Close" |
45 | | - ></button> |
46 | | - </div> |
47 | | - <div class="modal-body"> |
48 | | - {{message.message}} |
49 | | - </div> |
50 | | - <div class="modal-footer"> |
51 | | - <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal"> |
52 | | - Close |
53 | | - </button> |
54 | | - |
| 48 | + {% endfor %} |
| 49 | + {% if not messages.items %} |
| 50 | + <tr> |
| 51 | + <td colspan="4" class="px-6 py-12 text-center"> |
| 52 | + <div class="flex flex-col items-center"> |
| 53 | + <div class="w-12 h-12 rounded-2xl bg-slate-50 dark:bg-slate-800 flex items-center justify-center text-slate-300 dark:text-slate-600 text-xl mb-4"> |
| 54 | + <i class="fas fa-inbox"></i> |
| 55 | + </div> |
| 56 | + <p class="text-xs font-bold text-slate-400 uppercase tracking-widest">No messages found</p> |
55 | 57 | </div> |
56 | | - </div> |
57 | | - </div> |
58 | | - </div> |
59 | | - </div> |
60 | | - </div> |
61 | | - {%endfor%} |
| 58 | + </td> |
| 59 | + </tr> |
| 60 | + {% endif %} |
62 | 61 | </tbody> |
63 | 62 | </table> |
64 | 63 | </div> |
| 64 | + |
| 65 | + <!-- Pagination --> |
| 66 | + {% if messages.pages > 1 %} |
| 67 | + <div class="px-6 py-4 bg-slate-50/50 dark:bg-slate-800/50 border-t border-slate-100 dark:border-slate-800 flex justify-between items-center"> |
| 68 | + <div class="text-[10px] font-bold text-slate-400 uppercase tracking-widest"> |
| 69 | + Page {{ messages.page }} of {{ messages.pages }} |
| 70 | + </div> |
| 71 | + <div class="flex gap-2"> |
| 72 | + {% if messages.has_prev %} |
| 73 | + <a href="{{ url_for('contact.dashboard', page=messages.prev_num) }}" class="px-3 py-1 rounded-lg border border-slate-200 dark:border-slate-700 text-[10px] font-black uppercase tracking-widest hover:bg-white dark:hover:bg-slate-900 transition-all text-slate-600 dark:text-slate-300">Prev</a> |
| 74 | + {% endif %} |
| 75 | + {% if messages.has_next %} |
| 76 | + <a href="{{ url_for('contact.dashboard', page=messages.next_num) }}" class="px-3 py-1 rounded-lg border border-slate-200 dark:border-slate-700 text-[10px] font-black uppercase tracking-widest hover:bg-white dark:hover:bg-slate-900 transition-all text-slate-600 dark:text-slate-300">Next</a> |
| 77 | + {% endif %} |
| 78 | + </div> |
| 79 | + </div> |
| 80 | + {% endif %} |
65 | 81 | </div> |
66 | | -</div> |
67 | 82 |
|
| 83 | + <!-- Alpine Modal --> |
| 84 | + <div |
| 85 | + x-show="modalOpen" |
| 86 | + class="fixed inset-0 z-50 overflow-y-auto" |
| 87 | + x-cloak |
| 88 | + > |
| 89 | + <div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0"> |
| 90 | + <!-- Overlay --> |
| 91 | + <div |
| 92 | + x-show="modalOpen" |
| 93 | + x-transition:enter="ease-out duration-300" |
| 94 | + x-transition:enter-start="opacity-0" |
| 95 | + x-transition:enter-end="opacity-100" |
| 96 | + x-transition:leave="ease-in duration-200" |
| 97 | + x-transition:leave-start="opacity-100" |
| 98 | + x-transition:leave-end="opacity-0" |
| 99 | + @click="modalOpen = false" |
| 100 | + class="fixed inset-0 transition-opacity bg-slate-950/60 backdrop-blur-sm" |
| 101 | + ></div> |
68 | 102 |
|
| 103 | + <!-- Modal Panel --> |
| 104 | + <div |
| 105 | + x-show="modalOpen" |
| 106 | + x-transition:enter="ease-out duration-300" |
| 107 | + x-transition:enter-start="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" |
| 108 | + x-transition:enter-end="opacity-100 translate-y-0 sm:scale-100" |
| 109 | + x-transition:leave="ease-in duration-200" |
| 110 | + x-transition:leave-start="opacity-100 translate-y-0 sm:scale-100" |
| 111 | + x-transition:leave-end="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" |
| 112 | + class="inline-block w-full max-w-xl p-8 my-8 overflow-hidden text-left align-middle transition-all transform bg-white dark:bg-slate-900 shadow-2xl rounded-3xl border border-slate-100 dark:border-slate-800" |
| 113 | + > |
| 114 | + <div class="flex justify-between items-start mb-6"> |
| 115 | + <div> |
| 116 | + <h3 class="text-xl font-black text-slate-900 dark:text-white uppercase tracking-tight" x-text="selectedMessage?.name"></h3> |
| 117 | + <p class="text-[10px] font-bold text-primary uppercase tracking-widest mt-1" x-text="selectedMessage?.email"></p> |
| 118 | + </div> |
| 119 | + <button @click="modalOpen = false" class="text-slate-400 hover:text-slate-600 dark:hover:text-white transition-colors"> |
| 120 | + <i class="fas fa-times"></i> |
| 121 | + </button> |
| 122 | + </div> |
| 123 | + |
| 124 | + <div class="bg-slate-50 dark:bg-slate-800/50 rounded-2xl p-6 border border-slate-100 dark:border-slate-700/50"> |
| 125 | + <div class="text-sm text-slate-600 dark:text-slate-300 leading-relaxed whitespace-pre-wrap" x-html="selectedMessage?.content"></div> |
| 126 | + </div> |
69 | 127 |
|
70 | | -{%endblock%} |
| 128 | + <div class="mt-8 flex justify-end"> |
| 129 | + <button @click="modalOpen = false" class="px-6 py-3 rounded-2xl bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-300 text-[10px] font-black uppercase tracking-[0.2em] hover:bg-slate-200 dark:hover:bg-slate-700 transition-all"> |
| 130 | + Close |
| 131 | + </button> |
| 132 | + </div> |
| 133 | + </div> |
| 134 | + </div> |
| 135 | + </div> |
| 136 | +</div> |
| 137 | +{% endblock %} |
0 commit comments