Skip to content

Commit 491bf9f

Browse files
committed
Partially working history
1 parent 7c8fa3e commit 491bf9f

3 files changed

Lines changed: 137 additions & 46 deletions

File tree

patient-history-controler.js

Lines changed: 78 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,134 @@
1-
import { patientLib } from './patient-lib.js';
2-
import { navControler } from './patient-nav-controler.js'
1+
import { patientLib } from "./patient-lib.js";
2+
import { navControler } from "./patient-nav-controler.js";
33
/**
4-
* UI management code.
4+
* UI management code.
55
* Relies on patientLib for API calls and data management
6-
*
7-
* @param {*} event
6+
*
7+
* @param {*} event
88
*/
99
let navData;
1010
window.onload = async (event) => {
1111
navData = await navControler.setNavComponents();
12-
console.log('## navData', navData);
12+
console.log("## navData", navData);
1313
const { patientApiEndpoint, questionaryId, formKey } = navData;
14-
console.log('## patientApiEndpoint:', patientApiEndpoint);
14+
console.log("## patientApiEndpoint:", patientApiEndpoint);
1515
await patientLib.connect(patientApiEndpoint, questionaryId);
1616
// - form title
17-
const formTitle = document.getElementById('card-questionnary-details-title');
17+
const formTitle = document.getElementById("card-questionnary-details-title");
1818
formTitle.innerHTML = patientLib.getFormTitle(questionaryId);
19-
refreshForm();
20-
}
19+
const dateInput = document.getElementById("form-date");
20+
dateInput.value = new Date().toISOString().split("T")[0]; // format YYYY-MM-DD
21+
dateInput.onfocusout = function () {
22+
const date = dateInput.valueAsDate;
23+
console.log("## Focus Out Date", date);
24+
refreshForm(date);
25+
};
2126

27+
refreshForm(dateInput.valueAsDate);
28+
refreshDataTable();
29+
};
2230

