192 lines
10 KiB
HTML
192 lines
10 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Job Tracking - Preferences</title>
|
|
<script src="https://cdn.tailwindcss.com"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/pocketbase@latest/dist/pocketbase.umd.js"></script>
|
|
</head>
|
|
<body class="min-h-screen bg-gradient-to-br from-gray-50 via-blue-50/30 to-indigo-50/40">
|
|
<!-- Navigation Header -->
|
|
<nav class="backdrop-blur-xl bg-white/70 border-b border-white/20 shadow-sm sticky top-0 z-40">
|
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
<div class="flex flex-row justify-between items-center py-4 px-2">
|
|
<div class="flex items-center gap-4">
|
|
<a href="dashboard" class="text-indigo-600 hover:text-indigo-700 font-medium text-sm sm:text-base transition-colors">← Dashboard</a>
|
|
</div>
|
|
<div class="flex items-center gap-3 relative">
|
|
<div class="relative">
|
|
<button
|
|
onclick="toggleUserDropdown()"
|
|
class="w-10 h-10 rounded-full bg-gradient-to-br from-indigo-500 via-purple-500 to-pink-500 flex items-center justify-center text-white font-medium text-sm hover:scale-105 focus:outline-none transition-all duration-300 shadow-lg shadow-indigo-500/30 hover:shadow-indigo-500/50"
|
|
id="userAvatarBtn"
|
|
>
|
|
<span id="userInitials" class="text-xs font-semibold"></span>
|
|
</button>
|
|
<div
|
|
id="userDropdown"
|
|
class="hidden absolute right-0 mt-2 w-48 backdrop-blur-xl bg-white/80 rounded-2xl shadow-2xl border border-white/30 py-2 z-50 overflow-hidden"
|
|
>
|
|
<div class="px-4 py-3 border-b border-white/20">
|
|
<p class="text-xs text-gray-500 font-medium">Signed in as</p>
|
|
<p class="text-sm font-semibold text-gray-900 truncate mt-0.5" id="userEmail"></p>
|
|
</div>
|
|
<a
|
|
href="preferences"
|
|
class="block px-4 py-2.5 text-sm text-gray-700 hover:bg-white/40 focus:outline-none transition-colors font-medium"
|
|
>
|
|
Preferences
|
|
</a>
|
|
<button
|
|
onclick="logout()"
|
|
class="w-full text-left px-4 py-2.5 text-sm text-red-600 hover:bg-red-50/50 focus:outline-none transition-colors font-medium"
|
|
>
|
|
Logout
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<!-- Main Content -->
|
|
<main class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
|
<!-- Page Header -->
|
|
<div class="mb-8">
|
|
<h1 class="text-2xl sm:text-3xl font-bold text-gray-900 mb-2">Preferences</h1>
|
|
<p class="text-sm sm:text-base text-gray-600">Customize your Job-Pages experience</p>
|
|
</div>
|
|
|
|
<!-- Message Container -->
|
|
<div id="messageContainer" class="mb-4"></div>
|
|
|
|
<!-- Preferences Form -->
|
|
<div class="backdrop-blur-xl bg-white/60 rounded-2xl shadow-xl border border-white/30 p-6">
|
|
<form id="preferencesForm" class="space-y-6">
|
|
<!-- Dark Mode Toggle -->
|
|
<div class="flex items-center justify-between py-4 border-b border-white/20">
|
|
<div class="flex-1">
|
|
<h3 class="text-lg font-semibold text-gray-900 mb-1">Dark Mode</h3>
|
|
<p class="text-sm text-gray-600">Switch between light and dark themes</p>
|
|
</div>
|
|
<label class="relative inline-flex items-center cursor-pointer">
|
|
<input
|
|
type="checkbox"
|
|
id="darkModeToggle"
|
|
class="sr-only peer"
|
|
>
|
|
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-indigo-300 dark:peer-focus:ring-indigo-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-indigo-600"></div>
|
|
</label>
|
|
</div>
|
|
|
|
<!-- Default View Preference -->
|
|
<div class="py-4 border-b border-white/20">
|
|
<h3 class="text-lg font-semibold text-gray-900 mb-2">Default View</h3>
|
|
<p class="text-sm text-gray-600 mb-4">Choose your preferred default view for the jobs page</p>
|
|
<div class="flex flex-col sm:flex-row gap-4">
|
|
<label class="view-option flex items-center p-4 border-2 border-white/30 backdrop-blur-sm bg-white/40 rounded-2xl cursor-pointer hover:border-indigo-500/50 hover:bg-white/60 transition-all shadow-sm" data-value="table">
|
|
<input
|
|
type="radio"
|
|
name="defaultView"
|
|
value="table"
|
|
id="viewTable"
|
|
class="sr-only"
|
|
>
|
|
<div class="flex-1">
|
|
<div class="flex items-center gap-3">
|
|
<svg class="w-6 h-6 text-gray-400 view-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
|
|
</svg>
|
|
<div>
|
|
<div class="font-medium text-gray-900 view-title">Table View</div>
|
|
<div class="text-sm text-gray-500">View jobs in a table format</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</label>
|
|
<label class="view-option flex items-center p-4 border-2 border-white/30 backdrop-blur-sm bg-white/40 rounded-2xl cursor-pointer hover:border-indigo-500/50 hover:bg-white/60 transition-all shadow-sm" data-value="card">
|
|
<input
|
|
type="radio"
|
|
name="defaultView"
|
|
value="card"
|
|
id="viewCard"
|
|
class="sr-only"
|
|
>
|
|
<div class="flex-1">
|
|
<div class="flex items-center gap-3">
|
|
<svg class="w-6 h-6 text-gray-400 view-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"></path>
|
|
</svg>
|
|
<div>
|
|
<div class="font-medium text-gray-900 view-title">Card View</div>
|
|
<div class="text-sm text-gray-500">View jobs in a card format</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Save Button -->
|
|
<div class="flex justify-end pt-4">
|
|
<button
|
|
type="submit"
|
|
class="px-6 py-2.5 backdrop-blur-sm bg-indigo-600/90 text-white rounded-xl font-medium hover:bg-indigo-700/90 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 transition-all shadow-lg hover:shadow-xl"
|
|
>
|
|
Save Preferences
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</main>
|
|
|
|
<script src="js/pocketbase.js"></script>
|
|
<script src="js/config.js"></script>
|
|
<script src="js/auth.js"></script>
|
|
<script src="js/preferences.js"></script>
|
|
<script>
|
|
// Check authentication
|
|
checkAuth();
|
|
|
|
// Set user email and initials
|
|
const user = pb.authStore.model;
|
|
if (user) {
|
|
const email = user.email || '';
|
|
document.getElementById('userEmail').textContent = email;
|
|
|
|
// Set initials for avatar
|
|
const initials = email
|
|
.split('@')[0]
|
|
.split('.')
|
|
.map(part => part.charAt(0).toUpperCase())
|
|
.join('')
|
|
.substring(0, 2) || 'U';
|
|
document.getElementById('userInitials').textContent = initials;
|
|
}
|
|
|
|
// Toggle user dropdown
|
|
function toggleUserDropdown() {
|
|
const dropdown = document.getElementById('userDropdown');
|
|
dropdown.classList.toggle('hidden');
|
|
}
|
|
|
|
// Close dropdown when clicking outside
|
|
document.addEventListener('click', (e) => {
|
|
const dropdown = document.getElementById('userDropdown');
|
|
const button = document.getElementById('userAvatarBtn');
|
|
if (dropdown && !dropdown.contains(e.target) && !button.contains(e.target)) {
|
|
dropdown.classList.add('hidden');
|
|
}
|
|
});
|
|
|
|
// Make function globally accessible
|
|
window.toggleUserDropdown = toggleUserDropdown;
|
|
|
|
// Load preferences on page load
|
|
loadPreferences();
|
|
</script>
|
|
</body>
|
|
</html>
|