{{-- ============================================================================ PAGE CONTENT — Teks Ucapan Site : nres · Page slug: speech · Page ID: auto (dicipta oleh apply-speech.php) Sumber: modul content-speech → content_speeches · Terjemahan self-referencing: baris INDUK (speech_parent_id NULL) + baris anak mengikut speech_parent_id (tajuk & fail boleh berbeza ikut bahasa) · Pecahan penyampai: speech_speaker_category (ref SPEECH_SPEAKER) MENTERI (YBM) · TIMBALAN_MENTERI (YBTM) · KETUA_SETIAUSAHA (KSU) · Kategori ucapan: speech_category (ref SPEECH_CATEGORY) — UCAPAN/PERASMIAN/MAJLIS/KENYATAAN · Dokumen: speech_file (PDF) · Imej: speech_img Parameter URL: penyampai MENTERI | TIMBALAN_MENTERI | KETUA_SETIAUSAHA (kosong = semua) tahun tahun ucapan (cth 2026) atau 'lain' q carian tajuk id speech_id → papar butiran Nota: · SEMUA logik + markup + CSS ada dalam fail ini — tiada komponen, tiada partial. · Warna guna CSS variable tema (--teal/--green/--fade/--line/--ink) → dark mode. ============================================================================ --}} @php /* -------------------------------------------------------------------- | 1. Parameter & konteks -------------------------------------------------------------------- */ $spBase = url(trim(((string) ($siteSlug ?? '')).'/speech', '/')); $spLang = ($lang ?? session('locale', 'ms')) === 'en' ? 'en' : 'ms'; $spToday = now()->toDateString(); // Senarai penyampai (ref SPEECH_SPEAKER) — susunan ikut ref.sort $spSpeakers = []; foreach (DB::table('ref')->where('cat', 'SPEECH_SPEAKER')->orderBy('sort')->get() as $spRef) { $spSpeakers[(string) $spRef->code] = $spLang === 'en' ? ((string) ($spRef->descr_en ?: $spRef->descr)) : ((string) $spRef->descr ?: $spRef->descr_en); } // Label kategori ucapan (ref SPEECH_CATEGORY) $spCategories = []; foreach (DB::table('ref')->where('cat', 'SPEECH_CATEGORY')->orderBy('sort')->get() as $spRef) { $spCategories[(string) $spRef->code] = $spLang === 'en' ? ((string) ($spRef->descr_en ?: $spRef->descr)) : ((string) $spRef->descr ?: $spRef->descr_en); } // Label ringkas untuk tab (YBM / YBTM / KSU) $spSpeakerShort = [ 'MENTERI' => 'YBM', 'TIMBALAN_MENTERI' => 'YBTM', 'KETUA_SETIAUSAHA' => 'KSU', ]; $spSpeakerLabel = function ($code) use ($spSpeakers, $spLang, $spSpeakerShort) { $code = (string) $code; if (isset($spSpeakers[$code])) { return $spSpeakers[$code]; } return $code !== '' ? $code : ($spLang === 'en' ? 'Not stated' : 'Tiada'); }; // Tab penyampai: label panjang untuk tab + kod $spTabLabel = function ($code) use ($spSpeakers, $spSpeakerShort, $spLang) { $code = (string) $code; if ($code === '') { return $spLang === 'en' ? 'All' : 'Semua'; } $name = $spSpeakers[$code] ?? $code; $short = $spSpeakerShort[$code] ?? null; if ($spLang === 'en') { return $short ? $name.' ('.$short.')' : $name; } // BM: "Menteri (YBM)" — tambah "Ucapan" di hadapan untuk kejelasan return ($spLang === 'en' ? '' : 'Ucapan ').($short ? $name.' ('.$short.')' : $name); }; $spPenyampai = strtoupper((string) request()->query('penyampai', '')); $spPenyampai = isset($spSpeakers[$spPenyampai]) ? $spPenyampai : ''; $spTahun = (string) request()->query('tahun', ''); $spTahun = ($spTahun === 'lain' || preg_match('/^\d{4}$/', $spTahun)) ? $spTahun : ''; $spCari = mb_substr(trim((string) request()->query('q', '')), 0, 60); $spId = (int) request()->query('id', 0); // Pagination: 20 ucapan setiap halaman $spPerPage = 20; $spPage = max(1, (int) request()->query('page', 1)); $spUrl = function (array $params = []) use ($spBase, $spPenyampai, $spTahun, $spCari, $spId, $spPage) { $current = ['penyampai' => $spPenyampai, 'tahun' => $spTahun, 'q' => $spCari, 'id' => $spId ?: null, 'page' => $spPage > 1 ? $spPage : null]; $query = array_filter(array_merge($current, $params), fn ($v) => $v !== null && $v !== ''); return $query ? $spBase.'?'.http_build_query($query) : $spBase; }; $spFile = function ($path) { $path = trim((string) $path); if ($path === '') { return ''; } if (str_starts_with($path, 'http://') || str_starts_with($path, 'https://')) { return $path; } if (str_starts_with($path, 'dynaweb4/')) { return asset($path); } return asset('storage/'.ltrim($path, '/')); }; $spDate = function ($value) use ($spLang) { if (blank($value)) { return ''; } $months = $spLang === 'en' ? [1 => 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] : [1 => 'Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember']; try { $date = \Carbon\Carbon::parse($value); return $date->day.' '.$months[(int) $date->month].' '.$date->year; } catch (\Throwable $e) { return (string) $value; } }; /* -------------------------------------------------------------------- | 2. Muat ucapan (induk + terjemahan) -------------------------------------------------------------------- */ $spRows = DB::table('content_speeches') ->whereIn('speech_status', ['PUBLISHED', 'ACTIVE']) ->where(function ($q) use ($spToday) { $q->whereNull('speech_start_date')->orWhere('speech_start_date', '')->orWhere('speech_start_date', '<=', $spToday); }) ->where(function ($q) use ($spToday) { $q->whereNull('speech_end_date')->orWhere('speech_end_date', '')->orWhere('speech_end_date', '>=', $spToday); }) ->orderByDesc('speech_date') ->orderByDesc('speech_id') ->get(); $spParents = $spRows->filter(fn ($r) => blank($r->speech_parent_id))->values(); $spChildren = $spRows->filter(fn ($r) => filled($r->speech_parent_id))->groupBy('speech_parent_id'); $spItems = []; foreach ($spParents as $spRow) { $spKids = $spChildren[$spRow->speech_id] ?? collect(); $spTr = $spKids->firstWhere('speech_language', $spLang); if (! $spTr || blank($spTr->speech_title)) { $spTr = $spRow; } $spFileRaw = (string) ($spTr->speech_file ?: $spRow->speech_file); $spItems[] = [ 'id' => (int) $spRow->speech_id, 'date' => (string) ($spRow->speech_date ?? ''), 'title' => (string) ($spTr->speech_title ?? ''), 'file' => $spFile($spFileRaw), 'file_name' => $spFileRaw !== '' ? basename($spFileRaw) : '', 'img' => $spFile($spRow->speech_img), 'speaker' => (string) ($spRow->speech_speaker ?? ''), 'position' => (string) ($spRow->speech_position ?? ''), 'speaker_cat' => (string) ($spRow->speech_speaker_category ?? ''), 'category' => (string) ($spRow->speech_category ?? ''), 'event' => (string) ($spRow->speech_event ?? ''), 'location' => (string) ($spRow->speech_location ?? ''), ]; } $spItems = array_values(array_filter($spItems, fn ($i) => $i['title'] !== '')); // Kiraan ikut penyampai (untuk tab) $spCounts = ['' => count($spItems)]; foreach (array_keys($spSpeakers) as $spCode) { $spCounts[$spCode] = count(array_filter($spItems, fn ($i) => $i['speaker_cat'] === $spCode)); } // Senarai ikut tab penyampai $spTabItems = $spPenyampai === '' ? $spItems : array_values(array_filter($spItems, fn ($i) => $i['speaker_cat'] === $spPenyampai)); /* -------------------------------------------------------------------- | 3. Tab tahun, carian & butiran -------------------------------------------------------------------- */ $spYears = []; $spUndated = 0; foreach ($spTabItems as $spItem) { $spYear = $spItem['date'] !== '' ? substr($spItem['date'], 0, 4) : ''; if (preg_match('/^\d{4}$/', $spYear)) { $spYears[$spYear] = ($spYears[$spYear] ?? 0) + 1; } else { $spUndated++; } } krsort($spYears); if ($spTahun !== '' && $spTahun !== 'lain' && ! isset($spYears[$spTahun])) { $spTahun = ''; } if ($spTahun === 'lain' && $spUndated === 0) { $spTahun = ''; } $spList = array_values(array_filter($spTabItems, function ($spItem) use ($spTahun) { if ($spTahun === '') { return true; } $spYear = $spItem['date'] !== '' ? substr($spItem['date'], 0, 4) : ''; return $spTahun === 'lain' ? ! preg_match('/^\d{4}$/', $spYear) : $spYear === $spTahun; })); if ($spCari !== '') { $spList = array_values(array_filter($spList, fn ($i) => mb_stripos($i['title'], $spCari) !== false)); } $spIsFiltered = $spTahun !== '' || $spCari !== ''; // Potong senarai ikut halaman (jumlah & kiraan tahun kekal penuh) $spTotal = count($spList); $spLastPage = max(1, (int) ceil($spTotal / $spPerPage)); $spPage = min($spPage, $spLastPage); $spListPage = array_slice($spList, ($spPage - 1) * $spPerPage, $spPerPage); $spDetail = null; if ($spId) { foreach ($spItems as $spItem) { if ($spItem['id'] === $spId) { $spDetail = $spItem; break; } } } $spSpeakerLabelText = $spPenyampai !== '' ? ($spSpeakers[$spPenyampai] ?? $spPenyampai) : ''; @endphp
{{-- ============================ BREADCRUMB ============================ --}} {{-- ============================== TAJUK ============================== --}}

