@openmrs/esm-stock-management-app 3.0.1-pre.879 → 3.0.1-pre.889
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/dist/10.js +1 -1
- package/dist/119.js +1 -1
- package/dist/152.js +1 -1
- package/dist/172.js +1 -1
- package/dist/20.js +1 -1
- package/dist/235.js +1 -1
- package/dist/27.js +1 -1
- package/dist/27.js.map +1 -1
- package/dist/290.js +1 -1
- package/dist/291.js +1 -0
- package/dist/291.js.map +1 -0
- package/dist/299.js +1 -0
- package/dist/299.js.map +1 -0
- package/dist/33.js +1 -1
- package/dist/467.js +1 -1
- package/dist/574.js +1 -1
- package/dist/642.js +1 -1
- package/dist/675.js +1 -1
- package/dist/703.js +1 -1
- package/dist/734.js +2 -0
- package/dist/{842.js.map → 734.js.map} +1 -1
- package/dist/793.js +1 -1
- package/dist/793.js.map +1 -1
- package/dist/93.js +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/openmrs-esm-stock-management-app.js +1 -1
- package/dist/openmrs-esm-stock-management-app.js.buildmanifest.json +105 -105
- package/dist/openmrs-esm-stock-management-app.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +1 -1
- package/src/dashboard/home-dashboard.component.tsx +8 -12
- package/src/index.ts +2 -2
- package/src/routes.json +2 -2
- package/src/stock-items/add-stock-item/stock-item-details/stock-item-details.component.tsx +1 -1
- package/src/stock-management-header/stock-management-header.component.tsx +11 -12
- package/src/stock-management-header/stock-management-header.scss +6 -25
- package/src/stock-operations/stock-operation-actions.component.tsx +8 -8
- package/src/stock-operations/stock-operation.utils.tsx +3 -3
- package/src/stock-operations/stock-operations-forms/step2.test.tsx +0 -4
- package/src/stock-operations/stock-operations-forms/step3.test.tsx +0 -4
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-submission-form-step.component.tsx +5 -5
- package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-approve-button.component.tsx +1 -1
- package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-approve-dispatch-button.component.tsx +1 -1
- package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-cancel-button.component.tsx +1 -1
- package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-complete-button.component.tsx +1 -1
- package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-completed-dispatch-button.component.tsx +1 -1
- package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-reject-button.component.tsx +1 -1
- package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-return-button.component.tsx +1 -1
- package/src/stock-operations/{stock-operations-dialog/stock-operations-dialog.component.tsx → stock-operations-modal/stock-operations.modal.tsx} +6 -12
- package/src/stock-sources/add-stock-sources/add-stock-sources.test.tsx +2 -2
- package/translations/en.json +0 -3
- package/dist/14.js +0 -1
- package/dist/14.js.map +0 -1
- package/dist/606.js +0 -1
- package/dist/606.js.map +0 -1
- package/dist/842.js +0 -2
- package/src/core/components/overlay/hook.ts +0 -47
- package/src/core/components/overlay/overlay.component.tsx +0 -43
- package/src/core/components/overlay/overlay.scss +0 -98
- package/src/stock-management-header/stock-management-Illustration.tsx +0 -30
- /package/dist/{842.js.LICENSE.txt → 734.js.LICENSE.txt} +0 -0
- /package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-issue-stock-button.component.tsx +0 -0
- /package/src/stock-operations/{stock-operations-dialog → stock-operations-modal}/stock-operations-print-button.component.tsx +0 -0
- /package/src/stock-operations/{stock-operations-dialog/stock-operations-dialog.scss → stock-operations-modal/stock-operations.scss} +0 -0
@@ -1,9 +1,14 @@
|
|
1
|
-
import { formatDate, useSession } from '@openmrs/esm-framework';
|
2
1
|
import React from 'react';
|
3
|
-
import styles from './stock-management-header.scss';
|
4
|
-
import StockManagementIllustration from './stock-management-Illustration';
|
5
2
|
import { Calendar, Location } from '@carbon/react/icons';
|
6
3
|
import { useTranslation } from 'react-i18next';
|
4
|
+
import {
|
5
|
+
formatDate,
|
6
|
+
PageHeader,
|
7
|
+
PageHeaderContent,
|
8
|
+
StockManagementPictogram,
|
9
|
+
useSession,
|
10
|
+
} from '@openmrs/esm-framework';
|
11
|
+
import styles from './stock-management-header.scss';
|
7
12
|
|
8
13
|
export const StockManagementHeader: React.FC = () => {
|
9
14
|
const { t } = useTranslation();
|
@@ -11,14 +16,8 @@ export const StockManagementHeader: React.FC = () => {
|
|
11
16
|
const userLocation = userSession?.sessionLocation?.display;
|
12
17
|
|
13
18
|
return (
|
14
|
-
<
|
15
|
-
<
|
16
|
-
<StockManagementIllustration />
|
17
|
-
<div className={styles['page-labels']}>
|
18
|
-
<p>{t('home', 'Home')}</p>
|
19
|
-
<p className={styles['page-name']}>{t('stockManagement', 'Stock Management')}</p>
|
20
|
-
</div>
|
21
|
-
</div>
|
19
|
+
<PageHeader className={styles.header} data-testid="stock-management-header">
|
20
|
+
<PageHeaderContent illustration={<StockManagementPictogram />} title={t('stockManagement', 'Stock management')} />
|
22
21
|
<div className={styles['right-justified-items']}>
|
23
22
|
<div className={styles['date-and-location']}>
|
24
23
|
<Location size={16} />
|
@@ -28,6 +27,6 @@ export const StockManagementHeader: React.FC = () => {
|
|
28
27
|
<span className={styles.value}>{formatDate(new Date(), { mode: 'standard' })}</span>
|
29
28
|
</div>
|
30
29
|
</div>
|
31
|
-
</
|
30
|
+
</PageHeader>
|
32
31
|
);
|
33
32
|
};
|
@@ -4,38 +4,23 @@
|
|
4
4
|
@use '@openmrs/esm-styleguide/src/vars' as *;
|
5
5
|
|
6
6
|
.header {
|
7
|
-
@include type.type-style('body-compact-02');
|
8
|
-
color: colors.$gray-70;
|
9
|
-
height: layout.$spacing-12;
|
10
7
|
background-color: $ui-02;
|
8
|
+
border: 1px solid $ui-03;
|
9
|
+
border-left: 0;
|
11
10
|
display: flex;
|
12
|
-
padding-left: 8px;
|
13
11
|
justify-content: space-between;
|
14
|
-
}
|
15
|
-
|
16
|
-
.left-justified-items {
|
17
|
-
display: flex;
|
18
|
-
flex-direction: row;
|
19
12
|
align-items: center;
|
20
|
-
|
13
|
+
padding-right: layout.$spacing-03;
|
21
14
|
}
|
22
15
|
|
23
16
|
.right-justified-items {
|
24
17
|
@include type.type-style('body-compact-02');
|
25
18
|
color: colors.$gray-70;
|
26
|
-
margin:
|
27
|
-
}
|
28
|
-
|
29
|
-
.page-name {
|
30
|
-
@include type.type-style('heading-04');
|
31
|
-
}
|
32
|
-
|
33
|
-
.page-labels {
|
34
|
-
margin: 1rem;
|
19
|
+
margin: layout.$spacing-03;
|
35
20
|
}
|
36
21
|
|
37
22
|
.middot {
|
38
|
-
margin: 0
|
23
|
+
margin: 0 layout.$spacing-03;
|
39
24
|
}
|
40
25
|
|
41
26
|
.date-and-location {
|
@@ -46,11 +31,7 @@
|
|
46
31
|
}
|
47
32
|
|
48
33
|
.value {
|
49
|
-
margin-left:
|
50
|
-
}
|
51
|
-
|
52
|
-
.middot {
|
53
|
-
margin: 0 0.5rem;
|
34
|
+
margin-left: layout.$spacing-02;
|
54
35
|
}
|
55
36
|
|
56
37
|
.view {
|
@@ -6,14 +6,14 @@ import {
|
|
6
6
|
type StockOperationType,
|
7
7
|
StockOperationTypeHasPrint,
|
8
8
|
} from '../core/api/types/stockOperation/StockOperationType';
|
9
|
-
import StockOperationApprovalButton from './stock-operations-
|
10
|
-
import StockOperationApproveDispatchButton from './stock-operations-
|
11
|
-
import StockOperationCancelButton from './stock-operations-
|
12
|
-
import StockOperationCompleteDispatchButton from './stock-operations-
|
13
|
-
import StockOperationIssueStockButton from './stock-operations-
|
14
|
-
import StockOperationPrintButton from './stock-operations-
|
15
|
-
import StockOperationRejectButton from './stock-operations-
|
16
|
-
import StockOperationReturnButton from './stock-operations-
|
9
|
+
import StockOperationApprovalButton from './stock-operations-modal/stock-operations-approve-button.component';
|
10
|
+
import StockOperationApproveDispatchButton from './stock-operations-modal/stock-operations-approve-dispatch-button.component';
|
11
|
+
import StockOperationCancelButton from './stock-operations-modal/stock-operations-cancel-button.component';
|
12
|
+
import StockOperationCompleteDispatchButton from './stock-operations-modal/stock-operations-completed-dispatch-button.component';
|
13
|
+
import StockOperationIssueStockButton from './stock-operations-modal/stock-operations-issue-stock-button.component';
|
14
|
+
import StockOperationPrintButton from './stock-operations-modal/stock-operations-print-button.component';
|
15
|
+
import StockOperationRejectButton from './stock-operations-modal/stock-operations-reject-button.component';
|
16
|
+
import StockOperationReturnButton from './stock-operations-modal/stock-operations-return-button.component';
|
17
17
|
import useOperationTypePermisions from './stock-operations-forms/hooks/useOperationTypePermisions';
|
18
18
|
import styles from './stock-operations-table.scss';
|
19
19
|
|
@@ -8,7 +8,7 @@ export const launchStockoperationAddOrEditWorkSpace = (
|
|
8
8
|
t: TFunction,
|
9
9
|
operationType: StockOperationType,
|
10
10
|
stockOperation?: StockOperationDTO,
|
11
|
-
stockRequisitionUuid?: string, // Only
|
11
|
+
stockRequisitionUuid?: string, // Only supplied on stock issue (when workspace is launched for stock issue)
|
12
12
|
) => {
|
13
13
|
launchWorkspace('stock-operation-form-workspace', {
|
14
14
|
workspaceTitle: stockOperation
|
@@ -32,8 +32,8 @@ export function getStockOperationUniqueId() {
|
|
32
32
|
return `${new Date().getTime()}-${Math.random().toString(36).substring(2, 16)}`;
|
33
33
|
}
|
34
34
|
|
35
|
-
export const
|
36
|
-
const dispose = showModal('stock-
|
35
|
+
export const launchStockOperationsModal = (title: string, requireReason: boolean, operation: StockOperationDTO) => {
|
36
|
+
const dispose = showModal('stock-operations-modal', {
|
37
37
|
title: title,
|
38
38
|
operation: operation,
|
39
39
|
requireReason: requireReason,
|
@@ -48,10 +48,6 @@ jest.mock('../stock-operations.resource', () => ({
|
|
48
48
|
}),
|
49
49
|
}));
|
50
50
|
|
51
|
-
jest.mock('../../core/components/overlay/hook', () => ({
|
52
|
-
closeOverlay: jest.fn(),
|
53
|
-
}));
|
54
|
-
|
55
51
|
jest.mock('../../stock-items/stock-items.resource', () => ({
|
56
52
|
useStockItem: jest.fn().mockReturnValue({
|
57
53
|
isLoading: false,
|
@@ -40,10 +40,6 @@ jest.mock('../stock-operations.resource', () => ({
|
|
40
40
|
}),
|
41
41
|
}));
|
42
42
|
|
43
|
-
jest.mock('../../core/components/overlay/hook', () => ({
|
44
|
-
closeOverlay: jest.fn(),
|
45
|
-
}));
|
46
|
-
|
47
43
|
jest.mock('../../stock-items/stock-items.resource', () => ({
|
48
44
|
useStockItem: jest.fn(),
|
49
45
|
useStockItems: jest.fn().mockReturnValue({
|
@@ -9,12 +9,12 @@ import { extractErrorMessagesFromResponse } from '../../../constants';
|
|
9
9
|
import { handleMutate } from '../../../utils';
|
10
10
|
import { OperationType, type StockOperationType } from '../../../core/api/types/stockOperation/StockOperationType';
|
11
11
|
import { otherUser } from '../../../core/utils/utils';
|
12
|
-
import {
|
12
|
+
import { launchStockOperationsModal } from '../../stock-operation.utils';
|
13
13
|
import { type StockOperationDTO } from '../../../core/api/types/stockOperation/StockOperationDTO';
|
14
14
|
import { type StockOperationItemDTO } from '../../../core/api/types/stockOperation/StockOperationItemDTO';
|
15
15
|
import { type StockOperationItemDtoSchema } from '../../validation-schema';
|
16
|
-
import styles from '../stock-operation-form.scss';
|
17
16
|
import useOperationTypePermisions from '../hooks/useOperationTypePermisions';
|
17
|
+
import styles from '../stock-operation-form.scss';
|
18
18
|
|
19
19
|
type StockOperationSubmissionFormStepProps = {
|
20
20
|
onPrevious?: () => void;
|
@@ -125,17 +125,17 @@ const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormSte
|
|
125
125
|
|
126
126
|
const handleComplete = useCallback(() => {
|
127
127
|
handleSave().then((operation) => {
|
128
|
-
|
128
|
+
launchStockOperationsModal('Complete', false, { ...operation, status: 'COMPLETED' });
|
129
129
|
});
|
130
130
|
}, [handleSave]);
|
131
131
|
const handleSubmitForReview = useCallback(() => {
|
132
132
|
handleSave().then((operation) => {
|
133
|
-
|
133
|
+
launchStockOperationsModal('Submit', false, { ...operation, status: 'SUBMITTED' });
|
134
134
|
});
|
135
135
|
}, [handleSave]);
|
136
136
|
const handleDispatch = useCallback(() => {
|
137
137
|
handleSave().then((operation) => {
|
138
|
-
|
138
|
+
launchStockOperationsModal('Dispatch', false, { ...operation, status: 'DISPATCHED' });
|
139
139
|
});
|
140
140
|
}, [handleSave]);
|
141
141
|
|
@@ -13,7 +13,7 @@ interface StockOperationApprovalButtonProps {
|
|
13
13
|
const StockOperationApprovalButton: React.FC<StockOperationApprovalButtonProps> = ({ operation }) => {
|
14
14
|
const { t } = useTranslation();
|
15
15
|
const launchApprovalModal = useCallback(() => {
|
16
|
-
const dispose = showModal('stock-
|
16
|
+
const dispose = showModal('stock-operations-modal', {
|
17
17
|
title: 'Approve',
|
18
18
|
operation: operation,
|
19
19
|
requireReason: false,
|
@@ -13,7 +13,7 @@ interface StockOperationApproveDispatchButtonProps {
|
|
13
13
|
const StockOperationApproveDispatchButton: React.FC<StockOperationApproveDispatchButtonProps> = ({ operation }) => {
|
14
14
|
const { t } = useTranslation();
|
15
15
|
const launchApproveDispatchModal = useCallback(() => {
|
16
|
-
const dispose = showModal('stock-
|
16
|
+
const dispose = showModal('stock-operations-modal', {
|
17
17
|
title: 'Dispatch',
|
18
18
|
operation: operation,
|
19
19
|
requireReason: false,
|
@@ -13,7 +13,7 @@ interface StockOperationCancelButtonProps {
|
|
13
13
|
const StockOperationCancelButton: React.FC<StockOperationCancelButtonProps> = ({ operation }) => {
|
14
14
|
const { t } = useTranslation();
|
15
15
|
const launchCancelModal = useCallback(() => {
|
16
|
-
const dispose = showModal('stock-
|
16
|
+
const dispose = showModal('stock-operations-modal', {
|
17
17
|
title: 'Cancel',
|
18
18
|
operation: operation,
|
19
19
|
requireReason: true,
|
@@ -14,7 +14,7 @@ interface StockOperationCompleteButtonProps {
|
|
14
14
|
const StockOperationCompleteButton: React.FC<StockOperationCompleteButtonProps> = ({ operation, reason }) => {
|
15
15
|
const { t } = useTranslation();
|
16
16
|
const launchCompleteModal = useCallback(() => {
|
17
|
-
const dispose = showModal('stock-
|
17
|
+
const dispose = showModal('stock-operations-modal', {
|
18
18
|
title: 'Complete',
|
19
19
|
operation: operation,
|
20
20
|
requireReason: reason,
|
@@ -17,7 +17,7 @@ const StockOperationCompleteDispatchButton: React.FC<StockOperationCompleteDispa
|
|
17
17
|
}) => {
|
18
18
|
const { t } = useTranslation();
|
19
19
|
const launchcompletedDispatchModal = useCallback(() => {
|
20
|
-
const dispose = showModal('stock-
|
20
|
+
const dispose = showModal('stock-operations-modal', {
|
21
21
|
title: 'Complete Dispatch',
|
22
22
|
operation: operation,
|
23
23
|
requireReason: reason,
|
@@ -13,7 +13,7 @@ interface StockOperationRejectButtonProps {
|
|
13
13
|
const StockOperationRejectButton: React.FC<StockOperationRejectButtonProps> = ({ operation }) => {
|
14
14
|
const { t } = useTranslation();
|
15
15
|
const launchRejectModal = useCallback(() => {
|
16
|
-
const dispose = showModal('stock-
|
16
|
+
const dispose = showModal('stock-operations-modal', {
|
17
17
|
title: 'Reject',
|
18
18
|
operation: operation,
|
19
19
|
requireReason: true,
|
@@ -13,7 +13,7 @@ interface StockOperationReturnButtonProps {
|
|
13
13
|
const StockOperationReturnButton: React.FC<StockOperationReturnButtonProps> = ({ operation }) => {
|
14
14
|
const { t } = useTranslation();
|
15
15
|
const launchReturnModal = useCallback(() => {
|
16
|
-
const dispose = showModal('stock-
|
16
|
+
const dispose = showModal('stock-operations-modal', {
|
17
17
|
title: 'Return',
|
18
18
|
operation: operation,
|
19
19
|
requireReason: true,
|
@@ -1,32 +1,28 @@
|
|
1
1
|
import React, { useState } from 'react';
|
2
2
|
import { useTranslation } from 'react-i18next';
|
3
|
+
import { Button, Form, InlineLoading, ModalBody, ModalFooter, ModalHeader, TextArea } from '@carbon/react';
|
4
|
+
import { getCoreTranslation, restBaseUrl, showSnackbar } from '@openmrs/esm-framework';
|
3
5
|
import { type StockOperationDTO } from '../../core/api/types/stockOperation/StockOperationDTO';
|
4
|
-
import { Button, Form, ModalBody, ModalFooter, ModalHeader, TextArea, InlineLoading } from '@carbon/react';
|
5
|
-
import styles from './stock-operations-dialog.scss';
|
6
6
|
import {
|
7
7
|
type StopOperationAction,
|
8
8
|
type StopOperationActionType,
|
9
9
|
} from '../../core/api/types/stockOperation/StockOperationAction';
|
10
10
|
import { executeStockOperationAction } from '../stock-operations.resource';
|
11
|
-
import { getCoreTranslation, restBaseUrl, showSnackbar } from '@openmrs/esm-framework';
|
12
|
-
import { closeOverlay } from '../../core/components/overlay/hook';
|
13
11
|
import { extractErrorMessagesFromResponse } from '../../constants';
|
14
12
|
import { handleMutate } from '../../utils';
|
13
|
+
import styles from './stock-operations.scss';
|
15
14
|
|
16
|
-
interface
|
15
|
+
interface StockOperationsModalProps {
|
17
16
|
title: string;
|
18
17
|
requireReason: boolean;
|
19
18
|
operation: StockOperationDTO;
|
20
19
|
closeModal: () => void;
|
21
20
|
}
|
22
21
|
|
23
|
-
const
|
22
|
+
const StockOperationsModal: React.FC<StockOperationsModalProps> = ({ title, requireReason, operation, closeModal }) => {
|
24
23
|
const confirmType = title.toLocaleLowerCase().trim();
|
25
|
-
|
26
24
|
const { t } = useTranslation();
|
27
|
-
|
28
25
|
const [notes, setNotes] = useState('');
|
29
|
-
|
30
26
|
const [isApproving, setIsApproving] = useState(false);
|
31
27
|
|
32
28
|
const handleClick = async (event) => {
|
@@ -88,7 +84,6 @@ const StockOperationDialog: React.FC<StockOperationDialogProps> = ({ title, requ
|
|
88
84
|
kind: 'success',
|
89
85
|
}),
|
90
86
|
closeModal();
|
91
|
-
closeOverlay();
|
92
87
|
handleMutate(`${restBaseUrl}/stockmanagement/stockoperation`);
|
93
88
|
},
|
94
89
|
(err) => {
|
@@ -103,7 +98,6 @@ const StockOperationDialog: React.FC<StockOperationDialogProps> = ({ title, requ
|
|
103
98
|
kind: 'error',
|
104
99
|
}),
|
105
100
|
closeModal();
|
106
|
-
closeOverlay();
|
107
101
|
},
|
108
102
|
);
|
109
103
|
};
|
@@ -144,4 +138,4 @@ const StockOperationDialog: React.FC<StockOperationDialogProps> = ({ title, requ
|
|
144
138
|
);
|
145
139
|
};
|
146
140
|
|
147
|
-
export default
|
141
|
+
export default StockOperationsModal;
|
@@ -149,7 +149,7 @@ describe('StockSourcesAddOrUpdate', () => {
|
|
149
149
|
await user.click(screen.getByText('Save'));
|
150
150
|
});
|
151
151
|
|
152
|
-
it('shows success message and closes
|
152
|
+
it('shows success message and closes the workspace on successful submission', async () => {
|
153
153
|
const user = userEvent.setup();
|
154
154
|
mockCreateOrUpdateStockSource.mockResolvedValue({
|
155
155
|
data: {},
|
@@ -186,7 +186,7 @@ describe('StockSourcesAddOrUpdate', () => {
|
|
186
186
|
await user.click(screen.getByText(/save/i));
|
187
187
|
});
|
188
188
|
|
189
|
-
it('closes
|
189
|
+
it('closes workspace when cancel button is clicked', async () => {
|
190
190
|
const user = userEvent.setup();
|
191
191
|
render(
|
192
192
|
<StockSourcesAddOrUpdate
|
package/translations/en.json
CHANGED
@@ -30,7 +30,6 @@
|
|
30
30
|
"BatchJobSuccess": "Batch job created successfully",
|
31
31
|
"batchNo": "Batch No",
|
32
32
|
"batchNumber": "Batch Number",
|
33
|
-
"batchNumberAlreadyUsed": "Batch number already used",
|
34
33
|
"bincard": "Stock Card",
|
35
34
|
"by": "By",
|
36
35
|
"cancel": "Cancel",
|
@@ -142,7 +141,6 @@
|
|
142
141
|
"generatedMessage": "The card has been electronically generated and is a valid document. It was created by {{userName}} on {{date}}",
|
143
142
|
"genericName": "Generic Name",
|
144
143
|
"hasExpiration": "Does the item expire?",
|
145
|
-
"home": "Home",
|
146
144
|
"import": "Import",
|
147
145
|
"importStockItems": "Import Stock Items",
|
148
146
|
"in6Months": "In 6 months",
|
@@ -329,7 +327,6 @@
|
|
329
327
|
"submittingForReview": "Submitting for review",
|
330
328
|
"success": "Success",
|
331
329
|
"successfullysaved": "You have successfully saved user role scope",
|
332
|
-
"tabletOverlay": "Tablet overlay",
|
333
330
|
"tags": "Tags",
|
334
331
|
"timeTaken": "Time Taken",
|
335
332
|
"to": "To",
|