{"version":3,"file":"index.179f6861.js","sources":["../../../../stores/candidates/state.ts","../../../../services/admin/candidates/index.ts","../../../../services/admin/candidate/index.ts","../../../../stores/candidates/actions.ts","../../../../resolvers/candidate/index.ts","../../../../stores/candidates/getters.ts","../../../../stores/candidates/index.ts"],"sourcesContent":["import type { ResponseCounts } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidates/GET';\nimport type {\n Candidate,\n CandidateItems,\n CandidateStats,\n SkillsCategories\n} from '@emotioncod/cm-definitions/lib/Candidate';\nimport type { ClientPagination } from '~/types/bo-types';\n\nexport interface CandidateState {\n pagination: ClientPagination;\n counts: ResponseCounts;\n candidates: Candidate[];\n candidate: Candidate | null;\n cachedResult: number;\n /**\n * This is a client side search.\n * It's used to get all candidates list from cache and filter them from UI.\n * TODO: remove this when we have a server side search.\n */\n isSearched: boolean;\n skillsCategories: SkillsCategories[];\n candidateItems: CandidateItems | null;\n candidateStats: CandidateStats | null;\n}\n\nconst InitialState: CandidateState = {\n counts: {\n candidates: 1245,\n candidatesWithApplication: 1,\n candidatesWithMatch: 8,\n matches: 50,\n opportunities: 1\n },\n candidates: [],\n candidate: null,\n pagination: {\n currentPage: 0,\n total: 1,\n perPage: 30\n },\n cachedResult: 0,\n isSearched: false,\n skillsCategories: [],\n candidateItems: null,\n candidateStats: null\n};\n\nexport const useCandidateState = defineStore('candidates.state', () => {\n const counts = ref(InitialState.counts);\n const candidates = ref(InitialState.candidates);\n const pagination = ref(InitialState.pagination);\n const cachedResult = ref(\n InitialState.cachedResult\n );\n const isSearched = ref(InitialState.isSearched);\n const candidate = ref(InitialState.candidate);\n const skillsCategories = ref();\n const candidateItems = ref(\n InitialState.candidateItems\n );\n const candidateStats = ref(\n InitialState.candidateStats\n );\n\n return {\n counts,\n candidates,\n pagination,\n cachedResult,\n isSearched,\n candidate,\n skillsCategories,\n candidateItems,\n candidateStats\n };\n});\n","import type { ResponseBody } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidates/GET';\nimport { GET_CANDIDATES_REST } from '~/constants';\nimport { execute } from '~/services/utils';\n\n/**\n * @name getAllCandidates\n * @description Get all Candidates\n */\nconst getCandidates = async (config?: {\n perPage?: number;\n page?: number;\n search?: string;\n}): Promise => {\n const apiClient = useNuxtApp().$axiosInstance;\n\n return await execute(\n apiClient.get(\n GET_CANDIDATES_REST +\n `${config?.search ? `?search=${config?.search}` : ''}${\n config?.perPage ? `?per_page=${config?.perPage}` : ''\n }${config?.page ? `&page=${config?.page}` : ''}`\n )\n );\n};\n\nexport default {\n getCandidates\n};\n","import type { ResponseBody as ResponseBodyCandidate } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidate/PUT';\nimport type { ResponseBody as ResponseBodyDelete } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidate/DELETE';\nimport type { ResponseBody } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidate/GET';\nimport type { ResponseBody as ResponseBodyCandidateItem } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidate/PUT/Item';\nimport type { ResponseBody as ResponseBodyComment } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidate/POST/Comment';\nimport type { ResponseBody as ResponseBodyCandidateStats } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidate/Stats/GET';\n\nimport type {\n Candidate,\n CandidateEvents,\n CandidateItemToUpdate\n} from '@emotioncod/cm-definitions/lib/Candidate';\nimport { GET_CANDIDATE_REST } from '~/constants';\nimport { execute } from '~/services/utils';\n\n/**\n * @name getCandidate\n * @description Details of a Candidate\n */\nconst getCandidate = async (\n uid: string\n): Promise => {\n const apiClient = useNuxtApp().$axiosInstance;\n\n return await execute(\n apiClient.get(GET_CANDIDATE_REST + `/${uid}`)\n );\n};\n\n/**\n * @name getCandidateJobsStats\n * @description Stats of a Candidate\n */\nconst getCandidateStats = async (\n uid: string\n): Promise => {\n const apiClient = useNuxtApp().$axiosInstance;\n\n return await execute(\n apiClient.get(GET_CANDIDATE_REST + `/${uid}` + `/stats`)\n );\n};\n\nconst updateCandidate = async (\n userId: string,\n candidate: Partial\n): Promise => {\n const apiClient = useNuxtApp().$axiosInstance;\n\n return await execute(\n apiClient.put(GET_CANDIDATE_REST + `/${userId}`, candidate)\n );\n};\n\nconst updateCandidateItem = async (\n userId: string,\n item: CandidateItemToUpdate\n): Promise => {\n const apiClient = useNuxtApp().$axiosInstance;\n\n return await execute(\n apiClient.put(GET_CANDIDATE_REST + `/${userId}/item`, item)\n );\n};\n\nconst deleteCandidate = async (\n id: string\n): Promise => {\n const apiClient = useNuxtApp().$axiosInstance;\n\n return await execute(\n apiClient.delete(GET_CANDIDATE_REST + `/${id}`)\n );\n};\n\nconst postComment = async (\n id: string,\n comment: Partial\n): Promise => {\n const apiClient = useNuxtApp().$axiosInstance;\n\n return await execute(\n apiClient.post(GET_CANDIDATE_REST + `/${id}/comment`, { comment })\n );\n};\n\nexport default {\n getCandidate,\n updateCandidate,\n updateCandidateItem,\n deleteCandidate,\n postComment,\n getCandidateStats\n};\n","import { storeToRefs } from 'pinia';\nimport type { ResponseBody } from '@emotioncod/cm-definitions/lib/ServiceLayer/Admin/Candidates/GET';\nimport type {\n Candidate,\n SkillsCategories,\n CandidateItems,\n CandidateItemToUpdate,\n CandidateEvents,\n CandidateStats\n} from '@emotioncod/cm-definitions/lib/Candidate';\nimport type { ResponsePagination } from '@emotioncod/cm-definitions';\nimport { useCandidateState } from '~/stores/candidates/state';\nimport type { CandidateState } from '~/stores/candidates/state';\nimport CandidatesServices from '~/services/admin/candidates';\nimport CandidateServices from '~/services/admin/candidate';\nimport TalentServices from '~/services/talent';\nimport { sessionTTL } from '~/constants';\n\nfunction isCandidateList(\n data: ResponsePagination | Candidate[]\n): data is Candidate[] {\n return Array.isArray(data);\n}\n\nexport const useCandidatesActions = defineStore('candidates.actions', () => {\n const { settings } = useSettings();\n const {\n candidates,\n pagination,\n counts,\n cachedResult,\n isSearched,\n candidate,\n skillsCategories,\n candidateItems,\n candidateStats\n } = storeToRefs(useCandidateState());\n\n const route = useRoute();\n const { push } = useRouter();\n\n const changePage = async (page: number): Promise => {\n await getCandidates(page);\n\n pagination.value.currentPage = page;\n\n push({\n path: route.path,\n query: {\n ...route.query,\n page: (page + 1).toString()\n }\n });\n };\n\n const updateCandidates = (\n c: ResponsePagination | Candidate[]\n ): void => {\n if (isCandidateList(c)) {\n candidates.value = c;\n pagination.value.currentPage = 0;\n pagination.value.total = 1;\n pagination.value.perPage = 30;\n return;\n }\n\n candidates.value = c.data;\n updatePagination(c);\n };\n\n const updatePagination = (p: ResponsePagination): void => {\n pagination.value.total = p.last_page - 1;\n pagination.value.perPage = Number(p.per_page);\n };\n\n const updateCounts = (c: CandidateState['counts']): void => {\n counts.value = c;\n };\n\n const updateCacheResult = (timestamp: number): void => {\n cachedResult.value = timestamp;\n };\n\n /**\n * @deprecated\n * The response of this call by the way is huge and LARAVEL falls apart\n */\n async function getAllCandidates(): Promise {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n const response = await CandidatesServices.getCandidates();\n\n if (response && Array.isArray(response.list)) {\n candidates.value = response.list;\n return response.list;\n }\n }\n\n /**\n * @description Get candidates list from API.\n * We have a \"withPage\" param to force update the pagination.\n * @param withPage\n * @param searchValue\n * @param isSearchServerSide\n */\n async function getCandidates(\n withPage?: number,\n searchValue?: string,\n isSearchServerSide?: boolean\n ): Promise {\n /**\n * This is a check to verify if a user is logged.\n */\n if (!settings.loggedIn) {\n return undefined;\n }\n\n /**\n * @name Searching by server\n * I add a flag at momento to turn on / off this function\n */\n if (isSearchServerSide && searchValue && !isSearched.value) {\n const response = await CandidatesServices.getCandidates({\n perPage: undefined,\n page: undefined,\n search: searchValue\n });\n\n if (response) {\n updateCandidates(response.list);\n }\n return;\n }\n\n /**\n * If we have a \"searchValue\", we need:\n * - to have all candidates list at first time;\n * - remove pagination (from UI);\n * - use the cache for other searches.\n */\n if (searchValue && !isSearched.value) {\n const allCandidates = await CandidatesServices.getCandidates();\n\n if (allCandidates) {\n const { list, counts } = allCandidates;\n\n if (Array.isArray(list)) {\n isSearched.value = true;\n\n /**\n * TODO: Remove this when we have the server side search\n */\n const filterList = list.filter((el) => {\n const rowValues = Object.values(el)\n .join(' ')\n .toLowerCase()\n .replace(/[^\\w\\s]/gi, '');\n\n return rowValues.includes(searchValue.toLowerCase());\n });\n\n updateCandidates(filterList);\n }\n\n if (counts) {\n updateCounts(counts);\n }\n }\n /**\n * Invalidate the cache.\n */\n updateCacheResult(0);\n return;\n }\n\n /**\n * @description CmPagination has a index array from 0, so we call \"page + 1\"\n */\n function getCurrentPage() {\n if (withPage === 0) return 1;\n\n if (withPage) {\n return withPage + 1;\n }\n\n if (pagination.value.currentPage) {\n return pagination.value.currentPage + 1;\n }\n\n return 1;\n }\n\n const currentPage = getCurrentPage();\n\n /**\n * TODO: Add searchValue to the request with some filters. (Maybe v1)\n * es: const search = searchValue ? `?search=${searchValue}` : '';\n * Actually, the searchValue is client side.\n */\n const allCandidates = await CandidatesServices.getCandidates({\n perPage: pagination.value.perPage,\n page: currentPage\n });\n\n if (allCandidates) {\n const { list, counts } = allCandidates;\n\n isSearched.value = false;\n updateCandidates(list);\n updateCounts(counts);\n updateCacheResult(Date.now());\n }\n }\n\n const getCandidate = async (id: string): Promise => {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n if (candidate && candidate.value?.id === id) {\n return candidate.value;\n }\n\n const response = await CandidateServices.getCandidate(id);\n\n if (response) {\n candidate.value = response;\n return response;\n }\n };\n\n const updateCandidatesArray = (index: number, candidate: Candidate) => {\n candidates.value[index] = candidate;\n };\n\n const updateCandidate = async (\n userId: string,\n candidateObj: Partial\n ): Promise => {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n const response = await CandidateServices.updateCandidate(\n userId,\n candidateObj\n );\n\n if (response) {\n candidate.value = response;\n return response;\n }\n };\n\n const updateCandidateItem = async (\n userId: string,\n item: CandidateItemToUpdate\n ): Promise => {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n const response = await CandidateServices.updateCandidateItem(userId, item);\n\n if (response) {\n candidate.value = response;\n return response;\n }\n };\n\n const getSkills = async (): Promise => {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n if (skillsCategories && skillsCategories.value) {\n return skillsCategories.value;\n }\n\n const response = await TalentServices.getSkillCategories();\n\n if (response) {\n skillsCategories.value = response;\n return response;\n }\n };\n\n const getCandidateItems = async (): Promise => {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n if (candidateItems && candidateItems.value) {\n return candidateItems.value;\n }\n\n const response = await TalentServices.getCandidateItems();\n\n if (response) {\n candidateItems.value = response;\n return response;\n }\n };\n\n const getCandidateJobsStats = async (\n id: string\n ): Promise => {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n const response = await CandidateServices.getCandidateStats(id);\n\n if (response) {\n candidateStats.value = response;\n return candidateStats.value;\n }\n };\n\n async function deleteCandidate(id: string) {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n const response = await CandidateServices.deleteCandidate(id);\n\n if (response === 'Candidate deleted') {\n candidate.value = null;\n return response;\n }\n }\n\n async function postComment(id: string, comment: Partial) {\n if (!settings.loggedIn) {\n return undefined;\n }\n\n const response = await CandidateServices.postComment(id, comment);\n\n if (response) {\n return response;\n }\n }\n\n return {\n changePage,\n getCandidates,\n getCandidate,\n getSkills,\n getCandidateItems,\n getCandidateJobsStats,\n updateCandidate,\n updateCandidateItem,\n deleteCandidate,\n updateCandidatesArray,\n postComment,\n getAllCandidates\n };\n});\n","import type { AccordionItem, SelectItem } from '@emotioncod/cm-design-system';\nimport type { StatCardData } from '@emotioncod/cm-design-system/dist/types/types';\nimport type {\n Candidate,\n CandidateEvents,\n CandidateFocus,\n CandidateItems,\n CandidateJobData,\n CandidateJobSoon,\n CandidateRemoteness,\n CandidateRole,\n IdealCompany,\n SkillsCategories,\n CandidateDesiredRole,\n IdealCompanyBase,\n CandidateStats\n} from '@emotioncod/cm-definitions/lib/Candidate';\nimport type {\n CompanyItems,\n KeyValuesIndustry\n} from '@emotioncod/cm-definitions/lib/Companies';\nimport type { JobRole } from '@emotioncod/cm-definitions/lib/Jobs';\nimport type { EventMatch, Match } from '@emotioncod/cm-definitions/lib/Matches';\nimport { Languages } from '@emotioncod/cm-definitions/lib/Jobs/const';\nimport { formatDate } from '~/utils';\nimport { EVENT_BY } from '~/config/validStatusMatch';\n\nexport const mapListNotes = (\n events: CandidateEvents[]\n): (Partial & { authorName: string; typeEvent: string })[] => {\n if (!events) return [];\n\n return events.map((event) => {\n const authorName = event.author?.name ? event.author.name : 'Unknown';\n\n return {\n id: event.id ? event.id : '',\n typeEvent: event.type,\n source: event.source,\n content: event.content ? event.content : '',\n date: event.date ? formatDate(event.date) : '',\n authorName,\n deleted_at: event?.deleted_at ? event.deleted_at : ''\n };\n });\n};\n\nexport const mapListNotesToMatch = (\n events: Partial[],\n jobPositionName: string,\n companyName?: string\n): (Partial & {\n authorName: string;\n typeEvent: string;\n jobPositionName: string;\n companyName?: string;\n})[] => {\n if (!events) return [];\n\n return events.map((event) => {\n const authorName = event.author?.name ? event.author.name : 'Unknown';\n\n /**\n * @see event.date?.$date?.$numberLong\n * This is a temporany solution\n * TODO: remove this when clean the data\n */\n return {\n id: event.id ? event.id : '',\n typeEvent: event.type ? event.type.toString() : '',\n source: event.source,\n content: event.content ? event.content : '',\n // @ts-ignore\n date: event.date?.$date?.$numberLong // @ts-ignore\n ? formatDate(event.date.$date.$numberLong, true)\n : event.date\n ? formatDate(event.date, false)\n : '',\n authorName,\n deleted_at: event.deleted_at ? event.deleted_at : '',\n jobPositionName,\n companyName\n };\n });\n};\n\nexport function candidateNoteResolve(\n userId: string,\n candidates: Candidate[],\n candidate: Candidate | null,\n matchId: string,\n matches: Match[]\n) {\n const match = matches.find((m) => m.id === matchId);\n\n const cand = candidates.find((c) => c.id === userId) || candidate;\n\n if (match) {\n return {\n fullName: `${match.candidate?.name} ${match.candidate?.surname}`,\n list: mapListNotesToMatch(\n match.events,\n match.jobPosition?.name || '',\n match.company?.name\n )\n };\n }\n\n if (cand) {\n return {\n fullName: `${cand.name} ${cand.surname}`,\n list: mapListNotes(cand.events)\n };\n }\n}\n\nexport function resolveCandidateStats(\n candidate: Candidate,\n t: (key: string, ...args: any[]) => string\n): StatCardData[] {\n if (!candidate) return [];\n return [\n {\n statName: t('candidates.details.stats.readyToWork'),\n iconName: 'mdiCalendarBlank',\n statValue: candidate.job.time_expectations?.name || '',\n iconColor: 'purple'\n },\n {\n statName: t('candidates.details.stats.desiredSalary'),\n iconName: 'mdiCurrencyEur',\n statValue: candidate.job.salary.min || 0,\n iconColor: 'blue'\n },\n {\n statName: t('candidates.details.stats.workPref'),\n iconName: 'mdiHomeAutomation',\n statValue:\n candidate.job.idealCompany.type?.map((pr) => pr.name).join(' / ') || '',\n iconColor: 'red'\n },\n {\n statName: t('common.seniority'),\n iconName: 'mdiSignalCellular3',\n statValue: candidate.job.levelOfExperience || 0,\n iconColor: 'green'\n }\n ];\n}\n\n/**\n * Resolve the Candidate statistics tab data\n * Todo: check data values on the Candidate object\n * @param stats\n * @param t\n */\nexport function resolveCandidateStatistics(\n stats: CandidateStats,\n t: (key: string, ...args: any[]) => string\n): StatCardData[] {\n if (!stats) return [];\n return [\n {\n statName: t('candidates.stats.totalMatches'),\n iconName: 'mdiBriefcaseCheck',\n statValue: stats.totalMatches || 0,\n iconColor: 'green'\n },\n {\n statName: t('candidates.stats.acceProposals'),\n iconName: 'mdiCheckCircle',\n statValue: stats.acceptedProposals || 0,\n iconColor: 'blue'\n },\n {\n statName: t('common.openSelection', 2),\n iconName: 'mdiTargetAccount',\n statValue: stats.openSelections || 0,\n iconColor: 'red'\n },\n {\n statName: t('candidates.stats.offers'),\n iconName: 'mdiSwapHorizontal',\n statValue: stats.offers || 0,\n iconColor: 'green'\n }\n ];\n}\n\nfunction resolveSkillIcon(\n skillId: number,\n techStackIconData: any\n): {\n icon: string;\n backgroundColorIcon: string;\n} {\n return {\n icon: techStackIconData(skillId).path,\n backgroundColorIcon: techStackIconData(skillId).color\n };\n}\n\nexport function resolveCandidateSkillsSelect(\n skillsCategories: SkillsCategories[],\n techStackIconData: any\n): SelectItem[] {\n if (!skillsCategories) return [];\n\n return skillsCategories.map((skill) => {\n const skillIcon = resolveSkillIcon(skill.id, techStackIconData);\n\n return {\n text: skill.name,\n value: skill.id,\n disabled: false,\n icon: skillIcon.icon ? skillIcon.icon : '/skill-default.svg',\n backgroundColorIcon: skillIcon.backgroundColorIcon\n ? skillIcon.backgroundColorIcon\n : 'rgb(0, 0, 0)'\n };\n });\n}\n\nexport function resolveSkillFromId(\n skillId: number,\n skillsCategories: SkillsCategories[]\n): SkillsCategories {\n if (!skillsCategories || !skillId) return { id: skillId, name: '' };\n\n const skillObj = skillsCategories.find((skill) => skill.id === skillId);\n\n return {\n name: skillObj?.name ? skillObj?.name : '',\n id: skillObj?.id ? skillObj?.id : skillId\n };\n}\n\nexport function resolveCategoryName(\n categoryId: string,\n skillsCategories: SkillsCategories[]\n): string {\n const category = skillsCategories.find(\n (skill) => skill.category_id === categoryId\n );\n\n return category?.category_name ? category.category_name : '';\n}\n\nexport function resolveSkillValue(\n skills: SkillsCategories[],\n skillsCategories: SkillsCategories[]\n): { id: number; text: string }[] {\n return skills.map((skill) => {\n const skillObj = skillsCategories.find((e) => e.id === skill.id);\n\n return {\n id: skillObj?.id ? skillObj?.id : skill.id,\n text: skillObj?.name ? skillObj?.name : ''\n };\n });\n}\n\nexport function resolveIdealCompanyValuesFromId(\n valueId: number,\n candidateFocus: CandidateFocus[]\n): { name: string; id: number } {\n if (!candidateFocus || !valueId) return { id: valueId, name: '' };\n\n const valObj = candidateFocus.find((val) => val.id === valueId);\n\n return {\n id: valObj?.id ? valObj.id : valueId,\n name: valObj?.name ? valObj.name : ''\n };\n}\n\nexport function resolveDesiredRoles(\n candidateItems: CandidateItems | CandidateJobData['desiredRoles']\n): SelectItem[] {\n if (!candidateItems) return [];\n\n if (Array.isArray(candidateItems)) {\n return (candidateItems as CandidateJobData['desiredRoles']).map((role) => {\n return {\n text: role.name,\n value: role.id\n };\n });\n } else {\n return (candidateItems as CandidateItems)?.candidateRole.map((role) => {\n return {\n text: role.name,\n value: role.id\n };\n });\n }\n}\n\nexport function resolveDesiredRolesValue(\n roles: CandidateDesiredRole[] | JobRole[],\n candidateRole: CandidateRole[]\n): { id: number; text: string }[] {\n function isDesiredRole(\n data: CandidateDesiredRole | JobRole\n ): data is CandidateDesiredRole {\n return typeof data === 'object' && !('seniority' in data);\n }\n\n return roles.map((role) => {\n const roleObj = candidateRole.find((e) => e.id === role.id);\n const seniority = isDesiredRole(role) ? role?.seniority : '';\n\n return {\n id: roleObj?.id ? roleObj?.id : role.id,\n text: roleObj?.name ? roleObj?.name : '',\n seniority\n };\n });\n}\n\nexport function resolveRemotenessItems(\n candidateItems: CandidateItems | IdealCompany['type']\n): SelectItem[] {\n if (!candidateItems) return [];\n\n if ('name' in candidateItems) {\n return [\n {\n text: (candidateItems as IdealCompany['type'])?.name || '',\n value: (candidateItems as IdealCompany['type'])?.id\n }\n ];\n } else {\n return (candidateItems as CandidateItems)?.candidateRemoteness?.map(\n (role) => {\n return {\n text: role.name,\n value: role.id\n };\n }\n );\n }\n}\n\nexport function resolveRemotenessValues(\n values: IdealCompany['type'] | SelectItem[],\n idealCompanyTypeArr: CandidateRemoteness[]\n): SelectItem[] {\n if (!values) return [];\n\n return values.map((val) => {\n const typeObject = idealCompanyTypeArr.find(\n (el) => el.id === (val?.value ? val?.value : val.id)\n );\n\n return {\n text: typeObject?.name || '',\n value: typeObject?.id || val.id\n };\n });\n}\n\nexport function resolveIdealCompanyTypeById(\n details: (number | { text: string; value: number })[],\n idealCompanyTypeArr: CandidateRemoteness[]\n): IdealCompany['type'] {\n if (!details) return [];\n\n return details.map((detail) => {\n const typeObject = idealCompanyTypeArr.find(\n (el) => el.id === (typeof detail === 'number' ? detail : detail.value)\n );\n\n return {\n id:\n typeObject?.id || (typeof detail === 'number' ? detail : detail.value),\n name: typeObject?.name || ''\n };\n });\n}\n\nexport function resolveCityItemsValues(item: CandidateItems) {\n return (item as CandidateItems)?.candidateJobCity.map((city) => {\n return {\n text: city.it,\n value: city.id\n };\n });\n}\n\nexport function resolveTimeExpectationsItems(\n candidateItems: CandidateItems\n): SelectItem[] | string {\n if (!candidateItems) return [];\n\n return (candidateItems as CandidateItems)?.candidateJobSoon.map((time) => {\n return {\n text: time.name,\n value: time.id\n };\n });\n}\n\nexport function resolveTimeExpectationsValue(\n values: CandidateJobData['time_expectations'],\n candidateJobSoon: CandidateJobSoon[]\n): { text: string; value: number } | undefined {\n if (!values || !candidateJobSoon) return;\n\n const valueObject = candidateJobSoon.find((el) => el.id === values.id);\n\n if (valueObject) {\n return {\n value: 1,\n text: 'test'\n };\n }\n}\n\nexport function resolveFocusItems(\n candidateItems: CandidateItems | IdealCompanyBase['values']\n): SelectItem[] {\n if (!candidateItems) return [];\n\n if ('values' in candidateItems) {\n return (candidateItems as IdealCompanyBase['values']).map((focus) => {\n return {\n text: focus.name,\n value: focus.id\n };\n });\n } else {\n return (candidateItems as CandidateItems)?.candidateFocus.map((focus) => {\n return {\n text: focus.name,\n value: focus.id\n };\n });\n }\n}\n\nexport function resolveChoiceFactorsItems(\n candidateItems: CandidateItems\n): SelectItem[] {\n if (!candidateItems) return [];\n\n return (candidateItems as CandidateItems)?.candidateFocus.map((focus) => {\n return {\n text: focus.name,\n value: focus.id\n };\n });\n}\n\nexport function resolveFocusItemsValues(\n values: IdealCompanyBase['values'],\n candidateFocus: CandidateFocus[]\n): { id: number; text: string }[] {\n return values.map((val) => {\n const valObj = candidateFocus.find((e) => e.id === val.id);\n\n return {\n id: val.id,\n text: val?.name ? val.name : valObj?.name ? valObj?.name : ''\n };\n });\n}\n\nexport function resolveDimensionItems(\n companyItems: CompanyItems | IdealCompany['dimension']\n): SelectItem[] | string {\n if (!companyItems) return [];\n\n if (\n companyItems &&\n Array.isArray((companyItems as CompanyItems).companySize)\n ) {\n return (companyItems as CompanyItems).companySize.map((size) => {\n return {\n text: size.name,\n value: size.id\n };\n });\n } else {\n return (companyItems as IdealCompany['dimension'])?.name || '';\n }\n}\n\nexport function resolveFocusCompanyItems(\n companyItems: CompanyItems | IdealCompany['focus']\n): SelectItem[] | string {\n if (!companyItems) return [];\n\n if (\n companyItems &&\n Array.isArray((companyItems as CompanyItems)?.companyFocus)\n ) {\n return (companyItems as CompanyItems)?.companyFocus?.map((focus) => {\n return {\n text: focus.name,\n value: focus.id\n };\n });\n } else {\n return (companyItems as { id: number; name: string }[])\n .map((focus) => focus.name)\n .join(', ');\n }\n}\n\n/**\n * @deprecated\n */\nexport function resolveDesiredSectors(\n keyValuesIndustry: KeyValuesIndustry\n): SelectItem[] {\n if (!keyValuesIndustry) return [];\n\n return keyValuesIndustry?.industry.map((industry) => {\n return {\n text: industry.name,\n value: industry.id\n };\n });\n}\n\nexport function resolveAccordionDesiredRoles(\n desiredRoles: CandidateJobData['desiredRoles']\n): AccordionItem[] {\n if (!desiredRoles) return [];\n\n return desiredRoles.map((role) => {\n return {\n title: role.name,\n subtitle: 'Experience',\n id: role.id,\n customContent: true\n };\n });\n}\n\nexport function resolveTimeExpectationsItemsById(\n id: number,\n candidateJobSoonArr: CandidateJobSoon[]\n): CandidateJobData['time_expectations'] {\n const typeObject = candidateJobSoonArr.find((el) => el.id === id);\n\n return {\n id: typeObject?.id || id,\n name: typeObject?.name || '',\n it: typeObject?.it || Languages.ITALIAN\n };\n}\n\nexport const isDeveloperEventBy = (event: Partial) => {\n return event.type && EVENT_BY.developer.includes(event.type.toLowerCase());\n};\n\nexport const isCompanyEventBy = (event: Partial) => {\n return event.type && EVENT_BY.company.includes(event.type.toLowerCase());\n};\n\nexport const resolveMatchEventsBy = (\n event: Partial\n): 'Developer' | 'Talent Partner' | 'Company' => {\n if (isDeveloperEventBy(event) || event.source === 'Developer')\n return 'Developer';\n\n if (isCompanyEventBy(event) || event.source === 'Company') return 'Company';\n\n return 'Talent Partner';\n};\n\nexport const resolveValidStatus = (status: boolean | undefined): string => {\n if (typeof status !== 'boolean') return '--';\n\n if (status) return 'Valid';\n\n return 'Invalid';\n};\n","import type { StatCardData } from '@emotioncod/cm-design-system/dist/types/types';\nimport { ComputedRef } from 'vue';\nimport type { Candidate } from '@emotioncod/cm-definitions/lib/Candidate';\nimport { EventType } from '@emotioncod/cm-definitions/lib/Matches/const';\nimport type { Match } from '@emotioncod/cm-definitions/lib/Matches';\nimport {\n resolveCandidatesStats,\n resolveCandidatesTableData\n} from '~/resolvers/candidates';\nimport { filterArrayByPage } from '~/utils';\nimport type {\n CandidateLogEvents,\n SortableCandidatesArr,\n ClientPagination\n} from '~/types/bo-types';\nimport { resolveCompanyNameFromId } from '~/resolvers/companies';\nimport { LogEvents } from '~/types/bo-types';\nimport { resolveMatchEventsBy } from '~/resolvers/candidate';\nimport { resolveEventType } from '~/resolvers/matches';\n\nexport const useCandidatesGetters = defineStore('candidates.getters', () => {\n const candidatesStore = useCandidates();\n const matchesStore = useMatches();\n\n const getCandidateStats = (\n t: (key: string, ...args: any[]) => string\n ): (StatCardData & { statDescription?: string })[] => {\n if (!candidatesStore.counts) return [];\n\n return resolveCandidatesStats(candidatesStore.counts, t);\n };\n\n /**\n * @name getResolveCandidates\n * @description Resolve candidates data for table\n */\n function getCandidatesResolvedTableData(\n t: (key: string, ...args: any[]) => string\n ): SortableCandidatesArr[] {\n if (!candidatesStore.candidates) return [];\n\n const validCandidates = candidatesStore.candidates.filter(\n (item) => !item?.deleted_at\n );\n\n const resolveCandidateDataTable = resolveCandidatesTableData(\n validCandidates,\n t\n );\n\n if (\n candidatesStore.pagination.perPage === undefined ||\n candidatesStore.pagination.currentPage === undefined\n ) {\n return filterArrayByPage(\n resolveCandidateDataTable,\n candidatesStore.pagination.currentPage,\n candidatesStore.pagination.perPage\n );\n }\n\n return resolveCandidateDataTable;\n }\n\n /**\n * @name resolveCandidatesPagination\n * @description Customize method for pagination action, if there is a search value we don't show the pagination\n * @param pagination\n * @param isSearched\n */\n const getPagination: ComputedRef = computed(\n () => {\n if (!candidatesStore.pagination) return undefined;\n\n return {\n ...candidatesStore.pagination,\n currentPage: candidatesStore.pagination.currentPage,\n total: candidatesStore.isSearched\n ? 0\n : candidatesStore.pagination.total,\n changePage: async (page: number) => {\n await candidatesStore.changePage(page);\n }\n };\n }\n );\n\n const getEventsLogFromCandidate = (): CandidateLogEvents => {\n const matches = matchesStore.matches;\n /**\n * @name logEventsMatches\n * @TODO add logic field \"by\" when we'll have restitution from companies\n */\n const logEventsMatches = matches.reduce(\n (accumulator: LogEvents[], match: Match) => {\n const jobsName = match.jobPosition?.name || '';\n const jobsId = match.jobPosition?.id || '';\n const companyId =\n match.jobPosition?.company_id || match.jobPosition?.company?.id || '';\n const companyName = resolveCompanyNameFromId(companyId) || '';\n const events = match.events;\n\n const logEvents =\n events?.map((event) => ({\n jobsName,\n jobsId,\n companyName,\n companyId,\n authorName: event.author?.name\n ? event.author?.name + ' ' + event.author?.surname\n : 'Unknown',\n content: event.content?.toString() || '',\n type: event.type ? resolveEventType(event.type) : '',\n source: event.source?.toString() || '',\n date: event.date?.toString() || '',\n by: resolveMatchEventsBy(event)\n })) || [];\n\n return [...accumulator, ...logEvents];\n },\n []\n );\n\n const matchNotes =\n logEventsMatches?.filter(\n (event: LogEvents) =>\n event.type.toLowerCase() === EventType.NOTE.toLowerCase() ||\n event.type.toLowerCase() === EventType.NOTE_ADDED.toLowerCase()\n ) || [];\n\n const matchEvents =\n logEventsMatches?.filter(\n (event: LogEvents) =>\n event.type.toLowerCase() !== EventType.NOTE.toLowerCase() &&\n event.type.toLowerCase() !== EventType.NOTE_ADDED.toLowerCase()\n ) || [];\n\n /**\n * @name candidateNotes\n * @description Get candidate notes from candidate events\n * @TODO add logic field \"by\" when we'll have restitution from companies\n */\n const candidateNotes =\n (candidatesStore.candidate as Candidate).events\n ?.filter((item) => !item?.deleted_at)\n .map((e) => ({\n ...e,\n by: 'Talent Partner',\n authorName: e.author?.name\n ? e.author?.name + ' ' + e.author?.surname\n : 'Unknown'\n })) || [];\n\n return {\n candidateNotes,\n matchNotes,\n matchEvents\n };\n };\n\n const getAllCandidateForSelect: ComputedRef<\n { text: string; value: string }[]\n > = computed(() => {\n if (!candidatesStore.candidates) return [];\n\n return candidatesStore.candidates.map((candidate: Candidate) => ({\n text:\n candidate.name + ' ' + candidate.surname + ' (' + candidate.email + ')',\n value: candidate.id\n }));\n });\n\n return {\n getCandidateStats,\n getCandidatesResolvedTableData,\n getPagination,\n getEventsLogFromCandidate,\n getAllCandidateForSelect\n };\n});\n","import { defineStore } from 'pinia';\nimport { useCandidatesActions } from './actions';\nimport { useCandidateState } from './state';\nimport { extractStore } from '~/stores/extractStore';\nimport { useCandidatesGetters } from '~/stores/candidates/getters';\n\nexport const useCandidates = defineStore('candidates', () => {\n return {\n ...extractStore(useCandidateState()),\n ...extractStore(useCandidatesGetters()),\n ...extractStore(useCandidatesActions())\n };\n});\n"],"names":["InitialState","useCandidateState","defineStore","counts","ref","candidates","pagination","cachedResult","isSearched","candidate","skillsCategories","candidateItems","candidateStats","getCandidates","config","apiClient","useNuxtApp","execute","GET_CANDIDATES_REST","CandidatesServices","getCandidate","uid","GET_CANDIDATE_REST","getCandidateStats","updateCandidate","userId","updateCandidateItem","item","deleteCandidate","id","postComment","comment","CandidateServices","isCandidateList","data","useCandidatesActions","settings","useSettings","storeToRefs","route","useRoute","push","useRouter","changePage","page","updateCandidates","c","updatePagination","p","updateCounts","updateCacheResult","timestamp","getAllCandidates","response","withPage","searchValue","isSearchServerSide","allCandidates","list","filterList","el","getCurrentPage","currentPage","_a","updateCandidatesArray","index","candidateObj","getSkills","TalentServices","getCandidateItems","getCandidateJobsStats","mapListNotes","events","event","authorName","formatDate","mapListNotesToMatch","jobPositionName","companyName","_c","_b","candidateNoteResolve","matchId","matches","match","m","cand","_d","resolveCandidateStats","t","pr","resolveCandidateStatistics","stats","resolveSkillIcon","skillId","techStackIconData","resolveCandidateSkillsSelect","skill","skillIcon","resolveSkillFromId","skillObj","resolveCategoryName","categoryId","category","resolveSkillValue","skills","e","resolveIdealCompanyValuesFromId","valueId","candidateFocus","valObj","val","resolveDesiredRoles","role","resolveDesiredRolesValue","roles","candidateRole","isDesiredRole","roleObj","seniority","resolveRemotenessItems","resolveRemotenessValues","values","idealCompanyTypeArr","typeObject","resolveIdealCompanyTypeById","details","detail","resolveCityItemsValues","city","resolveTimeExpectationsItems","time","resolveChoiceFactorsItems","focus","resolveFocusItemsValues","resolveDimensionItems","companyItems","size","resolveFocusCompanyItems","resolveAccordionDesiredRoles","desiredRoles","resolveTimeExpectationsItemsById","candidateJobSoonArr","Languages","isDeveloperEventBy","EVENT_BY","isCompanyEventBy","resolveMatchEventsBy","resolveValidStatus","status","useCandidatesGetters","candidatesStore","useCandidates","matchesStore","useMatches","resolveCandidatesStats","getCandidatesResolvedTableData","validCandidates","resolveCandidateDataTable","resolveCandidatesTableData","filterArrayByPage","getPagination","computed","getEventsLogFromCandidate","logEventsMatches","accumulator","jobsName","jobsId","companyId","_e","resolveCompanyNameFromId","logEvents","resolveEventType","_f","matchNotes","EventType","matchEvents","getAllCandidateForSelect","extractStore"],"mappings":"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"}