{{ a.unitName }} is understaffed today — {{ a.present }}/{{ a.total }} attending present
View units →
{{ alert.message }} (and {{ systemAlerts.length - 1 }} more)
{{ new Date().toLocaleDateString('en-GB', { weekday: 'long' }) }}
{{ new Date().toLocaleDateString('en-GB', { day: 'numeric', month: 'long', year: 'numeric' }) }}
Department overview · Records available to your account
On-call · Next 3 Days
Loading…
{{ dashboardSourceLabel('oncall_schedule') }}
Rotations · This Week
{{ dashboardSourceLabel('resident_rotations') }}
No visible rotation starts or planned ends in the next 7 days
Rotation Units · Occupancy
Occupancy requires available unit and rotation records.
No visible active units
{{ unit.unit_name }} {{ rotations.filter(r=>r.training_unit_id===unit.id&&r.rotation_status==='active').length }}/{{ unit.maximum_residents||0 }}
{{ residentGapWarnings.length }} resident{{ residentGapWarnings.length !== 1 ? 's' : '' }} unassigned — next 3 months
{{ nmAvI(w.name) }}
{{ w.name || '—' }} PGY-{{ w.year }}
{{ g }}
⚡ Needs attention {{ dashRisks.length }} item{{ dashRisks.length===1?'':'s' }} All clear
⚠ {{ r.title }} {{ r.meta }}
Coverage, supervision, rotations and leave look clean.
Synced {{ oncallSync.stats?.add || 0 }} shifts from {{ oncallSync.fileName }} Preview ready — {{ oncallSync.stats?.add || 0 }} shifts to sync
Filtered context
WORKFORCE DIRECTORY

{{ deptPulseStats.active }} active staff

People, professional roles and near-term operational context.

Export
{{ filteredMedicalStaffAll.length }} results
Staff member Role Current / next Record status Actions
{{ nmAvI(staff.full_name) }}
{{ staff.full_name }} {{ staff.department?.name || staff.departments?.name || staff.primary_dept_name || staff.specialization || 'Department record' }}
{{ getStaffResidentDescriptor(staff)?.label || 'Resident' }}
{{ formatStaffType(staff.staff_type) }} {{ formatSpecialization(staff.specialization) }}
{{ item.title }}{{ item.meta }}
No near-term recorded event
{{ getStaffDirectoryRecordState(staff).label }}
No staff records match this view. {{ hasActiveStaffFilters ? 'Clear or adjust the filters to see more people.' : 'Add the first staff record when the department is ready.' }}
Page {{ pagination.medical_staff.page }} of {{ staffTotalPages }} · {{ filteredMedicalStaffAll.length }} results
No staff records match this view.
DUTY COORDINATION

Plan the on-call service

Schedules, duty logs and monthly review.

Primary Call Today Past Hover for details · Click to edit
{{ physician.name }} {{ (physician.shifts || []).length }} shift{{ (physician.shifts || []).length !== 1 ? 's' : '' }}
{{ shift.dayNum || (shift.dateLabel || '').replace(/[^0-9]/g,'') || shift.dayLabel }}
{{ {'primary_call':'Primary Call','float_physician':'Float Physician','weekend_coverage':'Weekend','on_call_home':'Localizada','on_call_mixed':'Mixta','on_call_present':'Presencial'}[shift.shift_type] || shift.shift_type }}
{{ shift.coverage_area?.name || coverageAreas.find(a=>a.id===shift.coverage_area_id)?.name }}
{{ shift.start_time }} – {{ shift.end_time }}
{{ shift.coverage_notes }}
● On call today
Completed
Upcoming
No shifts assigned
No schedules found
No on-call shifts match your filters
Shift PeriodPhysician TypeStatus Actions
Shift Period Physician Type Status Actions
{{ formatDate(schedule.duty_date) }} TODAY +1d
{{ (schedule.start_time||'').slice(0,5) }} → {{ (schedule.end_time||'').slice(0,5) }}
{{ schedule.coverage_area?.name || coverageAreas.find(a=>a.id===schedule.coverage_area_id)?.name }}
{{ (getPhysicianName(schedule.primary_physician_id)||'??').split(' ').filter(Boolean).slice(0,2).map(n=>n[0]).join('').toUpperCase() }}
{{ getPhysicianName(schedule.primary_physician_id) }}
Resident: {{schedule.resident_physician?.full_name||getPhysicianName(schedule.resident_physician_id)}}
On duty now
{{ {'primary_call':'Primary','weekend_coverage':'Weekend','float_physician':'Float'}[schedule.shift_type] || schedule.shift_type }} {{ new Date(schedule.duty_date + 'T' + (schedule.start_time||'00:00')) > new Date() ? 'Upcoming' : isToday(schedule.duty_date) ? 'Live' : 'Done' }}
No schedules found
No results match your filters No on-call shifts have been scheduled yet
{{ calloutKPIs.thisMonth }}
This month
Emergency call-outs
{{ calloutKPIs.night }}
Night calls
After 22:00
{{ calloutKPIs.weekend }}
Weekend calls
Sat / Sun
{{ calloutKPIs.ytd }}
Year to date
All call-outs
Calls by coverage area
Calls by reason
{{ (calloutReasonLabels[reason[0]]||reason[0]).slice(0,20) }}
{{ reason[1] }}
Physician duty load this period
Uneven duty distribution detected — some physicians are carrying significantly more load
{{ p.name }}
{{ p.callouts }} call-out{{ p.callouts!==1?'s':'' }}
{{ p.night }}N · {{ p.weekend }}W
+{{ p.deviation }}% {{ p.deviation }}%
Emergency call-out log {{ callouts.length }} records
No call-outs logged
Record unscheduled emergency call-outs to track duty load across the team
Physician Called at Type Duration Reason
{{ (c.staff?.full_name || c.staff_id || '??').split(' ').filter(Boolean).slice(0,2).map(n=>n[0]).join('').toUpperCase() }}
{{ c.staff?.full_name || '—' }}
{{ c.called_at ? new Date(c.called_at).toLocaleDateString('es-ES',{day:'2-digit',month:'short',year:'numeric'}) : '—' }}
{{ c.called_at ? new Date(c.called_at).toLocaleTimeString('es-ES',{hour:'2-digit',minute:'2-digit'}) : '' }}
{{ calloutTimeTypes[c.time_type] || c.time_type }} {{ Math.round((new Date(c.end_time) - new Date(c.called_at)) / 60000) }}m — {{ calloutReasonLabels[c.reason_category] || c.reason_category }}
{{ c.notes }}
On-call summary per physician
No data yet
Log call-outs in the duty log tab to see the summary
Physician Scheduled on-call Call-outs Night Weekend Total vs avg
{{ (row.name||'??').split(' ').filter(Boolean).slice(0,2).map(n=>n[0]).join('').toUpperCase() }}
{{ row.name }}
{{ formatStaffType(row.staffType) }}
{{ row.scheduled }} {{ row.callouts }} {{ row.night }} {{ row.weekend }} {{ row.total }}
Uneven distribution detected — one or more physicians are significantly above the team average this period
{{ new Date(new Date().getFullYear(), new Date().getMonth() + oncallMonthOffset, 1) .toLocaleDateString('en-GB', { month: 'long', year: 'numeric' }) }}
{{ oncallMonthSummary }}
{{ area.name }}
Unassigned
{{ d }}
{{ day }}
TRAINING & PLACEMENTS

