Added chartUnit.php — horizontal bar chart of top 60 units by death count, with full ranked table showing count and percentage of records with a known unit
Added "By Unit" link to the Personnel submenu in the Statistics navigation
Rebuilt chartUnit.php from scratch replacing an old incompatible version that referenced removed helpers (UnitID filter, CountNoUnit(), chartGeneric.php)
v1.2.8Data quality migrations 5-11
2026-05-16
Migration 5 (Rank cleanup): NULLs out "Rank Unknown" / "Unknown Rank" variants, strips trailing full stop, normalises Serjeant/Serjeant Major/Lance Serjeant/Staff Serjeant to modern Sergeant spellings
Migration 6 (CauseDeath): strips trailing full stops from raw CauseDeath field
Migration 7 (Initials): replaces full stops with spaces in Initials field, collapses double spaces, NULLs out blank results
Migration 8 (Age): converts Age = 0 to NULL (placeholder values)
Migration 9 (DateDeath): converts DateDeath values starting with "-0001" to NULL (SQLite date placeholder)
Migration 10 (ServiceNo): trims leading/trailing whitespace from ServiceNo
Migration 11 (Rank/Regiment/Unit title-case): converts all-caps Rank, Regiment, and Unit fields to title case; handles Mc/Mac prefixes; processed in batches of 5,000 per page load
v1.2.9Remove spare record placeholders
2026-05-16
Added migration 12 to fixDatabase.php: deletes all PersonInfoRaw rows where LastName = 'Spare Record' — these are structural placeholder entries with no real person data
v1.2.7Title-case name fields
2026-05-16
Added migration 4 to fixDatabase.php: converts all-caps LastName and FirstName values to title case (e.g. ABBOTT to Abbott, MCDONALD to McDonald)
Handles hyphens, apostrophes, and Mc/Mac prefixes
Affects ~41,000 LastName and ~39,000 FirstName records; processed in batches of 5,000 per page load
v1.2.6Name field split migration
2026-05-16
Added migration 3 to fixDatabase.php: for records where FirstName is empty and LastName contains a space, splits the combined field at the first space into correct LastName and FirstName values
Excludes 151 records with Afrikaans/Dutch/French compound surname prefixes (DE, DU, DA, VAN, VON, TEN, DEN, TER, LE, LA) which must not be split
Where Initials is also blank, derives initials from the extracted first name by taking the first letter of each word
Affects ~421 records
v1.2.5Page title fixes
2026-05-16
Added missing entries to roh_page_display_title() for releases.php, about.php, and chart_views.php so pageviews.php shows friendly titles instead of raw filenames
v1.2.4Minor text fix
2026-05-16
Changed about.php browser tab title from "Roll of Honour — About" to "Roll of Honour — About this site"
v1.2.3ActualCause field — normalised cause of death
2026-05-16
Added ActualCause column to PersonInfoRaw — parsed from the raw CauseDeath field by stripping location/narrative suffixes after the first comma, stripping parenthetical asides, and normalising ~40 variant spellings to canonical categories (e.g. "Died of pulmonary tuberculosis" → "Died of tuberculosis", MVA variants → "Died in motor vehicle accident")
Updated chartCauseOfDeath.php and chartCauseOfDeathYear.php to group by ActualCause instead of raw CauseDeath — reduces ~13,330 distinct values to ~200 meaningful categories
Updated CountNoCause() and roh_batch_person_stats() to use ActualCause
Updated Data Completeness chart to check ActualCause for meaningful cause data
v1.2.2Line graph on On This Day
2026-05-16
Converted the yearly trend chart on listOnThisDay.php from a bar chart to a line graph with filled area, curve tension, dot markers, and dark-theme axis styling
v1.2.1Estimated birth year
2026-05-16
Added EstBirthYear column to PersonInfoRaw — calculated as death year minus age at death (accurate to ±1 year), covering 30,382 records
Added "Estimated Births by Decade" bar chart and table to chartAge.php
Added estimated birth year range column (min–max) to rank detail table in chartAgeRank.php
Added stacked "Births by Decade by Rank Group" chart to chartAgeRank.php
Split "Date of Birth" in chartCompleteness.php into two rows: recorded date of birth (6 records) and estimated birth year (30,382 records)
v1.2.0Version bump
2026-05-16
Minor version bump to 1.2.0
v1.1.0Seven new statistics pages
2026-05-16
Added chartMap.php — interactive Leaflet.js cemetery map, circle markers sized by burial count, top-20 sites table
Added chartConflict.php — deaths grouped by named conflict era (Anglo-Boer War, WW1, WW2, Korean War, Rhodesian Bush War, SA Border War, post-1990), plus per-year timeline coloured by conflict
Added chartMonth.php — deaths by calendar month with top-3 months highlighted
Added chartCompleteness.php — data quality dashboard: progress bars and radar chart for 16 fields across Identity, Military, Death Record, Location, and Other categories
Added chartAgeRank.php — average age at death by rank group (General/Flag Officer down to Other Rank), plus full age-distribution histogram
Added chartSurname.php — top-40 surname frequency horizontal bar chart with ranked table
Added chartCalendar.php — 365-day CSS heat map grid showing deaths per calendar day across all years, with top-20 days table
Reorganised Statistics nav dropdown into four headed sections: Deaths, Personnel, Geography, Data
v1.0.3Fixed duplicate release notes
2026-05-16
Added UNIQUE constraint on roh_releases.version — INSERT OR IGNORE had nothing to conflict on so inserted a new row every page load
Added deduplication DELETE before index creation to clean up existing duplicates on the server
Added CREATE UNIQUE INDEX IF NOT EXISTS for pre-existing installs
v1.0.2Removed duplicate page views page
2026-05-16
Deleted chart_views.php — pageviews.php is the superset (includes everything chart_views had plus Top 40 table and daily 3-month chart)
Updated footer Quick Links to point to pageviews.php
Removed chart_views.php entry from roh_page_display_title()
v1.0.1Bug fix
2026-05-16
Fixed Personnel with Images count on home page — was counting locally downloaded files only (returned 1); now counts distinct PersonNumber values with a real image URL, excluding the no_image.jpg placeholder (correct count: 30,183)
v1.0.0Initial versioned release
2026-05-16
Initial versioned release of the Roll of Honour website