{{ $spDetail ? $spDetail['title'] : ($spLang === 'en' ? 'Speeches' : 'Teks Ucapan') }}

@if ($spDetail)

{{ $spLang === 'en' ? 'Speech details and document.' : 'Butiran ucapan dan dokumen.' }}

@else

@if ($spLang === 'en') Official speeches, opening addresses and event remarks by the Minister, Deputy Minister and the Secretary-General of the Ministry of Natural Resources and Environmental Sustainability. @else Teks ucapan rasmi, perasmian dan ucapan majlis oleh Menteri, Timbalan Menteri dan Ketua Setiausaha Kementerian Sumber Asli dan Kelestarian Alam. @endif

@endif
@if ($spDetail) {{-- ============================= BUTIRAN ============================= --}}
@if ($spDetail['speaker_cat'] !== '') {{ $spSpeakerLabel($spDetail['speaker_cat']) }} @endif @if ($spDetail['category'] !== '') {{ $spCategories[$spDetail['category']] ?? $spDetail['category'] }} @endif

{{ $spDetail['title'] }}

{{ $spLang === 'en' ? 'Date' : 'Tarikh' }}: {{ $spDetail['date'] !== '' ? $spDate($spDetail['date']) : ($spLang === 'en' ? 'No date' : 'Tiada tarikh') }} {{ $spLang === 'en' ? 'Speaker' : 'Penyampai' }}: {{ $spDetail['speaker'] !== '' ? $spDetail['speaker'] : ($spLang === 'en' ? 'Not stated' : 'Tiada') }}
    @if ($spDetail['position'] !== '')
  • {{ $spLang === 'en' ? 'Position' : 'Jawatan' }} {{ $spDetail['position'] }}
  • @endif @if ($spDetail['event'] !== '')
  • {{ $spLang === 'en' ? 'Event' : 'Majlis / Program' }} {{ $spDetail['event'] }}
  • @endif @if ($spDetail['location'] !== '')
  • {{ $spLang === 'en' ? 'Location' : 'Lokasi' }} {{ $spDetail['location'] }}
  • @endif @if ($spDetail['category'] !== '')
  • {{ $spLang === 'en' ? 'Category' : 'Kategori' }} {{ $spCategories[$spDetail['category']] ?? $spDetail['category'] }}
  • @endif