Coordinate resident rotations

Placements, timelines and rotation records to review.

Missing actual end date Early-terminated rotations where the planned end is known but the effective final day is not.
{{ rotationTemporalReviews.length }}
One-day clinical rotation records Planned start and end are the same day. This may be valid, but it is unusual enough to review rather than auto-correct.
{{ rotationOneDayReviews.length }}

+ {{ rotationOneDayReviews.length - 3 }} additional one-day records remain available in the rotation table.

Missing resident relationship The rotation record exists, but its resident link is absent or no longer resolves to a staff record.
{{ rotationMissingResidentReviews.length }}

+ {{ rotationMissingResidentReviews.length - 3 }} additional unresolved resident relationships remain in the table.

Review boundary These checks identify incomplete or unusual records; they do not prove that a record is wrong. Planned dates and historical state remain unchanged until an authorised user confirms a correction.
{{ residentGapWarnings.length }} resident{{ residentGapWarnings.length > 1 ? 's' : '' }} unassigned in next 3 months Click a resident to assign a rotation
{{ (w.name||'??').split(' ').map(p=>p[0]||'').join('').slice(0,2).toUpperCase() }}
{{ w.name || '—' }} PGY-{{ w.year }}
{{ g }}
{{ filteredRotations.length }} of {{ rotations.length }}
Active Scheduled Completed Click orb for details · Hover to preview
{{ resident.full_name }} {{ formatTrainingYear(resident.training_year) || 'PGY-?' }} {{ getDepartmentName(resident.department_id) }}
{{ rot.unitName ? rot.unitName.split(' ').slice(0,2).join(' ') : formatClinicalDuration(rot.start_date, rot.end_date) }}
{{ rot.unitName }}
{{ formatDate(rot.start_date) }} → {{ formatDate(rot.end_date) }}
Completed
›
{{ resident.currentRotation.unitName ? resident.currentRotation.unitName.split(' ').slice(0,2).join(' ') : formatClinicalDuration(resident.currentRotation.start_date, resident.currentRotation.end_date) }}
{{ resident.currentRotation.unitName }}
{{ formatDate(resident.currentRotation.start_date) }} → {{ formatDate(resident.currentRotation.end_date) }}
{{ getDaysRemaining(resident.currentRotation.end_date) }}d remaining
● Active now
›
{{ rot.unitName ? rot.unitName.split(' ').slice(0,2).join(' ') : formatClinicalDuration(rot.start_date, rot.end_date) }}
{{ rot.unitName }}
{{ formatDate(rot.start_date) }} → {{ formatDate(rot.end_date) }}
Scheduled
No rotations assigned
No rotations found
No residents match your current filters, or no rotations have been assigned yet
{{ getHorizonRangeLabel() }}
{{ m.year }}
Resident
{{ m.label }}
No residents with rotations to display
ResidentUnit PeriodDays Left StatusActions
Resident Unit Period Days Left Status Supervisor Actions
{{ (getResidentName(rotation.resident_id)||'??').split(' ').filter(Boolean).slice(0,2).map(n=>n[0]).join('').toUpperCase() }}
{{ getResidentName(rotation.resident_id) }}
{{ rotation.resident.external_contact_name }}
{{ getTrainingUnitName(rotation.training_unit_id) }}
{{ rotation.training_unit.dept.name }}
{{ formatDateShort(rotation.start_date) }} → {{ formatDateShort(rotation.end_date) }}
in {{ getDaysUntilStart(rotation.start_date) }} days — {{ formatRotationStatus(rotation.rotation_status) }} {{ getSupervisorName(rotation.supervising_attending_id) }} —
No rotations found
No results match your filters No resident rotations have been assigned yet
{{ trainingUnitView==='timeline' ? 'Resident rotations' : trainingUnitView==='weekly' ? 'Unit staff' : 'Clinical structure' }}

{{ trainingUnitView==='timeline' ? 'Resident capacity' : trainingUnitView==='weekly' ? 'Clinical teams' : 'The unit directory' }}

{{ trainingUnitView==='timeline' ? 'Month-by-month resident capacity across active clinical units' : trainingUnitView==='weekly' ? 'Attending physicians linked to each unit · recorded leave is secondary context' : 'People · resident rotations · capacity · unit details' }}

{{ clinicalUnitHeaderContext }}
Attention
Operational state{{ unitSourcesComplete ? 'No findings in the loaded capacity and team-link checks.' : 'Some sources are not yet available. Capacity and leave checks may be incomplete.' }}
{{ filteredTrainingUnits.length }} unit{{ filteredTrainingUnits.length===1?'':'s' }}

Unit records are not available

{{ dashboardSourceLabel('training_units') }}

WORKFORCE AVAILABILITY

{{ absencePageContext.headline }}

Current attendance, planned leave and coverage review are shown as separate operational states.

