{"version":3,"file":"js/5257-694c08bf8348a5c3585e.chunk.js","mappings":"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","sources":["webpack://Maxwell/./app/assets/javascripts/utils/date.js","webpack://Maxwell/./app/assets/javascripts/v2/components/Multiverse/Borrowers/BorrowerDashboard/helper.js"],"sourcesContent":["export const isExpired = (expirationDate) => {\n const now = new Date()\n return expirationDate < now\n}\n\nexport function simpleDateFormat(momentDate) {\n return momentDate.format('MM/DD/YY')\n}\n\nexport function simpleDateUTCFormat(momentDate) {\n return momentDate.utc().format('MM/DD/YYYY')\n}\n\nexport function dateDiffInMonth(start, end) {\n const startDate = new Date(start)\n const endDate = end ? new Date(end) : new Date(Date.now())\n if (endDate < startDate) return 0\n\n let months\n months = (endDate.getFullYear() - startDate.getFullYear()) * 12\n months -= startDate.getMonth()\n months += endDate.getMonth()\n\n return months\n}\n\nexport const convertLocaleDateToUTCSameDate = (dateObj) => {\n return new Date(`${dateObj.getFullYear()}-${((dateObj.getMonth() % 12) + 1).toLocaleString('en-US', {\n minimumIntegerDigits: 2,\n useGrouping: false,\n })}-${(dateObj.getDate()).toLocaleString('en-US', {\n minimumIntegerDigits: 2,\n useGrouping: false,\n })}T00:00:00Z`)\n}\n\n// Returns positive value for days until provided date, provides negative number for days past current date.\n// expects date as local date or a string date.\nexport const getDaysFromToday = (date) => {\n try {\n const providedDate = date instanceof Date\n ? convertLocaleDateToUTCSameDate(date)\n : new Date(`${date.split('T')[0]}T00:00:00Z`)\n const todaysDate = convertLocaleDateToUTCSameDate(new Date())\n const dateMilisecondDifference = providedDate - todaysDate\n return Math.trunc(dateMilisecondDifference / (1000 * 3600 * 24))\n } catch (e) {\n throw new Error(\n // eslint-disable-next-line max-len\n `Error daysFromToday expects a date object or a string in date time format (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS(Z)); got ${date}`\n )\n }\n}\n\nexport const isToday = date => {\n const dateObj = new Date(date)\n // Adjust parsed date to account for timezone offset\n dateObj.setMinutes(dateObj.getMinutes() + dateObj.getTimezoneOffset())\n const today = new Date()\n\n return dateObj.getDate() === today.getDate()\n && dateObj.getMonth() === today.getMonth()\n && dateObj.getFullYear() === today.getFullYear()\n}\n","import { partition, sortBy } from 'lodash'\nimport { generatePath } from 'react-router-dom'\nimport frontendRoutes from 'Services/Route/frontendRoutes'\nimport { isCoborrower } from 'utils/user_type_utils'\nimport { isToday } from 'utils/date'\n\nexport const getAvatarSrc = profileImage => {\n return profileImage?.search('/users/user-default.png') === -1 ? profileImage : null\n}\n\nconst filterNonSharedELATasks = (taskRecords, hasSharedFinances, currentUserId) => {\n if (hasSharedFinances) {\n return taskRecords\n }\n\n return taskRecords.filter(\n task => task.type !== 'EnhancedLoanApplication' || task.assignedUserId === currentUserId\n )\n}\n\nexport const disclosuresTaskItemStatus = (taskItemStatus) => {\n switch (taskItemStatus) {\n case 'marked_completed':\n return 'marked_completed'\n case 'denied_consent':\n case 'complete':\n case 'expired':\n return 'completed'\n case 'error':\n case 'pending':\n case 'started':\n default:\n return 'open'\n }\n}\n\nexport const getVOEITaskStatus = (taskStatus) => {\n switch (taskStatus) {\n case 'researched_verification_authorized':\n case 'researched_verification_acknowledged':\n case 'researched_verification_completed':\n return 'completed'\n case 'researched_verification_declined_authorization':\n return 'declined'\n case 'researched_verification_awaiting_authorization':\n default:\n return 'open'\n }\n}\n\nexport const getVOATaskStatus = (taskStatus) => {\n switch (taskStatus) {\n case 'completed':\n return 'completed'\n case 'borrower_completed':\n return 'in_review'\n case 'assigned':\n case 'open':\n default:\n return 'open'\n }\n}\n\nexport const getTaskStatus = (task, { currentUserId, borrowerId, userRole }) => {\n const { type: taskType, status: taskStatus, signerInfo } = task\n\n switch (taskType) {\n case 'disclosures_tasks':\n return disclosuresTaskStatus(task, currentUserId)\n case 'voei_tasks':\n return getVOEITaskStatus(taskStatus)\n case 'signable_documents':\n return signedDocumentStatus(signerInfo, borrowerId, userRole)\n case 'voa_tasks':\n return getVOATaskStatus(taskStatus)\n default:\n return taskStatus\n }\n}\n\nexport const disclosuresTaskStatus = (disclosuresTask, currentUserId) => {\n\n const { disclosuresTaskItems } = disclosuresTask\n const userDisclosuresTaskItem = disclosuresTaskItems?.find(item => +item.userId === +currentUserId)\n const openDisclosuresTaskItems = disclosuresTaskItems?.filter(item => {\n return disclosuresTaskItemStatus(item.status) === 'open'\n })\n\n const userItemStatus = disclosuresTaskItemStatus(userDisclosuresTaskItem?.status)\n\n if (userItemStatus === 'marked_completed') return 'in_review'\n if (!openDisclosuresTaskItems.length) return 'completed'\n if (userItemStatus === 'completed') return 'in_review'\n return 'open'\n}\n\nexport const signedDocumentSignerIsUser = (borrowerId, userRole, signer) => {\n let signerUserId = String(borrowerId)\n if (userRole === 'coborrower') signerUserId = `cb-${borrowerId}`\n const { clientUserId = null } = signer\n return String(clientUserId) === signerUserId\n}\n\nexport const signedDocumentStatus = (signerInfo, borrowerId, userRole) => {\n if (!signerInfo) return null\n\n if (signerInfo.find(s => s.status === 'declined')) return 'declined'\n\n const currentSigner = signerInfo.find(signer => signedDocumentSignerIsUser(borrowerId, userRole, signer))\n if (!currentSigner?.status) return nonParticipantSignableDocStatus(signerInfo)\n\n if (currentSigner.status === 'completed') {\n const statuses = signerInfo.map(signer => signer.status)\n const completedCount = statuses.filter(status => status === 'completed' || status === 'declined').length\n\n if (completedCount >= 1 && completedCount < signerInfo.length) return 'in_review'\n else return 'completed'\n }\n return null\n}\n\nconst nonParticipantSignableDocStatus = signerInfo => {\n const signerStatuses = new Set(signerInfo.map(({ status }) => status))\n\n if (signerStatuses.has('declined')) return 'declined'\n // if any particpant hasn't taken action there will be no \"status\" key, return \"open\"\n if (signerStatuses.has(undefined)) return 'open'\n if (signerStatuses.has('completed')) return 'completed'\n\n return null\n}\n\nexport const isSignableTask = (taskData, userId, borrowerId, userRole) => {\n switch (taskData.type) {\n case 'disclosures_tasks': {\n return isOpenDisclosuresDocument(taskData, userId)\n }\n case 'signable_documents': {\n return isOpenSignableDocument(taskData, borrowerId, userRole)\n }\n case 'closing_tasks': {\n const esigningStatus = taskData.taskItems.find(item => item.userId === userId)?.esigningStatus\n return esigningStatus === 'not_ready' || esigningStatus === 'ready'\n }\n case 'voei_tasks': {\n return getVOEITaskStatus(taskData.status) === 'open'\n }\n default:\n return false\n }\n}\n\nexport const isOpenDisclosuresDocument = (task, currentUserId) => {\n const { type } = task\n return type === 'disclosures_tasks' && disclosuresTaskStatus(task, currentUserId) === 'open'\n}\n\nexport const isOpenSignableDocument = ({ type, signerInfo }, borrowerId, userRole) => (\n type === 'signable_documents' && signedDocumentStatus(signerInfo, borrowerId, userRole) === 'open'\n)\n\nexport const getTaskGroups = (taskRecords, hasSharedFinances, currentUserId, userRole, borrowerId) => {\n // TODO this filtering should be happening on the Backend now via the policy...(follow up)\n const filteredTaskRecords = filterNonSharedELATasks(taskRecords, hasSharedFinances, currentUserId)\n const [completedTasks, incompleteTasks] = partition(\n filteredTaskRecords,\n task => {\n switch (task.type) {\n case 'disclosures_tasks':\n return ['completed', 'declined'].includes(disclosuresTaskStatus(task, currentUserId))\n case 'voei_tasks':\n return ['completed', 'declined'].includes(getVOEITaskStatus(task.status))\n case 'voa_tasks':\n return ['completed', 'declined'].includes(getVOATaskStatus(task.status))\n default:\n return ['completed', 'declined'].includes(task.status)\n }\n }\n )\n\n const [openTasks, pendingTasks] = partition(\n incompleteTasks,\n task => {\n switch (task.type) {\n case 'signable_documents':\n return signedDocumentStatus(task.signerInfo, borrowerId, userRole) !== 'in_review'\n case 'disclosures_tasks':\n return disclosuresTaskStatus(task, currentUserId) !== 'in_review'\n case 'voa_tasks':\n return getVOATaskStatus(task.status) !== 'in_review'\n default:\n return task.status !== 'in_review'\n }\n }\n )\n\n const groupedTasks = {\n open: openTasks,\n pending: pendingTasks,\n approved: completedTasks,\n }\n\n return groupedTasks\n}\n\nexport const getUserFirstName = (borrowerCoborrowerData, user) => {\n const { borrower, coborrower } = borrowerCoborrowerData\n if (Array.isArray(user)) {\n if (user.length > 1) {\n return `${borrower.firstName} & ${coborrower.firstName}`\n }\n const { role } = user[0]\n if (role) {\n return borrowerCoborrowerData[role]?.firstName\n }\n }\n\n const { role, id } = user\n if (role && role === 'borrower & coborrower') {\n return `${borrower.firstName} & ${coborrower.firstName}`\n } else if (role) {\n return borrowerCoborrowerData[role].firstName\n }\n\n if (String(borrower.id) === String(id)) {\n return borrower.firstName\n }\n\n if (String(coborrower.id) === String(id)) {\n return coborrower.firstName\n }\n\n return null\n}\n\nexport const getTaskAssignedName = (task, loanFile) => {\n const {\n borrowerCoborrowerFormDefaults: { coborrower: { firstName: cbFirstName, lastName: cbLastName } },\n borrower,\n } = loanFile\n return isCoborrower(task.requiredFor) ? `${cbFirstName} ${cbLastName}` : borrower\n}\n\nexport const hasMultipleBorrowers = (borrowerCoborrowerData, user) => {\n if (Array.isArray(user)) {\n return user.length > 1\n }\n const { role } = user\n return role === 'borrower & coborrower'\n}\n\nexport const getNewUploadedDocumentCount = (documents = [], updatedAt) => {\n if (documents.length) {\n const nonRejectedDocs = documents.filter(doc => !doc.rejected)\n const newUploadedDocs = nonRejectedDocs.filter(doc => new Date(doc.createdAt) >= new Date(updatedAt))\n return newUploadedDocs.length\n }\n return 0\n}\n\nexport const getTaskUserIds = (borrowerCoborrowerData, role) => {\n const { borrower, coborrower } = borrowerCoborrowerData\n\n if (role && role === 'borrower & coborrower') {\n return [ borrower.id, coborrower.id ]\n } else if (role) {\n return [ borrowerCoborrowerData[role].id ]\n }\n\n return []\n}\n\nconst TASK_TYPE_MAP = {\n document_groups: 'DG',\n loan_app_task_items: 'LA',\n signable_documents: 'SD',\n disclosures_tasks: 'DT',\n closing_tasks: 'CT',\n payment_tasks: 'PT',\n voei_tasks: 'VE',\n voa_tasks: 'VA',\n}\n\nconst getTaskTypeFromShorthand = (taskTypeShorthand) => {\n const taskType = Object.entries(TASK_TYPE_MAP).find(([, val]) => val === taskTypeShorthand)\n if (taskType) return taskType[0]\n return null\n}\n\nexport const getLongTaskId = ({ id, type }) => {\n return `${TASK_TYPE_MAP[type] || ''}${id}`\n}\n\nexport const getTaskIdAndType = (compoundTaskId) => {\n if (!compoundTaskId) return {}\n let taskId = compoundTaskId\n const taskType = getTaskTypeFromShorthand(compoundTaskId.substring(0, 2))\n if (taskType) taskId = compoundTaskId.substring(2)\n return { taskId, taskType }\n}\n\nexport const getTasksShowPath = (borrowerId, loanFileId, taskId) => {\n return generatePath(frontendRoutes.borrowerDashboard.tasks.show, {\n borrowerId,\n loanFileId,\n taskId,\n })\n}\n\nexport const generateBaseTasksPath = (borrowerId, loanFileId) => {\n return generatePath(frontendRoutes.borrowerDashboard.tasks.index, {\n borrowerId,\n loanFileId,\n })\n}\n\nexport const getSubmittedTasksPath = (borrowerId, loanFileId) => {\n return generatePath(frontendRoutes.borrowerDashboard.tasks.submitted, {\n borrowerId,\n loanFileId,\n })\n}\n\nexport const getCompletedTasksPath = (borrowerId, loanFileId) => {\n return generatePath(frontendRoutes.borrowerDashboard.tasks.completed, {\n borrowerId,\n loanFileId,\n })\n}\n\nexport const nextOpenTaskUrl = ({\n borrowerId,\n loanFileId,\n currentTaskId,\n currentTaskType,\n taskRecords,\n sharedFinances,\n currentUserId,\n userRole,\n loanFileBorrowerId,\n}) => {\n const { open = [] } = getTaskGroups(taskRecords, sharedFinances, currentUserId, userRole, loanFileBorrowerId)\n\n const nextTask = open.filter(t => +t.id !== +currentTaskId && t.type !== currentTaskType)[0]\n\n return nextTask?.id\n ? getTasksShowPath(borrowerId, loanFileId, getLongTaskId(nextTask))\n : generateBaseTasksPath(borrowerId, loanFileId)\n}\n\nexport const dueDateChipVariant = ({ overdue, dueDate }) => {\n if (overdue) return 'danger'\n\n return isToday(dueDate) ? 'warning' : 'primary'\n}\n\n/*\n * Sort tasks on following criteria...\n * 1. Disclosure Tasks,\n * 2. Closing Tasks\n * 2. Signable task\n * 3. ELA tasks\n * 4. Rejected tasks\n * 5. ...all others sorted by due date\n */\nexport const sortTasks = (tasks = []) => {\n const dueDateSortedTasks = sortBy(tasks, 'dueDate')\n\n const attributeSortMap = dueDateSortedTasks.map((task, index) => {\n const { type, rejected } = task\n // level of importance, lower value = higher importance\n let importance = 10\n\n if (type === 'disclosures_tasks') importance = 0\n if (type === 'closing_tasks') importance = 1\n if (type === 'signable_documents') importance = 2\n if (type === 'loan_app_task_items') importance = 3\n if (rejected) importance = 4\n\n return { index, importance }\n })\n\n attributeSortMap.sort((a, b) => {\n if (a.importance > b.importance) return 1\n if (a.importance < b.importance) return -1\n\n return 0\n })\n\n return attributeSortMap.map(v => dueDateSortedTasks[v.index])\n}\n\nexport const getFileTypeIcon = filename => {\n const extension = filename.split('.').pop()\n switch (extension) {\n case 'pdf':\n return 'picture_as_pdf'\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n case 'bmp':\n case 'tiff':\n case 'svg':\n case 'webp':\n return 'photo_library'\n case 'rtf':\n case 'xls':\n case 'xlsx':\n case 'ppt':\n case 'pptx':\n case 'doc':\n case 'docx':\n default:\n return 'description'\n }\n}\n\n/*\n * ACCEPTED FILE AND MIME TYPES\n * doc - application/msword,\n * docx - application/vnd.openxmlformats-officedocument.wordprocessingml.document,\n * fodt - application/vnd.oasis.opendocument.text-flat-xml,\n * odp - application/vnd.oasis.opendocument.presentation,\n * ods - application/vnd.oasis.opendocument.spreadsheet,\n * odt - application/vnd.oasis.opendocument.text,\n * pdf - application/pdf,\n * ppt - application/vnd.ms-powerpoint,\n * pptx - application/vnd.openxmlformats-officedocument.presentationml.presentation,\n * rtf - application/rtf,\n * txt - text/plain,\n * xls - application/vnd.ms-excel,\n * xlsx - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,\n */\n\nexport const SUPPORTED_FILE_TYPES = [\n 'application/msword',\n 'application/pdf',\n 'application/rtf',\n 'application/vnd.ms-excel',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/vnd.oasis.opendocument.text-flat-xml',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'image/*',\n]\n\nexport const ACCEPTED_FILE_EXTENTIONS = [\n 'pdf',\n 'jpg',\n 'jpeg',\n 'png',\n 'doc',\n 'docx',\n 'xlsx',\n 'pptx',\n 'fodt',\n 'odp',\n 'ods',\n 'odt',\n 'ppt',\n 'rtf',\n 'xls',\n]\n\nexport function getTaskTooltip(taskData) {\n const title = taskData.title !== 'Custom Document' ? taskData.title : taskData.subtitle\n switch (title) {\n case 'W-2':\n return `W-2s will show your salary and compensation from your employer to verify\n your income that would be used to pay your mortgage.`\n case '1099':\n return `A 1099 documents payments over $600 made by someone who isn't your employer.\n It is used to file your state and federal taxes.`\n case 'Paystub':\n return `A document issued by an employer that shows gross earnings, deductions and withholding,\n and net pay per pay period.`\n case 'Bank Statements':\n return `A record of the balance in a given bank account and the amounts that have\n been paid into or withdrawn from it over a specified amount of time.`\n case 'Letter of explanation':\n return `The language should be formal, and the letter should be structured and\n well-organized to ensure a professional presentation.`\n case 'VOA':\n case 'Verification of Assets':\n return `Click here to securely connect to your online financial accounts.\n Please add all accounts you will use to pay for this loan.`\n case 'VOE':\n case 'Verification of Employment':\n case 'VOI':\n case 'Verification of Income':\n case 'Verification of Employment and Income':\n return `Clicking this link will take you to another website. You will be returned\n to this page once you've completed this task.`\n case 'Job offer / promotion letter':\n return 'A signed, dated offer letter or employment contract from your employer.'\n case 'Gap of employment letter':\n return 'A signed, dated letter which addresses any gaps in employment.'\n case 'Letter explaining self employment':\n return 'A signed, dated letter which addresses income from self-employment.'\n case 'Social Security awards letter':\n return `A document provided by the Social Security Administration which documents any\n benefits you may be receiving.`\n case 'Awards letter':\n return 'A document that outlines any benefits paid to you by an outside source either monthly or annually.'\n case 'Business P&L':\n return `A Profit and Loss statement assess a company's ability to generate income and\n any expenditures a company may have.`\n case 'Investment Account Statement':\n return 'Official document pertaining to your account\\'s activity, value, and holdings.'\n case 'Retirement Account Statement':\n return 'Official document pertaining to your account\\'s activity, value, and holdings.'\n case 'Other Account Statement':\n return 'Official document pertaining to your account\\'s activity, value, and holdings.'\n case 'Complete Federal Tax Return':\n return 'This is a tax return you send to the IRS each year showing how much money you earned and paid in taxes.'\n case 'Business Tax Return':\n return `This is a tax return you send to the IRS each year showing your business income,\n tax deductions, and tax payments.`\n case 'Letter of Explanation':\n return `The language should be formal, and the letter should be structured and well-organized\n to ensure a professional presentation.`\n case 'Copy of drivers license':\n return `An official document issued by the government confirming your identification,\n often the size of a credit card.`\n case 'Copy of passport':\n return 'An official document provided by the government confirming your identity and nationality.'\n case 'Copy of Social Security Card':\n return `A paper card provided by the Social Secuirty Administration which shows your full name\n and your unique 9-digit social security number.`\n case 'Permanent resident / alien card':\n return `This government document shows the identity of the person who has permanent residency\n in the United States.`\n case 'Proof of Insurance on Primary Residence':\n return 'This document summarizes the insurance coverage provided by your policy.'\n case 'Homeowners Insurance':\n return 'This document lists the estimated cost of a home insurance policy before you decide to buy it.'\n case 'Separation agreement (child support)':\n return `An agreement that outline issues such as property division, alimony, child support, or custody\n during a divorce or separation.`\n case 'Divorce Decree':\n return 'This document is a certificate issued by a court ending a marriage. '\n case 'Mortgage statement':\n return 'A document from your lender that provides details about your loan, usually arriving monthly.'\n case 'Copy of any HOA statements':\n return `To find this document, you can generally log into your HOA portal and obtain the most recent copy of\n your HOA Statement`\n case 'Home Equity Line of Credit statement':\n return `This is a line of credit that allows homeowners to borrow money against the equity they have built\n up in their home.`\n case 'VA - Form DD214':\n return `In case the original DD-214 is lost or damaged, veterans can request a replacement copy from the National\n Archives and Records Administration (NARA) or their respective state's veterans affairs office.`\n case 'VA - Certificate of Eligibility':\n return 'This document signifies a borrower\\'s eligibility to receive VA home loan benefits.'\n case 'Purchase Contract':\n return 'This agreement is between the buyer and seller of real estate property, company stock, or other assets. '\n default: return null\n }\n}\n\nexport function getTaskDescription(title, note) {\n switch (title) {\n case 'VOA':\n case 'Verification of Assets':\n return 'To verify your ability to pay for this mortgage and any associated closing costs, '\n + 'connect to your online financial institutions using our secure digital asset verification tool. This '\n + 'saves you time searching for account statements, and ensures we have accurate and up to date information.'\n case 'VOE':\n case 'Verification of Employment':\n case 'VOI':\n case 'Verification of Income':\n case 'Verification of Employment and Income':\n return 'To verify your employment status and income we need to contact your recent employers. Please click the '\n + 'link below confirm your employer\\'s conctact info and give us your approval to contact them.'\n default: return note\n }\n}\n\nexport const buildUserData = (taskData) => {\n switch (taskData.type) {\n case 'disclosures_tasks': {\n return taskData.disclosuresTaskItems\n }\n case 'signable_documents': {\n return taskData.signerInfo\n }\n case 'closing_tasks': {\n return taskData.taskItems.map(item => {\n return { id: item.userId }\n })\n }\n default:\n return null\n }\n}\n"],"names":["isExpired","expirationDate","Date","simpleDateFormat","momentDate","format","simpleDateUTCFormat","utc","convertLocaleDateToUTCSameDate","dateObj","getFullYear","getMonth","toLocaleString","minimumIntegerDigits","useGrouping","getDate","getDaysFromToday","date","dateMilisecondDifference","split","Math","trunc","e","Error","isToday","setMinutes","getMinutes","getTimezoneOffset","today","getAvatarSrc","profileImage","search","disclosuresTaskItemStatus","taskItemStatus","getVOEITaskStatus","taskStatus","getVOATaskStatus","getTaskStatus","task","currentUserId","borrowerId","userRole","taskType","type","status","signerInfo","disclosuresTaskStatus","signedDocumentStatus","disclosuresTask","disclosuresTaskItems","userDisclosuresTaskItem","find","item","userId","openDisclosuresTaskItems","filter","userItemStatus","length","signedDocumentSignerIsUser","signer","signerUserId","String","clientUserId","s","currentSigner","nonParticipantSignableDocStatus","completedCount","map","signerStatuses","Set","has","undefined","isSignableTask","taskData","isOpenDisclosuresDocument","isOpenSignableDocument","esigningStatus","taskItems","getTaskGroups","taskRecords","hasSharedFinances","filteredTaskRecords","assignedUserId","filterNonSharedELATasks","partition","includes","completedTasks","incompleteTasks","open","pending","approved","getUserFirstName","borrowerCoborrowerData","user","borrower","coborrower","Array","isArray","firstName","role","id","getTaskAssignedName","loanFile","borrowerCoborrowerFormDefaults","cbFirstName","cbLastName","lastName","isCoborrower","requiredFor","hasMultipleBorrowers","getNewUploadedDocumentCount","documents","updatedAt","nonRejectedDocs","doc","rejected","newUploadedDocs","createdAt","getTaskUserIds","TASK_TYPE_MAP","document_groups","loan_app_task_items","signable_documents","disclosures_tasks","closing_tasks","payment_tasks","voei_tasks","voa_tasks","getLongTaskId","getTaskIdAndType","compoundTaskId","taskId","taskTypeShorthand","Object","entries","getTaskTypeFromShorthand","substring","getTasksShowPath","loanFileId","generatePath","frontendRoutes","generateBaseTasksPath","getSubmittedTasksPath","getCompletedTasksPath","nextOpenTaskUrl","currentTaskId","currentTaskType","sharedFinances","loanFileBorrowerId","nextTask","t","dueDateChipVariant","overdue","dueDate","sortTasks","tasks","dueDateSortedTasks","sortBy","attributeSortMap","index","importance","sort","a","b","v","getFileTypeIcon","filename","pop","SUPPORTED_FILE_TYPES","ACCEPTED_FILE_EXTENTIONS","getTaskTooltip","title","subtitle","getTaskDescription","note","buildUserData"],"sourceRoot":""}