@aehrc/smart-forms-renderer 0.40.1 → 0.40.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js +2 -2
- package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js.map +1 -1
- package/lib/components/FormComponents/RepeatGroup/RepeatGroupView.js +6 -6
- package/lib/components/FormComponents/RepeatGroup/RepeatGroupView.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTable.js +8 -8
- package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTableBody.d.ts +1 -1
- package/lib/components/FormComponents/Tables/GroupTableBody.js +3 -3
- package/lib/components/FormComponents/Tables/GroupTableBody.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTableRow.d.ts +1 -1
- package/lib/components/FormComponents/Tables/GroupTableRow.js +4 -4
- package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTableView.d.ts +1 -1
- package/lib/components/Renderer/FormTopLevelItem.js +2 -1
- package/lib/components/Renderer/FormTopLevelItem.js.map +1 -1
- package/lib/hooks/useGroupTableRows.js +1 -1
- package/lib/hooks/useGroupTableRows.js.map +1 -1
- package/lib/hooks/useInitialiseGroupTable.js +8 -14
- package/lib/hooks/useInitialiseGroupTable.js.map +1 -1
- package/lib/hooks/useInitialiseRepeatGroups.d.ts +2 -2
- package/lib/hooks/useInitialiseRepeatGroups.js +10 -19
- package/lib/hooks/useInitialiseRepeatGroups.js.map +1 -1
- package/lib/hooks/useRepeatGroups.js +6 -2
- package/lib/hooks/useRepeatGroups.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/interfaces/groupTable.interface.d.ts +1 -1
- package/lib/interfaces/repeatGroup.interface.d.ts +1 -1
- package/lib/theme/palette.js +0 -4
- package/lib/theme/palette.js.map +1 -1
- package/lib/utils/groupTable.js +1 -1
- package/lib/utils/groupTable.js.map +1 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/manageForm.d.ts +7 -0
- package/lib/utils/manageForm.js +14 -1
- package/lib/utils/manageForm.js.map +1 -1
- package/lib/utils/repeatId.d.ts +2 -0
- package/lib/utils/repeatId.js +70 -2
- package/lib/utils/repeatId.js.map +1 -1
- package/package.json +1 -1
- package/src/components/FormComponents/RepeatGroup/RepeatGroup.tsx +2 -2
- package/src/components/FormComponents/RepeatGroup/RepeatGroupView.tsx +6 -6
- package/src/components/FormComponents/Tables/GroupTable.tsx +8 -8
- package/src/components/FormComponents/Tables/GroupTableBody.tsx +5 -5
- package/src/components/FormComponents/Tables/GroupTableRow.tsx +5 -5
- package/src/components/FormComponents/Tables/GroupTableView.tsx +1 -1
- package/src/components/Renderer/FormTopLevelItem.tsx +10 -8
- package/src/hooks/useGroupTableRows.ts +1 -1
- package/src/hooks/useInitialiseGroupTable.ts +8 -15
- package/src/hooks/useInitialiseRepeatGroups.ts +13 -24
- package/src/hooks/useRepeatGroups.ts +8 -4
- package/src/index.ts +1 -0
- package/src/interfaces/groupTable.interface.ts +1 -1
- package/src/interfaces/repeatGroup.interface.ts +1 -1
- package/src/stories/storybookWrappers/BuildFormButtonForStorybook.tsx +1 -1
- package/src/stories/storybookWrappers/IdRemoverButtonForStorybook.tsx +8 -11
- package/src/stories/storybookWrappers/IdRemoverDebuggerWrapperForStorybook.tsx +5 -2
- package/src/theme/palette.ts +0 -4
- package/src/utils/groupTable.ts +1 -1
- package/src/utils/index.ts +7 -1
- package/src/utils/manageForm.ts +27 -1
- package/src/utils/repeatId.ts +98 -2
package/lib/utils/manageForm.js
CHANGED
|
@@ -12,6 +12,8 @@ import { initialiseQuestionnaireResponse } from './initialise';
|
|
|
12
12
|
import { removeEmptyAnswers } from './removeEmptyAnswers';
|
|
13
13
|
import { readEncounter, readPatient, readUser } from '../api/smartClient';
|
|
14
14
|
import cloneDeep from 'lodash.clonedeep';
|
|
15
|
+
import { updateQuestionnaireResponse } from './genericRecursive';
|
|
16
|
+
import { removeInternalRepeatIdsRecursive } from './repeatId';
|
|
15
17
|
/**
|
|
16
18
|
* Build the form with an initial Questionnaire and an optional filled QuestionnaireResponse.
|
|
17
19
|
* If a QuestionnaireResponse is not provided, an empty QuestionnaireResponse is set as the initial QuestionnaireResponse.
|
|
@@ -86,7 +88,8 @@ export function initialiseFhirClient(fhirClient) {
|
|
|
86
88
|
* @author Sean Fong
|
|
87
89
|
*/
|
|
88
90
|
export function getResponse() {
|
|
89
|
-
|
|
91
|
+
const cleanResponse = removeInternalIdsFromResponse(questionnaireStore.getState().sourceQuestionnaire, questionnaireResponseStore.getState().updatableResponse);
|
|
92
|
+
return cloneDeep(cleanResponse);
|
|
90
93
|
}
|
|
91
94
|
/**
|
|
92
95
|
* Remove all empty/hidden answers from the filled QuestionnaireResponse.
|
|
@@ -107,6 +110,16 @@ export function removeEmptyAnswersFromResponse(questionnaire, questionnaireRespo
|
|
|
107
110
|
enableWhenExpressions
|
|
108
111
|
});
|
|
109
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Remove all instances of item.answer.id from the filled QuestionnaireResponse.
|
|
115
|
+
* These IDs are used internally for rendering repeating items, and can be safely left out of the final response.
|
|
116
|
+
*
|
|
117
|
+
* @author Sean Fong
|
|
118
|
+
*/
|
|
119
|
+
export function removeInternalIdsFromResponse(questionnaire, questionnaireResponse) {
|
|
120
|
+
const questionnaireResponseToUpdate = cloneDeep(questionnaireResponse);
|
|
121
|
+
return updateQuestionnaireResponse(questionnaire, questionnaireResponseToUpdate, removeInternalRepeatIdsRecursive, undefined);
|
|
122
|
+
}
|
|
110
123
|
/**
|
|
111
124
|
* Check if a QuestionnaireResponseItem has either an item or an answer property.
|
|
112
125
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manageForm.js","sourceRoot":"","sources":["../../src/utils/manageForm.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,SAAS,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"manageForm.js","sourceRoot":"","sources":["../../src/utils/manageForm.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/repeatId.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
+
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
1
2
|
export declare function generateNewRepeatId(linkId: string): string;
|
|
2
3
|
export declare function generateExistingRepeatId(linkId: string, index: number): string;
|
|
4
|
+
export declare function removeInternalRepeatIdsRecursive(qItem: QuestionnaireItem, qrItemOrItems: QuestionnaireResponseItem | QuestionnaireResponseItem[] | null): QuestionnaireResponseItem | QuestionnaireResponseItem[] | null;
|
package/lib/utils/repeatId.js
CHANGED
|
@@ -14,12 +14,80 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
18
|
+
var t = {};
|
|
19
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
20
|
+
t[p] = s[p];
|
|
21
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
22
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
23
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
24
|
+
t[p[i]] = s[p[i]];
|
|
25
|
+
}
|
|
26
|
+
return t;
|
|
27
|
+
};
|
|
17
28
|
import { nanoid } from 'nanoid';
|
|
29
|
+
import { getQrItemsIndex, mapQItemsIndex } from './mapItem';
|
|
18
30
|
export function generateNewRepeatId(linkId) {
|
|
19
|
-
return `${linkId}-${nanoid()}`;
|
|
31
|
+
return `${linkId}-repeat-${nanoid()}`;
|
|
20
32
|
}
|
|
21
33
|
export function generateExistingRepeatId(linkId, index) {
|
|
22
34
|
const paddedIndex = index.toString().padStart(6, '0');
|
|
23
|
-
return `${linkId}-${paddedIndex}`;
|
|
35
|
+
return `${linkId}-repeat-${paddedIndex}`;
|
|
36
|
+
}
|
|
37
|
+
export function removeInternalRepeatIdsRecursive(qItem, qrItemOrItems) {
|
|
38
|
+
var _a, _b;
|
|
39
|
+
// Process repeating group items separately
|
|
40
|
+
const hasMultipleAnswers = Array.isArray(qrItemOrItems);
|
|
41
|
+
if (hasMultipleAnswers) {
|
|
42
|
+
return removeInternalRepeatIdsFromRepeatGroup(qItem, qrItemOrItems);
|
|
43
|
+
}
|
|
44
|
+
// At this point qrItemOrItems is a single QuestionnaireResponseItem
|
|
45
|
+
const qrItem = qrItemOrItems;
|
|
46
|
+
// Process items with child items
|
|
47
|
+
const childQItems = (_a = qItem.item) !== null && _a !== void 0 ? _a : [];
|
|
48
|
+
const childQrItems = (_b = qrItem === null || qrItem === void 0 ? void 0 : qrItem.item) !== null && _b !== void 0 ? _b : [];
|
|
49
|
+
const updatedChildQrItems = [];
|
|
50
|
+
if (childQItems.length > 0) {
|
|
51
|
+
const indexMap = mapQItemsIndex(qItem);
|
|
52
|
+
const qrItemsByIndex = getQrItemsIndex(childQItems, childQrItems, indexMap);
|
|
53
|
+
// Iterate child items
|
|
54
|
+
for (const [index, childQItem] of childQItems.entries()) {
|
|
55
|
+
const childQRItemOrItems = qrItemsByIndex[index];
|
|
56
|
+
const updatedChildQRItemOrItems = removeInternalRepeatIdsRecursive(childQItem, childQRItemOrItems !== null && childQRItemOrItems !== void 0 ? childQRItemOrItems : null);
|
|
57
|
+
if (Array.isArray(updatedChildQRItemOrItems)) {
|
|
58
|
+
if (updatedChildQRItemOrItems.length > 0) {
|
|
59
|
+
updatedChildQrItems.push(...updatedChildQRItemOrItems);
|
|
60
|
+
}
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (updatedChildQRItemOrItems) {
|
|
64
|
+
updatedChildQrItems.push(updatedChildQRItemOrItems);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Construct updated qrItem
|
|
69
|
+
return removeInternalRepeatIdsFromItem(qItem, qrItem, updatedChildQrItems);
|
|
70
|
+
}
|
|
71
|
+
function removeInternalRepeatIdsFromRepeatGroup(qItem, qrItems) {
|
|
72
|
+
if (!qItem.item) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
return qrItems
|
|
76
|
+
.flatMap((childQrItem) => removeInternalRepeatIdsRecursive(qItem, childQrItem))
|
|
77
|
+
.filter((childQRItem) => !!childQRItem);
|
|
78
|
+
}
|
|
79
|
+
function removeInternalRepeatIdsFromItem(qItem, qrItem, childQrItems) {
|
|
80
|
+
var _a, _b;
|
|
81
|
+
if (!qrItem) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
// Remove internal repeatId from all answers
|
|
85
|
+
const updatedAnswers = (_b = (_a = qrItem.answer) === null || _a === void 0 ? void 0 : _a.map(
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
87
|
+
(_a) => {
|
|
88
|
+
var { id } = _a, rest = __rest(_a, ["id"]);
|
|
89
|
+
return Object.assign({}, rest);
|
|
90
|
+
}).filter((answer) => !!answer && Object.keys(answer).length > 0)) !== null && _b !== void 0 ? _b : [];
|
|
91
|
+
return Object.assign(Object.assign(Object.assign({ linkId: qItem.linkId }, (qItem.text && { text: qItem.text })), (childQrItems.length > 0 && { item: childQrItems })), (updatedAnswers.length > 0 && { answer: updatedAnswers }));
|
|
24
92
|
}
|
|
25
93
|
//# sourceMappingURL=repeatId.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repeatId.js","sourceRoot":"","sources":["../../src/utils/repeatId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG
|
|
1
|
+
{"version":3,"file":"repeatId.js","sourceRoot":"","sources":["../../src/utils/repeatId.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -58,7 +58,7 @@ function RepeatGroup(props: RepeatGroupProps) {
|
|
|
58
58
|
|
|
59
59
|
const mutateRepeatEnableWhenItems = useQuestionnaireStore.use.mutateRepeatEnableWhenItems();
|
|
60
60
|
|
|
61
|
-
const initialRepeatGroups = useInitialiseRepeatGroups(qItem, qrItems);
|
|
61
|
+
const initialRepeatGroups = useInitialiseRepeatGroups(qItem.linkId, qrItems);
|
|
62
62
|
|
|
63
63
|
const [repeatGroups, setRepeatGroups] = useRepeatGroups(initialRepeatGroups);
|
|
64
64
|
|
|
@@ -104,7 +104,7 @@ function RepeatGroup(props: RepeatGroupProps) {
|
|
|
104
104
|
setRepeatGroups([
|
|
105
105
|
...repeatGroups,
|
|
106
106
|
{
|
|
107
|
-
|
|
107
|
+
id: generateNewRepeatId(qItem.linkId),
|
|
108
108
|
qrItem: null
|
|
109
109
|
}
|
|
110
110
|
]);
|
|
@@ -76,7 +76,7 @@ function RepeatGroupView(props: RepeatGroupViewProps) {
|
|
|
76
76
|
return (
|
|
77
77
|
<QGroupContainerBox key={qItem.linkId} cardElevation={groupCardElevation} isRepeated={true}>
|
|
78
78
|
<Card elevation={groupCardElevation} sx={{ p: 2 }}>
|
|
79
|
-
{repeatGroups.map(({
|
|
79
|
+
{repeatGroups.map(({ id, qrItem: nullableQrItem }, index) => {
|
|
80
80
|
const answeredQrItem = createEmptyQrItem(qItem, undefined);
|
|
81
81
|
if (nullableQrItem) {
|
|
82
82
|
answeredQrItem.item = nullableQrItem.item;
|
|
@@ -84,7 +84,7 @@ function RepeatGroupView(props: RepeatGroupViewProps) {
|
|
|
84
84
|
|
|
85
85
|
return (
|
|
86
86
|
<RepeatGroupItem
|
|
87
|
-
key={
|
|
87
|
+
key={id}
|
|
88
88
|
qItem={qItem}
|
|
89
89
|
repeatGroupIndex={index}
|
|
90
90
|
answeredQrItem={answeredQrItem}
|
|
@@ -127,14 +127,14 @@ function RepeatGroupView(props: RepeatGroupViewProps) {
|
|
|
127
127
|
<AccordionDetails sx={{ pt: 0 }}>
|
|
128
128
|
{qItem.text ? <Divider sx={{ mb: 1.5 }} light /> : null}
|
|
129
129
|
<TransitionGroup>
|
|
130
|
-
{repeatGroups.map(({
|
|
130
|
+
{repeatGroups.map(({ id, qrItem: nullableQrItem }, index) => {
|
|
131
131
|
const answeredQrItem = createEmptyQrItem(qItem, undefined);
|
|
132
132
|
if (nullableQrItem) {
|
|
133
133
|
answeredQrItem.item = nullableQrItem.item;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
return (
|
|
137
|
-
<Collapse key={
|
|
137
|
+
<Collapse key={id} timeout={200}>
|
|
138
138
|
<RepeatGroupItem
|
|
139
139
|
qItem={qItem}
|
|
140
140
|
repeatGroupIndex={index}
|
|
@@ -169,14 +169,14 @@ function RepeatGroupView(props: RepeatGroupViewProps) {
|
|
|
169
169
|
</>
|
|
170
170
|
) : null}
|
|
171
171
|
<TransitionGroup>
|
|
172
|
-
{repeatGroups.map(({
|
|
172
|
+
{repeatGroups.map(({ id, qrItem: nullableQrItem }, index) => {
|
|
173
173
|
const answeredQrItem = createEmptyQrItem(qItem, undefined);
|
|
174
174
|
if (nullableQrItem) {
|
|
175
175
|
answeredQrItem.item = nullableQrItem.item;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
return (
|
|
179
|
-
<Collapse key={
|
|
179
|
+
<Collapse key={id} timeout={200}>
|
|
180
180
|
<RepeatGroupItem
|
|
181
181
|
qItem={qItem}
|
|
182
182
|
repeatGroupIndex={index}
|
|
@@ -104,7 +104,7 @@ function GroupTable(props: GroupTableProps) {
|
|
|
104
104
|
const updatedTableRows = [...tableRows];
|
|
105
105
|
|
|
106
106
|
const rowToRemove = updatedTableRows[index];
|
|
107
|
-
const updatedSelectedIds = selectedIds.filter((id) => id !== rowToRemove.
|
|
107
|
+
const updatedSelectedIds = selectedIds.filter((id) => id !== rowToRemove.id);
|
|
108
108
|
|
|
109
109
|
updatedTableRows.splice(index, 1);
|
|
110
110
|
|
|
@@ -117,21 +117,21 @@ function GroupTable(props: GroupTableProps) {
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
function handleAddRow() {
|
|
120
|
-
const
|
|
120
|
+
const newRowId = generateNewRepeatId(qItem.linkId);
|
|
121
121
|
setTableRows([
|
|
122
122
|
...tableRows,
|
|
123
123
|
{
|
|
124
|
-
|
|
124
|
+
id: newRowId,
|
|
125
125
|
qrItem: null
|
|
126
126
|
}
|
|
127
127
|
]);
|
|
128
|
-
setSelectedIds([...selectedIds,
|
|
128
|
+
setSelectedIds([...selectedIds, newRowId]);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
function handleSelectAll() {
|
|
132
132
|
// deselect all if all are selected, otherwise select all
|
|
133
133
|
const updatedTableIds =
|
|
134
|
-
selectedIds.length === tableRows.length ? [] : tableRows.map((tableRow) => tableRow.
|
|
134
|
+
selectedIds.length === tableRows.length ? [] : tableRows.map((tableRow) => tableRow.id);
|
|
135
135
|
setSelectedIds(updatedTableIds);
|
|
136
136
|
onQrRepeatGroupChange({
|
|
137
137
|
linkId: qItem.linkId,
|
|
@@ -139,12 +139,12 @@ function GroupTable(props: GroupTableProps) {
|
|
|
139
139
|
});
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
function handleSelectRow(
|
|
142
|
+
function handleSelectRow(rowId: string) {
|
|
143
143
|
const updatedSelectedIds = [...selectedIds];
|
|
144
144
|
|
|
145
|
-
const index = updatedSelectedIds.indexOf(
|
|
145
|
+
const index = updatedSelectedIds.indexOf(rowId);
|
|
146
146
|
if (index === -1) {
|
|
147
|
-
updatedSelectedIds.push(
|
|
147
|
+
updatedSelectedIds.push(rowId);
|
|
148
148
|
} else {
|
|
149
149
|
updatedSelectedIds.splice(index, 1);
|
|
150
150
|
}
|
|
@@ -41,7 +41,7 @@ interface GroupTableBodyProps
|
|
|
41
41
|
qItemsIndexMap: Record<string, number>;
|
|
42
42
|
onRowChange: (newQrRow: QuestionnaireResponseItem, index: number) => void;
|
|
43
43
|
onRemoveRow: (index: number) => void;
|
|
44
|
-
onSelectRow: (
|
|
44
|
+
onSelectRow: (rowId: string) => void;
|
|
45
45
|
onReorderRows: (newTableRows: GroupTableRowModel[]) => void;
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -80,8 +80,8 @@ function GroupTableBody(props: GroupTableBodyProps) {
|
|
|
80
80
|
<Droppable droppableId="gtable_rows" direction="vertical">
|
|
81
81
|
{(droppableProvided, snapshot) => (
|
|
82
82
|
<TableBody ref={droppableProvided.innerRef} {...droppableProvided.droppableProps}>
|
|
83
|
-
{tableRows.map(({
|
|
84
|
-
const itemIsSelected = selectedIds.indexOf(
|
|
83
|
+
{tableRows.map(({ id, qrItem: nullableQrItem }, index) => {
|
|
84
|
+
const itemIsSelected = selectedIds.indexOf(id) !== -1;
|
|
85
85
|
const answeredQrItem = createEmptyQrItem(tableQItem, undefined);
|
|
86
86
|
if (nullableQrItem) {
|
|
87
87
|
answeredQrItem.item = nullableQrItem.item;
|
|
@@ -89,9 +89,9 @@ function GroupTableBody(props: GroupTableBodyProps) {
|
|
|
89
89
|
|
|
90
90
|
return (
|
|
91
91
|
<GroupTableRow
|
|
92
|
-
key={
|
|
92
|
+
key={id}
|
|
93
93
|
index={index}
|
|
94
|
-
|
|
94
|
+
rowId={id}
|
|
95
95
|
tableQItem={tableQItem}
|
|
96
96
|
answeredQrItem={answeredQrItem}
|
|
97
97
|
nullableQrItem={nullableQrItem}
|
|
@@ -39,7 +39,7 @@ interface GroupTableRowProps
|
|
|
39
39
|
PropsWithShowMinimalViewAttribute,
|
|
40
40
|
PropsWithParentIsReadOnlyAttribute,
|
|
41
41
|
TableRowProps {
|
|
42
|
-
|
|
42
|
+
rowId: string;
|
|
43
43
|
index: number;
|
|
44
44
|
tableQItem: QuestionnaireItem;
|
|
45
45
|
answeredQrItem: QuestionnaireResponseItem;
|
|
@@ -58,7 +58,7 @@ interface GroupTableRowProps
|
|
|
58
58
|
|
|
59
59
|
function GroupTableRow(props: GroupTableRowProps) {
|
|
60
60
|
const {
|
|
61
|
-
|
|
61
|
+
rowId,
|
|
62
62
|
index,
|
|
63
63
|
tableQItem,
|
|
64
64
|
answeredQrItem,
|
|
@@ -78,7 +78,7 @@ function GroupTableRow(props: GroupTableRowProps) {
|
|
|
78
78
|
|
|
79
79
|
if (isRepeated) {
|
|
80
80
|
return (
|
|
81
|
-
<Draggable draggableId={
|
|
81
|
+
<Draggable draggableId={rowId} index={index}>
|
|
82
82
|
{(draggableProvided, snapshot) => (
|
|
83
83
|
<StyledGroupTableRow
|
|
84
84
|
itemIsDragged={snapshot.isDragging}
|
|
@@ -106,7 +106,7 @@ function GroupTableRow(props: GroupTableRowProps) {
|
|
|
106
106
|
<SelectRowButton
|
|
107
107
|
isSelected={itemIsSelected}
|
|
108
108
|
readOnly={readOnly}
|
|
109
|
-
onSelectItem={() => onSelectRow(
|
|
109
|
+
onSelectItem={() => onSelectRow(rowId)}
|
|
110
110
|
/>
|
|
111
111
|
</>
|
|
112
112
|
)}
|
|
@@ -150,7 +150,7 @@ function GroupTableRow(props: GroupTableRowProps) {
|
|
|
150
150
|
<SelectRowButton
|
|
151
151
|
isSelected={itemIsSelected}
|
|
152
152
|
readOnly={readOnly}
|
|
153
|
-
onSelectItem={() => onSelectRow(
|
|
153
|
+
onSelectItem={() => onSelectRow(rowId)}
|
|
154
154
|
/>
|
|
155
155
|
</>
|
|
156
156
|
)}
|
|
@@ -54,7 +54,7 @@ interface GroupTableViewProps
|
|
|
54
54
|
onAddRow: () => void;
|
|
55
55
|
onRowChange: (newQrRow: QuestionnaireResponseItem, index: number) => void;
|
|
56
56
|
onRemoveRow: (index: number) => void;
|
|
57
|
-
onSelectRow: (
|
|
57
|
+
onSelectRow: (rowId: string) => void;
|
|
58
58
|
onSelectAll: () => void;
|
|
59
59
|
onReorderRows: (newTableRows: GroupTableRowModel[]) => void;
|
|
60
60
|
}
|
|
@@ -175,14 +175,16 @@ function FormTopLevelItem(props: FormTopLevelItemProps) {
|
|
|
175
175
|
const itemRepeatsAndIsNotCheckbox = isRepeatItemAndNotCheckbox(topLevelQItem);
|
|
176
176
|
if (itemRepeatsAndIsNotCheckbox) {
|
|
177
177
|
return (
|
|
178
|
-
<
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
178
|
+
<Box mt={1}>
|
|
179
|
+
<RepeatItem
|
|
180
|
+
key={topLevelQItem.linkId}
|
|
181
|
+
qItem={topLevelQItem}
|
|
182
|
+
qrItem={topLevelQRItem}
|
|
183
|
+
groupCardElevation={1}
|
|
184
|
+
parentIsReadOnly={readOnly}
|
|
185
|
+
onQrItemChange={onQrItemChange}
|
|
186
|
+
/>
|
|
187
|
+
</Box>
|
|
186
188
|
);
|
|
187
189
|
}
|
|
188
190
|
|
|
@@ -24,7 +24,7 @@ function useGroupTableRows(linkId: string, qrItems: QuestionnaireResponseItem[])
|
|
|
24
24
|
|
|
25
25
|
const [tableRows, setTableRows] = useState(initialisedGroupTableRows);
|
|
26
26
|
const [selectedIds, setSelectedIds] = useState<string[]>(
|
|
27
|
-
initialisedGroupTableRows.map((row) => row.
|
|
27
|
+
initialisedGroupTableRows.map((row) => row.id)
|
|
28
28
|
);
|
|
29
29
|
|
|
30
30
|
return { tableRows, selectedIds, setTableRows, setSelectedIds };
|
|
@@ -23,23 +23,16 @@ function useInitialiseGroupTable(
|
|
|
23
23
|
linkId: string,
|
|
24
24
|
qrItems: QuestionnaireResponseItem[]
|
|
25
25
|
): GroupTableRowModel[] {
|
|
26
|
-
|
|
27
|
-
{
|
|
28
|
-
nanoId: generateNewRepeatId(linkId),
|
|
29
|
-
qrItem: null
|
|
30
|
-
}
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
if (qrItems.length > 0) {
|
|
34
|
-
initialGroupTableRows = qrItems.map((qrItem, index) => {
|
|
35
|
-
return {
|
|
36
|
-
nanoId: generateExistingRepeatId(linkId, index),
|
|
37
|
-
qrItem
|
|
38
|
-
};
|
|
39
|
-
});
|
|
26
|
+
if (qrItems.length === 0) {
|
|
27
|
+
return [{ id: generateNewRepeatId(linkId), qrItem: null }];
|
|
40
28
|
}
|
|
41
29
|
|
|
42
|
-
return
|
|
30
|
+
return qrItems.map((qrItem, index) => {
|
|
31
|
+
return {
|
|
32
|
+
id: generateExistingRepeatId(linkId, index),
|
|
33
|
+
qrItem
|
|
34
|
+
};
|
|
35
|
+
});
|
|
43
36
|
}
|
|
44
37
|
|
|
45
38
|
export default useInitialiseGroupTable;
|
|
@@ -15,38 +15,27 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import type {
|
|
18
|
+
import type { QuestionnaireResponseItem } from 'fhir/r4';
|
|
19
19
|
import type { RepeatGroupSingle } from '../interfaces/repeatGroup.interface';
|
|
20
20
|
import { useMemo } from 'react';
|
|
21
21
|
import { generateExistingRepeatId, generateNewRepeatId } from '../utils/repeatId';
|
|
22
22
|
|
|
23
23
|
function useInitialiseRepeatGroups(
|
|
24
|
-
|
|
24
|
+
linkId: string,
|
|
25
25
|
qrItems: QuestionnaireResponseItem[]
|
|
26
26
|
): RepeatGroupSingle[] {
|
|
27
|
-
return useMemo(
|
|
28
|
-
()
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
nanoId: generateNewRepeatId(qItem.linkId),
|
|
32
|
-
qrItem: null
|
|
33
|
-
}
|
|
34
|
-
];
|
|
27
|
+
return useMemo(() => {
|
|
28
|
+
if (qrItems.length === 0) {
|
|
29
|
+
return [{ id: generateNewRepeatId(linkId), qrItem: null }];
|
|
30
|
+
}
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
return initialRepeatGroupAnswers;
|
|
45
|
-
},
|
|
46
|
-
// Requires checking of both qItem and qrItems
|
|
47
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
48
|
-
[qItem, qrItems]
|
|
49
|
-
);
|
|
32
|
+
return qrItems.map((qrItem, index) => {
|
|
33
|
+
return {
|
|
34
|
+
id: generateExistingRepeatId(linkId, index),
|
|
35
|
+
qrItem
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
}, [linkId, qrItems]);
|
|
50
39
|
}
|
|
51
40
|
|
|
52
41
|
export default useInitialiseRepeatGroups;
|
|
@@ -19,6 +19,7 @@ import type { Dispatch, SetStateAction } from 'react';
|
|
|
19
19
|
import { useEffect, useState } from 'react';
|
|
20
20
|
import type { RepeatGroupSingle } from '../interfaces/repeatGroup.interface';
|
|
21
21
|
import _isEqual from 'lodash/isEqual';
|
|
22
|
+
import type { QuestionnaireResponseItem } from 'fhir/r4';
|
|
22
23
|
|
|
23
24
|
function useRepeatGroups(
|
|
24
25
|
valueFromProps: RepeatGroupSingle[]
|
|
@@ -27,10 +28,13 @@ function useRepeatGroups(
|
|
|
27
28
|
|
|
28
29
|
useEffect(
|
|
29
30
|
() => {
|
|
30
|
-
const valueFromPropsQRItems = valueFromProps
|
|
31
|
-
(repeatGroupSingle) => repeatGroupSingle.qrItem
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const valueFromPropsQRItems = valueFromProps
|
|
32
|
+
.map((repeatGroupSingle) => repeatGroupSingle.qrItem)
|
|
33
|
+
.filter((qrItem): qrItem is QuestionnaireResponseItem => qrItem !== null);
|
|
34
|
+
|
|
35
|
+
const repeatGroupsQRItems = repeatGroups
|
|
36
|
+
.map((repeatGroupSingle) => repeatGroupSingle.qrItem)
|
|
37
|
+
.filter((qrItem): qrItem is QuestionnaireResponseItem => qrItem !== null);
|
|
34
38
|
|
|
35
39
|
if (!_isEqual(valueFromPropsQRItems, repeatGroupsQRItems)) {
|
|
36
40
|
setRepeatGroups(valueFromProps);
|
package/src/index.ts
CHANGED
|
@@ -44,7 +44,7 @@ function BuildFormButtonForStorybook(props: BuildFormButtonProps) {
|
|
|
44
44
|
<Box display="flex" mb={0.5} alignItems="center" columnGap={3}>
|
|
45
45
|
<Tooltip title="Build form with questionnaire response" placement="right">
|
|
46
46
|
<IconButton onClick={handleBuildForm} size="small" color="primary">
|
|
47
|
-
<Iconify icon="ph:hammer"
|
|
47
|
+
<Iconify icon="ph:hammer" />
|
|
48
48
|
</IconButton>
|
|
49
49
|
</Tooltip>
|
|
50
50
|
</Box>
|
|
@@ -17,27 +17,24 @@
|
|
|
17
17
|
|
|
18
18
|
// @ts-ignore
|
|
19
19
|
import React from 'react';
|
|
20
|
-
import type { QuestionnaireResponse } from 'fhir/r4';
|
|
20
|
+
import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
21
21
|
import { Box, IconButton, Tooltip } from '@mui/material';
|
|
22
22
|
import ContentCutIcon from '@mui/icons-material/ContentCut';
|
|
23
|
+
import { useQuestionnaireResponseStore } from '../../stores';
|
|
24
|
+
import { removeInternalIdsFromResponse } from '../../utils/manageForm';
|
|
23
25
|
|
|
24
26
|
interface IdRemoverButtonProps {
|
|
27
|
+
questionnaire: Questionnaire;
|
|
25
28
|
questionnaireResponse: QuestionnaireResponse;
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
function IdRemoverButtonForStorybook(props: IdRemoverButtonProps) {
|
|
29
|
-
const { questionnaireResponse } = props;
|
|
32
|
+
const { questionnaire, questionnaireResponse } = props;
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
console.log('handle remove IDs');
|
|
34
|
+
const updateResponse = useQuestionnaireResponseStore.use.updateResponse();
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// questionnaire,
|
|
37
|
-
// populatedResponse,
|
|
38
|
-
// initialiseItemCalculatedExpressionValueRecursive,
|
|
39
|
-
// calculatedExpressionsWithValues
|
|
40
|
-
// );
|
|
36
|
+
async function handleRemoveIds() {
|
|
37
|
+
updateResponse(removeInternalIdsFromResponse(questionnaire, questionnaireResponse));
|
|
41
38
|
}
|
|
42
39
|
|
|
43
40
|
return (
|
|
@@ -48,7 +48,7 @@ function IdRemoverDebuggerWrapperForStorybook(props: IdRemoverDebuggerWrapperFor
|
|
|
48
48
|
|
|
49
49
|
const isBuilding = useBuildForm(
|
|
50
50
|
questionnaire,
|
|
51
|
-
|
|
51
|
+
questionnaireResponse,
|
|
52
52
|
undefined,
|
|
53
53
|
STORYBOOK_TERMINOLOGY_SERVER_URL
|
|
54
54
|
);
|
|
@@ -63,7 +63,10 @@ function IdRemoverDebuggerWrapperForStorybook(props: IdRemoverDebuggerWrapperFor
|
|
|
63
63
|
<div>
|
|
64
64
|
<Grid container>
|
|
65
65
|
<Grid item xs={6}>
|
|
66
|
-
<IdRemoverButtonForStorybook
|
|
66
|
+
<IdRemoverButtonForStorybook
|
|
67
|
+
questionnaire={questionnaire}
|
|
68
|
+
questionnaireResponse={updatableResponse}
|
|
69
|
+
/>
|
|
67
70
|
<BaseRenderer />
|
|
68
71
|
</Grid>
|
|
69
72
|
<Grid item xs={6}>
|
package/src/theme/palette.ts
CHANGED
package/src/utils/groupTable.ts
CHANGED
|
@@ -32,6 +32,6 @@ export function reorderRows(
|
|
|
32
32
|
|
|
33
33
|
export function getGroupTableItemsToUpdate(tableRows: GroupTableRowModel[], selectedIds: string[]) {
|
|
34
34
|
return tableRows
|
|
35
|
-
.filter((row) => selectedIds.includes(row.
|
|
35
|
+
.filter((row) => selectedIds.includes(row.id))
|
|
36
36
|
.flatMap((singleRow) => (singleRow.qrItem ? [cloneDeep(singleRow.qrItem)] : []));
|
|
37
37
|
}
|
package/src/utils/index.ts
CHANGED
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
export {
|
|
18
|
+
export {
|
|
19
|
+
buildForm,
|
|
20
|
+
destroyForm,
|
|
21
|
+
getResponse,
|
|
22
|
+
removeEmptyAnswersFromResponse,
|
|
23
|
+
removeInternalIdsFromResponse
|
|
24
|
+
} from './manageForm';
|
|
19
25
|
export { initialiseQuestionnaireResponse } from './initialise';
|
|
20
26
|
export { isSpecificItemControl } from './itemControl';
|
|
21
27
|
export { isRepeatItemAndNotCheckbox } from './qItem';
|