made the add member as a modal not a complete page
This commit is contained in:
parent
cc8ca3f686
commit
30b5f4fa0f
@ -59,7 +59,7 @@ class AuthenticatedSessionController extends Controller
|
|||||||
// ]);
|
// ]);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
return redirect()->route('family.dashboard');
|
return redirect()->route('clubs.explore');
|
||||||
}
|
}
|
||||||
|
|
||||||
return back()->withErrors([
|
return back()->withErrors([
|
||||||
|
|||||||
@ -243,7 +243,7 @@ class FamilyController extends Controller
|
|||||||
{
|
{
|
||||||
$validated = $request->validate([
|
$validated = $request->validate([
|
||||||
'full_name' => 'required|string|max:255',
|
'full_name' => 'required|string|max:255',
|
||||||
'email' => 'nullable|email|max:255',
|
'email' => 'nullable|email|max:255|unique:users,email,' . $id,
|
||||||
'mobile_code' => 'nullable|string|max:5',
|
'mobile_code' => 'nullable|string|max:5',
|
||||||
'mobile' => 'nullable|string|max:20',
|
'mobile' => 'nullable|string|max:20',
|
||||||
'gender' => 'required|in:m,f',
|
'gender' => 'required|in:m,f',
|
||||||
@ -366,7 +366,8 @@ class FamilyController extends Controller
|
|||||||
->where('dependent_user_id', $id)
|
->where('dependent_user_id', $id)
|
||||||
->firstOrFail();
|
->firstOrFail();
|
||||||
|
|
||||||
$relationship->delete();
|
$dependent = User::findOrFail($id);
|
||||||
|
$dependent->delete();
|
||||||
|
|
||||||
return redirect()->route('family.dashboard')
|
return redirect()->route('family.dashboard')
|
||||||
->with('success', 'Family member removed successfully.');
|
->with('success', 'Family member removed successfully.');
|
||||||
|
|||||||
@ -5,6 +5,7 @@ namespace App\Models;
|
|||||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||||
use Illuminate\Auth\MustVerifyEmail;
|
use Illuminate\Auth\MustVerifyEmail;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||||
use Illuminate\Notifications\Notifiable;
|
use Illuminate\Notifications\Notifiable;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
@ -15,7 +16,7 @@ use Carbon\Carbon;
|
|||||||
class User extends Authenticatable
|
class User extends Authenticatable
|
||||||
{
|
{
|
||||||
/** @use HasFactory<\Database\Factories\UserFactory> */
|
/** @use HasFactory<\Database\Factories\UserFactory> */
|
||||||
use HasFactory, Notifiable, MustVerifyEmail;
|
use HasFactory, Notifiable, MustVerifyEmail, SoftDeletes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The attributes that are mass assignable.
|
* The attributes that are mass assignable.
|
||||||
|
|||||||
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('users', function (Blueprint $table) {
|
||||||
|
$table->softDeletes();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('users', function (Blueprint $table) {
|
||||||
|
$table->dropSoftDeletes();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -28,6 +28,28 @@
|
|||||||
@enderror
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="mobile" class="form-label">Mobile Number</label>
|
||||||
|
<div class="input-group" onclick="event.stopPropagation()">
|
||||||
|
<button class="btn btn-outline-secondary dropdown-toggle country-dropdown-btn d-flex align-items-center" type="button" id="country_codeDropdown" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
<span class="fi fi-bh me-2" id="country_codeSelectedFlag"></span>
|
||||||
|
<span class="country-label" id="country_codeSelectedCountry">{{ old('mobile_code', '+973') }}</span>
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu p-2" aria-labelledby="country_codeDropdown" style="min-width: 200px;" onclick="event.stopPropagation()">
|
||||||
|
<input type="text" class="form-control form-control-sm mb-2" placeholder="Search country..." id="country_codeSearch" onkeydown="event.stopPropagation()">
|
||||||
|
<div class="country-list" id="country_codeList" style="max-height: 300px; overflow-y: auto;"></div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="country_code" name="mobile_code" value="{{ old('mobile_code', '+973') }}">
|
||||||
|
<input id="mobile_number" type="tel" class="form-control @error('mobile') is-invalid @enderror" name="mobile" value="{{ old('mobile') }}" autocomplete="tel" placeholder="Phone number">
|
||||||
|
</div>
|
||||||
|
@error('mobile')
|
||||||
|
<div class="invalid-feedback d-block">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
@error('mobile_code')
|
||||||
|
<div class="invalid-feedback d-block">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<label for="gender" class="form-label">Gender</label>
|
<label for="gender" class="form-label">Gender</label>
|
||||||
@ -78,6 +100,78 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<h5 class="form-label d-flex justify-content-between align-items-center">
|
||||||
|
Social Media Links
|
||||||
|
<button type="button" class="btn btn-outline-primary btn-sm" id="addSocialLink">
|
||||||
|
<i class="bi bi-plus"></i> Add Link
|
||||||
|
</button>
|
||||||
|
</h5>
|
||||||
|
<div id="socialLinksContainer">
|
||||||
|
@php
|
||||||
|
$existingLinks = old('social_links', []);
|
||||||
|
if (!is_array($existingLinks)) {
|
||||||
|
$existingLinks = [];
|
||||||
|
}
|
||||||
|
// Convert associative array to array of arrays for form display
|
||||||
|
$formLinks = [];
|
||||||
|
foreach ($existingLinks as $platform => $url) {
|
||||||
|
$formLinks[] = ['platform' => $platform, 'url' => $url];
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
@foreach($formLinks as $index => $link)
|
||||||
|
<div class="social-link-row mb-3 d-flex align-items-end">
|
||||||
|
<div class="me-2 flex-grow-1">
|
||||||
|
<label class="form-label">Platform</label>
|
||||||
|
<select class="form-select platform-select" name="social_links[{{ $index }}][platform]" required>
|
||||||
|
<option value="">Select Platform</option>
|
||||||
|
<option value="facebook" {{ ($link['platform'] ?? '') == 'facebook' ? 'selected' : '' }}>Facebook</option>
|
||||||
|
<option value="twitter" {{ ($link['platform'] ?? '') == 'twitter' ? 'selected' : '' }}>Twitter/X</option>
|
||||||
|
<option value="instagram" {{ ($link['platform'] ?? '') == 'instagram' ? 'selected' : '' }}>Instagram</option>
|
||||||
|
<option value="linkedin" {{ ($link['platform'] ?? '') == 'linkedin' ? 'selected' : '' }}>LinkedIn</option>
|
||||||
|
<option value="youtube" {{ ($link['platform'] ?? '') == 'youtube' ? 'selected' : '' }}>YouTube</option>
|
||||||
|
<option value="tiktok" {{ ($link['platform'] ?? '') == 'tiktok' ? 'selected' : '' }}>TikTok</option>
|
||||||
|
<option value="snapchat" {{ ($link['platform'] ?? '') == 'snapchat' ? 'selected' : '' }}>Snapchat</option>
|
||||||
|
<option value="whatsapp" {{ ($link['platform'] ?? '') == 'whatsapp' ? 'selected' : '' }}>WhatsApp</option>
|
||||||
|
<option value="telegram" {{ ($link['platform'] ?? '') == 'telegram' ? 'selected' : '' }}>Telegram</option>
|
||||||
|
<option value="discord" {{ ($link['platform'] ?? '') == 'discord' ? 'selected' : '' }}>Discord</option>
|
||||||
|
<option value="reddit" {{ ($link['platform'] ?? '') == 'reddit' ? 'selected' : '' }}>Reddit</option>
|
||||||
|
<option value="pinterest" {{ ($link['platform'] ?? '') == 'pinterest' ? 'selected' : '' }}>Pinterest</option>
|
||||||
|
<option value="twitch" {{ ($link['platform'] ?? '') == 'twitch' ? 'selected' : '' }}>Twitch</option>
|
||||||
|
<option value="github" {{ ($link['platform'] ?? '') == 'github' ? 'selected' : '' }}>GitHub</option>
|
||||||
|
<option value="spotify" {{ ($link['platform'] ?? '') == 'spotify' ? 'selected' : '' }}>Spotify</option>
|
||||||
|
<option value="skype" {{ ($link['platform'] ?? '') == 'skype' ? 'selected' : '' }}>Skype</option>
|
||||||
|
<option value="slack" {{ ($link['platform'] ?? '') == 'slack' ? 'selected' : '' }}>Slack</option>
|
||||||
|
<option value="medium" {{ ($link['platform'] ?? '') == 'medium' ? 'selected' : '' }}>Medium</option>
|
||||||
|
<option value="vimeo" {{ ($link['platform'] ?? '') == 'vimeo' ? 'selected' : '' }}>Vimeo</option>
|
||||||
|
<option value="messenger" {{ ($link['platform'] ?? '') == 'messenger' ? 'selected' : '' }}>Messenger</option>
|
||||||
|
<option value="wechat" {{ ($link['platform'] ?? '') == 'wechat' ? 'selected' : '' }}>WeChat</option>
|
||||||
|
<option value="line" {{ ($link['platform'] ?? '') == 'line' ? 'selected' : '' }}>Line</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="me-2 flex-grow-1">
|
||||||
|
<label class="form-label">URL</label>
|
||||||
|
<input type="url" class="form-control" name="social_links[{{ $index }}][url]" value="{{ $link['url'] ?? '' }}" placeholder="https://example.com/username" required>
|
||||||
|
</div>
|
||||||
|
<div class="mb-0">
|
||||||
|
<button type="button" class="btn btn-outline-danger btn-sm remove-social-link">
|
||||||
|
<i class="bi bi-trash"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="motto" class="form-label">Personal Motto</label>
|
||||||
|
<textarea class="form-control @error('motto') is-invalid @enderror" id="motto" name="motto" rows="3" placeholder="Enter personal motto or quote...">{{ old('motto') }}</textarea>
|
||||||
|
<div class="form-text">Share a personal motto or quote that inspires them.</div>
|
||||||
|
@error('motto')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<label for="relationship_type" class="form-label">Relationship</label>
|
<label for="relationship_type" class="form-label">Relationship</label>
|
||||||
@ -110,4 +204,141 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
let socialLinkIndex = {{ count($formLinks ?? []) }};
|
||||||
|
|
||||||
|
// Add new social link row
|
||||||
|
document.getElementById('addSocialLink').addEventListener('click', function() {
|
||||||
|
addSocialLinkRow();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Remove social link row
|
||||||
|
document.addEventListener('click', function(e) {
|
||||||
|
if (e.target.classList.contains('remove-social-link') || e.target.closest('.remove-social-link')) {
|
||||||
|
e.target.closest('.social-link-row').remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function addSocialLinkRow(platform = '', url = '') {
|
||||||
|
const container = document.getElementById('socialLinksContainer');
|
||||||
|
const row = document.createElement('div');
|
||||||
|
row.className = 'social-link-row mb-3 d-flex align-items-end';
|
||||||
|
|
||||||
|
row.innerHTML = `
|
||||||
|
<div class="me-2 flex-grow-1">
|
||||||
|
<label class="form-label">Platform</label>
|
||||||
|
<select class="form-select platform-select" name="social_links[${socialLinkIndex}][platform]" required>
|
||||||
|
<option value="">Select Platform</option>
|
||||||
|
<option value="facebook" ${platform === 'facebook' ? 'selected' : ''}>Facebook</option>
|
||||||
|
<option value="twitter" ${platform === 'twitter' ? 'selected' : ''}>Twitter/X</option>
|
||||||
|
<option value="instagram" ${platform === 'instagram' ? 'selected' : ''}>Instagram</option>
|
||||||
|
<option value="linkedin" ${platform === 'linkedin' ? 'selected' : ''}>LinkedIn</option>
|
||||||
|
<option value="youtube" ${platform === 'youtube' ? 'selected' : ''}>YouTube</option>
|
||||||
|
<option value="tiktok" ${platform === 'tiktok' ? 'selected' : ''}>TikTok</option>
|
||||||
|
<option value="snapchat" ${platform === 'snapchat' ? 'selected' : ''}>Snapchat</option>
|
||||||
|
<option value="whatsapp" ${platform === 'whatsapp' ? 'selected' : ''}>WhatsApp</option>
|
||||||
|
<option value="telegram" ${platform === 'telegram' ? 'selected' : ''}>Telegram</option>
|
||||||
|
<option value="discord" ${platform === 'discord' ? 'selected' : ''}>Discord</option>
|
||||||
|
<option value="reddit" ${platform === 'reddit' ? 'selected' : ''}>Reddit</option>
|
||||||
|
<option value="pinterest" ${platform === 'pinterest' ? 'selected' : ''}>Pinterest</option>
|
||||||
|
<option value="twitch" ${platform === 'twitch' ? 'selected' : ''}>Twitch</option>
|
||||||
|
<option value="github" ${platform === 'github' ? 'selected' : ''}>GitHub</option>
|
||||||
|
<option value="spotify" ${platform === 'spotify' ? 'selected' : ''}>Spotify</option>
|
||||||
|
<option value="skype" ${platform === 'skype' ? 'selected' : ''}>Skype</option>
|
||||||
|
<option value="slack" ${platform === 'slack' ? 'selected' : ''}>Slack</option>
|
||||||
|
<option value="medium" ${platform === 'medium' ? 'selected' : ''}>Medium</option>
|
||||||
|
<option value="vimeo" ${platform === 'vimeo' ? 'selected' : ''}>Vimeo</option>
|
||||||
|
<option value="messenger" ${platform === 'messenger' ? 'selected' : ''}>Messenger</option>
|
||||||
|
<option value="wechat" ${platform === 'wechat' ? 'selected' : ''}>WeChat</option>
|
||||||
|
<option value="line" ${platform === 'line' ? 'selected' : ''}>Line</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="me-2 flex-grow-1">
|
||||||
|
<label class="form-label">URL</label>
|
||||||
|
<input type="url" class="form-control" name="social_links[${socialLinkIndex}][url]" value="${url}" placeholder="https://example.com/username" required>
|
||||||
|
</div>
|
||||||
|
<div class="mb-0">
|
||||||
|
<button type="button" class="btn btn-outline-danger btn-sm remove-social-link">
|
||||||
|
<i class="bi bi-trash"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
container.appendChild(row);
|
||||||
|
socialLinkIndex++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
// Load countries for mobile code dropdown
|
||||||
|
fetch('/data/countries.json')
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(countries => {
|
||||||
|
const listElement = document.getElementById('country_codeList');
|
||||||
|
const selectedFlag = document.getElementById('country_codeSelectedFlag');
|
||||||
|
const selectedCountry = document.getElementById('country_codeSelectedCountry');
|
||||||
|
const hiddenInput = document.getElementById('country_code');
|
||||||
|
const searchInput = document.getElementById('country_codeSearch');
|
||||||
|
|
||||||
|
if (!listElement) return;
|
||||||
|
|
||||||
|
// Populate dropdown
|
||||||
|
countries.forEach(country => {
|
||||||
|
const button = document.createElement('button');
|
||||||
|
button.className = 'dropdown-item d-flex align-items-center';
|
||||||
|
button.type = 'button';
|
||||||
|
button.setAttribute('data-country-code', country.call_code);
|
||||||
|
button.setAttribute('data-country-name', country.name);
|
||||||
|
button.setAttribute('data-flag-code', country.flag);
|
||||||
|
button.setAttribute('data-search', `${country.name.toLowerCase()} ${country.call_code}`);
|
||||||
|
button.innerHTML = `<span class="fi fi-${country.flag.toLowerCase()} me-2"></span><span>${country.name} (${country.call_code})</span>`;
|
||||||
|
button.addEventListener('click', function() {
|
||||||
|
const code = this.getAttribute('data-country-code');
|
||||||
|
const flag = this.getAttribute('data-flag-code');
|
||||||
|
const name = this.getAttribute('data-country-name');
|
||||||
|
selectedFlag.className = `fi fi-${flag.toLowerCase()} me-2`;
|
||||||
|
selectedCountry.textContent = code;
|
||||||
|
hiddenInput.value = code;
|
||||||
|
// Close dropdown
|
||||||
|
const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('country_codeDropdown'));
|
||||||
|
if (dropdown) dropdown.hide();
|
||||||
|
});
|
||||||
|
listElement.appendChild(button);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set initial value
|
||||||
|
const initialValue = '{{ old('mobile_code', '+973') }}';
|
||||||
|
if (initialValue) {
|
||||||
|
hiddenInput.value = initialValue;
|
||||||
|
selectedCountry.textContent = initialValue;
|
||||||
|
const country = countries.find(c => c.call_code === initialValue);
|
||||||
|
if (country) {
|
||||||
|
selectedFlag.className = `fi fi-${country.flag.toLowerCase()} me-2`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search functionality
|
||||||
|
searchInput.addEventListener('input', function() {
|
||||||
|
const searchTerm = this.value.toLowerCase();
|
||||||
|
const items = listElement.querySelectorAll('.dropdown-item');
|
||||||
|
items.forEach(item => {
|
||||||
|
const searchData = item.getAttribute('data-search');
|
||||||
|
if (searchData.includes(searchTerm)) {
|
||||||
|
item.style.display = '';
|
||||||
|
} else {
|
||||||
|
item.style.display = 'none';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => console.error('Error loading countries:', error));
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@ -273,12 +273,12 @@
|
|||||||
<!-- Add New Family Member Card -->
|
<!-- Add New Family Member Card -->
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="card h-100 shadow-sm border-dashed add-card">
|
<div class="card h-100 shadow-sm border-dashed add-card">
|
||||||
<a href="{{ route('family.create') }}" class="card-body text-center text-decoration-none d-flex flex-column justify-content-center align-items-center" style="height: 100%;">
|
<div class="card-body text-center text-decoration-none d-flex flex-column justify-content-center align-items-center" style="height: 100%; cursor: pointer;" data-bs-toggle="modal" data-bs-target="#addFamilyMemberModal">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<i class="bi bi-plus-circle" style="font-size: 3rem;"></i>
|
<i class="bi bi-plus-circle" style="font-size: 3rem;"></i>
|
||||||
</div>
|
</div>
|
||||||
<h5 class="card-title text-muted">Add Family Member</h5>
|
<h5 class="card-title text-muted">Add Family Member</h5>
|
||||||
</a>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -347,6 +347,209 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Add Family Member Modal -->
|
||||||
|
<div class="modal fade" id="addFamilyMemberModal" tabindex="-1" aria-labelledby="addFamilyMemberModalLabel" aria-hidden="true" data-bs-focus="false">
|
||||||
|
<div class="modal-dialog modal-xl">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="addFamilyMemberModalLabel">Add Family Member</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form id="addFamilyMemberForm" method="POST" action="{{ route('family.store') }}">
|
||||||
|
@csrf
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="full_name" class="form-label">Full Name</label>
|
||||||
|
<input type="text" class="form-control @error('full_name') is-invalid @enderror" id="full_name" name="full_name" value="{{ old('full_name') }}" required>
|
||||||
|
@error('full_name')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="email" class="form-label">Email Address <span class="text-muted">(Optional for children)</span></label>
|
||||||
|
<input type="email" class="form-control @error('email') is-invalid @enderror" id="email" name="email" value="{{ old('email') }}">
|
||||||
|
@error('email')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="mobile" class="form-label">Mobile Number</label>
|
||||||
|
<div class="input-group" onclick="event.stopPropagation()">
|
||||||
|
<button class="btn btn-outline-secondary dropdown-toggle country-dropdown-btn d-flex align-items-center" type="button" id="country_codeDropdown" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
<span class="fi fi-bh me-2" id="country_codeSelectedFlag"></span>
|
||||||
|
<span class="country-label" id="country_codeSelectedCountry">{{ old('mobile_code', '+973') }}</span>
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu p-2" aria-labelledby="country_codeDropdown" style="min-width: 200px;" onclick="event.stopPropagation()">
|
||||||
|
<input type="text" class="form-control form-control-sm mb-2" placeholder="Search country..." id="country_codeSearch" onkeydown="event.stopPropagation()" tabindex="0">
|
||||||
|
<div class="country-list" id="country_codeList" style="max-height: 300px; overflow-y: auto;"></div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="country_code" name="mobile_code" value="{{ old('mobile_code', '+973') }}">
|
||||||
|
<input id="mobile_number" type="tel" class="form-control @error('mobile') is-invalid @enderror" name="mobile" value="{{ old('mobile') }}" autocomplete="tel" placeholder="Phone number">
|
||||||
|
</div>
|
||||||
|
@error('mobile')
|
||||||
|
<div class="invalid-feedback d-block">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
@error('mobile_code')
|
||||||
|
<div class="invalid-feedback d-block">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="gender" class="form-label">Gender</label>
|
||||||
|
<select class="form-select @error('gender') is-invalid @enderror" id="gender" name="gender" required>
|
||||||
|
<option value="">Select Gender</option>
|
||||||
|
<option value="m" {{ old('gender') == 'm' ? 'selected' : '' }}>Male</option>
|
||||||
|
<option value="f" {{ old('gender') == 'f' ? 'selected' : '' }}>Female</option>
|
||||||
|
</select>
|
||||||
|
@error('gender')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="birthdate" class="form-label">Birthdate</label>
|
||||||
|
<input type="date" class="form-control @error('birthdate') is-invalid @enderror" id="birthdate" name="birthdate" value="{{ old('birthdate') }}" required>
|
||||||
|
@error('birthdate')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="blood_type" class="form-label">Blood Type</label>
|
||||||
|
<select class="form-select @error('blood_type') is-invalid @enderror" id="blood_type" name="blood_type">
|
||||||
|
<option value="">Select Blood Type</option>
|
||||||
|
<option value="A+" {{ old('blood_type') == 'A+' ? 'selected' : '' }}>A+</option>
|
||||||
|
<option value="A-" {{ old('blood_type') == 'A-' ? 'selected' : '' }}>A-</option>
|
||||||
|
<option value="B+" {{ old('blood_type') == 'B+' ? 'selected' : '' }}>B+</option>
|
||||||
|
<option value="B-" {{ old('blood_type') == 'B-' ? 'selected' : '' }}>B-</option>
|
||||||
|
<option value="AB+" {{ old('blood_type') == 'AB+' ? 'selected' : '' }}>AB+</option>
|
||||||
|
<option value="AB-" {{ old('blood_type') == 'AB-' ? 'selected' : '' }}>AB-</option>
|
||||||
|
<option value="O+" {{ old('blood_type') == 'O+' ? 'selected' : '' }}>O+</option>
|
||||||
|
<option value="O-" {{ old('blood_type') == 'O-' ? 'selected' : '' }}>O-</option>
|
||||||
|
<option value="Unknown" {{ old('blood_type') == 'Unknown' ? 'selected' : '' }}>Unknown</option>
|
||||||
|
</select>
|
||||||
|
@error('blood_type')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<x-country-dropdown
|
||||||
|
name="nationality"
|
||||||
|
id="nationality"
|
||||||
|
:value="old('nationality')"
|
||||||
|
:required="true"
|
||||||
|
:error="$errors->first('nationality')" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<h5 class="form-label d-flex justify-content-between align-items-center">
|
||||||
|
Social Media Links
|
||||||
|
<button type="button" class="btn btn-outline-primary btn-sm" id="addSocialLink">
|
||||||
|
<i class="bi bi-plus"></i> Add Link
|
||||||
|
</button>
|
||||||
|
</h5>
|
||||||
|
<div id="socialLinksContainer">
|
||||||
|
@php
|
||||||
|
$existingLinks = old('social_links', []);
|
||||||
|
if (!is_array($existingLinks)) {
|
||||||
|
$existingLinks = [];
|
||||||
|
}
|
||||||
|
// Convert associative array to array of arrays for form display
|
||||||
|
$formLinks = [];
|
||||||
|
foreach ($existingLinks as $platform => $url) {
|
||||||
|
$formLinks[] = ['platform' => $platform, 'url' => $url];
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
@foreach($formLinks as $index => $link)
|
||||||
|
<div class="social-link-row mb-3 d-flex align-items-end">
|
||||||
|
<div class="me-2 flex-grow-1">
|
||||||
|
<label class="form-label">Platform</label>
|
||||||
|
<select class="form-select platform-select" name="social_links[{{ $index }}][platform]" required>
|
||||||
|
<option value="">Select Platform</option>
|
||||||
|
<option value="facebook" {{ ($link['platform'] ?? '') == 'facebook' ? 'selected' : '' }}>Facebook</option>
|
||||||
|
<option value="twitter" {{ ($link['platform'] ?? '') == 'twitter' ? 'selected' : '' }}>Twitter/X</option>
|
||||||
|
<option value="instagram" {{ ($link['platform'] ?? '') == 'instagram' ? 'selected' : '' }}>Instagram</option>
|
||||||
|
<option value="linkedin" {{ ($link['platform'] ?? '') == 'linkedin' ? 'selected' : '' }}>LinkedIn</option>
|
||||||
|
<option value="youtube" {{ ($link['platform'] ?? '') == 'youtube' ? 'selected' : '' }}>YouTube</option>
|
||||||
|
<option value="tiktok" {{ ($link['platform'] ?? '') == 'tiktok' ? 'selected' : '' }}>TikTok</option>
|
||||||
|
<option value="snapchat" {{ ($link['platform'] ?? '') == 'snapchat' ? 'selected' : '' }}>Snapchat</option>
|
||||||
|
<option value="whatsapp" {{ ($link['platform'] ?? '') == 'whatsapp' ? 'selected' : '' }}>WhatsApp</option>
|
||||||
|
<option value="telegram" {{ ($link['platform'] ?? '') == 'telegram' ? 'selected' : '' }}>Telegram</option>
|
||||||
|
<option value="discord" {{ ($link['platform'] ?? '') == 'discord' ? 'selected' : '' }}>Discord</option>
|
||||||
|
<option value="reddit" {{ ($link['platform'] ?? '') == 'reddit' ? 'selected' : '' }}>Reddit</option>
|
||||||
|
<option value="pinterest" {{ ($link['platform'] ?? '') == 'pinterest' ? 'selected' : '' }}>Pinterest</option>
|
||||||
|
<option value="twitch" {{ ($link['platform'] ?? '') == 'twitch' ? 'selected' : '' }}>Twitch</option>
|
||||||
|
<option value="github" {{ ($link['platform'] ?? '') == 'github' ? 'selected' : '' }}>GitHub</option>
|
||||||
|
<option value="spotify" {{ ($link['platform'] ?? '') == 'spotify' ? 'selected' : '' }}>Spotify</option>
|
||||||
|
<option value="skype" {{ ($link['platform'] ?? '') == 'skype' ? 'selected' : '' }}>Skype</option>
|
||||||
|
<option value="slack" {{ ($link['platform'] ?? '') == 'slack' ? 'selected' : '' }}>Slack</option>
|
||||||
|
<option value="medium" {{ ($link['platform'] ?? '') == 'medium' ? 'selected' : '' }}>Medium</option>
|
||||||
|
<option value="vimeo" {{ ($link['platform'] ?? '') == 'vimeo' ? 'selected' : '' }}>Vimeo</option>
|
||||||
|
<option value="messenger" {{ ($link['platform'] ?? '') == 'messenger' ? 'selected' : '' }}>Messenger</option>
|
||||||
|
<option value="wechat" {{ ($link['platform'] ?? '') == 'wechat' ? 'selected' : '' }}>WeChat</option>
|
||||||
|
<option value="line" {{ ($link['platform'] ?? '') == 'line' ? 'selected' : '' }}>Line</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="me-2 flex-grow-1">
|
||||||
|
<label class="form-label">URL</label>
|
||||||
|
<input type="url" class="form-control" name="social_links[{{ $index }}][url]" value="{{ $link['url'] ?? '' }}" placeholder="https://example.com/username" required>
|
||||||
|
</div>
|
||||||
|
<div class="mb-0">
|
||||||
|
<button type="button" class="btn btn-outline-danger btn-sm remove-social-link">
|
||||||
|
<i class="bi bi-trash"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="motto" class="form-label">Personal Motto</label>
|
||||||
|
<textarea class="form-control @error('motto') is-invalid @enderror" id="motto" name="motto" rows="3" placeholder="Enter personal motto or quote...">{{ old('motto') }}</textarea>
|
||||||
|
<div class="form-text">Share a personal motto or quote that inspires them.</div>
|
||||||
|
@error('motto')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="relationship_type" class="form-label">Relationship</label>
|
||||||
|
<select class="form-select @error('relationship_type') is-invalid @enderror" id="relationship_type" name="relationship_type" required>
|
||||||
|
<option value="">Select Relationship</option>
|
||||||
|
<option value="son" {{ old('relationship_type') == 'son' ? 'selected' : '' }}>Son</option>
|
||||||
|
<option value="daughter" {{ old('relationship_type') == 'daughter' ? 'selected' : '' }}>Daughter</option>
|
||||||
|
<option value="spouse" {{ old('relationship_type') == 'spouse' ? 'selected' : '' }}>Wife</option>
|
||||||
|
<option value="sponsor" {{ old('relationship_type') == 'sponsor' ? 'selected' : '' }}>Sponsor</option>
|
||||||
|
<option value="other" {{ old('relationship_type') == 'other' ? 'selected' : '' }}>Other</option>
|
||||||
|
</select>
|
||||||
|
@error('relationship_type')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3 form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="is_billing_contact" name="is_billing_contact" value="1" {{ old('is_billing_contact') ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="is_billing_contact">Is Billing Contact</label>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||||
|
<button type="submit" form="addFamilyMemberForm" class="btn btn-primary">Add Family Member</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.border-dashed {
|
.border-dashed {
|
||||||
border-style: dashed !important;
|
border-style: dashed !important;
|
||||||
@ -395,6 +598,16 @@
|
|||||||
color: #0d6efd;
|
color: #0d6efd;
|
||||||
transition: color 0.3s ease-in-out;
|
transition: color 0.3s ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Fix Select2 dropdown in modal */
|
||||||
|
.select2-container--open {
|
||||||
|
z-index: 1060;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fix custom dropdown in modal */
|
||||||
|
.dropdown-menu {
|
||||||
|
z-index: 1060;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -422,6 +635,191 @@
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch(error => console.error('Error loading countries:', error));
|
.catch(error => console.error('Error loading countries:', error));
|
||||||
|
|
||||||
|
// Social links script for modal
|
||||||
|
let socialLinkIndex = 0;
|
||||||
|
|
||||||
|
// Add new social link row
|
||||||
|
document.addEventListener('click', function(e) {
|
||||||
|
if (e.target && e.target.id === 'addSocialLink') {
|
||||||
|
addSocialLinkRow();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Remove social link row
|
||||||
|
document.addEventListener('click', function(e) {
|
||||||
|
if (e.target.classList.contains('remove-social-link') || e.target.closest('.remove-social-link')) {
|
||||||
|
e.target.closest('.social-link-row').remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function addSocialLinkRow(platform = '', url = '') {
|
||||||
|
const container = document.getElementById('socialLinksContainer');
|
||||||
|
if (!container) return;
|
||||||
|
const row = document.createElement('div');
|
||||||
|
row.className = 'social-link-row mb-3 d-flex align-items-end';
|
||||||
|
|
||||||
|
row.innerHTML = `
|
||||||
|
<div class="me-2 flex-grow-1">
|
||||||
|
<label class="form-label">Platform</label>
|
||||||
|
<select class="form-select platform-select" name="social_links[${socialLinkIndex}][platform]" required>
|
||||||
|
<option value="">Select Platform</option>
|
||||||
|
<option value="facebook" ${platform === 'facebook' ? 'selected' : ''}>Facebook</option>
|
||||||
|
<option value="twitter" ${platform === 'twitter' ? 'selected' : ''}>Twitter/X</option>
|
||||||
|
<option value="instagram" ${platform === 'instagram' ? 'selected' : ''}>Instagram</option>
|
||||||
|
<option value="linkedin" ${platform === 'linkedin' ? 'selected' : ''}>LinkedIn</option>
|
||||||
|
<option value="youtube" ${platform === 'youtube' ? 'selected' : ''}>YouTube</option>
|
||||||
|
<option value="tiktok" ${platform === 'tiktok' ? 'selected' : ''}>TikTok</option>
|
||||||
|
<option value="snapchat" ${platform === 'snapchat' ? 'selected' : ''}>Snapchat</option>
|
||||||
|
<option value="whatsapp" ${platform === 'whatsapp' ? 'selected' : ''}>WhatsApp</option>
|
||||||
|
<option value="telegram" ${platform === 'telegram' ? 'selected' : ''}>Telegram</option>
|
||||||
|
<option value="discord" ${platform === 'discord' ? 'selected' : ''}>Discord</option>
|
||||||
|
<option value="reddit" ${platform === 'reddit' ? 'selected' : ''}>Reddit</option>
|
||||||
|
<option value="pinterest" ${platform === 'pinterest' ? 'selected' : ''}>Pinterest</option>
|
||||||
|
<option value="twitch" ${platform === 'twitch' ? 'selected' : ''}>Twitch</option>
|
||||||
|
<option value="github" ${platform === 'github' ? 'selected' : ''}>GitHub</option>
|
||||||
|
<option value="spotify" ${platform === 'spotify' ? 'selected' : ''}>Spotify</option>
|
||||||
|
<option value="skype" ${platform === 'skype' ? 'selected' : ''}>Skype</option>
|
||||||
|
<option value="slack" ${platform === 'slack' ? 'selected' : ''}>Slack</option>
|
||||||
|
<option value="medium" ${platform === 'medium' ? 'selected' : ''}>Medium</option>
|
||||||
|
<option value="vimeo" ${platform === 'vimeo' ? 'selected' : ''}>Vimeo</option>
|
||||||
|
<option value="messenger" ${platform === 'messenger' ? 'selected' : ''}>Messenger</option>
|
||||||
|
<option value="wechat" ${platform === 'wechat' ? 'selected' : ''}>WeChat</option>
|
||||||
|
<option value="line" ${platform === 'line' ? 'selected' : ''}>Line</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="me-2 flex-grow-1">
|
||||||
|
<label class="form-label">URL</label>
|
||||||
|
<input type="url" class="form-control" name="social_links[${socialLinkIndex}][url]" value="${url}" placeholder="https://example.com/username" required>
|
||||||
|
</div>
|
||||||
|
<div class="mb-0">
|
||||||
|
<button type="button" class="btn btn-outline-danger btn-sm remove-social-link">
|
||||||
|
<i class="bi bi-trash"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
container.appendChild(row);
|
||||||
|
socialLinkIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mobile dropdown script for modal
|
||||||
|
fetch('/data/countries.json')
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(countries => {
|
||||||
|
const listElement = document.getElementById('country_codeList');
|
||||||
|
const selectedFlag = document.getElementById('country_codeSelectedFlag');
|
||||||
|
const selectedCountry = document.getElementById('country_codeSelectedCountry');
|
||||||
|
const hiddenInput = document.getElementById('country_code');
|
||||||
|
const searchInput = document.getElementById('country_codeSearch');
|
||||||
|
|
||||||
|
if (!listElement) return;
|
||||||
|
|
||||||
|
// Populate dropdown
|
||||||
|
countries.forEach(country => {
|
||||||
|
const button = document.createElement('button');
|
||||||
|
button.className = 'dropdown-item d-flex align-items-center';
|
||||||
|
button.type = 'button';
|
||||||
|
button.setAttribute('data-country-code', country.call_code);
|
||||||
|
button.setAttribute('data-country-name', country.name);
|
||||||
|
button.setAttribute('data-flag-code', country.flag);
|
||||||
|
button.setAttribute('data-search', `${country.name.toLowerCase()} ${country.call_code}`);
|
||||||
|
button.innerHTML = `<span class="fi fi-${country.flag.toLowerCase()} me-2"></span><span>${country.name} (${country.call_code})</span>`;
|
||||||
|
button.addEventListener('click', function() {
|
||||||
|
const code = this.getAttribute('data-country-code');
|
||||||
|
const flag = this.getAttribute('data-flag-code');
|
||||||
|
const name = this.getAttribute('data-country-name');
|
||||||
|
if (selectedFlag) selectedFlag.className = `fi fi-${flag.toLowerCase()} me-2`;
|
||||||
|
if (selectedCountry) selectedCountry.textContent = code;
|
||||||
|
if (hiddenInput) hiddenInput.value = code;
|
||||||
|
// Close dropdown
|
||||||
|
const dropdown = bootstrap.Dropdown.getInstance(document.getElementById('country_codeDropdown'));
|
||||||
|
if (dropdown) dropdown.hide();
|
||||||
|
});
|
||||||
|
listElement.appendChild(button);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set initial value
|
||||||
|
const initialValue = '{{ old('mobile_code', '+973') }}';
|
||||||
|
if (initialValue && selectedCountry && hiddenInput) {
|
||||||
|
hiddenInput.value = initialValue;
|
||||||
|
selectedCountry.textContent = initialValue;
|
||||||
|
const country = countries.find(c => c.call_code === initialValue);
|
||||||
|
if (country && selectedFlag) {
|
||||||
|
selectedFlag.className = `fi fi-${country.flag.toLowerCase()} me-2`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search functionality
|
||||||
|
if (searchInput) {
|
||||||
|
searchInput.addEventListener('input', function() {
|
||||||
|
const searchTerm = this.value.toLowerCase();
|
||||||
|
const items = listElement.querySelectorAll('.dropdown-item');
|
||||||
|
items.forEach(item => {
|
||||||
|
const searchData = item.getAttribute('data-search');
|
||||||
|
if (searchData.includes(searchTerm)) {
|
||||||
|
item.classList.remove('d-none');
|
||||||
|
} else {
|
||||||
|
item.classList.add('d-none');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => console.error('Error loading countries for mobile:', error));
|
||||||
|
|
||||||
|
// Initialize nationality dropdown when modal is shown
|
||||||
|
$('#addFamilyMemberModal').on('shown.bs.modal', function () {
|
||||||
|
const selectElement = document.getElementById('nationality');
|
||||||
|
if (selectElement && !$(selectElement).hasClass('select2-hidden-accessible')) {
|
||||||
|
// Load countries and initialize Select2
|
||||||
|
fetch('/data/countries.json')
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(countries => {
|
||||||
|
// Clear existing options except the first one
|
||||||
|
while (selectElement.options.length > 1) {
|
||||||
|
selectElement.remove(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate dropdown
|
||||||
|
countries.forEach(country => {
|
||||||
|
const option = document.createElement('option');
|
||||||
|
option.value = country.iso3;
|
||||||
|
option.textContent = country.name;
|
||||||
|
option.setAttribute('data-flag', country.flag);
|
||||||
|
selectElement.appendChild(option);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set initial value if provided
|
||||||
|
const initialValue = '{{ old('nationality') }}';
|
||||||
|
if (initialValue) {
|
||||||
|
selectElement.value = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize Select2
|
||||||
|
$(selectElement).select2({
|
||||||
|
templateResult: function(state) {
|
||||||
|
if (!state.id) {
|
||||||
|
return state.text;
|
||||||
|
}
|
||||||
|
const option = $(state.element);
|
||||||
|
const flagCode = option.data('flag');
|
||||||
|
return $(`<span><span class="fi fi-${flagCode} me-2"></span>${state.text}</span>`);
|
||||||
|
},
|
||||||
|
templateSelection: function(state) {
|
||||||
|
if (!state.id) {
|
||||||
|
return state.text;
|
||||||
|
}
|
||||||
|
const option = $(state.element);
|
||||||
|
const flagCode = option.data('flag');
|
||||||
|
return $(`<span><span class="fi fi-${flagCode} me-2"></span>${state.text}</span>`);
|
||||||
|
},
|
||||||
|
width: '100%'
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => console.error('Error loading countries:', error));
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@ -8,12 +8,33 @@
|
|||||||
<h2 class="fw-bold mb-1">Member Profile</h2>
|
<h2 class="fw-bold mb-1">Member Profile</h2>
|
||||||
<p class="text-muted mb-0">Comprehensive member information and analytics</p>
|
<p class="text-muted mb-0">Comprehensive member information and analytics</p>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Profile Card -->
|
||||||
|
<div class="card shadow-sm border-0 mb-4">
|
||||||
|
<div class="d-flex">
|
||||||
|
<!-- Profile Picture -->
|
||||||
|
<div style="width: 180px; min-height: 250px; border-radius: 0.375rem 0 0 0.375rem;">
|
||||||
|
@if($relationship->dependent->media_gallery[0] ?? false)
|
||||||
|
<img src="{{ $relationship->dependent->media_gallery[0] }}" alt="{{ $relationship->dependent->full_name }}" class="w-100 h-100" style="object-fit: cover; border-radius: 0.375rem 0 0 0.375rem;">
|
||||||
|
@else
|
||||||
|
<div class="w-100 h-100 d-flex align-items-center justify-content-center text-white fw-bold" style="font-size: 3rem; background: linear-gradient(135deg, {{ $relationship->dependent->gender == 'm' ? '#0d6efd 0%, #0a58ca 100%' : '#d63384 0%, #a61e4d 100%' }}); border-radius: 0.375rem 0 0 0.375rem;">
|
||||||
|
{{ strtoupper(substr($relationship->dependent->full_name, 0, 1)) }}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Profile Info -->
|
||||||
|
<div class="flex-grow-1 p-4">
|
||||||
|
<div class="d-flex justify-content-between align-items-start mb-2">
|
||||||
|
<h3 class="fw-bold mb-0">{{ $relationship->dependent->full_name }}</h3>
|
||||||
|
@if($relationship->relationship_type == 'self' || Auth::id() == $relationship->guardian_user_id)
|
||||||
<div>
|
<div>
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<button class="btn btn-primary rounded-pill dropdown-toggle" type="button" id="actionDropdown" data-bs-toggle="dropdown" aria-expanded="false">
|
<button class="btn btn-primary rounded-pill dropdown-toggle" type="button" id="actionDropdown" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
<i class="bi bi-lightning me-1"></i>Action
|
<i class="bi bi-lightning me-1"></i>Action
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu" aria-labelledby="actionDropdown">
|
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="actionDropdown">
|
||||||
<li><a class="dropdown-item" href="@if($relationship->relationship_type == 'self'){{ route('profile.edit') }}@else{{ route('family.edit', $relationship->dependent->id) }}@endif">
|
<li><a class="dropdown-item" href="@if($relationship->relationship_type == 'self'){{ route('profile.edit') }}@else{{ route('family.edit', $relationship->dependent->id) }}@endif">
|
||||||
<i class="bi bi-pencil me-2"></i>Edit Info
|
<i class="bi bi-pencil me-2"></i>Edit Info
|
||||||
</a></li>
|
</a></li>
|
||||||
@ -26,29 +47,11 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Profile Card -->
|
|
||||||
<div class="card shadow-sm border-0 mb-4 overflow-hidden">
|
|
||||||
<div class="d-flex">
|
|
||||||
<!-- Profile Picture -->
|
|
||||||
<div style="width: 180px; min-height: 250px;">
|
|
||||||
@if($relationship->dependent->media_gallery[0] ?? false)
|
|
||||||
<img src="{{ $relationship->dependent->media_gallery[0] }}" alt="{{ $relationship->dependent->full_name }}" class="w-100 h-100" style="object-fit: cover;">
|
|
||||||
@else
|
@else
|
||||||
<div class="w-100 h-100 d-flex align-items-center justify-content-center text-white fw-bold" style="font-size: 3rem; background: linear-gradient(135deg, {{ $relationship->dependent->gender == 'm' ? '#0d6efd 0%, #0a58ca 100%' : '#d63384 0%, #a61e4d 100%' }});">
|
|
||||||
{{ strtoupper(substr($relationship->dependent->full_name, 0, 1)) }}
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Profile Info -->
|
|
||||||
<div class="flex-grow-1 p-4">
|
|
||||||
<div class="d-flex justify-content-between align-items-start mb-2">
|
|
||||||
<h3 class="fw-bold mb-0">{{ $relationship->dependent->full_name }}</h3>
|
|
||||||
<button class="btn btn-primary btn-sm rounded-pill">
|
<button class="btn btn-primary btn-sm rounded-pill">
|
||||||
<i class="bi bi-person-plus me-1"></i>Follow
|
<i class="bi bi-person-plus me-1"></i>Follow
|
||||||
</button>
|
</button>
|
||||||
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@if($relationship->dependent->motto)
|
@if($relationship->dependent->motto)
|
||||||
<p class="text-muted fst-italic mb-3">"{{ $relationship->dependent->motto }}"</p>
|
<p class="text-muted fst-italic mb-3">"{{ $relationship->dependent->motto }}"</p>
|
||||||
|
|||||||
@ -178,15 +178,15 @@
|
|||||||
border-color: hsl(var(--primary-hover));
|
border-color: hsl(var(--primary-hover));
|
||||||
}
|
}
|
||||||
.user-avatar {
|
.user-avatar {
|
||||||
width: 32px;
|
width: 40px;
|
||||||
height: 32px;
|
height: 40px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
.user-avatar-placeholder {
|
.user-avatar-placeholder {
|
||||||
width: 32px;
|
width: 40px;
|
||||||
height: 32px;
|
height: 40px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background-color: hsl(var(--primary));
|
background-color: hsl(var(--primary));
|
||||||
color: hsl(var(--primary-foreground));
|
color: hsl(var(--primary-foreground));
|
||||||
@ -196,6 +196,23 @@
|
|||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
.avatar-container {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.online-indicator {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -2px;
|
||||||
|
right: -2px;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
background-color: #28a745;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 2px solid white;
|
||||||
|
}
|
||||||
|
.dropdown-toggle::after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
.dropdown-toggle {
|
.dropdown-toggle {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -205,10 +222,13 @@
|
|||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
margin: 0 0.25rem;
|
margin: 0 0.25rem;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
transition: background-color 0.2s;
|
transition: transform 0.2s;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
}
|
}
|
||||||
.nav-icon-btn:hover {
|
.nav-icon-btn:hover {
|
||||||
background-color: #f8f9fa;
|
transform: scale(1.1);
|
||||||
}
|
}
|
||||||
.notification-badge {
|
.notification-badge {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -234,15 +254,21 @@
|
|||||||
padding: 0.75rem 1rem;
|
padding: 0.75rem 1rem;
|
||||||
border-bottom: 1px solid hsl(var(--border));
|
border-bottom: 1px solid hsl(var(--border));
|
||||||
transition: background-color 0.2s;
|
transition: background-color 0.2s;
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: white;
|
||||||
}
|
}
|
||||||
.notification-item:hover {
|
.notification-item:hover {
|
||||||
background-color: hsl(var(--muted));
|
background-color: hsl(var(--primary)) !important;
|
||||||
|
color: hsl(var(--primary-foreground)) !important;
|
||||||
|
}
|
||||||
|
.notification-item:hover .text-muted {
|
||||||
|
color: hsl(var(--primary-foreground)) !important;
|
||||||
}
|
}
|
||||||
.notification-item:last-child {
|
.notification-item:last-child {
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
.notification-item.unread {
|
.notification-item.unread {
|
||||||
background-color: hsl(var(--accent));
|
background-color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-item:hover {
|
.dropdown-item:hover {
|
||||||
@ -330,27 +356,15 @@
|
|||||||
<small class="text-muted">2d</small>
|
<small class="text-muted">2d</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown-divider"></div>
|
|
||||||
<a class="dropdown-item text-center small" href="#">View All Notifications</a>
|
<a class="dropdown-item text-center small" href="#">View All Notifications</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@endauth
|
@endauth
|
||||||
|
|
||||||
@guest
|
@auth
|
||||||
@if (Route::has('login'))
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if (Route::has('register'))
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
@else
|
|
||||||
<li class="nav-item dropdown">
|
<li class="nav-item dropdown">
|
||||||
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
|
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
|
||||||
|
<div class="avatar-container">
|
||||||
@if(Auth::user()->profile_picture)
|
@if(Auth::user()->profile_picture)
|
||||||
<img src="{{ asset('storage/' . Auth::user()->profile_picture) }}" alt="{{ Auth::user()->full_name }}" class="user-avatar">
|
<img src="{{ asset('storage/' . Auth::user()->profile_picture) }}" alt="{{ Auth::user()->full_name }}" class="user-avatar">
|
||||||
@else
|
@else
|
||||||
@ -358,6 +372,8 @@
|
|||||||
{{ strtoupper(substr(Auth::user()->full_name, 0, 1)) }}
|
{{ strtoupper(substr(Auth::user()->full_name, 0, 1)) }}
|
||||||
</span>
|
</span>
|
||||||
@endif
|
@endif
|
||||||
|
<span class="online-indicator"></span>
|
||||||
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
|
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user