{"version":3,"sources":["helpers/ChartHelper.tsx","hooks/useCrmDuplicateCheck.ts","hooks/useCorrespondenceActivity.tsx","hooks/useRiskLevel.tsx","hooks/useTimeRecording.tsx","hooks/useCurrentUser.tsx","hooks/useCurrencySymbol.tsx","home/Common.tsx","helpers/DateHelper.tsx","hooks/useRegionSettings.tsx","helpConfiguration/dialog/UserDefinedDialog.tsx","home/Support/SupportEmailPage.tsx","hooks/useTenant.tsx","hooks/useHomeCountry.tsx","helpers/commonHelper.ts"],"names":["ETimePeriod","GetGroupByPlurals","groupBy","localStorage","getItem","PersonActing","toLocaleLowerCase","PersonResponsible","GetGroupBy","GetLeadsGroupBy","formatNumber","value","decimal","toFixed","toString","replace","formatToDbDate","date","d","Date","month","getMonth","day","getDate","year","getFullYear","length","join","convertStringNumberToNumber","parseFloat","formatPeriod","period","formatPeriodNoSpace","formatToDatePeriod","formatDate","format","FormatHours","GetArrow","value1","value2","className","GetSuggestedMax","FormatDate","getHighestNumberInArray","array","Math","max","getMaxSuggestedTick","suggested","generatedValue","round","getMaxTickLimit","maxTicksLimit","maxNumber","getSuggestedMaxTick","suggestedMax","getLabels","labels","CrmDuplicateCheckQuery","CorrespondenceActivityQuery","useCorrespondenceActivity","variables","fetchPolicy","data","error","loading","riskLevelQuery","useRiskLevel","useTimeRecording","timeRecordingQuery","TIME_RECORDING_QUERY","retrieveTimeRecordingData","refreshData","onSuccess","onError","query","then","results","catch","reason","useCurrentUser","CURRENT_USER_QUERY","useCurrencySymbol","CURRENCY_SYMBOL_QUERY","IconButtonWrapper","div","props","position","right","top","display","alignItems","margin","color","HelpWrapper","theme","TemplateColor","Primary","left","UpIcon","transform","DownIcon","FooterDescription","fontSize","textAlign","formatDateString","dateValue","test","isMoment","Error","useRegionSettings","REGION_SETTINGS_QUERY","useStyles","root","closeButton","spacing","palette","grey","heading","BrandColors","TemplatePrimary","loadingWrapper","UserDefinedDialog","classes","open","template","isLoading","state","setState","prevState","fetchAppUser","AppUserDefinedHelp","tempTemplate","appUser","userDefinedHelp","onClose","fullWidth","maxWidth","disableTypography","variant","onClick","dividers","size","dangerouslySetInnerHTML","__html","autoFocus","width","textField","commendField","dialogTitle","justifyContent","dropzone","paddingTop","paddingBottom","matterLabel","height","textArea","camelCaseButton","textTransform","SupportEmailDialog","note","userName","tenant","supportEmail","isAuthenticated","fetchData","GenerateEmailBody","getUserName","detectBrowser","getTimezoneOffset","navigator","userAgent","indexOf","timeslipContactInfo","userInfoQuery","fetchUserData","tenantId","Fragment","id","window","ServiceLevel","ServiceLevels","item","xs","container","multiline","rows","onChange","event","target","type","body","cc","mailToString","encodeURIComponent","useTenant","TENANT_QUERY","useHomeCountry","HOME_COUNTRY_QUERY","arrayToString","arr","filter","Boolean","arrayToStringWithSeparator","separtor","addEllipsis","text","maxLength","slice","removeTagsAndStyles","htmlString","trim","LightTooltip","arrow","common","white","boxShadow","shadows","tooltip","backgroundColor","fontFamily","padding","finalFormValidateEmail","separateName","name","words","split","firstName","shift","lastName","addBusinessDays","originalDate","numDaysToAdd","daysRemaining","newDate","valueOf","add","convertToDraftWysiwygContent","muiContent","contentBlocks","blocks","map","muiBlock","depth","inlineStyleRanges","entityRanges","entityMap","checkIfIntialValuesIsEqualToValues","initialValues","values","keys","union","every","key","a","b","isUndefined","isNull","isEqual","retrieveQueryData","queryParams","capitalizeFirstLetter","str","charAt","toUpperCase","hashString","input","i","hash","charCodeAt","isDateDue","currentDate","diff","getPrompt","feature","featureStr","startsWith","featureResult","find","childFeatureName","toLowerCase","featureName","prompt"],"mappings":"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","file":"static/js/main~a9db9748.ee4ac7b6.chunk.js","sourcesContent":["import { UpIcon, DownIcon } from '../home/Common';\r\nimport React from 'react';\r\nimport moment from 'moment';\r\nimport { LocalStorageEnum } from '../enums/LocalStorageEnum';\r\n\r\nexport function GetGroupByPlurals(groupBy: string) {\r\n switch (groupBy) {\r\n case 'MatterType':\r\n return 'matter types';\r\n case 'MatterCategory':\r\n return 'matter categories';\r\n case 'MatterCategoryAndType':\r\n return 'matter categories/types';\r\n case 'PersonActing':\r\n return localStorage.getItem(LocalStorageEnum.PersonActing)?.toLocaleLowerCase() || 'person acting';\r\n case 'PersonResponsible':\r\n return localStorage.getItem(LocalStorageEnum.PersonResponsible)?.toLocaleLowerCase() || 'person responsible';\r\n case 'Property':\r\n return 'properties';\r\n case 'PropertyType':\r\n return 'property types';\r\n case 'ReportingGroup':\r\n return 'reporting groups';\r\n case 'AreaOfLaw':\r\n return 'areas of law';\r\n case 'Source':\r\n return 'sources';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nexport function GetGroupBy(groupBy: string) {\r\n switch (groupBy) {\r\n case 'MatterType':\r\n return 'Type';\r\n case 'MatterCategory':\r\n return 'Category';\r\n case 'MatterCategoryAndType':\r\n return 'Category/Type';\r\n case 'PersonActing':\r\n return localStorage.getItem(LocalStorageEnum.PersonActing) || 'Person Acting';\r\n case 'PersonResponsible':\r\n return localStorage.getItem(LocalStorageEnum.PersonResponsible) || 'Person Responsible';\r\n case 'Property':\r\n return 'Property';\r\n case 'PropertyType':\r\n return 'Property Type';\r\n case 'ReportingGroup':\r\n return 'Reporting Group';\r\n case 'Client':\r\n return 'Client';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nexport function GetLeadsGroupBy(groupBy: string) {\r\n switch (groupBy) {\r\n case 'AreaOfLaw':\r\n return 'Area of Law';\r\n case 'Source':\r\n return 'Lead Source';\r\n case 'Assignee':\r\n return 'Assignee';\r\n case 'Location':\r\n return 'Location';\r\n case 'Quality':\r\n return 'Quality';\r\n case 'LikelihoodToProceed':\r\n return 'Likelihood to Proceed';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nexport function formatNumber(value: number, decimal?: number) {\r\n return value\r\n .toFixed(decimal ? decimal : 0)\r\n .toString()\r\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n}\r\n\r\n// returns date format of yyyy-MM-dd from a\r\n// a valid date string\r\nexport function formatToDbDate(date: string) {\r\n var d = new Date(date),\r\n month = '' + (d.getMonth() + 1),\r\n day = '' + d.getDate(),\r\n year = d.getFullYear();\r\n\r\n if (month.length < 2) {\r\n month = '0' + month;\r\n }\r\n if (day.length < 2) {\r\n day = '0' + day;\r\n }\r\n\r\n return [year, month, day].join('-');\r\n}\r\n\r\nexport function convertStringNumberToNumber(value: string) {\r\n return parseFloat(value.replace(/,/g, ''));\r\n}\r\n\r\nexport function formatPeriod(period: string) {\r\n switch (period) {\r\n case 'TwelveMonths':\r\n return '12 Months';\r\n case 'ThirtyDays':\r\n return '30 Days';\r\n case 'NinetyDays':\r\n return '90 Days';\r\n case 'SixtyDays':\r\n return '60 Days';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nexport function formatPeriodNoSpace(period: string) {\r\n switch (period) {\r\n case 'TwelveMonths':\r\n return '12Months';\r\n case 'ThirtyDays':\r\n return '30Days';\r\n case 'NinetyDays':\r\n return '90Days';\r\n case 'SixtyDays':\r\n return '60Days';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nexport function formatToDatePeriod(\r\n period: 'monthToDate' | 'previousMonth' | 'yearToDate' | 'previousYearToDate' | 'previousMonthYearToDate' | 'yearToDateFees' | 'previousMonthYearToDateFees',\r\n) {\r\n switch (period) {\r\n case 'monthToDate':\r\n return 'Month to Date';\r\n case 'previousMonth':\r\n return 'Previous Month';\r\n case 'yearToDate':\r\n return 'Year to Date';\r\n case 'previousYearToDate':\r\n return 'Previous Financial Year';\r\n case 'previousMonthYearToDate':\r\n return 'Year to Date (Previous Month)';\r\n case 'yearToDateFees':\r\n return 'Year to Date Fees';\r\n case 'previousMonthYearToDateFees':\r\n return 'Year to Date Fees (Previous Month)';\r\n default:\r\n return 'Month to Date';\r\n }\r\n}\r\n\r\nexport function formatDate(date: Date, format: string) {\r\n return moment(date).format(format);\r\n}\r\n\r\nexport function FormatHours(value: number) {\r\n return value > 2 ? 'hours' : 'hour';\r\n}\r\n\r\n// tslint:disable-next-line:no-any\r\nexport function GetArrow(value1: any, value2: any) {\r\n if (value1 > value2) {\r\n return ;\r\n } else if (value1 < value2) {\r\n return ;\r\n }\r\n return '';\r\n}\r\n\r\nexport function GetSuggestedMax(value: number) {\r\n if (value <= 10) {\r\n return value + 1;\r\n }\r\n\r\n return value + value * 0.1;\r\n}\r\n\r\nexport function FormatDate(value: string) {\r\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n var date = new Date(value);\r\n return months[date.getMonth()] + ' ' + date.getDate();\r\n}\r\n\r\nexport function checkArrayIfNotAllZero(array: number[], length: number) {\r\n return array.filter((x) => x > 0).length >= length;\r\n}\r\n\r\nexport function getHighestNumberInArray(array: number[]) {\r\n return Math.max(...array);\r\n}\r\n\r\n/*\r\n* getMaxSuggestedTick is Deprecated please use getSuggestedMaxTick\r\n*/\r\nexport function getMaxSuggestedTick(value: number, suggested: number) {\r\n if (value <= suggested) {\r\n const generatedValue = value + Math.round(value * 0.1);\r\n\r\n return generatedValue < 5 ? generatedValue + 1 : generatedValue;\r\n }\r\n return value + value * 0.1;\r\n}\r\n\r\n/*\r\n* get the suggested max tick limit\r\n*/\r\nexport function getMaxTickLimit(array: number[]) {\r\n // 11 is the default max tick limit in chartjs\r\n let maxTicksLimit = 11;\r\n if (array.length > 0) {\r\n const maxNumber = getHighestNumberInArray(array);\r\n\r\n if (maxNumber >= 11) {\r\n maxTicksLimit = maxNumber;\r\n }\r\n }\r\n\r\n return maxTicksLimit;\r\n}\r\n\r\n/*\r\n* get the suggested max tick\r\n*/\r\nexport function getSuggestedMaxTick(array: number[]) {\r\n // 6 is the default max tick in chartjs\r\n let suggestedMax = 6;\r\n if (array.length > 0) {\r\n \r\n const maxNumber = getHighestNumberInArray(array);\r\n\r\n if (maxNumber >= 6) {\r\n suggestedMax = maxNumber + + Math.round(maxNumber * 0.1);\r\n }\r\n }\r\n\r\n return suggestedMax;\r\n}\r\n\r\n/*\r\n* get labels and if lables array are empty automatically return array with empty string\r\n*/\r\nexport function getLabels(labels: string[]) {\r\n if (labels.length > 0) {\r\n return labels;\r\n }\r\n // this use to prevent returning 0 in the chart when has no data\r\n return [''];\r\n}\r\n\r\nexport function convertFirstLetterToUppercase(input: string): string {\r\n return input.charAt(0).toUpperCase() + input.slice(1);\r\n}\r\n\r\nexport enum ETimePeriod {\r\n THIS_MONTH = 'This Month',\r\n PREVIOUS_MONTH = 'Previous Month',\r\n FINANCIAL_YEAR = 'Financial Year',\r\n PREVIOUS_FINANCIAL_YEAR = 'Previous Financial Year',\r\n THIS_WEEK = 'This Week',\r\n LAST_14_DAYS = 'Last 14 Days',\r\n LAST_30_DAYS = 'Last 30 Days',\r\n LAST_12_MONTHS = 'Last 12 Months',\r\n}","import { WatchQueryFetchPolicy } from 'apollo-client';\r\nimport gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nexport const useCrmDuplicateCheck = (params: DuplicateCheckParams, fetchPolicy?: WatchQueryFetchPolicy) => {\r\n const { data, error, loading } = useQuery(CrmDuplicateCheckQuery, {\r\n fetchPolicy,\r\n variables: {\r\n email: params.email,\r\n isIncludeParty: params.isIncludeParty,\r\n isIncludeEnquiry: params.isIncludeEnquiry,\r\n }\r\n });\r\n\r\n return {\r\n data,\r\n error,\r\n loading,\r\n };\r\n};\r\n\r\nexport type DuplicateCheckParams = {\r\n email: string | null;\r\n isIncludeParty?: boolean | null\r\n isIncludeEnquiry: boolean | null\r\n};\r\n\r\nexport type DuplicateCheckData = {\r\n crm: CRM;\r\n};\r\n\r\nexport type CRM = {\r\n duplicateCheck: DuplicateCheck;\r\n};\r\n\r\nexport type DuplicateCheck = {\r\n contactName: string;\r\n contactEmailAddress: string;\r\n enquiryName: string;\r\n enquiryEmailAddress: string;\r\n otherSideName: string;\r\n otherSideEmailAddress: string;\r\n partyDuplicateCount: number;\r\n enquiryContactDuplicateCount: number;\r\n mobile: string;\r\n phone: string;\r\n};\r\n\r\nexport const CrmDuplicateCheckQuery = gql`\r\n query CrmDuplicateCheck(\r\n $email: String\r\n $isIncludeParty: Boolean\r\n $isIncludeEnquiry: Boolean\r\n ) {\r\n crm {\r\n duplicateCheck(\r\n email: $email\r\n isIncludeParty: $isIncludeParty\r\n isIncludeEnquiry: $isIncludeEnquiry\r\n ) {\r\n contactName\r\n contactEmailAddress\r\n enquiryName\r\n enquiryEmailAddress\r\n otherSideName\r\n otherSideEmailAddress\r\n partyDuplicateCount\r\n enquiryContactDuplicateCount\r\n mobile\r\n phone\r\n }\r\n }\r\n }\r\n`;","import { WatchQueryFetchPolicy } from 'apollo-client';\r\nimport gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nexport interface CorrespondenceActivityData {\r\n lookup: Lookup;\r\n}\r\n\r\nexport interface Lookup {\r\n correspondenceActivity: CorrespondenceActivity[];\r\n}\r\n\r\nexport interface CorrespondenceActivity {\r\n guid: string;\r\n description: string;\r\n sequence: number;\r\n}\r\n\r\nexport interface CorrespondenceActivityParams {\r\n isSystem?: boolean | null;\r\n}\r\n\r\nexport const CorrespondenceActivityQuery = gql`\r\nquery correspondenceActivityLookup($isSystem: Boolean) {\r\n lookup {\r\n correspondenceActivity(isSystem: $isSystem) {\r\n guid\r\n description\r\n sequence\r\n isSystem\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const useCorrespondenceActivity = (variables: CorrespondenceActivityParams, fetchPolicy?: WatchQueryFetchPolicy) => {\r\n\r\n const { data, error, loading} = useQuery(CorrespondenceActivityQuery, {\r\n variables: variables,\r\n fetchPolicy: fetchPolicy\r\n });\r\n\r\n return {\r\n data,\r\n error,\r\n loading\r\n };\r\n\r\n};","import { WatchQueryFetchPolicy } from 'apollo-client';\r\nimport gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nexport interface RiskLevelData {\r\n lookup: Lookup;\r\n}\r\n\r\nexport interface Lookup {\r\n riskLevel: RiskLevel[];\r\n}\r\n\r\nexport interface RiskLevel {\r\n guidId: string;\r\n description: string;\r\n level: number;\r\n sequence: number;\r\n}\r\n\r\nconst riskLevelQuery = gql`\r\n query RiskLevel {\r\n lookup {\r\n riskLevel {\r\n guidId\r\n description\r\n level\r\n sequence\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const useRiskLevel = (fetchPolicy: WatchQueryFetchPolicy) => {\r\n\r\n const { data, error, loading} = useQuery(riskLevelQuery, {\r\n fetchPolicy: fetchPolicy\r\n });\r\n\r\n return {\r\n data,\r\n error,\r\n loading\r\n };\r\n\r\n};","import { FetchPolicy } from 'apollo-client';\r\nimport gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\nimport { client } from '..';\r\n\r\nexport const useTimeRecording = () => {\r\n const timeRecordingQuery = useQuery(TIME_RECORDING_QUERY, {\r\n fetchPolicy: 'cache-first',\r\n });\r\n\r\n return {\r\n ...timeRecordingQuery\r\n };\r\n};\r\n\r\nexport type TimeRecordingData = {\r\n settings: Settings;\r\n};\r\n\r\nexport type Settings = {\r\n id: number;\r\n systems: Systems;\r\n};\r\n\r\nexport type Systems = {\r\n timeRecordingDefaults: TimeRecordingDefaults;\r\n timeRecordingSettings: TimeRecordingSettings;\r\n};\r\n\r\nexport type TimeRecordingDefaults = {\r\n id: number;\r\n config: TimeRecordingDefaultsConfig;\r\n};\r\n\r\nexport type TimeRecordingDefaultsConfig = {\r\n id: number;\r\n timeCaptureMode: string;\r\n};\r\n\r\nexport type TimeRecordingSettings = {\r\n id: number;\r\n config: TimeRecordingSettingsConfig;\r\n};\r\n\r\nexport type TimeRecordingSettingsConfig = {\r\n id: number;\r\n thresholdLevel: number;\r\n};\r\n\r\nconst TIME_RECORDING_QUERY = gql`\r\n query TimeRecording {\r\n settings {\r\n id\r\n systems {\r\n timeRecordingDefaults {\r\n id\r\n config {\r\n id\r\n timeCaptureMode\r\n }\r\n }\r\n timeRecordingSettings {\r\n id\r\n config {\r\n id\r\n thresholdLevel\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport function retrieveTimeRecordingData(\r\n refreshData: boolean,\r\n onSuccess: (data: TimeRecordingData) => void,\r\n // tslint:disable-next-line:no-any\r\n onError: (reason: any) => void,\r\n): void {\r\n var fetchPolicy: FetchPolicy = refreshData === true ? 'network-only' : 'cache-first';\r\n client\r\n .query({\r\n query: TIME_RECORDING_QUERY,\r\n fetchPolicy: fetchPolicy,\r\n })\r\n // tslint:disable-next-line:no-any\r\n .then((results: { data: TimeRecordingData }) => {\r\n onSuccess(results.data);\r\n })\r\n // tslint:disable-next-line:no-any\r\n .catch((reason: any) => {\r\n onError(reason);\r\n });\r\n}\r\n","import { WatchQueryFetchPolicy } from 'apollo-client';\r\nimport gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nexport const useCurrentUser = (fetchPolicy?: WatchQueryFetchPolicy) => {\r\n\r\n const { data, error, loading} = useQuery(CURRENT_USER_QUERY, {\r\n fetchPolicy: fetchPolicy ?? 'cache-first'\r\n });\r\n\r\n return {\r\n data,\r\n error,\r\n loading\r\n };\r\n\r\n};\r\n\r\nexport interface CurrentUserData {\r\n appUser: AppUser;\r\n}\r\n\r\nexport interface AppUser {\r\n userId: string;\r\n staffGuid: string;\r\n name: string;\r\n userName: string;\r\n isAdministrator: boolean;\r\n role: string;\r\n isInternal: boolean;\r\n isInternalAdmin: boolean;\r\n}\r\n\r\nconst CURRENT_USER_QUERY = gql`\r\n query CurrentUser {\r\n appUser {\r\n userId\r\n staffGuid\r\n name\r\n userName\r\n isAdministrator\r\n role\r\n isInternal\r\n isInternalAdmin\r\n }\r\n }\r\n`;\r\n","import gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nexport const useCurrencySymbol = () => {\r\n const { data, error, loading } = useQuery(CURRENCY_SYMBOL_QUERY, {\r\n fetchPolicy: 'cache-first'\r\n });\r\n return {\r\n data,\r\n error,\r\n loading,\r\n };\r\n};\r\n\r\nexport interface CurrencySymbolData {\r\n options: Options;\r\n}\r\n\r\nexport interface Options {\r\n currencySymbol: CurrencySymbol;\r\n localCurrency: LocalCurrency;\r\n}\r\n\r\nexport interface CurrencySymbol {\r\n symbol: string;\r\n}\r\n\r\nexport interface LocalCurrency {\r\n currency: string;\r\n}\r\n\r\nconst CURRENCY_SYMBOL_QUERY = gql`\r\n query CurrencySymbol {\r\n options {\r\n currencySymbol {\r\n symbol\r\n }\r\n localCurrency {\r\n currency\r\n }\r\n }\r\n }\r\n`;\r\n","import glamorous from 'glamorous';\r\nimport ForwardIcon from '@material-ui/icons/Forward';\r\nimport InfoIcon from '@material-ui/icons/InfoOutlined';\r\nimport { DashboardTypeEnum } from './ChartComponents';\r\n\r\nexport const IconButtonWrapper = glamorous.div<{ theme?: object }>((props) => ({\r\n position: 'absolute',\r\n right: '5px',\r\n top: '5px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n margin: '0 -3px',\r\n '& > .MuiIconButton-root': {\r\n margin: '0 3px',\r\n '& .MuiSvgIcon-root': {\r\n color: 'rgb(0, 120, 212) !important'\r\n },\r\n },\r\n '@media print': {\r\n display: 'none !important',\r\n }\r\n}));\r\n\r\n// tslint:disable-next-line:no-any\r\nexport const InfoHoverIcon = glamorous(InfoIcon)<{ theme?: any }>((props) => ({\r\n color: props.theme.TemplateColor.Primary,\r\n position: 'absolute',\r\n left: '5px',\r\n top: '5px',\r\n '@media print': {\r\n display: 'none !important',\r\n }\r\n}));\r\n\r\nexport const HelpWrapper = glamorous.div<{ theme?: object }>((props) => ({\r\n position: 'absolute',\r\n left: '5px',\r\n top: '5px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n margin: '0 -2.5px',\r\n '& > *': {\r\n margin: '0 2.5px',\r\n },\r\n '@media print': {\r\n display: 'none !important',\r\n },\r\n}));\r\n\r\n// tslint:disable-next-line:no-any\r\nexport const UpIcon = glamorous(ForwardIcon)<{ theme?: any }>(props => ({\r\n transform: 'rotate(270deg)',\r\n color: 'green',\r\n}));\r\n\r\n// tslint:disable-next-line:no-any\r\nexport const DownIcon = glamorous(ForwardIcon)<{ theme?: any }>(props => ({\r\n transform: 'rotate(90deg)',\r\n color: 'red'\r\n}));\r\n\r\nexport const FooterDescription = glamorous.div<{ theme?: object }>((props) => ({\r\n fontSize: '1rem',\r\n textAlign: 'center',\r\n}));\r\n\r\nexport interface ChartCommonProps {\r\n index?: number;\r\n onCloseChart?: (category: string) => void;\r\n description?: string;\r\n onMaximize?: (option?: number, additionalOption?: number) => void;\r\n showAllRecords?: boolean;\r\n showScreenshot?: boolean;\r\n maximizeSelected?: {\r\n // tslint:disable-next-line:no-any\r\n [key: string]: any;\r\n }\r\n onMaximizeSelected?: (option: {\r\n // tslint:disable-next-line:no-any\r\n [key: string]: any;\r\n }) => void;\r\n isAIFeatureEnabled?: boolean;\r\n layoutId?: DashboardTypeEnum;\r\n aiPrompt?: string;\r\n}\r\n\r\nexport interface ChartCommonState {\r\n open: boolean;\r\n anchorEl: Element | ((element: Element) => Element) | null | undefined;\r\n}","import { DateType } from '@date-io/type';\r\nimport moment from 'moment';\r\n\r\nexport const isDateStringInFormat = (dateString: string): boolean => {\r\n const regex = /^\\d{4}-\\d{2}-\\d{2}$/;\r\n return regex.test(dateString);\r\n};\r\n \r\nexport const formatDateString = (dateValue: string | Date | DateType | null): string | null => {\r\n if (dateValue === null) {\r\n // Decide on the behavior when null is passed. Returning null here, but you can adjust as needed.\r\n return null;\r\n } else if (typeof dateValue === 'string') {\r\n if (isDateStringInFormat(dateValue)) {\r\n return dateValue; // Return as is if the string is already in YYYY-MM-DD format\r\n } else {\r\n // Assume the string is in a different format and needs conversion\r\n return moment(dateValue).format('YYYY-MM-DD');\r\n }\r\n } else if (moment.isMoment(dateValue)) {\r\n // If it's a Moment object\r\n return dateValue.format('YYYY-MM-DD');\r\n } else if (dateValue instanceof Date) {\r\n // If it's a Date object\r\n return moment(dateValue).format('YYYY-MM-DD');\r\n } else {\r\n throw new Error('Invalid dateValue type');\r\n }\r\n};","import gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nexport const useRegionSettings = () => {\r\n const { data, error, loading } = useQuery(REGION_SETTINGS_QUERY, {\r\n fetchPolicy: 'cache-first'\r\n });\r\n\r\n return {\r\n data,\r\n error,\r\n loading,\r\n };\r\n};\r\n\r\nexport interface RegionsSettingsData {\r\n settings: Settings;\r\n}\r\n\r\nexport interface Settings {\r\n id: number;\r\n systems: Systems;\r\n}\r\n\r\nexport interface Systems {\r\n regionSettings: RegionSettings;\r\n}\r\n\r\nexport interface RegionSettings {\r\n id: number;\r\n config: Config;\r\n}\r\n\r\nexport interface Config {\r\n id: number;\r\n currencyCode: string;\r\n currencySymbol: string;\r\n financialYearStart: Date;\r\n homeCountry: string;\r\n timeZone: string;\r\n timeZoneDescription: string;\r\n taxLabel: string;\r\n taxPercentage: number;\r\n baseUtcOffset: number;\r\n}\r\n\r\nconst REGION_SETTINGS_QUERY = gql`\r\n query regionSettings {\r\n settings {\r\n id\r\n systems {\r\n regionSettings {\r\n id\r\n config {\r\n id\r\n currencyCode\r\n currencySymbol\r\n financialYearStart\r\n homeCountry\r\n timeZone\r\n timeZoneDescription\r\n taxLabel\r\n taxPercentage\r\n baseUtcOffset\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\r\nimport { Dialog, DialogContent, Button, DialogActions, Typography, IconButton } from '@material-ui/core';\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport { showNotification } from '../../App';\r\nimport gql from 'graphql-tag';\r\nimport { client } from '../..';\r\nimport { RvLoader } from '../../components/Loader';\r\nimport { mainTheme } from '../../Theme';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n \r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n heading: {\r\n color: mainTheme.BrandColors.TemplatePrimary\r\n },\r\n loadingWrapper: {\r\n\r\n }\r\n })\r\n);\r\n\r\ninterface DialogProps {\r\n open: boolean;\r\n onClose?: () => void;\r\n}\r\n\r\ninterface DialogState {\r\n open: boolean;\r\n template: string | null;\r\n isLoading: boolean;\r\n}\r\n\r\nexport const UserDefinedDialog: React.FC = props => {\r\n \r\n const classes = useStyles();\r\n\r\n const [state, setState] = useState({\r\n open: false,\r\n template: null,\r\n isLoading: false,\r\n });\r\n\r\n useEffect(() => {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n open: props.open\r\n };\r\n });\r\n\r\n fetchAppUser();\r\n // tslint:disable-next-line: align\r\n }, [props.open]);\r\n\r\n const fetchAppUser = () => {\r\n \r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isLoading: true\r\n };\r\n });\r\n\r\n client.query({\r\n query: AppUserDefinedHelp,\r\n fetchPolicy: 'network-only'\r\n // tslint:disable-next-line:no-any\r\n }).then((results: {\r\n // tslint:disable-next-line:no-any\r\n data: any;\r\n }) => {\r\n\r\n let tempTemplate: string | null = null;\r\n\r\n if (results.data && results.data.appUser && \r\n results.data.appUser.userDefinedHelp &&\r\n results.data.appUser.userDefinedHelp.template !== null ) {\r\n \r\n tempTemplate = results.data.appUser.userDefinedHelp.template;\r\n\r\n } else {\r\n \r\n tempTemplate = null;\r\n\r\n }\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n template: tempTemplate,\r\n isLoading: false\r\n };\r\n });\r\n\r\n // tslint:disable-next-line: no-any\r\n }).catch((reason: any) => {\r\n showNotification(null, reason, 'error');\r\n });\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n\r\n const onClose = () => {\r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n };\r\n \r\n return (\r\n \r\n \r\n Help\r\n \r\n \r\n \r\n \r\n \r\n {\r\n !state.isLoading\r\n ? (
)\r\n : \r\n (\r\n
\r\n \r\n
\r\n )\r\n }\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nconst AppUserDefinedHelp = gql`\r\n query AppUserDefinedHelp{\r\n appUser {\r\n userDefinedHelp {\r\n template\r\n }\r\n }\r\n }\r\n`;","/* eslint-disable no-useless-concat */\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport {\r\n makeStyles,\r\n Theme,\r\n createStyles,\r\n Grid,\r\n TextField,\r\n Typography,\r\n} from '@material-ui/core';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport { mainTheme } from '../../Theme';\r\nimport { showNotification } from '../../App';\r\nimport { client } from '../..';\r\nimport { FetchPolicy } from 'apollo-client';\r\nimport gql from 'graphql-tag';\r\nimport { fetchTypedUserSettings } from '../../userSettings/UserSettingsRepository';\r\nimport { MatterTerminology } from '../../MatterTerminology';\r\nimport { DocumentListFile } from '../../common/constants';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n width: '100%',\r\n },\r\n textField: {\r\n width: '100%',\r\n },\r\n commendField: {\r\n width: '100%',\r\n },\r\n dialogTitle: {\r\n color: mainTheme.TemplateColor.Primary,\r\n '& .MuiTypography-root': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n }\r\n },\r\n dropzone: {\r\n paddingTop: 10,\r\n paddingBottom: 10,\r\n },\r\n matterLabel: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n height: '100%',\r\n },\r\n textArea: {\r\n paddingBottom: '10px',\r\n width: '100%',\r\n '& textarea': {\r\n fontSize: '16px',\r\n },\r\n '& > div::before': {\r\n // content: 'none',\r\n }\r\n },\r\n camelCaseButton: {\r\n textTransform: 'none'\r\n }\r\n })\r\n);\r\n\r\ninterface SupportEmailState {\r\n \r\n note: string;\r\n userName: string;\r\n tenant: string;\r\n supportEmail: string;\r\n}\r\n\r\nexport interface SupportEmailProps {\r\n isAuthenticated: boolean;\r\n onClose: () => void;\r\n}\r\n\r\n// tslint:disable-next-line: no-anyW\r\nexport const SupportEmailDialog: React.FC = ( props ) => {\r\n const classes = useStyles();\r\n\r\n const [state, setState] = useState({\r\n note: '',\r\n userName: '',\r\n tenant: '',\r\n supportEmail: ''\r\n });\r\n\r\n useEffect(() => {\r\n if (props.isAuthenticated) {\r\n fetchData();\r\n }\r\n // tslint:disable-next-line:align\r\n }, [props.isAuthenticated]);\r\n\r\n // tslint:disable-next-line:no-any\r\n const handleTextChange = (event: any) => {\r\n const note = event.target.value;\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n note: note \r\n };\r\n });\r\n };\r\n const handleSend = () => {\r\n if (state.note !== '') {\r\n var body = GenerateEmailBody();\r\n var subject = 'User Web Issue';\r\n var recipient = 'support@redraincorp.com';\r\n var cc = '';\r\n if (state.supportEmail !== recipient && state.supportEmail) {\r\n cc = '; ' + state.supportEmail;\r\n\r\n }\r\n\r\n var mailToString = 'mailTo:' + recipient + cc + '?subject=' + encodeURIComponent(subject) + '&body=' + encodeURIComponent(body); \r\n window.open(mailToString);\r\n }\r\n if (props.onClose) {\r\n return props.onClose();\r\n }\r\n };\r\n\r\n const GenerateEmailBody = () => {\r\n var body = state.note \r\n + '\\n\\n User: ' + getUserName()\r\n + '\\n Tenant: ' + state.tenant\r\n + '\\n App: ' + 'Connect Web'\r\n + '\\n Browser: ' + detectBrowser()\r\n // tslint:disable-next-line:no-string-literal\r\n // + '\\n NetworkType: ' + navigator['connection'].effectiveType\r\n + '\\n TimeZoneOffset: ' + new Date().getTimezoneOffset() / 60.0;\r\n return body;\r\n \r\n };\r\n\r\n const getUserName = () => {\r\n return state.userName ? state.userName : 'Not logged in';\r\n };\r\n\r\n const detectBrowser = () => { \r\n if ((navigator.userAgent.indexOf('Opera') || navigator.userAgent.indexOf('OPR')) !== -1 ) {\r\n return 'Opera';\r\n } else if (navigator.userAgent.indexOf('Chrome') !== -1 ) {\r\n return 'Chrome';\r\n } else if (navigator.userAgent.indexOf('Safari') !== -1) {\r\n return 'Safari';\r\n } else if (navigator.userAgent.indexOf('Firefox') !== -1 ) {\r\n return 'Firefox';\r\n } else if (navigator.userAgent.indexOf('MSIE') !== -1 ) {\r\n return 'IE';\r\n } else {\r\n return 'Unknown';\r\n }\r\n };\r\n\r\n const fetchData = () => {\r\n fetchTypedUserSettings(\r\n true,\r\n // tslint:disable-next-line:no-any\r\n (data: any) => { setState((prevState: SupportEmailState) => {\r\n return {\r\n ...prevState,\r\n supportEmail: data.timeslipContactInfo,\r\n };\r\n });\r\n }, \r\n reason => {\r\n showNotification(\r\n 'Failed to Fetch Layout Configuration',\r\n reason,\r\n 'error'\r\n );\r\n }\r\n );\r\n fetchUserData(false, \r\n // tslint:disable-next-line:no-any\r\n (data: any) => { setState((prevState: SupportEmailState) => {\r\n return {\r\n ...prevState,\r\n userName: data.appUser ? data.appUser.userName : '',\r\n tenant: data.tenant.tenantId\r\n };\r\n });\r\n }, \r\n (reason) => { \r\n showNotification('Failed to Matter Summary New Enabled Lookup value', reason, 'error'); \r\n });\r\n };\r\n\r\n const onServiceLevel = () => {\r\n window.open(DocumentListFile.ServiceLevel, '_blank');\r\n };\r\n\r\n return (\r\n \r\n props.onClose()}\r\n className={classes.root}\r\n maxWidth=\"sm\"\r\n fullWidth={true}\r\n >\r\n \r\n
Request Support
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* {printJson(values)} */}\r\n \r\n \r\n If you are reporting on an issue or an error please provide as much specific detail as possible to the nature of the problem.\r\n Screen shots are often very useful. When you click SEND, an email will be created in your default email application.\r\n Any attachments or screenshots can be added on that screen.\r\n {/* tslint:disable-next-line: no-shadowed-variable */}\r\n <>\r\n \r\n {/* */}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport function fetchUserData(refreshData: boolean,\r\n // tslint:disable-next-line:no-any\r\n onSuccess: (data?: any) => void,\r\n // tslint:disable-next-line:no-any\r\n onError: (reason: any) => void)\r\n : void {\r\n var fetchPolicy: FetchPolicy = refreshData === true ? 'network-only' : 'cache-first';\r\n\r\n client.query({\r\n query: userInfoQuery,\r\n variables: {},\r\n fetchPolicy: fetchPolicy\r\n })\r\n // tslint:disable-next-line:no-any\r\n .then((results: { data: any; }) => {\r\n onSuccess(results.data);\r\n })\r\n // tslint:disable-next-line:no-any\r\n .catch((reason: any ) => { onError(reason); }\r\n );\r\n}\r\n\r\nconst userInfoQuery = gql`query user {\r\n appUser {\r\n userName\r\n }\r\n tenant {\r\n tenantId\r\n }\r\n }\r\n `;\r\n","import gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nexport const useTenant = () => {\r\n const { data, error, loading } = useQuery(TENANT_QUERY, {\r\n fetchPolicy: 'cache-first'\r\n });\r\n\r\n return {\r\n data,\r\n error,\r\n loading,\r\n };\r\n};\r\n\r\nexport interface TenantData {\r\n tenant: Tenant;\r\n}\r\n\r\nexport interface Tenant {\r\n companyName: string;\r\n tenantId: string;\r\n sourceSystem: string;\r\n companyUrl: string;\r\n leapProvisioningStatus: string;\r\n showResetLeapAccessCard: boolean;\r\n}\r\n\r\nconst TENANT_QUERY = gql`\r\n query Tenant {\r\n tenant {\r\n companyName\r\n tenantId\r\n sourceSystem\r\n companyUrl\r\n leapProvisioningStatus\r\n showResetLeapAccessCard\r\n }\r\n }\r\n`;\r\n","import gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nexport const useHomeCountry = () => {\r\n const { data, error, loading } = useQuery(HOME_COUNTRY_QUERY, {\r\n fetchPolicy: 'cache-first'\r\n });\r\n return {\r\n data,\r\n error,\r\n loading,\r\n };\r\n};\r\n\r\nexport interface HomeCountryData {\r\n options: Options;\r\n}\r\n\r\nexport interface Options {\r\n homeCountry: HomeCountry;\r\n}\r\n\r\nexport interface HomeCountry {\r\n stringValue: string;\r\n}\r\n\r\nconst HOME_COUNTRY_QUERY = gql`\r\n query homeCountry {\r\n options {\r\n homeCountry {\r\n stringValue\r\n }\r\n }\r\n }\r\n`;\r\n","import { Theme, Tooltip, withStyles } from '@material-ui/core';\r\nimport _ from 'lodash';\r\nimport moment from 'moment';\r\nimport { client } from '..';\r\nimport { FetchPolicy } from 'apollo-client';\r\nimport { DocumentNode } from 'graphql';\r\nimport { AIPrompt } from '../hooks/useAIPromptQuery';\r\nimport { UserFeatureEnum } from '../types/UserFeature';\r\n\r\nexport function arrayToString(arr: (string | number | null)[]) {\r\n return arr.filter(Boolean).join(', ');\r\n}\r\n\r\nexport function arrayToStringWithSeparator(arr: (string | number | null)[], separtor: string) {\r\n return arr.filter(Boolean).join(separtor);\r\n}\r\n\r\nexport function addEllipsis(text: string, maxLength: number): string {\r\n return text.length > maxLength ? text.slice(0, maxLength - 3) + '...' : text;\r\n}\r\n\r\nexport function removeTagsAndStyles(htmlString: string): string {\r\n // Remove HTML tags and   using regex\r\n const withoutTagsAndNbsp = htmlString.replace(/(<([^>]+)>| )/gi, '');\r\n \r\n // Remove inline styles using regex\r\n const withoutStyles = withoutTagsAndNbsp.replace(/style\\s*=\\s*\".*?\"/gi, '');\r\n \r\n // Remove remaining whitespace and line breaks\r\n const withoutWhitespace = withoutStyles.replace(/\\s+/g, ' ').trim();\r\n \r\n return withoutWhitespace;\r\n }\r\n\r\nexport const LightTooltip = withStyles((theme: Theme) => ({\r\n arrow: {\r\n color: theme.palette.common.white,\r\n '&::before': {\r\n // backgroundColor: 'blue',\r\n boxShadow: theme.shadows[1],\r\n }\r\n },\r\n tooltip: {\r\n backgroundColor: theme.palette.common.white,\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: theme.shadows[1],\r\n fontSize: '14px',\r\n maxWidth: '800px',\r\n fontFamily: 'Nunito, Arial, Helvetica, sans-serif',\r\n padding: '10px',\r\n },\r\n}))(Tooltip);\r\n\r\nexport const finalFormValidateEmail = (value?: string) => {\r\n \r\n const emailRegex = /^(([^<>()\\\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n\r\n let error: string = '';\r\n\r\n if (!value) {\r\n return error;\r\n }\r\n \r\n if (!emailRegex.test(value)) {\r\n error = 'Email is not valid';\r\n }\r\n return error;\r\n};\r\n\r\nexport function separateName(name: string): { firstName: string, lastName: string } {\r\n const words = name.split(' ');\r\n const firstName = words.shift(); // Removes and returns the first element of the array\r\n const lastName = words.join(' ');\r\n \r\n return {\r\n firstName: firstName || '', // If firstName is undefined, set it to an empty string\r\n lastName: lastName || '', // If lastName is undefined, set it to an empty string\r\n };\r\n }\r\n \r\nexport const addBusinessDays = (originalDate: Date, numDaysToAdd: number) => {\r\n const Sunday = 0;\r\n const Saturday = 6;\r\n let daysRemaining = numDaysToAdd;\r\n\r\n const newDate = moment(new Date(originalDate.valueOf()));\r\n\r\n while (daysRemaining > 0) {\r\n newDate.add(1, 'days');\r\n if (newDate.day() !== Sunday && newDate.day() !== Saturday) {\r\n daysRemaining--;\r\n }\r\n }\r\n\r\n return newDate;\r\n};\r\n\r\n// convert muitext editor content that compose using :blocks then convert to react-wysyg\r\n// tslint:disable-next-line: no-any\r\nexport function convertToDraftWysiwygContent(muiContent: any) {\r\n // tslint:disable-next-line: no-any\r\n const contentBlocks = muiContent.blocks.map((muiBlock: any) => ({\r\n text: muiBlock.text,\r\n type: muiBlock.type || 'unstyled', // Use 'unstyled' if type is missing\r\n depth: muiBlock.depth || 0,\r\n inlineStyleRanges: muiBlock.inlineStyleRanges || [],\r\n entityRanges: muiBlock.entityRanges || [],\r\n data: muiBlock.data || {},\r\n }));\r\n \r\n return {\r\n entityMap: muiContent.entityMap || {},\r\n blocks: contentBlocks,\r\n };\r\n}\r\n\r\nexport function checkIfIntialValuesIsEqualToValues(initialValues: T, values: T) {\r\n const keys = _.union(_.keys(initialValues), _.keys(values));\r\n \r\n return _.every(keys, (key) => {\r\n const a = initialValues[key];\r\n const b = values[key];\r\n \r\n if (_.isUndefined(a) || _.isNull(a)) {\r\n return _.isUndefined(b) || _.isNull(b);\r\n }\r\n \r\n return _.isEqual(a, b);\r\n });\r\n}\r\n\r\n// tslint:disable-next-line: no-any\r\nexport function retrieveQueryData(\r\n query: DocumentNode,\r\n queryParams: queryParams,\r\n refreshData: boolean,\r\n onSuccess: (data: queryResult) => void,\r\n onError: (reason: queryError) => void,\r\n) {\r\n var fetchPolicy: FetchPolicy = refreshData === true ? 'network-only' : 'cache-first';\r\n client\r\n .query({\r\n query: query,\r\n variables: { ...queryParams },\r\n fetchPolicy: fetchPolicy,\r\n })\r\n // tslint:disable-next-line:no-any\r\n .then((results) => {\r\n onSuccess(results.data);\r\n })\r\n // tslint:disable-next-line:no-any\r\n .catch((reason) => {\r\n onError(reason);\r\n });\r\n}\r\n\r\nexport function capitalizeFirstLetter(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\nexport function hashString(input: string): number {\r\n var hash = 0, i, chr;\r\n if (input.length === 0) {\r\n return hash;\r\n }\r\n for (i = 0; i < input.length; i++) {\r\n chr = input.charCodeAt(i);\r\n // tslint:disable-next-line:no-bitwise\r\n hash = ((hash << 5) - hash) + chr - 1;\r\n // tslint:disable-next-line:no-bitwise\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n return hash;\r\n}\r\n\r\nexport function isDateDue(value: Date) {\r\n const currentDate = moment();\r\n const dateDiff = moment(value).diff(currentDate, 'days');\r\n\r\n return dateDiff < 0;\r\n}\r\n\r\nexport function getPrompt(data: AIPrompt[], feature: keyof typeof UserFeatureEnum) {\r\n // Get feature name from enum key\r\n const featureStr = feature.startsWith('has') ? feature.slice(3) : feature;\r\n\r\n const featureResult = data.find(\r\n (item) =>\r\n item.childFeatureName?.trim().toLowerCase() === featureStr.trim().toLowerCase() ||\r\n item.featureName?.trim().toLowerCase() === featureStr.trim().toLowerCase()\r\n );\r\n\r\n return featureResult?.prompt;\r\n}"],"sourceRoot":""}