11<template >
22 <div class =" result" >
3- <h2 >Selected Summary</h2 >
4- <ul >
5- <li ><strong >Cancer Type</strong >: {{ result?.selectedCancerType || '-' }}</li >
6- <li ><strong >Treatment</strong >: {{ result?.selectedTreatment || '-' }}</li >
7- <li ><strong >Endpoint</strong >: {{ result?.selectedEndpoint || '-' }}</li >
8- <li ><strong >Criteria (names)</strong >: {{ result?.selectedCriteria?.join(', ') || '-' }}</li >
9- </ul >
3+ <div class =" result-layout" >
4+ <div class =" col-left" >
5+ <div class =" row-2" >
6+ <div class =" r-card" >
7+ <h3 class =" r-title" >Cancer</h3 >
8+ <div class =" r-value" >{{ result?.selectedCancerType || '-' }}</div >
9+ </div >
10+ <div class =" r-card" >
11+ <h3 class =" r-title" >Line of Therapy</h3 >
12+ <div class =" r-value" >{{ resultRelatedMetadata.lineOfTherapy ?? '-' }}</div >
13+ </div >
14+ </div >
15+
16+ <div class =" r-card" >
17+ <h3 class =" r-title" >Regimens</h3 >
18+ <DataTable :value =" regimenRows" tableStyle =" min-width: 16rem" class =" small-table" >
19+ <Column field =" label" header =" name" />
20+ <Column field =" value" header =" value" />
21+ </DataTable >
22+ </div >
23+
24+ <div class =" r-card" >
25+ <h3 class =" r-title" >Endpoint</h3 >
26+ <div class =" r-value" >{{ result?.selectedEndpoint || '-' }}</div >
27+ </div >
28+
29+ <div class =" r-card" >
30+ <h3 class =" r-title" >Criteria</h3 >
31+ <DataTable :value =" criteriaTableRows" tableStyle =" min-width: 24rem" class =" criteria-table" >
32+ <Column header =" #" :style =" {width:'40px'}" >
33+ <template #body =" { index } " >{{ index + 1 }}</template >
34+ </Column >
35+ <Column field =" type" header =" type" :style =" {width:'90px'}" />
36+ <Column field =" criteria_description" header =" criteria" >
37+ <template #body =" { data } " >
38+ <div class =" criteria-desc" >{{ data.criteria_description }}</div >
39+ </template >
40+ </Column >
41+ <Column header =" must have" :style =" {width:'90px', textAlign:'center'}" >
42+ <template #body =" { data } " >
43+ <div style =" display :flex ;justify-content :center ;" >
44+ <i v-if =" selectedSet.has(data.criteria_name)" class =" pi pi-check" style =" color :#16a34a ;" ></i >
45+ </div >
46+ </template >
47+ </Column >
48+ </DataTable >
49+ </div >
50+ </div >
51+
52+ <div class =" col-right" >
53+ <div class =" r-card" style =" min-height : 240px ;" ></div >
54+ </div >
55+ </div >
1056 </div >
1157 </template >
1258
1359<script setup>
60+ import {ref , onMounted , computed } from ' vue'
61+ import * as XLSX from ' xlsx'
62+ import DataTable from ' primevue/datatable'
63+ import Column from ' primevue/column'
1464const props = defineProps ({
1565 result: { type: Object , default : () => ({}) }
1666})
67+
68+ const resultRelatedMetadata = ref ({})
69+ const trailResult = ref ([])
70+ const resultColumns = ref ([])
71+ const regimenRows = ref ([])
72+ const criteriaTableRows = ref ([])
73+ const selectedSet = computed (() => new Set (props .result .selectedCriteria || []))
74+
75+ onMounted (async () => {
76+ const url = new URL (' ../../public/data/meta_data.xlsx' , import .meta.url)
77+ const res = await fetch (url)
78+ const ab = await res .arrayBuffer ()
79+ const wb = XLSX .read (ab, { type: ' array' })
80+
81+ const wsMetadata = wb .Sheets [wb .SheetNames [0 ]]
82+ const wsTrialCriteria = wb .Sheets [wb .SheetNames [1 ]]
83+ const wsCriteria = wb .Sheets [wb .SheetNames [2 ]]
84+
85+ const metaRows = XLSX .utils .sheet_to_json (wsMetadata, { defval: null })
86+ const trialCriteriaRows = XLSX .utils .sheet_to_json (wsTrialCriteria, { defval: null })
87+ const criteriaRows = XLSX .utils .sheet_to_json (wsCriteria, { defval: null })
88+
89+ const metaRow = metaRows .find (r => r .trial_name === props .result .selectedTreatment )
90+ const criteriaNames = new Set (
91+ trialCriteriaRows
92+ .filter (r => r .trial_name === props .result .selectedTreatment )
93+ .map (r => r .criteria_name )
94+ )
95+ const selectedCriteriaRows = criteriaRows .filter (r => criteriaNames .has (r .criteria_name ))
96+
97+ resultRelatedMetadata .value = {
98+ cancerType: props .result .selectedCancerType ,
99+ trail: props .result .selectedTreatment ,
100+ lineOfTherapy: metaRow? .line_of_therapy ?? null ,
101+ treatment: metaRow? .treatment ?? props .result .selectedTreatment ,
102+ control: metaRow? .control ?? null ,
103+ endpoint: props .result .selectedEndpoint ,
104+ criteria: selectedCriteriaRows,
105+ selectedCriteria: props .result .selectedCriteria
106+ }
107+ regimenRows .value = [
108+ { label: ' treatment' , value: resultRelatedMetadata .value .treatment || ' -' },
109+ { label: ' control' , value: resultRelatedMetadata .value .control || ' -' }
110+ ]
111+ criteriaTableRows .value = resultRelatedMetadata .value .criteria || []
112+ const filepath = ` ../../public/trail_dataset/${ props .result .selectedTreatment } _results.csv`
113+ const fileUrl = new URL (filepath, import .meta.url)
114+ const fileRes = await fetch (fileUrl)
115+ if (fileRes .status === 200 ) {
116+ const fileAb = await fileRes .arrayBuffer ()
117+ const fileWb = XLSX .read (fileAb, { type: ' array' })
118+ const fileSheet = fileWb .SheetNames [0 ]
119+ const fileWs = fileWb .Sheets [fileSheet]
120+ trailResult .value = XLSX .utils .sheet_to_json (fileWs, { defval: null })
121+ resultColumns .value = trailResult .value .length ? Object .keys (trailResult .value [0 ]) : []
122+ console .log (' Loaded CSV rows:' , trailResult .value .length )
123+ } else {
124+ console .error (' File not found:' , filepath)
125+ }
126+ })
17127< / script>
18128
19129< style scoped>
20- .result { padding : 16px ; text-align : left ; }
21- .result ul { list-style : none ; padding : 0 ; }
22- .result li { margin : 6px 0 ; }
130+ .result { padding: 0 ; text- align: left; }
131+ .result - layout { display: grid; grid- template- columns: 2fr 3fr ; gap: 12px ; }
132+ .col - left, .col - right { display: flex; flex- direction: column; gap: 16px ; }
133+ .row - 2 { display: grid; grid- template- columns: 1fr 1fr ; gap: 12px ; }
134+ .r - card { background: #ffffff; border: 1px solid #e5e7eb; border- radius: 10px ; padding: 8px ; }
135+ .r - title { margin: 0 0 4px 0 ; font- size: 13px ; font- weight: 600 ; }
136+ .r - value { color: #111827 ; font- size: 13px ; }
137+ .small - table : deep (.p - datatable ) { font- size: 12px ; }
138+ .criteria - table : deep (.p - datatable ) { font- size: 11px ; table- layout: fixed; }
139+ .criteria - table : deep (.p - datatable .p - datatable - thead > tr > th ) { padding: 3px 6px ; }
140+ .criteria - table : deep (.p - datatable .p - datatable - tbody > tr > td ) { padding: 3px 6px ; }
141+ .criteria - desc {
142+ display: - webkit- box;
143+ - webkit- line- clamp: 2 ;
144+ - webkit- box- orient: vertical;
145+ overflow: hidden;
146+ }
23147< / style>
0 commit comments