| {% extends "layout.html" %} |
|
|
| {% block title %}{{ user.username }}'s Profile - Community Forum{% endblock %} |
|
|
| {% block breadcrumb %} |
| <a href="{{ url_for('forum.index') }}" class="hover:text-blue-600">Home</a> |
| <span class="mx-2">/</span> |
| <span>Profile: {{ user.username }}</span> |
| {% endblock %} |
|
|
| {% block content %} |
| <div class="grid grid-cols-1 lg:grid-cols-3 gap-6"> |
| |
| <div class="lg:col-span-1"> |
| <div class="bg-white rounded-lg shadow overflow-hidden"> |
| <div class="px-6 py-4 border-b border-gray-200 bg-blue-50"> |
| <h2 class="text-xl font-bold text-gray-800">User Profile</h2> |
| </div> |
| |
| <div class="p-6"> |
| <div class="flex flex-col items-center"> |
| <img |
| src="{{ url_for('static', filename='uploads/avatars/' + user.avatar) if user.avatar else url_for('static', filename='uploads/avatars/default.png') }}" |
| alt="{{ user.username }}" |
| class="w-32 h-32 rounded-full object-cover border-4 border-white shadow" |
| > |
| |
| <h1 class="mt-4 text-2xl font-bold text-gray-800">{{ user.username }}</h1> |
| |
| <div class="mt-2"> |
| {% if user.role == 'admin' %} |
| <span class="inline-block bg-red-100 text-red-800 text-sm px-3 py-1 rounded-full">Administrator</span> |
| {% elif user.role == 'moderator' %} |
| <span class="inline-block bg-green-100 text-green-800 text-sm px-3 py-1 rounded-full">Moderator</span> |
| {% else %} |
| <span class="inline-block bg-blue-100 text-blue-800 text-sm px-3 py-1 rounded-full">Member</span> |
| {% endif %} |
| </div> |
| </div> |
| |
| <div class="mt-6 space-y-4 text-gray-700"> |
| <div class="flex items-center"> |
| <i data-feather="calendar" class="w-5 h-5 text-gray-400 mr-3"></i> |
| <span>Joined {{ user.created_at.strftime('%B %d, %Y') }}</span> |
| </div> |
| |
| <div class="flex items-center"> |
| <i data-feather="clock" class="w-5 h-5 text-gray-400 mr-3"></i> |
| <span>Last seen {{ user.last_seen.strftime('%B %d, %Y') }}</span> |
| </div> |
| |
| {% if user.location %} |
| <div class="flex items-center"> |
| <i data-feather="map-pin" class="w-5 h-5 text-gray-400 mr-3"></i> |
| <span>{{ user.location }}</span> |
| </div> |
| {% endif %} |
| |
| {% if user.website %} |
| <div class="flex items-center"> |
| <i data-feather="globe" class="w-5 h-5 text-gray-400 mr-3"></i> |
| <a href="{{ user.website }}" target="_blank" class="text-blue-600 hover:underline truncate">{{ user.website }}</a> |
| </div> |
| {% endif %} |
| </div> |
| |
| {% if user.bio %} |
| <div class="mt-6 pt-6 border-t border-gray-200"> |
| <h3 class="text-lg font-medium text-gray-800 mb-2">About</h3> |
| <p class="text-gray-700">{{ user.bio }}</p> |
| </div> |
| {% endif %} |
| |
| {% if user.signature %} |
| <div class="mt-6 pt-6 border-t border-gray-200"> |
| <h3 class="text-lg font-medium text-gray-800 mb-2">Signature</h3> |
| <p class="text-gray-700 text-sm italic">{{ user.signature }}</p> |
| </div> |
| {% endif %} |
| |
| {% if current_user.is_authenticated and current_user.id == user.id %} |
| <div class="mt-6 pt-6 border-t border-gray-200"> |
| <a href="{{ url_for('user.edit_profile') }}" class="w-full block text-center px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors"> |
| Edit Profile |
| </a> |
| <a href="{{ url_for('user.change_password') }}" class="w-full block text-center mt-2 px-4 py-2 bg-gray-200 text-gray-800 rounded-md hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 transition-colors"> |
| Change Password |
| </a> |
| </div> |
| {% endif %} |
| </div> |
| </div> |
| </div> |
| |
| |
| <div class="lg:col-span-2 space-y-6"> |
| |
| <div class="bg-white rounded-lg shadow overflow-hidden"> |
| <div class="px-6 py-4 border-b border-gray-200 bg-blue-50 flex justify-between items-center"> |
| <h2 class="text-xl font-bold text-gray-800">Topics Started</h2> |
| <span class="text-gray-600">{{ topics.total }} total</span> |
| </div> |
| |
| {% if topics.items %} |
| <div class="divide-y divide-gray-200"> |
| {% for topic in topics.items %} |
| <div class="p-4 hover:bg-gray-50"> |
| <a href="{{ url_for('forum.topic_view', id=topic.id) }}" class="block"> |
| <div class="flex justify-between items-start"> |
| <div> |
| <h3 class="text-lg font-medium text-gray-800 hover:text-blue-600">{{ topic.title }}</h3> |
| <div class="flex items-center text-sm text-gray-500 mt-1"> |
| <span>{{ topic.created_at.strftime('%b %d, %Y') }}</span> |
| <span class="mx-2">•</span> |
| <span>{{ topic.reply_count() }} replies</span> |
| <span class="mx-2">•</span> |
| <span>{{ topic.views }} views</span> |
| </div> |
| |
| {% if topic.tags %} |
| <div class="mt-2 flex flex-wrap"> |
| {% for tag in topic.tags %} |
| <a href="{{ url_for('forum.tag_view', tag_name=tag.name) }}" class="tag"> |
| {{ tag.name }} |
| </a> |
| {% endfor %} |
| </div> |
| {% endif %} |
| </div> |
| |
| <div class="text-xs text-gray-500 whitespace-nowrap ml-4"> |
| <div>In: <a href="{{ url_for('forum.category_view', id=topic.category_id) }}" class="text-blue-600 hover:underline">{{ topic.category.name }}</a></div> |
| </div> |
| </div> |
| </a> |
| </div> |
| {% endfor %} |
| </div> |
| |
| |
| {% if topics.pages > 1 %} |
| <div class="px-6 py-4 bg-gray-50 border-t border-gray-200"> |
| <div class="flex justify-center"> |
| <nav class="inline-flex rounded-md shadow"> |
| {% if topics.has_prev %} |
| <a href="{{ url_for('user.profile', username=user.username, page=topics.prev_num) }}" class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-l-md hover:bg-gray-50"> |
| Previous |
| </a> |
| {% else %} |
| <span class="px-4 py-2 text-sm font-medium text-gray-400 bg-gray-100 border border-gray-300 rounded-l-md cursor-not-allowed"> |
| Previous |
| </span> |
| {% endif %} |
| |
| {% for page_num in topics.iter_pages(left_edge=1, right_edge=1, left_current=2, right_current=2) %} |
| {% if page_num %} |
| {% if page_num == topics.page %} |
| <span class="px-4 py-2 text-sm font-medium text-blue-600 bg-blue-50 border border-gray-300"> |
| {{ page_num }} |
| </span> |
| {% else %} |
| <a href="{{ url_for('user.profile', username=user.username, page=page_num) }}" class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50"> |
| {{ page_num }} |
| </a> |
| {% endif %} |
| {% else %} |
| <span class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300"> |
| … |
| </span> |
| {% endif %} |
| {% endfor %} |
| |
| {% if topics.has_next %} |
| <a href="{{ url_for('user.profile', username=user.username, page=topics.next_num) }}" class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-r-md hover:bg-gray-50"> |
| Next |
| </a> |
| {% else %} |
| <span class="px-4 py-2 text-sm font-medium text-gray-400 bg-gray-100 border border-gray-300 rounded-r-md cursor-not-allowed"> |
| Next |
| </span> |
| {% endif %} |
| </nav> |
| </div> |
| </div> |
| {% endif %} |
| |
| {% else %} |
| <div class="p-6 text-center text-gray-500"> |
| This user hasn't created any topics yet. |
| </div> |
| {% endif %} |
| </div> |
| |
| |
| <div class="bg-white rounded-lg shadow overflow-hidden"> |
| <div class="px-6 py-4 border-b border-gray-200 bg-blue-50"> |
| <h2 class="text-xl font-bold text-gray-800">Recent Posts</h2> |
| </div> |
| |
| {% if recent_posts %} |
| <div class="divide-y divide-gray-200"> |
| {% for post in recent_posts %} |
| <div class="p-4 hover:bg-gray-50"> |
| <div> |
| <div class="flex justify-between items-start mb-2"> |
| <div> |
| <a href="{{ url_for('forum.topic_view', id=post.topic_id) }}" class="text-lg font-medium text-gray-800 hover:text-blue-600"> |
| Re: {{ post.topic.title }} |
| </a> |
| </div> |
| <div class="text-xs text-gray-500"> |
| {{ post.created_at.strftime('%b %d, %Y %H:%M') }} |
| </div> |
| </div> |
| |
| <div class="text-gray-700 line-clamp-2 text-sm mb-2"> |
| {{ post.content|striptags|truncate(150) }} |
| </div> |
| |
| <div class="text-xs text-gray-500"> |
| Posted in: <a href="{{ url_for('forum.category_view', id=post.topic.category_id) }}" class="text-blue-600 hover:underline">{{ post.topic.category.name }}</a> |
| <a href="{{ url_for('forum.topic_view', id=post.topic_id) }}#post-{{ post.id }}" class="text-blue-600 hover:underline ml-2"> |
| View Post <i data-feather="arrow-right" class="w-3 h-3 inline"></i> |
| </a> |
| </div> |
| </div> |
| </div> |
| {% endfor %} |
| </div> |
| |
| {% if current_user.id == user.id %} |
| <div class="px-6 py-4 bg-gray-50 border-t border-gray-200"> |
| <a href="{{ url_for('user.user_posts') }}" class="inline-flex items-center text-blue-600 hover:underline"> |
| View all my posts |
| <i data-feather="arrow-right" class="w-4 h-4 ml-1"></i> |
| </a> |
| </div> |
| {% endif %} |
| |
| {% else %} |
| <div class="p-6 text-center text-gray-500"> |
| This user hasn't made any posts yet. |
| </div> |
| {% endif %} |
| </div> |
| </div> |
| </div> |
| {% endblock %} |
|
|