Today{{ absencePageContext.today }} Upcoming{{ absencePageContext.upcoming }} Coverage{{ absencePageContext.coverage }}
Today {{ absenceKPIs.absentNow }} {{ absenceKPIs.absentNow ? 'recorded absent' : 'full recorded attendance' }}
Upcoming {{ absenceKPIs.upcoming }} {{ absenceKPIs.upcoming ? (absenceKPIs.nextDate ? 'next · ' + absenceKPIs.nextDate : 'planned') : 'none scheduled' }}
Coverage review {{ absenceKPIs.noCoverage }} {{ absenceKPIs.noCoverage ? 'needs review' : 'no uncovered leave' }}
This month {{ absenceKPIs.thisMonth }} {{ absenceKPIs.coveredCount }} recorded covered
Working view {{ filteredAbsencesAll.length }} matching record{{ filteredAbsencesAll.length===1?'':'s' }}
Staff memberReason StatusFrom UntilDurationCoverage
Staff member Reason Status From Until Duration Coverage
{{ (getStaffName(absence.staff_member_id)||'??').split(' ').filter(Boolean).slice(0,2).map(n=>n[0]).join('').toUpperCase() }}
{{ getStaffName(absence.staff_member_id) }}
{{ absence.absence_reason ? absence.absence_reason.replace('_',' ') : '—' }} Absent nowPlannedReturnedCancelled{{ absence.current_status }} {{ formatDate(absence.actual_start_date || absence.start_date) }}
{{ formatDate(absence.actual_return_date || absence.end_date) }}
planned {{ formatDate(absence.end_date) }}
{{ absence.actual_days || calculateAbsenceDuration(absence.actual_start_date || absence.start_date, absence.actual_return_date || absence.end_date) }} {{ absence.actual_return_date ? 'actual days' : 'planned days' }} {{ getStaffName(absence.covering_staff_id) }} Covered No coverage
No absences found
No results match your filtersNo absence records have been logged yet
30-day staff availability {{ absCoverage30.filter(d=>d.pct < 0.8).length }} days below 80% No days below 80%
{{ day.label }}
{{ day.available }}/{{ day.available + day.absent }} available
{{ absCalendarTitle }}
{{ absCalendarDays.filter(d=>!d.otherMonth).reduce((s,d)=>s+d.absences.length,0) }} absences {{ absCalendarDays.filter(d=>!d.otherMonth && d.risk==='high').length }} high-risk {{ absCalendarDays.filter(d=>!d.otherMonth && d.risk==='medium').length }} medium
{{ dow }}
{{ day.day }}
{{ day.day }}
{{ day.absences.length }}
+{{ day.absences.length - 3 }} more
{{ stat.icon }}
{{ stat.val }}
{{ stat.label }}
{{ getAbsHorizonLabel() }}
{{ m.label }} {{ m.year }}
Cover
{{ cov.available }}/{{ cov.total }}

No absences in this period

{{ absences.length === 0 ? 'No absence records have been created yet.' : 'All absences in this window are resolved. Navigate forward or switch to Planning mode.' }}

No staff found

{{ cfg.label }}
{{ absTimelinePlanning ? 'Click empty row to add absence' : 'Switch to Planning to schedule leave' }}
On-call assigned Absence (no cover) Absence (covered) On-call gap
Next 14 days
On-call coverage
Absences
{{ new Date(day.date+'T12:00:00').toLocaleDateString('en-GB',{weekday:'short'}) }}
{{ new Date(day.date+'T12:00:00').getDate() }}
{{ formatDrName(getPhysicianName(area.primary.primary_physician_id)) }} {{ area.name }} ⚠
{{ area.name }}: unassigned
No shifts scheduled
—
No data for next 14 days
Schedule on-call shifts to see the coverage overview
DEPARTMENT COMMUNICATION

Keep the team informed

Announcements, departmental updates and operational context.

● auto-computed
Department Pulse · Live {{ formatDate(new Date()) }}
{{ commsPulse.onDuty }}
On duty
active staff
{{ commsPulse.onCall }}
On-call today
primary coverage
{{ commsPulse.absent }}
Absent
on leave today
{{ understaffedUnitAlerts.length }}
Coverage gap{{ understaffedUnitAlerts.length === 1 ? '' : 's' }}
{{ understaffedUnitAlerts.length ? (understaffedUnitAlerts[0].unitName || 'unit') + (understaffedUnitAlerts.length > 1 ? ' +' + (understaffedUnitAlerts.length-1) : '') : 'all units covered' }}
{{ commsPulse.onRotation }}
On rotation
residents active
{{ bc.content || bc.title }}
{{ bc.created_by_name || '—' }} · {{ formatTimeAgo(bc.created_at) }} · expires {{ formatDate(bc.publish_end_date) }}
{{ (currentUser?.full_name || 'U').split(' ').filter(Boolean).slice(0,2).map(n=>n[0]).join('').toUpperCase() }}
What does the team need to know?
Broadcast Protocol Note Kudos
{{ (item.created_by_name || item.author || '?').split(' ').filter(Boolean).slice(0,2).map(n=>n[0]).join('').toUpperCase() }}
{{ item.created_by_name || item.author || 'Staff' }} {{ broadcastTypeConfig[getAnnouncementType(item)]?.label }} {{ formatTimeAgo(item.created_at) }}
{{ item.title }}
{{ item.content || item.title }}

Nothing posted yet. Be first to update the department.

Daily Briefing
{{ formatDate(new Date()) }}
✦ Auto-drafted from live data
{{ commsPulse.onDuty }} on duty, {{ commsPulse.onCall }} on-call today. {{ commsPulse.absent }} absent on leave. {{ understaffedUnitAlerts.length }} coverage gap{{ understaffedUnitAlerts.length===1?'':'s' }} flagged ({{ understaffedUnitAlerts[0].unitName }}). {{ commsPulse.onRotation }} residents on active rotation. All units covered, no gaps.
On duty{{ commsPulse.onDuty }} active
On-call{{ commsPulse.onCall }} scheduled
Watch{{ understaffedUnitAlerts[0].unitName }} coverage

WORKSPACE ADMINISTRATION

Settings

Manage the people and structure of your department.

NeumactDepartment workspace

SCHEDULE IMPORT

Schedule import

Match the spreadsheet to your team and inspect the proposed changes.

Sync on-call from Excel review before applying
Upload your Guardias Excel file. The system reads the schedule, matches the surnames to staff, and shows exactly what a sync would change — without saving anything. You review first.
Parsing {{ oncallSync.fileName }}…
⚠ {{ oncallSync.error }}
{{ oncallSync.fileName }} · sheet "{{ oncallSync.stats.sheet }}" · {{ oncallSync.stats.total }} shifts read
Dates {{ oncallSync.summary.min }} → {{ oncallSync.summary.max }} · {{ oncallSync.summary.upcoming }} today-or-upcoming of {{ oncallSync.summary.total }}
01 / Choose your period

{{oncallSync.blocked.length}} rows in the file need attention. Rows with invalid dates are visible under Whole file.

Match staff and resident names ({{ oncallSync.unmatched.length }}) — or skip:
{{ u.surname }} ({{ u.count }})
Mappings are remembered in this browser and rechecked against active staff. Clear saved mappings

02 / REVIEW ASSIGNMENTS

{{oncallSyncVisible.length}} in view of {{oncallSync.entries.length}} in this file

Nothing is selected automatically. Changing filters or mappings clears selection. Changing a conflict decision deselects that row. Current assignments stay until you approve and select a replacement.

ApplyDateCurrent scheduleFrom ExcelReview / result
{{r.date||'Invalid date'}}{{ new Date(r.date+'T12:00:00').toLocaleDateString('en-GB',{weekday:'long'}) }}Source row {{r.source_row}} {{r.status==='conflict'?'Multiple assignments':'No assignment'}} {{r.staffName||r.surname}}Resident: {{r.residentName||r.mir||'None'}}{{oncallSyncType(r.shiftType)}}
No assignments match this view. Adjust the period or filters.

