From 3c2cbb53b6460add1add2dfe2c8c2883a95bd176 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 09:44:59 +1300 Subject: [PATCH 01/18] Hook to insert program response requisition --- client/packages/common/src/types/schema.ts | 2 ++ .../src/ResponseRequisition/api/api.ts | 21 ++++++++++++++++++ .../api/hooks/document/index.ts | 2 ++ .../document/useInsertProgramResponse.ts | 12 ++++++++++ .../ResponseRequisition/api/hooks/index.ts | 1 + .../api/operations.generated.ts | 22 +++++++++++++++++++ .../api/operations.graphql | 13 +++++++++++ 7 files changed, 73 insertions(+) create mode 100644 client/packages/requisitions/src/ResponseRequisition/api/hooks/document/useInsertProgramResponse.ts diff --git a/client/packages/common/src/types/schema.ts b/client/packages/common/src/types/schema.ts index 23d18c0dfb..c1c35ca434 100644 --- a/client/packages/common/src/types/schema.ts +++ b/client/packages/common/src/types/schema.ts @@ -8021,7 +8021,9 @@ export type UpdateResponseRequisitionLineErrorInterface = { export type UpdateResponseRequisitionLineInput = { comment?: InputMaybe; id: Scalars['String']['input']; + requestedQuantity?: InputMaybe; supplyQuantity?: InputMaybe; + theirStockOnHand?: InputMaybe; }; export type UpdateResponseRequisitionLineResponse = RequisitionLineNode | UpdateResponseRequisitionLineError; diff --git a/client/packages/requisitions/src/ResponseRequisition/api/api.ts b/client/packages/requisitions/src/ResponseRequisition/api/api.ts index 248a92f66d..c8a0d4a0ba 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/api.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/api.ts @@ -7,6 +7,7 @@ import { UpdateResponseRequisitionInput, UpdateResponseRequisitionStatusInput, UpdateResponseRequisitionLineInput, + InsertProgramResponseRequisitionInput, } from '@openmsupply-client/common'; import { ResponseFragment, @@ -177,6 +178,26 @@ export const getResponseQueries = (sdk: Sdk, storeId: string) => ({ throw new Error('Unable to create requisition'); }, + insertProgram: async ( + input: InsertProgramResponseRequisitionInput + ): Promise<{ + __typename: 'RequisitionNode'; + id: string; + requisitionNumber: number; + }> => { + const result = await sdk.insertProgramResponse({ + storeId, + input, + }); + + const { insertProgramResponseRequisition } = result || {}; + + if (insertProgramResponseRequisition?.__typename === 'RequisitionNode') { + return insertProgramResponseRequisition; + } + + throw new Error('Unable to create requisition'); + }, update: async ( patch: Partial & { id: string } ): Promise<{ __typename: 'RequisitionNode'; id: string }> => { diff --git a/client/packages/requisitions/src/ResponseRequisition/api/hooks/document/index.ts b/client/packages/requisitions/src/ResponseRequisition/api/hooks/document/index.ts index 5329debb72..8879b8bf4e 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/hooks/document/index.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/hooks/document/index.ts @@ -1,3 +1,4 @@ +import { useInsertProgramResponse } from './useInsertProgramResponse'; import { useInsertResponse } from './useInsertResponse'; import { useResponse } from './useResponse'; import { useResponseFields } from './useResponseFields'; @@ -12,4 +13,5 @@ export const Document = { useResponsesAll, useUpdateResponse, useInsertResponse, + useInsertProgramResponse, }; diff --git a/client/packages/requisitions/src/ResponseRequisition/api/hooks/document/useInsertProgramResponse.ts b/client/packages/requisitions/src/ResponseRequisition/api/hooks/document/useInsertProgramResponse.ts new file mode 100644 index 0000000000..5af9bc8ff3 --- /dev/null +++ b/client/packages/requisitions/src/ResponseRequisition/api/hooks/document/useInsertProgramResponse.ts @@ -0,0 +1,12 @@ +import { useQueryClient, useMutation } from '@openmsupply-client/common'; +import { useResponseApi } from '../utils/useResponseApi'; + +export const useInsertProgramResponse = () => { + const queryClient = useQueryClient(); + const api = useResponseApi(); + return useMutation(api.insertProgram, { + onSuccess: () => { + queryClient.invalidateQueries(api.keys.base()); + }, + }); +}; diff --git a/client/packages/requisitions/src/ResponseRequisition/api/hooks/index.ts b/client/packages/requisitions/src/ResponseRequisition/api/hooks/index.ts index 9246c0914e..18c4f18419 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/hooks/index.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/hooks/index.ts @@ -9,6 +9,7 @@ export const useResponse = { listAll: Document.useResponsesAll, insert: Document.useInsertResponse, + insertProgram: Document.useInsertProgramResponse, update: Document.useUpdateResponse, fields: Document.useResponseFields, diff --git a/client/packages/requisitions/src/ResponseRequisition/api/operations.generated.ts b/client/packages/requisitions/src/ResponseRequisition/api/operations.generated.ts index 6898f3e759..90c4fa69c8 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/operations.generated.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/operations.generated.ts @@ -43,6 +43,14 @@ export type InsertResponseMutationVariables = Types.Exact<{ export type InsertResponseMutation = { __typename: 'Mutations', insertResponseRequisition: { __typename: 'InsertResponseRequisitionError', error: { __typename: 'OtherPartyNotACustomer', description: string } | { __typename: 'OtherPartyNotVisible', description: string } } | { __typename: 'RequisitionNode', id: string, requisitionNumber: number } }; +export type InsertProgramResponseMutationVariables = Types.Exact<{ + storeId: Types.Scalars['String']['input']; + input: Types.InsertProgramResponseRequisitionInput; +}>; + + +export type InsertProgramResponseMutation = { __typename: 'Mutations', insertProgramResponseRequisition: { __typename: 'InsertProgramResponseRequisitionError' } | { __typename: 'RequisitionNode', id: string, requisitionNumber: number } }; + export type UpdateResponseLineMutationVariables = Types.Exact<{ storeId: Types.Scalars['String']['input']; input: Types.UpdateResponseRequisitionLineInput; @@ -266,6 +274,17 @@ export const InsertResponseDocument = gql` } } `; +export const InsertProgramResponseDocument = gql` + mutation insertProgramResponse($storeId: String!, $input: InsertProgramResponseRequisitionInput!) { + insertProgramResponseRequisition(input: $input, storeId: $storeId) { + ... on RequisitionNode { + __typename + id + requisitionNumber + } + } +} + `; export const UpdateResponseLineDocument = gql` mutation updateResponseLine($storeId: String!, $input: UpdateResponseRequisitionLineInput!) { updateResponseRequisitionLine(input: $input, storeId: $storeId) { @@ -411,6 +430,9 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = insertResponse(variables: InsertResponseMutationVariables, requestHeaders?: GraphQLClientRequestHeaders): Promise { return withWrapper((wrappedRequestHeaders) => client.request(InsertResponseDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'insertResponse', 'mutation', variables); }, + insertProgramResponse(variables: InsertProgramResponseMutationVariables, requestHeaders?: GraphQLClientRequestHeaders): Promise { + return withWrapper((wrappedRequestHeaders) => client.request(InsertProgramResponseDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'insertProgramResponse', 'mutation', variables); + }, updateResponseLine(variables: UpdateResponseLineMutationVariables, requestHeaders?: GraphQLClientRequestHeaders): Promise { return withWrapper((wrappedRequestHeaders) => client.request(UpdateResponseLineDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'updateResponseLine', 'mutation', variables); }, diff --git a/client/packages/requisitions/src/ResponseRequisition/api/operations.graphql b/client/packages/requisitions/src/ResponseRequisition/api/operations.graphql index abc26f640b..f825b638fd 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/operations.graphql +++ b/client/packages/requisitions/src/ResponseRequisition/api/operations.graphql @@ -199,6 +199,19 @@ mutation insertResponse( } } +mutation insertProgramResponse( + $storeId: String! + $input: InsertProgramResponseRequisitionInput! +) { + insertProgramResponseRequisition(input: $input, storeId: $storeId) { + ... on RequisitionNode { + __typename + id + requisitionNumber + } + } +} + mutation updateResponseLine( $storeId: String! $input: UpdateResponseRequisitionLineInput! From fe7842eb95df18e74339dd91440e836375c54410 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 12:01:41 +1300 Subject: [PATCH 02/18] Hook to get customer program settings --- .../src/ResponseRequisition/api/api.ts | 4 ++ .../ResponseRequisition/api/hooks/index.ts | 1 + .../api/hooks/utils/index.ts | 2 + .../api/hooks/utils/useProgramSettings.ts | 8 ++++ .../api/hooks/utils/useResponseApi.ts | 2 + .../api/operations.generated.ts | 39 +++++++++++++++++++ .../api/operations.graphql | 24 ++++++++++++ 7 files changed, 80 insertions(+) create mode 100644 client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/useProgramSettings.ts diff --git a/client/packages/requisitions/src/ResponseRequisition/api/api.ts b/client/packages/requisitions/src/ResponseRequisition/api/api.ts index c8a0d4a0ba..0270b6a7e3 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/api.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/api.ts @@ -271,4 +271,8 @@ export const getResponseQueries = (sdk: Sdk, storeId: string) => ({ (await sdk.supplyRequestedQuantity({ storeId, responseId })) || {}; return result; }, + programSettings: async () => { + const result = await sdk.customerProgramSettings({ storeId }); + return result.customerProgramRequisitionSettings; + }, }); diff --git a/client/packages/requisitions/src/ResponseRequisition/api/hooks/index.ts b/client/packages/requisitions/src/ResponseRequisition/api/hooks/index.ts index 18c4f18419..5bb5364fd5 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/hooks/index.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/hooks/index.ts @@ -29,5 +29,6 @@ export const useResponse = { preferences: Utils.useRequisitionPreferences, supplyRequested: Utils.useSupplyRequestedQuantity, isDisabledByAuthorisation: Utils.useIsDisabledByAuthorisation, + programSettings: Utils.useProgramSettings, }, }; diff --git a/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/index.ts b/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/index.ts index ce58eeaf47..64d933af0b 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/index.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/index.ts @@ -5,6 +5,7 @@ import { useSupplyRequestedQuantity } from './useSupplyRequestedQuantity'; import { useIsRemoteAuthorisation } from './useIsRemoteAuthorisation'; import { useRequisitionPreferences } from './useRequisitionPreferences'; import { useIsDisabledByAuthorisation } from './useIsDisabledByAuthorisation'; +import { useProgramSettings } from './useProgramSettings'; export const Utils = { useCreateOutboundFromResponse, @@ -14,4 +15,5 @@ export const Utils = { useSupplyRequestedQuantity, useRequisitionPreferences, useIsDisabledByAuthorisation, + useProgramSettings, }; diff --git a/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/useProgramSettings.ts b/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/useProgramSettings.ts new file mode 100644 index 0000000000..309ca720d0 --- /dev/null +++ b/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/useProgramSettings.ts @@ -0,0 +1,8 @@ +import { useQuery } from '@openmsupply-client/common'; +import { useResponseApi } from './useResponseApi'; + +export const useProgramSettings = () => { + const api = useResponseApi(); + + return useQuery(api.keys.programSettings(), () => api.programSettings()); +}; diff --git a/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/useResponseApi.ts b/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/useResponseApi.ts index 0452f25157..fbc7c98512 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/useResponseApi.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/hooks/utils/useResponseApi.ts @@ -11,6 +11,8 @@ export const useResponseApi = () => { sortedList: (sortBy: SortBy) => [...keys.list(), sortBy] as const, statsData: (lineId: string) => [...keys.base(), lineId, storeId] as const, + programSettings: () => + [...keys.base(), 'programSettings', storeId] as const, }; const { client } = useGql(); diff --git a/client/packages/requisitions/src/ResponseRequisition/api/operations.generated.ts b/client/packages/requisitions/src/ResponseRequisition/api/operations.generated.ts index 90c4fa69c8..8a168b6054 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/operations.generated.ts +++ b/client/packages/requisitions/src/ResponseRequisition/api/operations.generated.ts @@ -2,6 +2,7 @@ import * as Types from '@openmsupply-client/common'; import { GraphQLClient, RequestOptions } from 'graphql-request'; import gql from 'graphql-tag'; +import { NameRowFragmentDoc } from '../../../../system/src/Name/api/operations.generated'; type GraphQLClientRequestHeaders = RequestOptions['requestHeaders']; export type UpdateResponseMutationVariables = Types.Exact<{ storeId: Types.Scalars['String']['input']; @@ -83,6 +84,15 @@ export type ResponseRequisitionStatsQueryVariables = Types.Exact<{ export type ResponseRequisitionStatsQuery = { __typename: 'Queries', responseRequisitionStats: { __typename: 'RequisitionLineStatsError', error: { __typename: 'RecordNotFound', description: string } } | { __typename: 'ResponseRequisitionStatsNode', requestStoreStats: { __typename: 'RequestStoreStatsNode', averageMonthlyConsumption: number, stockOnHand: number, maxMonthsOfStock: number, suggestedQuantity: number }, responseStoreStats: { __typename: 'ResponseStoreStatsNode', incomingStock: number, otherRequestedQuantity: number, requestedQuantity: number, stockOnHand: number, stockOnOrder: number } } }; +export type CustomerProgramSettingsFragment = { __typename: 'CustomerProgramRequisitionSettingNode', programName: string, programId: string, customerAndOrderTypes: Array<{ __typename: 'CustomerAndOrderTypeNode', customer: { __typename: 'NameNode', code: string, id: string, isCustomer: boolean, isSupplier: boolean, isOnHold: boolean, name: string, store?: { __typename: 'StoreNode', id: string, code: string } | null }, orderTypes: Array<{ __typename: 'ProgramRequisitionOrderTypeNode', id: string, name: string, availablePeriods: Array<{ __typename: 'PeriodNode', id: string, name: string }> }> }> }; + +export type CustomerProgramSettingsQueryVariables = Types.Exact<{ + storeId: Types.Scalars['String']['input']; +}>; + + +export type CustomerProgramSettingsQuery = { __typename: 'Queries', customerProgramRequisitionSettings: Array<{ __typename: 'CustomerProgramRequisitionSettingNode', programName: string, programId: string, customerAndOrderTypes: Array<{ __typename: 'CustomerAndOrderTypeNode', customer: { __typename: 'NameNode', code: string, id: string, isCustomer: boolean, isSupplier: boolean, isOnHold: boolean, name: string, store?: { __typename: 'StoreNode', id: string, code: string } | null }, orderTypes: Array<{ __typename: 'ProgramRequisitionOrderTypeNode', id: string, name: string, availablePeriods: Array<{ __typename: 'PeriodNode', id: string, name: string }> }> }> }> }; + export const ResponseLineFragmentDoc = gql` fragment ResponseLine on RequisitionLineNode { id @@ -213,6 +223,25 @@ export const ResponseRowFragmentDoc = gql` } } `; +export const CustomerProgramSettingsFragmentDoc = gql` + fragment CustomerProgramSettings on CustomerProgramRequisitionSettingNode { + programName + programId + customerAndOrderTypes { + customer { + ...NameRow + } + orderTypes { + id + name + availablePeriods { + id + name + } + } + } +} + ${NameRowFragmentDoc}`; export const UpdateResponseDocument = gql` mutation updateResponse($storeId: String!, $input: UpdateResponseRequisitionInput!) { updateResponseRequisition(input: $input, storeId: $storeId) { @@ -410,6 +439,13 @@ export const ResponseRequisitionStatsDocument = gql` } } `; +export const CustomerProgramSettingsDocument = gql` + query customerProgramSettings($storeId: String!) { + customerProgramRequisitionSettings(storeId: $storeId) { + ...CustomerProgramSettings + } +} + ${CustomerProgramSettingsFragmentDoc}`; export type SdkFunctionWrapper = (action: (requestHeaders?:Record) => Promise, operationName: string, operationType?: string, variables?: any) => Promise; @@ -444,6 +480,9 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = }, responseRequisitionStats(variables: ResponseRequisitionStatsQueryVariables, requestHeaders?: GraphQLClientRequestHeaders): Promise { return withWrapper((wrappedRequestHeaders) => client.request(ResponseRequisitionStatsDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'responseRequisitionStats', 'query', variables); + }, + customerProgramSettings(variables: CustomerProgramSettingsQueryVariables, requestHeaders?: GraphQLClientRequestHeaders): Promise { + return withWrapper((wrappedRequestHeaders) => client.request(CustomerProgramSettingsDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'customerProgramSettings', 'query', variables); } }; } diff --git a/client/packages/requisitions/src/ResponseRequisition/api/operations.graphql b/client/packages/requisitions/src/ResponseRequisition/api/operations.graphql index f825b638fd..86ae84a1b9 100644 --- a/client/packages/requisitions/src/ResponseRequisition/api/operations.graphql +++ b/client/packages/requisitions/src/ResponseRequisition/api/operations.graphql @@ -335,3 +335,27 @@ query responseRequisitionStats($storeId: String!, $requisitionLineId: String!) { } } } + +fragment CustomerProgramSettings on CustomerProgramRequisitionSettingNode { + programName + programId + customerAndOrderTypes { + customer { + ...NameRow + } + orderTypes { + id + name + availablePeriods { + id + name + } + } + } +} + +query customerProgramSettings($storeId: String!) { + customerProgramRequisitionSettings(storeId: $storeId) { + ...CustomerProgramSettings + } +} From 3269335136ed9e19f65b1ee50209f66f1bb1211d Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 12:02:56 +1300 Subject: [PATCH 03/18] Move NewRequisitionType to common type file --- .../src/RequestRequisition/ListView/AppBarButtons.tsx | 2 +- .../RequestRequisition/ListView/CreateRequisitionModal.tsx | 2 +- .../RequestRequisition/ListView/ProgramRequisitionOptions.tsx | 2 +- .../requisitions/src/RequestRequisition/ListView/types.ts | 4 ---- client/packages/requisitions/src/types.ts | 4 ++++ 5 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 client/packages/requisitions/src/RequestRequisition/ListView/types.ts diff --git a/client/packages/requisitions/src/RequestRequisition/ListView/AppBarButtons.tsx b/client/packages/requisitions/src/RequestRequisition/ListView/AppBarButtons.tsx index 27de54a7ce..db8c93e8cc 100644 --- a/client/packages/requisitions/src/RequestRequisition/ListView/AppBarButtons.tsx +++ b/client/packages/requisitions/src/RequestRequisition/ListView/AppBarButtons.tsx @@ -19,8 +19,8 @@ import { import { useRequest } from '../api'; import { requestsToCsv } from '../../utils'; import { CreateRequisitionModal } from './CreateRequisitionModal'; -import { NewRequisitionType } from './types'; import { AppRoute } from '@openmsupply-client/config'; +import { NewRequisitionType } from '../../types'; export const AppBarButtons: FC<{ modalController: ToggleState; diff --git a/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx b/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx index 263b6fb5e5..b969219f4c 100644 --- a/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx +++ b/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx @@ -17,7 +17,7 @@ import { NewProgramRequisition, ProgramRequisitionOptions, } from './ProgramRequisitionOptions'; -import { NewRequisitionType } from './types'; +import { NewRequisitionType } from '../../types'; interface NewGeneralRequisition { type: NewRequisitionType.General; diff --git a/client/packages/requisitions/src/RequestRequisition/ListView/ProgramRequisitionOptions.tsx b/client/packages/requisitions/src/RequestRequisition/ListView/ProgramRequisitionOptions.tsx index a36786a305..b950c71a22 100644 --- a/client/packages/requisitions/src/RequestRequisition/ListView/ProgramRequisitionOptions.tsx +++ b/client/packages/requisitions/src/RequestRequisition/ListView/ProgramRequisitionOptions.tsx @@ -11,7 +11,7 @@ import { import { getNameOptionRenderer } from '@openmsupply-client/system'; import { SupplierProgramSettingsFragment } from '../api'; -import { NewRequisitionType } from './types'; +import { NewRequisitionType } from '../../types'; export interface NewProgramRequisition { type: NewRequisitionType.Program; diff --git a/client/packages/requisitions/src/RequestRequisition/ListView/types.ts b/client/packages/requisitions/src/RequestRequisition/ListView/types.ts deleted file mode 100644 index 597069d647..0000000000 --- a/client/packages/requisitions/src/RequestRequisition/ListView/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum NewRequisitionType { - General, - Program, -} diff --git a/client/packages/requisitions/src/types.ts b/client/packages/requisitions/src/types.ts index e69de29bb2..597069d647 100644 --- a/client/packages/requisitions/src/types.ts +++ b/client/packages/requisitions/src/types.ts @@ -0,0 +1,4 @@ +export enum NewRequisitionType { + General, + Program, +} From a484ea2d6e77f0774e6d8193a2f57b312e56920d Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 12:53:19 +1300 Subject: [PATCH 04/18] Move program info section to side panel --- .../DetailView/ProgramInfoSection.tsx | 40 +++++++++++++++++ .../DetailView/SidePanel.tsx | 2 + .../DetailView/Toolbar.tsx | 43 +++---------------- 3 files changed, 49 insertions(+), 36 deletions(-) create mode 100644 client/packages/requisitions/src/ResponseRequisition/DetailView/ProgramInfoSection.tsx diff --git a/client/packages/requisitions/src/ResponseRequisition/DetailView/ProgramInfoSection.tsx b/client/packages/requisitions/src/ResponseRequisition/DetailView/ProgramInfoSection.tsx new file mode 100644 index 0000000000..9d7318cb64 --- /dev/null +++ b/client/packages/requisitions/src/ResponseRequisition/DetailView/ProgramInfoSection.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { DetailPanelSection } from '@common/components'; +import { useTranslation } from '@common/intl'; +import { useResponse } from '../api'; +import { + Grid, + PanelField, + PanelLabel, + PanelRow, +} from '@openmsupply-client/common'; + +export const ProgramInfoSection = () => { + const { orderType, programName, period } = useResponse.document.fields([ + 'orderType', + 'programName', + 'period', + ]); + const t = useTranslation(); + + return programName ? ( + + + + {t('label.order-type')} + {orderType ?? ''} + + + {t('label.program')} + {programName ?? ''} + + + {t('label.period')} + {period?.name ?? ''} + + + + ) : ( + <> + ); +}; diff --git a/client/packages/requisitions/src/ResponseRequisition/DetailView/SidePanel.tsx b/client/packages/requisitions/src/ResponseRequisition/DetailView/SidePanel.tsx index 2890dceba3..f460376e93 100644 --- a/client/packages/requisitions/src/ResponseRequisition/DetailView/SidePanel.tsx +++ b/client/packages/requisitions/src/ResponseRequisition/DetailView/SidePanel.tsx @@ -9,6 +9,7 @@ import { import { useResponse } from '../api'; import { AdditionalInfoSection } from './AdditionalInfoSection'; import { RelatedDocumentsSection } from './RelatedDocumentsSection'; +import { ProgramInfoSection } from './ProgramInfoSection'; export const SidePanel: FC = () => { const { success } = useNotification(); @@ -31,6 +32,7 @@ export const SidePanel: FC = () => { /> } > + diff --git a/client/packages/requisitions/src/ResponseRequisition/DetailView/Toolbar.tsx b/client/packages/requisitions/src/ResponseRequisition/DetailView/Toolbar.tsx index 7419aaae50..6adc662737 100644 --- a/client/packages/requisitions/src/ResponseRequisition/DetailView/Toolbar.tsx +++ b/client/packages/requisitions/src/ResponseRequisition/DetailView/Toolbar.tsx @@ -24,24 +24,13 @@ export const Toolbar: FC = () => { const isDisabled = useResponse.utils.isDisabled(); const { itemFilter, setItemFilter } = useResponse.line.list(); - const { - approvalStatus, - otherParty, - theirReference, - shipments, - update, - programName, - period, - orderType, - } = useResponse.document.fields([ - 'approvalStatus', - 'otherParty', - 'theirReference', - 'shipments', - 'programName', - 'period', - 'orderType', - ]); + const { approvalStatus, otherParty, theirReference, shipments, update } = + useResponse.document.fields([ + 'approvalStatus', + 'otherParty', + 'theirReference', + 'shipments', + ]); const { onDelete } = useResponse.line.delete(); const noLinkedShipments = (shipments?.totalCount ?? 0) === 0; const showInfo = noLinkedShipments && !isDisabled; @@ -98,24 +87,6 @@ export const Toolbar: FC = () => { } /> )} - {orderType && ( - {orderType ?? ''}} - /> - )} - {programName && ( - {programName ?? ''}} - /> - )} - {period && ( - {period?.name ?? ''}} - /> - )} {showInfo && ( From 52eb2ac43c2148b48a60f0443b5a44de61cb6999 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 13:57:23 +1300 Subject: [PATCH 05/18] Refactor customer modal to return as autocomplete list or list search --- .../CustomerSearchModal.tsx | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/client/packages/system/src/Name/Components/CustomerSearchModal/CustomerSearchModal.tsx b/client/packages/system/src/Name/Components/CustomerSearchModal/CustomerSearchModal.tsx index 23fbb514c7..2fac1948a1 100644 --- a/client/packages/system/src/Name/Components/CustomerSearchModal/CustomerSearchModal.tsx +++ b/client/packages/system/src/Name/Components/CustomerSearchModal/CustomerSearchModal.tsx @@ -1,42 +1,48 @@ import React, { FC } from 'react'; import { + AutocompleteList, + AutocompleteListProps, createQueryParamsStore, ListSearch, QueryParamsProvider, useTranslation, } from '@openmsupply-client/common'; import { useName, NameRowFragment } from '../../api'; -import { filterByNameAndCode, NameSearchModalProps } from '../../utils'; +import { filterByNameAndCode, NameSearchProps } from '../../utils'; import { getNameOptionRenderer } from '../NameOptionRenderer'; -const CustomerSearchComponent: FC = ({ - open, - onClose, - onChange, -}) => { +const CustomerSearchComponent: FC = props => { const { data, isLoading } = useName.document.customers(); const t = useTranslation(); const NameOptionRenderer = getNameOptionRenderer(t('label.on-hold')); + const listProps: AutocompleteListProps = { + loading: isLoading, + filterOptions: filterByNameAndCode, + getOptionLabel: option => option.name, + renderOption: NameOptionRenderer, + onChange: (_, name) => { + if (name && !(name instanceof Array)) props.onChange(name); + }, + options: data?.nodes ?? [], + getOptionDisabled: option => option.isOnHold, + }; + + if ('isList' in props) return ; + + let { open, onClose } = props; + return ( option.name} - filterOptions={filterByNameAndCode} - onChange={(_, name: NameRowFragment | NameRowFragment[] | null) => { - if (name && !(name instanceof Array)) onChange(name); - }} - getOptionDisabled={option => option.isOnHold} + {...listProps} /> ); }; -export const CustomerSearchModal: FC = props => ( +export const CustomerSearchModal: FC = props => ( ({ initialSortBy: { key: 'name' }, From 157a76806756bd3cb39cdae9bb89bac9d058a42e Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 14:59:41 +1300 Subject: [PATCH 06/18] Move translation const up --- .../src/ResponseRequisition/DetailView/ProgramInfoSection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/packages/requisitions/src/ResponseRequisition/DetailView/ProgramInfoSection.tsx b/client/packages/requisitions/src/ResponseRequisition/DetailView/ProgramInfoSection.tsx index 9d7318cb64..973774ba9f 100644 --- a/client/packages/requisitions/src/ResponseRequisition/DetailView/ProgramInfoSection.tsx +++ b/client/packages/requisitions/src/ResponseRequisition/DetailView/ProgramInfoSection.tsx @@ -10,12 +10,12 @@ import { } from '@openmsupply-client/common'; export const ProgramInfoSection = () => { + const t = useTranslation(); const { orderType, programName, period } = useResponse.document.fields([ 'orderType', 'programName', 'period', ]); - const t = useTranslation(); return programName ? ( From 1e23f91f8c711aa442ff2c03bdbafd8c34c7236b Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 15:05:27 +1300 Subject: [PATCH 07/18] Response Program Requisition options --- .../ListView/ProgramRequisitionOptions.tsx | 191 ++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx diff --git a/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx b/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx new file mode 100644 index 0000000000..78a13b3b8e --- /dev/null +++ b/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx @@ -0,0 +1,191 @@ +import React, { useEffect, useState } from 'react'; +import { + Autocomplete, + AutocompleteProps, + ButtonWithIcon, + Grid, + PlusCircleIcon, + Typography, + useTranslation, +} from '@openmsupply-client/common'; +import { getNameOptionRenderer } from '@openmsupply-client/system'; + +import { CustomerProgramSettingsFragment } from '../api'; +import { NewRequisitionType } from '../../types'; + +export interface NewProgramRequisition { + type: NewRequisitionType.Program; + programOrderTypeId: string; + otherPartyId: string; + periodId: string; +} + +type Common = Pick< + AutocompleteProps, + 'options' | 'value' | 'disabled' | 'renderOption' | 'getOptionDisabled' +> & { + label: string; + set: (value: T | null) => void; + labelNoOptions?: string; +}; + +const useProgramRequisitionOptions = ( + programSettings: CustomerProgramSettingsFragment[] +) => { + const t = useTranslation(); + type ProgramSetting = CustomerProgramSettingsFragment; + type CustomerAndOrderTypes = + CustomerProgramSettingsFragment['customerAndOrderTypes'][number]; + type OrderType = CustomerAndOrderTypes['orderTypes'][number]; + type Customer = CustomerAndOrderTypes['customer']; + type Period = OrderType['availablePeriods'][number]; + + const [program, setProgram] = useState(null); + const [orderType, setOrderType] = useState(null); + const [customer, setCustomer] = useState(null); + const [period, setPeriod] = useState(null); + + useEffect(() => { + setOrderType(null); + setCustomer(null); + }, [program]); + + useEffect(() => { + setPeriod(null); + }, [orderType]); + + const allOptions: { + programs: Common; + orderTypes: Common; + customers: Common; + periods: Common; + } = { + programs: { + options: programSettings, + value: program, + set: setProgram, + label: t('label.program'), + disabled: false, + }, + orderTypes: { + options: program?.customerAndOrderTypes.flatMap(c => c.orderTypes) || [], + value: orderType, + set: setOrderType, + disabled: program === null, + labelNoOptions: t('messages.not-configured'), + label: t('label.order-type'), + }, + customers: { + options: program?.customerAndOrderTypes.flatMap(c => c.customer) || [], + value: customer, + set: setCustomer, + disabled: program === null, + labelNoOptions: t('messages.not-configured'), + label: t('label.customer-name'), + renderOption: getNameOptionRenderer(t('label.on-hold')), + getOptionDisabled: (customer: Customer) => customer.isOnHold, + }, + periods: { + options: orderType?.availablePeriods || [], + value: period, + set: setPeriod, + disabled: orderType == null, + labelNoOptions: t('messages.period-not-available'), + label: t('label.period'), + }, + }; + + return { + ...allOptions, + createOptions: + !!program && !!orderType && !!customer && !!period + ? { + programOrderTypeId: orderType.id, + otherPartyId: customer.id, + periodId: period.id, + } + : null, + }; +}; + +const LabelAndOptions = ({ + label, + options, + disabled, + labelNoOptions, + set, + value, + autoFocus, + optionKey, + renderOption, + getOptionDisabled, +}: Pick, 'optionKey' | 'autoFocus'> & Common) => { + const noOptionsDisplay = options.length == 0 && + !disabled && + !!labelNoOptions && {labelNoOptions}; + + return ( + + + {label} + + + {noOptionsDisplay || ( + set(newValue)} + /> + )} + + + ); +}; + +export const ProgramRequisitionOptions = ({ + programSettings, + onCreate, +}: { + onCreate: (props: NewProgramRequisition) => void; + programSettings: CustomerProgramSettingsFragment[]; +}) => { + const { programs, orderTypes, customers, periods, createOptions } = + useProgramRequisitionOptions(programSettings); + const t = useTranslation(); + + return ( + + + + + + + } + disabled={!createOptions} + label={t('label.create')} + onClick={() => { + if (!createOptions) return; + onCreate({ + type: NewRequisitionType.Program, + ...createOptions, + }); + }} + /> + + + ); +}; From 92510596d202d926e0e23512641ff9ef1a7cb45c Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 15:06:14 +1300 Subject: [PATCH 08/18] Modal for creating program or general response requisition --- .../ListView/CreateRequisitionModal.tsx | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx diff --git a/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx b/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx new file mode 100644 index 0000000000..9b375676a0 --- /dev/null +++ b/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx @@ -0,0 +1,111 @@ +import React, { FC } from 'react'; +import { + BasicSpinner, + Box, + ModalTabs, + useDialog, + useTranslation, + useWindowDimensions, +} from '@openmsupply-client/common'; +import { + CustomerSearchModal, + NameRowFragment, +} from '@openmsupply-client/system'; + +import { useResponse } from '../api'; +import { NewRequisitionType } from '../../types'; +import { + NewProgramRequisition, + ProgramRequisitionOptions, +} from './ProgramRequisitionOptions'; + +interface NewGeneralRequisition { + type: NewRequisitionType.General; + name: NameRowFragment; +} + +interface CreateRequisitionModalProps { + isOpen: boolean; + onClose: () => void; + onCreate: ( + newRequisition: NewGeneralRequisition | NewProgramRequisition + ) => void; +} + +export const CreateRequisitionModal: FC = ({ + isOpen, + onClose, + onCreate, +}) => { + const t = useTranslation(); + const { data: programSettings, isLoading } = + useResponse.utils.programSettings(); + const { Modal } = useDialog({ isOpen, onClose, disableBackdrop: false }); + const { height: windowHeight } = useWindowDimensions(); + const height = windowHeight * 0.8; + + const InnerComponent = () => { + if (isLoading) return ; + + if (programSettings && programSettings.length > 0) + return ( + + ), + value: t('label.requisition-program'), + }, + { + Component: ( + + ), + value: t('label.requisition-general'), + }, + ]} + /> + ); + + return ( + + ); + }; + + return ( + + + + ); +}; + +const GeneralRequisition = ({ + onCreate, + open, + onClose, +}: { + onCreate: (props: NewGeneralRequisition) => void; + open: boolean; + onClose: () => void; +}) => ( + + onCreate({ type: NewRequisitionType.General, name })} + open={open} + onClose={onClose} + isList={true} + /> + +); From 48d2a42f2a4f02ec67fd611644aff1b5987c3af9 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Thu, 24 Oct 2024 15:07:06 +1300 Subject: [PATCH 09/18] Refactor add requisition button to use new creation modal --- .../ListView/AppBarButtons.tsx | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/client/packages/requisitions/src/ResponseRequisition/ListView/AppBarButtons.tsx b/client/packages/requisitions/src/ResponseRequisition/ListView/AppBarButtons.tsx index 5495b541b9..8682365693 100644 --- a/client/packages/requisitions/src/ResponseRequisition/ListView/AppBarButtons.tsx +++ b/client/packages/requisitions/src/ResponseRequisition/ListView/AppBarButtons.tsx @@ -19,7 +19,8 @@ import { import { useResponse } from '../api'; import { responsesToCsv } from '../../utils'; import { AppRoute } from '@openmsupply-client/config'; -import { CustomerSearchModal } from '@openmsupply-client/system'; +import { NewRequisitionType } from '../../types'; +import { CreateRequisitionModal } from './CreateRequisitionModal'; export const AppBarButtons = ({ modalController, @@ -30,6 +31,8 @@ export const AppBarButtons = ({ const navigate = useNavigate(); const { success, error } = useNotification(); const { mutateAsync: onCreate } = useResponse.document.insert(); + const { mutateAsync: onProgramCreate } = useResponse.document.insertProgram(); + const { mutateAsync, isLoading } = useResponse.document.listAll({ key: 'createdDatetime', direction: 'desc', @@ -66,29 +69,40 @@ export const AppBarButtons = ({ {t('button.export')} - { + onCreate={async newRequisition => { modalController.toggleOff(); - try { - await onCreate({ - id: FnUtils.generateUUID(), - otherPartyId: name.id, - }).then(({ requisitionNumber }) => { - navigate( - RouteBuilder.create(AppRoute.Distribution) - .addPart(AppRoute.CustomerRequisition) - .addPart(String(requisitionNumber)) - .build(), - { replace: true } - ); - }); - } catch (e) { - const errorSnack = error( - `${t('message.failed-to-create-requisition')}: ${(e as Error).message}` - ); - errorSnack(); + switch (newRequisition.type) { + case NewRequisitionType.General: + return onCreate({ + id: FnUtils.generateUUID(), + otherPartyId: newRequisition.name.id, + }).then(({ requisitionNumber }) => { + navigate( + RouteBuilder.create(AppRoute.Distribution) + .addPart(AppRoute.CustomerRequisition) + .addPart(String(requisitionNumber)) + .build(), + { replace: true } + ); + }); + case NewRequisitionType.Program: + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { type: _, ...rest } = newRequisition; + return onProgramCreate({ + id: FnUtils.generateUUID(), + ...rest, + }).then(({ requisitionNumber }) => { + navigate( + RouteBuilder.create(AppRoute.Distribution) + .addPart(AppRoute.CustomerRequisition) + .addPart(String(requisitionNumber)) + .build(), + { replace: true } + ); + }); } }} /> From 5893d0917c96c59175842f304fbf8d87adb46be6 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Fri, 25 Oct 2024 11:59:01 +1300 Subject: [PATCH 10/18] Make modal wider --- .../src/ResponseRequisition/ListView/CreateRequisitionModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx b/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx index 9b375676a0..d1cdbcc059 100644 --- a/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx +++ b/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx @@ -82,7 +82,7 @@ export const CreateRequisitionModal: FC = ({ return ( From 4f8b2b7e4d0768c5d462f379da73ce3f4a617599 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Fri, 25 Oct 2024 11:59:50 +1300 Subject: [PATCH 11/18] Filter out order types by customer --- .../ListView/ProgramRequisitionOptions.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx b/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx index 78a13b3b8e..8554853ee0 100644 --- a/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx +++ b/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx @@ -68,15 +68,18 @@ const useProgramRequisitionOptions = ( disabled: false, }, orderTypes: { - options: program?.customerAndOrderTypes.flatMap(c => c.orderTypes) || [], + options: + program?.customerAndOrderTypes + .filter(c => c.customer.id === customer?.id) + .flatMap(c => c.orderTypes) || [], value: orderType, set: setOrderType, - disabled: program === null, + disabled: program === null || customer === null, labelNoOptions: t('messages.not-configured'), label: t('label.order-type'), }, customers: { - options: program?.customerAndOrderTypes.flatMap(c => c.customer) || [], + options: program?.customerAndOrderTypes.map(c => c.customer) || [], value: customer, set: setCustomer, disabled: program === null, @@ -132,7 +135,7 @@ const LabelAndOptions = ({ {noOptionsDisplay || ( Date: Fri, 25 Oct 2024 12:47:18 +1300 Subject: [PATCH 12/18] Change translation string --- client/packages/common/src/intl/locales/en/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/packages/common/src/intl/locales/en/common.json b/client/packages/common/src/intl/locales/en/common.json index 50957f9f2b..d1f6905300 100644 --- a/client/packages/common/src/intl/locales/en/common.json +++ b/client/packages/common/src/intl/locales/en/common.json @@ -800,7 +800,7 @@ "label.new-pack-size": "New pack size", "label.new-pack-variant": "New Pack Variant", "label.new-patient": "New Patient", - "label.new-requisition": "New Order", + "label.new-requisition": "New Requisition", "label.new-rnr-form": "New R&R Form", "label.new-row": "New Row", "label.new-stocktake": "New Stocktake", From dd9c7d355f1bf66ba1c5ca98381ff572f7dafc64 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Fri, 25 Oct 2024 12:51:43 +1300 Subject: [PATCH 13/18] Fixed height instead of use window dimensions to stop re-rendering --- .../ResponseRequisition/ListView/CreateRequisitionModal.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx b/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx index d1cdbcc059..bc0efe1ff1 100644 --- a/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx +++ b/client/packages/requisitions/src/ResponseRequisition/ListView/CreateRequisitionModal.tsx @@ -5,7 +5,6 @@ import { ModalTabs, useDialog, useTranslation, - useWindowDimensions, } from '@openmsupply-client/common'; import { CustomerSearchModal, @@ -31,7 +30,6 @@ interface CreateRequisitionModalProps { newRequisition: NewGeneralRequisition | NewProgramRequisition ) => void; } - export const CreateRequisitionModal: FC = ({ isOpen, onClose, @@ -41,8 +39,6 @@ export const CreateRequisitionModal: FC = ({ const { data: programSettings, isLoading } = useResponse.utils.programSettings(); const { Modal } = useDialog({ isOpen, onClose, disableBackdrop: false }); - const { height: windowHeight } = useWindowDimensions(); - const height = windowHeight * 0.8; const InnerComponent = () => { if (isLoading) return ; @@ -81,7 +77,7 @@ export const CreateRequisitionModal: FC = ({ return ( Date: Fri, 25 Oct 2024 12:58:04 +1300 Subject: [PATCH 14/18] Use function instead of useEffect --- .../ListView/ProgramRequisitionOptions.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx b/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx index 8554853ee0..6f79cdba8a 100644 --- a/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx +++ b/client/packages/requisitions/src/ResponseRequisition/ListView/ProgramRequisitionOptions.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useState } from 'react'; import { Autocomplete, AutocompleteProps, @@ -45,14 +45,16 @@ const useProgramRequisitionOptions = ( const [customer, setCustomer] = useState(null); const [period, setPeriod] = useState(null); - useEffect(() => { + const handleSetProgram = (value: ProgramSetting | null) => { + setProgram(value); setOrderType(null); setCustomer(null); - }, [program]); - - useEffect(() => { setPeriod(null); - }, [orderType]); + }; + const handleSetOrderType = (value: OrderType | null) => { + setOrderType(value); + setPeriod(null); + }; const allOptions: { programs: Common; @@ -63,7 +65,7 @@ const useProgramRequisitionOptions = ( programs: { options: programSettings, value: program, - set: setProgram, + set: handleSetProgram, label: t('label.program'), disabled: false, }, @@ -73,7 +75,7 @@ const useProgramRequisitionOptions = ( .filter(c => c.customer.id === customer?.id) .flatMap(c => c.orderTypes) || [], value: orderType, - set: setOrderType, + set: handleSetOrderType, disabled: program === null || customer === null, labelNoOptions: t('messages.not-configured'), label: t('label.order-type'), From fb1b9f1f55bf7e2a056c1534e02d6154e3d147f8 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Fri, 25 Oct 2024 14:01:33 +1300 Subject: [PATCH 15/18] Change height of new order modal --- .../RequestRequisition/ListView/CreateRequisitionModal.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx b/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx index b969219f4c..92b9100776 100644 --- a/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx +++ b/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx @@ -4,7 +4,6 @@ import { ModalTabs, useDialog, useTranslation, - useWindowDimensions, } from '@openmsupply-client/common'; import { @@ -40,8 +39,6 @@ export const CreateRequisitionModal: FC = ({ const { data: programSettings, isLoading } = useRequest.utils.programSettings(); const { Modal } = useDialog({ isOpen, onClose, disableBackdrop: false }); - const { height: windowHeight } = useWindowDimensions(); - const height = windowHeight * 0.8; // const { data, isLoading } = useName.document.internalSuppliers(); const t = useTranslation(); @@ -76,8 +73,8 @@ export const CreateRequisitionModal: FC = ({ return ( From 01fbcea02ff9d486327262d146ec09590715337c Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Fri, 25 Oct 2024 14:28:31 +1300 Subject: [PATCH 16/18] Refactor useEffect in internal order program --- .../ListView/ProgramRequisitionOptions.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/client/packages/requisitions/src/RequestRequisition/ListView/ProgramRequisitionOptions.tsx b/client/packages/requisitions/src/RequestRequisition/ListView/ProgramRequisitionOptions.tsx index b950c71a22..4467a3ca69 100644 --- a/client/packages/requisitions/src/RequestRequisition/ListView/ProgramRequisitionOptions.tsx +++ b/client/packages/requisitions/src/RequestRequisition/ListView/ProgramRequisitionOptions.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useState } from 'react'; import { Autocomplete, AutocompleteProps, @@ -44,14 +44,16 @@ const useProgramRequisitionOptions = ( const [period, setPeriod] = useState(null); const t = useTranslation(); - useEffect(() => { + const handleSetProgram = (value: ProgramSetting | null) => { + setProgram(value); setOrderType(null); setSupplier(null); - }, [program]); - - useEffect(() => { setPeriod(null); - }, [orderType]); + }; + const handleSetOrderType = (value: OrderType | null) => { + setOrderType(value); + setPeriod(null); + }; const allOptions: { programs: Common; @@ -62,14 +64,14 @@ const useProgramRequisitionOptions = ( programs: { options: programSettings, value: program, - set: setProgram, + set: handleSetProgram, label: t('label.program'), disabled: false, }, orderTypes: { options: program?.orderTypes || [], value: orderType, - set: setOrderType, + set: handleSetOrderType, disabled: program === null, labelNoOptions: t('messages.not-configured'), label: t('label.order-type'), From a848abd2c8dfe1392914c4c9e4817e05f7d6dea6 Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Tue, 29 Oct 2024 07:44:02 +1300 Subject: [PATCH 17/18] Add back new internal order label --- client/packages/common/src/intl/locales/en/common.json | 1 + .../src/RequestRequisition/ListView/CreateRequisitionModal.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/packages/common/src/intl/locales/en/common.json b/client/packages/common/src/intl/locales/en/common.json index d1f6905300..34251f7f4c 100644 --- a/client/packages/common/src/intl/locales/en/common.json +++ b/client/packages/common/src/intl/locales/en/common.json @@ -794,6 +794,7 @@ "label.new-contact-trace": "Add Contact", "label.new-encounter": "New Encounter", "label.new-functional-status": "New functional status", + "label.new-internal-order": "New Order", "label.new-location": "New Location", "label.new-num-packs": "New number of packs", "label.new-pack-qty": "New Pack Qty", diff --git a/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx b/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx index 92b9100776..d016f0ab1e 100644 --- a/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx +++ b/client/packages/requisitions/src/RequestRequisition/ListView/CreateRequisitionModal.tsx @@ -76,7 +76,7 @@ export const CreateRequisitionModal: FC = ({ height={700} width={700} slideAnimation={false} - title={t('label.new-requisition')} + title={t('label.new-internal-order')} > From 05f793e57d82612eb5f4b00bc0e8b8cae97f7ace Mon Sep 17 00:00:00 2001 From: roxy-dao Date: Wed, 30 Oct 2024 08:32:38 +1300 Subject: [PATCH 18/18] Update schema --- client/packages/common/src/types/schema.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/packages/common/src/types/schema.ts b/client/packages/common/src/types/schema.ts index 78d115f38c..00934f8f3d 100644 --- a/client/packages/common/src/types/schema.ts +++ b/client/packages/common/src/types/schema.ts @@ -1187,6 +1187,7 @@ export type CustomerReturnLineInput = { expiryDate?: InputMaybe; id: Scalars['String']['input']; itemId: Scalars['String']['input']; + itemVariantId?: InputMaybe; note?: InputMaybe; numberOfPacksReturned: Scalars['Float']['input']; packSize: Scalars['Float']['input']; @@ -2522,6 +2523,7 @@ export type InsertInboundShipmentLineInput = { id: Scalars['String']['input']; invoiceId: Scalars['String']['input']; itemId: Scalars['String']['input']; + itemVariantId?: InputMaybe; location?: InputMaybe; numberOfPacks: Scalars['Float']['input']; packSize: Scalars['Float']['input']; @@ -2970,6 +2972,7 @@ export type InsertStockLineInput = { id: Scalars['String']['input']; inventoryAdjustmentReasonId?: InputMaybe; itemId: Scalars['String']['input']; + itemVariantId?: InputMaybe; location?: InputMaybe; numberOfPacks: Scalars['Float']['input']; onHold: Scalars['Boolean']['input']; @@ -3580,11 +3583,10 @@ export type ItemVariantMutationsUpsertItemVariantArgs = { export type ItemVariantNode = { __typename: 'ItemVariantNode'; coldStorageTypeId?: Maybe; - dosesPerUnit?: Maybe; + dosesPerUnit?: Maybe; id: Scalars['String']['output']; manufacturer?: Maybe; manufacturerId?: Maybe; - manufacturerName?: Maybe; name: Scalars['String']['output']; packagingVariants: Array; }; @@ -7696,6 +7698,7 @@ export type UpdateInboundShipmentLineInput = { expiryDate?: InputMaybe; id: Scalars['String']['input']; itemId?: InputMaybe; + itemVariantId?: InputMaybe; location?: InputMaybe; numberOfPacks?: InputMaybe; packSize?: InputMaybe;