- Conditions now use the same database/detail-page model as medicines, terminology, and symptoms.

What changed:
Rebuilt the Conditions page into a searchable condition database: 
[public/workouts.php (line 
1)](/Users/tyemeclifford/Documents/GH/workout/public/workouts.php:1)
Added dynamic condition detail pages, e.g. 
/condition.php?name=Type%202%20Diabetes or /condition.php?id=2: 
[public/condition.php (line 
1)](/Users/tyemeclifford/Documents/GH/workout/public/condition.php:1)
Added condition detail/link lookup helpers: [app/bootstrap.php (line 
1680)](/Users/tyemeclifford/Documents/GH/workout/app/bootstrap.php:1680)
Expanded the seeded condition catalog to 203 conditions with categories, 
tracking notes, and MedlinePlus links: [app/bootstrap.php (line 
636)](/Users/tyemeclifford/Documents/GH/workout/app/bootstrap.php:636)
Updated combined medical search to link conditions internally with “View 
condition”: [public/medical.php (line 
48)](/Users/tyemeclifford/Documents/GH/workout/public/medical.php:48)
Updated related records on symptom/term pages to point to condition 
detail pages.
Updated README route docs: [README.md (line 
21)](/Users/tyemeclifford/Documents/GH/workout/README.md:21)
This commit is contained in:
Ty Clifford
2026-06-30 16:35:27 -04:00
parent 0d492451c7
commit e45324fde4
8 changed files with 462 additions and 42 deletions
+3 -2
View File
@@ -19,7 +19,8 @@ http://127.0.0.1:8080
## Public Routes
- `/` - public medical reference hub for medicines, symptoms, terminology, conditions, research, tracker, and admin links.
- `/workouts.php` - condition-tracking feature page.
- `/workouts.php` - searchable condition reference database.
- `/condition.php?id=1` - dynamic condition detail page backed by the SQLite catalog.
- `/nutrition.php` - medicine catalog feature page.
- `/medicine.php?id=46` - dynamic medicine detail page backed by the SQLite catalog.
- `/symptoms.php` - searchable symptom reference database.
@@ -51,7 +52,7 @@ The app seeds sample profiles, medical terminology, condition summaries, an expa
- Vital logs for blood pressure, pulse, temperature, oxygen saturation, glucose, pain score, symptoms, and notes.
- Lab result records with units, reference ranges, clinician/source notes, and collection dates.
- Symptom journal, allergy list, appointments, and immunization records.
- Medical terminology and condition database with source links.
- Medical terminology and condition databases with source links and dynamic detail pages.
- Searchable symptom database with body-system categories, tracking notes, urgency-context notes, and dynamic detail links.
- Searchable medicine catalog by generic name, active ingredient, chemical name, common brand names, and generic/alternate names.
- Medicine links to RxNorm, DailyMed, PubChem, MedlinePlus, PubMed, and ClinicalTrials.gov.
+239 -2
View File
@@ -580,6 +580,7 @@ function seed_medical_library(PDO $pdo): void
}
}
seed_expanded_condition_catalog($pdo, $created);
seed_medical_symptom_catalog($pdo, $created);
$medicineCount = (int) $pdo->query('SELECT COUNT(*) FROM medication_catalog')->fetchColumn();
@@ -632,6 +633,207 @@ function seed_medical_library(PDO $pdo): void
}
}
function seed_expanded_condition_catalog(PDO $pdo, string $created): void
{
$rows = condition_catalog_rows();
$existing = (int) db_value($pdo, 'SELECT COUNT(*) FROM medical_conditions');
$uniqueTarget = count(array_unique(array_map(static fn(array $row): string => strtolower($row[0]), $rows)));
if ($existing >= $uniqueTarget) {
return;
}
$stmt = $pdo->prepare(
"INSERT INTO medical_conditions
(name, category, overview, common_tracking, source_name, source_url, created_at)
SELECT ?, ?, ?, ?, ?, ?, ?
WHERE NOT EXISTS (SELECT 1 FROM medical_conditions WHERE lower(name) = lower(?))"
);
$startedTransaction = !$pdo->inTransaction();
if ($startedTransaction) {
$pdo->beginTransaction();
}
try {
foreach ($rows as $row) {
$stmt->execute([...$row, $created, $row[0]]);
}
if ($startedTransaction) {
$pdo->commit();
}
} catch (Throwable $exception) {
if ($startedTransaction && $pdo->inTransaction()) {
$pdo->rollBack();
}
throw $exception;
}
}
function condition_catalog_rows(): array
{
$groups = [
[
'Cardiovascular',
'{condition} is a heart, blood vessel, blood-pressure, clotting, or circulation-related condition.',
'Track blood pressure, pulse, weight, swelling, chest symptoms, shortness of breath, medicines, labs, procedures, and care-team instructions.',
['Hypertension', 'High Cholesterol', 'Coronary Artery Disease', 'Angina', 'Heart Attack', 'Heart Failure', 'Atrial Fibrillation', 'Arrhythmia', 'Stroke', 'Transient Ischemic Attack', 'Peripheral Artery Disease', 'Deep Vein Thrombosis', 'Pulmonary Embolism', 'Aortic Aneurysm', 'Raynaud Disease'],
],
[
'Respiratory',
'{condition} is a lung, airway, breathing, or oxygen-related condition.',
'Track cough, breathing effort, oxygen saturation, wheezing, triggers, fever, inhaler use, smoking or exposure history, and activity tolerance.',
['Asthma', 'Chronic Obstructive Pulmonary Disease', 'Pneumonia', 'Bronchitis', 'Sleep Apnea', 'Pulmonary Fibrosis', 'Tuberculosis', 'Cystic Fibrosis', 'Pleural Effusion', 'Respiratory Syncytial Virus Infection', 'COVID-19', 'Influenza', 'Allergic Rhinitis', 'Sinusitis'],
],
[
'Endocrine / metabolic',
'{condition} is a hormone, blood-sugar, thyroid, weight, or metabolism-related condition.',
'Track glucose if relevant, A1C, weight, blood pressure, medicines, energy, thirst, urination, labs, nutrition context, and clinician goals.',
['Type 1 Diabetes', 'Type 2 Diabetes', 'Prediabetes', 'Gestational Diabetes', 'Hypoglycemia', 'Hyperthyroidism', 'Hypothyroidism', 'Hashimoto Thyroiditis', 'Graves Disease', 'Cushing Syndrome', 'Addison Disease', 'Polycystic Ovary Syndrome', 'Obesity', 'Metabolic Syndrome', 'Vitamin D Deficiency', 'Osteoporosis'],
],
[
'Digestive / liver',
'{condition} is a digestive tract, liver, gallbladder, pancreas, or bowel-related condition.',
'Track abdominal pain location, bowel pattern, nausea, vomiting, bleeding, diet triggers, hydration, weight changes, medicines, procedures, and lab or imaging follow-up.',
['Gastroesophageal Reflux Disease', 'Peptic Ulcer Disease', 'Gastritis', 'Irritable Bowel Syndrome', 'Crohn Disease', 'Ulcerative Colitis', 'Celiac Disease', 'Diverticulitis', 'Gallstones', 'Pancreatitis', 'Hepatitis A', 'Hepatitis B', 'Hepatitis C', 'Cirrhosis', 'Fatty Liver Disease', 'Appendicitis', 'Hemorrhoids', 'Constipation', 'Diarrhea'],
],
[
'Kidney / urinary',
'{condition} is a kidney, bladder, urinary tract, or fluid-balance-related condition.',
'Track urination pattern, pain, fever, fluid intake, urine test results, kidney labs, blood pressure, swelling, medicines, and procedure notes.',
['Chronic Kidney Disease', 'Kidney Stones', 'Urinary Tract Infection', 'Bladder Infection', 'Kidney Infection', 'Urinary Incontinence', 'Overactive Bladder', 'Benign Prostatic Hyperplasia', 'Interstitial Cystitis', 'Glomerulonephritis', 'Nephrotic Syndrome'],
],
[
'Neurologic',
'{condition} is a brain, spinal cord, nerve, movement, headache, seizure, or cognition-related condition.',
'Track onset, symptom episodes, weakness, speech or vision changes, headaches, seizures, falls, medicines, triggers, sleep, and safety events.',
['Migraine', 'Epilepsy', 'Multiple Sclerosis', 'Parkinson Disease', 'Alzheimer Disease', 'Dementia', 'Neuropathy', 'Bell Palsy', 'Meningitis', 'Concussion', 'Traumatic Brain Injury', 'Vertigo', 'Amyotrophic Lateral Sclerosis', 'Restless Legs Syndrome', 'Carpal Tunnel Syndrome'],
],
[
'Mental health',
'{condition} is a mood, anxiety, attention, behavior, substance-use, sleep, or psychiatric condition.',
'Track mood, sleep, appetite, concentration, safety concerns, triggers, medicines, therapy notes, substance use, and follow-up plans.',
['Depression', 'Anxiety Disorders', 'Generalized Anxiety Disorder', 'Panic Disorder', 'Bipolar Disorder', 'Post-Traumatic Stress Disorder', 'Obsessive-Compulsive Disorder', 'Attention Deficit Hyperactivity Disorder', 'Autism Spectrum Disorder', 'Schizophrenia', 'Eating Disorders', 'Alcohol Use Disorder', 'Substance Use Disorder', 'Insomnia'],
],
[
'Musculoskeletal / rheumatology',
'{condition} is a bone, joint, muscle, spine, autoimmune, or inflammation-related condition.',
'Track pain score, stiffness, swelling, range of motion, flares, activity limits, injuries, medicines, injections, imaging, and function.',
['Osteoarthritis', 'Rheumatoid Arthritis', 'Gout', 'Fibromyalgia', 'Lupus', 'Ankylosing Spondylitis', 'Psoriatic Arthritis', 'Bursitis', 'Tendinitis', 'Back Pain', 'Sciatica', 'Scoliosis', 'Fracture', 'Sprain', 'Carpal Tunnel Syndrome', 'Osteomyelitis'],
],
[
'Skin / dermatology',
'{condition} is a skin, hair, nail, wound, allergy, or visible-tissue condition.',
'Track location, appearance, spread, itch, pain, fever, drainage, new medicines, exposures, photos, treatment response, and recurrence.',
['Acne', 'Eczema', 'Psoriasis', 'Rosacea', 'Hives', 'Cellulitis', 'Shingles', 'Cold Sores', 'Fungal Skin Infection', 'Warts', 'Vitiligo', 'Alopecia Areata', 'Pressure Ulcers', 'Melanoma', 'Skin Cancer', 'Seborrheic Dermatitis'],
],
[
'Infectious disease',
'{condition} is an infection or infectious-disease-related condition.',
'Track fever, symptom onset, exposures, test results, isolation guidance, medicines, completion dates, hydration, and worsening symptoms.',
['Common Cold', 'Strep Throat', 'Mononucleosis', 'Lyme Disease', 'Sepsis', 'HIV', 'Herpes', 'Chickenpox', 'Measles', 'Mumps', 'Whooping Cough', 'Food Poisoning', 'MRSA Infection', 'C. difficile Infection'],
],
[
'Blood / immune',
'{condition} is a blood, clotting, anemia, immune, or allergy-related condition.',
'Track CBC results, bleeding or bruising, fatigue, infections, triggers, exposures, medicines, transfusions, and specialist follow-up.',
['Anemia', 'Iron Deficiency Anemia', 'Sickle Cell Disease', 'Hemophilia', 'Thrombocytopenia', 'Leukemia', 'Lymphoma', 'Multiple Myeloma', 'Allergies', 'Anaphylaxis', 'Autoimmune Diseases', 'Immunodeficiency Disorders'],
],
[
'Eye / ear / nose / throat',
'{condition} is an eye, ear, sinus, mouth, dental, hearing, or throat condition.',
'Track pain, side affected, vision or hearing changes, discharge, fever, allergies, dental symptoms, medicines, and procedure notes.',
['Conjunctivitis', 'Cataracts', 'Glaucoma', 'Macular Degeneration', 'Diabetic Eye Disease', 'Dry Eye', 'Ear Infection', 'Tinnitus', 'Hearing Loss', 'Tonsillitis', 'Dental Cavities', 'Gum Disease'],
],
[
'Reproductive / pregnancy',
'{condition} is a reproductive, menstrual, pregnancy, breast, prostate, or sexual-health-related condition.',
'Track cycle timing, bleeding, pelvic pain, discharge, pregnancy context, urinary symptoms, test results, medicines, and clinician instructions.',
['Endometriosis', 'Uterine Fibroids', 'Ovarian Cysts', 'Menopause', 'Pregnancy', 'Preeclampsia', 'Breast Cancer', 'Prostate Cancer', 'Prostatitis', 'Erectile Dysfunction', 'Sexually Transmitted Infections', 'Infertility'],
],
[
'Cancer / oncology',
'{condition} is a cancer, tumor, screening, treatment, or survivorship-related condition.',
'Track diagnosis details, stage if known, treatments, side effects, labs, imaging, symptoms, appointments, medicines, and care-team plans.',
['Lung Cancer', 'Colorectal Cancer', 'Breast Cancer', 'Prostate Cancer', 'Skin Cancer', 'Melanoma', 'Pancreatic Cancer', 'Kidney Cancer', 'Bladder Cancer', 'Thyroid Cancer', 'Ovarian Cancer', 'Cervical Cancer'],
],
[
'General medicine',
'{condition} is a general medical condition or care topic that may involve multiple body systems.',
'Track symptoms, onset, severity, medicines, vitals, labs, appointments, self-care steps, and clinician guidance.',
['Pain and Inflammation', 'Chronic Pain', 'Fever', 'Dehydration', 'Malnutrition', 'Falls', 'Frailty', 'Medication Side Effects', 'Adverse Drug Reaction', 'Postoperative Recovery'],
],
];
$rows = [];
foreach ($groups as [$category, $overviewTemplate, $tracking, $names]) {
foreach ($names as $name) {
$rows[] = [
$name,
$category,
str_replace('{condition}', $name, $overviewTemplate),
$tracking,
'MedlinePlus',
condition_source_url($name),
];
}
}
return $rows;
}
function condition_source_url(string $name): string
{
$map = [
'Alzheimer Disease' => 'https://medlineplus.gov/alzheimersdisease.html',
'Anemia' => 'https://medlineplus.gov/anemia.html',
'Anxiety Disorders' => 'https://medlineplus.gov/anxiety.html',
'Asthma' => 'https://medlineplus.gov/asthma.html',
'Back Pain' => 'https://medlineplus.gov/backpain.html',
'Breast Cancer' => 'https://medlineplus.gov/breastcancer.html',
'Chronic Kidney Disease' => 'https://medlineplus.gov/chronickidneydisease.html',
'Chronic Obstructive Pulmonary Disease' => 'https://medlineplus.gov/copd.html',
'COVID-19' => 'https://medlineplus.gov/covid19coronavirusdisease2019.html',
'Depression' => 'https://medlineplus.gov/depression.html',
'Diarrhea' => 'https://medlineplus.gov/diarrhea.html',
'Eczema' => 'https://medlineplus.gov/eczema.html',
'Epilepsy' => 'https://medlineplus.gov/epilepsy.html',
'Fibromyalgia' => 'https://medlineplus.gov/fibromyalgia.html',
'Gastroesophageal Reflux Disease' => 'https://medlineplus.gov/gerd.html',
'Gout' => 'https://medlineplus.gov/gout.html',
'Heart Attack' => 'https://medlineplus.gov/heartattack.html',
'Heart Failure' => 'https://medlineplus.gov/heartfailure.html',
'Hepatitis C' => 'https://medlineplus.gov/hepatitisc.html',
'High Cholesterol' => 'https://medlineplus.gov/cholesterol.html',
'HIV' => 'https://medlineplus.gov/hivaids.html',
'Hypertension' => 'https://medlineplus.gov/highbloodpressure.html',
'Influenza' => 'https://medlineplus.gov/flu.html',
'Insomnia' => 'https://medlineplus.gov/insomnia.html',
'Irritable Bowel Syndrome' => 'https://medlineplus.gov/irritablebowelsyndrome.html',
'Kidney Stones' => 'https://medlineplus.gov/kidneystones.html',
'Lupus' => 'https://medlineplus.gov/lupus.html',
'Migraine' => 'https://medlineplus.gov/migraine.html',
'Multiple Sclerosis' => 'https://medlineplus.gov/multiplesclerosis.html',
'Obesity' => 'https://medlineplus.gov/obesity.html',
'Osteoarthritis' => 'https://medlineplus.gov/osteoarthritis.html',
'Osteoporosis' => 'https://medlineplus.gov/osteoporosis.html',
'Parkinson Disease' => 'https://medlineplus.gov/parkinsonsdisease.html',
'Pneumonia' => 'https://medlineplus.gov/pneumonia.html',
'Pregnancy' => 'https://medlineplus.gov/pregnancy.html',
'Psoriasis' => 'https://medlineplus.gov/psoriasis.html',
'Rheumatoid Arthritis' => 'https://medlineplus.gov/rheumatoidarthritis.html',
'Shingles' => 'https://medlineplus.gov/shingles.html',
'Sickle Cell Disease' => 'https://medlineplus.gov/sicklecelldisease.html',
'Sleep Apnea' => 'https://medlineplus.gov/sleepapnea.html',
'Stroke' => 'https://medlineplus.gov/stroke.html',
'Type 1 Diabetes' => 'https://medlineplus.gov/diabetestype1.html',
'Type 2 Diabetes' => 'https://medlineplus.gov/diabetestype2.html',
'Urinary Tract Infection' => 'https://medlineplus.gov/urinarytractinfections.html',
];
return $map[$name] ?? 'https://medlineplus.gov/search/?query=' . rawurlencode($name);
}
function seed_medical_symptom_catalog(PDO $pdo, string $created): void
{
$rows = symptom_catalog_rows();
@@ -1475,6 +1677,11 @@ function symptom_detail_path(array $symptom): string
return '/symptom.php?id=' . rawurlencode((string) ($symptom['id'] ?? ''));
}
function condition_detail_path(array $condition): string
{
return '/condition.php?id=' . rawurlencode((string) ($condition['id'] ?? ''));
}
function find_medication_catalog_item(PDO $pdo, array $query): ?array
{
$id = filter_var($query['id'] ?? null, FILTER_VALIDATE_INT);
@@ -1529,6 +1736,29 @@ function find_medical_term_item(PDO $pdo, array $query): ?array
);
}
function find_medical_condition_item(PDO $pdo, array $query): ?array
{
$id = filter_var($query['id'] ?? null, FILTER_VALIDATE_INT);
if ($id !== false && $id > 0) {
return db_one($pdo, 'SELECT * FROM medical_conditions WHERE id = ?', [$id]);
}
$name = trim((string) ($query['name'] ?? $query['condition'] ?? $query['q'] ?? ''));
if ($name === '') {
return null;
}
return db_one(
$pdo,
"SELECT *
FROM medical_conditions
WHERE lower(name) = lower(?)
ORDER BY name
LIMIT 1",
[$name]
);
}
function find_medical_symptom_item(PDO $pdo, array $query): ?array
{
$id = filter_var($query['id'] ?? null, FILTER_VALIDATE_INT);
@@ -2029,7 +2259,7 @@ function library_search_payload(array $query): array
$like = '%' . $search . '%';
$termParams = array_fill(0, 5, $like);
$conditionParams = array_fill(0, 4, $like);
$conditionParams = [...array_fill(0, 4, $like), $search, $search . '%', $like];
$symptomParams = [...array_fill(0, 8, $like), $search, $search . '%', $like];
$medicineParams = array_fill(0, 10, $like);
$studyParams = array_fill(0, 6, $like);
@@ -2049,7 +2279,14 @@ function library_search_payload(array $query): array
$pdo,
"SELECT * FROM medical_conditions
WHERE name LIKE ? OR category LIKE ? OR overview LIKE ? OR common_tracking LIKE ?
ORDER BY category, name
ORDER BY
CASE
WHEN lower(name) = lower(?) THEN 0
WHEN name LIKE ? THEN 1
WHEN overview LIKE ? THEN 2
ELSE 3
END,
category, name
LIMIT {$limit}",
$conditionParams
),
Binary file not shown.
+145
View File
@@ -0,0 +1,145 @@
<?php
declare(strict_types=1);
require __DIR__ . '/../app/bootstrap.php';
$pdo = app_db();
$condition = find_medical_condition_item($pdo, $_GET);
$pageTitle = $condition
? (string) $condition['name'] . ' | Condition Detail | Neon Medical Tracker'
: 'Condition Not Found | Neon Medical Tracker';
$activePage = 'conditions';
$relatedSymptoms = [];
$relatedTerms = [];
$relatedMedicines = [];
$relatedStudies = [];
if ($condition) {
$related = library_search_payload(['q' => (string) $condition['name'], 'limit' => 8]);
$relatedSymptoms = $related['medicalSymptoms'];
$relatedTerms = $related['medicalTerms'];
$relatedMedicines = $related['medicationCatalog'];
$relatedStudies = $related['researchStudies'];
} else {
http_response_code(404);
}
require __DIR__ . '/partials/site-header.php';
?>
<main>
<?php if (!$condition): ?>
<section class="admin-public-shell record-shell">
<p class="site-eyebrow">Condition database</p>
<h1>Condition not found.</h1>
<p>The requested condition link does not match a current database record.</p>
<a class="site-primary" href="/workouts.php">Search conditions</a>
</section>
<?php else: ?>
<section class="admin-public-shell record-shell">
<div class="record-heading">
<div>
<p class="site-eyebrow">Condition detail</p>
<h1><?= htmlspecialchars((string) $condition['name'], ENT_QUOTES) ?></h1>
<p><?= htmlspecialchars((string) $condition['overview'], ENT_QUOTES) ?></p>
</div>
<div class="record-actions">
<a class="site-primary" href="/tracker.php">Open tracker</a>
<a class="site-secondary" href="/workouts.php?q=<?= rawurlencode((string) $condition['name']) ?>">Condition search</a>
</div>
</div>
<div class="record-meta">
<span><?= htmlspecialchars((string) $condition['category'], ENT_QUOTES) ?></span>
<span>ID <?= htmlspecialchars((string) $condition['id'], ENT_QUOTES) ?></span>
</div>
</section>
<section class="admin-public-shell">
<div class="record-detail-grid">
<article class="record-field wide">
<span>Common Tracking</span>
<p><?= htmlspecialchars((string) $condition['common_tracking'], ENT_QUOTES) ?></p>
</article>
<article class="record-field wide">
<span>Source</span>
<div class="source-links">
<a href="<?= htmlspecialchars((string) $condition['source_url'], ENT_QUOTES) ?>"><?= htmlspecialchars((string) $condition['source_name'], ENT_QUOTES) ?></a>
</div>
</article>
</div>
</section>
<?php if ($relatedSymptoms || $relatedTerms || $relatedMedicines || $relatedStudies): ?>
<section class="admin-public-shell">
<div class="site-section-heading">
<p class="site-eyebrow">Connected records</p>
<h2>Database matches for this condition</h2>
</div>
<div class="library-list">
<?php foreach ($relatedSymptoms as $symptom): ?>
<article class="library-row">
<div class="library-row-main">
<h3><?= htmlspecialchars((string) $symptom['name'], ENT_QUOTES) ?></h3>
<p><?= htmlspecialchars((string) $symptom['plain_language_description'], ENT_QUOTES) ?></p>
<div class="library-row-meta">
<span><?= htmlspecialchars((string) $symptom['category'], ENT_QUOTES) ?></span>
<span><?= htmlspecialchars((string) ($symptom['body_system'] ?: 'Symptom'), ENT_QUOTES) ?></span>
</div>
</div>
<div class="library-row-actions">
<a class="site-secondary" href="<?= htmlspecialchars(symptom_detail_path($symptom), ENT_QUOTES) ?>">View symptom</a>
</div>
</article>
<?php endforeach; ?>
<?php foreach ($relatedTerms as $term): ?>
<article class="library-row">
<div class="library-row-main">
<h3><?= htmlspecialchars((string) $term['term'], ENT_QUOTES) ?></h3>
<p><?= htmlspecialchars((string) $term['plain_language_definition'], ENT_QUOTES) ?></p>
<div class="library-row-meta">
<span><?= htmlspecialchars((string) $term['category'], ENT_QUOTES) ?></span>
</div>
</div>
<div class="library-row-actions">
<a class="site-secondary" href="<?= htmlspecialchars(term_detail_path($term), ENT_QUOTES) ?>">View term</a>
</div>
</article>
<?php endforeach; ?>
<?php foreach ($relatedMedicines as $medicine): ?>
<article class="library-row">
<div class="library-row-main">
<h3><?= htmlspecialchars(ucfirst((string) $medicine['generic_name']), ENT_QUOTES) ?></h3>
<p><?= htmlspecialchars((string) ($medicine['common_use'] ?: $medicine['class_name']), ENT_QUOTES) ?></p>
<div class="library-row-meta">
<span><?= htmlspecialchars((string) ($medicine['class_name'] ?: 'Medication'), ENT_QUOTES) ?></span>
</div>
</div>
<div class="library-row-actions">
<a class="site-secondary" href="<?= htmlspecialchars(medicine_detail_path($medicine), ENT_QUOTES) ?>">View medicine</a>
</div>
</article>
<?php endforeach; ?>
<?php foreach ($relatedStudies as $study): ?>
<article class="library-row">
<div class="library-row-main">
<h3><?= htmlspecialchars((string) $study['title'], ENT_QUOTES) ?></h3>
<p><?= htmlspecialchars((string) $study['summary'], ENT_QUOTES) ?></p>
<div class="library-row-meta">
<span><?= htmlspecialchars((string) $study['category'], ENT_QUOTES) ?></span>
<span><?= htmlspecialchars((string) $study['related_medicine'], ENT_QUOTES) ?></span>
</div>
</div>
<div class="library-row-actions">
<a class="site-secondary" href="<?= htmlspecialchars((string) $study['source_url'], ENT_QUOTES) ?>">Study link</a>
</div>
</article>
<?php endforeach; ?>
</div>
</section>
<?php endif; ?>
<?php endif; ?>
</main>
<?php require __DIR__ . '/partials/site-footer.php'; ?>
+18 -11
View File
@@ -45,22 +45,29 @@ require __DIR__ . '/partials/site-header.php';
<article><strong><?= count($studies) ?></strong><span>study links</span></article>
</div>
<div class="detail-grid">
<?php foreach ($conditions as $condition): ?>
<article>
<h2><?= htmlspecialchars($condition['name'], ENT_QUOTES) ?></h2>
<p><strong><?= htmlspecialchars($condition['category'], ENT_QUOTES) ?></strong></p>
<p><?= htmlspecialchars($condition['overview'], ENT_QUOTES) ?></p>
<p><?= htmlspecialchars($condition['common_tracking'], ENT_QUOTES) ?></p>
<a class="site-secondary" href="<?= htmlspecialchars($condition['source_url'], ENT_QUOTES) ?>">Source</a>
</article>
<?php endforeach; ?>
</div>
<?php if (!$conditions): ?>
<article class="empty-state">
<h3>No conditions found.</h3>
<p>Try another medicine, symptom, lab, or tracking term.</p>
</article>
<?php else: ?>
<div class="library-list">
<?php foreach ($conditions as $condition): ?>
<article class="library-row">
<div class="library-row-main">
<h3><?= htmlspecialchars((string) $condition['name'], ENT_QUOTES) ?></h3>
<p><?= htmlspecialchars((string) $condition['overview'], ENT_QUOTES) ?></p>
<div class="library-row-meta">
<span><?= htmlspecialchars((string) $condition['category'], ENT_QUOTES) ?></span>
<span><?= htmlspecialchars((string) $condition['source_name'], ENT_QUOTES) ?></span>
</div>
</div>
<div class="library-row-actions">
<a class="site-primary" href="<?= htmlspecialchars(condition_detail_path($condition), ENT_QUOTES) ?>">View condition</a>
</div>
</article>
<?php endforeach; ?>
</div>
<?php endif; ?>
</section>
+1 -1
View File
@@ -106,7 +106,7 @@ require __DIR__ . '/partials/site-header.php';
</div>
</div>
<div class="library-row-actions">
<a class="site-secondary" href="<?= htmlspecialchars((string) $condition['source_url'], ENT_QUOTES) ?>">Source</a>
<a class="site-secondary" href="<?= htmlspecialchars(condition_detail_path($condition), ENT_QUOTES) ?>">View condition</a>
</div>
</article>
<?php endforeach; ?>
+1 -1
View File
@@ -84,7 +84,7 @@ require __DIR__ . '/partials/site-header.php';
</div>
</div>
<div class="library-row-actions">
<a class="site-secondary" href="<?= htmlspecialchars((string) $condition['source_url'], ENT_QUOTES) ?>">Source</a>
<a class="site-secondary" href="<?= htmlspecialchars(condition_detail_path($condition), ENT_QUOTES) ?>">View condition</a>
</div>
</article>
<?php endforeach; ?>
+53 -23
View File
@@ -4,39 +4,69 @@ declare(strict_types=1);
require __DIR__ . '/../app/bootstrap.php';
$pdo = app_db();
$pageTitle = 'Condition Tracking | Neon Medical Tracker';
$pageTitle = 'Condition Database | Neon Medical Tracker';
$activePage = 'conditions';
$conditions = db_all($pdo, 'SELECT * FROM medical_conditions ORDER BY category, name');
$photo = 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Cycling_in_Amsterdam_%28893%29.jpg/1280px-Cycling_in_Amsterdam_%28893%29.jpg';
$searchQuery = trim((string) ($_GET['q'] ?? ''));
$library = library_search_payload(['q' => $searchQuery, 'limit' => 500]);
$conditions = $library['medicalConditions'];
$totalConditions = (int) db_value($pdo, 'SELECT COUNT(*) FROM medical_conditions');
require __DIR__ . '/partials/site-header.php';
?>
<main>
<section class="detail-hero">
<div>
<p class="site-eyebrow">Condition tracking</p>
<h1>Track readings, symptoms, labs, and medications by condition.</h1>
<p>Use structured logs for blood pressure, glucose, pain, oxygen, temperature, lab results, medications, and notes. The condition library links back to NIH/NLM patient-information sources.</p>
<a class="site-primary" href="/tracker.php">Open tracker</a>
<section class="admin-public-shell">
<div class="site-section-heading">
<p class="site-eyebrow">Condition database</p>
<h1>Search conditions by name, category, overview, and tracking context.</h1>
<p>Condition entries are concise reference summaries with MedlinePlus source links. They support tracking and discussion, not diagnosis or treatment decisions.</p>
</div>
<form class="library-search" method="get" action="/workouts.php">
<label>
<span>Search conditions</span>
<input name="q" value="<?= htmlspecialchars($searchQuery, ENT_QUOTES) ?>" placeholder="Try diabetes, asthma, migraine, kidney, depression, arthritis">
</label>
<button class="site-primary" type="submit">Search</button>
<?php if ($searchQuery !== ''): ?>
<a class="site-secondary" href="/workouts.php">Clear</a>
<?php endif; ?>
</form>
<div class="library-stats" aria-label="Condition result count">
<article><strong><?= count($conditions) ?></strong><span><?= $searchQuery === '' ? 'shown of ' . number_format($totalConditions) . ' conditions' : 'condition results' ?></span></article>
</div>
<figure>
<img src="<?= htmlspecialchars($photo, ENT_QUOTES) ?>" alt="People cycling outdoors">
<figcaption>
Photo: <a href="https://commons.wikimedia.org/wiki/File:Cycling_in_Amsterdam_(893).jpg">Cycling in Amsterdam (893)</a>
by FaceMePLS, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC BY-SA 2.0</a>.
</figcaption>
</figure>
</section>
<section class="detail-grid">
<section class="admin-public-shell">
<div class="site-section-heading">
<p class="site-eyebrow">Catalog directory</p>
<h2>Condition records</h2>
</div>
<?php if (!$conditions): ?>
<article class="empty-state">
<h3>No conditions found.</h3>
<p>Try a diagnosis name, body system, symptom, medicine, lab, or tracking phrase.</p>
</article>
<?php else: ?>
<div class="library-list">
<?php foreach ($conditions as $condition): ?>
<article>
<h2><?= htmlspecialchars($condition['name'], ENT_QUOTES) ?></h2>
<p><strong><?= htmlspecialchars($condition['category'], ENT_QUOTES) ?></strong></p>
<p><?= htmlspecialchars($condition['overview'], ENT_QUOTES) ?></p>
<p><?= htmlspecialchars($condition['common_tracking'], ENT_QUOTES) ?></p>
<a class="site-secondary" href="<?= htmlspecialchars($condition['source_url'], ENT_QUOTES) ?>">MedlinePlus</a>
<article class="library-row">
<div class="library-row-main">
<h3><?= htmlspecialchars((string) $condition['name'], ENT_QUOTES) ?></h3>
<p><?= htmlspecialchars((string) $condition['overview'], ENT_QUOTES) ?></p>
<div class="library-row-meta">
<span><?= htmlspecialchars((string) $condition['category'], ENT_QUOTES) ?></span>
<span><?= htmlspecialchars((string) $condition['source_name'], ENT_QUOTES) ?></span>
</div>
</div>
<div class="library-row-actions">
<a class="site-primary" href="<?= htmlspecialchars(condition_detail_path($condition), ENT_QUOTES) ?>">View condition</a>
</div>
</article>
<?php endforeach; ?>
</div>
<?php endif; ?>
</section>
</main>
<?php require __DIR__ . '/partials/site-footer.php'; ?>