New shifts use the current default hours, 15:00–08:00. Existing times and coverage areas are preserved. Blank source assignments do not delete records.

03 / CHECK BEFORE APPLYING

{{oncallSyncReady?'Selected assignments passed the current checks.':oncallSyncChecked?'Some selected assignments need attention. Resolve or deselect those rows, then check again.':'Check your selection for permissions, leave conflicts and overlapping duties.'}}

Checks do not save assignments. The server checks again when you apply.

Saving your schedule to the system… {{ oncallSync.progress.done }} of {{ oncallSync.progress.total }} shifts

{{ oncallSync.commitResult.msg }}
  • {{r.date}}: {{r.message}}
Review the diff above before committing. Only selected assignments in the current view are written.

DEPARTMENT SETUP

Department

Maintain staff categories, qualifications, rotation services and coverage areas.

Staff Types
{{ st.display_name.slice(0,2).toUpperCase() }}
{{ st.display_name }}
{{ st.type_key }}
R
No staff types — click Add Staff Type to create one.
Academic Degrees
No academic degrees defined
Add degree titles such as MD, PhD, MIR
{{ deg.abbreviation || '??' }}
{{ deg.name }}
inactive
Titles

Honorifics offered in the staff form (Dr., Dra., Prof., …). The chosen value is shown before the name on the public team page. Removing one here keeps it on anyone who already has it.

No titles defined
Add honorifics such as Dr., Dra., Prof.
{{ h.value }}
{{ h.value }}
inactive
Rotation Services
{{ svc.name }}
{{ svc.institution_name }}{{ svc.institution_name && svc.city ? ' · ' : '' }}{{ svc.city }}
{{ svc.service_type==='external_institution' ? 'External' : 'Internal' }}
{{ svc.contact_name || svc.contact_email }}
{{ svc.contact_name }}
{{ svc.contact_phone }}
Add a service
No rotation services defined yet.

PREFERENCES

Preferences

Department details and platform behaviour in one place.

General Settings
These settings apply system-wide. Changes take effect immediately.
Audit Logging
Record all user actions to the audit log
Email Notifications
Send email alerts for key events
Absence Notifications
Alert coordinators when absences are recorded
Maintenance Mode
Blocks all non-admin API access
Coverage Areas

Define the coverage areas for on-call assignments (e.g. ICU, Hospitalization, General). Each shift is assigned to one area, allowing multiple primaries per day — one per area.

{{ area.name }}
{{ area.code }} Weekends ✓ Coverage req.
No coverage areas defined
Add areas like ICU, Hospitalization, General to enable per-area on-call scheduling
Migration needed: Run the coverage_areas SQL in Supabase before using this feature.
{{ source.label }} {{ source.status === 'loading' || source.status === 'pending' ? 'Loading records…' : source.status === 'restricted' ? 'Access restricted.' : 'Records could not be refreshed.' }} {{ source.loaded ? 'Previously retrieved records remain visible.' : 'Current totals are unavailable.' }} {{ source.error }}
PNEUMOLOGY · RESEARCH PORTFOLIO

Research

One portfolio for clinical studies, innovation, study requirements and research output.

Research programmes {{ researchPortfolioSummary.activeLines }} {{ researchPortfolioSummary.activeLines === 1 ? 'active programme' : 'active programmes' }}
Active studies {{ researchPortfolioSummary.activeStudies }} {{ researchPortfolioSummary.recruitingStudies }} recruiting
Enrolment {{ researchPortfolioSummary.totalEnrolled }} {{ researchPortfolioSummary.totalTarget ? researchPortfolioSummary.enrollmentPct + '% of recorded target' : 'participants enrolled' }}
Clinical innovation {{ researchPortfolioSummary.activeProjects }} {{ researchPortfolioSummary.lateStageProjects }} in pilot / validation / implementation
Study readiness {{ researchPortfolioSummary.governanceAttention }} {{ researchPortfolioSummary.governanceAttention ? (researchPortfolioSummary.governanceAttention === 1 ? 'study record to review' : 'study records to review') : 'no gaps in tracked fields' }}
Institutional portfolio

Research lines

Programmes that organise the department’s clinical studies, innovation and research output.

No research lines found {{ researchLineFilters.search ? 'Try another search.' : 'Create the first research programme.' }}
L{{ line.line_number }}

{{ line.research_line_name || line.name }}

{{ line.description }}

{{ line.active === false ? 'Inactive' : 'Active' }}
{{ kw }}
Clinical evidence {{ researchLinePortfolio(line).studies }} {{ researchLinePortfolio(line).recruiting }} recruiting · {{ researchLinePortfolio(line).enrolled }} enrolled
Clinical innovation {{ researchLinePortfolio(line).projects }} {{ researchLinePortfolio(line).lateProjects }} pilot / validation / implementation
Research output {{ researchLinePortfolio(line).outputs }} {{ researchLinePortfolio(line).publications }} publications · {{ researchLinePortfolio(line).articles }} articles
Study readiness {{ researchLinePortfolio(line).governance }} {{ researchLinePortfolio(line).governance ? 'to review' : 'no gaps in tracked fields' }}
L{{ selectedLine.line_number }} · programme
L{{ selectedLine.line_number }}
RESEARCH LINE · PROGRAMME

{{ selectedLine.research_line_name || selectedLine.name }}

{{ selectedLine.description || 'No programme description has been recorded yet.' }}

{{ kw }}
Programme activityEvidence, innovation and research outputCounts reflect records currently linked to this research line.
Clinical evidence{{ researchLinePortfolio(selectedLine).studies }}
{{ researchLinePortfolio(selectedLine).recruiting }}Recruiting
{{ researchLinePortfolio(selectedLine).activeStudies }}Active / recruiting
{{ researchLinePortfolio(selectedLine).enrolled }}Participants
Clinical innovation{{ researchLinePortfolio(selectedLine).projects }}
{{ researchLinePortfolio(selectedLine).lateProjects }}Pilot / validation / implementation
{{ researchLinePortfolio(selectedLine).fundedProjects }}Funded
{{ researchLinePortfolio(selectedLine).partnerNeeds }}Partner needs recorded
Research output{{ researchLinePortfolio(selectedLine).outputs }}
{{ researchLinePortfolio(selectedLine).publications }}Publications
{{ researchLinePortfolio(selectedLine).articles }}Articles
{{ researchLinePortfolio(selectedLine).publicOutputs }}Public records
Study requirementsProtocol, ethics committee clearance and accountable study leadership
{{ researchLinePortfolio(selectedLine).protocolGaps }} protocol gaps {{ researchLinePortfolio(selectedLine).ethicsGaps }} ethics items {{ researchLinePortfolio(selectedLine).piGaps }} PI gaps
Signals reflect protocol, ethics-clearance and PI fields currently recorded in neumDesk.
Clinical evidence

