BD-Core-FHIR-IG/bd-national-template/content/assets/js/fhir-table-scripts.js

187 lines
4.8 KiB
JavaScript

let fhirTableLoading = false;
function getCollapsed(store, row) {
return sessionStorage.getItem("ft-"+store+row);
}
function setCollapsed(store, row, value) {
if (!fhirTableLoading) {
if (value == 'collapsed') {
sessionStorage.setItem("ft-"+store+row, value);
} else {
sessionStorage.removeItem("ft-"+store+row);
}
}
}
function fhirTableRowExpand(table, id) {
var rows = table.getElementsByTagName('tr');
var row, i;
var noex = null;
for (i = 0; i < rows.length; i++) {
row = rows[i];
if (row.id.startsWith(id)) {
if (noex && row.id.startsWith(noex)) {
// do nothing
} else {
noex = null;
if (row.id != id) {
row.style.display = "";
if (row.className == 'closed') {
noex = row.id;
}
}
}
}
}
}
function fhirTableRowCollapse(table, id) {
var rows = table.getElementsByTagName('tr');
var row, i;
for (i = 0; i < rows.length; i++) {
row = rows[i];
if (row.id.startsWith(id) && row.id != id) {
row.style.display = "none";
}
}
}
function findElementFromFocus(src, name) {
e = src;
while (e && e.tagName != name) {
e = e.parentNode;
}
return e;
}
// src - a handle to an element in a row in the table
function tableRowAction(src) {
let table = findElementFromFocus(src, "TABLE");
let row = findElementFromFocus(src, "TR");
let td = row.firstElementChild;
let state = row.className;
if (state == "closed") {
fhirTableRowExpand(table, row.id);
row.className = "open";
src.src = src.src.replace("-closed", "-open");
td.style.backgroundImage = td.style.backgroundImage.replace('0.png', '1.png');
setCollapsed(table.id, row.id, 'expanded');
} else {
fhirTableRowCollapse(table, row.id);
row.className = "closed";
src.src = src.src.replace("-open", "-closed");
td.style.backgroundImage = td.style.backgroundImage.replace('1.png', '0.png');
setCollapsed(table.id, row.id, 'collapsed');
}
}
// src - a handle to an element in a row in the table
function fhirTableInit(src) {
let table = findElementFromFocus(src, "TABLE");
var rows = table.getElementsByTagName('tr');
var row, i;
fhirTableLoading = true;
for (i = 0; i < rows.length; i++) {
row = rows[i];
var id = row.id;
if (getCollapsed(table.id, id) == 'collapsed') {
let td = row.firstElementChild;
let e = td.firstElementChild;
while (e.tagName != "IMG" || !(e.src.includes("join"))) {
e = e.nextSibling;
}
tableRowAction(e);
}
}
fhirTableLoading = false;
}
function filterTree(table, text) {
if (!text) {
for (let i = 1; i < table.rows.length-1; i++) {
const row = table.rows[i];
row.style.display = '';
const cell = row.cells[4];
cell.style.display = '';
}
} else if (text.startsWith('.')) {
text = text.substring(1);
for (let i = 1; i < table.rows.length-1; i++) {
const row = table.rows[i];
let rowText = row.textContent || row.innerText
rowText = rowText.toLowerCase();
// Check if row contains the search text
if (rowText.includes(text)) {
let id = row.id;
while (id) {
document.getElementById(id).style.display = '';
id = id.substring(0, id.length - 1);
}
} else {
// Hide the row
row.style.display = 'none';
}
}
} else {
for (let i = 1; i < table.rows.length-1; i++) {
const row = table.rows[i];
const cell = row.cells[4];
let cellText = cell.textContent || cell.innerText
cellText = cellText.toLowerCase();
// Check if row contains the search text
if (cellText.includes(text)) {
// Show the row
cell.style.display = '';
} else {
// Hide the row
cell.style.display = 'none';
}
}
}
}
function filterDesc(table, prop, value, panel) {
let v = 'none';
if (value) {
v = '';
}
panel.style.display = 'none';
localStorage.setItem('ht-table-states-'+prop, value);
for (let i = 1; i < table.rows.length-1; i++) {
const row = table.rows[i];
const cell = row.cells[4];
if (cell) {
for (let i = 0; i < cell.children.length; i++) {
const childElement = cell.children[i];
let classes = childElement.getAttribute('class');
if (classes.includes(prop)) {
childElement.style.display = v;
}
}
}
}
}
function hide() {
if (visiblePanel) {
visiblePanel.style.display = 'none';
visiblePanel = null;
}
}
function showPanel(button, table, panel) {
const rect1 = button.getBoundingClientRect();
panel.style.top = (rect1.bottom+10) + 'px';
panel.style.left = (rect1.left) + 'px';
panel.style.display = 'block';
visiblePanel = panel;
window.addEventListener('scroll', hide);
window.addEventListener('click', hide);
event.stopPropagation();
}