Browse Source

Fixes: Mobile - User: Support updating secondary organizations.

Mantas Masalskis 2 years ago
parent
commit
2e003736d0

+ 1 - 6
app/frontend/apps/mobile/components/CommonDialogObjectForm/CommonDialogObjectForm.vue

@@ -34,7 +34,6 @@ export interface Props {
   errorNotificationMessage?: string
   mutation: OperationMutationFunction
   schema: FormSchemaNode[]
-  keyMap?: Record<string, string | false>
 }
 
 const props = defineProps<Props>()
@@ -95,11 +94,7 @@ const changedFormField = (
 
 const saveObject = async (formData: FormData) => {
   const { internalObjectAttributeValues, additionalObjectAttributeValues } =
-    useObjectAttributeFormData(
-      objectAttributesLookup.value,
-      formData,
-      props.keyMap,
-    )
+    useObjectAttributeFormData(objectAttributesLookup.value, formData)
 
   const result = await updateMutation.send({
     id: props.object?.id,

+ 12 - 6
app/frontend/apps/mobile/entities/user/composables/useUserDetail.ts

@@ -13,6 +13,7 @@ import { useUserLazyQuery } from '../graphql/queries/user.api'
 
 export const useUserDetail = () => {
   const internalId = ref(0)
+  const fetchSecondaryOrganizationsCount = ref<Maybe<number>>(3)
   const { createQueryErrorHandler } = useErrorHandler()
 
   const userQuery = new QueryHandler(
@@ -41,10 +42,14 @@ export const useUserDetail = () => {
   }
 
   const loadAllSecondaryOrganizations = () => {
-    userQuery.refetch({
-      userInternalId: internalId.value,
-      secondaryOrganizationsCount: null,
-    })
+    userQuery
+      .refetch({
+        userInternalId: internalId.value,
+        secondaryOrganizationsCount: null,
+      })
+      .then(() => {
+        fetchSecondaryOrganizationsCount.value = null
+      })
   }
 
   const userResult = userQuery.result()
@@ -66,12 +71,13 @@ export const useUserDetail = () => {
       userQuery.subscribeToMore<
         UserUpdatesSubscriptionVariables,
         UserUpdatesSubscription
-      >({
+      >(() => ({
         document: UserUpdatesDocument,
         variables: {
           userId,
+          secondaryOrganizationsCount: fetchSecondaryOrganizationsCount.value,
         },
-      })
+      }))
     },
     { immediate: true },
   )

+ 0 - 4
app/frontend/apps/mobile/entities/user/composables/useUserEdit.ts

@@ -56,10 +56,6 @@ export const useUserEdit = () => {
       formChangeFields,
       formUpdaterId: EnumFormUpdaterId.FormUpdaterUpdaterUserEdit,
       errorNotificationMessage: __('User could not be updated.'),
-      keyMap: {
-        // TODO save secondary organizations
-        organization_ids: false,
-      },
     })
   }
 

+ 0 - 11
app/frontend/apps/mobile/entities/user/graphql/queries/user.api.ts

@@ -10,17 +10,6 @@ export const UserDocument = gql`
     query user($userId: ID, $userInternalId: Int, $secondaryOrganizationsCount: Int) {
   user(user: {userId: $userId, userInternalId: $userInternalId}) {
     ...userDetailAttributes
-    secondaryOrganizations(first: $secondaryOrganizationsCount) {
-      edges {
-        node {
-          id
-          internalId
-          active
-          name
-        }
-      }
-      totalCount
-    }
     policy {
       update
     }

+ 0 - 11
app/frontend/apps/mobile/entities/user/graphql/queries/user.graphql

@@ -5,17 +5,6 @@ query user(
 ) {
   user(user: { userId: $userId, userInternalId: $userInternalId }) {
     ...userDetailAttributes
-    secondaryOrganizations(first: $secondaryOrganizationsCount) {
-      edges {
-        node {
-          id
-          internalId
-          active
-          name
-        }
-      }
-      totalCount
-    }
     policy {
       update
     }

+ 13 - 7
app/frontend/shared/entities/object-attributes/composables/useObjectAttributeFormData.ts

@@ -7,11 +7,11 @@ import type {
 } from '@shared/graphql/types'
 import { convertToGraphQLId, isGraphQLId } from '@shared/graphql/utils'
 import { camelize, toClassName } from '@shared/utils/formatter'
+import type { Primitive } from 'type-fest'
 
 export const useObjectAttributeFormData = (
   objectAttributes: Map<string, ObjectManagerFrontendAttribute>,
   formData: FormValues,
-  keyMap: Record<string, string | false> = {},
 ) => {
   const internalObjectAttributeValues: Record<string, FormFieldValue> = {}
   const additionalObjectAttributeValues: ObjectAttributeValueInput[] = []
@@ -42,12 +42,18 @@ export const useObjectAttributeFormData = (
     if (!objectAttribute || value === undefined) return
 
     if (objectAttribute.isInternal) {
-      const name = keyMap[fieldName] ?? camelize(fieldName)
-      if (name === false) return
-      internalObjectAttributeValues[name] = ensureRelationId(
-        objectAttribute,
-        value,
-      )
+      const name = camelize(fieldName)
+
+      let newValue: FormFieldValue
+      if (Array.isArray(value)) {
+        newValue = value.map((elem) => {
+          return ensureRelationId(objectAttribute, elem) as Primitive
+        })
+      } else {
+        newValue = ensureRelationId(objectAttribute, value)
+      }
+
+      internalObjectAttributeValues[name] = newValue
     } else {
       additionalObjectAttributeValues.push({
         name: objectAttribute.name,

+ 11 - 0
app/frontend/shared/graphql/fragments/userDetailAttributes.api.ts

@@ -32,6 +32,17 @@ export const UserDetailAttributesFragmentDoc = gql`
       closed
     }
   }
+  secondaryOrganizations(first: $secondaryOrganizationsCount) {
+    edges {
+      node {
+        id
+        internalId
+        active
+        name
+      }
+    }
+    totalCount
+  }
   hasSecondaryOrganizations
   ticketsCount {
     open

+ 11 - 0
app/frontend/shared/graphql/fragments/userDetailAttributes.graphql

@@ -27,6 +27,17 @@ fragment userDetailAttributes on User {
       closed
     }
   }
+  secondaryOrganizations(first: $secondaryOrganizationsCount) {
+    edges {
+      node {
+        id
+        internalId
+        active
+        name
+      }
+    }
+    totalCount
+  }
   hasSecondaryOrganizations
   ticketsCount {
     open

+ 1 - 1
app/frontend/shared/graphql/subscriptions/userUpdates.api.ts

@@ -7,7 +7,7 @@ import * as VueCompositionApi from 'vue';
 export type ReactiveFunction<TParam> = () => TParam;
 
 export const UserUpdatesDocument = gql`
-    subscription userUpdates($userId: ID!) {
+    subscription userUpdates($userId: ID!, $secondaryOrganizationsCount: Int) {
   userUpdates(userId: $userId) {
     user {
       ...userDetailAttributes

+ 1 - 1
app/frontend/shared/graphql/subscriptions/userUpdates.graphql

@@ -1,4 +1,4 @@
-subscription userUpdates($userId: ID!) {
+subscription userUpdates($userId: ID!, $secondaryOrganizationsCount: Int) {
   userUpdates(userId: $userId) {
     user {
       ...userDetailAttributes

Some files were not shown because too many files changed in this diff