Studies in this programme

No clinical studies are linked to this research line.
Clinical innovation

Development activity

No clinical innovation projects are linked to this research line.
Research output

Connected knowledge

No Research Library records are linked to this line yet.
Clinical evidence

Clinical studies

Studies, trials, cohorts and registries linked to this programme.

No clinical studies yetAdd the first study to this programme.
{{ TRIAL_STATUS_LABEL[trialStatusKey(trial)] }}
{{ trial.study_type }}{{ trial.phase }}{{ trial.protocol_id }}

{{ trial.title }}

{{ (trial.target_diseases||[]).length ? trial.target_diseases.join(' · ') : 'Clinical focus not recorded' }}

Study requirements
{{ trial.protocol_finalized ? 'Protocol ✓' : 'Protocol' }}{{ trial.ethics_status==='approved' ? 'Ethics ✓' : 'Ethics' }}{{ trial.principal_investigator_id ? 'PI ✓' : 'PI' }}
{{ trial.sponsor_name || 'Multicentre study' }}
{{ trialEnrollment(trial).actual }}/{{ trialEnrollment(trial).target }}{{ trialEnrollment(trial).remaining }} to target
RecruitmentTarget not recorded
→
Clinical innovation

Innovation projects

Clinical needs moving through development, validation and implementation.

No clinical innovation projects yetAdd the first innovation project to this programme.
{{ formatInnovationStage(proj.current_stage || proj.development_stage) }}
{{ formatInnovationCategory(proj.category) }}TRL {{ proj.trl_level }}

{{ proj.title }}

{{ proj.clinical_rationale || proj.description || 'No clinical rationale recorded' }}

Clinical focus{{ (proj.target_diseases||[]).length ? proj.target_diseases.join(' · ') : (proj.scope_note || 'Not recorded') }}{{ formatFundingStatus(proj.funding_status) }}
Collaboration{{ proj.partner_found ? (proj.partner_name || 'Partner recorded') : ((proj.partner_needs||[]).length ? (proj.partner_needs.length+' partner need'+(proj.partner_needs.length===1?'':'s')) : 'No external partner need recorded') }}{{ proj.scope_finalized ? 'Scope confirmed' : 'Scope pending' }}
→
Programme definition

{{ selectedLine?.research_line_name || selectedLine?.name }}

{{ selectedLine?.description || 'No description available.' }}

Capabilities

{{ selectedLine?.capabilities || 'Not recorded' }}

Keywords
{{ kw }}

Not recorded

Clinical study
CLINICAL EVIDENCE

{{ selectedStudy.title }}

{{ selectedStudy.protocol_id }} {{ selectedStudy.study_type || 'Clinical study' }} {{ selectedStudy.phase }} {{ getResearchLineName(selectedStudy.research_line_id) }} {{ TRIAL_STATUS_LABEL[trialStatusKey(selectedStudy)] }}

Summary access. Detailed research and clearance fields are restricted.

Recruitment
{{ trialEnrollment(selectedStudy).actual }}/ {{ trialEnrollment(selectedStudy).target }}
{{ trialEnrollment(selectedStudy).remaining }} to recorded target · {{ trialEnrollment(selectedStudy).pct }}% of recorded target
Recruitment target not recorded
Clinical focus{{ (selectedStudy.target_diseases || []).length ? selectedStudy.target_diseases.join(' · ') : 'Not recorded' }}
Principal investigator{{ selectedStudy.pi?.full_name || getStaffName(selectedStudy.principal_investigator_id) || 'Not assigned' }}
Institutional relationshipOur institutional positionOrigin, delivery model and our role are tracked separately.
Origin{{ ({department:'neumAC-originated',external:'External',investigator:'Investigator-initiated'})[selectedStudy.research_origin] || 'Not recorded' }}
Delivery model{{ selectedStudy.delivery_model || (selectedStudy.is_multicentre ? 'Multicentre' : 'Not recorded') }}{{ selectedStudy.participating_centres }} centres recorded
Our role{{ selectedStudy.institutional_role || 'Not recorded' }}
Study requirementsProtocol readiness, ethics committee / CEIm clearance and accountable study leadership
Protocol{{ selectedStudy.protocol_applicable===false ? 'Not applicable' : (selectedStudy.protocol_finalized ? 'Finalized' : 'Pending') }}{{ selectedStudy.protocol_id || (selectedStudy.protocol_applicable===false ? 'No protocol required recorded' : 'No protocol ID') }}
Ethics / CEIm clearance{{ ({approved:'Approved',pending:'Pending',exempt:'Exempt',not_required:'Not required'})[selectedStudy.ethics_status] || 'Not recorded' }}
PI{{ selectedStudy.principal_investigator_id ? 'Assigned' : 'Not assigned' }}
Consent / regulatory{{ selectedStudy.consent_version ? ('Consent ' + selectedStudy.consent_version) : (selectedStudy.regulatory_status || 'Not recorded') }}Ethics ref · {{ selectedStudy.ethics_reference }}
Study lifecycle

Study delivery & recruitment

Study status and recruitment progress are shown separately.
Study lifecycle{{ trialStatusKey(selectedStudy)==='prep' ? 'Preparation' : trialStatusKey(selectedStudy)==='done' ? 'Completed' : 'Active delivery' }}
Setup
Active delivery
Completed
Recruitment{{ trialStatusKey(selectedStudy)==='recruiting' ? 'Recruiting' : (selectedStudy.recruitment_status || 'Not independently recorded') }}
Target{{ trialEnrollment(selectedStudy).target }}
Enrolled{{ trialEnrollment(selectedStudy).actual }}
Remaining{{ trialEnrollment(selectedStudy).remaining }}
Progress{{ trialEnrollment(selectedStudy).pct }}%

Recruitment target is not recorded for this study.

Screened{{ selectedStudy.screened_count }}
Currently active{{ selectedStudy.active_participants }}
Completed{{ selectedStudy.completed_participants }}
Withdrawn{{ selectedStudy.withdrawn_participants }}
Study identity

Study design & clinical scope

Study type{{ selectedStudy.study_type || 'Not recorded' }}
Phase{{ selectedStudy.phase || 'Not applicable or not recorded' }}
Population{{ ({adult:'Adult',paediatric:'Paediatric',mixed:'Mixed',not_applicable:'Not applicable'})[selectedStudy.population_type] || 'Not recorded' }}
Centre model{{ selectedStudy.is_multicentre ? 'Multicentre' : 'Single-centre or not recorded as multicentre' }}{{ selectedStudy.participating_centres }} participating centres
Sponsor{{ selectedStudy.sponsor_name || 'Not recorded / not applicable' }}{{ selectedStudy.sponsor_type }}
Funding{{ ({funded:'Funded',seeking:'Seeking funding',applied:'Applied',not_applicable:'Not applicable',completed:'Completed'})[selectedStudy.funding_status || 'not_applicable'] }}
Registry

