import React, { type ChangeEvent, type FC, useEffect, useMemo } from 'react'; import { Button, Column, ComboBox, DatePicker, DatePickerInput, InlineLoading, Stack, TextArea, TextInput, } from '@carbon/react'; import { ArrowRight } from '@carbon/react/icons'; import { Controller, useFormContext } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { ErrorState } from '@openmrs/esm-framework'; import { DATE_PICKER_CONTROL_FORMAT, DATE_PICKER_FORMAT, MAIN_STORE_LOCATION_TAG } from '../../../constants'; import { type Party } from '../../../core/api/types/Party'; import { type StockOperationDTO } from '../../../core/api/types/stockOperation/StockOperationDTO'; import { OperationType, type StockOperationType } from '../../../core/api/types/stockOperation/StockOperationType'; import { type StockOperationItemDtoSchema } from '../../validation-schema'; import useOperationTypePermisions from '../hooks/useOperationTypePermisions'; import useParties from '../hooks/useParties'; import StockOperationReasonSelector from '../input-components/stock-operation-reason-selector.component'; import UsersSelector from '../input-components/users-selector.component'; import styles from '../stock-operation-form.scss'; type BaseOperationDetailsFormStepProps = { stockOperation?: StockOperationDTO; stockOperationType: StockOperationType; onNext?: () => void; }; const BaseOperationDetailsFormStep: FC = ({ stockOperation, stockOperationType, onNext, }) => { const { t } = useTranslation(); const operationTypePermision = useOperationTypePermisions(stockOperationType); const { destinationParties, sourceParties, isLoading: isPartiesLoading, error: partiesError, sourceTags, destinationTags, } = useParties(stockOperationType); const form = useFormContext(); const isStockIssueOperation = useMemo( () => OperationType.STOCK_ISSUE_OPERATION_TYPE === stockOperationType.operationType, [stockOperationType], ); const handleNext = async () => { const valid = await form.trigger([ 'responsiblePersonUuid', 'operationDate', 'remarks', 'sourceUuid', 'destinationUuid', 'reasonUuid', 'responsiblePersonOther', ]); if (valid) { onNext(); } }; // initialize location fields useEffect(() => { // Prefill default locaton with current location if is a new operation if (!stockOperation && stockOperationType.operationType !== OperationType.STOCK_ISSUE_OPERATION_TYPE) { if (stockOperationType?.hasSource) { const shouldLockSource = sourceTags.length === 1 && sourceTags[0] === MAIN_STORE_LOCATION_TAG; if (shouldLockSource && sourceParties?.length) { const party = sourceParties[0]; form.setValue('sourceUuid', party.uuid); } } if (stockOperationType?.hasDestination) { const shouldLockDestination = destinationTags.length === 1 && destinationTags[0] === MAIN_STORE_LOCATION_TAG; if (shouldLockDestination && destinationParties?.length) { const party = destinationParties[0]; form.setValue('destinationUuid', party.uuid); } } } }, [sourceParties, destinationParties, stockOperation, stockOperationType, form, destinationTags, sourceTags]); if (isPartiesLoading) return ( ); if (partiesError) return ( ); return (

{`${stockOperationType.name} ${t('details', 'Details')}`}

( { field.onChange(newDate); }} > )} /> {stockOperation?.operationNumber && ( )} ( { field.onChange(data.selectedItem?.uuid); }} selectedItem={sourceParties.find((p) => p.uuid === field.value)} itemToString={(item?: Party) => (item && item?.name ? `${item?.name}` : '')} shouldFilterItem={() => true} placeholder={ stockOperationType.hasDestination || stockOperation?.destinationUuid ? t('chooseASource', 'Choose a source') : t('chooseALocation', 'Choose a location') } ref={field.ref} invalid={!!error?.message} invalidText={error?.message} /> )} /> {(stockOperationType.hasDestination || stockOperation?.destinationUuid) && ( ( { field.onChange(data.selectedItem?.uuid); }} selectedItem={destinationParties.find((p) => p.uuid === field.value)} itemToString={(item?: Party) => (item && item?.name ? `${item?.name}` : '')} shouldFilterItem={() => true} placeholder={ stockOperationType?.hasSource || stockOperation?.atLocationUuid ? t('chooseADestination', 'Choose a destination') : t('location', 'Location') } ref={field.ref} invalid={!!error?.message} invalidText={error?.message} /> )} /> )} {operationTypePermision.requiresStockAdjustmentReason && ( )} (