@if ($mwsTitleNeedsTruncate) {{ $mwsTitleTruncated }} {{ $mwsTitleFull }} @else {{ $mwsTitleFull }} @endif
@php $mwsMeetStartDisplay = \Carbon\Carbon::parse((string) $meeting->start_time)->format('g:i A'); $mwsMeetEndDisplay = \Carbon\Carbon::parse((string) $meeting->end_time)->format('g:i A'); $mwsMeetDurationNote = null; $mwsMeetTimingLabel = null; $mwsMeetSkewLabel = null; $mwsHumanizeMeetingMinutes = static function (int $minutes): string { $minutes = max(1, $minutes); if ($minutes < 60) { return $minutes.' min'; } if ($minutes < 1440) { $h = intdiv($minutes, 60); $m = $minutes % 60; $hWord = $h === 1 ? 'hour' : 'hours'; return $m === 0 ? $h.' '.$hWord : $h.' '.$hWord.' '.$m.' min'; } $days = intdiv($minutes, 1440); $rem = $minutes % 1440; $dWord = $days === 1 ? 'day' : 'days'; if ($rem === 0) { return $days.' '.$dWord; } $h = intdiv($rem, 60); $m = $rem % 60; $parts = [$days.' '.$dWord]; if ($h > 0) { $parts[] = $h.($h === 1 ? ' hour' : ' hours'); } if ($m > 0) { $parts[] = $m.' min'; } return implode(' ', $parts); }; try { $mwsMeetTz = config('app.meeting_timezone', config('app.timezone')); $mwsMeetNow = \Carbon\Carbon::now($mwsMeetTz); $mwsMeetDay = $meeting->meeting_date->format('Y-m-d'); $mwsMeetStartAt = \Carbon\Carbon::parse($mwsMeetDay.' '.trim((string) $meeting->start_time), $mwsMeetTz); $mwsMeetEndFromDuration = $meeting->duration_minutes ? $mwsMeetStartAt->copy()->addMinutes((int) $meeting->duration_minutes) : null; $mwsMeetEndAt = $mwsMeetEndFromDuration ?? \Carbon\Carbon::parse($mwsMeetDay.' '.trim((string) $meeting->end_time), $mwsMeetTz); if ($meeting->duration_minutes) { $mwsMeetEndDisplay = $mwsMeetEndFromDuration->format('g:i A'); } $mwsMeetPlannedMin = $meeting->duration_minutes ? (int) $meeting->duration_minutes : max(0, (int) round($mwsMeetStartAt->diffInSeconds($mwsMeetEndAt) / 60)); $mwsMeetTerminalStatus = in_array($meeting->status, [ \App\MeetingWorkspace\MeetingLifecycleStatus::Draft, \App\MeetingWorkspace\MeetingLifecycleStatus::Cancelled, \App\MeetingWorkspace\MeetingLifecycleStatus::Completed, \App\MeetingWorkspace\MeetingLifecycleStatus::Missed, ], true); if (! $mwsMeetTerminalStatus && ! $meeting->duration_minutes && $mwsMeetPlannedMin > 0 && $mwsMeetNow->lt($mwsMeetStartAt)) { $mwsMeetDurationNote = $mwsHumanizeMeetingMinutes($mwsMeetPlannedMin).' scheduled'; } if (! $mwsMeetTerminalStatus) { if ($mwsMeetNow->lt($mwsMeetStartAt)) { $mwsSecsToStart = $mwsMeetStartAt->getTimestamp() - $mwsMeetNow->getTimestamp(); if ($mwsSecsToStart > 0) { // Relative only: date and start time already appear as "Friday, May 8, 2026 · 22:41 – …" $mwsMeetTimingLabel = 'Starts in '.$mwsHumanizeMeetingMinutes((int) ceil($mwsSecsToStart / 60)); } } elseif ($mwsMeetNow->lt($mwsMeetEndAt)) { $mwsSecsLeft = $mwsMeetEndAt->getTimestamp() - $mwsMeetNow->getTimestamp(); $mwsMeetTimingLabel = 'Ends in '.$mwsHumanizeMeetingMinutes((int) ceil($mwsSecsLeft / 60)); } elseif ($mwsMeetNow->gte($mwsMeetEndAt)) { $mwsSecsOver = $mwsMeetNow->getTimestamp() - $mwsMeetEndAt->getTimestamp(); if ($mwsSecsOver >= 60) { $mwsMeetTimingLabel = 'Over by '.$mwsHumanizeMeetingMinutes((int) floor($mwsSecsOver / 60)); } } } if ($meeting->duration_minutes && $mwsMeetEndFromDuration) { $mwsMeetDbEndAt = \Carbon\Carbon::parse($mwsMeetDay.' '.trim((string) $meeting->end_time), $mwsMeetTz); $mwsSkewMin = abs((int) round($mwsMeetDbEndAt->diffInSeconds($mwsMeetEndFromDuration) / 60)); if ($mwsSkewMin >= 2) { $mwsSkewTxt = $mwsHumanizeMeetingMinutes($mwsSkewMin); $mwsMeetSkewLabel = $mwsMeetDbEndAt->gt($mwsMeetEndFromDuration) ? 'Saved end '.$mwsSkewTxt.' later than duration' : 'Saved end '.$mwsSkewTxt.' earlier than duration'; } } } catch (\Throwable) { // keep display times from columns; optional segments stay null } @endphpOverview
- Status
- {{ $meeting->status->label() }} @if ($meeting->status === \App\MeetingWorkspace\MeetingLifecycleStatus::Cancelled && filled($meeting->cancellation_reason))
- Cancellation reason
- {{ $meeting->cancellation_reason }} @endif
- Priority
- {{ $meeting->priority->label() }}
- Type
- {{ $meeting->meeting_type ?: '—' }}
- Organizer
- {{ $meeting->organizer->name ?? '—' }}
- Location
- {{ $meeting->location ?: '—' }}
- Online
- @if ($meeting->online_meeting_link) Join link @else — @endif @if ($meeting->relationLoaded('subjectLinks') && $meeting->subjectLinks->isNotEmpty())
- Scheme / UID
-
-
@foreach ($meeting->subjectLinks as $link)
- @php $mwsSchemeUid = mws_scheme_uid_display($link->project); $mwsOverviewPcnId = (int) ($link->project_concept_note_id ?? 0); $mwsOverviewPcFormId = (int) ($link->pc_form_id ?? 0); $mwsOverviewPcnRef = ''; $mwsOverviewPcnName = trim((string) ($link->project?->name ?? '')); $mwsOverviewKindMark = ''; if ($mwsOverviewPcFormId > 0 && $link->pcForm) { $mwsOverviewKindMark = \App\Models\PC\PcForm::kindLabel((string) ($link->pcForm->pc_form_kind ?? '')); } if ($mwsOverviewPcnId > 0 && $mwsOverviewPcFormId <= 0) { $mwsOverviewPcn = $link->projectConceptNote; $mwsOverviewKindMark = \App\Services\PC\MeetingWorkspaceSubjectCatalog::PCN_SCHEME_KIND_MARK; if ($mwsOverviewPcn) { $mwsOverviewPcnRef = trim((string) ($mwsOverviewPcn->reference_number ?? '')); if ($mwsOverviewPcnRef === '') { $mwsOverviewPcnRef = trim((string) ($mwsOverviewPcn->pcn_uid ?? '')); } if ($mwsOverviewPcnRef === '') { $mwsOverviewPcnRef = 'PCN #'.$mwsOverviewPcnId; } if ($mwsOverviewPcnName === '') { $mwsOverviewPcnName = trim((string) ($mwsOverviewPcn->project_name ?? '')); } if ($mwsOverviewPcnName === '') { $mwsOverviewPcnName = $mwsOverviewPcnRef; } } elseif ($mwsOverviewPcnName === '') { $mwsOverviewPcnRef = 'PCN #'.$mwsOverviewPcnId; $mwsOverviewPcnName = $mwsOverviewPcnRef; } } @endphp {{ $mwsOverviewPcnName !== '' ? $mwsOverviewPcnName : ($mwsOverviewPcnRef !== '' ? $mwsOverviewPcnRef : '—') }} @if ($mwsOverviewKindMark !== '') {{ $mwsOverviewKindMark }} @endif @if ($link->project && $link->project->adp_number !== null && $link->project->adp_number !== '') · ADP {{ $link->project->adp_number }} @endif @if ($mwsSchemeUid !== '—') · {{ $mwsSchemeUid }} @endif @if ($mwsOverviewPcnRef !== '' && $mwsOverviewPcnName !== '' && $mwsOverviewPcnRef !== $mwsOverviewPcnName) · {{ $mwsOverviewPcnRef }} @endif @if (! empty($link->is_additional_agenda)) {{ mws_additional_agenda_label_suffix() }} @endif @endforeach
@endif
Instructions
{{ $meeting->description }}
@endifDocuments & Actions
-
@unless ($mwsIsGeneralMeetingType)
-
@php
$mwsWpSchemes = ($mwsWorkingPaper['eligible'] ?? false)
? ($mwsWorkingPaper['schemes'] ?? [])
: [];
$mwsWpSchemeCount = count($mwsWpSchemes);
@endphp
Working Paper
@if ($mwsWpSchemeCount <= 1)
@php
$mwsWpScheme = $mwsWpSchemeCount === 1 ? $mwsWpSchemes[0] : null;
$mwsWpSchTitle = '';
$mwsWpSchViewUrl = '';
$mwsWpSchGenerateUrl = '';
$mwsWpSchDocPreviewUrl = '';
if (is_array($mwsWpScheme)) {
$mwsWpSchTitle = trim((string) ($mwsWpScheme['scheme_title'] ?? ''));
if ($mwsWpSchTitle === '') {
$mwsWpSchTitle = (int) ($mwsWpScheme['project_concept_note_id'] ?? 0) > 0
? 'PCN #'.(int) $mwsWpScheme['project_concept_note_id']
: 'PC #'.(int) ($mwsWpScheme['pc_form_id'] ?? 0);
}
$mwsWpSchViewUrl = (string) ($mwsWpScheme['view_url'] ?? '');
$mwsWpSchGenerateUrl = (string) ($mwsWpScheme['generate_url'] ?? '');
$mwsWpSchDocPreviewUrl = (string) ($mwsWpScheme['document_preview_url'] ?? '');
}
@endphp
@else @foreach ($mwsWpSchemes as $mwsWpScheme) @php $mwsWpSchTitle = trim((string) ($mwsWpScheme['scheme_title'] ?? '')); if ($mwsWpSchTitle === '') { $mwsWpSchTitle = (int) ($mwsWpScheme['project_concept_note_id'] ?? 0) > 0 ? 'PCN #'.(int) $mwsWpScheme['project_concept_note_id'] : 'PC #'.(int) ($mwsWpScheme['pc_form_id'] ?? 0); } $mwsWpSchViewUrl = (string) ($mwsWpScheme['view_url'] ?? ''); $mwsWpSchGenerateUrl = (string) ($mwsWpScheme['generate_url'] ?? ''); $mwsWpSchDocPreviewUrl = (string) ($mwsWpScheme['document_preview_url'] ?? ''); @endphp@if ($mwsWpSchTitle !== '') {{ $mwsWpSchTitle }} @endif@if ($mwsWpSchViewUrl !== '') View @elseif ($mwsWpSchGenerateUrl !== '' && is_array($mwsWpScheme) && ! empty($mwsWpScheme['can_generate_working_paper'])) Generate @endif @if ($mwsWpSchDocPreviewUrl !== '') View document @elseif ($mwsWpSchViewUrl === '' && ! ($mwsWpSchGenerateUrl !== '' && is_array($mwsWpScheme) && ! empty($mwsWpScheme['can_generate_working_paper']))) — @endif@endforeach @endif{{ $mwsWpSchTitle }}@if ($mwsWpSchViewUrl !== '') View @elseif ($mwsWpSchGenerateUrl !== '' && ! empty($mwsWpScheme['can_generate_working_paper'])) Generate @endif @if ($mwsWpSchDocPreviewUrl !== '') View document @elseif ($mwsWpSchViewUrl === '' && ! ($mwsWpSchGenerateUrl !== '' && ! empty($mwsWpScheme['can_generate_working_paper']))) — @endif
@endunless
- @if ($mwsSchemeMom['eligible'] ?? false)
- @php $mwsMomSchemes = $mwsSchemeMom['schemes'] ?? []; $mwsMomSchemeCount = (int) ($mwsSchemeMom['linked_scheme_count'] ?? count($mwsMomSchemes)); @endphp Minutes of Meeting @forelse ($mwsMomSchemes as $mwsMomScheme) @include('meeting-workspace.meetings.partials.mom-docs-scheme-card', [ 'mwsMomScheme' => $mwsMomScheme, 'meeting' => $meeting, 'showTitle' => $mwsMomSchemeCount > 1 || trim((string) ($mwsMomScheme['scheme_title'] ?? '')) !== '', ]) @empty — @endforelse @endif @unless ($mwsIsGeneralMeetingType) {{-- Schedule PDWP: explicit Can Create PDWP + add + scope; completed Pre-PDWP and Hold-ON off --}} @if ($mwsSchedulePdwp['eligible'] ?? false)
- Schedule PDWP Schedule PDWP @endif {{-- Schedule DDWP: same pattern as Schedule PDWP (DDWP always; Pre-PDWP when Completed) --}} @if (($mwsScheduleDdwp['eligible'] ?? false) && can('meeting_workspace', 'add') && $mwsMayManageMeetingActions)
- Schedule DDWP Schedule DDWP @endif {{-- Forward for Advice (PDWP) / Concurrence (DDWP): Completed + MoM saved + MoM co-signatures complete (or already forwarded for View). DDWP also requires PC approved. --}} @if (($mwsAdviseLetter['eligible'] ?? false))
-
{{ $mwsAdviseLetter['title'] ?? 'Issue Advice for AA Letter' }}
-
@foreach (($mwsAdviseLetter['schemes'] ?? []) as $mwsAlScheme)
@php
$mwsAlSchTitle = trim((string) ($mwsAlScheme['scheme_title'] ?? ''));
if ($mwsAlSchTitle === '') {
$mwsAlSchTitle = 'PC #'.(int) ($mwsAlScheme['pc_form_id'] ?? 0);
}
$mwsAlSchUrl = (string) ($mwsAlScheme['url'] ?? '');
$mwsAlSchForwarded = ! empty($mwsAlScheme['is_forwarded']);
$mwsAlSchCanDecide = ! empty($mwsAdviseLetter['is_ddwp'])
? ! empty($mwsAlScheme['can_decide_concurrence'])
: ! empty($mwsAlScheme['can_decide_advice']);
$mwsAlSchChairmanPreview = ! empty($mwsAlScheme['can_chairman_advice_preview']);
$mwsAlSchCanEditContent = ! empty($mwsAlScheme['can_edit_advice_content']);
$mwsAlSchCanIssue = ! empty($mwsAlScheme['can_issue_advice']);
$mwsAlSchConcApproved = ! empty($mwsAdviseLetter['is_ddwp'])
? ! empty($mwsAlScheme['concurrence_approved'])
: ! empty($mwsAlScheme['advice_approved']);
$mwsAlSchConcReturned = ! empty($mwsAdviseLetter['is_ddwp'])
? ! empty($mwsAlScheme['concurrence_returned'])
: ! empty($mwsAlScheme['advice_returned']);
$mwsAlSchReturnRemarks = trim((string) ($mwsAlScheme['return_remarks'] ?? ''));
$mwsAlSchReturnBy = trim((string) ($mwsAlScheme['return_remarks_by'] ?? ''));
$mwsAlSchReturnAt = trim((string) ($mwsAlScheme['return_remarks_at'] ?? ''));
$mwsAlSchPcFormId = (int) ($mwsAlScheme['pc_form_id'] ?? 0);
@endphp
-
@if ($mwsAlSchConcReturned && $mwsAlSchReturnRemarks !== ''){{ $mwsAlSchTitle }} @if ($mwsAlSchConcApproved) Approved @elseif ($mwsAlSchConcReturned) Returned @endif@if ($mwsAlSchForwarded) @if ($mwsAlSchChairmanPreview) Advice @elseif ($mwsAlSchCanIssue) Sign & Issue View @else View @endif @if ($mwsAlSchCanDecide) @if (! empty($mwsAdviseLetter['is_ddwp'])) @else @endif @endif @elseif (! empty($mwsAdviseLetter['is_ddwp']) ? ! empty($mwsAlScheme['can_generate_concurrence']) : (! empty($mwsAlScheme['can_generate_advice']) || $mwsAlSchCanEditContent)) @if (! empty($mwsAdviseLetter['is_ddwp']) ? ! empty($mwsAlScheme['can_generate_concurrence']) : ! empty($mwsAlScheme['can_generate_advice'])) Generate @endif @if ($mwsAlSchCanEditContent) Edit content @endif @endif@endifReturn remarks{{ $mwsAlSchReturnRemarks }}@if ($mwsAlSchReturnBy !== '' || $mwsAlSchReturnAt !== '')@if ($mwsAlSchReturnBy !== '') By {{ $mwsAlSchReturnBy }} @endif @if ($mwsAlSchReturnAt !== '') @if ($mwsAlSchReturnBy !== '') · @endif{{ $mwsAlSchReturnAt }} @endif@endif
@endforeach
@endif
{{-- AA (Administrative Approval): PDWP after Forward for Advice + PC approved; DDWP after Concurrence approved + PC approved; FD sees View after AA received --}}
@if (($mwsAa['eligible'] ?? false))
-
-
AA (Administrative Approval)
-
@foreach (($mwsAa['schemes'] ?? []) as $mwsAaScheme)
@php
$mwsAaSchTitle = trim((string) ($mwsAaScheme['scheme_title'] ?? ''));
if ($mwsAaSchTitle === '') {
$mwsAaSchTitle = 'PC #'.(int) ($mwsAaScheme['pc_form_id'] ?? 0);
}
$mwsAaSchUrl = (string) ($mwsAaScheme['url'] ?? '');
$mwsAaSchForwarded = ! empty($mwsAaScheme['is_forwarded']);
$mwsAaSchCanGenerate = ! empty($mwsAaScheme['can_generate']);
$mwsAaSchCanRequest = ! empty($mwsAaScheme['can_request']);
$mwsAaSchAlready = ! empty($mwsAaScheme['already_requested']);
@endphp
- {{ $mwsAaSchTitle }} @if ($mwsAaSchForwarded) View @elseif ($mwsAaSchCanGenerate) Generate @elseif ($mwsAaSchCanRequest) @elseif ($mwsAaSchAlready) Already Requested @if ($mwsAaSchUrl !== '') View @endif @elseif ($mwsAaSchUrl !== '') View @endif @endforeach
@endif
{{-- Authentication of AA: FD generate/view after AA received; department approvers view after Finance returns auth letter --}}
@if (($mwsAaAuth['eligible'] ?? false))
-
Authentication of AA
-
@foreach (($mwsAaAuth['schemes'] ?? []) as $mwsAaAuthScheme)
@php
$mwsAaAuthSchTitle = trim((string) ($mwsAaAuthScheme['scheme_title'] ?? ''));
if ($mwsAaAuthSchTitle === '') {
$mwsAaAuthSchTitle = 'PC #'.(int) ($mwsAaAuthScheme['pc_form_id'] ?? 0);
}
$mwsAaAuthSchUrl = (string) ($mwsAaAuthScheme['url'] ?? '');
$mwsAaAuthSchForwarded = ! empty($mwsAaAuthScheme['is_forwarded']);
$mwsAaAuthSchCanGenerate = ! empty($mwsAaAuthScheme['can_generate']);
@endphp
- {{ $mwsAaAuthSchTitle }} @if ($mwsAaAuthSchForwarded) View @elseif ($mwsAaAuthSchCanGenerate) Generate @elseif ($mwsAaAuthSchUrl !== '') View @endif @endforeach
@endif
@endunless
PC Review & Decision
-
@if (! empty($mwsShowDdwpDepartmentPcFormDecisionCard) && $mwsShowPcDeferDirectionBanner)
-
Note
{{ $mwsPcDeferDefaultRemarks }}
@endif
@foreach ($mwsPcDecisions as $mwsPc)
@if ($mwsPcDecisionRowShowsChairmanCard($mwsPc) && $mwsPcDecisionRowMomReady($mwsPc))
@php
$mwsPcRowShowDecisionActions = ! empty($mwsPc['show_approve']) || ! empty($mwsPc['show_advise_approve']) || ! empty($mwsPc['show_defer']) || ! empty($mwsPc['show_return']);
$mwsPcRowActionsEnabled = $mwsPcRowShowDecisionActions && ! empty($mwsPc['decision_actions_enabled']);
$mwsPcRowActionsDisabledTitle = e($mwsPc['mom_signature_gate_message'] ?? 'Complete Minutes of Meeting signatures first.');
@endphp
-
@if ($mwsPcRowShowDecisionActions)@if ($mwsPcRowActionsEnabled) @if (! empty($mwsPc['show_approve'])) @endif @if (! empty($mwsPc['show_advise_approve'])) @endif @if (! empty($mwsPc['show_defer'])) @if (! empty($mwsShowDdwpDepartmentPcFormDecisionCard) && ! empty($mwsDeferApproveHoldMode)) @else {{-- Same Bootstrap data-toggle path as Approve (modal must exist when show_defer is true). --}} @endif @endif @if (! empty($mwsPc['show_return'])) @endif @else @if (! empty($mwsPc['show_approve'])) @endif @if (! empty($mwsPc['show_advise_approve'])) @endif @if (! empty($mwsPc['show_defer'])) @endif @if (! empty($mwsPc['show_return'])) @endif @endif@endif
@endif
@endforeach
PC Review & Decision
-
@if ($mwsShowPcDecisionSectionAny && $mwsShowPcDeferDirectionBanner && ! $mwsAnyAdviseForwardedScheme && empty($mwsPdwpForumOrganizerActions))
-
Note
{{ $mwsPcDeferDefaultRemarks }}
@endif
@foreach ($mwsPcDecisions as $mwsPc)
@if ($mwsPcDecisionRowMomReady($mwsPc))
-
@if (! empty($mwsPdwpForumOrganizerActions) && $mwsPcDecisionRowMomReady($mwsPc) && empty($mwsPc['advise_forwarded'])) @php $mwsOrganizerDeferEnabled = ! empty($mwsPc['mom_signatures_complete']); $mwsOrganizerDeferDisabledTitle = e($mwsPc['mom_signature_gate_message'] ?? 'Complete Minutes of Meeting signatures first.'); @endphp@if (! empty($mwsPdwpForumOrganizerActions)) @if ($mwsOrganizerDeferEnabled) @if ($mwsDeferWorkflowType === 'pdwp' || $mwsDeferWorkflowType === 'ddwp') @endif @else @if ($mwsDeferWorkflowType === 'pdwp' || $mwsDeferWorkflowType === 'ddwp') @endif @endif @else @php $mwsOrganizerDeferBtnLabel = ! empty($mwsDeferApproveHoldMode) ? 'Approve' : 'Defer'; $mwsOrganizerDeferBtnIcon = ! empty($mwsDeferApproveHoldMode) ? 'fa-check' : 'fa-pause'; @endphp @if ($mwsOrganizerDeferEnabled) @else @endif @endif@endif
@endif
@endforeach
Participants
-
@forelse ($meeting->participants as $p)
@php
$mwsAck = $p->schedule_ack_status;
$mwsCanRespond = $mwsShowScheduleAck
&& $p->user_id
&& auth()->check()
&& (int) auth()->id() === (int) $p->user_id
&& ($mwsAck === null || $mwsAck === \App\MeetingWorkspace\MwsScheduleAckStatus::Pending);
$mwsParticipantDisplayName = $p->displayName();
@endphp
-
{{ $mwsParticipantDisplayName !== '' ? $mwsParticipantDisplayName : '—' }}@if ($mwsShowScheduleAckStatus && $p->user_id && $mwsAck === \App\MeetingWorkspace\MwsScheduleAckStatus::Rejected && filled($p->schedule_ack_reason))Reason: {{ $p->schedule_ack_reason }}@endif{{ $p->role->label() }}@if ($mwsShowScheduleAckStatus && $p->user_id) @if ($mwsAck === \App\MeetingWorkspace\MwsScheduleAckStatus::Accepted) Accepted @elseif ($mwsAck === \App\MeetingWorkspace\MwsScheduleAckStatus::Rejected) Deferred @else Pending @endif @if ($mwsCanRespond)@endif @elseif ($mwsShowScheduleAckStatus) — @endif
@empty
- No participants listed. @endforelse
Reminders
-
@forelse ($meeting->reminders as $r)
-
{{ $r->remind_at->format('Y-m-d H:i') }}{{ $r->channel->label() }} · {{ $r->status->label() }}
@empty
- No reminders. @endforelse