File: /home/workzeni/stream-flix.workzenix.com/resources/views/admin/pages/languages/index.blade.php
@extends('admin.index')
@section('title', 'Language')
@section('style')
<!-- Languages Page Specific Styles -->
<style>
.languages-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: var(--spacing-xl);
}
.language-card {
background: var(--glass-bg);
backdrop-filter: blur(20px);
border: 1px solid var(--glass-border);
border-radius: var(--border-radius-lg);
padding: var(--spacing-xl);
transition: var(--transition-fast);
position: relative;
}
.language-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg);
}
.language-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--spacing-lg);
}
.language-flag {
width: 50px;
height: 50px;
border-radius: 50%;
background: var(--glass-bg);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
border: 2px solid var(--glass-border);
}
.language-actions {
display: flex;
gap: var(--spacing-sm);
opacity: 0;
transition: var(--transition-fast);
}
.language-card:hover .language-actions {
opacity: 1;
}
.language-content {
margin-bottom: var(--spacing-lg);
}
.language-name {
font-size: 1.3rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: var(--spacing-xs);
}
.language-native {
font-size: 1rem;
color: var(--text-secondary);
margin-bottom: var(--spacing-sm);
}
.language-code {
font-size: 0.8rem;
color: var(--text-muted);
font-family: 'Courier New', monospace;
background: rgba(255, 255, 255, 0.05);
padding: 2px 6px;
border-radius: 4px;
display: inline-block;
margin-bottom: var(--spacing-lg);
}
.language-features {
display: flex;
gap: var(--spacing-sm);
margin-bottom: var(--spacing-lg);
}
.feature-badge {
display: flex;
align-items: center;
gap: var(--spacing-xs);
font-size: 0.75rem;
padding: 4px 8px;
border-radius: var(--border-radius-sm);
font-weight: 500;
}
.feature-badge.audio {
background: rgba(102, 126, 234, 0.2);
color: #667eea;
border: 1px solid rgba(102, 126, 234, 0.3);
}
.feature-badge.subtitles {
background: rgba(16, 185, 129, 0.2);
color: #10b981;
border: 1px solid rgba(16, 185, 129, 0.3);
}
.language-stats {
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
}
.stat-row {
display: flex;
justify-content: space-between;
align-items: center;
}
.stat-label {
font-size: 0.9rem;
color: var(--text-muted);
}
.stat-value {
font-size: 0.9rem;
font-weight: 500;
color: var(--text-primary);
}
.language-footer {
display: flex;
justify-content: space-between;
align-items: center;
}
.primary-badge {
background: var(--gradient-accent);
color: white;
font-size: 0.7rem;
font-weight: 500;
padding: 2px 8px;
border-radius: 10px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
@media (max-width: 768px) {
.languages-grid {
grid-template-columns: 1fr;
gap: var(--spacing-lg);
}
.language-card {
padding: var(--spacing-lg);
}
}
</style>
@endsection
@section('content')
<div class="content-area">
<!-- Page Actions -->
<div class="d-flex justify-content-between align-items-center mb-xl">
<div>
<h2 style="color: var(--text-primary); margin: 0;">Supported Languages</h2>
<p style="color: var(--text-muted); margin: 0;">Manage audio and subtitle languages for your content</p>
</div>
<div class="d-flex gap-md">
<button class="btn btn-outline">
<i class="fas fa-download"></i>
Export
</button>
<a class="btn btn-primary" href="{{ route('language.create') }}">
<i class="fas fa-plus"></i>
Add Language
</a>
</div>
</div>
<!-- Language Stats -->
<div
style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--spacing-lg); margin-bottom: var(--spacing-xl);">
<div class="stat-card">
<div class="stat-header">
<div class="stat-icon" style="background: var(--gradient-primary);">
<i class="fas fa-globe"></i>
</div>
<div class="stat-trend up">
<i class="fas fa-arrow-up"></i>
15%
</div>
</div>
<div class="stat-value">12</div>
<div class="stat-label">Total Languages</div>
<div class="stat-description">Supported languages</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div class="stat-icon" style="background: var(--gradient-success);">
<i class="fas fa-volume-up"></i>
</div>
<div class="stat-trend up">
<i class="fas fa-arrow-up"></i>
8%
</div>
</div>
<div class="stat-value">8</div>
<div class="stat-label">Audio Languages</div>
<div class="stat-description">Dubbing available</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div class="stat-icon" style="background: var(--gradient-accent);">
<i class="fas fa-closed-captioning"></i>
</div>
<div class="stat-trend up">
<i class="fas fa-arrow-up"></i>
12%
</div>
</div>
<div class="stat-value">12</div>
<div class="stat-label">Subtitle Languages</div>
<div class="stat-description">Captions available</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div class="stat-icon" style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);">
<i class="fas fa-star"></i>
</div>
<div class="stat-trend">
<i class="fas fa-minus"></i>
0%
</div>
</div>
<div class="stat-value">3</div>
<div class="stat-label">Primary Languages</div>
<div class="stat-description">Most popular</div>
</div>
</div>
<!-- Languages Grid -->
<div class="languages-grid">
<!-- English -->
@foreach ($languages as $language)
<div class="language-card" data-language="{{ $language->code }}">
<div class="language-header">
<div class="language-flag">
<span class="flag-emoji">
{{ $language->code }}
</span>
</div>
<div class="language-actions">
<a href="{{ route('language.edit', $language->id) }}" class="btn btn-sm btn-ghost">
<i class="fas fa-edit"></i>
</a>
{{-- Toggle status link --}}
<form action="{{ route('language.toggleStatus', $language->id) }}" method="POST"
style="display:inline;">
@csrf
@method('PATCH')
<button type="submit" class="btn btn-sm btn-ghost">
<i
class="fas {{ $language->status == 'active' ? 'fa-toggle-on' : 'fa-toggle-off' }}"></i>
</button>
</form>
</div>
</div>
<div class="language-content">
<h3 class="language-name">{{ $language->name }}</h3>
<p class="language-native">{{ $language->nativeName }}</p>
<div class="language-code">{{ $language->code }}</div>
{{-- Optional stats --}}
{{-- <div class="language-stats">
<div class="stat-row">
<span class="stat-label">Movies:</span>
<span class="stat-value">{{ $language->movies_count ?? 0 }}</span>
</div>
<div class="stat-row">
<span class="stat-label">Usage:</span>
<span class="stat-value">{{ $language->usage_percent ?? 0 }}%</span>
</div>
</div> --}}
</div>
<div class="language-footer">
<span class="badge {{ $language->status == 'active' ? 'badge-success' : 'badge-warning' }}">
{{ ucfirst($language->status) }}
</span>
</div>
</div>
@endforeach
</div>
</div>
<!-- Add Language Modal -->
<div class="modal-overlay" id="addLanguageModal">
<div class="modal" style="max-width: 500px;">
<div class="modal-header">
<h3 class="modal-title">Add New Language</h3>
<button class="modal-close">
<i class="fas fa-times"></i>
</button>
</div>
<div class="modal-body">
<form data-form="add-language">
<div class="form-group">
<label class="form-label">Language Name (English) *</label>
<input type="text" class="form-control" name="name" placeholder="e.g., Korean" required>
</div>
<div class="form-group">
<label class="form-label">Native Name *</label>
<input type="text" class="form-control" name="nativeName" placeholder="e.g., 한국어" required>
</div>
<div class="form-group">
<label class="form-label">Language Code *</label>
<input type="text" class="form-control" name="code" placeholder="e.g., KR" required>
</div>
<div class="form-group">
<label class="form-label">Status</label>
<select class="form-control" name="status">
<option value="active">Active</option>
<option value="inactive">Inactive</option>
</select>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline modal-close">Cancel</button>
<button type="submit" class="btn btn-primary" form="addLanguageForm">
<i class="fas fa-save"></i>
Add Language
</button>
</div>
</div>
</div>
<!-- Edit Language Modal -->
<div class="modal-overlay" id="editLanguageModal">
<div class="modal" style="max-width: 500px;">
<div class="modal-header">
<h3 class="modal-title">Edit Language</h3>
<button class="modal-close">
<i class="fas fa-times"></i>
</button>
</div>
<div class="modal-body">
<form data-form="edit-language">
<input type="hidden" name="id">
<div class="form-group">
<label class="form-label">Language Name (English) *</label>
<input type="text" class="form-control" name="name" placeholder="e.g., Korean" required>
</div>
<div class="form-group">
<label class="form-label">Native Name *</label>
<input type="text" class="form-control" name="nativeName" placeholder="e.g., 한국어" required>
</div>
<div class="form-group">
<label class="form-label">Language Code *</label>
<input type="text" class="form-control" name="code" placeholder="e.g., ko-KR" required>
</div>
<div class="form-group">
<label class="form-label">Flag Emoji</label>
<input type="text" class="form-control" name="flag" placeholder="🇰🇷">
</div>
</div>
<div class="form-group">
<label class="form-label">Status</label>
<select class="form-control" name="status">
<option value="active">Active</option>
<option value="inactive">Inactive</option>
</select>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline modal-close">Cancel</button>
<button type="submit" class="btn btn-primary" form="editLanguageForm">
<i class="fas fa-save"></i>
Update Language
</button>
</div>
</div>
</div>
<!-- Languages Page Specific JavaScript -->
<script>
document.addEventListener("DOMContentLoaded", function() {
fetchLanguages();
// Fetch & render all languages
function fetchLanguages() {
$.ajax({
url: "{{ route('language.list') }}",
type: "GET",
success: function(data) {
let html = '';
data.forEach(lang => {
html += `
<div class="language-card" data-id="${lang.id}">
<div class="language-header">
<div class="language-flag">
<span class="flag-emoji">${lang.flag ?? '🏳️'}</span>
</div>
<div class="language-actions">
<button class="btn btn-sm btn-ghost edit-btn" data-id="${lang.id}">
<i class="fas fa-edit"></i>
</button>
<button class="btn btn-sm btn-ghost delete-btn" data-id="${lang.id}">
<i class="fas fa-trash"></i>
</button>
</div>
</div>
<div class="language-content">
<h3 class="language-name">${lang.name}</h3>
<p class="language-native">${lang.nativeName}</p>
<div class="language-code">${lang.code}</div>
</div>
<div class="language-footer">
<span class="badge ${lang.status === 'active' ? 'badge-success' : 'badge-warning'}">
${lang.status.charAt(0).toUpperCase() + lang.status.slice(1)}
</span>
</div>
</div>
`;
});
$(".languages-grid").html(html);
}
});
}
// Create new language (AJAX)
$(document).on("submit", "form[data-form='add-language']", function(e) {
e.preventDefault();
let formData = new FormData(this);
$.ajax({
url: "{{ route('language.store') }}",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(res) {
if (res.success) {
fetchLanguages();
$("#addLanguageModal").hide();
alert(res.message);
}
},
error: function(err) {
alert("Error: " + err.responseJSON.message);
}
});
});
// Delete language
$(document).on("click", ".delete-btn", function() {
const id = $(this).data("id");
if (!confirm("Are you sure to delete?")) return;
$.ajax({
url: `/language/delete/${id}`,
type: "DELETE",
data: {
_token: "{{ csrf_token() }}"
},
success: function(res) {
if (res.success) {
fetchLanguages();
alert(res.message);
}
}
});
});
// Edit (open modal)
$(document).on("click", ".edit-btn", function() {
const id = $(this).data("id");
$.get(`/language/list?id=${id}`, function(data) {
const lang = data.find(x => x.id == id);
const form = $("form[data-form='edit-language']");
form.find("input[name=id]").val(lang.id);
form.find("input[name=name]").val(lang.name);
form.find("input[name=nativeName]").val(lang.nativeName);
form.find("input[name=code]").val(lang.code);
form.find("select[name=status]").val(lang.status);
$("#editLanguageModal").show();
});
});
// Update (AJAX)
$(document).on("submit", "form[data-form='edit-language']", function(e) {
e.preventDefault();
const id = $(this).find("input[name=id]").val();
const formData = new FormData(this);
$.ajax({
url: `/language/update/${id}`,
type: "POST",
data: formData,
processData: false,
contentType: false,
headers: {
'X-HTTP-Method-Override': 'PUT'
},
success: function(res) {
if (res.success) {
fetchLanguages();
$("#editLanguageModal").hide();
alert(res.message);
}
},
error: function(err) {
alert("Error updating: " + err.responseJSON.message);
}
});
});
});
</script>
@endsection