Registration & verification

Public registry identifiers a reviewer or partner can verify
Registry recordOpen registry ↗
Protocol ID{{ selectedStudy.protocol_id }}
Clinical context

Study description

{{ selectedStudy.description || selectedStudy.scope_note }}

People

Study team

{{ ((selectedStudy.co_investigators||[]).length + (selectedStudy.external_team||[]).length + (selectedStudy.principal_investigator_id ? 1 : 0)) }} recorded members
{{ selectedStudy.dm.full_name.split(' ').slice(-2).map(w=>w[0]).join('').toUpperCase() }}{{ selectedStudy.dm.full_name }}Data Manager
{{ ext.name ? ext.name.split(' ').slice(-2).map(w=>w[0]).join('').toUpperCase() : (ext.institution||'?').slice(0,2).toUpperCase() }}{{ ext.name || ext.institution }}{{ ext.role || 'External collaborator' }}
No team members are recorded.
Milestones

Study progression

{{ ms.label }}{{ ms.date }}
Done
Clinical innovation
CLINICAL INNOVATION

{{ selectedProject.title }}

{{ formatInnovationStage(selectedProject.current_stage || selectedProject.development_stage) }} {{ formatInnovationCategory(selectedProject.category) }} TRL {{ selectedProject.trl_level }} {{ getResearchLineName(selectedProject.research_line_id) }}

Summary access. Detailed research and clearance fields are restricted.

Development pathway
{{ projectPathway(selectedProject).position }}/ {{ projectPathway(selectedProject).total }} stages
Currently {{ formatInnovationStage(selectedProject.current_stage || selectedProject.development_stage) }} · {{ projectPathway(selectedProject).pct }}% of pathway
Clinical lead{{ selectedProject.lead?.full_name || getStaffName(selectedProject.lead_investigator_id) || 'Not assigned' }}
Funding{{ formatFundingStatus(selectedProject.funding_status) }}Budget · €{{ Number(selectedProject.budget).toLocaleString('es-ES') }}
Clinical need / rationale

{{ selectedProject.clinical_rationale || 'Clinical rationale has not been recorded yet.' }}

Clinical focus{{ (selectedProject.target_diseases || []).length ? selectedProject.target_diseases.join(' · ') : (selectedProject.scope_note || 'Cross-respiratory / not recorded') }}
Institutional relationshipOur institutional positionOrigin, collaboration model and our role are tracked separately from funding and partners.
Origin{{ ({department:'neumAC-originated',external:'External',consortium:'External consortium'})[selectedProject.research_origin] || 'Not recorded' }}
Delivery model{{ selectedProject.delivery_model || 'Not recorded' }}
Our role{{ selectedProject.institutional_role || 'Not recorded' }}
Development pathway

From need to implementation

Current stage: {{ formatInnovationStage(selectedProject.current_stage || selectedProject.development_stage) }}
{{ stage.label }}
Clinical execution clearanceProtocol to be followed and ethics committee / CEIm clearance for patient-facing testing or clinical validation, where applicable.
Clinical protocol {{ selectedProject.validation_protocol_id || 'Not recorded' }} Protocol or study plan to be followed during clinical execution / validation.
Ethics / CEIm clearance {{ ({approved:'Approved',pending:'Pending',exempt:'Exempt',not_required:'Not required'})[selectedProject.ethics_status] || 'Not recorded' }} Record the committee decision when ethics review applies.
Validation scope {{ selectedProject.scope_finalized ? 'Confirmed' : 'Pending' }} Clinical need, population and intended validation scope.
Regulatory pathway {{ formatRegulatoryPathway(selectedProject.regulatory_pathway) }} Device / software / other regulatory route where relevant.
Project identity

Development context

Category{{ selectedProject.category ? formatInnovationCategory(selectedProject.category) : 'Not recorded' }}
Current stage{{ formatInnovationStage(selectedProject.current_stage || selectedProject.development_stage) }}
TRL{{ selectedProject.trl_level ? 'TRL ' + selectedProject.trl_level : 'Not recorded' }}
Population{{ ({adult:'Adult',paediatric:'Paediatric',mixed:'Mixed',not_applicable:'Not applicable'})[selectedProject.population_type || 'adult'] }}
Partner status{{ selectedProject.partner_found ? (selectedProject.partner_name || 'Partner recorded') : 'No partner recorded' }}
IP status{{ selectedProject.ip_status || 'Not recorded' }}
Funding{{ formatFundingStatus(selectedProject.funding_status) }}{{ selectedProject.funding_source }}
Budget€{{ Number(selectedProject.budget).toLocaleString('es-ES') }}
Project

Description

{{ selectedProject.description }}

Collaboration

Partner needs

{{ formatPartnerNeed(need) }}
People

Project team & collaborators

{{ ((selectedProject.co_investigators||[]).length + (selectedProject.external_team||[]).length + (selectedProject.lead_investigator_id ? 1 : 0)) }} recorded members
{{ ext.name ? ext.name.split(' ').slice(-2).map(w=>w[0]).join('').toUpperCase() : (ext.institution||'?').slice(0,2).toUpperCase() }}{{ ext.name || ext.institution }}{{ ext.role || 'Partner' }}
No team members are recorded.
Milestones

Project progression

{{ ms.label }}{{ ms.date }}
Done
CLINICAL EVIDENCE

Clinical studies

Track study status, enrolment, protocol readiness and ethics / CEIm clearance across Pneumology.

