mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 16:11:08 -05:00
511 lines
22 KiB
HTML
511 lines
22 KiB
HTML
{% load static %}
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Auth Modal Component Comparison Test</title>
|
|
<link href="{% static 'css/tailwind.css' %}" rel="stylesheet">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
|
|
|
<style>
|
|
.test-section {
|
|
margin: 2rem 0;
|
|
padding: 1rem;
|
|
border: 2px solid #e5e7eb;
|
|
border-radius: 8px;
|
|
}
|
|
.modal-test-container {
|
|
display: flex;
|
|
gap: 2rem;
|
|
margin: 1rem 0;
|
|
align-items: flex-start;
|
|
flex-wrap: wrap;
|
|
}
|
|
.modal-test-group {
|
|
border: 1px solid #d1d5db;
|
|
padding: 1rem;
|
|
border-radius: 8px;
|
|
position: relative;
|
|
min-width: 300px;
|
|
flex: 1;
|
|
}
|
|
.modal-test-group::before {
|
|
content: attr(data-label);
|
|
position: absolute;
|
|
top: -10px;
|
|
left: 12px;
|
|
background: white;
|
|
padding: 0 8px;
|
|
font-size: 14px;
|
|
font-weight: bold;
|
|
color: #374151;
|
|
}
|
|
.test-description {
|
|
font-weight: bold;
|
|
color: #374151;
|
|
margin-bottom: 1rem;
|
|
font-size: 18px;
|
|
}
|
|
.feature-list {
|
|
background: #f9fafb;
|
|
border: 1px solid #e5e7eb;
|
|
padding: 1rem;
|
|
margin: 0.5rem 0;
|
|
border-radius: 4px;
|
|
font-size: 14px;
|
|
}
|
|
.test-button {
|
|
background: #3b82f6;
|
|
color: white;
|
|
padding: 0.5rem 1rem;
|
|
border-radius: 0.375rem;
|
|
border: none;
|
|
cursor: pointer;
|
|
margin: 0.5rem;
|
|
font-weight: 500;
|
|
}
|
|
.test-button:hover {
|
|
background: #2563eb;
|
|
}
|
|
.test-button.secondary {
|
|
background: #6b7280;
|
|
}
|
|
.test-button.secondary:hover {
|
|
background: #4b5563;
|
|
}
|
|
.instructions {
|
|
background: #dbeafe;
|
|
border: 1px solid #93c5fd;
|
|
padding: 1rem;
|
|
border-radius: 6px;
|
|
margin-bottom: 2rem;
|
|
}
|
|
.status-indicator {
|
|
display: inline-block;
|
|
width: 12px;
|
|
height: 12px;
|
|
border-radius: 50%;
|
|
margin-right: 8px;
|
|
}
|
|
.status-pass { background: #10b981; }
|
|
.status-fail { background: #ef4444; }
|
|
.status-pending { background: #f59e0b; }
|
|
</style>
|
|
</head>
|
|
<body class="bg-gray-50 p-8">
|
|
<div class="max-w-7xl mx-auto">
|
|
<h1 class="text-3xl font-bold mb-8 text-center">Auth Modal Component Comparison Test</h1>
|
|
<p class="text-center text-gray-600 mb-8">Comparing original include method vs new cotton component for Auth Modal with full Alpine.js functionality</p>
|
|
|
|
<div class="instructions">
|
|
<h3 class="font-bold mb-2">Test Instructions:</h3>
|
|
<ol class="list-decimal list-inside space-y-1">
|
|
<li>Click test buttons to open both modals and compare behavior</li>
|
|
<li>Test modal opening/closing with both buttons and ESC key</li>
|
|
<li>Switch between login and register forms in both modals</li>
|
|
<li>Test form validation and error states</li>
|
|
<li>Verify all Alpine.js transitions and animations work</li>
|
|
<li>Check that styling and layout are identical</li>
|
|
<li>Test password visibility toggle functionality</li>
|
|
<li>Verify social provider buttons render correctly</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<!-- Test 1: Basic Modal Functionality -->
|
|
<div class="test-section">
|
|
<h2 class="text-xl font-semibold mb-4">Test 1: Basic Modal Open/Close Functionality</h2>
|
|
<div class="test-description">Modal Opening, Closing, and Overlay Interaction</div>
|
|
|
|
<div class="modal-test-container">
|
|
<div class="modal-test-group" data-label="Original Include Version">
|
|
<button class="test-button" onclick="if(window.authModalOriginal) window.authModalOriginal.open = true">
|
|
Open Original Auth Modal
|
|
</button>
|
|
<div class="feature-list">
|
|
Features to test:
|
|
<ul class="list-disc list-inside mt-2 text-sm">
|
|
<li>Modal opens with fade-in animation</li>
|
|
<li>Background overlay blocks interaction</li>
|
|
<li>Close button works (top-right X)</li>
|
|
<li>ESC key closes modal</li>
|
|
<li>Click outside modal closes it</li>
|
|
<li>Modal content scales properly</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal-test-group" data-label="Cotton Component Version">
|
|
<button class="test-button" onclick="if(window.authModalCotton) window.authModalCotton.open = true">
|
|
Open Cotton Auth Modal
|
|
</button>
|
|
<div class="feature-list">
|
|
Features to test:
|
|
<ul class="list-disc list-inside mt-2 text-sm">
|
|
<li>Modal opens with fade-in animation</li>
|
|
<li>Background overlay blocks interaction</li>
|
|
<li>Close button works (top-right X)</li>
|
|
<li>ESC key closes modal</li>
|
|
<li>Click outside modal closes it</li>
|
|
<li>Modal content scales properly</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Test 2: Form Switching -->
|
|
<div class="test-section">
|
|
<h2 class="text-xl font-semibold mb-4">Test 2: Login/Register Form Switching</h2>
|
|
<div class="test-description">Form Mode Switching and Content Display</div>
|
|
|
|
<div class="modal-test-container">
|
|
<div class="modal-test-group" data-label="Original Include Version">
|
|
<button class="test-button" onclick="openOriginalModalInMode('login')">
|
|
Open in Login Mode
|
|
</button>
|
|
<button class="test-button secondary" onclick="openOriginalModalInMode('register')">
|
|
Open in Register Mode
|
|
</button>
|
|
<div class="feature-list">
|
|
Test form switching:
|
|
<ul class="list-disc list-inside mt-2 text-sm">
|
|
<li>Default mode is login</li>
|
|
<li>"Sign up" link switches to register</li>
|
|
<li>"Sign in" link switches to login</li>
|
|
<li>Form fields update correctly</li>
|
|
<li>Titles and descriptions change</li>
|
|
<li>Social button text updates</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal-test-group" data-label="Cotton Component Version">
|
|
<button class="test-button" onclick="openCottonModalInMode('login')">
|
|
Open in Login Mode
|
|
</button>
|
|
<button class="test-button secondary" onclick="openCottonModalInMode('register')">
|
|
Open in Register Mode
|
|
</button>
|
|
<div class="feature-list">
|
|
Test form switching:
|
|
<ul class="list-disc list-inside mt-2 text-sm">
|
|
<li>Default mode is login</li>
|
|
<li>"Sign up" link switches to register</li>
|
|
<li>"Sign in" link switches to login</li>
|
|
<li>Form fields update correctly</li>
|
|
<li>Titles and descriptions change</li>
|
|
<li>Social button text updates</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Test 3: Alpine.js Interactive Elements -->
|
|
<div class="test-section">
|
|
<h2 class="text-xl font-semibold mb-4">Test 3: Alpine.js Interactive Elements</h2>
|
|
<div class="test-description">Password Visibility, Loading States, and Error Handling</div>
|
|
|
|
<div class="modal-test-container">
|
|
<div class="modal-test-group" data-label="Original Include Version">
|
|
<button class="test-button" onclick="testOriginalInteractivity()">
|
|
Test Original Interactions
|
|
</button>
|
|
<div class="feature-list">
|
|
Interactive features:
|
|
<ul class="list-disc list-inside mt-2 text-sm">
|
|
<li>Password visibility toggle (eye icon)</li>
|
|
<li>Form validation states</li>
|
|
<li>Loading spinner on submit</li>
|
|
<li>Error message display</li>
|
|
<li>Social provider button states</li>
|
|
<li>Form field x-model binding</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal-test-group" data-label="Cotton Component Version">
|
|
<button class="test-button" onclick="testCottonInteractivity()">
|
|
Test Cotton Interactions
|
|
</button>
|
|
<div class="feature-list">
|
|
Interactive features:
|
|
<ul class="list-disc list-inside mt-2 text-sm">
|
|
<li>Password visibility toggle (eye icon)</li>
|
|
<li>Form validation states</li>
|
|
<li>Loading spinner on submit</li>
|
|
<li>Error message display</li>
|
|
<li>Social provider button states</li>
|
|
<li>Form field x-model binding</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Test 4: Visual Styling Comparison -->
|
|
<div class="test-section">
|
|
<h2 class="text-xl font-semibold mb-4">Test 4: Visual Styling and Layout</h2>
|
|
<div class="test-description">CSS Classes, Gradients, and Responsive Design</div>
|
|
|
|
<div class="modal-test-container">
|
|
<div class="modal-test-group" data-label="Styling Verification">
|
|
<button class="test-button" onclick="compareModalStyling()">
|
|
Compare Both Modals Side by Side
|
|
</button>
|
|
<div class="feature-list">
|
|
Visual elements to verify:
|
|
<ul class="list-disc list-inside mt-2 text-sm">
|
|
<li>Gradient title text (blue to purple)</li>
|
|
<li>Button styling and hover states</li>
|
|
<li>Input field styling and focus states</li>
|
|
<li>Modal size and positioning</li>
|
|
<li>Social provider button colors</li>
|
|
<li>Divider lines and spacing</li>
|
|
<li>Error message styling</li>
|
|
<li>Responsive layout behavior</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Test 5: Custom Configuration -->
|
|
<div class="test-section">
|
|
<h2 class="text-xl font-semibold mb-4">Test 5: Cotton Component Configuration</h2>
|
|
<div class="test-description">Testing Cotton c-vars Configuration Options</div>
|
|
|
|
<div class="modal-test-container">
|
|
<div class="modal-test-group" data-label="Custom Configuration Test">
|
|
<button class="test-button" onclick="testCustomConfiguration()">
|
|
Test Custom Cotton Config
|
|
</button>
|
|
<div class="feature-list">
|
|
Cotton c-vars to test:
|
|
<ul class="list-disc list-inside mt-2 text-sm">
|
|
<li>Custom login/register titles</li>
|
|
<li>Custom subtitle text</li>
|
|
<li>Custom divider text</li>
|
|
<li>Show/hide social providers</li>
|
|
<li>Show/hide forgot password</li>
|
|
<li>Custom CSS classes</li>
|
|
<li>Custom forgot password URL</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Status Checklist -->
|
|
<div class="test-section">
|
|
<h2 class="text-xl font-semibold mb-4">Test Results Checklist</h2>
|
|
<div class="feature-list">
|
|
<div class="space-y-2">
|
|
<div><span class="status-indicator status-pending"></span>Modal opens and closes identically</div>
|
|
<div><span class="status-indicator status-pending"></span>Form switching works the same</div>
|
|
<div><span class="status-indicator status-pending"></span>Alpine.js directives function identically</div>
|
|
<div><span class="status-indicator status-pending"></span>Visual styling is identical</div>
|
|
<div><span class="status-indicator status-pending"></span>Password toggle works the same</div>
|
|
<div><span class="status-indicator status-pending"></span>Error states display identically</div>
|
|
<div><span class="status-indicator status-pending"></span>Social provider buttons render the same</div>
|
|
<div><span class="status-indicator status-pending"></span>Keyboard shortcuts work (ESC key)</div>
|
|
<div><span class="status-indicator status-pending"></span>Form validation behaves identically</div>
|
|
<div><span class="status-indicator status-pending"></span>Cotton c-vars configuration works</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Include Original Auth Modal -->
|
|
<div x-data="{ originalModalId: 'original' }">
|
|
<c-auth_modal window_key="authModalOriginal" />
|
|
</div>
|
|
|
|
<!-- Include Cotton Auth Modal -->
|
|
<c-auth_modal window_key="authModalCotton" />
|
|
|
|
<!-- Custom Cotton Auth Modal with Configuration -->
|
|
<div id="custom-cotton-modal" style="display: none;">
|
|
<c-auth_modal
|
|
window_key="authModalCustom"
|
|
login_title="Custom Sign In"
|
|
register_title="Custom Registration"
|
|
login_subtitle="Welcome back! Please sign in to your account"
|
|
register_subtitle="Join our amazing community of theme park enthusiasts"
|
|
social_divider_text_login="Or use your credentials"
|
|
social_divider_text_register="Or create with email"
|
|
show_social_providers="true"
|
|
show_forgot_password="true"
|
|
/>
|
|
</div>
|
|
|
|
<!-- Alpine.js -->
|
|
<script src="{% static 'js/alpine.min.js' %}" defer></script>
|
|
|
|
<!-- Auth Modal Alpine.js Component -->
|
|
<script>
|
|
document.addEventListener('alpine:init', () => {
|
|
Alpine.data('authModal', () => ({
|
|
open: false,
|
|
mode: 'login',
|
|
showPassword: false,
|
|
socialProviders: [
|
|
{ id: 'google', name: 'Google' },
|
|
{ id: 'discord', name: 'Discord' }
|
|
],
|
|
socialLoading: false,
|
|
loginLoading: false,
|
|
registerLoading: false,
|
|
loginError: '',
|
|
registerError: '',
|
|
loginForm: {
|
|
username: '',
|
|
password: ''
|
|
},
|
|
registerForm: {
|
|
first_name: '',
|
|
last_name: '',
|
|
email: '',
|
|
username: '',
|
|
password1: '',
|
|
password2: ''
|
|
},
|
|
|
|
close() {
|
|
this.open = false;
|
|
this.resetForms();
|
|
},
|
|
|
|
switchToLogin() {
|
|
this.mode = 'login';
|
|
this.showPassword = false;
|
|
this.registerError = '';
|
|
},
|
|
|
|
switchToRegister() {
|
|
this.mode = 'register';
|
|
this.showPassword = false;
|
|
this.loginError = '';
|
|
},
|
|
|
|
resetForms() {
|
|
this.loginForm = { username: '', password: '' };
|
|
this.registerForm = { first_name: '', last_name: '', email: '', username: '', password1: '', password2: '' };
|
|
this.loginError = '';
|
|
this.registerError = '';
|
|
this.showPassword = false;
|
|
},
|
|
|
|
handleLogin() {
|
|
this.loginLoading = true;
|
|
this.loginError = '';
|
|
|
|
// Simulate API call
|
|
setTimeout(() => {
|
|
this.loginLoading = false;
|
|
if (!this.loginForm.username || !this.loginForm.password) {
|
|
this.loginError = 'Please fill in all fields';
|
|
} else {
|
|
this.loginError = 'Demo: Login functionality would work here';
|
|
}
|
|
}, 1500);
|
|
},
|
|
|
|
handleRegister() {
|
|
this.registerLoading = true;
|
|
this.registerError = '';
|
|
|
|
// Simulate API call
|
|
setTimeout(() => {
|
|
this.registerLoading = false;
|
|
if (this.registerForm.password1 !== this.registerForm.password2) {
|
|
this.registerError = 'Passwords do not match';
|
|
} else if (!this.registerForm.email || !this.registerForm.username) {
|
|
this.registerError = 'Please fill in all required fields';
|
|
} else {
|
|
this.registerError = 'Demo: Registration functionality would work here';
|
|
}
|
|
}, 1500);
|
|
},
|
|
|
|
handleSocialLogin(providerId) {
|
|
this.socialLoading = true;
|
|
setTimeout(() => {
|
|
this.socialLoading = false;
|
|
alert(`Demo: ${providerId} login would work here`);
|
|
}, 1000);
|
|
}
|
|
}));
|
|
});
|
|
|
|
// Store references to both modal instances
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Wait for Alpine.js to initialize and modal instances to be created
|
|
setTimeout(() => {
|
|
// Both modals should now be available with their respective window keys
|
|
console.log('Auth Modal References:', {
|
|
original: window.authModalOriginal,
|
|
cotton: window.authModalCotton,
|
|
custom: window.authModalCustom
|
|
});
|
|
}, 500);
|
|
});
|
|
|
|
// Test functions
|
|
function openOriginalModalInMode(mode) {
|
|
if (window.authModalOriginal) {
|
|
window.authModalOriginal.mode = mode;
|
|
window.authModalOriginal.open = true;
|
|
}
|
|
}
|
|
|
|
function openCottonModalInMode(mode) {
|
|
if (window.authModalCotton) {
|
|
window.authModalCotton.mode = mode;
|
|
window.authModalCotton.open = true;
|
|
}
|
|
}
|
|
|
|
function testOriginalInteractivity() {
|
|
if (window.authModalOriginal) {
|
|
window.authModalOriginal.open = true;
|
|
window.authModalOriginal.mode = 'login';
|
|
setTimeout(() => {
|
|
window.authModalOriginal.loginError = 'Test error message';
|
|
window.authModalOriginal.showPassword = true;
|
|
}, 500);
|
|
}
|
|
}
|
|
|
|
function testCottonInteractivity() {
|
|
if (window.authModalCotton) {
|
|
window.authModalCotton.open = true;
|
|
window.authModalCotton.mode = 'login';
|
|
setTimeout(() => {
|
|
window.authModalCotton.loginError = 'Test error message';
|
|
window.authModalCotton.showPassword = true;
|
|
}, 500);
|
|
}
|
|
}
|
|
|
|
function compareModalStyling() {
|
|
if (window.authModalOriginal && window.authModalCotton) {
|
|
window.authModalOriginal.open = true;
|
|
setTimeout(() => {
|
|
window.authModalCotton.open = true;
|
|
}, 200);
|
|
}
|
|
}
|
|
|
|
function testCustomConfiguration() {
|
|
// Show the custom cotton modal
|
|
const customModal = document.getElementById('custom-cotton-modal');
|
|
customModal.style.display = 'block';
|
|
|
|
// You would implement custom Alpine.js instance here
|
|
alert('Custom configuration test - check the modal titles and text changes');
|
|
}
|
|
</script>
|
|
</body>
|
|
</html> |