@if ($spDetail['file'] !== '') @else

{{ $spLang === 'en' ? 'No document is attached to this speech.' : 'Tiada dokumen dilampirkan pada ucapan ini.' }}

@endif
@else {{-- ============================ TAB PENYAMPAI ============================ --}} {{-- --------------------------- PENAPIS --------------------------- --}} {{-- --------------------------- KIRAAN --------------------------- --}}
@if ($spIsFiltered) {{ $spLang === 'en' ? 'Showing' : 'Menunjukkan' }} {{ count($spList) }} {{ $spLang === 'en' ? 'of' : 'daripada' }} {{ count($spTabItems) }} {{ $spLang === 'en' ? 'speeches' : 'ucapan' }} @else {{ $spLang === 'en' ? 'Total' : 'Jumlah' }} {{ count($spList) }} {{ $spLang === 'en' ? 'speeches' : 'ucapan' }} @endif @if ($spSpeakerLabelText !== '') {{ $spSpeakerLabelText }} @endif @if ($spTahun !== '') {{ $spTahun === 'lain' ? ($spLang === 'en' ? 'Others' : 'Lain-lain') : $spTahun }} @endif @if ($spCari !== '') “{{ $spCari }}” @endif @if ($spLastPage > 1) {{ $spLang === 'en' ? 'Page' : 'Halaman' }} {{ $spPage }}/{{ $spLastPage }} @endif
{{-- --------------------------- JADUAL --------------------------- --}} @if (count($spList) > 0)
@foreach ($spListPage as $spItem) @endforeach
{{ $spLang === 'en' ? 'Date' : 'Tarikh' }} {{ $spLang === 'en' ? 'Title' : 'Tajuk' }} {{ $spLang === 'en' ? 'Document' : 'Dokumen' }}
{{ $spItem['date'] !== '' ? $spDate($spItem['date']) : ($spLang === 'en' ? 'No date' : 'Tiada tarikh') }}

{{ $spItem['title'] }}

@if ($spItem['file'] !== '') {{ $spLang === 'en' ? 'Download' : 'Muat turun' }} @else — @endif
@if ($spLastPage > 1) @endif @else
{{ $spLang === 'en' ? 'No speeches found' : 'Tiada ucapan ditemui' }}

@if ($spIsFiltered) {{ $spLang === 'en' ? 'No speeches match this year or search. Try another filter.' : 'Tiada ucapan sepadan dengan tahun atau carian ini. Cuba penapis lain.' }} @else {{ $spLang === 'en' ? 'No speeches have been published for this selection yet.' : 'Belum ada ucapan diterbitkan untuk pilihan ini.' }} @endif

@if ($spIsFiltered || $spPenyampai !== '') {{ $spLang === 'en' ? 'Reset filters' : 'Set semula penapis' }} @endif
@endif @endif