neumACt
Research portfolio · Clinical studies
Portfolio preview · {{ studiesPreviewRows.length }} shown
Fields to include
{{ studiesPreviewRows.length }} shown {{ studiesPreviewRows.filter(r=>r.featured_in_website).length }} public {{ studiesPreviewRows.filter(r=>!r.featured_in_website).length }} private {{ studiesPreviewRows.filter(r=>r.statusKey==='recruiting').length }} recruiting
Status
Show columns
{{ previewSelCount(studiesPreview) }} selected
{{ col[1] }} {{ studiesPreview.sortDir>0?'▲':'▼' }}
{{ r.title }}
{{ r.protocol_id || '—' }} {{ r.line || '—' }} {{ r.study_type || '—' }} {{ r.phase || '—' }} {{ r.status }} — {{ r.enrolment || '—' }} {{ r.featured_in_website?'Public':'Private' }} {{ r.updated || '—' }}
No studies match the current filters.
Read-only preview · click a column header to sort · visibility is editable inline · Download exports the rows shown. Reflects the studies page's current search/filters.
neumACt
{{ completionModal.kind==='study' ? 'Clinical studies' : 'Clinical innovation' }}
Mark {{ completionModal.kind==='study' ? 'study' : 'project' }} completed
Record the date {{ completionModal.record && completionModal.record.title }} was completed. It moves to Completed and stops counting as active.
Active studies{{ clinicalTrials.filter(t=>['active','recruiting'].includes(trialStatusKey(t))).length }}{{ countTrialsByStatus('recruiting') }} recruiting
Recruitment{{ clinicalTrials.reduce((s,t)=>s+(Number(t.actual_enrollment)||0),0) }}enrolled across studies with a recorded target
Multicentre{{ clinicalTrials.filter(t=>t.is_multicentre).length }}studies marked multicentre
Study readiness{{ clinicalTrials.filter(t=>studyGovernance(t).any).length }}study records to review
{{ filteredTrialsAll.length }} shown · filtered
{{ clinicalTrials.length && (trialFilters.search || trialFilters.line || trialFilters.phase || trialFilters.status) ? 'No studies match the current filters' : 'No clinical studies recorded' }}There are {{ clinicalTrials.length }} study records in the portfolio. Change or clear the active restrictions to see them.No clinical studies have been recorded in this portfolio.
{{ TRIAL_STATUS_LABEL[trialStatusKey(trial)] }}
{{ trial.study_type }}{{ trial.phase }}{{ trial.protocol_id }}

{{ trial.title }}

{{ (trial.target_diseases||[]).length ? trial.target_diseases.join(' · ') : getResearchLineName(trial.research_line_id) }}

{{ trialStatusKey(trial)==='done' ? 'Study record' : 'Study requirements' }}
Completed · requirements retained in study details
{{ trial.protocol_finalized ? 'Protocol ✓' : 'Protocol pending' }}{{ trial.ethics_status==='approved' ? 'Ethics ✓' : (trial.ethics_status ? 'Ethics · '+formatEthicsStatus(trial.ethics_status) : 'Ethics not recorded') }}{{ trial.principal_investigator_id ? 'PI assigned' : 'PI missing' }}
{{ trial.sponsor_name }}Multicentre · {{ trial.participating_centres || '?' }} centres
{{ trialEnrollment(trial).actual }}/ {{ trialEnrollment(trial).target }}
{{ trialEnrollment(trial).remaining }} to target
RecruitmentTarget not recorded
Study lifecycleCompleted
→
CLINICAL INNOVATION

Clinical innovation

From clinical need to validation, implementation and scale.

neumACt
Research portfolio · Clinical innovation
Portfolio preview · {{ projectsPreviewRows.length }} shown
Fields to include
{{ projectsPreviewRows.length }} shown {{ projectsPreviewRows.filter(r=>r.featured_in_website).length }} public {{ projectsPreviewRows.filter(r=>!r.featured_in_website).length }} private
Stage
Show columns
{{ previewSelCount(projectsPreview) }} selected
{{ col[1] }} {{ projectsPreview.sortDir>0?'▲':'▼' }}
{{ r.title }}
{{ r.line || '—' }} {{ r.category || '—' }} {{ r.stage || '—' }} {{ r.funding || '—' }} {{ r.featured_in_website?'Public':'Private' }} {{ r.updated || '—' }}
No projects match the current filters.
Read-only preview · click a column header to sort · visibility is editable inline · Download exports the rows shown.
Projects{{ researchSources.projects.status==='ready' ? innovationProjects.length : '—' }}across the recorded portfolio
Validation onward{{ innovationProjects.filter(p=>/valid|implement|deploy|scale|escal|comercial/i.test(p.current_stage||p.development_stage||'')).length }}projects in later development
Funded{{ innovationProjects.filter(p=>p.funding_status==='funded').length }}projects marked funded
Attention{{ innovationProjects.filter(p=>!p.scope_finalized || ((p.partner_needs||[]).length && !p.partner_found)).length }}scope or unresolved partner needs
{{ filteredProjectsAll.length }} shown · filtered
{{ innovationProjects.length && (projectFilters.search || projectFilters.research_line_id || projectFilters.funding_status || projectFilters.stage || projectFilters.category) ? 'No projects match the current filters' : 'No clinical innovation projects recorded' }}There are {{ innovationProjects.length }} innovation projects in the portfolio. Change or clear the active restrictions to see them.No innovation projects have been recorded in this portfolio.
{{ formatInnovationStage(proj.current_stage || proj.development_stage) }}
{{ formatInnovationCategory(proj.category) }}TRL {{ proj.trl_level }}{{ getResearchLineName(proj.research_line_id) }}

{{ proj.title }}

{{ proj.clinical_rationale || proj.description || ((proj.target_diseases||[]).length ? proj.target_diseases.join(' · ') : 'No clinical rationale recorded') }}

Project readiness
{{ projectReadiness(proj).scope ? 'Scope ✓' : 'Scope pending' }} {{ projectReadiness(proj).ethics ? 'Ethics ✓' : 'Ethics' }} {{ projectReadiness(proj).partner ? 'Partner ✓' : 'Partner need' }}
{{ (proj.target_diseases||[]).length ? proj.target_diseases.join(' · ') : (proj.scope_note || formatFundingStatus(proj.funding_status)) }}
Development Stage {{ projectPathway(proj).position }}/{{ projectPathway(proj).total }} · {{ projectPathway(proj).pct }}%
{{ proj.partner_found ? (proj.partner_name || 'Partner recorded') : (proj.scope_finalized ? 'Scope confirmed' : 'Scope pending') }}
→
RESEARCH INTELLIGENCE

Research intelligence

Portfolio signals across enrolment, study requirements, programme activity and innovation readiness.

Clinical studies{{ researchSources.studies.status==='ready' ? clinicalTrials.length : '—' }}{{ countTrialsByStatus('recruiting') }} recruiting
Enrolled{{ clinicalTrials.reduce((s,t)=>s+(Number(t.actual_enrollment)||0),0) }}participants enrolled across recorded studies
Clinical innovation{{ researchSources.projects.status==='ready' ? innovationProjects.length : '—' }}{{ innovationProjects.filter(p=>/valid|implement|deploy|scale|escal|comercial/i.test(p.current_stage||p.development_stage||'')).length }} validation / later
Study requirements{{ clinicalTrials.filter(t=>studyGovernance(t).any).length }}study records with recorded gaps
Clinical evidence

Studies by status

{{ r.label }} {{ r.count }}
No clinical studies are recorded yet.
Clinical innovation

Projects by stage

