diff --git a/packages/shared/graphql/mutation/response.ts b/packages/shared/graphql/mutation/response.ts index 0cfe82ab..b7f6bf0e 100644 --- a/packages/shared/graphql/mutation/response.ts +++ b/packages/shared/graphql/mutation/response.ts @@ -1,8 +1,20 @@ import { gql } from '@apollo/client'; export const CREATE_RESPONSE = gql` - mutation MyMutation($formId: ID!, $parentId: ID, $values: [FieldValue2Input], $options: AWSJSON) { - createResponse(formId: $formId, parentId: $parentId, values: $values, options: $options) { + mutation MyMutation( + $formId: ID! + $parentId: ID + $responseId: ID + $values: [FieldValue2Input] + $options: AWSJSON + ) { + createResponse( + formId: $formId + parentId: $parentId + responseId: $responseId + values: $values + options: $options + ) { _id formId count @@ -10,6 +22,7 @@ export const CREATE_RESPONSE = gql` _id title } + responseId values { _id field @@ -79,18 +92,6 @@ export const UPDATE_RESPONSE = gql` } `; -export const UPDATE_RESPONSE_PARENTID = gql` - mutation MyMutation($_id: ID!, $parentId: [ID]) { - updateResponse(_id: $_id, parentId: $parentId) { - _id - parentId { - _id - title - } - } - } -`; - export const DELETE_RESPONSE = gql` mutation MyMutation($_id: ID!) { deleteResponse(_id: $_id) diff --git a/packages/shared/graphql/query/response.ts b/packages/shared/graphql/query/response.ts index e6fc8cdd..1e3ae0dc 100644 --- a/packages/shared/graphql/query/response.ts +++ b/packages/shared/graphql/query/response.ts @@ -10,6 +10,7 @@ export const GET_RESPONSE = gql` _id title } + responseId values { _id field @@ -56,6 +57,7 @@ export const GET_RESPONSE_BY_COUNT = gql` _id title } + responseId values { _id field @@ -96,6 +98,7 @@ export const GET_RESPONSES = gql` query MyQuery( $formId: ID! $parentId: ID + $responseId: ID $page: Int $limit: Int $search: String @@ -105,6 +108,7 @@ export const GET_RESPONSES = gql` getResponses( formId: $formId parentId: $parentId + responseId: $responseId page: $page limit: $limit search: $search @@ -120,6 +124,7 @@ export const GET_RESPONSES = gql` _id title } + responseId values { _id field @@ -172,6 +177,7 @@ export const GET_MY_RESPONSES = gql` _id title } + responseId values { _id field diff --git a/packages/shared/graphql/subscription/response.ts b/packages/shared/graphql/subscription/response.ts index 3aafe1e1..9bf80afb 100644 --- a/packages/shared/graphql/subscription/response.ts +++ b/packages/shared/graphql/subscription/response.ts @@ -10,6 +10,7 @@ export const RESPONSE_SUB = gql` _id title } + responseId values { _id field diff --git a/packages/shared/hooks/list/listItems.ts b/packages/shared/hooks/list/listItems.ts index 623dcbf5..e1a507bd 100644 --- a/packages/shared/hooks/list/listItems.ts +++ b/packages/shared/hooks/list/listItems.ts @@ -45,6 +45,18 @@ export function useGetListItemById(_id) { return { data }; } +export async function getListItem(_id) { + try { + const response = await apolloClient.query({ + query: GET_LIST_ITEM_BY_ID, + variables: { _id }, + }); + return response; + } catch (e) { + console.log(e); + } +} + export function useGetListItemsByType({ types = [] }: any) { const [state, setState] = useState({ search: '', diff --git a/packages/shared/hooks/response/createUpdateResponse.ts b/packages/shared/hooks/response/createUpdateResponse.ts index 340d7556..deaf1448 100644 --- a/packages/shared/hooks/response/createUpdateResponse.ts +++ b/packages/shared/hooks/response/createUpdateResponse.ts @@ -20,7 +20,7 @@ export const getValues = (values, fields) => { return newValues; }; -export function useCreateUpdateResponse({ onAlert }: IHooksProps, parentId) { +export function useCreateUpdateResponse({ onAlert }: IHooksProps, parentId, responseId?: string) { const [createMutation, { loading: createLoading }] = useMutation(CREATE_RESPONSE); const [updateMutation, { loading: updateLoading }] = useMutation(UPDATE_RESPONSE); @@ -30,8 +30,9 @@ export function useCreateUpdateResponse({ onAlert }: IHooksProps, parentId) { const values = getValues(payload.values, fields); payload = { ...payload, - parentId, values: values.map((m) => JSON.parse(JSON.stringify(m), omitTypename)), + parentId, + responseId, }; let response = null; if (edit) { diff --git a/packages/shared/hooks/response/createUpdateResponseParent.ts b/packages/shared/hooks/response/createUpdateResponseParent.ts deleted file mode 100644 index 0f592a9d..00000000 --- a/packages/shared/hooks/response/createUpdateResponseParent.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { useMutation } from '@apollo/client'; -import { UPDATE_RESPONSE_PARENTID } from '../../graphql/mutation/response'; -import { IHooksProps } from '../../types/common'; -import { omitTypename } from '../../utils/omitTypename'; - -export function useCreateUpdateResponseParent({ onAlert }: IHooksProps, parentId) { - const [updateParentMutation, { loading: updateParentLoading }] = useMutation( - UPDATE_RESPONSE_PARENTID, - ); - - const handleCreateUpdateResponseParent = async (tPayload) => { - try { - let payload = { ...tPayload }; - payload = { - ...payload, - parentId: [parentId], - }; - let response = null; - - response = await updateParentMutation({ variables: payload }); - - response = response?.data?.updateParentResponse; - - return response; - } catch (error) { - console.log(error); - onAlert('Error', error.message); - } - }; - return { handleCreateUpdateResponseParent, updateParentLoading }; -} diff --git a/packages/shared/hooks/response/getResponse.ts b/packages/shared/hooks/response/getResponse.ts index b1cd20ab..69b73a31 100644 --- a/packages/shared/hooks/response/getResponse.ts +++ b/packages/shared/hooks/response/getResponse.ts @@ -18,6 +18,7 @@ export function useGetResponses( parentId: string = null, formField = null, onlyMy = false, + responseId: string = null, ) { const [subsribed, setSubsribed] = useState(false); const [state, setState] = useState({ @@ -27,7 +28,7 @@ export function useGetResponses( }); const { data, error, loading, subscribeToMore, refetch } = useQuery(GET_RESPONSES, { - variables: { ...state, formId, parentId, onlyMy }, + variables: { ...state, formId, parentId, responseId, onlyMy }, fetchPolicy: 'cache-and-network', }); diff --git a/packages/shared/hooks/response/index.ts b/packages/shared/hooks/response/index.ts index c26223b1..e036fbe5 100644 --- a/packages/shared/hooks/response/index.ts +++ b/packages/shared/hooks/response/index.ts @@ -1,6 +1,5 @@ export { useGetResponse, useGetResponses, useGetResponseByCount } from './getResponse'; export { useCreateUpdateResponse } from './createUpdateResponse'; -export { useCreateUpdateResponseParent } from './createUpdateResponseParent'; export { useDeleteResponse } from './deleteResponse'; export { useGetMyResponses } from './getMyResponses'; export { useCreateBulkResponse } from './createBulkResponse'; diff --git a/packages/web/src/components/form2/FormFieldsValue.tsx b/packages/web/src/components/form2/FormFieldsValue.tsx index 46ae6712..b2549d38 100644 --- a/packages/web/src/components/form2/FormFieldsValue.tsx +++ b/packages/web/src/components/form2/FormFieldsValue.tsx @@ -24,6 +24,7 @@ interface IProps { handleValueChange: any; authorized: boolean; pageId?: string; + responseId?: string; layouts: any; disableGrid?: boolean; onLayoutChange?: (layouts: any) => void; @@ -43,6 +44,7 @@ export default function FormFieldsValue({ handleValueChange, authorized, pageId, + responseId, layouts = {}, disableGrid = true, onLayoutChange, @@ -94,6 +96,7 @@ export default function FormFieldsValue({ void; setResponded?: () => void; isPageOwner?: boolean; @@ -66,6 +64,7 @@ const initialState = { export default function FormViewWrapper({ form, parentId, + responseId, createCallback, setResponded, layouts, @@ -74,16 +73,18 @@ export default function FormViewWrapper({ const { handleCreateUpdateResponse, createLoading } = useCreateUpdateResponse( { onAlert }, parentId, + responseId, ); - // const { handleCreateUpdateResponseParent, updateParentLoading } = useCreateUpdateResponseParent( - // { onAlert }, - // parentId, - // ); - const showOnlyMyResponses = !isPageOwner && form?.settings?.onlyMyResponses; - const { data, error, refetch } = useGetResponses(form?._id, parentId, null, showOnlyMyResponses); + const { data, error, refetch } = useGetResponses( + form?._id, + parentId, + null, + showOnlyMyResponses, + responseId, + ); const [state, setState] = useState(initialState); const authenticated = useSelector(({ auth }: any) => auth.authenticated); const [showOverlayResult, setShowOverlayResult] = useState(true); @@ -282,6 +283,7 @@ export default function FormViewWrapper({ layouts={layouts} form={form} parentId={parentId} + responseId={responseId} showOnlyMyResponses={showOnlyMyResponses} /> )} diff --git a/packages/web/src/components/form2/FormViewWrapper.tsx b/packages/web/src/components/form2/FormViewWrapper.tsx index 69c08b38..7caed21b 100644 --- a/packages/web/src/components/form2/FormViewWrapper.tsx +++ b/packages/web/src/components/form2/FormViewWrapper.tsx @@ -6,6 +6,7 @@ import NotFound from '../common/NotFound'; interface IProps { formId: string; parentId?: string; + responseId?: string; createCallback?: (response: any) => void; customSettings?: any; isPageOwner?: boolean; @@ -15,6 +16,7 @@ interface IProps { export default function FormViewWrapper({ formId, parentId, + responseId, createCallback, customSettings, isPageOwner, @@ -34,6 +36,7 @@ export default function FormViewWrapper({ ); } @@ -69,6 +74,7 @@ interface IProps2 { hideBreadcrumbs?: boolean; hideNavigation?: boolean; hideAuthor?: boolean; + hideWorkflow?: boolean; } export function ResponseChild2({ @@ -77,6 +83,7 @@ export function ResponseChild2({ hideBreadcrumbs, hideNavigation, hideAuthor, + hideWorkflow, }: IProps2) { const { data, error, loading } = useGetForm(formId); @@ -95,6 +102,7 @@ export function ResponseChild2({ hideBreadcrumbs={hideBreadcrumbs} hideNavigation={hideNavigation} hideAuthor={hideAuthor} + hideWorkflow={hideWorkflow} /> ); } @@ -105,6 +113,7 @@ interface IProps3 { hideBreadcrumbs?: boolean; hideNavigation?: boolean; hideAuthor?: boolean; + hideWorkflow?: boolean; } export function ResponseChild3({ @@ -113,8 +122,9 @@ export function ResponseChild3({ hideBreadcrumbs, hideNavigation, hideAuthor, + hideWorkflow, }: IProps3) { - const [state, setState] = useState({ showMenu: null, edit: false }); + const [state, setState] = useState({ showMenu: null, edit: false, showBackdrop: false }); const { handleDelete, deleteLoading } = useDeleteResponse({ onAlert }); const authorized = useAuthorization([response?.createdBy?._id, form?.createdBy?._id], true); const authorized2 = useAuthorization([form?.createdBy?._id], true); @@ -123,12 +133,23 @@ export function ResponseChild3({ _id: JSON.parse(response?.options)?.customSectionId || form._id, }); const { editMode } = useSelector(({ setting }: any) => setting); + const router = useRouter(); + + const redirectToPage = async (_id) => { + setState({ ...state, showBackdrop: true }); + const page = await getListItem(_id); + if (page?.data?.getListItem?.types[0]?.slug && page?.data?.getListItem?.slug) { + router.push(`/${page?.data?.getListItem?.types[0]?.slug}/${page?.data?.getListItem?.slug}`); + } else { + setState({ ...state, showBackdrop: false }); + } + }; const hideLeftNavigation = !(hideAuthor || hideNavigation || hideBreadcrumbs); return ( <> - + {!hideBreadcrumbs ? (
{!hideNavigation && ( @@ -217,6 +238,9 @@ export function ResponseChild3({ )} + {response?.responseId && section?.options?.showRelation && ( + + )} - {section?.fields?.length > 0 && ( + {!hideWorkflow && section?.fields?.length > 0 && ( )}
{!hideAuthor && ( - + <> + + {`by ${response?.createdBy ? response?.createdBy?.name : 'Unauthorised user'} `} + {response?.parentId?.title && ( + redirectToPage(response?.parentId?._id)} + > + {`${response?.parentId?.title} page`} + + )} + + + {`created at ${moment(response?.createdAt).format('l')} ${moment( + response?.createdAt, + ).format('LT')}`} + + )} {form?.fields?.map((field, index) => { return ( diff --git a/packages/web/src/components/response/ResponseLayout.tsx b/packages/web/src/components/response/ResponseLayout.tsx index 80fd1d20..eccd446e 100644 --- a/packages/web/src/components/response/ResponseLayout.tsx +++ b/packages/web/src/components/response/ResponseLayout.tsx @@ -43,6 +43,22 @@ export default function ResponseLayout({ label="Show sections below response" /> + + { + onSectionChange({ + options: { ...section.options, showRelation: e.target.checked }, + }); + }} + /> + } + label="Show relation response" + /> +