Фильтровать всю таблицу по определенному свойству JSON Tabulator с вложенностью 3-го уровня

#javascript #tabulator

#javascript #табулятор

Вопрос:

У меня есть объект JSON с тройным вложением, где изначально все данные отображаются в одной таблице табулятора. Например, эти данные больницы представляют собой список кодов диагностики для каждого посещения пациента в медицинской карте каждого пациента. Я хочу фильтровать по коду диагноза и отображать только те медицинские записи / учетные записи пациентов, которые содержат код диагноза и повторно отображаются в одной таблице. Возможно ли это сделать с помощью функций табуляции?

В принципе, как я могу отобразить список только тех «медицинских записей> учетных записей пациентов> кодов диагностики», которые содержат dx_code ‘D55.0’. Если я найду, где искать по коду диагностики, который не привязан ни к одной учетной записи, например, A01.00, то ничего не отобразится.

 var patient_data = [{
  med_rec_num:123,
  patient_name:"Mickey Mouse",
  phone:"123456789",
  age:91,
  visit_list: [{
      account_num: "A0001",
      doctor: "Dr. Pepper",
      location: "Cardiology",
      diagnosis_list: [{
            num: 1,
            dx_code: "V95.43XA",
            visit_type: "Outpatient",
            poa: 'Y'
          },
          {
            num: 2,
            dx_code: "V95.00A",
            visit_type: "Outpatient",
            poa: 'N'
            },
          {
            num: 3,
            dx_code: "D55.0",
            visit_type: "Outpatient",
            poa: 'Y'
          }
        ]
    },
    {
      account_num: "A0002",
      doctor: "Dr. Dre",
      location: "Radiology",
      diagnosis_list: [{
            num: 1,
            dx_code: "K56.60",
            visit_type: "Inpatient",
            poa: 'Y'
          },
          {
            num: 2,
            dx_code: "Z71.89",
            visit_type: "Inpatient",
            poa: 'Y'
          }
        ]
    }
  ]
},
{
  med_rec_num:456,
  patient_name:"Jane Smith",
  phone:"987654321",
  age:50,
  visit_list: [{
      account_num: "B0001",
      doctor: "Dr. Happy",
      location: "Pharmacology",
      diagnosis_list: [{
            num: 1,
            dx_code: "Z71.89",
            visit_type: "Inpatient",
            poa: 'Y'
          },
          {
            num: 2,
            dx_code: "D55.0",
            visit_type: "Outpatient",
            poa: 'N'
          }
        ]
    }
  ]
}
]

const table = new Tabulator("#example-table", {
    data: patient_data,
    //height: "311px",
    layout: "fitColumns",
    resizableColumns: false,
    index: "med_rec_num",
    columns: [
            {formatter: plusIcon, width: 55, hozAlign:"center", tooltip: "Click to expand for Visits info", title:"Visits", headerSort:false, cellClick:function(e, row, formatterParams){
     const id = row.getData().med_rec_num;
    $(".visitTable"   id   "").toggle();}
        },
        {title:"Medical Record Num", field:"med_rec_num"},
        {title:"Patient Name", field:"patient_name"},
        {title:"Phone", field:"phone"},
        {title:"Age", field:"age"}
    ],
    rowFormatter: function(row, e) {
    //create and style holder elements
    var holderEl = document.createElement("div");
    var tableEl = document.createElement("div");

    const id = row.getData().med_rec_num;

    holderEl.style.boxSizing = "border-box";
    holderEl.style.padding = "10px 10px 10px 10px";
    holderEl.style.borderTop = "1px solid #333";
    holderEl.style.borderBotom = "1px solid #333";
    holderEl.style.background = "#ddd";
    //holderEl.style.display = "none";
    holderEl.setAttribute('class', "visitTable"   id   "");
    

    tableEl.style.border = "1px solid #333";
    //tableEl.style.display = "none";
    tableEl.setAttribute('class', "visitTable"   id   "");
    
    holderEl.appendChild(tableEl);
    row.getElement().appendChild(holderEl);

    var visitTable = new Tabulator(tableEl, {
      layout: "fitColumns",
      data: row.getData().visit_list,
      index: "account_num",
      columns: [
        {formatter: plusIcon, width: 55, hozAlign:"center", tooltip: "Click to expand for Dx Codes info", title:"Dx Codes", headerSort:false, cellClick:function(e, row, formatterParams){
       const id = row.getData().account_num;
      $(".diagnosisTable"   id   "").toggle();}
      },
        {title: "Account#",field: "account_num"},
        {title: "Doctor",field: "doctor"},
        {title: "Location", field: "location"},
      ],
      
      rowFormatter: function(row, e) {
          //create and style holder elements
          var holderEl = document.createElement("div");
          var tableEl = document.createElement("div");

          const id = row.getData().account_num;

          holderEl.style.boxSizing = "border-box";
          holderEl.style.padding = "10px 10px 10px 10px";
          holderEl.style.borderTop = "1px solid #333";
          holderEl.style.borderBotom = "1px solid #333";
          holderEl.style.background = "#ddd";
          //holderEl.style.display = "none";
          holderEl.setAttribute('class', "diagnosisTable"   id   "");


          tableEl.style.border = "1px solid #333";
          //tableEl.style.display = "none";
          tableEl.setAttribute('class', "diagnosisTable"   id   "");

          holderEl.appendChild(tableEl);

          row.getElement().appendChild(holderEl);
          
          //--------------------------------------------------------------- filter here?
          let filterField = document.getElementById("filter-field");
                    
          document.getElementById("filter-trigger").addEventListener("click", function() {
              console.log(filterField.value);           // why is this not working?
              diagnosisTable.setFilter("dx_code", "=", filterField.value);
              table.redraw();
          });
          
          document.getElementById("clear-trigger").addEventListener("click", function() {
              console.log(filterField.value);           // why is this not working?
              diagnosisTable.removeFilter("dx_code", "=", filterField.value);
              table.redraw();
          });
          //--------------------------------------------------------------- filter ^here^?

          var diagnosisTable = new Tabulator(tableEl, {
            layout: "fitColumns",
            data: row.getData().diagnosis_list,
            index: "id",
            columns: [
              {title: "Num",field: "num"},
              {title: "Dx Code",field: "dx_code"},
              {title: "Type",field: "visit_type"},
              {title: "P.O.A",field: "poa"}
            ]
         }) // end of diagnosisTable tabulator
      } // end of row formatter that hold diagnosisTable
    }) // end of visitTable tabulator    
  } // end of row formatter that holds visitTable
}); // end of table tabulator
  

Пожалуйста, смотрите мойhttps://jsfiddle.net/zippyzuzka/zo3f5eqs/2 /

В идеале, таблица изначально отображалась бы с каждым свернутым уровнем вместо каждого развернутого уровня (который я закодировал) и все еще могла бы фильтроваться через свойство 3-го уровня (которое я не закодировал).). Также обратите внимание, что весь набор данных — patient_data — создается после отправки формы и отправляется в таблицу через AJAX, если это что-то помогает. (однако не в коде JSFiddle).

Кроме того, я новичок во всем, что касается JavaScript, поэтому мое понимание довольно мало. Я бы предположил, что для этого потребуется, возможно, какой-то пользовательский фильтр? Я попытался добавить прослушиватель событий, чтобы иметь возможность использовать table.setFilter(«dx_code», «=», filterField.value); но это не работает. Я не знаю, как рекурсивно получить родительские свойства.

Спасибо! Спасибо!