@aehrc/smart-forms-renderer 0.9.2 → 0.10.0
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/.swcrc +11 -0
- package/lib/components/FormComponents/GroupItem/NextTabButtonWrapper.js +5 -5
- package/lib/components/FormComponents/GroupItem/NextTabButtonWrapper.js.map +1 -1
- package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js +1 -1
- package/lib/components/FormComponents/RepeatItem/RemoveItemButton.d.ts +10 -0
- package/lib/components/FormComponents/RepeatItem/RemoveItemButton.js +30 -0
- package/lib/components/FormComponents/RepeatItem/RemoveItemButton.js.map +1 -0
- package/lib/components/FormComponents/RepeatItem/RepeatField.js +2 -2
- package/lib/components/FormComponents/SingleItem/SingleItem.js +2 -2
- package/lib/components/FormComponents/SingleItem/SingleItem.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTable.d.ts +1 -2
- package/lib/components/FormComponents/Tables/GroupTable.js +44 -59
- package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTableBody.d.ts +17 -0
- package/lib/components/FormComponents/Tables/GroupTableBody.js +48 -0
- package/lib/components/FormComponents/Tables/GroupTableBody.js.map +1 -0
- package/lib/components/FormComponents/Tables/GroupTableRow.d.ts +18 -5
- package/lib/components/FormComponents/Tables/GroupTableRow.js +17 -25
- package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTableRowCells.d.ts +11 -0
- package/lib/components/FormComponents/Tables/GroupTableRowCells.js +57 -0
- package/lib/components/FormComponents/Tables/GroupTableRowCells.js.map +1 -0
- package/lib/components/FormComponents/Tables/GroupTableRows.d.ts +17 -0
- package/lib/components/FormComponents/Tables/GroupTableRows.js +45 -0
- package/lib/components/FormComponents/Tables/GroupTableRows.js.map +1 -0
- package/lib/components/FormComponents/Tables/GroupTableTestRow.d.ts +22 -0
- package/lib/components/FormComponents/Tables/GroupTableTestRow.js +43 -0
- package/lib/components/FormComponents/Tables/GroupTableTestRow.js.map +1 -0
- package/lib/components/FormComponents/Tables/GroupTableView.d.ts +21 -0
- package/lib/components/FormComponents/Tables/GroupTableView.js +65 -0
- package/lib/components/FormComponents/Tables/GroupTableView.js.map +1 -0
- package/lib/components/FormComponents/Tables/RemoveRowButton.d.ts +10 -0
- package/lib/components/FormComponents/Tables/RemoveRowButton.js +32 -0
- package/lib/components/FormComponents/Tables/RemoveRowButton.js.map +1 -0
- package/lib/components/FormComponents/Tables/SelectRowButton.d.ts +7 -0
- package/lib/components/FormComponents/Tables/SelectRowButton.js +26 -0
- package/lib/components/FormComponents/Tables/SelectRowButton.js.map +1 -0
- package/lib/components/FormComponents/Tables/Table.styles.d.ts +8 -0
- package/lib/components/FormComponents/Tables/Table.styles.js +17 -0
- package/lib/components/FormComponents/Tables/Table.styles.js.map +1 -1
- package/lib/components/Renderer/BaseRenderer.js +5 -6
- package/lib/components/Renderer/BaseRenderer.js.map +1 -1
- package/lib/components/Renderer/FormBodyCollapsible.js +4 -4
- package/lib/components/Renderer/FormBodyCollapsible.js.map +1 -1
- package/lib/components/Renderer/FormBodyTabbed.js +3 -3
- package/lib/components/Renderer/FormBodyTabbed.js.map +1 -1
- package/lib/components/Tabs/CompleteTabButton.js +2 -2
- package/lib/components/Tabs/CompleteTabButton.js.map +1 -1
- package/lib/components/Tabs/FormBodySingleTab.js +2 -2
- package/lib/components/Tabs/FormBodySingleTab.js.map +1 -1
- package/lib/components/Tabs/FormBodyTabList.js +4 -4
- package/lib/components/Tabs/FormBodyTabList.js.map +1 -1
- package/lib/hooks/useDecimalCalculatedExpression.js +2 -2
- package/lib/hooks/useDecimalCalculatedExpression.js.map +1 -1
- package/lib/hooks/useHidden.js +4 -4
- package/lib/hooks/useHidden.js.map +1 -1
- package/lib/hooks/useInitialiseGroupTable.d.ts +2 -2
- package/lib/hooks/useInitialiseGroupTable.js.map +1 -1
- package/lib/hooks/useInitialiseRenderer.js +11 -14
- package/lib/hooks/useInitialiseRenderer.js.map +1 -1
- package/lib/hooks/useIntegerCalculatedExpression.js +2 -2
- package/lib/hooks/useIntegerCalculatedExpression.js.map +1 -1
- package/lib/hooks/useMinimalStringCalculatedExpression.js +25 -13
- package/lib/hooks/useStringCalculatedExpression.js +2 -2
- package/lib/hooks/useStringCalculatedExpression.js.map +1 -1
- package/lib/hooks/useTerminologyServerQuery.js +3 -4
- package/lib/hooks/useTerminologyServerQuery.js.map +1 -1
- package/lib/hooks/useValueSetCodings.js +10 -12
- package/lib/hooks/useValueSetCodings.js.map +1 -1
- package/lib/index.js +19 -20
- package/lib/index.js.map +1 -1
- package/lib/interfaces/groupTable.interface.d.ts +1 -1
- package/lib/setup-jest.js +1 -0
- package/lib/setup-jest.js.map +1 -0
- package/lib/stores/index.d.ts +4 -3
- package/lib/stores/index.js +4 -3
- package/lib/stores/index.js.map +1 -1
- package/lib/stores/questionnaireResponseStore.d.ts +28 -0
- package/lib/stores/questionnaireResponseStore.js +64 -0
- package/lib/stores/questionnaireResponseStore.js.map +1 -0
- package/lib/stores/questionnaireStore.d.ts +65 -0
- package/lib/stores/questionnaireStore.js +172 -0
- package/lib/stores/questionnaireStore.js.map +1 -0
- package/lib/stores/smartConfigStore.d.ts +25 -0
- package/lib/stores/smartConfigStore.js +30 -0
- package/lib/stores/smartConfigStore.js.map +1 -0
- package/lib/stores/terminologyServerStore.d.ts +14 -0
- package/lib/stores/terminologyServerStore.js +26 -0
- package/lib/stores/terminologyServerStore.js.map +1 -0
- package/lib/stores/useQuestionnaireResponseStore.d.ts +14 -2
- package/lib/stores/useQuestionnaireResponseStore.js +4 -2
- package/lib/stores/useQuestionnaireResponseStore.js.map +1 -1
- package/lib/stores/useQuestionnaireStore.d.ts +30 -2
- package/lib/stores/useQuestionnaireStore.js +4 -2
- package/lib/stores/useQuestionnaireStore.js.map +1 -1
- package/lib/stories/MedicalHistoryTable.stories.js +49 -0
- package/lib/stories/MedicalHistoryTable.stories.js.map +1 -0
- package/lib/stories/SmartFormsRenderer.stories.js +103 -0
- package/lib/stories/SmartFormsRenderer.stories.js.map +1 -0
- package/lib/theme/overrides/Table.d.ts +1 -0
- package/lib/theme/overrides/Table.js +2 -1
- package/lib/theme/overrides/Table.js.map +1 -1
- package/lib/utils/calculatedExpression.js +1 -2
- package/lib/utils/calculatedExpression.js.map +1 -1
- package/lib/utils/groupTable.d.ts +3 -0
- package/lib/utils/groupTable.js +29 -0
- package/lib/utils/groupTable.js.map +1 -0
- package/package.json +10 -5
- package/src/components/FormComponents/GroupItem/NextTabButtonWrapper.tsx +5 -5
- package/src/components/FormComponents/RepeatGroup/DeleteItemButton.tsx +1 -1
- package/src/components/FormComponents/RepeatItem/{DeleteItemButton.tsx → RemoveItemButton.tsx} +4 -4
- package/src/components/FormComponents/RepeatItem/RepeatField.tsx +2 -2
- package/src/components/FormComponents/SingleItem/SingleItem.tsx +2 -2
- package/src/components/FormComponents/Tables/GroupTable.tsx +71 -120
- package/src/components/FormComponents/Tables/GroupTableBody.tsx +116 -0
- package/src/components/FormComponents/Tables/GroupTableRow.tsx +89 -49
- package/src/components/FormComponents/Tables/GroupTableRowCells.tsx +87 -0
- package/src/components/FormComponents/Tables/GroupTableView.tsx +169 -0
- package/src/components/FormComponents/Tables/{DeleteRowButton.tsx → RemoveRowButton.tsx} +7 -7
- package/src/components/FormComponents/Tables/SelectRowButton.tsx +37 -0
- package/src/components/FormComponents/Tables/Table.styles.tsx +25 -0
- package/src/components/Renderer/BaseRenderer.tsx +5 -6
- package/src/components/Renderer/FormBodyCollapsible.tsx +4 -5
- package/src/components/Renderer/FormBodyTabbed.tsx +3 -3
- package/src/components/Tabs/CompleteTabButton.tsx +2 -2
- package/src/components/Tabs/FormBodySingleTab.tsx +2 -3
- package/src/components/Tabs/FormBodyTabList.tsx +4 -4
- package/src/hooks/useDecimalCalculatedExpression.ts +2 -2
- package/src/hooks/useHidden.ts +4 -4
- package/src/hooks/useInitialiseGroupTable.ts +3 -3
- package/src/hooks/useInitialiseRenderer.ts +17 -18
- package/src/hooks/useIntegerCalculatedExpression.ts +2 -2
- package/src/hooks/useStringCalculatedExpression.ts +2 -2
- package/src/hooks/useTerminologyServerQuery.ts +3 -4
- package/src/hooks/useValueSetCodings.ts +10 -12
- package/src/index.ts +19 -20
- package/src/interfaces/groupTable.interface.ts +1 -1
- package/src/stores/index.ts +7 -3
- package/src/stores/questionnaireResponseStore.ts +83 -0
- package/src/stores/{useQuestionnaireStore.ts → questionnaireStore.ts} +7 -6
- package/src/stores/smartConfigStore.ts +45 -0
- package/src/stores/{useTerminologyServerStore.ts → terminologyServerStore.ts} +5 -4
- package/src/stories/MedicalHistoryTable.stories.tsx +61 -0
- package/src/stories/SmartFormsRenderer.stories.ts +15 -5
- package/src/stories/assets/QItems-and-QRItems/QR_GTableMedicalHistory.json +80 -0
- package/src/stories/assets/QItems-and-QRItems/Q_GTableMedicalHistory.json +109 -0
- package/src/stories/assets/Qs-and-QRs/QDev715.json +16081 -0
- package/src/theme/overrides/Table.ts +2 -1
- package/src/utils/calculatedExpression.ts +1 -2
- package/src/utils/groupTable.ts +37 -0
- package/src/stores/useQuestionnaireResponseStore.ts +0 -63
- package/src/stores/useSmartConfigStore.ts +0 -27
- /package/src/stories/assets/{Q715.json → Qs-and-QRs/Q715.json} +0 -0
- /package/src/stories/assets/{QTestGrid.json → Qs-and-QRs/QTestGrid.json} +0 -0
- /package/src/stories/assets/{R715.json → Qs-and-QRs/R715.json} +0 -0
- /package/src/stories/assets/{RTestGrid.json → Qs-and-QRs/RTestGrid.json} +0 -0
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { useEffect, useState } from 'react';
|
|
19
19
|
import { createEmptyQrItem } from '../utils/qrItem';
|
|
20
20
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
21
|
-
import useQuestionnaireStore from '../stores
|
|
21
|
+
import { useQuestionnaireStore } from '../stores';
|
|
22
22
|
|
|
23
23
|
interface UseDecimalCalculatedExpression {
|
|
24
24
|
calcExpUpdated: boolean;
|
|
@@ -37,7 +37,7 @@ function useDecimalCalculatedExpression(
|
|
|
37
37
|
): UseDecimalCalculatedExpression {
|
|
38
38
|
const { qItem, inputValue, precision, setInputValue, onQrItemChange } = props;
|
|
39
39
|
|
|
40
|
-
const calculatedExpressions = useQuestionnaireStore
|
|
40
|
+
const calculatedExpressions = useQuestionnaireStore.use.calculatedExpressions();
|
|
41
41
|
|
|
42
42
|
const [calcExpUpdated, setCalcExpUpdated] = useState(false);
|
|
43
43
|
|
package/src/hooks/useHidden.ts
CHANGED
|
@@ -17,13 +17,13 @@
|
|
|
17
17
|
|
|
18
18
|
import type { QuestionnaireItem } from 'fhir/r4';
|
|
19
19
|
import { hasHiddenExtension } from '../utils/itemControl';
|
|
20
|
-
import useQuestionnaireStore from '../stores
|
|
20
|
+
import { useQuestionnaireStore } from '../stores';
|
|
21
21
|
import { isHiddenByEnableWhens } from '../utils/qItem';
|
|
22
22
|
|
|
23
23
|
function useHidden(qItem: QuestionnaireItem): boolean {
|
|
24
|
-
const enableWhenIsActivated = useQuestionnaireStore
|
|
25
|
-
const enableWhenItems = useQuestionnaireStore
|
|
26
|
-
const enableWhenExpressions = useQuestionnaireStore
|
|
24
|
+
const enableWhenIsActivated = useQuestionnaireStore.use.enableWhenIsActivated();
|
|
25
|
+
const enableWhenItems = useQuestionnaireStore.use.enableWhenItems();
|
|
26
|
+
const enableWhenExpressions = useQuestionnaireStore.use.enableWhenExpressions();
|
|
27
27
|
|
|
28
28
|
if (hasHiddenExtension(qItem)) {
|
|
29
29
|
return true;
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
|
|
18
18
|
import type { QuestionnaireResponseItem } from 'fhir/r4';
|
|
19
19
|
import { nanoid } from 'nanoid';
|
|
20
|
-
import type {
|
|
20
|
+
import type { GroupTableRowModel } from '../interfaces/groupTable.interface';
|
|
21
21
|
|
|
22
|
-
function useInitialiseGroupTable(qrItems: QuestionnaireResponseItem[]):
|
|
23
|
-
let initialGroupTableRows:
|
|
22
|
+
function useInitialiseGroupTable(qrItems: QuestionnaireResponseItem[]): GroupTableRowModel[] {
|
|
23
|
+
let initialGroupTableRows: GroupTableRowModel[] = [
|
|
24
24
|
{
|
|
25
25
|
nanoId: nanoid(),
|
|
26
26
|
qrItem: null
|
|
@@ -18,12 +18,14 @@
|
|
|
18
18
|
import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
19
19
|
import { useLayoutEffect, useState } from 'react';
|
|
20
20
|
import { createEmptyQuestionnaireResponse } from '../utils/qrItem';
|
|
21
|
-
import useQuestionnaireStore from '../stores/useQuestionnaireStore';
|
|
22
|
-
import useQuestionnaireResponseStore from '../stores/useQuestionnaireResponseStore';
|
|
23
21
|
import type Client from 'fhirclient/lib/Client';
|
|
24
|
-
import useSmartConfigStore from '../stores/useSmartConfigStore';
|
|
25
22
|
import { readEncounter, readPatient, readUser } from '../api/smartClient';
|
|
26
|
-
import
|
|
23
|
+
import {
|
|
24
|
+
useQuestionnaireResponseStore,
|
|
25
|
+
useQuestionnaireStore,
|
|
26
|
+
useSmartConfigStore,
|
|
27
|
+
useTerminologyServerStore
|
|
28
|
+
} from '../stores';
|
|
27
29
|
|
|
28
30
|
function useInitialiseRenderer(
|
|
29
31
|
questionnaire: Questionnaire,
|
|
@@ -32,21 +34,18 @@ function useInitialiseRenderer(
|
|
|
32
34
|
terminologyServerUrl?: string,
|
|
33
35
|
fhirClient?: Client
|
|
34
36
|
): boolean {
|
|
35
|
-
const buildSourceQuestionnaire = useQuestionnaireStore
|
|
36
|
-
const updatePopulatedProperties = useQuestionnaireStore(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const setUpdatableResponseAsPopulated = useQuestionnaireResponseStore(
|
|
41
|
-
(state) => state.setUpdatableResponseAsPopulated
|
|
42
|
-
);
|
|
37
|
+
const buildSourceQuestionnaire = useQuestionnaireStore.use.buildSourceQuestionnaire();
|
|
38
|
+
const updatePopulatedProperties = useQuestionnaireStore.use.updatePopulatedProperties();
|
|
39
|
+
const buildSourceResponse = useQuestionnaireResponseStore.use.buildSourceResponse();
|
|
40
|
+
const setUpdatableResponseAsPopulated =
|
|
41
|
+
useQuestionnaireResponseStore.use.setUpdatableResponseAsPopulated();
|
|
43
42
|
|
|
44
|
-
const setTerminologyServerUrl = useTerminologyServerStore
|
|
45
|
-
const resetTerminologyServerUrl = useTerminologyServerStore
|
|
46
|
-
const setSmartClient = useSmartConfigStore
|
|
47
|
-
const setPatient = useSmartConfigStore
|
|
48
|
-
const setUser = useSmartConfigStore
|
|
49
|
-
const setEncounter = useSmartConfigStore
|
|
43
|
+
const setTerminologyServerUrl = useTerminologyServerStore.use.setUrl();
|
|
44
|
+
const resetTerminologyServerUrl = useTerminologyServerStore.use.resetUrl();
|
|
45
|
+
const setSmartClient = useSmartConfigStore.use.setClient();
|
|
46
|
+
const setPatient = useSmartConfigStore.use.setPatient();
|
|
47
|
+
const setUser = useSmartConfigStore.use.setUser();
|
|
48
|
+
const setEncounter = useSmartConfigStore.use.setEncounter();
|
|
50
49
|
|
|
51
50
|
const [loading, setLoading] = useState(true);
|
|
52
51
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { useEffect, useState } from 'react';
|
|
19
19
|
import { createEmptyQrItem } from '../utils/qrItem';
|
|
20
20
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
21
|
-
import useQuestionnaireStore from '../stores/
|
|
21
|
+
import { useQuestionnaireStore } from '../stores/questionnaireStore';
|
|
22
22
|
|
|
23
23
|
interface UseIntegerCalculatedExpression {
|
|
24
24
|
calcExpUpdated: boolean;
|
|
@@ -36,7 +36,7 @@ function useIntegerCalculatedExpression(
|
|
|
36
36
|
): UseIntegerCalculatedExpression {
|
|
37
37
|
const { qItem, inputValue, setInputValue, onQrItemChange } = props;
|
|
38
38
|
|
|
39
|
-
const calculatedExpressions = useQuestionnaireStore
|
|
39
|
+
const calculatedExpressions = useQuestionnaireStore.use.calculatedExpressions();
|
|
40
40
|
|
|
41
41
|
const [calcExpUpdated, setCalcExpUpdated] = useState(false);
|
|
42
42
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { useEffect, useState } from 'react';
|
|
19
19
|
import { createEmptyQrItem } from '../utils/qrItem';
|
|
20
20
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
21
|
-
import useQuestionnaireStore from '../stores/
|
|
21
|
+
import { useQuestionnaireStore } from '../stores/questionnaireStore';
|
|
22
22
|
|
|
23
23
|
interface UseStringCalculatedExpression {
|
|
24
24
|
calcExpUpdated: boolean;
|
|
@@ -36,7 +36,7 @@ function useStringCalculatedExpression(
|
|
|
36
36
|
): UseStringCalculatedExpression {
|
|
37
37
|
const { qItem, inputValue, setInputValue, onQrItemChange } = props;
|
|
38
38
|
|
|
39
|
-
const calculatedExpressions = useQuestionnaireStore
|
|
39
|
+
const calculatedExpressions = useQuestionnaireStore.use.calculatedExpressions();
|
|
40
40
|
|
|
41
41
|
const [calcExpUpdated, setCalcExpUpdated] = useState(false);
|
|
42
42
|
|
|
@@ -20,8 +20,7 @@ import type { Coding, QuestionnaireItem, ValueSet } from 'fhir/r4';
|
|
|
20
20
|
import { getTerminologyServerUrl, getValueSetCodings, getValueSetPromise } from '../utils/valueSet';
|
|
21
21
|
|
|
22
22
|
import type { AlertColor } from '@mui/material/Alert';
|
|
23
|
-
import useQuestionnaireStore from '../stores
|
|
24
|
-
import useTerminologyServerStore from '../stores/useTerminologyServerStore';
|
|
23
|
+
import { useQuestionnaireStore, useTerminologyServerStore } from '../stores';
|
|
25
24
|
|
|
26
25
|
function useTerminologyServerQuery(
|
|
27
26
|
qItem: QuestionnaireItem,
|
|
@@ -29,8 +28,8 @@ function useTerminologyServerQuery(
|
|
|
29
28
|
input: string,
|
|
30
29
|
searchTerm: string
|
|
31
30
|
): { options: Coding[]; loading: boolean; feedback?: { message: string; color: AlertColor } } {
|
|
32
|
-
const processedValueSetUrls = useQuestionnaireStore
|
|
33
|
-
const defaultTerminologyServerUrl = useTerminologyServerStore
|
|
31
|
+
const processedValueSetUrls = useQuestionnaireStore.use.processedValueSetUrls();
|
|
32
|
+
const defaultTerminologyServerUrl = useTerminologyServerStore.use.url();
|
|
34
33
|
|
|
35
34
|
let fullUrl = '';
|
|
36
35
|
let options: Coding[] = [];
|
|
@@ -26,22 +26,20 @@ import {
|
|
|
26
26
|
import { getAnswerExpression } from '../utils/itemControl';
|
|
27
27
|
import fhirpath from 'fhirpath';
|
|
28
28
|
import fhirpath_r4_model from 'fhirpath/fhir-context/r4';
|
|
29
|
-
import useSmartConfigStore from '../stores
|
|
30
|
-
import useQuestionnaireStore from '../stores/useQuestionnaireStore';
|
|
31
|
-
import useTerminologyServerStore from '../stores/useTerminologyServerStore';
|
|
29
|
+
import { useQuestionnaireStore, useSmartConfigStore, useTerminologyServerStore } from '../stores';
|
|
32
30
|
|
|
33
31
|
function useValueSetCodings(qItem: QuestionnaireItem) {
|
|
34
|
-
const patient = useSmartConfigStore
|
|
35
|
-
const user = useSmartConfigStore
|
|
36
|
-
const encounter = useSmartConfigStore
|
|
32
|
+
const patient = useSmartConfigStore.use.patient();
|
|
33
|
+
const user = useSmartConfigStore.use.user();
|
|
34
|
+
const encounter = useSmartConfigStore.use.encounter();
|
|
37
35
|
|
|
38
|
-
const launchContexts = useQuestionnaireStore
|
|
39
|
-
const processedValueSetCodings = useQuestionnaireStore
|
|
40
|
-
const cachedValueSetCodings = useQuestionnaireStore
|
|
41
|
-
const addCodingToCache = useQuestionnaireStore
|
|
42
|
-
const { xFhirQueryVariables } = useQuestionnaireStore
|
|
36
|
+
const launchContexts = useQuestionnaireStore.use.launchContexts();
|
|
37
|
+
const processedValueSetCodings = useQuestionnaireStore.use.processedValueSetCodings();
|
|
38
|
+
const cachedValueSetCodings = useQuestionnaireStore.use.cachedValueSetCodings();
|
|
39
|
+
const addCodingToCache = useQuestionnaireStore.use.addCodingToCache();
|
|
40
|
+
const { xFhirQueryVariables } = useQuestionnaireStore.use.variables();
|
|
43
41
|
|
|
44
|
-
const defaultTerminologyServerUrl = useTerminologyServerStore
|
|
42
|
+
const defaultTerminologyServerUrl = useTerminologyServerStore.use.url();
|
|
45
43
|
|
|
46
44
|
const valueSetUrl = qItem.answerValueSet;
|
|
47
45
|
let initialCodings = useMemo(() => {
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { questionnaireResponseStore, questionnaireStore } from './stores';
|
|
2
2
|
import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
3
3
|
import { createEmptyQuestionnaireResponse } from './utils/qrItem';
|
|
4
|
-
import useQuestionnaireResponseStore from './stores/useQuestionnaireResponseStore';
|
|
5
4
|
import { removeHiddenAnswers } from './utils/removeHidden';
|
|
6
5
|
import type { ItemToRepopulate } from './utils/repopulateItems';
|
|
7
6
|
import { getItemsToRepopulate } from './utils/repopulateItems';
|
|
@@ -23,17 +22,17 @@ export async function buildForm(
|
|
|
23
22
|
questionnaire: Questionnaire,
|
|
24
23
|
questionnaireResponse?: QuestionnaireResponse
|
|
25
24
|
): Promise<void> {
|
|
26
|
-
await
|
|
25
|
+
await questionnaireStore.getState().buildSourceQuestionnaire(questionnaire);
|
|
27
26
|
|
|
28
27
|
if (!questionnaireResponse) {
|
|
29
|
-
|
|
28
|
+
questionnaireResponseStore
|
|
30
29
|
.getState()
|
|
31
30
|
.buildSourceResponse(createEmptyQuestionnaireResponse(questionnaire));
|
|
32
31
|
return;
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
questionnaireResponseStore.getState().buildSourceResponse(questionnaireResponse);
|
|
35
|
+
questionnaireStore.getState().updatePopulatedProperties(questionnaireResponse);
|
|
37
36
|
}
|
|
38
37
|
|
|
39
38
|
/**
|
|
@@ -42,8 +41,8 @@ export async function buildForm(
|
|
|
42
41
|
* @author Sean Fong
|
|
43
42
|
*/
|
|
44
43
|
export function destroyForm(): void {
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
questionnaireStore.getState().destroySourceQuestionnaire();
|
|
45
|
+
questionnaireResponseStore.getState().destroySourceResponse();
|
|
47
46
|
}
|
|
48
47
|
|
|
49
48
|
/**
|
|
@@ -53,7 +52,7 @@ export function destroyForm(): void {
|
|
|
53
52
|
* @author Sean Fong
|
|
54
53
|
*/
|
|
55
54
|
export function getResponse(): QuestionnaireResponse {
|
|
56
|
-
return
|
|
55
|
+
return questionnaireResponseStore.getState().updatableResponse;
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
/**
|
|
@@ -66,9 +65,9 @@ export function removeHiddenAnswersFromResponse(
|
|
|
66
65
|
questionnaire: Questionnaire,
|
|
67
66
|
questionnaireResponse: QuestionnaireResponse
|
|
68
67
|
): QuestionnaireResponse {
|
|
69
|
-
const enableWhenIsActivated =
|
|
70
|
-
const enableWhenItems =
|
|
71
|
-
const enableWhenExpressions =
|
|
68
|
+
const enableWhenIsActivated = questionnaireStore.getState().enableWhenIsActivated;
|
|
69
|
+
const enableWhenItems = questionnaireStore.getState().enableWhenItems;
|
|
70
|
+
const enableWhenExpressions = questionnaireStore.getState().enableWhenExpressions;
|
|
72
71
|
|
|
73
72
|
return removeHiddenAnswers({
|
|
74
73
|
questionnaire,
|
|
@@ -85,12 +84,12 @@ export function removeHiddenAnswersFromResponse(
|
|
|
85
84
|
* @author Sean Fong
|
|
86
85
|
*/
|
|
87
86
|
export function generateItemsToRepopulate(populatedResponse: QuestionnaireResponse) {
|
|
88
|
-
const sourceQuestionnaire =
|
|
89
|
-
const tabs =
|
|
90
|
-
const updatableResponse =
|
|
91
|
-
const enableWhenIsActivated =
|
|
92
|
-
const enableWhenItems =
|
|
93
|
-
const enableWhenExpressions =
|
|
87
|
+
const sourceQuestionnaire = questionnaireStore.getState().sourceQuestionnaire;
|
|
88
|
+
const tabs = questionnaireStore.getState().tabs;
|
|
89
|
+
const updatableResponse = questionnaireResponseStore.getState().updatableResponse;
|
|
90
|
+
const enableWhenIsActivated = questionnaireStore.getState().enableWhenIsActivated;
|
|
91
|
+
const enableWhenItems = questionnaireStore.getState().enableWhenItems;
|
|
92
|
+
const enableWhenExpressions = questionnaireStore.getState().enableWhenExpressions;
|
|
94
93
|
|
|
95
94
|
return getItemsToRepopulate({
|
|
96
95
|
sourceQuestionnaire,
|
|
@@ -109,8 +108,8 @@ export function generateItemsToRepopulate(populatedResponse: QuestionnaireRespon
|
|
|
109
108
|
* @author Sean Fong
|
|
110
109
|
*/
|
|
111
110
|
export function repopulateResponse(checkedItemsToRepopulate: Record<string, ItemToRepopulate>) {
|
|
112
|
-
const sourceQuestionnaire =
|
|
113
|
-
const updatableResponse =
|
|
111
|
+
const sourceQuestionnaire = questionnaireStore.getState().sourceQuestionnaire;
|
|
112
|
+
const updatableResponse = questionnaireResponseStore.getState().updatableResponse;
|
|
114
113
|
|
|
115
114
|
return repopulateItemsIntoResponse(
|
|
116
115
|
sourceQuestionnaire,
|
package/src/stores/index.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
|
|
1
|
+
export { questionnaireStore, useQuestionnaireStore } from './questionnaireStore';
|
|
2
|
+
export {
|
|
3
|
+
questionnaireResponseStore,
|
|
4
|
+
useQuestionnaireResponseStore
|
|
5
|
+
} from './questionnaireResponseStore';
|
|
6
|
+
export { smartConfigStore, useSmartConfigStore } from './smartConfigStore';
|
|
7
|
+
export { terminologyServerStore, useTerminologyServerStore } from './terminologyServerStore';
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 Commonwealth Scientific and Industrial Research
|
|
3
|
+
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { createStore } from 'zustand/vanilla';
|
|
19
|
+
import type { QuestionnaireResponse } from 'fhir/r4';
|
|
20
|
+
import { emptyResponse } from '../utils/emptyResource';
|
|
21
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
22
|
+
import type { Diff } from 'deep-diff';
|
|
23
|
+
import { diff } from 'deep-diff';
|
|
24
|
+
import { createSelectors } from './selector';
|
|
25
|
+
|
|
26
|
+
interface QuestionnaireResponseStoreType {
|
|
27
|
+
sourceResponse: QuestionnaireResponse;
|
|
28
|
+
updatableResponse: QuestionnaireResponse;
|
|
29
|
+
formChangesHistory: (Diff<QuestionnaireResponse, QuestionnaireResponse>[] | null)[];
|
|
30
|
+
buildSourceResponse: (response: QuestionnaireResponse) => void;
|
|
31
|
+
setUpdatableResponseAsPopulated: (populatedResponse: QuestionnaireResponse) => void;
|
|
32
|
+
updateResponse: (updatedResponse: QuestionnaireResponse) => void;
|
|
33
|
+
setUpdatableResponseAsSaved: (savedResponse: QuestionnaireResponse) => void;
|
|
34
|
+
setUpdatableResponseAsEmpty: (clearedResponse: QuestionnaireResponse) => void;
|
|
35
|
+
destroySourceResponse: () => void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const questionnaireResponseStore = createStore<QuestionnaireResponseStoreType>()(
|
|
39
|
+
(set, get) => ({
|
|
40
|
+
sourceResponse: cloneDeep(emptyResponse),
|
|
41
|
+
updatableResponse: cloneDeep(emptyResponse),
|
|
42
|
+
formChangesHistory: [],
|
|
43
|
+
buildSourceResponse: (questionnaireResponse: QuestionnaireResponse) => {
|
|
44
|
+
set(() => ({
|
|
45
|
+
sourceResponse: questionnaireResponse,
|
|
46
|
+
updatableResponse: questionnaireResponse
|
|
47
|
+
}));
|
|
48
|
+
},
|
|
49
|
+
setUpdatableResponseAsPopulated: (populatedResponse: QuestionnaireResponse) => {
|
|
50
|
+
const formChanges = diff(get().updatableResponse, populatedResponse) ?? null;
|
|
51
|
+
set(() => ({
|
|
52
|
+
updatableResponse: populatedResponse,
|
|
53
|
+
formChangesHistory: [...get().formChangesHistory, formChanges]
|
|
54
|
+
}));
|
|
55
|
+
},
|
|
56
|
+
updateResponse: (updatedResponse: QuestionnaireResponse) => {
|
|
57
|
+
const formChanges = diff(get().updatableResponse, updatedResponse) ?? null;
|
|
58
|
+
set(() => ({
|
|
59
|
+
updatableResponse: updatedResponse,
|
|
60
|
+
formChangesHistory: [...get().formChangesHistory, formChanges]
|
|
61
|
+
}));
|
|
62
|
+
},
|
|
63
|
+
setUpdatableResponseAsSaved: (savedResponse: QuestionnaireResponse) =>
|
|
64
|
+
set(() => ({
|
|
65
|
+
sourceResponse: savedResponse,
|
|
66
|
+
updatableResponse: savedResponse,
|
|
67
|
+
formChangesHistory: []
|
|
68
|
+
})),
|
|
69
|
+
setUpdatableResponseAsEmpty: (clearedResponse: QuestionnaireResponse) =>
|
|
70
|
+
set(() => ({
|
|
71
|
+
updatableResponse: clearedResponse,
|
|
72
|
+
formChangesHistory: []
|
|
73
|
+
})),
|
|
74
|
+
destroySourceResponse: () =>
|
|
75
|
+
set(() => ({
|
|
76
|
+
sourceResponse: cloneDeep(emptyResponse),
|
|
77
|
+
updatableResponse: cloneDeep(emptyResponse),
|
|
78
|
+
formChangesHistory: []
|
|
79
|
+
}))
|
|
80
|
+
})
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
export const useQuestionnaireResponseStore = createSelectors(questionnaireResponseStore);
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import {
|
|
18
|
+
import { createStore } from 'zustand/vanilla';
|
|
19
19
|
import type {
|
|
20
20
|
Coding,
|
|
21
21
|
Questionnaire,
|
|
@@ -38,9 +38,10 @@ import { createQuestionnaireModel } from '../utils/questionnaireStoreUtils/creat
|
|
|
38
38
|
import { initialiseFormFromResponse } from '../utils/initialiseForm';
|
|
39
39
|
import { emptyQuestionnaire, emptyResponse } from '../utils/emptyResource';
|
|
40
40
|
import cloneDeep from 'lodash.clonedeep';
|
|
41
|
-
import
|
|
41
|
+
import { terminologyServerStore } from './terminologyServerStore';
|
|
42
|
+
import { createSelectors } from './selector';
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
interface QuestionnaireStoreType {
|
|
44
45
|
sourceQuestionnaire: Questionnaire;
|
|
45
46
|
itemTypes: Record<string, string>;
|
|
46
47
|
tabs: Tabs;
|
|
@@ -76,7 +77,7 @@ export interface UseQuestionnaireStoreType {
|
|
|
76
77
|
) => QuestionnaireResponse;
|
|
77
78
|
}
|
|
78
79
|
|
|
79
|
-
const
|
|
80
|
+
export const questionnaireStore = createStore<QuestionnaireStoreType>()((set, get) => ({
|
|
80
81
|
sourceQuestionnaire: cloneDeep(emptyQuestionnaire),
|
|
81
82
|
itemTypes: {},
|
|
82
83
|
tabs: {},
|
|
@@ -97,7 +98,7 @@ const useQuestionnaireStore = create<UseQuestionnaireStoreType>()((set, get) =>
|
|
|
97
98
|
questionnaire,
|
|
98
99
|
questionnaireResponse = cloneDeep(emptyResponse),
|
|
99
100
|
additionalVariables = {},
|
|
100
|
-
terminologyServerUrl =
|
|
101
|
+
terminologyServerUrl = terminologyServerStore.getState().url
|
|
101
102
|
) => {
|
|
102
103
|
const questionnaireModel = await createQuestionnaireModel(
|
|
103
104
|
questionnaire,
|
|
@@ -266,4 +267,4 @@ const useQuestionnaireStore = create<UseQuestionnaireStoreType>()((set, get) =>
|
|
|
266
267
|
}
|
|
267
268
|
}));
|
|
268
269
|
|
|
269
|
-
export
|
|
270
|
+
export const useQuestionnaireStore = createSelectors(questionnaireStore);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 Commonwealth Scientific and Industrial Research
|
|
3
|
+
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { createStore } from 'zustand/vanilla';
|
|
19
|
+
import type { Encounter, Patient, Practitioner } from 'fhir/r4';
|
|
20
|
+
import type Client from 'fhirclient/lib/Client';
|
|
21
|
+
import { createSelectors } from './selector';
|
|
22
|
+
|
|
23
|
+
export interface SmartConfigStoreType {
|
|
24
|
+
client: Client | null;
|
|
25
|
+
patient: Patient | null;
|
|
26
|
+
user: Practitioner | null;
|
|
27
|
+
encounter: Encounter | null;
|
|
28
|
+
setClient: (client: Client) => void;
|
|
29
|
+
setPatient: (patient: Patient) => void;
|
|
30
|
+
setUser: (user: Practitioner) => void;
|
|
31
|
+
setEncounter: (encounter: Encounter) => void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const smartConfigStore = createStore<SmartConfigStoreType>()((set) => ({
|
|
35
|
+
client: null,
|
|
36
|
+
patient: null,
|
|
37
|
+
user: null,
|
|
38
|
+
encounter: null,
|
|
39
|
+
setClient: (client: Client) => set(() => ({ client: client })),
|
|
40
|
+
setPatient: (patient: Patient) => set(() => ({ patient: patient })),
|
|
41
|
+
setUser: (user: Practitioner) => set(() => ({ user: user })),
|
|
42
|
+
setEncounter: (encounter: Encounter) => set(() => ({ encounter: encounter }))
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
export const useSmartConfigStore = createSelectors(smartConfigStore);
|
|
@@ -15,20 +15,21 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import {
|
|
18
|
+
import { createStore } from 'zustand/vanilla';
|
|
19
|
+
import { createSelectors } from './selector';
|
|
19
20
|
|
|
20
21
|
const ONTOSERVER_R4 = 'https://r4.ontoserver.csiro.au/fhir';
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
interface TerminologyServerStoreType {
|
|
23
24
|
url: string;
|
|
24
25
|
setUrl: (newUrl: string) => void;
|
|
25
26
|
resetUrl: () => void;
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
const
|
|
29
|
+
export const terminologyServerStore = createStore<TerminologyServerStoreType>()((set) => ({
|
|
29
30
|
url: ONTOSERVER_R4,
|
|
30
31
|
setUrl: (newUrl: string) => set(() => ({ url: newUrl })),
|
|
31
32
|
resetUrl: () => set(() => ({ url: ONTOSERVER_R4 }))
|
|
32
33
|
}));
|
|
33
34
|
|
|
34
|
-
export
|
|
35
|
+
export const useTerminologyServerStore = createSelectors(terminologyServerStore);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 Commonwealth Scientific and Industrial Research
|
|
3
|
+
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import ThemeProvider from '../theme/Theme';
|
|
19
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
20
|
+
import { GroupTable } from '../components';
|
|
21
|
+
import GTableMedicalHistoryItemJson from './assets/QItems-and-QRItems/Q_GTableMedicalHistory.json';
|
|
22
|
+
import GTableMedicalHistoryAnswersJson from './assets/QItems-and-QRItems/QR_GTableMedicalHistory.json';
|
|
23
|
+
import { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
24
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
25
|
+
import { HTML5Backend } from 'react-dnd-html5-backend';
|
|
26
|
+
import { DndProvider } from 'react-dnd';
|
|
27
|
+
|
|
28
|
+
// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
|
|
29
|
+
const meta = {
|
|
30
|
+
title: 'Component/GroupTable',
|
|
31
|
+
component: GroupTable,
|
|
32
|
+
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/react/writing-docs/autodocs
|
|
33
|
+
tags: [],
|
|
34
|
+
decorators: [
|
|
35
|
+
(Story) => (
|
|
36
|
+
<ThemeProvider>
|
|
37
|
+
<QueryClientProvider client={new QueryClient()}>
|
|
38
|
+
<DndProvider backend={HTML5Backend}>{Story()}</DndProvider>
|
|
39
|
+
</QueryClientProvider>
|
|
40
|
+
</ThemeProvider>
|
|
41
|
+
)
|
|
42
|
+
]
|
|
43
|
+
} satisfies Meta<typeof GroupTable>;
|
|
44
|
+
|
|
45
|
+
const GTableMedicalHistoryItem = GTableMedicalHistoryItemJson as QuestionnaireItem;
|
|
46
|
+
const GTableMedicalHistoryAnswers = GTableMedicalHistoryAnswersJson as QuestionnaireResponseItem[];
|
|
47
|
+
|
|
48
|
+
export default meta;
|
|
49
|
+
type Story = StoryObj<typeof meta>;
|
|
50
|
+
|
|
51
|
+
// More on writing stories with args: https://storybook.js.org/docs/react/writing-stories/args
|
|
52
|
+
|
|
53
|
+
export const MedicalHistoryTable: Story = {
|
|
54
|
+
args: {
|
|
55
|
+
qItem: GTableMedicalHistoryItem,
|
|
56
|
+
qrItems: GTableMedicalHistoryAnswers,
|
|
57
|
+
groupCardElevation: 1,
|
|
58
|
+
parentIsReadOnly: false,
|
|
59
|
+
onQrRepeatGroupChange: () => {}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
@@ -18,24 +18,28 @@
|
|
|
18
18
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
19
19
|
import { SmartFormsRenderer } from '../components';
|
|
20
20
|
import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
21
|
-
import Q715Json from './assets/Q715.json';
|
|
22
|
-
import R715Json from './assets/R715.json';
|
|
23
|
-
import QTestGridJson from './assets/QTestGrid.json';
|
|
24
|
-
import RTestGridJson from './assets/RTestGrid.json';
|
|
21
|
+
import Q715Json from './assets/Qs-and-QRs/Q715.json';
|
|
22
|
+
import R715Json from './assets/Qs-and-QRs/R715.json';
|
|
23
|
+
import QTestGridJson from './assets/Qs-and-QRs/QTestGrid.json';
|
|
24
|
+
import RTestGridJson from './assets/Qs-and-QRs/RTestGrid.json';
|
|
25
|
+
import QDev715Json from './assets/Qs-and-QRs/QDev715.json';
|
|
25
26
|
|
|
26
27
|
// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
|
|
27
28
|
const meta = {
|
|
28
29
|
title: 'Component/SmartFormsRenderer',
|
|
29
30
|
component: SmartFormsRenderer,
|
|
30
31
|
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/react/writing-docs/autodocs
|
|
31
|
-
tags: [
|
|
32
|
+
tags: []
|
|
32
33
|
} satisfies Meta<typeof SmartFormsRenderer>;
|
|
33
34
|
|
|
34
35
|
const Q715 = Q715Json as Questionnaire;
|
|
35
36
|
const R715 = R715Json as QuestionnaireResponse;
|
|
37
|
+
|
|
36
38
|
const QTestGrid = QTestGridJson as Questionnaire;
|
|
37
39
|
const RTestGrid = RTestGridJson as QuestionnaireResponse;
|
|
38
40
|
|
|
41
|
+
const QDev715 = QDev715Json as Questionnaire;
|
|
42
|
+
|
|
39
43
|
export default meta;
|
|
40
44
|
type Story = StoryObj<typeof meta>;
|
|
41
45
|
|
|
@@ -54,6 +58,12 @@ export const Form715WithResponse: Story = {
|
|
|
54
58
|
}
|
|
55
59
|
};
|
|
56
60
|
|
|
61
|
+
export const FormDev715: Story = {
|
|
62
|
+
args: {
|
|
63
|
+
questionnaire: QDev715
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
57
67
|
export const FormTestGrid: Story = {
|
|
58
68
|
args: {
|
|
59
69
|
questionnaire: QTestGrid
|