diff --git a/app/src/main/assets/assets/ic_chart.svg b/app/src/main/assets/assets/ic_chart.svg new file mode 100644 index 0000000..af6fea6 --- /dev/null +++ b/app/src/main/assets/assets/ic_chart.svg @@ -0,0 +1,4 @@ + diff --git a/app/src/main/assets/assets/main.js b/app/src/main/assets/assets/main.js index 0c499a6..4539c12 100644 --- a/app/src/main/assets/assets/main.js +++ b/app/src/main/assets/assets/main.js @@ -1,77 +1,136 @@ // function to handle tab switching for any table function activateTab(tableContainer, tabIndex) { - if (!tableContainer) return; + if (!tableContainer) return; - tableContainer.querySelectorAll('.tab-button, .tab, .tab, .tab').forEach(tab => { - tab.classList.remove('active-option', 'active-tab'); + tableContainer + .querySelectorAll(".tab-button, .tab, .tab, .tab") + .forEach((tab) => { + tab.classList.remove("active-option", "active-tab"); }); - - tableContainer.querySelectorAll('.option-content, .tab-content, .tab-content, .tab-content').forEach(content => { - content.classList.remove('active-option', 'active-tab'); + + tableContainer + .querySelectorAll( + ".option-content, .tab-content, .tab-content, .tab-content" + ) + .forEach((content) => { + content.classList.remove("active-option", "active-tab"); }); - // Add active class to selected tab and content - const selectedTab = tableContainer.querySelectorAll('.tab-button, .tab, .tab, .tab')[tabIndex]; - const selectedContent = tableContainer.querySelectorAll('.option-content, .tab-content, .tab-content, .tab-content')[tabIndex]; - - if (selectedTab) { - if (selectedTab.classList.contains('tab')) { - selectedTab.classList.add('active-tab'); - } else if (selectedTab.classList.contains('tab-button')) { - selectedTab.classList.add('active-option'); - } else if (selectedTab.classList.contains('tab')) { - selectedTab.classList.add('active-tab'); - } else if (selectedTab.classList.contains('tab')) { - selectedTab.classList.add('active-tab'); - } + // Add active class to selected tab and content + const selectedTab = tableContainer.querySelectorAll( + ".tab-button, .tab, .tab, .tab" + )[tabIndex]; + const selectedContent = tableContainer.querySelectorAll( + ".option-content, .tab-content, .tab-content, .tab-content" + )[tabIndex]; + + if (selectedTab) { + if (selectedTab.classList.contains("tab")) { + selectedTab.classList.add("active-tab"); + } else if (selectedTab.classList.contains("tab-button")) { + selectedTab.classList.add("active-option"); + } else if (selectedTab.classList.contains("tab")) { + selectedTab.classList.add("active-tab"); + } else if (selectedTab.classList.contains("tab")) { + selectedTab.classList.add("active-tab"); } - - if (selectedContent) { - if (selectedContent.classList.contains('tab-content')) { - selectedContent.classList.add('active-tab'); - } else if (selectedContent.classList.contains('option-content')) { - selectedContent.classList.add('active-option'); - } else if (selectedContent.classList.contains('tab-content')) { - selectedContent.classList.add('active-tab'); - } else if (selectedContent.classList.contains('tab-content')) { - selectedContent.classList.add('active-tab'); - } + } + + if (selectedContent) { + if (selectedContent.classList.contains("tab-content")) { + selectedContent.classList.add("active-tab"); + } else if (selectedContent.classList.contains("option-content")) { + selectedContent.classList.add("active-option"); + } else if (selectedContent.classList.contains("tab-content")) { + selectedContent.classList.add("active-tab"); + } else if (selectedContent.classList.contains("tab-content")) { + selectedContent.classList.add("active-tab"); } + } } // Function to handle tab switching with event function handleTabSwitch(event, tabIndex) { - // Get the clicked button from the event - const clickedButton = event.currentTarget; - - const tableContainer = clickedButton.closest('.uk-overflow-auto'); - if (!tableContainer) return; - - // Get all tab buttons in this container - const tabButtons = tableContainer.querySelectorAll('.tab-button, .tab, .tab, .tab'); - - // Find the index of the clicked button within its container - const clickedIndex = Array.from(tabButtons).indexOf(clickedButton); - - // Generate a unique ID for the container if it doesn't have one - if (!tableContainer.id) { - tableContainer.id = 'table-' + Math.random().toString(36).substr(2, 9); - } - - // Switch to the correct tab - activateTab(tableContainer, clickedIndex); + // Get the clicked button from the event + const clickedButton = event.currentTarget; + + const tableContainer = clickedButton.closest(".uk-overflow-auto"); + if (!tableContainer) return; + + // Get all tab buttons in this container + const tabButtons = tableContainer.querySelectorAll( + ".tab-button, .tab, .tab, .tab" + ); + + // Find the index of the clicked button within its container + const clickedIndex = Array.from(tabButtons).indexOf(clickedButton); + + // Generate a unique ID for the container if it doesn't have one + if (!tableContainer.id) { + tableContainer.id = "table-" + Math.random().toString(36).substr(2, 9); + } + + // Switch to the correct tab + activateTab(tableContainer, clickedIndex); } function switchTab(tabIndex, event) { - handleTabSwitch(event, tabIndex); + handleTabSwitch(event, tabIndex); } // For Dropdown Togglers function toggleItem(clickedTitle) { - const itemContent = clickedTitle.nextElementSibling; - - itemContent.classList.toggle('active'); + const itemContent = clickedTitle.nextElementSibling; + + itemContent.classList.toggle("active"); + + const chevronUp = clickedTitle.querySelector(".chevron-up"); + chevronUp.classList.toggle("active"); +} + +document.addEventListener("DOMContentLoaded", function () { + const tooltips = document.querySelectorAll(".info-icon"); + + document.addEventListener("click", function (event) { + if (!event.target.closest(".info-icon")) { + document.querySelectorAll(".info-icon.active").forEach((activeIcon) => { + activeIcon.classList.remove("active"); + }); + } + }); - const chevronUp = clickedTitle.querySelector('.chevron-up'); - chevronUp.classList.toggle('active'); -} \ No newline at end of file + tooltips.forEach(function (icon) { + let tooltip = icon.querySelector(".tooltip"); + if (!tooltip) { + tooltip = document.createElement("div"); + tooltip.className = "tooltip"; + tooltip.textContent = + icon.getAttribute("data-tooltip") || "Additional information"; + + // Get positioning class from data attribute + const positionClass = + icon.getAttribute("data-tooltip-position") || "tooltip-center"; + tooltip.classList.add(positionClass); + + icon.appendChild(tooltip); + } + + let isTooltipVisible = false; + + icon.addEventListener("click", function (event) { + event.stopPropagation(); + + document.querySelectorAll(".info-icon.active").forEach((activeIcon) => { + if (activeIcon !== icon) { + activeIcon.classList.remove("active"); + const otherTooltip = activeIcon.querySelector(".tooltip"); + if (otherTooltip) otherTooltip.style.display = "none"; + } + }); + + isTooltipVisible = !this.classList.contains("active"); + this.classList.toggle("active"); + tooltip.style.display = isTooltipVisible ? "block" : "none"; + }); + }); +}); diff --git a/app/src/main/assets/assets/style.css b/app/src/main/assets/assets/style.css index 9887946..2584da9 100644 --- a/app/src/main/assets/assets/style.css +++ b/app/src/main/assets/assets/style.css @@ -1,11 +1,11 @@ /* Import from the UIkit.css file */ :root { color-scheme: light dark; - --primary-color: #5182FF; - --white-color: #FFFFFF; - --yellow-color: #FFC107; - --green-color: #009C8E; - --background-color: #F7F7F7; + --primary-color: #5182ff; + --white-color: #ffffff; + --yellow-color: #ffc107; + --green-color: #009c8e; + --background-color: #f7f7f7; --background-color-secondary: var(--white-color); --body-color: #747474; --body-color-secondary: #000; @@ -20,53 +20,53 @@ --tab-box-shadow: 0px 0px 32px 0px rgba(187, 187, 187, 0.25); --transition-duration: 500ms; --list-title-color: var(--yellow-color); - --divider-color: #C6C6C8; + --divider-color: #c6c6c8; --last-updated-color: #636366; } @media screen and (prefers-color-scheme: dark) { :root { - --primary-color: #7090FD; - --white-color: #FFFFFF; - --yellow-color: #FFC107; - --green-color: #009C8E; - --background-color: #2A2A2A; + --primary-color: #7090fd; + --white-color: #ffffff; + --yellow-color: #ffc107; + --green-color: #009c8e; + --background-color: #2a2a2a; --background-color-secondary: #343434; - --body-color: #D5D5D5; - --body-color-secondary: #F9F9F9; + --body-color: #d5d5d5; + --body-color-secondary: #f9f9f9; --link-color: var(--primary-color); --table-title-color: var(--primary-color); --titles-color: var(--white-color); --inactive-tab-color: var(--background-color-secondary); - --inactive-tab-text-color: #ECECEC; + --inactive-tab-text-color: #ececec; --active-tab-color: var(--primary-color); - --active-tab-text-color: #F9F9F9; + --active-tab-text-color: #f9f9f9; --tab-radius: 5px; --tab-box-shadow: 0px 0px 32px 0px rgba(0, 0, 0, 0.2); --transition-duration: 500ms; --list-title-color: var(--yellow-color); - --divider-color: #C6C6C8; - --last-updated-color: #B9B9B9; + --divider-color: #c6c6c8; + --last-updated-color: #b9b9b9; } } /* Keyframes + Animations */ @keyframes fadeIn { - from { + from { opacity: 0; } - to { + to { opacity: 1; } } @keyframes slideInTop { - from { + from { opacity: 0; /* height: 0; */ transform: translateY(-100%); } - to { + to { opacity: 1; /* height: auto; */ transform: translateY(0); @@ -74,12 +74,12 @@ } @keyframes slideOutTop { - from { + from { opacity: 1; height: auto; transform: translateY(0); } - to { + to { opacity: 0; height: 0; transform: translateY(-20%); @@ -87,44 +87,44 @@ } @keyframes slideInLeft { - from { + from { opacity: 0; transform: translateX(-10%); } - to { + to { opacity: 1; transform: translateX(0); } } @keyframes slideOutRight { - from { + from { opacity: 1; transform: translateX(0); } - to { + to { opacity: 0; transform: translateX(-10%); } } @keyframes slideInBottom { - from { + from { opacity: 0; transform: translateY(10%); } - to { + to { opacity: 1; transform: translateY(0); } } @keyframes slideOutBottom { - from { + from { opacity: 1; transform: translateY(0); } - to { + to { opacity: 0; transform: translateY(-10%); } @@ -132,7 +132,9 @@ html { /* 1 */ - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1rem; font-weight: normal; line-height: 1.5; @@ -182,7 +184,12 @@ strong { } /* Headings */ -h1, h2, h3, h4, h5, h6 { +h1, +h2, +h3, +h4, +h5, +h6 { color: var(--titles-color); } @@ -204,9 +211,9 @@ img { } .ic_title_icon { - height: 50px !important; - width: 50px !important; - object-fit: fill !important; + height: 50px !important; + width: 50px !important; + object-fit: fill !important; } .chapter-header { @@ -398,48 +405,7 @@ hr { .uk-table-small .uk-table-link > a { padding: 0.625rem 0.75rem; } -/* Responsive table - ========================================================================== */ -/* Phone landscape and smaller */ -@media (max-width: 959px) { - .uk-table-responsive, - .uk-table-responsive tbody, - .uk-table-responsive th, - .uk-table-responsive td, - .uk-table-responsive tr { - display: block; - } - .uk-table-responsive thead { - display: none; - } - .uk-table-responsive th, - .uk-table-responsive td { - width: auto !important; - max-width: none !important; - min-width: 0 !important; - overflow: visible !important; - white-space: normal !important; - } - .uk-table-responsive th:not(:first-child):not(.uk-table-link), - .uk-table-responsive td:not(:first-child):not(.uk-table-link), - .uk-table-responsive .uk-table-link:not(:first-child) > a { - padding-top: 5px !important; - } - .uk-table-responsive th:not(:last-child):not(.uk-table-link), - .uk-table-responsive td:not(:last-child):not(.uk-table-link), - .uk-table-responsive .uk-table-link:not(:last-child) > a { - padding-bottom: 5px !important; - } - .uk-table-justify.uk-table-responsive th, - .uk-table-justify.uk-table-responsive td { - padding-left: 0; - padding-right: 0; - } - .uk-tabs-container .tabs { - justify-content: center !important; /* Center tabs on small screens */ - } -} .uk-table tbody tr { transition: background-color 0.1s linear; } @@ -470,11 +436,16 @@ th.uk-text-truncate, td.uk-text-truncate { max-width: 0; } +.uk-text-wrap { + white-space: wrap; +} /* End of import from UIkit.css file */ -table, td, th { - border: 1px solid #adadad; +table, +td, +th { + border: 1px solid #adadad; } .res-width { @@ -482,103 +453,103 @@ table, td, th { } .border-left-hidden { - border-left: hidden; + border-left: hidden; } .border-right-hidden { - border-right: hidden; + border-right: hidden; } .border-left-right-hidden { - border-right: hidden; - border-left: hidden; + border-right: hidden; + border-left: hidden; } .border-bottom-left-right-hidden { - border-right: hidden; - border-bottom: hidden; - border-left: hidden; + border-right: hidden; + border-bottom: hidden; + border-left: hidden; } .reddish { - color: var(--table-title-color); + color: var(--table-title-color); } .orange { - color: var(--link-color); + color: var(--link-color); } a { - font-style: normal; - text-decoration: underline !important; - color: var(--link-color) !important; + font-style: normal; + text-decoration: underline !important; + color: var(--link-color) !important; } .uk-table th { - padding: 1rem 0.75rem; - text-align: left; - vertical-align: bottom; - font-size: 1rem; - font-weight: bold; - color: var(--table-title-color); - text-transform: none; + padding: 1rem 0.75rem; + text-align: left; + vertical-align: bottom; + font-size: 1rem; + font-weight: bold; + color: var(--table-title-color); + text-transform: none; } .uk-table td { color: var(--body-color-secondary); } - /* Tabs */ .uk-tabs-container .tabs { - display: flex; - flex-direction: row; - justify-content: center; - flex-wrap: wrap; - align-items: stretch; - align-content: start; - gap: 24px; - width: 100%; - list-style: none; - padding: 0; - margin: 0; + display: flex; + flex-direction: row; + justify-content: center; + /* justify-items: center; */ + flex-wrap: wrap; + align-items: stretch; + align-content: start; + gap: 24px; + width: 100%; + list-style: none; + padding: 0; + margin: 0; } .tab, .tab-button { - display: inline-flex; - justify-items: center; - justify-content: center; - align-items: center; - gap: 1rem; - padding: 0.75rem; - text-align: center; - vertical-align: bottom; - font-size: 0.870rem; - background-color: var(--inactive-tab-color); - color: var(--inactive-tab-text-color); - text-transform: capitalize; - cursor: pointer; - border: none; - border-radius: var(--tab-radius); - box-shadow: var(--tab-box-shadow); - min-width: 120px; - max-width: 200px; - width: auto; - height: auto; - white-space: normal; - word-wrap: break-word; - min-height: 70px; - box-sizing: border-box; + display: inline-flex; + justify-items: center; + justify-content: center; + align-items: center; + gap: 1rem; + padding: 0.75rem; + text-align: center; + vertical-align: bottom; + font-size: 0.87rem; + background-color: var(--inactive-tab-color); + color: var(--inactive-tab-text-color); + text-transform: capitalize; + cursor: pointer; + border: none; + border-radius: var(--tab-radius); + box-shadow: var(--tab-box-shadow); + min-width: 120px; + max-width: 200px; + width: auto; + height: auto; + white-space: normal; + word-wrap: break-word; + min-height: 70px; + box-sizing: border-box; } .tab.active-tab, .tab-button.active-option, .option.active-option { - background-color: var(--active-tab-color); - color: var(--active-tab-text-color); - box-shadow: var(--tab-box-shadow); + background-color: var(--active-tab-color); + color: var(--active-tab-text-color); + box-shadow: var(--tab-box-shadow); } .tab-content, @@ -601,10 +572,11 @@ a { } .highlight { - color: var(--active-tab-color); + color: var(--primary-color); } -th, td { +th, +td { vertical-align: middle !important; } @@ -613,24 +585,24 @@ td { } td ul { - padding-left: 1.25rem; - padding-top: 0.625rem; - padding-bottom: 0.625rem; + padding-left: 1.25rem; + padding-top: 0.625rem; + padding-bottom: 0.625rem; } h3.highlight { - margin-top: 1rem; - padding-top: 0; + margin-top: 1rem; + padding-top: 0; } .view-in-chapter-highlight { - color: var(--body-color-secondary); + color: var(--body-color-secondary); } .duration { - font-size: 1rem; - margin-bottom: 0; - padding-bottom: 0; + font-size: 1rem; + margin-bottom: 0; + padding-bottom: 0; } .nested-list { @@ -644,12 +616,12 @@ h3.highlight { } .uk-list { - padding-left: 1.5rem; - font-style: normal; + padding-left: 1.5rem; + font-style: normal; } .uk-list.togglers-list { - padding-left: 0; + padding-left: 0; } .uk-paragraph { @@ -663,17 +635,17 @@ h3.highlight { position: absolute; left: 0; top: -0.25rem; - height: 2rem; - width: 0.5rem; + height: 2rem; + width: 0.5rem; background-color: var(--primary-color); - border-radius: 0.25rem; + border-radius: 0.25rem; } .uk-list-title, .uk-table-title, .custom-table-title { - position: relative; - padding-left: 1.5rem; + position: relative; + padding-left: 1.5rem; } .uk-list-title::before, @@ -683,18 +655,18 @@ h3.highlight { position: absolute; left: 0; top: -0.1875rem; - height: 2rem; - width: 0.5rem; - border-radius: 0.25rem; + height: 2rem; + width: 0.5rem; + border-radius: 0.25rem; } .uk-list-title::before { - top: -0.125rem; - background-color: var(--list-title-color); + top: -0.125rem; + background-color: var(--list-title-color); } .custom-table-title::before { - background-color: var(--green-color); + background-color: var(--green-color); } /* Togglers */ @@ -712,14 +684,14 @@ h3.highlight { } .chevron-up { - transform: rotate(-180deg); - transition: transform var(--transition-duration) ease-in-out; - font-size: 1.5rem; + transform: rotate(-180deg); + transition: transform var(--transition-duration) ease-in-out; + font-size: 1.5rem; } .chevron-up.active { - transform: rotate(0); - transition: transform var(--transition-duration) ease-in-out; + transform: rotate(0); + transition: transform var(--transition-duration) ease-in-out; } .item { @@ -731,4 +703,179 @@ h3.highlight { .item.active { max-height: 5000px; transition: max-height 800ms cubic-bezier(0.4, 0, 1, 1); -} \ No newline at end of file +} + +.with-info-icon { + display: inline-flex; + align-items: center; + gap: 0.25rem; +} + +.info-icon { + display: inline-flex; + justify-content: center; + align-items: center; + font-family: serif; + font-size: 0.8rem; + background-color: var(--primary-color); + color: white; + border-radius: 50%; + cursor: pointer; + width: 16px; + height: 16px; + line-height: 16px; + margin: 0 0rem; + position: relative; + transition: all 0.2s ease; +} + +.tooltip { + visibility: hidden; + position: absolute; + background-color: var(--primary-color); + font-weight: normal; + text-align: left; + border-radius: 6px; + padding: 10px; + /* font-size: 0.9em; */ + line-height: 1.4; + bottom: 100%; + margin-bottom: 10px; + opacity: 0; + transition: opacity 0.3s, visibility 0.3s; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); + pointer-events: none; + white-space: normal; + word-wrap: break-word; + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; + width: max-content; + max-width: calc(100% + 200px); + z-index: 5000 !important; +} + +/* Tooltip positioning variants */ +.tooltip-right { + left: 0px; +} + +.tooltip-center { + left: 50%; + transform: translateX(-50%); +} + +.tooltip-left { + right: 0px; + left: auto; +} + +.tooltip-bottom-center { + top: 100%; + bottom: auto; + left: auto; + transform: translateX(-50%); + margin-bottom: 0; + margin-top: 10px; +} + +.tooltip-center-center { + bottom: -500px; + left: 30%; + margin-bottom: 0; + margin-top: 10px; +} + +/* Tooltip arrow */ +/* .tooltip::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: var(--primary-color) transparent transparent transparent; +} */ + +/* Show tooltip when active */ +.info-icon.active .tooltip { + visibility: visible; + opacity: 1; + overflow: scroll; +} + +/* Responsive table + ========================================================================== */ +/* Phone landscape and smaller */ +@media (max-width: 959px) { + .uk-table-responsive, + .uk-table-responsive tbody, + .uk-table-responsive th, + .uk-table-responsive td, + .uk-table-responsive tr { + display: block; + } + .uk-table-responsive thead { + display: none; + } + .uk-table-responsive th, + .uk-table-responsive td { + width: auto !important; + max-width: none !important; + min-width: 0 !important; + overflow: visible !important; + white-space: normal !important; + } + .uk-table-responsive th:not(:first-child):not(.uk-table-link), + .uk-table-responsive td:not(:first-child):not(.uk-table-link), + .uk-table-responsive .uk-table-link:not(:first-child) > a { + padding-top: 5px !important; + } + .uk-table-responsive th:not(:last-child):not(.uk-table-link), + .uk-table-responsive td:not(:last-child):not(.uk-table-link), + .uk-table-responsive .uk-table-link:not(:last-child) > a { + padding-bottom: 5px !important; + } + .uk-table-justify.uk-table-responsive th, + .uk-table-justify.uk-table-responsive td { + padding-left: 0; + padding-right: 0; + } + + .uk-tabs-container .tabs { + display: grid; + grid-template-columns: repeat(4, 1fr); + align-content: center; + width: 100%; + } + + .tab, + .tab-button { + display: inline-block; + width: 100%; + } +} + +@media (max-width: 700px) { + .uk-tabs-container .tabs { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (max-width: 500px) { + .uk-tabs-container .tabs { + grid-template-columns: repeat(2, 1fr); + } +} + +/* Shift the long AAP isoniazid tooltip in the LTBI table slightly right + so its content is not clipped. Targets only this tooltip on table_5 + and does not affect other tooltips. + This was done to solve the problem on the tooltip that was causing the text to be blurred by the background. + so the possitioning of the tooltip was changed to the left and the css below was added so that the pop up doesnt get clipped by the margin + */ +#table_5_dosages_for_recommended_lbti_treatment_regimens + .info-icon[data-tooltip*="American Academy of Pediatrics recommends an isoniazid dosage of 10 - 15 mg/kg"] + .tooltip { + right: -30px; /* move popup 30px to the right */ +} diff --git a/app/src/main/assets/json/chapter.json b/app/src/main/assets/json/chapter.json index 21c3bd3..877f23f 100644 --- a/app/src/main/assets/json/chapter.json +++ b/app/src/main/assets/json/chapter.json @@ -86,7 +86,7 @@ }, { "chapterId": 18, - "chapterTitle": "Hello and welcome clinical statement", + "chapterTitle": "Hello and Welcome clinical statement", "chapterHomePosition": 0 }, { diff --git a/app/src/main/assets/json/chart.json b/app/src/main/assets/json/chart.json index db8bc8f..d7b5692 100644 --- a/app/src/main/assets/json/chart.json +++ b/app/src/main/assets/json/chart.json @@ -63,87 +63,66 @@ "chartHomePosition": 0 }, { - "id": "table_10_pediatric_dosages_rifampin_in_children_(birth_to_15_years)", + "id": "table_10_antituberculosis_antibiotics_in_adult_patients_with_renal_impairment", "subChapterTitle": "Special Clinical Situations", "subChapterId": 24, - "chartTitle": "Table 10: Pediatric dosages - rifampin in children (birth to 15 years) dose for either daily or twice weekly therapy", + "chartTitle": "Table 10: Antituberculosis Antibiotics in Adult Patients with Renal Impairment", "chartHomePosition": 0 }, { - "id": "table_11_pediatric_dosages_ethambutol_in_children_(birth_to_15_years)", + "id": "table_11_antituberculosis_medications_which_may_be_used_for_patients_who_have_contraindications_to_or_intolerance", "subChapterTitle": "Special Clinical Situations", "subChapterId": 24, - "chartTitle": "Table 11: Pediatric dosages - Ethambutol in children (birth to 15 years)\nEthambutol is available in 100mg and 400 mg tablets", + "chartTitle": "Table 11: Antituberculosis Medications for Patients who have Contraindications to or Intolerance of First Line Agents or require IV Therapy during Acute or Critical Illness", "chartHomePosition": 0 }, { - "id": "table_12_pediatric_dosages_pyrazinamide_in_children_(birth_to_15_years)", + "id": "table_12_clinical_situations_for_which_standard_therapy_cannot_be_given_or_is_not_well_tolerated", "subChapterTitle": "Special Clinical Situations", "subChapterId": 24, - "chartTitle": "Table 12: Pediatric Dosages - Pyrazinamide in children (birth to 15 years)\nPyrazinamide is available in 500 mg tablets which are scored and can be cut in ½.", + "chartTitle": "Table 12: Clinical Situations for which Standard Therapy cannot be given or is not well-tolerated or may not be effective: Potential Alternative Regimens (Dosing and/or Drugs)", "chartHomePosition": 0 }, { - "id": "table_13_antituberculosis_antibiotics_in_adult_patients_with_renal_impairment", + "id": "table_13_when_to_start_hiv_therapy", "subChapterTitle": "Special Clinical Situations", "subChapterId": 24, - "chartTitle": "Table 13: Antituberculosis antibiotics in adult patients with renal impairment", + "chartTitle": "Table 13: When to Start HIV Therapy", "chartHomePosition": 0 }, { - "id": "table_14_antituberculosis_medications_which_may_be_used_for_patients_who_have_contraindications_to_or_intolerance", + "id": "table_14_what_to_start_choice_of_tb_therapy_and_antiretroviral_therapy_(art)_when_treating_co-infected_patients", "subChapterTitle": "Special Clinical Situations", "subChapterId": 24, - "chartTitle": "Table 14: Antituberculosis medications which may be used for patients who have contraindications to or intolerance of first line agents or who require IV therapy during acute or critical illness", + "chartTitle": "Table 14: What to start: Choice of TB Therapy and Antiretroviral Therapy (ART) when treating Co-infected Patients", "chartHomePosition": 0 }, { - "id": "table_15_clinical_situations_for_which_standard_therapy_cannot_be_given_or_is_not_well_tolerated", + "id": "table_15_summary_of_recommendations_for_treatment_of_active_tb_disease_in_persons_with_hiv", "subChapterTitle": "Special Clinical Situations", "subChapterId": 24, - "chartTitle": "Table 15: Clinical Situations for which standard therapy cannot be given or is not well- tolerated or may not be effective: Potential Alternative Regimens (Dosing and/or Drugs)", + "chartTitle": "Table 15: Summary of Recommendations for Treatment of Active TB Disease in Persons with HIV", "chartHomePosition": 0 }, { - "id": "table_16_when_to_start_hiv_therapy", + "id": "table_16_guidelines_for_treatment_of_extrapulmonary_tuberculosis", "subChapterTitle": "Antiretroviral Therapy (ART) and Treatment of HIV Seropositive Patients with Active Tuberculosis Disease", "subChapterId": 28, - "chartTitle": "Table 16: HHS Panel Recommendations on treatment of Tuberculosis Disease with HIV co-infection: Timing of Antiretroviral Therapy (ART) Initiation relative to TB treatment", + "chartTitle": "Table 16: Guidelines for Treatment of Extrapulmonary Tuberculosis: Length of Therapy and Adjunctive Use of Corticosteroids\n\n", "chartHomePosition": 0 }, { - "id": "table_17_what_to_start_choice_of_tb_therapy_and_antiretroviral_therapy_(art)_when_treating_co-infected_patients", + "id": "table_17_use_of_anti-tb_medications_in_special_situations_pregnancy_tuberculosis_meningitis_and_renal_failure", "subChapterTitle": "Antiretroviral Therapy (ART) and Treatment of HIV Seropositive Patients with Active Tuberculosis Disease", "subChapterId": 28, - "chartTitle": "Table 17: What to start: Choice of TB therapy and Antiretroviral Therapy (ART) when treating co-infected patients", + "chartTitle": "Table 17: Use of Anti-TB Medications in Special Situations: Pregnancy, Tuberculosis Meningitis, and Renal Failures", "chartHomePosition": 0 }, { - "id": "table_18_dosage_adjustments_for_art_and_rifamycins_when_used_in_combination", - "subChapterTitle": "Antiretroviral Therapy (ART) and Treatment of HIV Seropositive Patients with Active Tuberculosis Disease", - "subChapterId": 28, - "chartTitle": "Table 18: Dosage Adjustments for ART and Rifamycins when used in Combination", - "chartHomePosition": 0 - }, - { - "id": "table_19_guidelines_for_treatment_of_extrapulmonary_tuberculosis", - "subChapterTitle": "Adjunctive Use of Corticosteroid Therapy (Table 19)", - "subChapterId": 31, - "chartTitle": "Table 19: Guidelines for Treatment of Extrapulmonary* Tuberculosis: Length of therapy and Adjunctive Use of Corticosteroids", - "chartHomePosition": 0 - }, - { - "id": "table_20_use_of_anti-tb_medications_in_special_situations_pregnancy_tuberculosis_meningitis_and_renal_failure", - "subChapterTitle": "Treatment of Active TB in Pregnancy", - "subChapterId": 33, - "chartTitle": "Table 20: Use of Anti-TB Medications in Special Situations: Pregnancy, Tuberculous Meningitis and Renal Failure", - "chartHomePosition": 0 - }, - { - "id": "table_21_grady_hospital_tb_isolation_policy", - "subChapterTitle": "Surveillance for Health Care Workers", - "subChapterId": 40, - "chartTitle": "Table 21: Grady Hospital TB Isolation Policy", + "id": "table_18_grady_hospital_tb_isolation_policy", + "subChapterTitle": "Adjunctive Use of Corticosteroid Therapy", + "subChapterId": 32, + "chartTitle": "Table 18: Grady Hospital TB Isolation Policy", "chartHomePosition": 0 } ] diff --git a/app/src/main/assets/pages/10_tb_infection_control_hospital_isolation_procedures.html b/app/src/main/assets/pages/10_tb_infection_control_hospital_isolation_procedures.html index 183650b..45f7c40 100644 --- a/app/src/main/assets/pages/10_tb_infection_control_hospital_isolation_procedures.html +++ b/app/src/main/assets/pages/10_tb_infection_control_hospital_isolation_procedures.html @@ -19,7 +19,7 @@
X. TB Infection Control: Hospital Isolation Procedures
X. TB Infection Control: Hospital Isolation Procedures
X. TB Infection Control: Hospital Isolation Procedures
| Nil (IU/ml) | -< 8.0 | -|
|---|---|---|
| TB1 minus Nil (IU/ml) | -> 0.35 and > 25% of Nil | -Any | -
| TB2 minus Nil (IU/ml) | -Any | -> 0.35 and > 25% of Nil | -
| Mitogen minus Nil | -Any | -|
| Report/Interpretation | -M. tuberculosis infection likely | -|
| Nil (IU/ml) | +< 8.0 | +|
| TB1 minus Nil (IU/ml) | +> 0.35 and > 25% of Nil | +Any | +
| TB2 minus Nil (IU/ml) | +Any | +> 0.35 and > 25% of Nil | +
| Mitogen minus Nil | +Any | +|
| Report/Interpretation | +M. tuberculosis infection likely | +|
| Nil (IU/ml) | -< 8.0 | -||
|---|---|---|---|
| TB1 minus Nil (IU/ml) | -< 0.35 or > 0.35 and < 25 % of Nil | -||
| TB2 minus Nil (IU/ml) | -< 0.35 or > 0.35 and < 25% of Nil | -||
| Mitogen minus Nil | -> 0.50 | -||
| Report/Interpretation | -M. tuberculosis infection not likely | -||
| Nil (IU/ml) | +< 8.0 | +||
| TB1 minus Nil (IU/ml) | +< 0.35 or > 0.35 and < 25 % of Nil | +||
| TB2 minus Nil (IU/ml) | +< 0.35 or > 0.35 and < 25% of Nil | +||
| Mitogen minus Nil | +> 0.50 | +||
| Report/Interpretation | +M. tuberculosis infection not likely | +
| Nil (IU/ml) | -< 8.0 | -> 8.0 | -
|---|---|---|
| TB1 minus Nil (IU/ml) | -< 0.35 or > 0.35 and < 25% of Nil | -Any | -
| TB2 minus Nil (IU/ml) | -< 0.35 or > 0.35 and < 25% of Nil | -Any | -
| Mitogen minus Nil | -< 0.50 | -Any | -
| Report/Interpretation | -Likelihood of M. tuberculosis infection cannot be determined | -|
| Nil (IU/ml) | +< 8.0 | +> 8.0 | +
| TB1 minus Nil (IU/ml) | +< 0.35 or > 0.35 and < 25% of Nil | +Any | +
| TB2 minus Nil (IU/ml) | +< 0.35 or > 0.35 and < 25% of Nil | +Any | +
| Mitogen minus Nil | +< 0.50 | +Any | +
| Report/Interpretation | +Likelihood of M. tuberculosis infection cannot be determined | +|
Source: Based on manufacturer recommendations for QuantiFERON-TB Gold Plus [Package insert].
Available
at:
-
- https://www.qiagen.com/us/resources/download.aspx?id=ac068fc7-a994-4443-ac7c-dda43ce2bc5e&lang=en
+
+ https://www.qiagen.com/us/resources/resource?id=ac068fc7-a994-4443-ac7c-dda43ce2bc5e&lang=en
| Nil* | -≤ 10 spots | -
|---|---|
| TB Response† | -≥ 8 spots | -
| Mitogen§ | -Any | -
| Nil + | +≤ 10 spots | +
| TB Response + | + +≥ 8 spots | +
| Mitogen + + | +Any | +
| Nil* | -< 10 spots | -
|---|---|
| TB Response† | -5, 6, or 7 spots | -
| Mitogen§ | -Any | -
| Nil + + | +< 10 spots | +
| TB Response + + | +5, 6, or 7 spots | +
| Mitogen + + | +Any | +
| Nil* | -≤ 10 spots | -
|---|---|
| TB Response† | -> 20 spots | -
| Mitogen§ | -> 20 spots | -
| Nil + + | +≤ 10 spots | +
| TB Response + + | +> 20 spots | +
| Mitogen + + | +> 20 spots | +
| Nil* | -≤ 10 spots | -≤ 10 spots | -
|---|---|---|
| TB Response† | -Any | -< 5 spots | -
| Mitogen§ | -Any | -< 20 spots | -
| Nil + + | +≤ 10 spots | +≤ 10 spots | +
| TB Response + + | +Any | +< 5 spots | +
| Mitogen + + | +Any | +< 20 spots | +
- Source: Based on Oxford Immunotec T-Spot.TB package insert.
- Available at:
- https://www.tspot.com/wp-content/uploads/2021/04/TB-PI-US-0001-V9.pdf
-
-
* The number of spots resulting from incubation of PBMCs in culture media without antigens.
- † The greater number of spots resulting from stimulation of peripheral
- blood mononuclear cells (PBMCs) with two separate cocktails of peptides
- representing early secretory antigenic target-6 (ESAT-6) or culture filtrate
- protein-10 (CFP-10) minus Nil.
- § The number of spots resulting from stimulation of PBMCs with mitogen
- without adjustment for the number of spots resulting from incubation of
- PBMCs without antigens.
- ¶ Interpretation indicating that Mycobacterium tuberculosis infection is
- likely.
- ** Interpretation indicating an uncertain likelihood of M. tuberculosis infection. In the case of Invalid
- results, these should be reported as “Invalid”
- and it is recommended to collect another sample and retest the individual.
- †† Interpretation indicating that M. tuberculosis infection is not likely.
Source: Based on Oxford Immunotec T-Spot.TB package insert.
+ Available at:
+ http://www.oxfordimmunotec.com/international/wp-content/uploads/sites/3/Final-File-PI-TB-US-V6.pdf
+
1. Interpretation indicating that Mycobacterium tuberculosis infection is likely.
+ 2. Interpretation indicating an uncertain likelihood of M. tuberculosis infection. In the case of Invalid results, these should be reported as “Invalid” and it is recommended to collect another sample and retest the individual.
+ 3. Interpretation indicating that M. tuberculosis infection is not likely.