Files
Kent-logistics-Laravel/resources/views/admin/staff/create.blade.php
Utkarsh Khedkar fc9a401a8c changes
2025-12-19 11:00:34 +05:30

1160 lines
35 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@extends('admin.layouts.app')
@section('page-title', 'Add New Staff')
@section('content')
<style>
:root {
--primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--secondary-gradient: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
--success-gradient: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
--glass-bg: rgba(255, 255, 255, 0.98);
--shadow-lg: 0 15px 35px rgba(0, 0, 0, 0.1);
--shadow-xl: 0 20px 40px rgba(0, 0, 0, 0.15);
}
body {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
}
/* Main Container */
.staff-add-container {
max-width: 900px;
margin: 0 auto;
position: relative;
}
/* Decorative Elements */
.decorative-circle {
position: absolute;
width: 300px;
height: 300px;
border-radius: 50%;
background: var(--secondary-gradient);
opacity: 0.05;
filter: blur(40px);
z-index: 0;
top: -100px;
right: -100px;
}
/* Main Card */
.staff-add-card {
background: var(--glass-bg);
backdrop-filter: blur(10px);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: var(--shadow-xl);
overflow: hidden;
position: relative;
z-index: 1;
}
/* Header Section */
.staff-add-header {
background: var(--primary-gradient);
padding: 35px 40px;
color: white;
position: relative;
overflow: hidden;
}
.staff-add-header::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='%23ffffff' fill-opacity='0.05' fill-rule='evenodd'/%3E%3C/svg%3E");
opacity: 0.3;
}
.header-content {
position: relative;
z-index: 2;
text-align: center;
}
.header-icon {
font-size: 48px;
margin-bottom: 15px;
display: inline-block;
animation: float 3s ease-in-out infinite;
}
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.header-title {
font-size: 2.2rem;
font-weight: 800;
margin-bottom: 8px;
text-shadow: 0 2px 10px rgba(0,0,0,0.2);
}
.header-subtitle {
font-size: 1rem;
opacity: 0.9;
max-width: 600px;
margin: 0 auto;
}
/* Progress Steps */
.progress-steps {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30px 40px 0;
position: relative;
margin-bottom: 30px;
}
.progress-steps::before {
content: '';
position: absolute;
top: 50%;
left: 40px;
right: 40px;
height: 2px;
background: #e2e8f0;
transform: translateY(-50%);
z-index: 1;
}
.step {
position: relative;
z-index: 2;
text-align: center;
width: 60px;
}
.step-circle {
width: 50px;
height: 50px;
border-radius: 50%;
background: white;
border: 3px solid #e2e8f0;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
color: #a0aec0;
margin: 0 auto 10px;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.step-circle.active {
background: var(--primary-gradient);
color: white;
border-color: transparent;
transform: scale(1.1);
box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
}
.step-circle.completed {
background: #48bb78;
color: white;
border-color: transparent;
}
.step-circle.completed::after {
content: '✓';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 20px;
}
.step-label {
font-size: 0.85rem;
font-weight: 600;
color: #a0aec0;
transition: all 0.3s ease;
}
.step.active .step-label {
color: #2d3748;
}
/* Form Stages */
.form-stage {
padding: 0 40px 40px;
display: none;
animation: slideIn 0.4s ease;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateX(20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
.form-stage.active {
display: block;
}
/* Form Grid */
.form-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
/* Form Group */
.form-group {
position: relative;
}
.form-label {
display: block;
font-weight: 600;
color: #4a5568;
margin-bottom: 8px;
font-size: 0.9rem;
display: flex;
align-items: center;
gap: 6px;
}
.form-label::before {
content: '';
display: inline-block;
width: 5px;
height: 5px;
background: #667eea;
border-radius: 50%;
}
.required::after {
content: '*';
color: #e53e3e;
margin-left: 3px;
}
/* Form Inputs */
.form-input {
width: 100%;
padding: 14px 16px;
border: 2px solid #e2e8f0;
border-radius: 10px;
font-size: 15px;
transition: all 0.3s ease;
background: white;
color: #2d3748;
box-shadow: 0 2px 5px rgba(0,0,0,0.05);
}
.form-input:focus {
outline: none;
border-color: #667eea;
box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1);
transform: translateY(-1px);
}
.form-input::placeholder {
color: #a0aec0;
}
.form-textarea {
min-height: 100px;
resize: vertical;
line-height: 1.5;
}
/* Helper Text */
.helper-text {
font-size: 0.8rem;
color: #718096;
margin-top: 6px;
display: flex;
align-items: center;
gap: 5px;
}
/* Status Toggle */
.status-toggle {
display: flex;
gap: 10px;
}
.status-option {
flex: 1;
text-align: center;
padding: 14px;
border: 2px solid #e2e8f0;
border-radius: 10px;
cursor: pointer;
transition: all 0.3s ease;
font-weight: 600;
font-size: 0.9rem;
background: white;
color: #718096;
}
.status-option:hover {
border-color: #667eea;
color: #667eea;
}
.status-option.active {
border-color: #48bb78;
background: #f0fff4;
color: #276749;
}
.status-option.inactive {
border-color: #fc8181;
background: #fff5f5;
color: #9b2c2c;
}
input[type="radio"] {
display: none;
}
/* Permissions Section */
.permissions-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 15px;
margin-top: 20px;
}
.permission-group {
background: white;
border: 2px solid #e2e8f0;
border-radius: 12px;
padding: 20px;
transition: all 0.3s ease;
box-shadow: 0 3px 10px rgba(0,0,0,0.05);
}
.permission-group:hover {
border-color: #667eea;
transform: translateY(-3px);
box-shadow: 0 8px 20px rgba(102, 126, 234, 0.1);
}
.group-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding-bottom: 12px;
border-bottom: 1px solid #edf2f7;
}
.group-title {
font-size: 1rem;
font-weight: 700;
color: #2d3748;
margin: 0;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.toggle-group-btn {
background: var(--primary-gradient);
color: white;
border: none;
padding: 6px 12px;
border-radius: 6px;
cursor: pointer;
font-weight: 600;
font-size: 0.8rem;
transition: all 0.3s ease;
}
.toggle-group-btn:hover {
transform: scale(1.05);
box-shadow: 0 3px 10px rgba(102, 126, 234, 0.3);
}
.permission-items {
display: flex;
flex-direction: column;
gap: 10px;
}
.permission-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px;
background: #f8fafc;
border-radius: 8px;
transition: all 0.3s ease;
cursor: pointer;
}
.permission-item:hover {
background: #edf2f7;
transform: translateX(3px);
}
.permission-checkbox {
width: 18px;
height: 18px;
border-radius: 4px;
border: 2px solid #cbd5e0;
cursor: pointer;
position: relative;
transition: all 0.3s ease;
flex-shrink: 0;
}
.permission-checkbox:checked {
background: #667eea;
border-color: #667eea;
}
.permission-checkbox:checked::after {
content: '✓';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white;
font-weight: bold;
font-size: 12px;
}
.permission-name {
font-weight: 500;
color: #4a5568;
font-size: 0.9rem;
flex: 1;
cursor: pointer;
}
/* Error Messages */
.error-container {
background: linear-gradient(135deg, #fff5f5, #fed7d7);
border: 2px solid #fc8181;
border-radius: 12px;
padding: 20px;
margin: 0 40px 20px;
animation: slideIn 0.5s ease;
}
.error-title {
color: #c53030;
font-weight: 700;
font-size: 1rem;
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 8px;
}
.error-list {
list-style: none;
padding: 0;
margin: 0;
}
.error-item {
color: #742a2a;
padding: 6px 0;
padding-left: 20px;
position: relative;
font-size: 0.9rem;
}
.error-item::before {
content: '⚠️';
position: absolute;
left: 0;
font-size: 0.9rem;
}
/* Navigation Buttons */
.navigation-buttons {
display: flex;
justify-content: space-between;
padding: 25px 40px;
background: #f8fafc;
border-top: 1px solid #e2e8f0;
margin-top: 20px;
}
.btn {
padding: 12px 28px;
border-radius: 10px;
font-weight: 600;
font-size: 14px;
cursor: pointer;
transition: all 0.3s ease;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
border: 2px solid transparent;
position: relative;
overflow: hidden;
}
.btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
transition: 0.5s;
}
.btn:hover::before {
left: 100%;
}
.btn-prev {
background: white;
color: #4a5568;
border-color: #e2e8f0;
min-width: 120px;
}
.btn-prev:hover {
background: #f7fafc;
border-color: #cbd5e0;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
.btn-next {
background: var(--primary-gradient);
color: white;
min-width: 120px;
box-shadow: 0 5px 15px rgba(102, 126, 234, 0.3);
}
.btn-next:hover {
transform: translateY(-2px) scale(1.05);
box-shadow: 0 8px 20px rgba(102, 126, 234, 0.4);
}
.btn-submit {
background: var(--success-gradient);
color: white;
min-width: 150px;
box-shadow: 0 5px 15px rgba(67, 233, 123, 0.3);
}
.btn-submit:hover {
transform: translateY(-2px) scale(1.05);
box-shadow: 0 8px 20px rgba(67, 233, 123, 0.4);
}
/* Password Strength Indicator */
.password-strength {
margin-top: 8px;
height: 4px;
border-radius: 2px;
background: #e2e8f0;
overflow: hidden;
position: relative;
}
.strength-bar {
height: 100%;
width: 0%;
border-radius: 2px;
transition: all 0.3s ease;
}
.strength-weak { background: #e53e3e; }
.strength-fair { background: #ed8936; }
.strength-good { background: #38b2ac; }
.strength-strong { background: #48bb78; }
/* Responsive Design */
@media (max-width: 768px) {
body {
padding: 15px;
}
.staff-add-header {
padding: 25px 20px;
}
.progress-steps {
padding: 25px 20px 0;
}
.progress-steps::before {
left: 20px;
right: 20px;
}
.step-circle {
width: 40px;
height: 40px;
}
.form-stage {
padding: 0 20px 30px;
}
.form-grid {
grid-template-columns: 1fr;
gap: 15px;
}
.permissions-container {
grid-template-columns: 1fr;
}
.navigation-buttons {
padding: 20px;
flex-direction: column;
gap: 10px;
}
.btn {
width: 100%;
justify-content: center;
}
.error-container {
margin: 0 20px 15px;
}
}
@media (max-width: 480px) {
.header-title {
font-size: 1.8rem;
}
.header-icon {
font-size: 36px;
}
.step-label {
font-size: 0.75rem;
}
}
</style>
<div class="staff-add-container">
<!-- Decorative Background -->
<div class="decorative-circle"></div>
<!-- Main Card -->
<div class="staff-add-card">
<!-- Header -->
<div class="staff-add-header">
<div class="header-content">
<div class="header-icon">👨‍💼</div>
<h1 class="header-title">Add New Staff Member</h1>
<p class="header-subtitle">Complete all the steps below to add a new staff member to your team</p>
</div>
</div>
<!-- Progress Steps -->
<div class="progress-steps">
<div class="step active" data-step="1">
<div class="step-circle active">1</div>
<div class="step-label">Personal</div>
</div>
<div class="step" data-step="2">
<div class="step-circle">2</div>
<div class="step-label">Professional</div>
</div>
<div class="step" data-step="3">
<div class="step-circle">3</div>
<div class="step-label">Account</div>
</div>
<div class="step" data-step="4">
<div class="step-circle">4</div>
<div class="step-label">Permissions</div>
</div>
</div>
<!-- Error Messages -->
@if($errors->any())
<div class="error-container">
<div class="error-title">
<span>⚠️</span>
Please fix the following errors
</div>
<ul class="error-list">
@foreach($errors->all() as $err)
<li class="error-item">{{ $err }}</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="{{ route('admin.staff.store') }}" id="staffForm">
@csrf
<!-- Stage 1: Personal Information -->
<div class="form-stage active" id="stage-1">
<div class="form-grid">
<div class="form-group">
<label class="form-label required">Full Name</label>
<input type="text"
name="name"
value="{{ old('name') }}"
class="form-input"
placeholder="Enter staff full name"
required
autofocus>
</div>
<div class="form-group">
<label class="form-label required">Email Address</label>
<input type="email"
name="email"
value="{{ old('email') }}"
class="form-input"
placeholder="staff@company.com"
required>
</div>
<div class="form-group">
<label class="form-label required">Phone Number</label>
<input type="text"
name="phone"
value="{{ old('phone') }}"
class="form-input"
placeholder="+91 9876543210"
required>
</div>
<div class="form-group">
<label class="form-label">Emergency Contact</label>
<input type="text"
name="emergency_phone"
value="{{ old('emergency_phone') }}"
class="form-input"
placeholder="Emergency contact number">
</div>
<div class="form-group" style="grid-column: span 2;">
<label class="form-label">Address</label>
<textarea name="address"
class="form-input form-textarea"
placeholder="Enter complete address"
rows="3">{{ old('address') }}</textarea>
</div>
</div>
<div class="navigation-buttons">
<div></div> <!-- Empty div for spacing -->
<button type="button" class="btn btn-next" onclick="nextStage()">
<span>Next</span>
<span></span>
</button>
</div>
</div>
<!-- Stage 2: Professional Information -->
<div class="form-stage" id="stage-2">
<div class="form-grid">
<div class="form-group">
<label class="form-label">Role</label>
<input type="text"
name="role"
value="{{ old('role') }}"
class="form-input"
placeholder="e.g., Manager, Executive, Admin">
</div>
<div class="form-group">
<label class="form-label">Department</label>
<input type="text"
name="department"
value="{{ old('department') }}"
class="form-input"
placeholder="e.g., IT, HR, Sales, Finance">
</div>
<div class="form-group">
<label class="form-label">Designation</label>
<input type="text"
name="designation"
value="{{ old('designation') }}"
class="form-input"
placeholder="e.g., Senior Developer, HR Executive">
</div>
<div class="form-group">
<label class="form-label">Joining Date</label>
<input type="date"
name="joining_date"
value="{{ old('joining_date') }}"
class="form-input">
</div>
<div class="form-group">
<label class="form-label">Status</label>
<div class="status-toggle">
<label class="status-option active">
<input type="radio" name="status" value="active" checked>
<span> Active</span>
</label>
<label class="status-option">
<input type="radio" name="status" value="inactive">
<span>⏸️ Inactive</span>
</label>
</div>
</div>
<div class="form-group" style="grid-column: span 2;">
<label class="form-label">Additional Information</label>
<textarea name="additional_info"
class="form-input form-textarea"
placeholder="Any additional notes or information"
rows="3">{{ old('additional_info') }}</textarea>
</div>
</div>
<div class="navigation-buttons">
<button type="button" class="btn btn-prev" onclick="prevStage()">
<span></span>
<span>Previous</span>
</button>
<button type="button" class="btn btn-next" onclick="nextStage()">
<span>Next</span>
<span></span>
</button>
</div>
</div>
<!-- Stage 3: Account Information -->
<div class="form-stage" id="stage-3">
<div class="form-grid">
<div class="form-group">
<label class="form-label required">Username</label>
<input type="text"
name="username"
value="{{ old('username') }}"
class="form-input"
placeholder="Leave blank to generate automatically"
required>
<div class="helper-text">
<span></span>
If left blank, username will be generated from employee ID
</div>
</div>
<div class="form-group">
<label class="form-label required">Password</label>
<input type="password"
name="password"
class="form-input"
placeholder="Enter secure password"
required
id="passwordInput">
<div class="password-strength">
<div class="strength-bar" id="strengthBar"></div>
</div>
<div class="helper-text">
<span>🔒</span>
Minimum 8 characters with letters and numbers
</div>
</div>
<div class="form-group">
<label class="form-label required">Confirm Password</label>
<input type="password"
name="password_confirmation"
class="form-input"
placeholder="Confirm your password"
required>
</div>
</div>
<div class="navigation-buttons">
<button type="button" class="btn btn-prev" onclick="prevStage()">
<span></span>
<span>Previous</span>
</button>
<button type="button" class="btn btn-next" onclick="nextStage()">
<span>Next</span>
<span></span>
</button>
</div>
</div>
<!-- Stage 4: Permissions -->
<div class="form-stage" id="stage-4">
<div style="margin-bottom: 20px;">
<h3 style="color: #2d3748; font-size: 1.2rem; margin-bottom: 10px;">🔐 Set Access Permissions</h3>
<p style="color: #718096; font-size: 0.95rem;">Select the permissions you want to grant to this staff member.</p>
</div>
<div class="permissions-container">
@foreach($permissions as $group => $groupPerms)
<div class="permission-group">
<div class="group-header">
<h4 class="group-title">{{ ucfirst($group) }}</h4>
<button type="button"
class="toggle-group-btn"
onclick="toggleGroupPermissions('{{ $group }}')">
Toggle All
</button>
</div>
<div class="permission-items" id="permission-group-{{ $group }}">
@foreach($groupPerms as $perm)
<label class="permission-item">
<input type="checkbox"
name="permissions[]"
value="{{ $perm->name }}"
class="permission-checkbox"
id="perm-{{ $perm->id }}">
<span class="permission-name">{{ $perm->name }}</span>
</label>
@endforeach
</div>
</div>
@endforeach
</div>
<div class="navigation-buttons">
<button type="button" class="btn btn-prev" onclick="prevStage()">
<span></span>
<span>Previous</span>
</button>
<button type="submit" class="btn btn-submit">
<span>🚀</span>
<span>Create Staff</span>
</button>
</div>
</div>
</form>
</div>
</div>
<script>
let currentStage = 1;
const totalStages = 4;
// Initialize status toggle
document.querySelectorAll('.status-option').forEach(option => {
option.addEventListener('click', function() {
document.querySelectorAll('.status-option').forEach(opt => {
opt.classList.remove('active');
});
this.classList.add('active');
this.querySelector('input').checked = true;
});
});
// Password strength indicator
document.getElementById('passwordInput')?.addEventListener('input', function(e) {
const password = e.target.value;
const strengthBar = document.getElementById('strengthBar');
let strength = 0;
if (password.length >= 8) strength++;
if (/[A-Z]/.test(password)) strength++;
if (/[0-9]/.test(password)) strength++;
if (/[^A-Za-z0-9]/.test(password)) strength++;
let width = 0;
let className = '';
switch(strength) {
case 0:
width = 0;
className = 'strength-weak';
break;
case 1:
width = 25;
className = 'strength-weak';
break;
case 2:
width = 50;
className = 'strength-fair';
break;
case 3:
width = 75;
className = 'strength-good';
break;
case 4:
width = 100;
className = 'strength-strong';
break;
}
strengthBar.style.width = width + '%';
strengthBar.className = 'strength-bar ' + className;
});
// Toggle group permissions
function toggleGroupPermissions(group) {
const checkboxes = document.querySelectorAll(`#permission-group-${group} .permission-checkbox`);
const allChecked = Array.from(checkboxes).every(cb => cb.checked);
checkboxes.forEach(checkbox => {
checkbox.checked = !allChecked;
checkbox.dispatchEvent(new Event('change'));
});
}
// Navigation functions
function nextStage() {
if (currentStage < totalStages) {
// Validate current stage
if (!validateStage(currentStage)) {
return;
}
// Mark current step as completed
const currentStep = document.querySelector(`[data-step="${currentStage}"] .step-circle`);
currentStep.classList.remove('active');
currentStep.classList.add('completed');
currentStage++;
// Update progress steps
updateProgressSteps();
// Show next stage
showStage(currentStage);
}
}
function prevStage() {
if (currentStage > 1) {
// Mark current step as inactive
const currentStep = document.querySelector(`[data-step="${currentStage}"] .step-circle`);
currentStep.classList.remove('active');
currentStep.classList.remove('completed');
currentStage--;
// Update progress steps
updateProgressSteps();
// Show previous stage
showStage(currentStage);
}
}
function showStage(stageNumber) {
// Hide all stages
document.querySelectorAll('.form-stage').forEach(stage => {
stage.classList.remove('active');
});
// Show selected stage
const stageElement = document.getElementById(`stage-${stageNumber}`);
if (stageElement) {
stageElement.classList.add('active');
// Scroll to top of form
stageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}
function updateProgressSteps() {
// Remove active class from all steps
document.querySelectorAll('.step').forEach(step => {
step.classList.remove('active');
});
// Add active class to current step
const currentStep = document.querySelector(`[data-step="${currentStage}"]`);
if (currentStep) {
currentStep.classList.add('active');
const stepCircle = currentStep.querySelector('.step-circle');
stepCircle.classList.add('active');
stepCircle.classList.remove('completed');
}
// Mark previous steps as completed
for (let i = 1; i < currentStage; i++) {
const step = document.querySelector(`[data-step="${i}"] .step-circle`);
if (step) {
step.classList.add('completed');
step.classList.remove('active');
}
}
}
function validateStage(stageNumber) {
let isValid = true;
const stageElement = document.getElementById(`stage-${stageNumber}`);
if (stageElement) {
const requiredInputs = stageElement.querySelectorAll('[required]');
requiredInputs.forEach(input => {
if (!input.value.trim()) {
isValid = false;
input.style.borderColor = '#e53e3e';
input.style.animation = 'shake 0.3s ease';
setTimeout(() => {
input.style.animation = '';
}, 300);
} else {
input.style.borderColor = '#e2e8f0';
}
});
if (!isValid) {
// Scroll to first error
const firstError = stageElement.querySelector('[required]:invalid');
if (firstError) {
firstError.scrollIntoView({ behavior: 'smooth', block: 'center' });
firstError.focus();
}
}
}
return isValid;
}
// Form submission validation
document.getElementById('staffForm').addEventListener('submit', function(e) {
// Validate all stages
for (let i = 1; i <= totalStages; i++) {
if (!validateStage(i)) {
e.preventDefault();
showStage(i);
return;
}
}
// Show loading state
const submitBtn = this.querySelector('.btn-submit');
if (submitBtn) {
submitBtn.innerHTML = '<span>⏳</span><span>Creating Staff...</span>';
submitBtn.disabled = true;
}
});
// Add shake animation
const style = document.createElement('style');
style.textContent = `
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
`;
document.head.appendChild(style);
</script>
@endsection