From 90955638c5e3671c72996fe6831b4bb90bd666dc Mon Sep 17 00:00:00 2001
From: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com>
Date: Tue, 22 Mar 2022 15:13:17 +0600
Subject: [PATCH] Vacancy search fix (#1192)

Signed-off-by: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com>
---
 packages/core/src/storage.ts                   |  7 ++++---
 .../src/components/Vacancies.svelte            | 18 +++++++++---------
 2 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/packages/core/src/storage.ts b/packages/core/src/storage.ts
index f91bff1259..d36c7d016a 100644
--- a/packages/core/src/storage.ts
+++ b/packages/core/src/storage.ts
@@ -49,7 +49,8 @@ export type DocumentQuery<T extends Doc> = {
 /**
  * @public
  */
-export type ToClassRefT<T extends object, P extends keyof T> = T[P] extends Ref<infer X> | null ? Ref<Class<X>> | [Ref<Class<X>>, Lookup<X>] : never
+export type ToClassRefT<T extends object, P extends keyof T> = T[P] extends Ref<infer X> | null | undefined ? Ref<Class<X>> | [Ref<Class<X>>, Lookup<X>] : never
+
 /**
  * @public
  */
@@ -65,7 +66,7 @@ export type RefKeys<T extends Doc> = Pick<T, KeysByType<T, NullableRef>>
 /**
  * @public
  */
-export type NullableRef = Ref<Doc> | null
+export type NullableRef = Ref<Doc> | null | undefined
 
 /**
  * @public
@@ -123,7 +124,7 @@ export enum SortingOrder {
  * @public
  */
 export type RefsAsDocs<T> = {
-  [P in keyof T]: T[P] extends Ref<infer X> | null ? (T extends X ? X : X | WithLookup<X>) : AttachedDoc[]
+  [P in keyof T]: T[P] extends Ref<infer X> | null | undefined ? (T extends X ? X : X | WithLookup<X>) : AttachedDoc[]
 }
 
 /**
diff --git a/plugins/recruit-resources/src/components/Vacancies.svelte b/plugins/recruit-resources/src/components/Vacancies.svelte
index 806fae3cc8..bfbfc434a4 100644
--- a/plugins/recruit-resources/src/components/Vacancies.svelte
+++ b/plugins/recruit-resources/src/components/Vacancies.svelte
@@ -14,7 +14,7 @@
 -->
 <script lang="ts">
   import contact from '@anticrm/contact'
-  import core, { Doc, DocumentQuery, Lookup, Ref } from '@anticrm/core'
+  import core, { Doc, DocumentQuery, Lookup, Ref, WithLookup } from '@anticrm/core'
   import { createQuery } from '@anticrm/presentation'
   import { Applicant, Vacancy } from '@anticrm/recruit'
   import { Button, getCurrentLocation, Icon, Label, navigate, Scroller, showPopup, IconAdd } from '@anticrm/ui'
@@ -35,16 +35,20 @@
   let resultQuery: DocumentQuery<Doc> = {}
   let vacancyQuery: DocumentQuery<Doc> = {}
 
-  let vacancies: Vacancy[] = []
+  let vacancies: WithLookup<Vacancy>[] = []
   const query = createQuery()
   let appQuery = false
 
+  const lookup: Lookup<Vacancy> = {
+    company: contact.class.Organization
+  }
+
   $: query.query(recruit.class.Vacancy, { archived: false }, (res) => {
     vacancies = res
-  })
+  }, { lookup })
 
   function lowerIncludes (a: string | undefined, b: string): boolean {
-    return (a ?? '').toLowerCase().includes(b)
+    return (a ?? '').toLowerCase().includes(b.toLowerCase())
   }
 
   $: if (vacancies.length > 0 && !appQuery) {
@@ -55,7 +59,7 @@
             (it) =>
               lowerIncludes(it.name, vquery) ||
               lowerIncludes(it.description, vquery) ||
-              lowerIncludes(it.company, vquery) ||
+              lowerIncludes(it.$lookup?.company?.name, vquery) ||
               (applications?.get(it._id) ?? 0) > 0
           )
           .map((it) => it._id)
@@ -89,10 +93,6 @@
     )
   }
 
-  const lookup = {
-    company: contact.class.Organization
-  } as Lookup<Doc>
-
   function showCreateDialog (ev: Event) {
     showPopup(CreateVacancy, { space: recruit.space.CandidatesPublic }, ev.target as HTMLElement)
   }