{{ r.label }} {{ r.count }}
No innovation projects are recorded yet.
Recruitment

Enrolment by research line

{{ r.name }} {{ r.enrolled }}
No enrolment figures are recorded yet.
Programme comparison

Research lines as programmes

Evidence · innovation · output
Clinical evidence

Enrolment watch

Studies open to recruitment
No studies are currently recorded as recruiting.
Study requirements

Attention queue

Protocol · ethics clearance · PI
No tracked study-requirement gaps are recorded.
Clinical innovation

Development attention

Scope / collaboration
No development attention items are recorded.
neumAC · Research & Innovation

Research Library

Scientific output, clinical insight and departmental knowledge — connected to the programmes and people that produced them.

{{ newsPosts.length }}records
Library index {{ newsPosts.filter(p=>p.post_type==='publication').length }} publications {{ newsPosts.filter(p=>p.post_type==='article').length }} articles {{ newsPosts.filter(p=>p.post_type==='highlight').length }} highlights {{ newsPosts.filter(p=>p.post_type==='update').length }} updates {{ newsPosts.filter(p=>p.status==='published' && p.is_public).length }} Public
{{ newsLibraryContextLabel }}{{ newsDisplayPosts.length }}
{{ newsShownLabel }}
View by
Research lines{{ newsLensGroups.length }} institutional chapters
Browse output through the department's research structure.
Contributors{{ newsLensGroups.length }} people represented
Browse output through the people who created or communicated the work.
Chronology{{ newsLensGroups.length }} years of output
See how the department's research record develops through time.
Topics in the Library{{ newsLensGroups.length }} recurring terms
Topics are derived deterministically from record text; they are not clinical classifications.
Review queuePublication readiness
Record completeness and publishing readiness are shown here. Formal reviewer approval is shown only when supported by backend data.
DraftReady for reviewPublication checkPublished
{{ post.post_type }}

{{ post.title || 'Untitled record' }}

Missing: {{ newsReviewReadiness(post).missing.join(', ') }}Core record fields complete · ready for publication check
{{ newsReviewStage(post).label }}
{{ newsReviewReadiness(post).score }}%{{ newsReviewReadiness(post).score===100 ? 'Open publication check →' : 'Complete record →' }}
No draft records are waiting in the queue.
My LibrarySaved records and personal research sets
Followed research lines

No research sets yet. Save a filtered view when you want to return to a working collection.

∅
{{ newsLensMode==='saved' ? 'Nothing saved yet' : 'Nothing in this view' }} Save a record from Browse, follow a research line, or create a research set. {{ newsFilters.search || newsFilters.type || newsFilters.scope ? 'Try another search or clear a filter.' : 'Add the first record to the research library.' }}
{{ post.post_type === 'update' ? 'Update' : post.post_type === 'article' ? 'Article' : post.post_type === 'highlight' ? 'Highlight' : 'Publication' }} Featured
{{ post.status === 'draft' ? 'Draft' : 'Archived' }}
{{ (newsAuthorName(post.author_id)||'?').split(' ').filter(Boolean).slice(0,2).map(n=>n[0]).join('').toUpperCase() }}{{ newsAuthorName(post.author_id) }} {{ newsLineName(post.research_line_id) }} {{ formatNewsDate(post.published_at || post.created_at) }} {{ Math.max(1, Math.ceil(post.word_count / 220)) }} min read Expires {{ formatDate(post.expires_at) }}
Preparing the research library…
Syncing records
{{ newsActionMenu.post.post_type }} {{ newsActionMenu.post.title }}
R
neumAC · Research stewardship
Create a research record Research Editor · {{ {'publication':'Publication','article':'Article','highlight':'Highlight','update':'Update'}[newsModal.form.post_type] }}
{{ {'publication':'Scholarly record','article':'Long-form article','highlight':'Visual highlight','update':'Department update'}[newsModal.form.post_type] }} {{ newsModal.saveState }}
NEW RECORD
Research Library

Choose the record type.

Each type preserves the metadata, reading behaviour and publication workflow appropriate to its clinical or research use.

Publication · Article · Highlight · Update
CREATEREVIEWPUBLISHREAD
{{ newsModal.form.status==='published' ? 'Published' : newsModal.form.status==='archived' ? 'Archived' : 'Draft' }} i
Preview
Record completeness{{ newsReviewReadiness(newsModal.form).score }}%
Still to record: {{ newsReviewReadiness(newsModal.form).missing.slice(0,3).join(' · ') }} Core metadata recorded · ready for publication check
Publication
ARTICLE{{ newsModal.form.status==='published' ? 'PUBLISHED' : 'DRAFT' }}
Index termsUp to 10 short keywords for finding, grouping and connecting this article.
{{ (newsModal.form.keywords || []).length }}/10
Suggested from the draft
{{ signal.label }}{{ signal.value }}
Insert
{{ newsWordCount }} words{{ Math.max(1, Math.round(newsWordCount/200)) }} min read{{ newsEditorOutline.length }} sectionsRecommended length: {{ newsWordLimit }} words
Lead imageOptional · shown in the Library and Reader
Lead image
Framing check
Library
Reader
Public web
Image URL
Research highlight
Department update
{{ newsModal.form.published_at || new Date().toLocaleDateString('en-GB',{day:'2-digit',month:'short',year:'numeric'}) }}
{{ newsWordCount }} / {{ newsWordLimit }} words
Public visibility · published and unexpired records qualify for the public feedInternal · department only
Publication check

Ready to publish?

{{ newsModal.form.title || 'Untitled record' }}

DraftReady for reviewPublication checkPublished
Type
{{ newsModal.form.post_type }}
Visibility
{{ newsModal.form.is_public ? 'Public' : 'Internal' }}
Research line
{{ newsLineName(newsModal.form.research_line_id) }}
{{ newsPublicEligibility(newsPublicationPreview).label }}

{{ newsPublicEligibility(newsPublicationPreview).reason }}

After the proposed publication · expiry: {{ newsPublicationPreview.expires_at || 'No expiry' }}
Review public-feed content

These are the content fields exposed by the public feed when the record is eligible. The website controls their presentation.

{{ field.replace(/_/g,' ') }}
{{ newsPublicationPreview[field] === true ? 'Yes' : newsPublicationPreview[field] === false ? 'No' : newsPublicationPreview[field] || 'Not set' }}
Images
{{ url }}None

The feed also includes record and linked-record IDs, creation time, word count, public visibility and homepage flags. The first image is the featured image. Saving here does not confirm delivery to the website.

Research LibraryEsc

No matching records or commands.

↑↓ NavigateEnter Open⌘K Command
Research set

Save this working view

{{ newsDisplayPosts.length }} records will be included. Sets are personal to this browser profile and do not alter institutional records.