23-
async function refreshForm () {
31+
async function refreshForm(date) {
32+
console.log("## Refresh Form Date:", date);
2433
const { questionaryId, formKey } = navData;
2534
// -- content
26-
; console.log()
27-
const formData = await patientLib.getFormContent(questionaryId, formKey)
35+
console.log();
36+
const formData = await patientLib.getFormContent(
37+
questionaryId,
38+
formKey,
39+
date
40+
);
2841
updateFormContent(formData);
29-
document.getElementById('submit-button-list').onclick = function () {
30-
submitForm(formData);
42+
document.getElementById("submit-button-list").onclick = function () {
43+
submitForm(formData, date);
3144
};
3245
}
3346

47+
async function refreshDataTable(date) {
48+
const { questionaryId, formKey } = navData;
49+
const tableData = await patientLib.getHistoricalContent(
50+
questionaryId,
51+
formKey
52+
);
53+
const table = document.getElementById("historical-data");
54+
table.innerHTML = "";
55+
56+
// -- headers
57+
const headerRow = table.insertRow(-1);
58+
const headerDateCell = document.createElement("TH");
59+
headerDateCell.innerHTML = "Date";
60+
headerRow.appendChild(headerDateCell);
61+
for (const th of tableData.tableHeaders) {
62+
const headerCell = document.createElement("TH");
63+
headerCell.innerHTML = th.label;
64+
headerRow.appendChild(headerCell);
65+
}
66+
for (const [dateStr, data] of Object.entries(tableData.valuesByDate)) {
67+
const row = table.insertRow(-1);
68+
const cellDate = row.insertCell(-1);
69+
cellDate.innerHTML = dateStr;
70+
for (const th of tableData.tableHeaders) {
71+
const cell = row.insertCell(-1);
72+
cell.innerHTML = data[th.fieldId] || '';
73+
}
74+
}
75+
76+
console.log("## tabledata", tableData);
77+
}
3478

3579
// ------- Form -------- //
3680

3781
/**
3882
* Take the from content from the definition and actual values and create the HTML
3983
*/
4084
async function updateFormContent(formData) {
41-
console.log('Form content:', formData);
42-
85+
console.log("Form content:", formData);
86+
4387
// Append the HTML to the form
44-
document.getElementById('inputs-list').innerHTML = ''; // Clear previous content
88+
document.getElementById("inputs-list").innerHTML = ""; // Clear previous content
4589
for (let i = 0; i < formData.length; i++) {
4690
const formField = formData[i];
4791
const fieldId = formField.id;
48-
const fieldValue = (formField.value != null) ? formField.value : '';
92+
const fieldValue = formField.value != null ? formField.value : "";
4993
const fieldType = formField.type;
5094
const fieldLabel = formField.label;
51-
95+
5296
// Create the HTML for the form field
5397
let fieldHTML = `\n<BR><label for="${fieldId}">${fieldLabel}</label>`;
54-
if (fieldType === 'text' || fieldType === 'number') {
98+
if (fieldType === "text" || fieldType === "number") {
5599
fieldHTML += `<input type="${fieldType}" id="${fieldId}" value="${fieldValue}" class="form-control"/>`;
56-
} else if (fieldType === 'select') {
100+
} else if (fieldType === "select") {
57101
fieldHTML += `<select id="${fieldId}" class="form-control">`;
58102
fieldHTML += `<option value="">--</option>`;
59103
for (const option of formField.options) {
60-
const selected = (option.value === fieldValue) ? 'selected' : '';
104+
const selected = option.value === fieldValue ? "selected" : "";
61105
fieldHTML += `<option value="${option.value}" ${selected}>${option.label}</option>`;
62106
}
63107
fieldHTML += `</select>`;
64-
} else if (fieldType === 'date') {
108+
} else if (fieldType === "date") {
65109
fieldHTML += `<input type="date" id="${fieldId}" value="${fieldValue}" class="form-control"/>`;
66110
}
67-
68-
document.getElementById('inputs-list').innerHTML += fieldHTML;
111+
112+
document.getElementById("inputs-list").innerHTML += fieldHTML;
69113
}
70114
}
71115

72116
/**
73117
* Submit the form and send the data to the API
74118
*/
75-
async function submitForm(formData) {
119+
async function submitForm(formData, date) {
76120
const values = {};
77121
for (let i = 0; i < formData.length; i++) {
78122
const field = formData[i];
79123
const fieldId = field.id;
80124
const formField = document.getElementById(fieldId);
81125
// Store the value in the values object
82-
if (field.type === 'date') {
83-
values[field.id] = formField.valueAsDate;
126+
if (field.type === "date") {
127+
values[field.id] = formField.valueAsDate;
84128
} else {
85-
values[field.id] = formField.value.trim();
86-
}
129+
values[field.id] = formField.value.trim();
130+
}
87131
}
88-
await patientLib.handleFormSubmit(formData, values);
89-
alert('Form submitted successfully');
90-
};
132+
await patientLib.handleFormSubmit(formData, values, date);
133+
alert("Form submitted successfully");
134+
}

patient-history.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,15 @@ <h1>Demo Form - Patient's page</h1>
2828
<h2 class="card-title"> Questionnary: <span id="card-questionnary-details-title"></span></h2>
2929
<h3 class="card-title"> Set: <span id="card-questionnary-details-question-set">Historical Data</span></h3>
3030
<div class="form-group">
31+
<label for="form-date">Entry date</label>
32+
<input type="date" id="form-date" class="form-control"/>
3133
<div class="input-group" id="inputs-list">
3234
<!-- HERE WILL GO THE INPUTS-->
3335
</div>
3436
</div>
3537
<button type="button" id="submit-button-list" class="btn btn-primary mb-2">Submit</button>
3638
</form>
39+
<table id="historical-data" class="table"></table>
3740
</div>
3841
</div>
3942
</body>

patient-lib.js

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export const patientLib = {
77
handleFormSubmit,
88
getFormTitle,
99
getFormContent,
10+
getHistoricalContent,
1011
connect,
1112
navSetData,
1213
navGetData,
@@ -132,24 +133,66 @@ async function getFormExistingContent (form, date) {
132133
console.log('## getFormContent ' + i, e);
133134
if (e.events && e.events.length > 0) {
134135
const event = e.events[0];
135-
if (field.type === 'date' && event.content != null ) {
136-
// convert the date to a Date object
137-
const date = new Date(event.content);
138-
if (!isNaN(date)) {
139-
field.value = date.toISOString().split('T')[0]; // format YYYY-MM-DD
140-
} else {
141-
console.error('## Error parsing date', event.content);
142-
field.value = '';
143-
}
144-
} else {
145-
field.value = event.content;
146-
}
136+
field.value = valueForField(event.content, field);
147137
field.eventId = event.id; // will allow t track if the event is to be updated
148138
}
149139
}
150140
return formData;
151141
};
152142

143+
144+
async function getHistoricalContent(questionaryId, formKey) {
145+
const formFields = dataDefs.questionnaires[questionaryId].forms[formKey].content;
146+
const tableHeaders = formFields.map(field => ({
147+
fieldId: field.streamId + ':' + field.eventType,
148+
label: field.label,
149+
type: field.type
150+
}));
151+
152+
const valuesByDate = {};
153+
function addEntry (field, time, value) {
154+
const dateStr = (new Date(time * 1000)).toISOString().split('T')[0];
155+
if (valuesByDate[dateStr] == null) valuesByDate[dateStr] = {};
156+
const fieldId = field.streamId + ':' + field.eventType;
157+
valuesByDate[dateStr][fieldId] = valueForField(value, field);
158+
}
159+
160+
// get the values from the API
161+
const apiCalls = formFields.map(field => ({
162+
method: 'events.get',
163+
params: {
164+
streams: [field.streamId],
165+
types: [field.eventType],
166+
limit: 20, // last 20 is enough for a demo
167+
}
168+
}));
169+
const res = await connection.api(apiCalls);
170+
for (let i = 0; i < res.length; i++) {
171+
const e = res[i];
172+
const field = formFields[i];
173+
if (e.events) {
174+
for (const event of e.events) {
175+
addEntry(field, event.time, event.content);
176+
}
177+
}
178+
}
179+
180+
return { tableHeaders, valuesByDate };
181+
}
182+
183+
function valueForField (eventContent, field) {
184+
if (field.type === 'date' && eventContent != null ) {
185+
// convert the date to a Date object
186+
const date = new Date(eventContent);
187+
if (!isNaN(date)) {
188+
return date.toISOString().split('T')[0]; // format YYYY-MM-DD
189+
}
190+
console.error('## Error parsing date', eventContent);
191+
return '';
192+
}
193+
return eventContent;
194+
}
195+
153196
// ---------------- create / update data ---------------- //
154197

155198
function parseValue (value, type) {
@@ -219,6 +262,7 @@ async function handleFormSubmit (formData, values, date) {
219262
streamId: streamId,
220263
type: eventType,
221264
content: value,
265+
time: date ? date.getTime() / 1000 : null
222266
}
223267
});
224268
}

0 commit comments

Comments
 (0)