Skip to content

Commit ce11d00

Browse files
committed
History OK
1 parent 138a435 commit ce11d00

5 files changed

Lines changed: 95 additions & 99 deletions

File tree

dr-lib.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ async function getPatientDetails(questionaryId, patientEvent) {
178178
method: "events.get",
179179
params: {
180180
streams: [itemDef.data.streamId],
181-
types: itemDef.types,
181+
types: itemDef.eventTypes,
182182
limit: 1,
183183
}
184184
};

dr-patient-view-lib.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ function getLineForEvent (event, questionaryId) {
6060
}
6161
if (line.formType === 'select') {
6262
line.value = event.content;
63-
if (itemDef.types[0] === 'ratio/generic') {
63+
if (event.type === 'ratio/generic') {
6464
line.value = event.content.value;
6565
}
6666

patient-history-controler.js

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,16 @@ function refreshClick(dateStr) {
3939
refreshAll(dateStr);
4040
}
4141

42-
let lastDateStr = null;
4342
async function refreshAll(dateStr) {
4443
console.log("## Refresh Form Date:", dateStr);
45-
if (dateStr === lastDateStr) {
46-
console.log("## Skipping Refresh Form Date, date are identical");
47-
return;
48-
}
49-
lastDateStr = dateStr;
5044

5145
const { questionaryId, formKey } = navData;
5246
// -- content
53-
console.log();
54-
const formData = await patientLib.getFormContent(
47+
const formData = await patientLib.getFormHistorical(
5548
questionaryId,
5649
formKey
5750
);
51+
5852
const tableRow = await refreshDataTable(dateStr);
5953
console.log('## tableRow', tableRow);
6054

@@ -66,9 +60,9 @@ async function refreshAll(dateStr) {
6660
}
6761
}
6862

69-
updateFormContent(formData);
63+
await updateFormContent(formData);
7064
document.getElementById("submit-button-list").onclick = function () {
71-
submitForm(formData, new Date(dateStr));
65+
submitForm(formData, dateStr);
7266
};
7367
}
7468

@@ -139,7 +133,7 @@ async function updateFormContent(formData) {
139133
fieldHTML += `<option value="">--</option>`;
140134
for (const option of formField.options) {
141135
const selected = `${option.value}` === fieldValue ? "selected" : "";
142-
fieldHTML += `<option value="${option.value}" ${selected}>${option.label}</option>`;
136+
fieldHTML += `<option value="${option.value}" ${selected}>${option.label.en}</option>`;
143137
}
144138
fieldHTML += `</select>`;
145139
} else if (fieldType === "date") {
@@ -156,7 +150,8 @@ async function updateFormContent(formData) {
156150
/**
157151
* Submit the form and send the data to the API
158152
*/
159-
async function submitForm(formData, date) {
153+
async function submitForm(formData, dateStr) {
154+
160155
const values = {};
161156
for (let i = 0; i < formData.length; i++) {
162157
const field = formData[i];
@@ -171,7 +166,8 @@ async function submitForm(formData, date) {
171166
values[field.id] = formField.value.trim();
172167
}
173168
}
174-
await patientLib.handleFormSubmit(formData, values, date);
169+
console.log('## SubmitForm', {formData, values});
170+
await patientLib.handleFormSubmit(formData, values, new Date(dateStr));
175171
alert("Form submitted successfully");
176-
refreshAll(date);
172+
await refreshAll(dateStr);
177173
}

patient-lib.js

Lines changed: 80 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { dataDefs } from './common-data-defs.js';
22
import { CookieUtils } from './CookieUtils.js';
3-
import { connectAPIEndpoint } from "./common-lib.js"
3+
import { connectAPIEndpoint, hdsModel } from "./common-lib.js"
44

55

66
export const patientLib = {
77
handleFormSubmit,
88
getFormTitle,
9-
getFormContent,
9+
getFormPermanentContent,
10+
getFormHistorical,
1011
getHistoricalContent,
1112
connect,
1213
navSetData,
1314
navGetData,
14-
getForms,
1515
navGetPages
1616
}
1717

@@ -53,7 +53,7 @@ async function navGetPages(questionaryId) {
5353
label: 'Home',
5454
formKey: null
5555
}];
56-
const forms = await patientLib.getForms(questionaryId);
56+
const forms = await getForms(questionaryId);
5757
for (const [formKey, form] of Object.entries(forms)) {
5858
pages.push({
5959
type: form.type,
@@ -69,41 +69,29 @@ async function navGetPages(questionaryId) {
6969
// ---------------- form content ---------------- //
7070

7171
function getFormTitle (questionaryId) {
72-
return dataDefs.questionnaires[questionaryId].title;
72+
return dataDefs.v2questionnaires[questionaryId].title;
7373
}
7474

7575
async function getForms (questionaryId) {
76-
return dataDefs.questionnaires[questionaryId].forms;
76+
return dataDefs.v2questionnaires[questionaryId].forms;
7777
}
7878

79-
/**
80-
* Get Form content
81-
* @param {string} questionaryId
82-
* @param {string} formKey
83-
* @param {Date} [date] - If editing content from existing date
84-
* @returns
85-
*/
86-
async function getFormContent (questionaryId, formKey, date) {
87-
const form = dataDefs.questionnaires[questionaryId].forms[formKey];
88-
console.log('## getFormContent', form, questionaryId, formKey);
89-
if (form.type === 'permanent') {
90-
return getFormExistingContent(form);
91-
}
92-
if (form.type === 'recurring') {
93-
return getFormRecurringContent(form, date);
94-
}
95-
return [];
96-
}
9779

98-
async function getFormRecurringContent (form, date) {
99-
const formReccuringData = structuredClone(form.content);
100-
101-
for (let i = 0; i < formReccuringData.length; i++) {
102-
const field = formReccuringData[i];
103-
field.id = field.streamId + ':' + field.eventType;
104-
}
105-
return formReccuringData;
106-
80+
async function getFormHistorical (questionaryId, formKey) {
81+
const form = dataDefs.v2questionnaires[questionaryId].forms[formKey];
82+
const formFields = form.itemKeys.map((itemKey) => {
83+
const itemDef = (hdsModel().itemDefForKey(itemKey));
84+
85+
return {
86+
id: itemDef.key,
87+
label: itemDef.data.label.en,
88+
type: itemDef.data.type,
89+
options: itemDef.data.options,
90+
streamId: itemDef.data.streamId,
91+
eventType: itemDef.eventTypes[0] // take first type by default for now
92+
}
93+
});
94+
return formFields;
10795
}
10896

10997
// local copy of formProfileContent + actual values
@@ -112,77 +100,89 @@ async function getFormRecurringContent (form, date) {
112100
* @param {*} date
113101
* @returns
114102
*/
115-
async function getFormExistingContent (form, date) {
116-
const formData = structuredClone(form.content);
117-
103+
async function getFormPermanentContent (questionaryId, formKey) {
104+
const form = dataDefs.v2questionnaires[questionaryId].forms[formKey];
105+
// get formItems
106+
const formItemDefs = form.itemKeys.map((itemKey) => (hdsModel().itemDefForKey(itemKey)));
118107
// get the values from the API
119-
const apiCalls = formData.map(field => ({
108+
const apiCalls = formItemDefs.map(itemDef => ({
120109
method: 'events.get',
121110
params: {
122-
streams: [field.streamId],
123-
types: [field.eventType],
111+
streams: [itemDef.data.streamId],
112+
types: itemDef.eventTypes,
124113
limit: 1,
125114
}
126115
}));
127116

117+
const formContent = [];
128118
const res = await connection.api(apiCalls);
129119
for (let i = 0; i < res.length; i++) {
130120
const e = res[i];
131-
const field = formData[i];
132-
field.id = field.streamId + ':' + field.eventType;
133-
console.log('## getFormContent ' + i, e);
121+
const itemDef = formItemDefs[i];
122+
const content = {
123+
id: itemDef.key,
124+
type: itemDef.data.type,
125+
label: itemDef.data.label.en,
126+
options: itemDef.data.options,
127+
itemDef,
128+
}
134129
if (e.events && e.events.length > 0) {
135130
const event = e.events[0];
136-
const valueAndTxt = valueAndTxtForField(event.content, field);
137-
field.value = valueAndTxt.value;
138-
field.valueTxt = valueAndTxt.txt;
139-
field.eventId = event.id; // will allow t track if the event is to be updated
131+
const valueAndTxt = valueAndTxtForField(event, itemDef);
132+
content.value = valueAndTxt.value;
133+
content.valueTxt = valueAndTxt.txt;
134+
content.eventId = event.id; // will allow t track if the event is to be updated
140135
}
136+
formContent.push(content);
141137
}
142-
return formData;
138+
return formContent;
143139
};
144140

145141

146142
async function getHistoricalContent(questionaryId, formKey) {
147-
const formFields = dataDefs.questionnaires[questionaryId].forms[formKey].content;
148-
const tableHeaders = formFields.map(field => ({
149-
fieldId: field.streamId + ':' + field.eventType,
150-
label: field.label,
151-
type: field.type
143+
const form = dataDefs.v2questionnaires[questionaryId].forms[formKey];
144+
const itemDefs = form.itemKeys.map((itemKey) => (hdsModel().itemDefForKey(itemKey)));
145+
const tableHeaders = itemDefs.map(itemDef => ({
146+
fieldId: itemDef.key,
147+
label: itemDef.data.label.en,
148+
type: itemDef.data.type
152149
}));
153150

154151
const valuesByDateStr = {};
155-
function addEntry (field, time, event) {
156-
const dateStr = (new Date(time * 1000)).toISOString().split('T')[0];
152+
function addEntry (event) {
153+
const itemDef = hdsModel().itemDefForEvent(event, false);
154+
if (itemDef == null) {
155+
console.log('Historical content -- unkown event', event);
156+
return;
157+
}
158+
const dateStr = (new Date(event.time * 1000)).toISOString().split('T')[0];
157159
if (valuesByDateStr[dateStr] == null) valuesByDateStr[dateStr] = {
158-
dateNum: (new Date(dateStr)).getTime() / 100,
160+
dateNum: (new Date(dateStr)).getTime() / 1000,
159161
dateStr,
160162
};
161-
const fieldId = field.streamId + ':' + field.eventType;
162-
const valueAndTxt = valueAndTxtForField(event.content, field);
163-
valuesByDateStr[dateStr][fieldId] = {
163+
const valueAndTxt = valueAndTxtForField(event, itemDef);
164+
valuesByDateStr[dateStr][itemDef.key] = {
164165
value: valueAndTxt.value,
165166
valueTxt: valueAndTxt.txt,
166167
eventId: event.id
167168
}
168169
}
169170

170171
// get the values from the API
171-
const apiCalls = formFields.map(field => ({
172+
const apiCalls = itemDefs.map(itemDef => ({
172173
method: 'events.get',
173174
params: {
174-
streams: [field.streamId],
175-
types: [field.eventType],
176-
limit: 20, // last 20 is enough for a demo
175+
streams: [itemDef.data.streamId],
176+
types: itemDef.eventTypes,
177+
limit: 20, // last 20 of each item is enough for a demo
177178
}
178179
}));
179180
const res = await connection.api(apiCalls);
180181
for (let i = 0; i < res.length; i++) {
181182
const e = res[i];
182-
const field = formFields[i];
183183
if (e.events) {
184184
for (const event of e.events) {
185-
addEntry(field, event.time, event);
185+
addEntry(event);
186186
}
187187
}
188188
}
@@ -192,37 +192,37 @@ async function getHistoricalContent(questionaryId, formKey) {
192192
return { tableHeaders, valuesByDate };
193193
}
194194

195-
function valueAndTxtForField (eventContent, field) {
196-
if (field.eventType === 'activity/plain' ) {
195+
function valueAndTxtForField (event, itemDef) {
196+
if (event.type === 'activity/plain' ) {
197197
return { value: 'x', txt: 'X'};
198198
}
199-
if (field.type === 'date' && eventContent != null ) {
199+
if (itemDef.data.type === 'date' && event.content != null ) {
200200
// convert the date to a Date object
201-
const date = new Date(eventContent);
201+
const date = new Date(event.content);
202202
if (!isNaN(date)) {
203203
const dayStr = date.toISOString().split('T')[0];
204204
return { value: dayStr, txt: dayStr }; // format YYYY-MM-DD
205205
}
206-
console.error('## Error parsing date', eventContent);
206+
console.error('## Error parsing date', event.content);
207207
return {value: '', txt: 'Error parsing date'};
208208
}
209-
if (field.type === 'select') {
210-
let value = eventContent;
209+
if (itemDef.data.type === 'select') {
210+
let value = event.content;
211211
let txt = value;
212-
if (field.eventType === 'ratio/generic') {
213-
value = eventContent.value;
212+
if (event.type === 'ratio/generic') {
213+
value = event.content.value;
214214
}
215-
216-
const selected = field.options.find((o) => ( o.value === value ));
215+
console.log({value, event})
216+
const selected = itemDef.data.options.find((o) => ( o.value === value ));
217217
if (selected) {
218-
txt = selected?.label;
218+
txt = selected?.label.en;
219219
}
220220
return { value, txt };
221+
}
222+
if (event.type === 'ratio/generic' && event.content != null ) {
223+
return { value: event.content.value, txt: event.content.value};
221224
}
222-
if (field.eventType === 'ratio/generic' && eventContent != null ) {
223-
return { value: eventContent.value, txt: eventContent.value};
224-
}
225-
return { value: eventContent, txt: eventContent };
225+
return { value: event.content, txt: event.content };
226226
}
227227

228228
// ---------------- create / update data ---------------- //

patient-profile-controler.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ async function refreshForm () {
2424
const { questionaryId, formKey } = navData;
2525
// -- content
2626
; console.log()
27-
const formData = await patientLib.getFormContent(questionaryId, formKey)
27+
const formData = await patientLib.getFormPermanentContent(questionaryId, formKey)
2828
updateFormContent(formData);
2929
document.getElementById('submit-button-list').onclick = function () {
3030
submitForm(formData);
@@ -38,7 +38,7 @@ async function refreshForm () {
3838
* Take the from content from the definition and actual values and create the HTML
3939
*/
4040
async function updateFormContent(formData) {
41-
console.log('Form content:', formData);
41+
console.log('### Form content:', formData);
4242

4343
// Append the HTML to the form
4444
document.getElementById('inputs-list').innerHTML = ''; // Clear previous content
@@ -58,7 +58,7 @@ async function updateFormContent(formData) {
5858
fieldHTML += `<option value="">--</option>`;
5959
for (const option of formField.options) {
6060
const selected = (option.value === fieldValue) ? 'selected' : '';
61-
fieldHTML += `<option value="${option.value}" ${selected}>${option.label}</option>`;
61+
fieldHTML += `<option value="${option.value}" ${selected}>${option.label.en}</option>`;
6262
}
6363
fieldHTML += `</select>`;
6464
} else if (fieldType === 'date') {

0 commit comments

Comments
 (0)