{"version":3,"sources":["timesheetTimer/TimesheetTimerRepository.tsx","timesheet/TimesheetRepository.tsx","timesheetTimer/styles.tsx","timesheetTimer/TimerCard.tsx","timesheetTimer/TimesheetTimerDrawer.tsx","types/UserFeature.tsx","timeslip/page/TimeslipTimePage.tsx","timeslip/TimeslipHeader.tsx","timeslip/matter/Search.tsx","timeslip/matter/MatterLookUpRepository.tsx","timeslip/matter/ColorGenerator.tsx","timeslip/matter/InfiniteScrollWrapper.tsx","timeslip/matter/AllMatterTab.tsx","timeslip/matter/FavouriteMatterTab.tsx","timeslip/matter/RecentMatterTab.tsx","timeslip/page/TimeslipMatterPage.tsx","timeslip/page/TimeslipStartPage.tsx","timeslip/page/TimeslipActivityPage.tsx","timeslip/page/TimeslipNotesPage.tsx","timeslip/page/TimeslipChargeCodePage.tsx","timeslip/selectors/MatterLookUpAutoCompleteSelector.tsx","timeslip/selectors/ActivityAutoCompleteSelector.tsx","timeslip/TimeslipPage.tsx"],"names":["TimerSummaryCountQuery","TimerSummaryQuery","retrieveTimerSummaryCountData","params","refreshData","onSuccess","onError","fetchPolicy","query","variables","then","results","data","catch","reason","CreateTimerMutation","UpdateTimerMutation","TimerSubscriptionNotification","DeleteTimerMutation","StartTimerMutation","PauseTimerMutation","SubmitTimerMutation","retrieveTimesheetData","TimesheetData","offset","first","filter","startDate","endDate","timeslipStatus","feeEarnerId","includeNoMatter","retrieveTimeStatsData","TimsheetStats","retrieveDrafts","includeDraft","includePending","Drafts","retrieveTimesheetSummaryData","TimesheetSummary","retrieveMatterFinancials","id","matterId","useStyles","makeStyles","theme","createStyles","timerWrapper","paddingTop","flex","display","flexFlow","heading","backgroundColor","padding","cardRoot","margin","minHeight","cardControl","width","justifyContent","alignItems","color","cardControlPlay","cardControlStop","cardControlError","playCircle","fontSize","cardContent","position","marginBottom","cardDetails","flexDirection","cursor","loadingWrapper","deleteButton","top","right","iconButton","fabProgress","blue","zIndex","hidePanelButton","panel","timeslipPageWrapper","TimerCard","props","classes","timerRef","useRef","useEffect","isRunning","current","start","pause","formatTime","value","useState","isInvalid","state","setState","showConfirm","setShowConfirm","onDelete","event","preventDefault","stopPropagation","DialogBox","title","content","show","isAgree","agree","disAgreeLabel","agreeLabel","disablePortal","key","initialTime","ref","startImmediately","stop","getTime","Card","className","inError","onClick","IconButton","disabled","isLoading","CircularProgress","size","onStop","onStart","CardContent","time","onDrilldown","undefined","fileNumber","Typography","component","variant","client","matterCategory","description","errorMessage","isTimeDisabled","Days","formatValue","onInvalidate","Hours","Minutes","timeWorkedInSeconds","seconds","Math","ceil","minutes","floor","minutesString","secondsString","getTimeDisplay","Seconds","TimerContext","setTimerTotal","setInitialTimerTotal","timerNotification","createTimerMutation","createTimerMutationObj","updateTimerMutation","updateTimerMutationObj","deleteTimerMutation","deleteTimerMutationObj","startTimerMutation","startTimerMutationObj","submitTimerMutation","submitTimerMutationObj","pauseTimerMutation","pauseTimerMutationObj","timeRecording","useTimeRecording","isTimeslipOpen","isCreateLoading","selectedTimer","isNewTimer","timeRecordSystem","isDeleting","timers","setTimers","timerSummaryQuery","loading","error","settings","prevState","timerSummaries","timerSummary","tempTimers","map","item","lastStarted","currentDate","timeDuration","duration","diff","totalWorkedSeconds","timeWorkedSeconds","asSeconds","timeWorkedSecondsTemp","length","message","status","toLowerCase","includes","timerGuid","refetch","timer","setTimeout","clearTimeout","createNewTimer","guid","v4","Date","timeWorkedSecondsRunning","currentSecs","pauseDateTime","push","activityDescription","activityId","chargeRate","chargeRateId","billingNote","matterType","timesheetNote","units","createdDate","timeUnits","onPlayTimer","currentTime","index","findIndex","toDate","startDateTime","onStopTimer","onInvalidateTimer","splice","isCreate","onDimissPanel","onClose","Panel","headerText","isOpen","open","onDismiss","onLightDismissClick","customWidth","type","custom","closeButtonAriaLabel","isBlocking","style","TimeslipPage","isFromTimer","updateTimerAction","timeslip","newTimer","selectedTimerGuid","onCreateAction","onUpdateAction","onToggleTimer","onSubmitTimer","isSubmitAndSync","onSubmitTimerAsDraft","timerByDate","forEach","_date","format","groupTimerByDate","Object","keys","sort","a","b","localeCompare","group","timersList","isCurrentDate","isSame","getTimersByDate","UserFeatureEnum","this","userId","Init","tenantId","accessToken","sessionStorage","getItem","token","sub","tenantid","features","split","Clear","HasAccess","userFeature","checkAndTrackFeature","LogFeatureUsage","feature","trackEvent","name","properties","Tenant","UserId","hasAccess","toString","TabName","getIcon","bind","handleSave","render","actionType","appBar","Toolbar","forTimer","menuButton","icon","onSave","withStyles","marginRight","flexGrow","fontWeight","lineHeight","fontFamily","textAlign","withTheme","handleTextChange","field","target","console","log","parseInt","minute","minutesInUnit","hour","second","unit","noChange","replace","getUnits","onClickButtonTime","multiplier","handleClose","handleTabChange","changeDate","formatNumberBy0","timeConvertToWords","currentTab","shouldShowTabs","tenantTimeCaptureMode","timeCaptureMode","tab","hours","UNSAFE_componentWillReceiveProps","nextProps","nextContext","buttonTimeComponent","buttons","amountOfButtons","i","Button","timeButton","durationComponent","durationContainer","Input","onChange","unitComponent","unitContainer","FormControl","formControl","InputLabel","htmlFor","timeContainer","Paper","square","tabContainer","Tabs","indicatorColor","textColor","Tab","label","tabContent","onData","newValue","slice","dialog","boxShadow","maxWidth","flexBasis","flexShrink","paddingBottom","maxHeight","border","button","handleChange","placeholder","context","root","input","inputProps","onSearch","search","divider","height","retrieveMatterLookUpData","MATTER_LOOKUP","typeFilter","statusFilter","isExcludeCompleted","generateColor","str","hash","charCodeAt","colourList","abs","Array","DataCardSection","div","overflowY","left","bottom","GridView","GridContainer","loadData","loadNextBlock","listenScrollEvent","convertChildrenToElements","updateWindowDimensions","childrenVisible","blockSize","windowHeight","componentDidMount","window","addEventListener","findDOMNode","componentWillUnmount","removeEventListener","innerWidth","ratio","innerHeight","updatedHeight","round","forceUpdate","reachedBottom","isBottom","table","document","getElementById","getBoundingClientRect","Row","columns","childData","elements","count","child","result","mapFunc","Component","onSelectItem","matter","onSelectedItem","toggleVIP","idx","tempMatter","JSON","parse","stringify","matterLookupList","isVIP","mutate","mutation","updateMatterFavourite","updateMatterAsFavourite","fetchMatterData","getInfiniteLoaderAll","getInfiniteLoaderCurrent","getInfiniteLoaderComplete","createAbbreviation","listHeight","currentRowCount","resetSearchProperties","listElement","jQuery","infiniteScrollTable","listContainer","List","matterTitlePrefix","getMatterTitlePrefix","sourceSystem","ListItem","ListItemAvatar","Avatar","ListItemText","primary","listComponent","ListItemSecondaryAction","starIcon","Divider","customList","isRefresh","onDataRetrieved","matterLookupListData","matters","currentRecordCount","union","onTabChange","values","substr","abbr","minWidth","progress","getInfiniteLoaderFavourite","onMatterSelectedItem","onAllMatterTabChange","searchPlaceholder","infiniteScrollWrapper","spaceCreator","searchContainer","menu","tabs","propertyLabel","handleDateChange","date","currDate","autoComplete","dateContainer","fieldContainer","TextField","textField","activity","tempActivity","activityLookupList","updateActivityAsFavourite","favActivityFirst","fetchActivities","timesheetActivityData","clientOnly","activities","getPrivate","searchActivities","stringValue","TimesheetActivitiesQuery","timesheetActivities","favouriteActivitiesCount","_value","note","isInprotechNote","handleClear","handleSearch","standardNotesList","subjectList","defaultNarrative","narratives","s","contentCol","textArea","multiline","rows","buttonWrapper","searchWrapper","list","selectedContainer","chargeCode","fetchChargeCodes","handlePress","chargeRateLookupList","rate","isPE","chargeCodeTitle","chargeRateInput","chargeRateInputWrapper","listContent","chargeCodes","PeChargeCodes","pEChargeRates","pEChargeRate","ChargeCodes","tempActivities","moneyValue","iconSelected","marginLeft","borderRadius","marginTop","text","close","opacity","renderWrapper","customRenderWrapper","letterSpacing","listItem","listBox","observable","MatterLookUpAutoCompleteSelector","delayedonInputChange","fetchData","hasNextPage","isNextPageLoading","items","isClear","unsubscribe","matterLookupParams","isLimitedMatterSearch","watchQuery","MATTER_LOOKUP_QUERY","subscribe","next","retrieveMatterLookupData","matterData","rowCountWithoutFilters","recordCount","itemsList","source","getInputProps","InputProps","endAdornment","Fragment","onOpen","shortingTitle","LightTooltip","tooltip","palette","common","white","shadows","arrow","Tooltip","limit","descriptionLimit","placement","substring","InfiniteAutocomplete","itemSize","disableCloseOnSelect","isMultiple","multiple","options","loadNextPage","disableListWrap","disableOpenOnFocus","onSelection","selection","getOptionLabel","option","onInputChange","onBlur","disabledFilterOptions","listbox","tabIndex","renderInput","fullWidth","required","helperText","autoFocus","renderOption","ActivityAutoCompleteSelector","timesheetAcitivtiesQuery","Autocomplete","getOptionSelected","inline","timeContent","mainWrapper","timeWrapper","hide","buttonContainer","primaryList","whiteSpace","overflow","textOverflow","secondaryList","cardWrapper","paper","background","BrandColors","TemplatePrimary","unitFieldClass","unitField","primaryListItemTex","paddingRight","inputDuration","inputRoot","timerButtonWrapper","paddingLeft","timeLoader","dialogAdittionalTitle","gap","dialogAdditionalClient","dialogAdditionalTitle","thresholdText","warning","ButtonGroupWrapper","ButtonGroup","handleToggle","timeDialogOpen","matterDialogOpen","startsDialogOpen","activityDialogOpen","notesDialogOpen","chargeCodeDialogOpen","inInprotechNotes","onChangeDuration","Number","isNaN","setDuration","hasChangedTime","onMatterLookupChange","hasChangedField","onMatterSelected","onActivityChange","onNoteChange","tempValue","inprotechNote","customised","noteHasBeenCustomised","onTimeData","onActivityData","onNotesData","onMatterData","onStartData","onSubmit","onCloseTime","onCloseMatter","onCloseStart","onCloseActivity","onCloseNotes","onChargeCodeData","onCloseChargeCode","setMatter","getActionButton","handleUpdate","closePanel","handleCreateAndClose","handleCreateAndNew","handleCreateAndCopy","handleCreateAndPost","getUnitsFromMinutes","getMinutesFromUnits","matterListUI","limitText","onLongText","handleCheckBoxChange","onMatterFinancialsRetrieved","onChangeUnit","onSaveToTimer","updateRunningTime","closePanelFromTimer","onDeleteConfirm","onShowThresholdConfirm","isMatterAndActivtyEmpty","isFromOutlook","shouldSubmit","chargeCodeId","timeWorkedMinutes","isFinancialsLoading","inputFocus","showConfirmBillingThreshold","billingConfirmThresholdText","threshold","timeRecordingSettings","config","thresholdLevel","parsed","location","href","setItem","defaultToDraft","allowDraft","defaultMatter","emailDefaultActivity","activityObject","StringValue","setActivity","timeslips","defaultActivity","defaultDurationMinutes","timeslipsToDelete","template","newActivity","matterID","notes","inprotechNotes","totalMinutes","distinctNotes","Set","distinctInprotechNotes","add","from","join","durationString","itemDate","getMinutesFromDurationString","getHoursFromDurationString","timeslipsToRemove","favActFirst","favMattersFirst","favMatterFirst","interval","setInterval","clearInterval","minutesPerUnit","unitsPerHour","estimatedFeesColour","financials","billedTimeAndFees","unbilledTimeAndFees","estimatedFees","estimatedCosts","UserFeature","hasFeeEstimateWarning","hideDisagree","getMatterFinancials","localCurrency","TenantData","tenant","systems","timeRecordingDefaults","currencySymbol","symbol","llocalCurrency","currency","hasChargeCodes","hasPosting","noteTitle","toLocaleLowerCase","toDateString","displayZero","Grid","container","spacing","xs","sm","md","lg","MatterTerminology","EstimatedCosts","FormattedCurrency","displayStyle","Integer","CostAgreementReceived","costAgreementReceived","Billed","BilledTimeAndFees","Disbursements","billedDisbursements","TotalOwing","balanceDue","TrustBalance","trustGeneralBalance","Unbilled","UnbilledTimeAndFees","unbilledDisbursements","hasOwnProperty","orientation","matterObject","tempData","timeString","setHours","tempHours","tempMinutes","extraHour","getMinutes","getHours","firstValue","secondValue","CloseBrowserControl","copyActivityAsNote","shouldClose","shouldCopy","validateSubmission","endTime","startTime","difference","UpdateTimeslip","activityString","chargeLevelId","startTimeSeconds","endTimeSeconds","timeslipId","timeslipNote","updateTimeslip","updateAction","activityID","chargeLevelID","chargeLevelDescription","amount","isSynced","syncErrorID","syncErrorDescription","isIncomplete","timesheetId","DeleteTimeslip","mergeAction","SubmitTimeslip","addNewTimeslip","convertToMinutes","TooltipHost","calloutProps","gapSpace","checked","vm","matterFinancialsQueryParams","billed","unbilled","estimate","unitsValue","updatedSeconds","updatedMinutes","updatedHours"],"mappings":"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,kFACA,gGACA,4EACA,kEACA,8CACA,0DACA,sDACA,gDACA,kEACA,4EACA,wEACA,oFACA,kGACA,8EACA,oEACA,8FACA,0FACA,sGACA,oHACA,gGACA,sFACA,sEACA,kEACA,8EACA,4FACA,wEACA,8DACA,4DACA,kFACA,0FACA,wGACA,oFACA,0EACA,8EACA,oFACA,4FACA,0GACA,sFACA,4EACA,gFACA,oFACA,4FACA,0GACA,sFACA,4EACA,gFACA,4DACA,sDACA,kGACA,8FACA,0GACA,wHACA,oGACA,0FACA,sGACA,kGACA,8GACA,4HACA,wGACA,8FACA,4EACA,4CACA,wCACA,0CACA,oCACA,8CACA,wDACA,gDACA,4CACA,4FACA,wFACA,oGACA,kHACA,8FACA,oFACA,oEACA,8CACA,gDACA,4GACA,wGACA,oHACA,kIACA,8GACA,qGACA,+DACA,+DACA,6EACA,6DACA,6DACA,qEACA,mEACA,6EACA,uEACA,qEACA,6EACA,qEACA,qEACA,6EACA,qDACA,6BACA,2CACA,+CACA,+CACA,mDACA,iDACA,iDACA,uCACA,uCACA,uCACA,uCACA,2CACA,yEACA,+EACA,qFACA,iFACA,2FACA,mGACA,2DACA,yCACA,yCACA,iDACA,uCACA,yDACA,6CACA,yCACA,qDACA,yCACA,yDACA,6EACA,yEACA,yEACA,6EACA,6BACA,yCACA,uCACA,2CACA,iDACA,uCACA,uCACA,uCACA,yDACA,mEACA,yEACA,iEACA,+DACA,mEACA,+DACA,qEACA,uEACA,6EACA,qEACA,qEACA,qEACA,6CACA,uDACA,uEACA,iFACA,yEACA,yEACA,iFACA,qEACA,uEACA,6DACA,iEACA,yEACA,6DACA,uEACA,yEACA,2BACA,iDACA,2EACA,iFACA,2CACA,yEACA,6EACA,uFACA,iGACA,+FACA,uGACA,mGACA,uGACA,qFACA,+FACA,6FACA,qGACA,iGACA,qGACA,2EACA,qFACA,mFACA,2FACA,uFACA,2FACA,qCACA,iDACA,yDACA,6EACA,qEACA,+EACA,uEACA,qFACA,qEACA,qEACA,6EACA,qEACA,mFACA,mEACA,mEACA,mFACA,2EACA,yFACA,yEACA,yEACA,uDACA,yDACA,2FACA,mGACA,iHACA,6FACA,mFACA,uFACA,6EACA,iFACA,6EACA,2FACA,2EACA,iFACA,2EACA,iFACA,yCACA,iEACA,2EACA,+CACA,mDACA,iDACA,2DACA,mEACA,+EACA,+DACA,yDACA,qFACA,iFACA,6FACA,uDACA,uFACA,+FACA,uFACA,+FACA,uFACA,iEACA,iEACA,mDACA,+CACA,yEACA,qFACA,qFACA,iFACA,+CACA,yEACA,iEACA,6DACA,uEACA,+FACA,iFACA,iFACA,qFACA,qFACA,qEACA,6EACA,iEACA,yCACA,yCACA,yCACA,mEACA,2DACA,uDACA,yDACA,6CACA,6CACA,2EACA,qEACA,6EACA,uGACA,uGACA,iDACA,iEACA,qEACA,qFACA,iEACA,iFACA,uDACA,uEACA,2EACA,2FACA,uEACA,uFACA,qFACA,uEACA,uEACA,iEACA,iEACA,qEACA,qEACA,uEACA,yEACA,+EACA,yDACA,+CACA,qGACA,qGACA,yGACA,yGACA,2HACA,2HACA,6FACA,uGACA,+FACA,qCACA,qCACA,yCACA,qCACA,2DACA,uDACA,mEACA,qEACA,mDACA,6EACA,qEACA,iEACA,yDACA,mEACA,uEACA,+CACA,yEACA,iEACA,mDACA,6EACA,uFACA,iFACA,yEACA,mFACA,6FACA,uFACA,+EACA,+DACA,yFACA,mFACA,6EACA,2EACA,2EACA,iEACA,yFACA,mFACA,yDACA,6DACA,6DACA,qDACA,uDACA,iFACA,2EACA,uDACA,qEACA,+FACA,uFACA,mFACA,+DACA,mDACA,mEACA,6DACA,iEACA,yEACA,6DACA,uEACA,qEACA,6EACA,iEACA,6CACA,uEACA,uDACA,2EACA,yFACA,yDACA,iDACA,2GACA,6EACA,uFACA,2CACA,2CACA,2CACA,qEACA,mEACA,mEACA,mEACA,mEACA,qFACA,qCACA,iDACA,2EACA,iDACA,6EACA,2EACA,uEACA,6EACA,qEACA,yEACA,6DACA,uEACA,iDACA,2EACA,6EACA,2FACA,2EACA,uEACA,iGACA,2EACA,iDACA,uFACA,2DACA,iEACA,qEACA,iFACA,2CACA,iDACA,iEACA,2CACA,+DACA,6DACA,uFACA,+DACA,qEACA,mEACA,2FACA,iFACA,yFACA,6EACA,uDACA,6DACA,2CACA,uEACA,yGACA,6EACA,qEACA,+CACA,uEACA,uEACA,6DACA,yDACA,iDACA,2FACA,mCACA,+CACA,iEACA,uEACA,uDACA,qFACA,2FACA,2EACA,+EACA,6GACA,2FACA,6FACA,yEACA,yEACA,+DACA,iDACA,uEACA,uEACA,uEACA,2EACA,uFACA,mFACA,uDACA,6DACA,+DACA,mFACA,2EAEA,qDACA,yDACA,2CACA,2DACA,6DACA,6DACA,mDACA,2DACA,mDACA,qDAEA,mFACA,qGACA,mEACA,uEACA,yDACA,+DACA,qDACA,qEACA,uEACA,6EAEA,iDACA,2DACA,2EACA,iFACA,+FACA,iDAEA,yEACA,yEACA,+DACA,+DACA,uEACA,6EAGA,uEACA,+FACA,qFACA,+EAEA,6DACA,qFACA,2EACA,qEACA,6DACA,+CAzhBJ,CAAYA,MAAe,M,4CCoEtB0B,E,0nBChGL,cACI,WAAYlO,GAAZ,MACI,YAAMA,IAAM,K,OACZ,EAAKmO,QAAU,EAAKA,QAAQC,KAAK,GACjC,EAAKC,WAAa,EAAKA,WAAWD,KAAK,G,EAgD/C,OApD6B,OAOzB,YAAAE,OAAA,WACU,MAA0B7B,KAAKzM,MAA7BC,EAAO,UAAEsO,EAAU,aAC3B,OACI,uBAAKlM,UAAWpC,EAAQuO,QACpB,gBAACC,EAAA,EAAO,UAEevL,IAAfqL,GAA2C,OAAfA,GAC5B9B,KAAKzM,MAAM0O,cADuCxL,EAG9C,gBAACV,EAAA,EAAU,CAACH,UAAWpC,EAAQ0O,WAAYnQ,MAAM,UAAS,aAAY,QACjEiO,KAAK0B,QAAQ1B,KAAKzM,MAAMuO,aAKrC,gBAACnL,EAAA,EAAU,CAACf,UAAWpC,EAAQqB,OAC1BmL,KAAKzM,MAAM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","file":"static/js/main~cbdbc7bb.02c429c0.chunk.js","sourcesContent":["import { FetchPolicy } from 'apollo-client';\r\nimport gql from 'graphql-tag';\r\nimport { client } from '..';\r\n\r\nexport interface TimerSummaryData {\r\n timerSummary: TimerSummary;\r\n}\r\n\r\nexport interface TimerSummary {\r\n recordCount: number;\r\n timerSummaryCounts: TimerSummaryCounts;\r\n timerSummaries: TimerSummaryElement[];\r\n}\r\n\r\nexport interface TimerSummaryElement {\r\n timerGuid: string | null;\r\n activityDescription: string | null;\r\n activityId: number | null;\r\n chargeRate: number | null;\r\n chargeRateId: number | null;\r\n billingNote: string | null;\r\n client: string | null;\r\n fileNumber: string | null;\r\n isRunning: boolean;\r\n matterCategory: string | null;\r\n matterId: number | null;\r\n matterType: string | null;\r\n timesheetNote: string | null;\r\n timeWorkedSeconds: number | null;\r\n timeWorkedSecondsTemp: number | null;\r\n title: string | null;\r\n lastStarted: Date | null;\r\n inError: boolean | null;\r\n errorMessage: string | null;\r\n units: number | null;\r\n}\r\n\r\nexport interface TimerSummaryCounts {\r\n actualRowCountForSearch: number;\r\n id: number;\r\n totalCount: number;\r\n}\r\n\r\nexport interface TimerSummaryParams {\r\n offset: number | null;\r\n first: number | null;\r\n filter: string | null;\r\n}\r\n\r\nexport const TimerSummaryCountQuery = gql`\r\n query TimerSummary($offset: Int, $first: Int, $filter: String) {\r\n timerSummary(offset: $offset, first: $first, filter: $filter) {\r\n recordCount\r\n timerSummaryCounts {\r\n actualRowCountForSearch\r\n id\r\n totalCount\r\n } \r\n }\r\n }\r\n`;\r\n\r\nexport function fetchTimerSummary(\r\n query: TimerSummaryParams,\r\n refreshData: boolean,\r\n onSuccess: (data?: TimerSummaryData) => 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\r\n .query({\r\n query: TimerSummaryQuery,\r\n variables: {\r\n offset: query.offset,\r\n first: query.first,\r\n filter: query.filter\r\n },\r\n fetchPolicy: 'no-cache',\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) => {\r\n onError(reason);\r\n });\r\n}\r\n\r\nexport const TimerSummaryQuery = gql`\r\n query TimerSummary($offset: Int, $first: Int, $filter: String) {\r\n timerSummary(offset: $offset, first: $first, filter: $filter) {\r\n recordCount\r\n timerSummaryCounts {\r\n actualRowCountForSearch\r\n id\r\n totalCount\r\n }\r\n timerSummaries {\r\n id,\r\n timerGuid\r\n activityDescription\r\n activityId\r\n chargeRate\r\n chargeRateId\r\n billingNote\r\n client\r\n fileNumber\r\n isRunning\r\n matterCategory\r\n matterId\r\n matterType\r\n timesheetNote\r\n timeWorkedSeconds\r\n title\r\n lastStarted\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport function retrieveTimerSummaryCountData(\r\n params: TimerSummaryParams,\r\n refreshData: boolean,\r\n onSuccess: (data: TimerSummaryData) => 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: TimerSummaryCountQuery,\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) => {\r\n onError(reason);\r\n });\r\n}\r\n\r\nexport interface CreateTimerMutationParams {\r\n createdDate: Date | null;\r\n timeWorkedSeconds: number | null;\r\n matterId: number | null;\r\n activityId: number | null;\r\n chargeRateId: number | null;\r\n chargeRate: number | null;\r\n timesheetNote: string | null;\r\n billingNote: string | null;\r\n timeUnits: number | null;\r\n isRunning: Boolean | null;\r\n timerGuid: string | null;\r\n}\r\n\r\nexport const CreateTimerMutation = gql`\r\n mutation CreateTimer(\r\n $createdDate: DateTime\r\n $timeWorkedSeconds: Int\r\n $matterId: Int\r\n $activityId: Int\r\n $chargeRateId: Int\r\n $chargeRate: Int\r\n $timesheetNote: String\r\n $billingNote: String\r\n $timeUnits: Int\r\n $isRunning: Boolean\r\n $timerGuid: String\r\n ) {\r\n createTimer(\r\n createdDate: $createdDate\r\n timeWorkedSeconds: $timeWorkedSeconds\r\n matterId: $matterId\r\n activityId: $activityId\r\n chargeRateId: $chargeRateId\r\n chargeRate: $chargeRate\r\n timesheetNote: $timesheetNote\r\n billingNote: $billingNote\r\n timeUnits: $timeUnits\r\n isRunning: $isRunning\r\n timerGuid: $timerGuid\r\n )\r\n }\r\n`;\r\n\r\nexport interface UpdateTimerMutationParams {\r\n timerGuid: string;\r\n endDate: Date | null;\r\n timeWorkedSeconds: number | null;\r\n matterId: number | null;\r\n activityId: number | null;\r\n chargeRateId: number | null;\r\n chargeRate: number | null;\r\n timesheetNote: string | null;\r\n billingNote: string | null;\r\n timeUnits: number | null;\r\n}\r\n\r\nexport const UpdateTimerMutation = gql`\r\n mutation UpdateTimer(\r\n $timerGuid: String\r\n $endDate: DateTime\r\n $timeWorkedSeconds: Int\r\n $matterId: Int\r\n $activityId: Int\r\n $chargeRateId: Int\r\n $chargeRate: Int\r\n $timesheetNote: String\r\n $billingNote: String\r\n $timeUnits: Int\r\n ) {\r\n updateTimer(\r\n timerGuid: $timerGuid\r\n endDate: $endDate\r\n timeWorkedSeconds: $timeWorkedSeconds\r\n matterId: $matterId\r\n activityId: $activityId\r\n chargeRateId: $chargeRateId\r\n chargeRate: $chargeRate\r\n timesheetNote: $timesheetNote\r\n billingNote: $billingNote\r\n timeUnits: $timeUnits\r\n )\r\n }\r\n`;\r\n\r\nexport interface TimerNotificationSubscriptionData {\r\n timerNotification: TimerNotification;\r\n}\r\n\r\nexport interface TimerNotification {\r\n message: string;\r\n description: null;\r\n timerGuid: string;\r\n status: boolean;\r\n id: number;\r\n}\r\n\r\nexport const TimerSubscriptionNotification = gql`\r\n subscription TimerSubsciption {\r\n timerNotification {\r\n message\r\n description\r\n timerGuid\r\n status\r\n }\r\n }\r\n`;\r\n\r\nexport interface DeleteTimerMutationParams {\r\n timerGuid: string;\r\n}\r\n\r\nexport const DeleteTimerMutation = gql`\r\n mutation DeleteTimer($timerGuid: String) {\r\n deleteTimer(timerGuid: $timerGuid)\r\n }\r\n`;\r\n\r\nexport interface StartTimerMutationParams {\r\n timerGuid: string | null;\r\n startDateTime: Date;\r\n}\r\n\r\nexport const StartTimerMutation = gql`\r\n mutation StartTimer($timerGuid: String, $startDateTime: DateTime) {\r\n startTimer(timerGuid: $timerGuid, startDateTime: $startDateTime)\r\n }\r\n`;\r\n\r\nexport interface PauseTimerMutationParams {\r\n timerGuid: string | null;\r\n pauseDateTime: Date;\r\n}\r\n\r\nexport const PauseTimerMutation = gql`\r\n mutation PauseTimer($timerGuid: String, $pauseDateTime: DateTime) {\r\n pauseTimer(timerGuid: $timerGuid, pauseDateTime: $pauseDateTime)\r\n }\r\n`;\r\n\r\nexport interface SubmitTimerMutationParams {\r\n timerGuid: string | null;\r\n isSubmitAndSync: boolean;\r\n timeWorkedSeconds: number | null;\r\n matterId: number | null;\r\n activityId: number | null;\r\n chargeRateId: number | null;\r\n chargeRate: number | null;\r\n timesheetNote: string | null;\r\n billingNote: string | null;\r\n timeUnits: number | null;\r\n}\r\n\r\nexport const SubmitTimerMutation = gql`\r\n mutation SubmitTimerMutaiton($timerGuid: String, $isSubmitAndSync: Boolean\r\n $timeWorkedSeconds: Int\r\n $matterId: Int\r\n $activityId: Int\r\n $chargeRateId: Int\r\n $chargeRate: Int\r\n $timesheetNote: String\r\n $billingNote: String\r\n $timeUnits: Int ){\r\n submitTimer(timerGuid: $timerGuid, isSubmitAndSync: $isSubmitAndSync, timeWorkedSeconds: $timeWorkedSeconds\r\n matterId: $matterId\r\n activityId: $activityId\r\n chargeRateId: $chargeRateId\r\n chargeRate: $chargeRate\r\n timesheetNote: $timesheetNote\r\n billingNote: $billingNote\r\n timeUnits: $timeUnits)\r\n }\r\n`;","import gql from 'graphql-tag';\r\nimport { FetchPolicy } from 'apollo-client';\r\nimport { client } from '..';\r\nimport { MatterData, FinancialsInfoData } from '../matterDetails/financials/FinancialsInfo';\r\n\r\nexport interface TimesheetQueryParams {\r\n startDate: String | Date | null;\r\n endDate: String | Date | null;\r\n timeslipStatus: number; // 0 = All, 1 = Incomplete, 2 = Not Synced, 3 = All Drafts\r\n filter: String | null;\r\n offset: number | null;\r\n first: number | null;\r\n feeEarnerId?: string;\r\n includeNoMatter: boolean | null;\r\n}\r\n\r\nexport interface TimeStatQueryParams {\r\n startDate: Date | String | null;\r\n endDate: Date | String | null;\r\n feeEarnerId?: string;\r\n}\r\n\r\nexport interface TimesheetData {\r\n loading?: boolean;\r\n networkStatus?: number;\r\n timeslipSummary: TimeslipSummary;\r\n}\r\n\r\nexport interface TimeStatData {\r\n loading?: boolean;\r\n networkStatus?: number;\r\n timesheetStatistics: TimesheetStatistics;\r\n}\r\n\r\nexport interface DraftData {\r\n loading?: boolean;\r\n networkStatus?: number;\r\n draftTimeslips: TimeslipSummary;\r\n}\r\n\r\nexport interface TimesheetSummaryData {\r\n loading?: boolean;\r\n networkStatus?: number;\r\n timesheetSummary: TimesheetSummary;\r\n}\r\n\r\nexport interface TimesheetSummary {\r\n summaries: DaySummary[];\r\n}\r\nexport interface DaySummary {\r\n date: string;\r\n totalForDaySeconds: number;\r\n totalForDayUnits: number;\r\n}\r\nexport interface TimesheetStatistics {\r\n timesheetStatistics: TimesheetStatistic[];\r\n}\r\n\r\nexport interface TimesheetStatistic {\r\n timesheetDate: Date;\r\n timeslipCount: number;\r\n chargeableTimeMins: number;\r\n nonChargeableTimeMins: number;\r\n notSubmittedCount: number;\r\n incompleteCount: number;\r\n feeValue: number;\r\n pendingCount: number;\r\n draftExcludingPendingCount: number;\r\n}\r\n\r\nexport interface TimeslipSummary {\r\n recordCount: number;\r\n timeSlipSummaryCounts: TimeSlipSummaryCounts;\r\n timeslipSummaries: TimeslipSummaries[];\r\n}\r\n\r\nexport interface TimeSlipSummaryCounts {\r\n actualRowCountForSearch: number;\r\n draftCount: number;\r\n submittedCount: number;\r\n totalCount: number;\r\n }\r\n\r\nexport interface TimeslipSummaries {\r\n id: number | undefined;\r\n matterID: number | null;\r\n fileNumber: string | null;\r\n matterCategory: string | null;\r\n matterType: string | null;\r\n title: string | null;\r\n activityID: number | null;\r\n activityDescription: string | null;\r\n chargeLevelID: number | null;\r\n chargeLevelDescription: string | null;\r\n client: string | null;\r\n itemDate: Date | null;\r\n startTimeSeconds: number | null;\r\n endTimeSeconds: number | null;\r\n timeWorkedSeconds: number | null;\r\n amount: number | null;\r\n chargeRate: number | null;\r\n units: number | null;\r\n note: string | null;\r\n isSynced: boolean | null;\r\n syncErrorID: number | null;\r\n syncErrorDescription: string | null;\r\n isIncomplete: boolean | null;\r\n status: string | null;\r\n duration: string | null;\r\n startTime: string | null;\r\n endTime: string | null;\r\n timesheetNote: string | null;\r\n\r\n}\r\n\r\nexport function retrieveTimesheetData(query: TimesheetQueryParams,\r\n refreshData: boolean,\r\n onSuccess: (data: TimesheetData) => 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.query({\r\n query: TimesheetData,\r\n variables: {\r\n offset: query.offset,\r\n first: query.first,\r\n filter: query.filter,\r\n startDate: query.startDate,\r\n endDate: query.endDate,\r\n timeslipStatus: query.timeslipStatus, \r\n feeEarnerId: query.feeEarnerId,\r\n includeNoMatter: query.includeNoMatter\r\n },\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\nconst TimesheetData = gql`\r\n query timeslipSummary(\r\n $startDate: DateTime, \r\n $endDate: DateTime, \r\n $timeslipStatus: Int, \r\n $filter: String, \r\n $offset: Int, \r\n $first: Int,\r\n $feeEarnerId: String,\r\n $includeNoMatter: Boolean\r\n ){\r\n timeslipSummary(\r\n startDate: $startDate, \r\n endDate: $endDate, \r\n timeslipStatus: $timeslipStatus, \r\n filter: $filter,\r\n offset: $offset, \r\n first: $first, \r\n source: \"ConnectWeb\", \r\n feeEarnerId: $feeEarnerId, \r\n includeNoMatter: $includeNoMatter\r\n ) {\r\n recordCount,\r\n timeSlipSummaryCounts {\r\n actualRowCountForSearch\r\n draftCount\r\n submittedCount\r\n totalCount\r\n },\r\n timeslipSummaries {\r\n id\r\n matterID\r\n fileNumber\r\n matterCategory\r\n matterType\r\n title\r\n activityID\r\n activityDescription\r\n chargeLevelID\r\n chargeLevelDescription\r\n client\r\n itemDate\r\n startTimeSeconds\r\n endTimeSeconds\r\n timeWorkedSeconds\r\n amount\r\n chargeRate\r\n units\r\n note\r\n isSynced\r\n syncErrorID\r\n syncErrorDescription\r\n isIncomplete\r\n timesheetNote\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport function retrieveTimeStatsData(query: TimeStatQueryParams,\r\n refreshData: boolean,\r\n onSuccess: (data: TimeStatData) => 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.query({\r\n query: TimsheetStats,\r\n variables: {\r\n startDate: query.startDate,\r\n endDate: query.endDate ,\r\n feeEarnerId: query.feeEarnerId \r\n },\r\n fetchPolicy: fetchPolicy\r\n })\r\n // tslint:disable-next-line:no-any\r\n .then((results: { data: any; }) => {\r\n\r\n // var data = {\r\n // timesheetStatistics: {\r\n // timesheetStatistics : [\r\n // {\r\n // timesheetDate: new Date(),\r\n // timeslipCount: 5,\r\n // chargeableTimeMins: 30,\r\n // nonChargeableTimeMins: 30,\r\n // notSubmittedCount: 5,\r\n // feeValue: 100\r\n // }\r\n // ]\r\n // }\r\n // };\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\nconst TimsheetStats = gql`\r\nquery timsheetStats($startDate: DateTime, $endDate: DateTime, $feeEarnerId: String) {\r\n timesheetStatistics(startDate: $startDate, endDate: $endDate, feeEarnerId: $feeEarnerId) {\r\n timesheetStatistics {\r\n timesheetDate\r\n timeslipCount\r\n chargeableTimeMins\r\n nonChargeableTimeMins\r\n notSubmittedCount\r\n incompleteCount\r\n feeValue\r\n pendingCount\r\n draftExcludingPendingCount\r\n }\r\n }\r\n }\r\n `;\r\n\r\nexport function retrieveDrafts(refreshData: boolean,\r\n onSuccess: (data: DraftData) => void,\r\n // tslint:disable-next-line:no-any\r\n onError: (reason: any) => void,\r\n includeDraft: boolean,\r\n includePending: boolean,\r\n feeEarnerId?: string\r\n )\r\n : void {\r\n var fetchPolicy: FetchPolicy = refreshData === true ? 'network-only' : 'cache-first';\r\n client.query({\r\n query: Drafts,\r\n variables: {\r\n feeEarnerId: feeEarnerId,\r\n includeDraft: includeDraft,\r\n includePending: includePending \r\n },\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\nconst Drafts = gql`\r\n query draftTimeslipQuery ($feeEarnerId: String, $includeDraft: Boolean, $includePending: Boolean) {\r\n draftTimeslips (feeEarnerId: $feeEarnerId, includePending: $includePending, includeDraft: $includeDraft){\r\n timeslipSummaries {\r\n itemDate\r\n timeWorkedSeconds\r\n matterID\r\n }\r\n }\r\n }`;\r\n \r\nexport function retrieveTimesheetSummaryData(query: TimeStatQueryParams,\r\n refreshData: boolean,\r\n onSuccess: (data: TimesheetSummaryData) => 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.query({\r\n query: TimesheetSummary,\r\n variables: {\r\n startDate: query.startDate,\r\n endDate: query.endDate,\r\n feeEarnerId: query.feeEarnerId \r\n },\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\nconst TimesheetSummary = gql`\r\nquery timesheetSummary($startDate: DateTime, $endDate: DateTime, $feeEarnerId: String) {\r\n timesheetSummary(startDate: $startDate, endDate: $endDate, feeEarnerId: $feeEarnerId) {\r\n summaries {\r\n date\r\n hasError\r\n totalForDaySeconds\r\n totalForDayUnits\r\n }\r\n }\r\n }`;\r\n\r\nexport interface MatterFinancialsQueryParams {\r\n matterId: number;\r\n}\r\n\r\nexport function retrieveMatterFinancials(query: MatterFinancialsQueryParams,\r\n refreshData: boolean,\r\n onSuccess: (data: MatterData) => 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.query({\r\n query: FinancialsInfoData,\r\n variables: {\r\n id: query.matterId \r\n },\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}","import { Theme, createStyles, makeStyles } from '@material-ui/core';\r\nimport { blue } from '@material-ui/core/colors';\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n timerWrapper: {\r\n paddingTop: 20,\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column'\r\n },\r\n heading: {\r\n backgroundColor: '#3a262614',\r\n padding: '10px 15px',\r\n },\r\n\r\n // timer card area\r\n cardRoot: {\r\n display: 'flex',\r\n margin: '15px 0',\r\n minHeight: '116px',\r\n },\r\n cardControl: {\r\n width: '80px',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n backgroundColor: '#a0a1a5',\r\n color: '#fff',\r\n '& .MuiIconButton-root': {\r\n color: '#fff',\r\n },\r\n },\r\n cardControlPlay: {\r\n backgroundColor: '#84c584',\r\n },\r\n cardControlStop: {\r\n backgroundColor: '#a0a1a5',\r\n },\r\n cardControlError: {\r\n backgroundColor: '#D8524B',\r\n },\r\n playCircle: {\r\n fontSize: '50px',\r\n },\r\n cardContent: {\r\n position: 'relative',\r\n display: 'flex',\r\n flex: 1,\r\n '& .details': {\r\n flex: 1,\r\n justifyContent: 'center',\r\n display: 'flex',\r\n flexFlow: 'column',\r\n '& .id': {\r\n color: '#cc1212',\r\n fontSize: '16px',\r\n marginBottom: '5px',\r\n },\r\n '& .title': {\r\n fontSize: '16px',\r\n marginBottom: '5px',\r\n },\r\n '& .description': {\r\n fontSize: '16px',\r\n marginBottom: '5px',\r\n },\r\n '& .error': {\r\n fontSize: '16px',\r\n marginBottom: '5px',\r\n color: '#cc1212'\r\n }\r\n },\r\n '& .time': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n '& .timeError': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n color: '#cc1212',\r\n justifyContent: 'center',\r\n },\r\n '& .timeRunning': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n },\r\n cardDetails: {\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'column',\r\n cursor: 'pointer'\r\n },\r\n loadingWrapper: {\r\n padding: '30px 0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flex: 1,\r\n },\r\n deleteButton: {\r\n position: 'absolute',\r\n top: '10px',\r\n right: '10px',\r\n },\r\n iconButton: {\r\n position: 'relative',\r\n },\r\n fabProgress: {\r\n color: blue[500],\r\n position: 'absolute',\r\n zIndex: 1,\r\n },\r\n hidePanelButton: {\r\n '& .ms-Panel-navigation': {\r\n '& .ms-Panel-closeButton': {\r\n display: 'none'\r\n }\r\n }\r\n },\r\n panel: {\r\n '& .ms-Panel-scrollableContent': {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n flex: 1,\r\n },\r\n '& .ms-Panel-content': {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n flex: 1,\r\n }\r\n },\r\n timeslipPageWrapper: {\r\n flex: 1,\r\n display: 'flex',\r\n justifyContent: 'center'\r\n }\r\n }),\r\n);\r\n","import { Card, CardContent, CircularProgress, IconButton, Typography } from '@material-ui/core';\r\nimport React from 'react';\r\nimport { useStyles } from './styles';\r\nimport Timer from 'react-compound-timer';\r\nimport PlayCircleOutlineIcon from '@material-ui/icons/PlayCircleOutline';\r\nimport PauseCircleOutlineIcon from '@material-ui/icons/PauseCircleOutline';\r\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\r\nimport classNames from 'classnames';\r\nimport DeleteOutlinedIcon from '@material-ui/icons/DeleteOutlined';\r\nimport DialogBox from '../Dashboard/Component/DialogBox';\r\n\r\ninterface TimerCardProps {\r\n id?: string;\r\n title: string | null;\r\n description?: string;\r\n initialTime?: number;\r\n isRunning: boolean;\r\n isTimeDisabled?: boolean;\r\n isLoading?: boolean;\r\n inError?: boolean;\r\n errorMessage?: string;\r\n fileNumber?: string | null;\r\n client?: string | null;\r\n matterCategory?: string | null;\r\n matterType?: string | null;\r\n onClick?: () => void;\r\n // tslint:disable-next-line: no-any\r\n // getTime?: (time: number, ) => void;\r\n onDrilldown?: (time: number) => void;\r\n // tslint:disable-next-line: no-any\r\n onDelete?: () => void;\r\n /** Function that will be called on timer start */\r\n onStart?: (time: number) => void;\r\n /** Function that will be called on timer resume */\r\n onResume?: (time: number) => void;\r\n /** Function that will be called on timer pause */\r\n onPause?: (time: number) => void;\r\n /** Function that will be called on timer stop */\r\n onStop?: (time: number) => void;\r\n /** Function that will be called on timer reaching 24 hours */\r\n onInvalidate?: (time: number) => void;\r\n}\r\n\r\ninterface TimerCardState {\r\n isInvalid: boolean;\r\n}\r\n\r\nexport const TimerCard: React.FC = (props) => {\r\n const classes = useStyles();\r\n // tslint:disable-next-line: no-any\r\n const timerRef = React.useRef();\r\n\r\n React.useEffect(() => {\r\n if (!props.isRunning) {\r\n timerRef.current.pause();\r\n } else {\r\n timerRef.current.start();\r\n }\r\n // tslint:disable-next-line: align\r\n }, [props.isRunning]);\r\n\r\n const formatTime = (value: number) => {\r\n if (value < 10) {\r\n return `0${value}`;\r\n }\r\n return `${value}`;\r\n };\r\n\r\n const onDrilldown = (time: number) => {\r\n if (props.onDrilldown) {\r\n return props.onDrilldown(time * 60);\r\n }\r\n };\r\n\r\n const [state, setState] = React.useState({\r\n isInvalid: false,\r\n });\r\n\r\n const [showConfirm, setShowConfirm] = React.useState(false);\r\n\r\n const onDelete = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n setShowConfirm(true);\r\n };\r\n\r\n const onDeleteConfirm = (agree: boolean) => {\r\n if (agree && props.onDelete) {\r\n props.onDelete();\r\n }\r\n setShowConfirm(false);\r\n };\r\n\r\n const getTimeDisplay = () => {\r\n if (props.initialTime && props.initialTime > 0) {\r\n let timeWorkedInSeconds = props.initialTime / (1000 * 60);\r\n let seconds = Math.ceil((timeWorkedInSeconds ?? 0) % 60);\r\n let minutes = Math.floor(((timeWorkedInSeconds ?? 0) / 60) % 60);\r\n let hours = Math.floor((timeWorkedInSeconds ?? 0) / 3600);\r\n let minutesString = '' + minutes;\r\n let secondsString = '' + seconds;\r\n \r\n if (seconds < 1) {\r\n secondsString = '00';\r\n } else if (seconds < 10) {\r\n secondsString = '0' + seconds;\r\n }\r\n \r\n if (minutes < 1) {\r\n minutesString = '00';\r\n } else if (minutes < 10) {\r\n minutesString = '0' + minutes;\r\n }\r\n \r\n let durationString = hours + ':' + minutesString + ':' + secondsString;\r\n return durationString;\r\n } else {\r\n return '00:00';\r\n } \r\n };\r\n\r\n return (\r\n <>\r\n {showConfirm && (\r\n \r\n )}\r\n
\r\n \r\n {/* tslint:disable-next-line: no-any */}\r\n {({ start, stop, getTime, pause, resume }: any) => {\r\n return (\r\n \r\n \r\n {props.inError ? (\r\n \r\n \r\n {props.isLoading && }\r\n \r\n ) : props.isRunning ? (\r\n {\r\n stop();\r\n if (props.onStop) {\r\n props.onStop(getTime());\r\n }\r\n }}\r\n disabled={props.isLoading}\r\n className={classes.iconButton}\r\n >\r\n \r\n {props.isLoading && }\r\n \r\n ) : (\r\n {\r\n start();\r\n if (props.onStart) {\r\n props.onStart(getTime());\r\n }\r\n }}\r\n disabled={props.isLoading}\r\n className={classes.iconButton}\r\n >\r\n \r\n {props.isLoading && }\r\n \r\n )}\r\n
\r\n
\r\n {\r\n // pause();\r\n onDrilldown(getTime());\r\n }}\r\n >\r\n
\r\n {/* File Number */} \r\n {props.title && props.fileNumber === undefined && (\r\n \r\n {props.title}\r\n \r\n )}\r\n {props.fileNumber && (\r\n \r\n {props.fileNumber}\r\n \r\n )}\r\n {props.client && (\r\n \r\n {props.client}\r\n \r\n )}\r\n {props.matterCategory && (\r\n \r\n {props.matterCategory} {props.title ? ' | ' + props.title : ''}\r\n \r\n )}\r\n {props.description && (\r\n \r\n {props.description}\r\n \r\n )}\r\n {props.errorMessage && (\r\n \r\n {props.errorMessage}\r\n \r\n )}\r\n
\r\n {!props.isTimeDisabled && !props.inError && (\r\n
\r\n \r\n {\r\n if (value > 0 && !state.isInvalid) {\r\n stop();\r\n if (props.onInvalidate) {\r\n props.onInvalidate(getTime());\r\n }\r\n setState({ isInvalid: true });\r\n }\r\n return '';\r\n }}\r\n />\r\n {/* The value will be 0 if the timer is not running. */}\r\n {props.isRunning \r\n ? (\r\n <>\r\n formatTime(value)} />\r\n :\r\n formatTime(value)} />\r\n \r\n ) \r\n : (\r\n <>\r\n {getTimeDisplay()}\r\n \r\n )\r\n } \r\n {props.isRunning && (\r\n <>\r\n :\r\n formatTime(value)} />\r\n \r\n )}\r\n \r\n
\r\n )}\r\n {props.inError && (\r\n
\r\n 24:00\r\n
\r\n )}\r\n {props.onDelete && (\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","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport * as React from 'react';\r\nimport '@ag-grid-community/all-modules/dist/styles/ag-grid.css';\r\nimport '@ag-grid-community/all-modules/dist/styles/ag-theme-material.css';\r\nimport { TimerContext } from '../contexts/TimerContext';\r\nimport { Panel, PanelType } from 'office-ui-fabric-react';\r\nimport { useStyles } from './styles';\r\nimport { Typography } from '@material-ui/core';\r\nimport _ from 'lodash';\r\nimport moment from 'moment';\r\nimport { useMutation, useQuery, useSubscription } from 'react-apollo';\r\nimport { showNotification } from '../App';\r\nimport { RvLoader } from '../components/Loader';\r\nimport TimeslipPage from '../timeslip/TimeslipPage';\r\nimport { TimerCard } from './TimerCard';\r\nimport { v4 } from 'uuid';\r\nimport {\r\n CreateTimerMutationParams,\r\n CreateTimerMutation,\r\n DeleteTimerMutationParams,\r\n DeleteTimerMutation,\r\n PauseTimerMutationParams,\r\n PauseTimerMutation,\r\n StartTimerMutationParams,\r\n StartTimerMutation,\r\n SubmitTimerMutationParams,\r\n SubmitTimerMutation,\r\n TimerNotificationSubscriptionData,\r\n TimerSummaryData,\r\n TimerSummaryElement,\r\n TimerSummaryParams,\r\n TimerSubscriptionNotification,\r\n UpdateTimerMutationParams,\r\n UpdateTimerMutation,\r\n TimerSummaryQuery,\r\n // fetchTimerSummary,\r\n} from './TimesheetTimerRepository';\r\nimport { useState } from 'react';\r\nimport { Systems, useTimeRecording } from '../hooks/useTimeRecording';\r\n// import { useCurrentUser } from '../hooks/useCurrentUser';\r\n// import 'moment-timezone';\r\n\r\ninterface TimesheetTimerDrawerProps {\r\n onClose?: () => void;\r\n open: boolean;\r\n}\r\n\r\ninterface TimesheetTimerDrawerState {\r\n // timers: TimerSummaryElement[];\r\n isTimeslipOpen: boolean;\r\n isCreateLoading: boolean;\r\n isDeleting: boolean;\r\n // tslint:disable-next-line: no-any\r\n selectedTimer: TimerSummaryElement | null | any;\r\n isNewTimer: boolean;\r\n timeRecordSystem: Systems | null;\r\n}\r\n\r\nconst TimesheetTimerDrawer: React.FC = (props) => {\r\n const classes = useStyles();\r\n\r\n // tslint:disable-next-line: no-any\r\n const { setTimerTotal, setInitialTimerTotal } = React.useContext(TimerContext);\r\n\r\n const timerNotification = useSubscription(TimerSubscriptionNotification); \r\n\r\n // tslint:disable-next-line: no-any\r\n const [createTimerMutation, createTimerMutationObj] = useMutation(CreateTimerMutation);\r\n\r\n // tslint:disable-next-line: no-any\r\n const [updateTimerMutation, updateTimerMutationObj] = useMutation(UpdateTimerMutation);\r\n\r\n // tslint:disable-next-line: no-any\r\n const [deleteTimerMutation, deleteTimerMutationObj] = useMutation(DeleteTimerMutation);\r\n\r\n // tslint:disable-next-line: no-any\r\n const [startTimerMutation, startTimerMutationObj] = useMutation(StartTimerMutation);\r\n\r\n // tslint:disable-next-line: no-any\r\n const [submitTimerMutation, submitTimerMutationObj] = useMutation(SubmitTimerMutation);\r\n\r\n // tslint:disable-next-line: no-any\r\n const [pauseTimerMutation, pauseTimerMutationObj] = useMutation(PauseTimerMutation);\r\n\r\n const timeRecording = useTimeRecording();\r\n\r\n // const [isLoading] = useState(false);\r\n \r\n const [state, setState] = useState({\r\n isTimeslipOpen: false,\r\n // timers: [],\r\n isCreateLoading: false,\r\n selectedTimer: null,\r\n isNewTimer: false,\r\n timeRecordSystem: null,\r\n isDeleting: false\r\n });\r\n\r\n const [timers, setTimers] = useState([]);\r\n\r\n const timerSummaryQuery = useQuery(TimerSummaryQuery, {\r\n variables: {\r\n filter: '',\r\n first: 1000,\r\n offset: 0,\r\n },\r\n fetchPolicy: 'network-only',\r\n });\r\n\r\n // get the difference between system timezone and local timezone\r\n // const getSecondsDifferenceBetweenLocalAndDefaultTimezone = () => {\r\n // const sydneyOffsetInSeconds = moment().tz('Australia/Sydney').utcOffset();\r\n // const localOffsetInSeconds = moment().utcOffset();\r\n\r\n // const SecondsDifference = sydneyOffsetInSeconds - localOffsetInSeconds;\r\n\r\n // return SecondsDifference;\r\n // };\r\n\r\n React.useEffect(() => {\r\n if (!timeRecording.loading && timeRecording.data && !timeRecording.error) {\r\n const { systems } = timeRecording.data.settings;\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n timeRecordSystem: systems,\r\n };\r\n });\r\n }\r\n // tslint:disable-next-line: align\r\n }, [timeRecording.data, timeRecording.loading, timeRecording.error]);\r\n \r\n React.useMemo(() => {\r\n if (!timerSummaryQuery.loading && timerSummaryQuery.data && !timerSummaryQuery.error) {\r\n\r\n const { timerSummaries } = timerSummaryQuery.data.timerSummary;\r\n\r\n const tempTimers = _.map(timerSummaries, (item) => {\r\n if (item.isRunning && item.lastStarted) {\r\n const lastStarted = moment(item.lastStarted);\r\n\r\n const currentDate = moment(); // .add('hours', 2); // temporary set to add 2 hours, need to be fixed\r\n\r\n // const SecondsDiff = getSecondsDifferenceBetweenLocalAndDefaultTimezone();\r\n\r\n // if (SecondsDiff > 0) {\r\n // currentDate.add(SecondsDiff, 'Seconds');\r\n // } else if (SecondsDiff < 0) {\r\n // currentDate.subtract(Math.abs(SecondsDiff), 'Seconds');\r\n // }\r\n\r\n const timeDuration = moment.duration(currentDate.diff(lastStarted));\r\n\r\n // Add the calcuated time duration with the existing timeWorkedSeconds. When starting the timer, we don't calculate the timeWorkedSeconds.\r\n const totalWorkedSeconds = (item.timeWorkedSeconds ? item.timeWorkedSeconds : 0) + timeDuration.asSeconds();\r\n\r\n // stateItem.timeWorkedSeconds = totalWorkedSeconds;\r\n item.timeWorkedSecondsTemp = totalWorkedSeconds;\r\n\r\n if (item.timeWorkedSecondsTemp && item.timeWorkedSecondsTemp >= 24 * 60 * 60) {\r\n item.timeWorkedSecondsTemp = 24 * 60 * 60;\r\n item.inError = true;\r\n item.errorMessage = 'Timer must be less than 24 hours';\r\n item.isRunning = false;\r\n }\r\n } else {\r\n item.timeWorkedSecondsTemp = item.timeWorkedSeconds;\r\n }\r\n return item;\r\n });\r\n\r\n setTimers(tempTimers);\r\n\r\n setInitialTimerTotal(tempTimers.length);\r\n\r\n }\r\n }, [timerSummaryQuery.loading, timerSummaryQuery.data, timerSummaryQuery.error]);\r\n\r\n React.useEffect(() => {\r\n if (!timerNotification.error && !timerNotification.loading && timerNotification.data) {\r\n // tslint:disable-next-line: no-console\r\n if (timerNotification.data.timerNotification.status) {\r\n // tslint:disable-next-line: no-console\r\n\r\n const message = timerNotification.data.timerNotification.message.toLowerCase();\r\n\r\n if (message.includes('created successfully')) {\r\n\r\n setTimerTotal(1, 'add');\r\n \r\n let tempTimers = timers;\r\n tempTimers[tempTimers.length - 1].timerGuid = timerNotification.data.timerNotification.timerGuid;\r\n\r\n setTimers(tempTimers);\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isCreateLoading: false,\r\n };\r\n });\r\n } \r\n\r\n if (message.includes('deleted successfully') || message.includes('submitted successfully')) {\r\n setTimerTotal(1, 'minus');\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isDeleting: false,\r\n };\r\n });\r\n } \r\n \r\n if (!message.includes('paused successfully') \r\n && !message.includes('started successfully')) {\r\n // tslint:disable-next-line: no-console\r\n // Refresh the data again\r\n // Don't refresh on start/ pause.\r\n timerSummaryQuery.refetch();\r\n }\r\n } else {\r\n showNotification('Failed', timerNotification.data.timerNotification.message, 'error');\r\n }\r\n } else if (timerNotification.error) {\r\n showNotification('Failed', timerNotification.error.message, 'error');\r\n }\r\n // tslint:disable-next-line: align\r\n }, [timerNotification.data, timerNotification.loading, timerNotification.error]);\r\n\r\n React.useEffect(() => {\r\n if (!createTimerMutationObj.loading && !createTimerMutationObj.error && createTimerMutationObj.data) {\r\n // showNotification(null, 'Create timer request submitted', 'info');\r\n // increment total timer in the DrawerContext;\r\n // setTimerTotal(1, 'add');\r\n } else if (createTimerMutationObj.error) {\r\n showNotification('Create timer request failed', createTimerMutationObj.error.message, 'error');\r\n }\r\n // tslint:disable-next-line\r\n }, [createTimerMutationObj.loading, createTimerMutationObj.data, createTimerMutationObj.error]);\r\n\r\n React.useEffect(() => {\r\n if (!updateTimerMutationObj.loading && !updateTimerMutationObj.error && updateTimerMutationObj.data) {\r\n // showNotification(null, 'update timer request submitted', 'info');\r\n } else if (updateTimerMutationObj.error) {\r\n showNotification('update timer request failed', updateTimerMutationObj.error.message, 'error');\r\n }\r\n // tslint:disable-next-line: align\r\n }, [updateTimerMutationObj.loading, updateTimerMutationObj.data, updateTimerMutationObj.error]);\r\n\r\n React.useEffect(() => {\r\n if (!deleteTimerMutationObj.loading && !deleteTimerMutationObj.error && deleteTimerMutationObj.data) {\r\n // showNotification(null, 'Delete timer request submitted', 'info');\r\n // decrement total timer in the DrawerContext;\r\n // setTimerTotal(1, 'minus');\r\n } else if (deleteTimerMutationObj.error) {\r\n showNotification('Delete timer request failed', deleteTimerMutationObj.error.message, 'error');\r\n }\r\n // tslint:disable-next-line: align\r\n }, [deleteTimerMutationObj.loading, deleteTimerMutationObj.data, deleteTimerMutationObj.error]);\r\n\r\n React.useEffect(() => {\r\n if (!startTimerMutationObj.loading && !startTimerMutationObj.error && startTimerMutationObj.data) {\r\n // showNotification(null, 'Start timer request submitted', 'info');\r\n } else if (startTimerMutationObj.error) {\r\n showNotification('Start timer request failed', startTimerMutationObj.error.message, 'error');\r\n }\r\n // tslint:disable-next-line: align\r\n }, [startTimerMutationObj.loading, startTimerMutationObj.data, startTimerMutationObj.error]);\r\n\r\n React.useEffect(() => {\r\n if (!pauseTimerMutationObj.loading && !pauseTimerMutationObj.error && pauseTimerMutationObj.data) {\r\n // showNotification(null, 'Pause timer request submitted', 'info');\r\n } else if (pauseTimerMutationObj.error) {\r\n showNotification('Pause timer request failed', pauseTimerMutationObj.error.message, 'error');\r\n }\r\n // tslint:disable-next-line: align\r\n }, [pauseTimerMutationObj.loading, pauseTimerMutationObj.data, pauseTimerMutationObj.error]);\r\n\r\n React.useEffect(() => {\r\n const timer = setTimeout(() => {\r\n // Code to be executed after the specified delay\r\n timerSummaryQuery.refetch();\r\n\r\n if (!submitTimerMutationObj.loading && !submitTimerMutationObj.error && submitTimerMutationObj.data) {\r\n // showNotification(null, 'submit timer request submitted', 'info'); \r\n } else if (submitTimerMutationObj.error) {\r\n showNotification('submit timer request failed', submitTimerMutationObj.error.message, 'error');\r\n }\r\n }, 1000); // Delay of 1000 milliseconds (1 seconds)\r\n\r\n return () => {\r\n clearTimeout(timer);\r\n };\r\n // tslint:disable-next-line: align\r\n }, [submitTimerMutationObj.loading, submitTimerMutationObj.data, submitTimerMutationObj.error]);\r\n\r\n const createNewTimer = () => {\r\n if (!state.isCreateLoading) {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isCreateLoading: true,\r\n };\r\n });\r\n\r\n var guid = v4();\r\n // let tempDefaultTimer = prevState.defaultTimer;\r\n\r\n const tempTimers = _.map(timers, (item) => {\r\n if (item.isRunning) {\r\n\r\n const currentDate = new Date();\r\n const timeWorkedSecondsRunning = moment.duration(moment(currentDate).diff(item.lastStarted)).asSeconds();\r\n item.isRunning = false;\r\n var currentSecs = item.timeWorkedSeconds ?? 0;\r\n item.timeWorkedSeconds = timeWorkedSecondsRunning + currentSecs;\r\n item.timeWorkedSecondsTemp = timeWorkedSecondsRunning + currentSecs;\r\n \r\n pauseTimerMutation({\r\n variables: {\r\n pauseDateTime: currentDate,\r\n timerGuid: item.timerGuid,\r\n },\r\n });\r\n }\r\n\r\n return item;\r\n });\r\n\r\n tempTimers.push({\r\n isRunning: true,\r\n activityDescription: null,\r\n activityId: null,\r\n chargeRate: null,\r\n chargeRateId: null,\r\n billingNote: null,\r\n client: null,\r\n fileNumber: null,\r\n matterCategory: null,\r\n matterId: null,\r\n matterType: null,\r\n timesheetNote: null,\r\n timeWorkedSeconds: 0,\r\n timeWorkedSecondsTemp: 0,\r\n title: null,\r\n timerGuid: guid,\r\n lastStarted: new Date(),\r\n inError: false,\r\n errorMessage: null,\r\n units: 0\r\n });\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isCreateLoading: false,\r\n };\r\n });\r\n\r\n setTimers(tempTimers); \r\n\r\n // setState((prevState) => { \r\n // return {\r\n // ...prevState,\r\n // timers: tempTimers,\r\n // };\r\n // });\r\n\r\n createTimerMutation({\r\n variables: {\r\n createdDate: new Date(),\r\n timeWorkedSeconds: 0,\r\n matterId: null,\r\n activityId: null,\r\n chargeRateId: null,\r\n chargeRate: null,\r\n timesheetNote: null,\r\n billingNote: null,\r\n timeUnits: null,\r\n isRunning: true,\r\n timerGuid: guid\r\n },\r\n });\r\n }\r\n };\r\n\r\n const onPlayTimer = (timerGuid: string | null, currentTime: number) => {\r\n const tempTimers = _.map(timers, (item) => {\r\n if (item.isRunning) {\r\n const currentDate = new Date();\r\n const timeWorkedSecondsRunning = Math.ceil(moment.duration(moment(currentDate).diff(item.lastStarted)).asSeconds());\r\n item.isRunning = false;\r\n var currentSecs = item.timeWorkedSeconds ?? 0;\r\n item.timeWorkedSeconds = timeWorkedSecondsRunning + currentSecs;\r\n item.timeWorkedSecondsTemp = timeWorkedSecondsRunning + currentSecs;\r\n pauseTimerMutation({\r\n variables: {\r\n pauseDateTime: new Date(),\r\n timerGuid: item.timerGuid,\r\n },\r\n });\r\n }\r\n\r\n return item;\r\n });\r\n\r\n const index = tempTimers.findIndex((time: TimerSummaryElement) => time.timerGuid === timerGuid);\r\n\r\n if (index >= 0) {\r\n tempTimers[index].isRunning = true;\r\n tempTimers[index].lastStarted = moment().toDate();\r\n tempTimers[index].timeWorkedSeconds = currentTime;\r\n tempTimers[index].timeWorkedSecondsTemp = currentTime;\r\n // tempTimers[index].timeWorkedSeconds = currentTime / 1000 / 60;\r\n }\r\n\r\n startTimerMutation({\r\n variables: {\r\n startDateTime: new Date(),\r\n timerGuid: timerGuid ? timerGuid : null,\r\n },\r\n });\r\n\r\n // timers = map timers\r\n // update specific timer\r\n // \r\n\r\n setTimers(tempTimers);\r\n };\r\n\r\n const onStopTimer = (timerGuid: string | null, currentTime: number) => {\r\n let tempTimers = timers;\r\n const index = timers.findIndex((time: TimerSummaryElement) => time.timerGuid === timerGuid);\r\n\r\n if (index >= 0) {\r\n tempTimers[index].isRunning = false;\r\n tempTimers[index].timeWorkedSeconds = currentTime;\r\n tempTimers[index].timeWorkedSecondsTemp = currentTime;\r\n }\r\n\r\n pauseTimerMutation({\r\n variables: {\r\n pauseDateTime: new Date(),\r\n timerGuid: timerGuid,\r\n },\r\n });\r\n\r\n setTimers(tempTimers);\r\n };\r\n\r\n const onInvalidateTimer = (timerGuid: string | null) => {\r\n let tempTimers = timers;\r\n\r\n const index = tempTimers.findIndex((time: TimerSummaryElement) => time.timerGuid === timerGuid);\r\n\r\n if (index >= 0) {\r\n var isRunning = tempTimers[index].isRunning;\r\n tempTimers[index].timeWorkedSeconds = tempTimers[index].timeWorkedSecondsTemp;\r\n if (isRunning) {\r\n pauseTimerMutation({\r\n variables: {\r\n pauseDateTime: new Date(),\r\n timerGuid: timerGuid,\r\n },\r\n });\r\n }\r\n\r\n tempTimers[index].isRunning = false;\r\n // tempTimers[index].timeWorkedSeconds = currentTime / 1000 / 60;\r\n\r\n tempTimers[index].timeWorkedSeconds = 24 * 60;\r\n tempTimers[index].inError = true;\r\n tempTimers[index].errorMessage = 'Timer must be less than 24 hours';\r\n }\r\n\r\n setTimers(tempTimers);\r\n };\r\n\r\n const onPlay = (timerGuid: string | null) => (currentTime: number) => {\r\n onPlayTimer(timerGuid, Math.floor(currentTime / 1000));\r\n };\r\n\r\n const onStop = (timerGuid: string | null) => (currentTime: number) => {\r\n\r\n onStopTimer(timerGuid, Math.floor(currentTime / 1000));\r\n };\r\n\r\n const onInvalidate = (timerGuid: string | null) => (currentTime: number) => {\r\n onInvalidateTimer(timerGuid);\r\n };\r\n\r\n const onToggleTimer = (selectedTimer?: TimerSummaryElement) => {\r\n if (selectedTimer) {\r\n if (selectedTimer.isRunning) {\r\n onStopTimer(selectedTimer.timerGuid, selectedTimer.timeWorkedSecondsTemp ?? 0);\r\n } else {\r\n onPlayTimer(selectedTimer.timerGuid, selectedTimer.timeWorkedSecondsTemp ?? 0);\r\n }\r\n }\r\n };\r\n\r\n const onSubmitTimerAsDraft = (selectedTimer?: TimerSummaryElement) => {\r\n if (selectedTimer) {\r\n\r\n submitTimerMutation({\r\n variables: {\r\n timerGuid: selectedTimer.timerGuid,\r\n isSubmitAndSync: false,\r\n timeWorkedSeconds: selectedTimer.timeWorkedSeconds ? Math.ceil(selectedTimer.timeWorkedSeconds) : selectedTimer.timeWorkedSeconds,\r\n matterId: selectedTimer.matterId,\r\n activityId: selectedTimer.activityId,\r\n chargeRateId: selectedTimer.chargeRateId,\r\n chargeRate: selectedTimer.chargeRate,\r\n timesheetNote: selectedTimer.timesheetNote,\r\n billingNote: selectedTimer.billingNote,\r\n timeUnits: selectedTimer.units\r\n },\r\n });\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isTimeslipOpen: false,\r\n };\r\n });\r\n }\r\n };\r\n\r\n const onSubmitTimer = (selectedTimer?: TimerSummaryElement) => {\r\n if (selectedTimer) {\r\n\r\n submitTimerMutation({\r\n variables: {\r\n timerGuid: selectedTimer.timerGuid,\r\n isSubmitAndSync: true,\r\n timeWorkedSeconds: selectedTimer.timeWorkedSeconds ? Math.ceil(selectedTimer.timeWorkedSeconds) : selectedTimer.timeWorkedSeconds,\r\n matterId: selectedTimer.matterId,\r\n activityId: selectedTimer.activityId,\r\n chargeRateId: selectedTimer.chargeRateId,\r\n chargeRate: selectedTimer.chargeRate,\r\n timesheetNote: selectedTimer.timesheetNote,\r\n billingNote: selectedTimer.billingNote,\r\n timeUnits: selectedTimer.units\r\n },\r\n });\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isTimeslipOpen: false,\r\n };\r\n });\r\n }\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onDelete = (timerGuid: string | null) => () => {\r\n if (timerGuid) {\r\n\r\n let tempTimers = timers;\r\n\r\n const index = tempTimers.findIndex((time: TimerSummaryElement) => time.timerGuid === timerGuid);\r\n\r\n tempTimers.splice(index, 1);\r\n\r\n setTimers(tempTimers);\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isDeleting: true,\r\n };\r\n });\r\n\r\n deleteTimerMutation({\r\n variables: {\r\n timerGuid: timerGuid,\r\n },\r\n });\r\n }\r\n };\r\n\r\n const onDrilldown = (timerGuid: string | null, isCreate: boolean) => (currentTime: number) => {\r\n if (isCreate) {\r\n createNewTimer();\r\n } else if (!isCreate && timerGuid) {\r\n const tempTimers = timers;\r\n const index = tempTimers.findIndex((time: TimerSummaryElement) => time.timerGuid === timerGuid);\r\n\r\n // if (index >= 0 && tempTimers[index] && tempTimers[index].isRunning === true) {\r\n\r\n // const currentDate = moment(); // .add('hours', 2); // temporary set to add 2 hours, need to be fixed\r\n\r\n // // const SecondsDiff = getSecondsDifferenceBetweenLocalAndDefaultTimezone();\r\n\r\n // // if (SecondsDiff > 0) {\r\n // // currentDate.add(SecondsDiff, 'Seconds');\r\n // // } else if (SecondsDiff < 0) {\r\n // // currentDate.subtract(Math.abs(SecondsDiff), 'Seconds');\r\n // // }\r\n\r\n // const timeWorkedSecondsRunning = moment.duration(moment(currentDate).diff(tempTimers[index].lastStarted)).asSeconds();\r\n\r\n // // Add the calcuated time duration with the existing timeWorkedSeconds. When starting the timer, we don't calculate the timeWorkedSeconds.\r\n // const existingTimeWorked = tempTimers[index].timeWorkedSecondsTemp ? tempTimers[index].timeWorkedSecondsTemp : 0;\r\n // const totalWorkedSeconds = (existingTimeWorked ? existingTimeWorked : 0) + timeWorkedSecondsRunning;\r\n\r\n // // tempTimers[index].timeWorkedSeconds = totalWorkedSeconds;\r\n // tempTimers[index].timeWorkedSecondsTemp = totalWorkedSeconds;\r\n // }\r\n if (index >= 0 && tempTimers[index] && tempTimers[index].isRunning === true) {\r\n tempTimers[index].timeWorkedSecondsTemp = Math.floor(currentTime / 1000 / 60);\r\n tempTimers[index].timeWorkedSeconds = Math.floor(currentTime / 1000 / 60);\r\n }\r\n\r\n setTimers(tempTimers);\r\n\r\n setState((prevState) => {\r\n // let tempTimers = prevState.timers;\r\n return {\r\n ...prevState,\r\n isTimeslipOpen: true, \r\n selectedTimer: tempTimers[index],\r\n isNewTimer: tempTimers[index].timerGuid === null,\r\n };\r\n });\r\n }\r\n };\r\n\r\n const onCloseTimeslip = () => {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isTimeslipOpen: false,\r\n };\r\n });\r\n };\r\n\r\n const onUpdateAction = (timeslip: TimerSummaryElement, timerGuid?: string) => {\r\n if (timerGuid && timerGuid.length > 0) {\r\n let tempTimers = timers;\r\n\r\n const index = tempTimers.findIndex((time: TimerSummaryElement) => time.timerGuid === timerGuid);\r\n\r\n if (index >= 0) {\r\n tempTimers[index] = {\r\n ...tempTimers[index],\r\n ...timeslip,\r\n };\r\n tempTimers[index].activityDescription = timeslip.activityDescription;\r\n tempTimers[index].activityId = timeslip.activityId;\r\n tempTimers[index].chargeRate = timeslip.chargeRate;\r\n tempTimers[index].client = timeslip.client;\r\n tempTimers[index].fileNumber = timeslip.fileNumber;\r\n tempTimers[index].isRunning = false;\r\n tempTimers[index].matterCategory = timeslip.matterCategory;\r\n tempTimers[index].matterId = timeslip.matterId;\r\n tempTimers[index].matterType = timeslip.matterType;\r\n tempTimers[index].timesheetNote = timeslip.timesheetNote;\r\n tempTimers[index].title = timeslip.title;\r\n tempTimers[index].isRunning = timeslip.isRunning;\r\n\r\n if (timeslip.timeWorkedSeconds !== null && timeslip.timeWorkedSeconds !== 0) {\r\n tempTimers[index].timeWorkedSeconds = timeslip.timeWorkedSecondsTemp;\r\n tempTimers[index].timeWorkedSecondsTemp = timeslip.timeWorkedSecondsTemp;\r\n }\r\n \r\n tempTimers[index].billingNote = timeslip.billingNote;\r\n\r\n }\r\n\r\n updateTimerMutation({\r\n variables: {\r\n timerGuid: timerGuid,\r\n endDate: null,\r\n timeWorkedSeconds: timeslip.timeWorkedSeconds ? Math.floor(timeslip.timeWorkedSeconds) : timeslip.timeWorkedSeconds,\r\n matterId: timeslip.matterId,\r\n activityId: timeslip.activityId,\r\n chargeRateId: timeslip.chargeRateId,\r\n chargeRate: timeslip.chargeRate,\r\n timesheetNote: timeslip.timesheetNote,\r\n billingNote: timeslip.billingNote,\r\n timeUnits: timeslip.units,\r\n },\r\n });\r\n\r\n setTimers(tempTimers);\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n selectedTimerGuid: null,\r\n isTimeslipOpen: false,\r\n };\r\n });\r\n }\r\n };\r\n\r\n const onCreateAction = (timeslip: TimerSummaryElement, timerGuid?: string) => {\r\n let tempTimers = timers;\r\n\r\n const index = tempTimers.findIndex((time: TimerSummaryElement) => time.timerGuid === timerGuid);\r\n\r\n if (index >= 0) {\r\n tempTimers[index] = {\r\n ...tempTimers[index],\r\n ...timeslip,\r\n };\r\n tempTimers[index].activityDescription = timeslip.activityDescription;\r\n tempTimers[index].activityId = timeslip.activityId;\r\n tempTimers[index].chargeRate = timeslip.chargeRate;\r\n tempTimers[index].client = timeslip.client;\r\n tempTimers[index].fileNumber = timeslip.fileNumber;\r\n tempTimers[index].isRunning = false;\r\n tempTimers[index].matterCategory = timeslip.matterCategory;\r\n tempTimers[index].matterId = timeslip.matterId;\r\n tempTimers[index].matterType = timeslip.matterType;\r\n tempTimers[index].timesheetNote = timeslip.timesheetNote;\r\n tempTimers[index].title = timeslip.title;\r\n tempTimers[index].isRunning = timeslip.isRunning;\r\n tempTimers[index].timeWorkedSeconds = timeslip.timeWorkedSeconds;\r\n tempTimers[index].timeWorkedSecondsTemp = timeslip.timeWorkedSeconds;\r\n tempTimers[index].billingNote = timeslip.billingNote;\r\n\r\n }\r\n\r\n createTimerMutation({\r\n variables: {\r\n isRunning: true,\r\n timeWorkedSeconds: timeslip.timeWorkedSeconds,\r\n matterId: timeslip.matterId,\r\n activityId: timeslip.activityId,\r\n chargeRateId: timeslip.chargeRateId,\r\n chargeRate: timeslip.chargeRate,\r\n timesheetNote: timeslip.timesheetNote,\r\n billingNote: timeslip.billingNote,\r\n timeUnits: timeslip.units,\r\n createdDate: new Date(),\r\n timerGuid: timerGuid ? timerGuid : null\r\n },\r\n });\r\n\r\n setTimers(tempTimers);\r\n\r\n setState((prevState) => { \r\n return {\r\n ...prevState,\r\n // timers: tempTimers,\r\n selectedTimerGuid: null,\r\n isTimeslipOpen: false,\r\n };\r\n });\r\n };\r\n\r\n const onUpdateTimerAction = (timeslip: TimerSummaryElement, timerGuid?: string, newTimer?: boolean) => {\r\n if (newTimer) {\r\n onCreateAction(timeslip, timerGuid);\r\n } else {\r\n onUpdateAction(timeslip, timerGuid);\r\n }\r\n };\r\n\r\n const groupTimerByDate = () => {\r\n if (timers.length > 0) {\r\n let timerByDate = {};\r\n timers.forEach((timer: TimerSummaryElement) => {\r\n const _date = moment(timer.lastStarted).format('YYYY-MM-DD');\r\n if (timerByDate[_date]) {\r\n timerByDate[_date].push(timer);\r\n } else {\r\n timerByDate[_date] = [timer];\r\n }\r\n });\r\n\r\n return timerByDate;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n const getTimersByDate = () => {\r\n const timerByDate = groupTimerByDate();\r\n\r\n if (Object.keys(timerByDate).length > 0) {\r\n const dateGroups = Object.keys(timerByDate).sort((a: string, b: string) => {\r\n return b.localeCompare(a);\r\n });\r\n\r\n return dateGroups.map((group: string) => {\r\n const timersList = timerByDate[group];\r\n\r\n const isCurrentDate = moment(group).isSame(new Date(), 'day');\r\n\r\n return (\r\n
\r\n
\r\n \r\n {isCurrentDate ? 'Today' : moment(group).format('MMM DD, YYYY')}\r\n \r\n
\r\n {timersList.map((data: TimerSummaryElement, index: number) => {\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n });\r\n }\r\n\r\n return
;\r\n };\r\n\r\n const onDimissPanel = () => {\r\n if (!state.isTimeslipOpen && props.onClose) {\r\n props.onClose();\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {state.isTimeslipOpen && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n <>\r\n {\r\n state.isDeleting\r\n ? (\r\n
\r\n \r\n
\r\n ) \r\n :\r\n \r\n }\r\n \r\n <>\r\n {\r\n timerSummaryQuery.loading \r\n ? (\r\n
\r\n \r\n
\r\n ) \r\n :\r\n timers.length === 0 \r\n ? (\r\n \r\n No Pending Timers\r\n \r\n )\r\n : getTimersByDate()\r\n }\r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(TimesheetTimerDrawer);","import jwt_decode from 'jwt-decode';\r\nimport { appInsights } from '../infrastructure/ApplicationInsights';\r\n\r\nexport abstract class UserFeature {\r\n\r\n // tslint:disable-next-line:no-any\r\n public static get UserId(): any {\r\n if (this.userId === '') {\r\n this.Init();\r\n }\r\n return this.userId;\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n public static get Tenant(): any {\r\n if (this.tenantId === '') {\r\n this.Init();\r\n }\r\n return this.tenantId;\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private static userId: any = '';\r\n // tslint:disable-next-line:no-any\r\n private static tenantId: any = '';\r\n\r\n private static features: string[] = [];\r\n \r\n public static Init() {\r\n const accessToken = sessionStorage.getItem('accessToken');\r\n if (accessToken) {\r\n // tslint:disable-next-line:no-any\r\n let token: any = jwt_decode('' + accessToken);\r\n this.userId = token.sub;\r\n this.tenantId = token.tenantid;\r\n if (token.features) {\r\n this.features = token.features.split(',');\r\n } \r\n }\r\n }\r\n\r\n public static Clear() {\r\n this.features = [];\r\n this.tenantId = '';\r\n this.userId = '';\r\n }\r\n\r\n public static HasAccess(userFeature: UserFeatureEnum): boolean {\r\n return this.checkAndTrackFeature(userFeature);\r\n }\r\n\r\n public static LogFeatureUsage(feature: string) {\r\n appInsights.trackEvent({ name: 'Feature Access', properties: { \r\n tenantId : this.Tenant,\r\n userId: this.UserId,\r\n feature: feature\r\n } });\r\n }\r\n\r\n private static checkAndTrackFeature(feature: number): boolean { \r\n if (this.features.length === 0) {\r\n this.Init();\r\n }\r\n var hasAccess = this.features.includes(feature.toString());\r\n if (hasAccess) {\r\n appInsights.trackEvent({ name: 'Feature Access', properties: { \r\n tenantId : this.Tenant,\r\n userId: this.UserId,\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n feature: feature\r\n } });\r\n }\r\n return hasAccess;\r\n } \r\n}\r\n\r\nexport enum UserFeatureEnum {\r\n hasAdminDashboard = 1,\r\n hasBilledFeesVsEstimateTotalChart = 2,\r\n hasCriticalDateStream = 3,\r\n hasExpectedFutureFeesByMatterTypeChart = 4,\r\n hasExpectedFutureFeesByMatterCategoryChart = 5,\r\n hasExpectedFutureFeesByMatterCategoryAndTypeChart = 6,\r\n hasExpectedFutureFeesByResponsibleChart = 7,\r\n hasExpectedFutureFeesByActingChart = 8,\r\n hasExpectedFutureFeesByPropertyChart = 9,\r\n hasMatterActivityStream = 10,\r\n hasMatterCountByMatterTypeChart = 11,\r\n hasMatterCountByPropertyChart = 12,\r\n hasMatterCountByMatterCategoryChart = 13,\r\n hasMatterCountByMatterCategoryAndTypeChart = 14,\r\n hasMatterCountByResponsibleChart = 15,\r\n hasMatterCountByActingChart = 16,\r\n hasMatterDocument = 17,\r\n hasMattersByStatusChart = 18,\r\n hasMattersOpenedChart = 19,\r\n hasTotalOwingChart = 20,\r\n hasEstimatePerformanceChart = 21,\r\n hasUnbilledFeesByMatterTypeChart = 22,\r\n hasUnbilledFeesByPropertyChart = 23,\r\n hasUnbilledFeesByMatterCategoryChart = 24,\r\n hasUnbilledFeesByMatterCategoryAndTypeChart = 25,\r\n hasUnbilledFeesByResponsibleChart = 26,\r\n hasUnbilledFeesByActingChart = 27,\r\n hasUnbilledDisbursementsByMatterTypeChart = 28,\r\n hasUnbilledDisbursementsByPropertyChart = 29,\r\n hasUnbilledDisbursementsByMatterCategoryChart = 30,\r\n hasUnbilledDisbursementsByMatterCategoryAndTypeChart = 31,\r\n hasUnbilledDisbursementsByResponsibleChart = 32,\r\n hasUnbilledDisbursementsByActingChart = 33,\r\n hasDebtOwingByMatterTypeChart = 34,\r\n hasDebtOwingByPropertyChart = 35,\r\n hasDebtOwingByMatterCategoryChart = 36,\r\n hasDebtOwingByMatterCategoryAndTypeChart = 37,\r\n hasDebtOwingByResponsibleChart = 38,\r\n hasDebtOwingByActingChart = 39,\r\n hasMattersVsAverageChart = 40,\r\n hasMattersByPeriodByMatterTypeChart = 41,\r\n hasMattersByPeriodByMatterCategoryChart = 42,\r\n hasMattersByPeriodByMatterCategoryAndTypeChart = 43,\r\n hasMattersByPeriodByResponsibleChart = 44,\r\n hasMattersByPeriodByActingChart = 45,\r\n hasMattersByPeriodByPropertyChart = 46,\r\n hasMattersByPeriod3ByMatterTypeChart = 47,\r\n hasMattersByPeriod3ByMatterCategoryChart = 48,\r\n hasMattersByPeriod3ByMatterCategoryAndTypeChart = 49,\r\n hasMattersByPeriod3ByResponsibleChart = 50,\r\n hasMattersByPeriod3ByActingChart = 51,\r\n hasMattersByPeriod3ByPropertyChart = 52,\r\n hasMattersByPeriod7ByMatterTypeChart = 53,\r\n hasMattersByPeriod7ByMatterCategoryChart = 54,\r\n hasMattersByPeriod7ByMatterCategoryAndTypeChart = 55,\r\n hasMattersByPeriod7ByResponsibleChart = 56,\r\n hasMattersByPeriod7ByActingChart = 57,\r\n hasMattersByPeriod7ByPropertyChart = 58,\r\n hasAgedUnbilledFeesChart = 60,\r\n hasClosedMattersChart = 62,\r\n hasAverageBilledFeesClosedByMatterTypeChart = 63,\r\n hasAverageBilledFeesClosedByPropertyChart = 64,\r\n hasAverageBilledFeesClosedByMatterCategoryChart = 65,\r\n hasAverageBilledFeesClosedByMatterCategoryAndTypeChart = 66,\r\n hasAverageBilledFeesClosedByResponsibleChart = 67,\r\n hasAverageBilledFeesClosedByActingChart = 68,\r\n hasAverageFeeEstimateCurrentByMatterTypeChart = 69,\r\n hasAverageFeeEstimateCurrentByPropertyChart = 70,\r\n hasAverageFeeEstimateCurrentByMatterCategoryChart = 71,\r\n hasAverageFeeEstimateCurrentByMatterCategoryAndTypeChart = 72,\r\n hasAverageFeeEstimateCurrentByResponsibleChart = 73,\r\n hasAverageFeeEstimateCurrentByActingChart = 74,\r\n hasFeesVsBudgetByTimekeeperChart = 76,\r\n hasMatterSummary = 77,\r\n hasNameSummary = 78,\r\n hasStaffSummary = 79,\r\n hasTimesheet = 80,\r\n hasDashboardParts = 81,\r\n hasIPAttorneyDashboard = 82,\r\n hasLicencedReports = 83,\r\n hasReportCatalog = 84,\r\n hasBilledFeesVsEstimateByMatterTypeChart = 85,\r\n hasBilledFeesVsEstimateByPropertyChart = 86,\r\n hasBilledFeesVsEstimateByMatterCategoryChart = 87,\r\n hasBilledFeesVsEstimateByMatterCategoryAndTypeChart = 88,\r\n hasBilledFeesVsEstimateByResponsibleChart = 89,\r\n hasBilledFeesVsEstimateByActingChart = 90,\r\n hasMatterFeesVsEstimateChart = 92,\r\n hasInnographyLink = 93,\r\n hasClientSenseLink = 94,\r\n hasNewMattersInLastTwelveMonthsByMatterTypeChart = 95,\r\n hasNewMattersInLastTwelveMonthsByPropertyChart = 96,\r\n hasNewMattersInLastTwelveMonthsByMatterCategoryChart = 97,\r\n hasNewMattersInLastTwelveMonthsByMatterCategoryAndTypeChart = 98,\r\n hasNewMattersInLastTwelveMonthsByResponsibleChart = 99,\r\n hasNewMattersInLastTwelveMonthsByActingChart = 100,\r\n hasDashboardConfiguration = 101,\r\n hasDashboardSecurityScope = 102,\r\n hasDashboardSecurityRoleCategory = 103,\r\n hasDashboardSecurityRole = 104,\r\n hasDashboardSecurityUser = 105,\r\n hasDashboardSecurityPersonal = 106,\r\n hasConfigurationMaintenance = 107,\r\n hasFeatureLicencingConfiguration = 108,\r\n hasFeatureAccessConfiguration = 109,\r\n hasFeatureAccessSecurityFirm = 110,\r\n hasFeatureAccessSecurityCategory = 111,\r\n hasFeatureAccessSecurityRole = 112,\r\n hasFeatureAccessSecurityUser = 113,\r\n hasFeatureAccessSecurityPersonal = 114,\r\n hasRoleConfiguration = 115,\r\n hasLeads = 116,\r\n hasLeadsSummary = 117,\r\n hasLeadsDashboard = 118,\r\n hasTimesheetTimer = 119,\r\n hasTimesheetSummary = 120,\r\n hasTimesheetUpdate = 121,\r\n hasLeadMaintenance = 122,\r\n hasCreateLead = 123,\r\n hasModifyLead = 124,\r\n hasDeleteLead = 125,\r\n hasAssignLead = 126,\r\n hasFollowUpLead = 127,\r\n hasNewLeadsInLast12MonthsTotal = 128,\r\n hasNewLeadsInLast12MonthsBySource = 129,\r\n hasNewLeadsInLast12MonthsByAreaOfLaw = 130,\r\n hasAverageDaysLeadFollowUpByLawyer = 131,\r\n hasLeadConversionInLast12MonthsByLawyer = 132,\r\n hasLeadsNotProceedingInLast12MonthsByReason = 133,\r\n hasBulkMatterManagement = 134,\r\n hasMatterTasks = 135,\r\n hasWriteOffWIP = 136,\r\n hasWriteOffDebtors = 137,\r\n hasBillMatter = 138,\r\n hasTransferMatterTrust = 139,\r\n hasArchiveMatter = 140,\r\n hasCloseMatter = 141,\r\n hasEmailLeadAssignee = 142,\r\n hasLeadsDetail = 143,\r\n hasLookupConfiguration = 144,\r\n hasPracticeAreaLookupMaintenance = 145,\r\n hasLeadSourceLookupMaintenance = 146,\r\n hasLeadReasonLookupMaintenance = 147,\r\n hasLeadFollowUpActionMaintenance = 148,\r\n hasTasks = 149,\r\n hasTaskSummary = 150,\r\n hasTaskDetail = 151,\r\n hasAllocateTask = 152,\r\n hasTaskMaintenance = 153,\r\n hasDeleteTask = 154,\r\n hasModifyTask = 155,\r\n hasCreateTask = 156,\r\n hasUserAdmininstration = 157,\r\n hasTimelinesAdmininstration = 158,\r\n hasMatterAccessAdmininstration = 159,\r\n hasMessagesAdmininstration = 160,\r\n hasMattersAdmininstration = 161,\r\n hasDocumentsAdmininstration = 162,\r\n hasReportsAdmininstration = 163,\r\n hasNameAccessAdmininstration = 164,\r\n hasLoginAccessAdmininstration = 165,\r\n hasTaskCategoryLookupMaintenance = 166,\r\n hasPriorityLookupMaintenance = 167,\r\n hasSplashScreenConfiguration = 168,\r\n hasLocationLookupMaintenance = 169,\r\n hasFirmDashboard = 170,\r\n hasFeeEarnerDashboard = 171,\r\n hasFirmDashboardConfiguration = 172,\r\n hasFeeEarnerDashboardConfiguration = 173,\r\n hasLeadsDashboardConfiguration = 174,\r\n hasFirmOfficeLookupMaintenance = 175,\r\n hasFirmDepartmentLookupMaintenance = 176,\r\n hasFirmTeamLookupMaintenance = 177,\r\n hasEmailTemplateConfiguration = 178,\r\n hasFirmDashboardFirmView = 179,\r\n hasFirmDashboardOfficeView = 180,\r\n hasFirmDashboardDepartmentView = 181,\r\n hasFirmDashboardTeamView = 182,\r\n hasFirmDashboardFeeEarnerView = 183,\r\n hasMatterSummaryViewManagement = 184,\r\n hasHelp = 185,\r\n hasUserDefinedHelp = 186,\r\n hasUserDefinedHelpConfiguration = 187,\r\n hasFirmDashboardReportingGroupView = 188,\r\n hasCreateClient = 189, \r\n hasFeesBilledInPast14DaysChart = 191,\r\n hasFeesBilledInLast12MonthsChart = 192,\r\n hasFeesBilledMonthToDateByActingChart = 193,\r\n hasFeesBilledMonthToDateByResponsibleChart = 194,\r\n hasFeesBilledMonthToDateByMatterTypeChart = 195,\r\n hasFeesBilledMonthToDateByMatterCategoryChart = 196,\r\n hasFeesBilledMonthToDateByPropertyTypeChart = 197,\r\n hasFeesBilledMonthToDateByReportingGroupChart = 198,\r\n hasFeesBilledInLastYearByActingChart = 199,\r\n hasFeesBilledInLastYearByResponsibleChart = 200,\r\n hasFeesBilledInLastYearByMatterTypeChart = 201,\r\n hasFeesBilledInLastYearByMatterCategoryChart = 202,\r\n hasFeesBilledInLastYearByPropertyTypeChart = 203,\r\n hasFeesBilledInLastYearByReportingGroupChart = 204,\r\n hasInvoicesInDraftByActingChart = 205,\r\n hasInvoicesInDraftByResponsibleChart = 206,\r\n hasInvoicesInDraftByMatterTypeChart = 207,\r\n hasInvoicesInDraftByMatterCategoryChart = 208,\r\n hasInvoicesInDraftByPropertyTypeChart = 209,\r\n hasInvoicesInDraftByReportingGroupChart = 210,\r\n hasReferrers = 211,\r\n hasReferrerSummary = 212,\r\n hasReferrerMaintenance = 213,\r\n hasReferrerBackgroundMaintenance = 214,\r\n hasReferrerDetailMaintenance = 215,\r\n hasEmailTemplateConfigurationPage = 216,\r\n hasEmailTemplateSecurityScope = 217,\r\n hasEmailTemplateSecurityRoleCategory = 218,\r\n hasEmailTemplateSecurityRole = 219,\r\n hasEmailTemplateSecurityUser = 220,\r\n hasSplashScreenConfigurationPage = 221,\r\n hasSplashScreenSecurityScope = 222,\r\n hasSplashScreenSecurityRoleCategory = 223,\r\n hasSplashScreenSecurityRole = 224,\r\n hasSplashScreenSecurityUser = 225,\r\n hasUserDefinedHelpConfigurationPage = 226,\r\n hasUserDefinedHelpSecurityScope = 227,\r\n hasUserDefinedHelpSecurityRoleCategory = 228,\r\n hasUserDefinedHelpSecurityRole = 229,\r\n hasUserDefinedHelpSecurityUser = 230,\r\n hasAdminDashboardPage = 231,\r\n hasMatterActivityChart = 232,\r\n hasMattersWithoutTrustByMatterTypeChart = 233,\r\n hasMattersWithoutTrustByMatterCategoryChart = 234,\r\n hasMattersWithoutTrustByMatterCategoryAndTypeChart = 235,\r\n hasMattersWithoutTrustByResponsibleChart = 236,\r\n hasMattersWithoutTrustByActingChart = 237,\r\n hasMattersWithoutTrustByPropertyChart = 238,\r\n hasPipelineVsMatterActivityChart = 239,\r\n hasReferrerSourceLookupMaintenance = 240,\r\n hasReferrerTypeLookupMaintenance = 241,\r\n hasRelationshipQualityLookupMaintenance = 242,\r\n hasNewLeadsInLast30DaysBySource = 243,\r\n hasNewLeadsInLast30DaysByAreaOfLaw = 244,\r\n hasNewLeadsInLast90DaysBySource = 245,\r\n hasNewLeadsInLast90DaysByAreaOfLaw = 246,\r\n hasMailingList = 247,\r\n hasMatterEmailPersonActing = 248,\r\n hasMatterEmailPersonResponsible = 249,\r\n hasViewMatterTask = 250,\r\n hasDeleteMatterTask = 251,\r\n hasNameMaintenance = 252,\r\n hasUploadMatterDocument = 253,\r\n hasUserOptionsConfiguration = 254,\r\n hasUserAssistantLookupMaintenance = 255,\r\n hasDebtOwingByClientChart = 256,\r\n hasClientExposureChart = 257,\r\n hasClientContactTagLookupMaintenance = 258,\r\n hasDashboardPanelLookupMaintenance = 259,\r\n hasMatterFollowUpActionLookupMaintenance = 260,\r\n hasFollowUpMatterTask = 261,\r\n hasLeadConversionInLast30DaysByLawyer = 262,\r\n hasLeadsNotProceedingInLast30DaysByReason = 263,\r\n hasLeadConversionInLast90DaysByLawyer = 264,\r\n hasLeadsNotProceedingInLast90DaysByReason = 265,\r\n hasFeesBilledInLastFinancialYearChart = 266,\r\n hasFeesBilledForMonthChart = 267,\r\n hasMailingClientAndContact = 268,\r\n hasMailingReferrers = 269,\r\n hasMailingMatters = 270,\r\n hasMailingNewBusinessEnquiries = 271,\r\n hasTopReferrersInLastThirtyDaysChart = 272,\r\n hasTopReferrersInLastNinetyDaysChart = 273,\r\n hasTopReferrersInLast12MonthsChart = 274,\r\n hasEnquiryViewAll = 275,\r\n hasEnquiryViewMyDepartmentOnly = 276,\r\n hasEnquiryViewMyOfficeOnly = 277,\r\n hasEnquiryViewMyTeamOnly = 278,\r\n hasEnquiryViewMyEnquiriesOnly = 279,\r\n hasTimesheetTimeAndFeesInLastPeriodsChart = 280,\r\n hasTimesheetFeesInLastPeriodsChart = 281,\r\n hasTimesheetTimeInLastPeriodsChart = 282,\r\n hasTimesheetTimeInFinancialYearChart = 283,\r\n hasTimesheetFeesInFinancialYearChart = 284,\r\n hasFirmDashboardMyOfficeOnly = 285,\r\n hasFirmDashboardMyDepartmentOnly = 286,\r\n hasFirmDashboardMyTeamOnly = 287,\r\n hasClientNotes = 288,\r\n hasMatterNotes = 289,\r\n hasTaskViewAll = 290,\r\n hasTaskViewMyDepartmentOnly = 291,\r\n hasTaskViewMyOfficeOnly = 292,\r\n hasTaskViewMyTeamOnly = 293,\r\n hasViewMatterDocuments = 294, \r\n hasFirmStructure = 295,\r\n hasUserDashboard = 296,\r\n hasEnquirySummaryViewManagement = 297,\r\n hasNameSummaryViewManagement = 298,\r\n hasReferrerSummaryViewManagement = 299,\r\n hasTimesheetTimeInFinancialYearAggregateChart = 300,\r\n hasTimesheetFeesInFinancialYearAggregateChart = 301,\r\n hasFeesBilledChart = 302,\r\n hasFeesBilledVsBudgetChart = 303,\r\n hasFeesBilledCumulativeChart = 304,\r\n hasFeesBilledCumulativeVsBudgetChart = 305,\r\n hasFeesBilledByPeriodChart = 306,\r\n hasFeesBilledByPeriodVsBudgetChart = 307,\r\n hasFeesCollectedChart = 308,\r\n hasFeesCollectedVsBudgetChart = 309,\r\n hasFeesCollectedCumulativeChart = 310,\r\n hasFeesCollectedCumulativeVsBudgetChart = 311,\r\n hasFeesCollectedByPeriodChart = 312,\r\n hasFeesCollectedByPeriodVsBudgetChart = 313,\r\n hasStaffBillingSummaryViewManagement = 314,\r\n hasStaffBudgetCollectionsView = 315,\r\n hasStaffBudgetCollectionsEdit = 316,\r\n hasStaffBudgetBillingsView = 317,\r\n hasStaffBudgetBillingsEdit = 318,\r\n hasStaffBudgetProductionView = 319,\r\n hasStaffBudgetProductionEdit = 320,\r\n hasStaffSummaryViewManagement = 321,\r\n hasNewLeadsInLast7DaysBySource = 322,\r\n hasNewLeadsInLast7DaysByAreaOfLaw = 323,\r\n hasMarkAsClientCreated = 324, \r\n hasKeyOpportunity = 325, \r\n hasTimesheetFeesWithBudgetInLastPeriodsChart = 326,\r\n hasTimesheetTimeWithBudgetInLastPeriodsChart = 327,\r\n hasTimesheetTimeWithBudgetInFinancialYearChart = 328,\r\n hasTimesheetFeesWithBudgetInFinancialYearChart = 329,\r\n hasTimesheetTimeWithBudgetInFinancialYearAggregateChart = 330,\r\n hasTimesheetFeesWithBudgetInFinancialYearAggregateChart = 331,\r\n hasPersonaliseFirmDashboardConfiguration = 332,\r\n hasPersonaliseFeeEarnerDashboardConfiguration = 333,\r\n hasPersonaliseLeadsDashboardConfiguration = 334,\r\n hasAdHocTask = 335,\r\n hasPhoneTask = 336,\r\n hasIntegration = 337,\r\n hasVisionSix = 338,\r\n hasEnquiryEmailFollowUp = 339,\r\n hasEnquiryBookMeeting = 340,\r\n hasIntegrationConfiguration = 341,\r\n hasFirmSettingsConfiguration = 342,\r\n hasTimesheetViewAll = 343,\r\n hasTimesheetViewMyDepartmentOnly = 344,\r\n hasTimesheetViewMyOfficeOnly = 345,\r\n hasTimesheetViewMyTeamOnly = 346,\r\n hasTaskTypeMaintenance = 347,\r\n hasTaskTypeGroupMaintenance = 348,\r\n hasPoBoxTypeLookupMaintenance = 349,\r\n hasDebtCollection = 350,\r\n hasMatterDebtCollectionDetails = 351,\r\n hasBillingRealisationChart = 352,\r\n hasStaffMaintenance = 353,\r\n hasDebtorDaysByPersonActingChart = 354,\r\n hasDebtorDaysByPersonResponsibleChart = 355,\r\n hasDebtorDaysByMatterCategoryChart = 356,\r\n hasDebtorDaysByMatterTypeChart = 357,\r\n hasWIPLockUpDaysByPersonActingChart = 358,\r\n hasWIPLockUpDaysByPersonResponsibleChart = 359,\r\n hasWIPLockUpDaysByMatterCategoryChart = 360,\r\n hasWIPLockUpDaysByMatterTypeChart = 361,\r\n hasFutureSettlementsChart = 362,\r\n hasMatterDurationByCategoryOrTypeChart = 363,\r\n hasMatterCountByReportingGroupChart = 364,\r\n hasSalesPipelineByAreaOfLawChart = 365,\r\n hasSalesPipelineByAssigneeChart = 366,\r\n hasSalesPipelineByLocationChart = 367,\r\n hasEnquiriesByQualityChart = 368,\r\n hasEnquiriesByLikelihoodToProceedChart = 369,\r\n hasHoursRecordedByStaffMembersChart = 370,\r\n hasCollectionRateChart = 371,\r\n hasDueDatesByPersonChart = 372,\r\n hasDueDatesOverviewChart = 373,\r\n hasTrustBalanceChart = 374,\r\n hasClientBillingChart = 375,\r\n hasNonBillableTimesByActivityChart = 376,\r\n hasNonBillableTimesByStaffChart = 377,\r\n hasMatterBillingChart = 378,\r\n hasFeeEarnerDashboardViewAll = 379,\r\n hasFeeEarnerDashboardViewMyDepartmentOnly = 380,\r\n hasFeeEarnerDashboardViewMyOfficeOnly = 381,\r\n hasFeeEarnerDashboardViewMyTeamOnly = 382,\r\n hasShowFeeEarnerDashboard = 383,\r\n hasYearBudgetsChart = 384,\r\n hasTaskQueueByAssigneeChart = 385,\r\n hasTaskDashboardFirmView = 386,\r\n hasTaskDashboardOfficeView = 387,\r\n hasTaskDashboardDepartmentView = 388,\r\n hasTaskDashboardTeamView = 389,\r\n hasTaskDashboardFeeEarnerView = 390,\r\n hasTaskDashboardMyOfficeOnly = 391,\r\n hasTaskDashboardMyDepartmentOnly = 392,\r\n hasTaskDashboardMyTeamOnly = 393,\r\n hasTaskDashboard = 394,\r\n hasTaskDashboardConfiguration = 395,\r\n hasCostAgreementChart = 396,\r\n hasTaskQueueByCreationTimeChart = 397,\r\n hasTaskQueueByTaskTypeDescriptionChart = 398,\r\n hasBrandsConfiguration = 399,\r\n hasFutureFeesChart = 400,\r\n hasNewMattersInLastTwelveMonthsByReportingGroup = 401,\r\n hasClosedMattersByFeeEarnerChart = 403,\r\n hasFeesBilledVsBudgetByFeeEarnerChart = 402,\r\n hasCreateRecord = 404,\r\n hasUpdateRecord = 405,\r\n hasDeleteRecord = 406,\r\n hasEventsAndCampaignsSummary = 407,\r\n hasCreateEventsAndCampaigns = 408,\r\n hasUpdateEventsAndCampaigns = 409,\r\n hasDeleteEventsAndCampaigns = 410,\r\n hasTrustFundsAvailableChart = 411,\r\n hasCombinedNewMattersByCategoryChart = 412,\r\n hasScrubData = 413,\r\n hasClientDashboard = 414,\r\n hasClientDashboardConfiguration = 415,\r\n hasMatterLearnMore = 416,\r\n hasClientDashboardPropertyFilter = 417,\r\n hasClientDashboardCountryFilter = 418,\r\n hasClientDashboardBrandFilter = 419,\r\n hasClientDashboardCategoryFilter = 420,\r\n hasClientDashboardTypeFilter = 421,\r\n hasClientDashboardStatusFilter = 422,\r\n hasMattersByCountryChart = 423,\r\n hasRiskLevelLookupMaintenance = 424,\r\n hasGeneralMaterial = 425,\r\n hasGeneralMaterialConfiguration = 426,\r\n hasFutureSettlementsByPriceChart = 427,\r\n hasCurrentMattersByAustralianStateChart = 428,\r\n hasEventStatusLookupMaintenance = 429,\r\n hasEventTypeLookupMaintenance = 430,\r\n hasCorrespondenceActivityLookupMaintenance = 431,\r\n hasCurrentMattersByUSStateChart = 433,\r\n hasMatterFinancial = 434,\r\n hasMatterUnbilledTimeAndDisbursements = 435,\r\n hasMatterWIPInformation = 436,\r\n hasBookMeetingEmailPreview = 437,\r\n hasRoleSecurityConfiguration = 438,\r\n hasOtherPartyTypeLookupMaintenance = 439,\r\n hasNameDocument = 440,\r\n hasClientDocuments = 441,\r\n hasTrustBalancesByAgeChart = 442,\r\n hasMatterExport = 443,\r\n hasClientAndContactExport = 444,\r\n hasSummaryColumnSecurity = 445,\r\n hasFeesBilledVsBudgetSpeedometerChart = 446,\r\n hasTotalDebtOwingPieChart = 447,\r\n hasBillableTimesByStaffChart = 448,\r\n hasTaskQueueByPriorityChart = 449,\r\n hasFeesRecordedVsBudgetByFeeEarnerChart = 450,\r\n hasFeesBilledVsBudgetByOfficeChart = 451,\r\n hasFeesBilledVsBudgetByDepartmentChart = 452,\r\n hasFeesBilledVsBudgetByTeamChart = 453,\r\n hasFeeEstimateWarning = 454,\r\n hasClientAndContactNotes = 455,\r\n hasNotesSummary = 456,\r\n hasNotesSummaryViewManagement = 457,\r\n hasClientAndMatterNoteSubjectLookupMaintenance = 458,\r\n hasBillableHoursRecordedVsBudget = 459,\r\n hasClientAndContactDashboard = 460,\r\n hasCreateAttendee = 461,\r\n hasClientAndContactFinancials = 462,\r\n hasEmailSendOrReplyDefinition = 463,\r\n hasClientNotesManagement = 464,\r\n hasClientNotesFollowUp = 465,\r\n hasKpiSummaryChart = 466,\r\n hasCumulativeBillableHoursVsBudgetChart = 467,\r\n hasLeapTask = 468,\r\n hasMatterForecast = 469,\r\n hasForecastFeesBilledChart = 470,\r\n hasForecastFeesCollectedChart = 471,\r\n hasForecastHoursChart = 472,\r\n hasForecastFeesBilledByCategoryChart = 473,\r\n hasForecastFeesCollectedByCategoryChart = 474,\r\n hasForecastHoursByCategoryChart = 475,\r\n hasNewLeadsInLast30DaysByAssignee = 476,\r\n hasBillableHoursRecordedVsBudgetSpeedometerChart = 477,\r\n hasFeesRecordedVsBudgetSpeedometerChart = 478,\r\n hasFeesCollectedVsBudgetSpeedometerChart = 479,\r\n hasUploadClientAndContactImage = 483,\r\n hasDeleteClientAndContactImage = 484,\r\n hasArtificialIntelligence = 485,\r\n hasEmailTemplateAI = 486,\r\n hasPhoneCallResponseTimeChart = 487,\r\n hasTaskResponseTimeByAssignee = 488,\r\n hasTaskResponseTimeByTaskType = 489,\r\n hasAverageElapsedTimeByTaskType = 490,\r\n hasCRMContactProfessionalBackgroundAI = 491,\r\n hasFinancialYearBudgetForecastChart = 492,\r\n hasEnquiryHealthChart = 493,\r\n hasEnquiriesCustomFields = 494,\r\n hasCustomFieldMaintenance = 495,\r\n hasEnquiryCustomFieldsConfiguration = 496,\r\n hasAverageElapsedTimeByAssignee = 497,\r\n\r\n hasCreateEnquiryData = 498,\r\n hasEnquiryOrganisation = 499,\r\n hasEnquiryValue = 500,\r\n hasEnquiryClientDetails = 501,\r\n hasEnquiryClient2Details = 502,\r\n hasEnquiryRiskAssessment = 503,\r\n hasEnquiryOtherSide = 504,\r\n hasEnquiryDetailedNotes = 505,\r\n hasEnquiryDocuments = 506,\r\n hasEnquiryProceeding = 507,\r\n\r\n hasClientAndContactRelationshipData = 508,\r\n hasClientAndContactActivityDashboardCategory = 509,\r\n hasContactActivitiesByStaff = 510,\r\n hasContactActivitiesBySubject = 511,\r\n hasEnquiryDataDownload = 512,\r\n hasEnquiryDigitalTracking = 513,\r\n hasCRMNewEnquiryScan = 514,\r\n hasWriteOffOrOnAnalysisChart = 515,\r\n hasShowNotificationSendOption = 516,\r\n hasEventsAndCampaignSummaryChart = 517,\r\n\r\n hasFirmDashboardAI = 518,\r\n hasFeeEarnerDashboardAI = 519,\r\n hasCreateEventsAndCampaignEvent = 520,\r\n hasCreateEventsAndCampaignCampaign = 521,\r\n hasCreateEventsAndCampaignDigitalTracking = 522,\r\n hasDigitalTracking = 523,\r\n \r\n hasCRMAddInScanExistingContact = 524,\r\n hasCRMAddInScanExistingEnquiry = 525,\r\n hasCRMAddInScanNewContact = 526,\r\n hasCRMAddInScanNewEnquiry = 527,\r\n hasCRMAddInScanNewEnquiryEasy = 528,\r\n hasCRMAddInScanNewEnquiryDefault = 529,\r\n\r\n\r\n hasFeeEarnerDashboardAICharts = 530,\r\n hasFeeEarnerDashboardAIPerformanceSummary = 531,\r\n hasFeeEarnerDashboardAIStaffWorkload = 532,\r\n hasFeeEarnerDashboardAIExceptions = 533,\r\n \r\n hasFirmDashboardAICharts = 534,\r\n hasFirmDashboardAIPerformanceSummary = 535,\r\n hasFirmDashboardAIStaffWorkload = 536,\r\n hasFirmDashboardAIExceptions = 537,\r\n hasAiPromptConfiguration = 538,\r\n hasSmsIntegration = 539\r\n}\r\n","import * as React from 'react';\r\nimport {\r\n withStyles,\r\n WithStyles,\r\n createStyles,\r\n Theme,\r\n Paper,\r\n Tabs,\r\n Tab,\r\n Button,\r\n Input,\r\n InputLabel,\r\n FormControl\r\n} from '@material-ui/core';\r\n// import Button from '@material-ui/core/Button';\r\n// import AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Typography from '@material-ui/core/Typography';\r\n// import CloseIcon from '@material-ui/icons/Close';\r\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\n// import MaskedInput from 'react-text-mask';\r\n// import * as moment from 'moment';\r\nimport 'moment-duration-format';\r\nimport { TypedTenantUserOptions } from '../../userSettings/UserSettingsRepository';\r\n// import { TimePicker } from '@material-ui/pickers';\r\n// import TimeKeeper from 'react-timekeeper';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n appBar: {\r\n position: 'relative',\r\n '& > div': {\r\n padding: 0,\r\n }\r\n },\r\n title: {\r\n // marginLeft: theme.spacing(2),\r\n flex: 1,\r\n textAlign: 'center',\r\n flexGrow: 1,\r\n fontSize: '21px',\r\n fontWeight: 100,\r\n color: '#333333',\r\n lineHeight: '32px',\r\n margin: 0,\r\n fontFamily: 'Segoe UI'\r\n },\r\n dialog: {\r\n '& > div': {\r\n boxShadow: 'none',\r\n }\r\n },\r\n content: {\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column wrap'\r\n },\r\n tab: {\r\n flexGrow: 1,\r\n maxWidth: 'none',\r\n flexBasis: 0,\r\n flexShrink: 1,\r\n },\r\n timeContainer: {\r\n textAlign: 'center',\r\n padding: '30px 0px',\r\n fontSize: '24px',\r\n '& .minutes': {\r\n paddingBottom: '10px',\r\n },\r\n '& .units': {\r\n\r\n }\r\n },\r\n tabContainer: {\r\n // margin: '0 30px',\r\n // boxShadow: 'none',\r\n // border: '1px solid red',\r\n },\r\n tabContent: {\r\n padding: '15px 0',\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column wrap'\r\n },\r\n durationContainer: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n flex: 1,\r\n flexFlow: 'column wrap',\r\n maxHeight: '300px',\r\n '& .inputContainer': {\r\n display: 'flex',\r\n maxWidth: '150px',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n '& .duration': {\r\n flex: 1,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n fontSize: '36px',\r\n '& .input': {\r\n border: 0,\r\n width: '100%',\r\n '&:before': {\r\n border: 0,\r\n },\r\n '& input': {\r\n textAlign: 'center',\r\n fontSize: '36px',\r\n width: '100%',\r\n }\r\n },\r\n },\r\n '& .buttonContainer': {\r\n display: 'flex',\r\n flexFlow: 'row wrap',\r\n width: '100%',\r\n justifyContent: 'space-between',\r\n margin: '0 -10px',\r\n }\r\n },\r\n unitContainer: {\r\n flex: 1,\r\n '& .fieldcontainer': {\r\n display: 'flex',\r\n width: '100%',\r\n }\r\n },\r\n button: {\r\n margin: '5px',\r\n },\r\n timeButton: {\r\n margin: '5px 10px'\r\n },\r\n formControl: {\r\n margin: '16px',\r\n flex: 1,\r\n }\r\n});\r\n\r\nenum TabName {\r\n duration = 0,\r\n unit = 1,\r\n}\r\n\r\ninterface DialogProps extends WithStyles {\r\n onClose: () => void;\r\n // tslint:disable-next-line: no-any\r\n onData: (data: any) => void;\r\n minutesInUnit: number;\r\n hours: number;\r\n minutes: number;\r\n seconds: number;\r\n settings: TypedTenantUserOptions;\r\n}\r\n\r\ninterface DialogStates {\r\n // tslint:disable-next-line:no-any\r\n tab: number;\r\n unit: number;\r\n minutesInUnit: number;\r\n duration: {\r\n hour: number;\r\n minute: number;\r\n second: number;\r\n };\r\n selectedDate?: Date;\r\n shouldShowTabs: boolean;\r\n noChange: boolean;\r\n}\r\n\r\n// interface TextMaskCustomProps {\r\n// inputRef: (ref: HTMLInputElement | null) => void;\r\n// }\r\n\r\nclass TimeslipTimePage extends React.Component {\r\n\r\n constructor(props: DialogProps) {\r\n super(props);\r\n this.handleClose = this.handleClose.bind(this);\r\n this.handleTabChange = this.handleTabChange.bind(this);\r\n this.handleTextChange = this.handleTextChange.bind(this);\r\n this.onClickButtonTime = this.onClickButtonTime.bind(this);\r\n this.handleSave = this.handleSave.bind(this);\r\n this.changeDate = this.changeDate.bind(this);\r\n // this.handleDateChange = this.handleDateChange.bind(this);\r\n this.formatNumberBy0 = this.formatNumberBy0.bind(this);\r\n this.timeConvertToWords = this.timeConvertToWords.bind(this);\r\n this.getUnits = this.getUnits.bind(this);\r\n // this.getTimeConverted = this.getTimeConverted.bind(this);\r\n // this.buttonTimeComponent = this.buttonTimeComponent.bind(this);'\r\n var currentTab = 0;\r\n var shouldShowTabs = true;\r\n if (this.props.settings) {\r\n shouldShowTabs = this.props.settings.tenantTimeCaptureMode === 'Both';\r\n currentTab = this.props.settings.timeCaptureMode === 'Duration' ? 0 : 1;\r\n currentTab = this.props.settings.tenantTimeCaptureMode === 'Duration' ? 0 : currentTab;\r\n currentTab = this.props.settings.tenantTimeCaptureMode === 'Units' ? 1 : currentTab;\r\n }\r\n this.state = {\r\n tab: currentTab,\r\n unit: Math.ceil((this.props.hours * 60 + this.props.minutes + this.props.seconds / 60) / this.props.minutesInUnit),\r\n duration: {\r\n hour: this.props.hours,\r\n minute: this.props.minutes,\r\n second: this.props.seconds\r\n },\r\n minutesInUnit: this.props.minutesInUnit,\r\n shouldShowTabs: shouldShowTabs,\r\n noChange: true\r\n };\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: DialogProps, nextContext: DialogStates): void {\r\n if (this.props.settings) {\r\n var shouldShowTabs = this.props.settings.tenantTimeCaptureMode === 'Both';\r\n var currentTab = this.props.settings.timeCaptureMode === 'Duration' ? 0 : 1;\r\n currentTab = this.props.settings.tenantTimeCaptureMode === 'Duration' ? 0 : currentTab;\r\n currentTab = this.props.settings.tenantTimeCaptureMode === 'Units' ? 1 : currentTab;\r\n \r\n this.setState( {\r\n tab: currentTab,\r\n unit: Math.floor((this.props.hours * 60 + this.props.minutes) / this.props.minutesInUnit),\r\n duration: {\r\n hour: this.props.hours,\r\n minute: this.props.minutes,\r\n second: this.props.seconds\r\n },\r\n minutesInUnit: this.props.minutesInUnit,\r\n shouldShowTabs: shouldShowTabs\r\n });\r\n }\r\n\r\n }\r\n\r\n buttonTimeComponent(minutesInUnit: number, duration: {hour: number, minute: number}) {\r\n const { classes } = this.props;\r\n let buttons = [];\r\n let amountOfButtons = 60 / minutesInUnit;\r\n for (var i = 1; i <= amountOfButtons; i++) {\r\n if (this.state.minutesInUnit * i >= 60) {\r\n buttons.push(\r\n \r\n \r\n {`${this.formatNumberBy0(duration.hour + 1)}:${this.formatNumberBy0(this.state.minutesInUnit * i - 60)}`}\r\n \r\n \r\n );\r\n } else {\r\n buttons.push(\r\n \r\n \r\n {`${this.formatNumberBy0(duration.hour)}:${this.formatNumberBy0(this.state.minutesInUnit * i)}`}\r\n \r\n \r\n ); \r\n }\r\n\r\n }\r\n return buttons;\r\n }\r\n\r\n durationComponent() {\r\n const { classes } = this.props;\r\n \r\n return (\r\n
\r\n
\r\n {/* */}\r\n
\r\n \r\n
:
\r\n \r\n
\r\n
\r\n
\r\n {this.buttonTimeComponent(this.state.minutesInUnit, this.state.duration)}\r\n
\r\n
\r\n );\r\n }\r\n\r\n unitComponent() {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n
\r\n \r\n Unit\r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n Select Time\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 {this.timeConvertToWords(this.state.duration)}\r\n
\r\n {this.state.tab === TabName.unit && (\r\n
\r\n {`${this.state.unit} ${this.state.unit !== 1 ? 'units' : 'unit'}`}\r\n
\r\n )}\r\n
\r\n {this.state.shouldShowTabs ?\r\n \r\n \r\n \r\n \r\n \r\n :\r\n
}\r\n
\r\n {this.state.tab === 0 && this.durationComponent()}\r\n {this.state.tab === 1 && this.unitComponent()}\r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n private handleClose() {\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n private handleSave() {\r\n if (this.props.onData) {\r\n this.props.onData({\r\n duration: { hour: this.state.duration.hour, minute: this.state.duration.minute},\r\n // unit: this.state.unit,\r\n });\r\n }\r\n }\r\n\r\n private handleTabChange(event: React.ChangeEvent<{}>, newValue: number) {\r\n this.setState({ tab: newValue });\r\n }\r\n\r\n private handleTextChange = (field: string) => (event: React.ChangeEvent) => {\r\n // tslint:disable-next-line: radix\r\n const value = event.target.value;\r\n // tslint:disable-next-line: no-console\r\n console.log(value);\r\n const { duration } = this.state;\r\n switch (field) {\r\n case 'unit': {\r\n // tslint:disable-next-line: radix\r\n var units = value ? parseInt(value) : 0;\r\n duration.minute = (this.props.minutesInUnit * units) % 60;\r\n duration.hour = Math.floor(this.props.minutesInUnit * units / 60);\r\n duration.second = 0;\r\n this.setState({ unit: units, duration: duration, noChange: false});\r\n break;\r\n }\r\n case 'hour': {\r\n // tslint:disable-next-line: radix\r\n duration.hour = parseInt(value.replace(/\\D/g, ''));\r\n this.setState({ duration: duration, unit: this.getUnits(duration.hour, duration.minute, duration.second), noChange: false });\r\n break;\r\n }\r\n case 'minute': {\r\n // tslint:disable-next-line: radix\r\n duration.minute = parseInt(value.replace(/\\D/g, ''));\r\n this.setState({ duration: duration, unit: this.getUnits(duration.hour, duration.minute, duration.second), noChange: false});\r\n break;\r\n }\r\n default: {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private changeDate() {\r\n // code here ...\r\n }\r\n\r\n // private handleDateChange = (date: Date | null) => {\r\n // // code here...\r\n // console.log(date);\r\n // }\r\n\r\n private onClickButtonTime = (value: { hour: number, minute: number}, multiplier: number ) => () => {\r\n const { duration } = this.state;\r\n duration.hour = (value.hour);\r\n duration.minute = this.state.minutesInUnit * multiplier;\r\n duration.second = 0;\r\n\r\n if (duration.minute >= 60) {\r\n duration.hour++;\r\n duration.minute -= 60;\r\n }\r\n this.setState({ duration: duration, unit: this.getUnits(duration.hour, duration.minute, duration.second), noChange: false });\r\n }\r\n\r\n private formatNumberBy0(value: number) {\r\n if (value < 10) {\r\n return ('0' + value).slice(-2);\r\n }\r\n return value;\r\n }\r\n\r\n private getUnits(hour: number, minute: number, second: number): number {\r\n return Math.ceil((hour * 60 + minute + second / 60) / this.state.minutesInUnit);\r\n }\r\n\r\n private timeConvertToWords(value: { hour: number, minute: number }) {\r\n const { hour, minute } = value;\r\n\r\n if (hour === 0) {\r\n return minute \r\n ? Math.floor(minute) + (minute > 1 ? ' minutes ' : ' minute ')\r\n : '0 minute';\r\n } else if (minute === 0) {\r\n return hour + (hour > 1 ? ' hours ' : ' hour ');\r\n } else {\r\n return hour + (hour > 1 ? ' hours ' : ' hour ') + minute + (minute > 1 ? ' minutes ' : ' minute ');\r\n }\r\n }\r\n}\r\n\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(TimeslipTimePage as any) as any;","import * as React from 'react';\r\nimport { \r\n withStyles, \r\n WithStyles, \r\n createStyles, \r\n Theme,\r\n} from '@material-ui/core';\r\n// import AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport CancelIcon from '@material-ui/icons/Cancel';\r\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\r\n// import SaveIcon from '@material-ui/icons/Save';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n appBar: {\r\n position: 'relative',\r\n '& > div': {\r\n padding: 0,\r\n }\r\n },\r\n menuButton: {\r\n marginRight: '16px',\r\n },\r\n title: {\r\n flexGrow: 1,\r\n fontSize: '21px',\r\n fontWeight: 100,\r\n color: '#333333',\r\n lineHeight: '32px',\r\n margin: 0,\r\n fontFamily: 'Segoe UI',\r\n textAlign: 'center',\r\n },\r\n});\r\n\r\ninterface TimeslipHeaderProps extends WithStyles {\r\n cancelOrBackOnchange?: () => void;\r\n actionType?: 'back' | 'cancel' | undefined;\r\n onSave?: () => void;\r\n forTimer: boolean;\r\n}\r\n\r\ninterface TimeslipHeaderStates {\r\n\r\n}\r\n\r\nclass TimeslipHeader extends React.Component {\r\n constructor(props: TimeslipHeaderProps) {\r\n super(props);\r\n this.getIcon = this.getIcon.bind(this);\r\n this.handleSave = this.handleSave.bind(this);\r\n }\r\n\r\n render() {\r\n const { classes, actionType } = this.props;\r\n return (\r\n
\r\n \r\n {\r\n actionType === undefined || actionType === null ? undefined :\r\n this.props.forTimer ? undefined : \r\n (\r\n \r\n {this.getIcon(this.props.actionType)}\r\n \r\n )\r\n }\r\n \r\n \r\n {this.props.forTimer ? 'Timer' : 'Timeslip'}\r\n \r\n {/* \r\n \r\n */}\r\n \r\n
\r\n ); \r\n }\r\n\r\n private getIcon(icon?: string) {\r\n switch (icon) {\r\n case 'back': {\r\n return ;\r\n }\r\n case 'cancel': {\r\n return ;\r\n }\r\n default: {\r\n return undefined;\r\n }\r\n }\r\n }\r\n\r\n private handleSave() {\r\n if (this.props.onSave) {\r\n this.props.onSave();\r\n }\r\n }\r\n}\r\n\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(TimeslipHeader as any) as any;","import * as React from 'react';\r\nimport { \r\n withStyles, \r\n WithStyles, \r\n createStyles, \r\n Theme,\r\n Input,\r\n} from '@material-ui/core';\r\n// import Paper from '@material-ui/core/Paper';\r\n// import Divider from '@material-ui/core/Divider';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport SearchIcon from '@material-ui/icons/Search';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n root: {\r\n // padding: '2px 4px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n },\r\n input: {\r\n margin: '0 8px',\r\n flex: 1,\r\n },\r\n iconButton: {\r\n // padding: '10px 0px 10px 10px',\r\n },\r\n divider: {\r\n width: 1,\r\n height: 28,\r\n margin: 4,\r\n },\r\n});\r\n\r\ninterface SearchProps extends WithStyles {\r\n cancelOrBackOnchange?: () => void;\r\n actionType?: 'back' | 'cancel' | undefined;\r\n onSearch?: (value: string) => void;\r\n placeholder: string;\r\n}\r\n\r\ninterface SearchStates {\r\n search?: string;\r\n placeholder: string;\r\n}\r\n\r\nclass Search extends React.Component {\r\n constructor(props: SearchProps) {\r\n super(props);\r\n this.handleChange = this.handleChange.bind(this);\r\n this.state = {\r\n placeholder: this.props.placeholder,\r\n };\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: SearchProps, context: SearchStates) {\r\n if (nextProps.placeholder !== this.props.placeholder) {\r\n this.setState({\r\n placeholder: nextProps.placeholder\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n \r\n \r\n \r\n {/* */}\r\n \r\n
\r\n ); \r\n }\r\n\r\n private handleChange(event: React.ChangeEvent) {\r\n if (this.props.onSearch) {\r\n this.props.onSearch(event.target.value);\r\n }\r\n this.setState({search: event.target.value});\r\n }\r\n\r\n}\r\n\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(Search as any) as any;","import { FetchPolicy } from 'apollo-client';\r\nimport { client } from '../..';\r\nimport gql from 'graphql-tag';\r\n\r\nexport interface MatterLookUpData {\r\n loading?: boolean;\r\n networkStatus?: number;\r\n matterLookupList: MatterLookupList;\r\n}\r\n\r\ninterface MatterLookupList {\r\n recordCount: number;\r\n matters: Matters[];\r\n}\r\n\r\nexport interface Matters {\r\n id: number | null;\r\n fileNumber: string | null;\r\n matterCategory: string | null;\r\n matterType: string | null;\r\n matterTypeCategory: string | null;\r\n stage: string | null;\r\n title: string | null;\r\n description: string | null;\r\n client: string | null;\r\n status: string | null;\r\n inProgress: boolean | null;\r\n syncSystemID: string | null;\r\n state: string | null;\r\n family: string | null;\r\n property: string | null;\r\n propertyLabel: string | null;\r\n lastUpdate: string | null;\r\n isVIP: boolean | null;\r\n}\r\n\r\nexport interface MatterLookUpQueryParams {\r\n offset: number;\r\n first: number;\r\n filter?: string | null;\r\n typeFilter: 'ALL' | 'RECENT' | 'FAVOURITE' | 'All' | 'Recent' | 'Favourite' | null;\r\n statusFilter?: 'ALL' | 'CURRENT' | 'COMPLETE' | 'All' | 'Current' | 'Complete' | null;\r\n isExcludeCompleted: boolean ;\r\n feeEarnerId?: string;\r\n}\r\n\r\nexport function retrieveMatterLookUpData(query: MatterLookUpQueryParams,\r\n refreshData: boolean,\r\n // tslint:disable-next-line: no-any\r\n onSuccess: (data: MatterLookUpData) => 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.query({\r\n query: MATTER_LOOKUP,\r\n variables: {\r\n offset: query.offset,\r\n first: query.first,\r\n filter: query.filter,\r\n typeFilter: query.typeFilter,\r\n statusFilter: query.statusFilter,\r\n isExcludeCompleted : query.isExcludeCompleted,\r\n feeEarnerId : query.feeEarnerId\r\n },\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 MATTER_LOOKUP = gql`query matterLookup($offset: Int, $first: Int, $filter: String, $typeFilter: FilterOptionsType, $statusFilter: FilterOptionsStatus, $isExcludeCompleted: Boolean, $feeEarnerId: String) {\r\n matterLookupList(typeFilter: $typeFilter, statusFilter: $statusFilter, first: $first, offset: $offset, filter: $filter, isExcludeCompleted: $isExcludeCompleted, feeEarnerId: $feeEarnerId) {\r\n recordCount\r\n matters {\r\n id\r\n fileNumber\r\n matterCategory\r\n matterType\r\n matterTypeCategory\r\n stage\r\n title\r\n description\r\n client\r\n status\r\n inProgress\r\n syncSystemID\r\n state\r\n family\r\n property\r\n propertyLabel\r\n lastUpdate\r\n isVIP\r\n }\r\n }\r\n }\r\n `;","export function generateColor(str: string) { \r\n var hash = 0;\r\n for (var i = 0; i < str.length; i++) {\r\n // tslint:disable-next-line: no-bitwise\r\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n // tslint:disable-next-line: no-duplicate-variable\r\n\r\n return colourList[Math.abs(hash % colourList.length)];\r\n} \r\n\r\nconst colourList: Array = new Array ( '#b9def0', '#e8e28b', '#bce0af', '#e8aa8b', '#d9e0af', '#e88b8b');","import React from 'react';\r\nimport { Grid } from 'semantic-ui-react';\r\nimport glamorous from 'glamorous';\r\nimport ReactDOM from 'react-dom';\r\n\r\n// tslint:disable-next-line:no-any\r\nconst DataCardSection = glamorous.div<{ theme?: any }>((props) => ({\r\n // height: window.innerHeight - 440, // this should be calculated dynamically\r\n // width: window.innerWidth - 163,\r\n width: '100%',\r\n textAlign: 'left',\r\n border: '#077bba',\r\n overflowY: 'auto',\r\n // position: 'absolute',\r\n // top: '255px',\r\n // margin: '29px 30px 6px 32px',\r\n [`& .${`table`}`]: {\r\n border: 'none !important',\r\n },\r\n [`& .${`grid-custom-column`}`]: {\r\n [`& .${`item-In-Progress`}`]: {\r\n position: 'absolute',\r\n width: '100%',\r\n left: 0,\r\n bottom: '10px',\r\n [`& .${`stringDisplay`}`]: {\r\n [`& .${`LabelData`}`]: {\r\n width: '100% !important',\r\n textAlign: 'center'\r\n },\r\n [`& .${`ValueData`}`]: {\r\n display: 'none !important'\r\n }\r\n }\r\n }\r\n }\r\n}));\r\n\r\nconst GridView = glamorous(Grid)({\r\n\r\n});\r\n\r\nconst GridContainer = glamorous.div({\r\n padding: '0 1rem'\r\n});\r\n\r\n// tslint:disable-next-line:no-any\r\n// const Divider = glamorous.div<{ theme?: any }>((props) => ({\r\n// content: ' ',\r\n// width: 'inherit',\r\n// height: '3px',\r\n// borderTop: '1px solid ' + props.theme.NeutralColors.LightBlue1,\r\n// marginBottom: '30px',\r\n// zIndex: 1,\r\n// background: props.theme.NeutralColors.BackgroundWhite\r\n// }));\r\n\r\nexport interface InfiniteScrollProps {\r\n // tslint:disable-next-line:no-any \r\n mapFunc: (child: any, key: number) => any;\r\n // tslint:disable-next-line:no-any \r\n childData: any;\r\n blockSize: number;\r\n // tslint:disable-next-line: no-any\r\n loadData: () => any;\r\n height: number;\r\n}\r\n\r\nexport interface InfiniteScrollState {\r\n childrenVisible: number;\r\n windowHeight: number;\r\n}\r\n\r\nexport class InfiniteScrollWrapper extends React.Component {\r\n private reachedBottom: boolean;\r\n\r\n // tslint:disable-next-line:no-any\r\n constructor(props: InfiniteScrollProps, state: InfiniteScrollState) {\r\n super(props, state);\r\n this.loadData = this.loadData.bind(this);\r\n this.loadNextBlock = this.loadNextBlock.bind(this);\r\n this.listenScrollEvent = this.listenScrollEvent.bind(this);\r\n this.convertChildrenToElements = this.convertChildrenToElements.bind(this);\r\n this.updateWindowDimensions = this.updateWindowDimensions.bind(this);\r\n this.state = {\r\n childrenVisible: this.props.blockSize,\r\n windowHeight: 0\r\n };\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps() {\r\n this.loadNextBlock();\r\n }\r\n\r\n componentDidMount() {\r\n this.updateWindowDimensions();\r\n window.addEventListener('resize', this.updateWindowDimensions);\r\n ReactDOM.findDOMNode(this)?.addEventListener('scroll', this.listenScrollEvent);\r\n this.loadNextBlock();\r\n }\r\n\r\n componentWillUnmount() {\r\n ReactDOM.findDOMNode(this)?.removeEventListener('scroll', this.listenScrollEvent.bind(this));\r\n window.removeEventListener('resize', this.updateWindowDimensions);\r\n }\r\n\r\n updateWindowDimensions() {\r\n\r\n let width = window.innerWidth - 184;\r\n let height = window.innerHeight - 500;\r\n\r\n let ratio = width / height;\r\n\r\n let updatedHeight = Math.round(width / ratio);\r\n\r\n this.setState({ windowHeight: updatedHeight });\r\n this.forceUpdate();\r\n }\r\n\r\n // tslint:disable-next-line:no-any \r\n listenScrollEvent(event: any) {\r\n if (this.reachedBottom !== this.isBottom()) {\r\n this.reachedBottom = this.isBottom();\r\n if (this.reachedBottom) {\r\n this.loadData();\r\n // this.loadNextBlock();\r\n }\r\n }\r\n }\r\n\r\n isBottom() {\r\n var table = document.getElementById('table');\r\n if (table != null) {\r\n return table.getBoundingClientRect().bottom - 300 <= window.innerHeight;\r\n }\r\n return false;\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {/* */}\r\n \r\n \r\n \r\n {this.convertChildrenToElements()}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private convertChildrenToElements() {\r\n if (!this.props.childData) {\r\n return null;\r\n }\r\n var elements = new Array();\r\n var count = 0;\r\n for (let child of this.props.childData) {\r\n if (count >= this.state.childrenVisible) {\r\n break;\r\n }\r\n var result = this.props.mapFunc(child, count);\r\n if (result) {\r\n elements.push(result);\r\n count++;\r\n }\r\n }\r\n return elements;\r\n }\r\n\r\n private loadData() {\r\n if (this.props.loadData) {\r\n this.props.loadData();\r\n }\r\n }\r\n\r\n private loadNextBlock() {\r\n this.setState({ childrenVisible: this.state.childrenVisible + this.props.blockSize });\r\n }\r\n}","import * as React from 'react';\r\nimport { \r\n withStyles, \r\n WithStyles, \r\n createStyles, \r\n Theme,\r\n Tabs,\r\n Tab,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n Avatar,\r\n ListItemText,\r\n ListItemSecondaryAction,\r\n IconButton,\r\n Divider,\r\n // CircularProgress,\r\n} from '@material-ui/core';\r\nimport Paper from '@material-ui/core/Paper';\r\n// import RecentList from '../RecentList';\r\n// import { Query } from 'react-apollo';\r\nimport StarIcon from '@material-ui/icons/Star';\r\nimport gql from 'graphql-tag';\r\nimport StarBorderIcon from '@material-ui/icons/StarBorder';\r\nimport { MatterLookUpQueryParams, retrieveMatterLookUpData, Matters, MatterLookUpData } from './MatterLookUpRepository';\r\nimport { showNotification } from '../../App';\r\nimport _, { debounce } from 'lodash';\r\nimport { client } from '../..';\r\nimport { generateColor } from './ColorGenerator';\r\nimport { InfiniteScrollWrapper } from './InfiniteScrollWrapper';\r\nimport { getMatterTitlePrefix } from '../page/TimeslipMatterPage';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n tabContainer: {\r\n margin: '15px 30px',\r\n },\r\n tab: {\r\n flexGrow: 1,\r\n maxWidth: 'none',\r\n flexBasis: 0,\r\n flexShrink: 1,\r\n minWidth: 0,\r\n },\r\n progress: {\r\n margin: '16px',\r\n textAlign: 'center'\r\n },\r\n listContainer: {\r\n flex: 1,\r\n '& .gridview > div': {\r\n flexFlow: 'column!important',\r\n },\r\n '& .divider': {\r\n display: 'none',\r\n },\r\n '& #table': {\r\n // padding: 0,\r\n }\r\n },\r\n customList: {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n fontSize: '16px',\r\n '& .id': {\r\n color: '#cc1212',\r\n marginBottom: '5px',\r\n },\r\n '& .name': {\r\n marginBottom: '5px',\r\n },\r\n '& .category': {\r\n color: 'rgba(0, 0, 0, 0.54)',\r\n fontSize: '12px',\r\n }\r\n },\r\n starIcon: {\r\n color: '#cc1212',\r\n }\r\n});\r\n\r\nconst loadBlockLimit = 12;\r\n\r\ninterface AllMatterTabProps extends WithStyles {\r\n cancelOrBackOnchange?: () => void;\r\n actionType?: 'back' | 'cancel' | undefined;\r\n search?: string;\r\n // tslint:disable-next-line: no-any\r\n onSelectedItem?: (matter: any) => void;\r\n onTabChange?: (placeholder: string) => void;\r\n sourceSystem: string;\r\n feeEarnerId?: string;\r\n\r\n}\r\n\r\ninterface AllMatterTabStates {\r\n tab: number;\r\n search: string;\r\n // tslint:disable-next-line: no-any\r\n matterLookupList: any;\r\n listHeight?: number;\r\n}\r\n\r\nclass AllMatterTab extends React.Component {\r\n\r\n private offset: number;\r\n private currentRowCount: number;\r\n // private totalCount: number;\r\n private typeFilter: 'ALL' | 'RECENT' | 'FAVOURITE' | 'All' | 'Recent' | 'Favourite' | null;\r\n private statusFilter?: 'ALL' | 'CURRENT' | 'COMPLETE' | 'All' | 'Current' | 'Complete' | null;\r\n \r\n constructor(props: AllMatterTabProps) {\r\n super(props);\r\n this.handleTabChange = this.handleTabChange.bind(this);\r\n this.onSelectItem = this.onSelectItem.bind(this);\r\n this.toggleVIP = this.toggleVIP.bind(this);\r\n this.fetchMatterData = debounce(this.fetchMatterData.bind(this), 500);\r\n this.getInfiniteLoaderAll = this.getInfiniteLoaderAll.bind(this);\r\n this.getInfiniteLoaderCurrent = this.getInfiniteLoaderCurrent.bind(this);\r\n this.getInfiniteLoaderComplete = this.getInfiniteLoaderComplete.bind(this);\r\n this.createAbbreviation = this.createAbbreviation.bind(this);\r\n var search = '';\r\n if (props.search) {\r\n search = props.search;\r\n }\r\n // this.matterData = debounce(this.matterData.bind(this), 500);\r\n this.state = {\r\n tab: 1,\r\n search: search,\r\n matterLookupList: [],\r\n listHeight: 0,\r\n };\r\n\r\n this.offset = 0;\r\n this.currentRowCount = 0;\r\n // this.totalCount = 0;\r\n this.typeFilter = 'All';\r\n this.statusFilter = null;\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: AllMatterTabProps, nextContext: AllMatterTabStates): void {\r\n if (nextProps.search !== this.props.search) {\r\n this.resetSearchProperties(); \r\n\r\n this.setState({ \r\n matterLookupList: [], // Clear the data is the search input is changed\r\n search: nextProps.search ? nextProps.search : '' \r\n });\r\n\r\n // search again with the filter\r\n this.fetchMatterData();\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.fetchMatterData();\r\n\r\n const listElement = jQuery('#allMatterList');\r\n\r\n this.setState({\r\n listHeight: listElement.height(),\r\n });\r\n \r\n } \r\n \r\n render() {\r\n const { classes } = this.props;\r\n\r\n let infiniteScrollTable: JSX.Element;\r\n \r\n if (this.state.tab === 0) {\r\n infiniteScrollTable = this.getInfiniteLoaderAll();\r\n } else if (this.state.tab === 1) {\r\n infiniteScrollTable = this.getInfiniteLoaderCurrent();\r\n } else {\r\n infiniteScrollTable = this.getInfiniteLoaderComplete();\r\n } \r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n {infiniteScrollTable}\r\n \r\n
\r\n
\r\n ); \r\n }\r\n\r\n private getInfiniteLoaderAll() {\r\n const { classes } = this.props;\r\n \r\n return (\r\n {\r\n // if (this.doesMatterFilterPass(matter)) {\r\n const matterTitlePrefix = getMatterTitlePrefix(this.props.sourceSystem, matter);\r\n return (\r\n \r\n \r\n \r\n \r\n {this.createAbbreviation(matterTitlePrefix)}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n matter.isVIP ?\r\n :\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n }\r\n // return null;\r\n }\r\n childData={this.state.matterLookupList}\r\n blockSize={12}\r\n loadData={this.fetchMatterData}\r\n />\r\n );\r\n }\r\n\r\n private listComponent(matter: Matters, matterTitlePrefix: string): React.ReactNode {\r\n const { classes } = this.props;\r\n \r\n return (\r\n
\r\n {matter.fileNumber}\r\n {matter.client}\r\n {`${matterTitlePrefix} | ${matter.title}`}\r\n
\r\n );\r\n }\r\n\r\n private getInfiniteLoaderCurrent() {\r\n const { classes } = this.props;\r\n return (\r\n {\r\n // if (this.doesMatterFilterPass(matter)) {\r\n const matterTitlePrefix = getMatterTitlePrefix(this.props.sourceSystem, matter);\r\n return (\r\n \r\n \r\n \r\n \r\n {this.createAbbreviation(matterTitlePrefix)}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n matter.isVIP ?\r\n :\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n }\r\n // return null;\r\n }\r\n childData={this.state.matterLookupList}\r\n blockSize={12}\r\n loadData={this.fetchMatterData}\r\n />\r\n );\r\n }\r\n\r\n private getInfiniteLoaderComplete() {\r\n const { classes } = this.props;\r\n return (\r\n {\r\n // if (this.doesMatterFilterPass(matter)) {\r\n const matterTitlePrefix = getMatterTitlePrefix(this.props.sourceSystem, matter);\r\n return (\r\n \r\n \r\n \r\n \r\n {this.createAbbreviation(matterTitlePrefix)}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n matter.isVIP ?\r\n :\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n }\r\n // return null;\r\n }\r\n childData={this.state.matterLookupList}\r\n blockSize={12}\r\n loadData={this.fetchMatterData}\r\n />\r\n );\r\n }\r\n\r\n private fetchMatterData(isRefresh?: boolean) {\r\n var matterLookUpQueryParams: MatterLookUpQueryParams = {\r\n offset: this.offset,\r\n first: loadBlockLimit,\r\n filter: this.state.search,\r\n typeFilter: this.typeFilter,\r\n statusFilter: this.statusFilter,\r\n isExcludeCompleted: false,\r\n feeEarnerId: this.props.feeEarnerId\r\n };\r\n\r\n retrieveMatterLookUpData(matterLookUpQueryParams,\r\n true, // refresh data\r\n (data) => this.onDataRetrieved(data),\r\n // tslint:disable-next-line:no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n }); \r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onDataRetrieved(data: MatterLookUpData) {\r\n // append the data if we already have some from previous loading\r\n const matterLookupListData = data.matterLookupList.matters;\r\n\r\n // Set the Total Record count for the search\r\n // const totalRecords = data.matterSummaryList.recordCount;\r\n\r\n // Current record count\r\n const currentRecordCount = matterLookupListData.length;\r\n\r\n this.offset = (this.offset + currentRecordCount);\r\n\r\n this.currentRowCount = (this.currentRowCount + currentRecordCount);\r\n\r\n // this.totalCount = totalRecords;\r\n\r\n let matterLookupList = _.union(this.state.matterLookupList, matterLookupListData);\r\n\r\n this.setState({\r\n matterLookupList: matterLookupList\r\n });\r\n }\r\n\r\n private handleTabChange(event: React.ChangeEvent<{}>, newValue: number) {\r\n switch (newValue) {\r\n case 0: {\r\n this.statusFilter = 'All';\r\n if (this.props.onTabChange) {\r\n this.props.onTabChange('Search all matters');\r\n }\r\n break;\r\n }\r\n case 1: {\r\n this.statusFilter = 'Current';\r\n if (this.props.onTabChange) {\r\n this.props.onTabChange('Search current matters');\r\n }\r\n break;\r\n }\r\n case 2: {\r\n this.statusFilter = 'Complete';\r\n if (this.props.onTabChange) {\r\n this.props.onTabChange('Search complete matters');\r\n }\r\n break;\r\n }\r\n }\r\n\r\n this.resetSearchProperties(); \r\n\r\n this.setState({\r\n tab: newValue,\r\n matterLookupList: []\r\n });\r\n\r\n this.fetchMatterData();\r\n }\r\n\r\n private resetSearchProperties() {\r\n this.offset = 0;\r\n this.currentRowCount = 0;\r\n }\r\n\r\n private createAbbreviation(value: string | null) {\r\n \r\n if(value) {\r\n let values = value.split(' ');\r\n\r\n if(values.length === 1) {\r\n return value.substr(0, 2);\r\n } else {\r\n \r\n let abbr = '';\r\n\r\n for (let index = 0; index < 2; index++) {\r\n abbr += values[index].substr(0, 1);\r\n }\r\n\r\n return abbr;\r\n }\r\n\r\n }\r\n return;\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onSelectItem = (matter: any) => () => {\r\n if (this.props.onSelectedItem) {\r\n this.props.onSelectedItem(matter);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private toggleVIP = (matter: Matters, idx: number) => (event: React.MouseEvent) => {\r\n\r\n const tempMatter: Matters = JSON.parse(JSON.stringify(matter));\r\n \r\n const matterLookupList = JSON.parse(JSON.stringify(this.state.matterLookupList));\r\n\r\n tempMatter.isVIP = !matter.isVIP;\r\n\r\n matterLookupList[idx] = tempMatter;\r\n\r\n client.mutate({\r\n mutation: updateMatterFavourite,\r\n variables: {\r\n matterId: matter.id,\r\n isVIP: tempMatter.isVIP,\r\n feeEarnerId: this.props.feeEarnerId\r\n }\r\n }).then((results: {\r\n data: {\r\n updateMatterAsFavourite: boolean\r\n }\r\n }) => {\r\n var response = results.data.updateMatterAsFavourite;\r\n if (response) {\r\n\r\n this.setState({\r\n matterLookupList: matterLookupList\r\n });\r\n }\r\n // tslint:disable-next-line:no-any\r\n }).catch((reason: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(reason);\r\n });\r\n }\r\n\r\n}\r\n\r\nconst updateMatterFavourite = gql`mutation UpdateMatterAsFavourite($matterId: Int!, $isVIP: Boolean, $feeEarnerId: String) {\r\n updateMatterAsFavourite(matterId: $matterId, shouldFavourite: $isVIP, feeEarnerId: $feeEarnerId)\r\n}`;\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(AllMatterTab as any) as any;","import * as React from 'react';\r\nimport {\r\n withStyles,\r\n WithStyles,\r\n createStyles,\r\n Theme,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n Avatar,\r\n ListItemText,\r\n ListItemSecondaryAction,\r\n IconButton,\r\n Divider,\r\n // CircularProgress,\r\n} from '@material-ui/core';\r\n// import RecentList from '../RecentList';\r\n// import { Query } from 'react-apollo';\r\nimport StarIcon from '@material-ui/icons/Star';\r\nimport gql from 'graphql-tag';\r\nimport StarBorderIcon from '@material-ui/icons/StarBorder';\r\nimport { MatterLookUpQueryParams, retrieveMatterLookUpData, Matters, MatterLookUpData } from './MatterLookUpRepository';\r\nimport { showNotification } from '../../App';\r\nimport _, { debounce } from 'lodash';\r\nimport { client } from '../..';\r\nimport { generateColor } from './ColorGenerator';\r\nimport { InfiniteScrollWrapper } from './InfiniteScrollWrapper';\r\nimport { getMatterTitlePrefix } from '../page/TimeslipMatterPage';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n tabContainer: {\r\n margin: '15px 30px',\r\n },\r\n tab: {\r\n flexGrow: 1,\r\n maxWidth: 'none',\r\n flexBasis: 0,\r\n flexShrink: 1,\r\n minWidth: 0,\r\n },\r\n progress: {\r\n margin: '16px',\r\n textAlign: 'center'\r\n },\r\n listContainer: {\r\n flex: 1,\r\n '& .gridview > div': {\r\n flexFlow: 'column!important',\r\n },\r\n '& .divider': {\r\n display: 'none',\r\n },\r\n '& #table': {\r\n // padding: 0,\r\n }\r\n },\r\n customList: {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n fontSize: '16px',\r\n '& .id': {\r\n color: '#cc1212',\r\n marginBottom: '5px',\r\n },\r\n '& .name': {\r\n marginBottom: '5px',\r\n },\r\n '& .category': {\r\n color: 'rgba(0, 0, 0, 0.54)',\r\n fontSize: '12px',\r\n }\r\n },\r\n starIcon: {\r\n color: '#cc1212',\r\n }\r\n});\r\n\r\nconst loadBlockLimit = 12;\r\n\r\ninterface FavouriteMatterTabProps extends WithStyles {\r\n cancelOrBackOnchange?: () => void;\r\n actionType?: 'back' | 'cancel' | undefined;\r\n search?: string;\r\n // tslint:disable-next-line: no-any\r\n onSelectedItem?: (matter: any) => void;\r\n onTabChange?: (placeholder: string) => void;\r\n sourceSystem: string;\r\n feeEarnerId?: string;\r\n}\r\n\r\ninterface FavouriteMatterTabStates {\r\n tab: number;\r\n search: string;\r\n // tslint:disable-next-line: no-any\r\n matterLookupList: any;\r\n listHeight?: number;\r\n}\r\n\r\nclass FavouriteMatterTab extends React.Component {\r\n\r\n private offset: number;\r\n private currentRowCount: number;\r\n // private totalCount: number;\r\n private typeFilter: 'ALL' | 'RECENT' | 'FAVOURITE' | 'All' | 'Recent' | 'Favourite' | null;\r\n private statusFilter?: 'ALL' | 'CURRENT' | 'COMPLETE' | 'All' | 'Current' | 'Complete' | null;\r\n\r\n constructor(props: FavouriteMatterTabProps) {\r\n super(props);\r\n this.onSelectItem = this.onSelectItem.bind(this);\r\n this.toggleVIP = this.toggleVIP.bind(this);\r\n this.fetchMatterData = debounce(this.fetchMatterData.bind(this), 500);\r\n this.getInfiniteLoaderFavourite = this.getInfiniteLoaderFavourite.bind(this);\r\n this.createAbbreviation = this.createAbbreviation.bind(this);\r\n var search = '';\r\n if (props.search) {\r\n search = props.search;\r\n }\r\n // this.matterData = debounce(this.matterData.bind(this), 500);\r\n this.state = {\r\n tab: 0,\r\n search: search,\r\n matterLookupList: [],\r\n listHeight: 0,\r\n };\r\n\r\n this.offset = 0;\r\n this.currentRowCount = 0;\r\n // this.totalCount = 0;\r\n this.typeFilter = 'Favourite';\r\n this.statusFilter = null;\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: FavouriteMatterTabProps, nextContext: FavouriteMatterTabStates): void {\r\n if (nextProps.search !== this.props.search) {\r\n this.resetSearchProperties();\r\n\r\n this.setState({\r\n matterLookupList: [], // Clear the data is the search input is changed\r\n search: nextProps.search ? nextProps.search : ''\r\n });\r\n\r\n // search again with the filter\r\n this.fetchMatterData();\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.fetchMatterData();\r\n\r\n const listElement = jQuery('#allMatterList');\r\n\r\n this.setState({\r\n listHeight: listElement.height(),\r\n });\r\n\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n \r\n
\r\n {this.getInfiniteLoaderFavourite()}\r\n
\r\n
\r\n );\r\n }\r\n\r\n private listComponent(matter: Matters, matterTitlePrefix: string): React.ReactNode {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n {matter.fileNumber}\r\n {matter.client}\r\n {`${matterTitlePrefix} | ${matter.title}`}\r\n
\r\n );\r\n }\r\n\r\n private getInfiniteLoaderFavourite() {\r\n const { classes } = this.props;\r\n return (\r\n \r\n {\r\n // if (this.doesMatterFilterPass(matter)) {\r\n const matterTitlePrefix = getMatterTitlePrefix(this.props.sourceSystem, matter);\r\n return (\r\n \r\n \r\n \r\n \r\n {this.createAbbreviation(matterTitlePrefix)}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n matter.isVIP ?\r\n :\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n }\r\n // return null;\r\n }\r\n childData={this.state.matterLookupList}\r\n blockSize={12}\r\n loadData={this.fetchMatterData}\r\n />\r\n \r\n );\r\n }\r\n\r\n private fetchMatterData(isRefresh?: boolean) {\r\n var matterLookUpQueryParams: MatterLookUpQueryParams = {\r\n offset: this.offset,\r\n first: loadBlockLimit,\r\n filter: this.state.search,\r\n typeFilter: this.typeFilter,\r\n statusFilter: this.statusFilter,\r\n isExcludeCompleted: false,\r\n feeEarnerId: this.props.feeEarnerId\r\n };\r\n\r\n retrieveMatterLookUpData(matterLookUpQueryParams,\r\n true, // refresh data\r\n (data) => this.onDataRetrieved(data),\r\n // tslint:disable-next-line:no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n });\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onDataRetrieved(data: MatterLookUpData) {\r\n // append the data if we already have some from previous loading\r\n const matterLookupListData = data.matterLookupList.matters;\r\n\r\n // Set the Total Record count for the search\r\n // const totalRecords = data.matterSummaryList.recordCount;\r\n\r\n // Current record count\r\n const currentRecordCount = matterLookupListData.length;\r\n\r\n this.offset = (this.offset + currentRecordCount);\r\n\r\n this.currentRowCount = (this.currentRowCount + currentRecordCount);\r\n\r\n // this.totalCount = totalRecords;\r\n\r\n let matterLookupList = _.union(this.state.matterLookupList, matterLookupListData);\r\n\r\n this.setState({\r\n matterLookupList: matterLookupList\r\n });\r\n }\r\n\r\n private resetSearchProperties() {\r\n this.offset = 0;\r\n this.currentRowCount = 0;\r\n }\r\n\r\n private createAbbreviation(value: string | null) {\r\n \r\n if(value) {\r\n let values = value.split(' ');\r\n\r\n if(values.length === 1) {\r\n return value.substr(0, 2);\r\n } else {\r\n \r\n let abbr = '';\r\n\r\n for (let index = 0; index < 2; index++) {\r\n abbr += values[index].substr(0, 1);\r\n }\r\n\r\n return abbr;\r\n }\r\n\r\n }\r\n return;\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onSelectItem = (matter: any) => () => {\r\n if (this.props.onSelectedItem) {\r\n this.props.onSelectedItem(matter);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private toggleVIP = (matter: Matters, idx: number) => (event: React.MouseEvent) => {\r\n\r\n const tempMatter: Matters = JSON.parse(JSON.stringify(matter));\r\n\r\n const matterLookupList = JSON.parse(JSON.stringify(this.state.matterLookupList));\r\n\r\n tempMatter.isVIP = !matter.isVIP;\r\n\r\n matterLookupList[idx] = tempMatter;\r\n\r\n client.mutate({\r\n mutation: updateMatterFavourite,\r\n variables: {\r\n matterId: matter.id,\r\n isVIP: tempMatter.isVIP,\r\n feeEarnerId: this.props.feeEarnerId\r\n }\r\n }).then((results: {\r\n data: {\r\n updateMatterAsFavourite: boolean\r\n }\r\n }) => {\r\n var response = results.data.updateMatterAsFavourite;\r\n if (response) {\r\n\r\n this.setState({\r\n matterLookupList: matterLookupList\r\n });\r\n }\r\n // tslint:disable-next-line:no-any\r\n }).catch((reason: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(reason);\r\n });\r\n }\r\n\r\n}\r\n\r\nconst updateMatterFavourite = gql`mutation UpdateMatterAsFavourite($matterId: Int!, $isVIP: Boolean, $feeEarnerId: String) {\r\n \tupdateMatterAsFavourite(matterId: $matterId, shouldFavourite: $isVIP, feeEarnerId: $feeEarnerId)\r\n}`;\r\n\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(FavouriteMatterTab as any) as any;","import * as React from 'react';\r\nimport {\r\n withStyles,\r\n WithStyles,\r\n createStyles,\r\n Theme,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n Avatar,\r\n ListItemText,\r\n ListItemSecondaryAction,\r\n IconButton,\r\n Divider,\r\n // CircularProgress,\r\n} from '@material-ui/core';\r\n// import RecentList from '../RecentList';\r\n// import { Query } from 'react-apollo';\r\nimport StarIcon from '@material-ui/icons/Star';\r\nimport gql from 'graphql-tag';\r\nimport StarBorderIcon from '@material-ui/icons/StarBorder';\r\nimport { MatterLookUpQueryParams, retrieveMatterLookUpData, Matters, MatterLookUpData } from './MatterLookUpRepository';\r\nimport { showNotification } from '../../App';\r\nimport _, { debounce } from 'lodash';\r\nimport { client } from '../..';\r\nimport { generateColor } from './ColorGenerator';\r\nimport { InfiniteScrollWrapper } from './InfiniteScrollWrapper';\r\nimport { getMatterTitlePrefix } from '../page/TimeslipMatterPage';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n tabContainer: {\r\n margin: '15px 30px',\r\n },\r\n tab: {\r\n flexGrow: 1,\r\n maxWidth: 'none',\r\n flexBasis: 0,\r\n flexShrink: 1,\r\n minWidth: 0,\r\n },\r\n progress: {\r\n margin: '16px',\r\n textAlign: 'center'\r\n },\r\n listContainer: {\r\n flex: 1,\r\n '& .gridview > div': {\r\n flexFlow: 'column!important',\r\n },\r\n '& .divider': {\r\n display: 'none',\r\n },\r\n '& #table': {\r\n // padding: 0,\r\n }\r\n },\r\n customList: {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n fontSize: '16px',\r\n '& .id': {\r\n color: '#cc1212',\r\n marginBottom: '5px',\r\n },\r\n '& .name': {\r\n marginBottom: '5px',\r\n },\r\n '& .category': {\r\n color: 'rgba(0, 0, 0, 0.54)',\r\n fontSize: '12px',\r\n }\r\n },\r\n starIcon: {\r\n color: '#cc1212',\r\n }\r\n});\r\n\r\nconst loadBlockLimit = 12;\r\n\r\ninterface RecentMatterTabProps extends WithStyles {\r\n cancelOrBackOnchange?: () => void;\r\n actionType?: 'back' | 'cancel' | undefined;\r\n search?: string;\r\n // tslint:disable-next-line: no-any\r\n onSelectedItem?: (matter: any) => void;\r\n onTabChange?: (placeholder: string) => void;\r\n sourceSystem: string;\r\n feeEarnerId?: string;\r\n}\r\n\r\ninterface RecentMatterTabStates {\r\n tab: number;\r\n search: string;\r\n // tslint:disable-next-line: no-any\r\n matterLookupList: any;\r\n listHeight?: number;\r\n}\r\n\r\nclass RecentMatterTab extends React.Component {\r\n\r\n private offset: number;\r\n private currentRowCount: number;\r\n // private totalCount: number;\r\n private typeFilter: 'ALL' | 'RECENT' | 'FAVOURITE' | 'All' | 'Recent' | 'Favourite' | null;\r\n private statusFilter?: 'ALL' | 'CURRENT' | 'COMPLETE' | 'All' | 'Current' | 'Complete' | null;\r\n\r\n constructor(props: RecentMatterTabProps) {\r\n super(props);\r\n this.onSelectItem = this.onSelectItem.bind(this);\r\n this.toggleVIP = this.toggleVIP.bind(this);\r\n this.fetchMatterData = debounce(this.fetchMatterData.bind(this), 500);\r\n this.getInfiniteLoaderFavourite = this.getInfiniteLoaderFavourite.bind(this);\r\n this.createAbbreviation = this.createAbbreviation.bind(this);\r\n var search = '';\r\n if (props.search) {\r\n search = props.search;\r\n }\r\n // this.matterData = debounce(this.matterData.bind(this), 500);\r\n this.state = {\r\n tab: 0,\r\n search: search,\r\n matterLookupList: [],\r\n listHeight: 0,\r\n };\r\n\r\n this.offset = 0;\r\n this.currentRowCount = 0;\r\n // this.totalCount = 0;\r\n this.typeFilter = 'Recent';\r\n this.statusFilter = null;\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: RecentMatterTabProps, nextContext: RecentMatterTabStates): void {\r\n // if (nextProps.search !== this.props.search) {\r\n this.resetSearchProperties();\r\n\r\n this.setState({\r\n matterLookupList: [], // Clear the data is the search input is changed\r\n search: nextProps.search ? nextProps.search : ''\r\n });\r\n\r\n // search again with the filter\r\n this.fetchMatterData();\r\n // }\r\n }\r\n\r\n componentDidMount() {\r\n this.fetchMatterData();\r\n\r\n const listElement = jQuery('#allMatterList');\r\n\r\n this.setState({\r\n listHeight: listElement.height(),\r\n });\r\n\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n \r\n
\r\n {this.getInfiniteLoaderFavourite()}\r\n
\r\n
\r\n );\r\n }\r\n\r\n private listComponent(matter: Matters, matterTitlePrefix: string): React.ReactNode {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n {matter.fileNumber}\r\n {matter.client}\r\n {`${matterTitlePrefix} | ${matter.title}`}\r\n
\r\n );\r\n }\r\n\r\n private getInfiniteLoaderFavourite() {\r\n const { classes } = this.props;\r\n return (\r\n \r\n {\r\n // if (this.doesMatterFilterPass(matter)) {\r\n const matterTitlePrefix = getMatterTitlePrefix(this.props.sourceSystem, matter);\r\n return (\r\n \r\n \r\n \r\n \r\n {this.createAbbreviation(matterTitlePrefix)}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n matter.isVIP ?\r\n :\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n }\r\n // return null;\r\n }\r\n childData={this.state.matterLookupList}\r\n blockSize={12}\r\n loadData={this.fetchMatterData}\r\n />\r\n \r\n );\r\n }\r\n\r\n private fetchMatterData(isRefresh?: boolean) {\r\n var matterLookUpQueryParams: MatterLookUpQueryParams = {\r\n offset: this.offset,\r\n first: loadBlockLimit,\r\n filter: this.state.search,\r\n typeFilter: this.typeFilter,\r\n statusFilter: this.statusFilter,\r\n isExcludeCompleted: false,\r\n feeEarnerId: this.props.feeEarnerId\r\n };\r\n\r\n retrieveMatterLookUpData(matterLookUpQueryParams,\r\n true, // refresh data\r\n (data) => this.onDataRetrieved(data),\r\n // tslint:disable-next-line:no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n });\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onDataRetrieved(data: MatterLookUpData) {\r\n // append the data if we already have some from previous loading\r\n const matterLookupListData = data.matterLookupList.matters;\r\n\r\n // Set the Total Record count for the search\r\n // const totalRecords = data.matterSummaryList.recordCount;\r\n\r\n // Current record count\r\n const currentRecordCount = matterLookupListData.length;\r\n\r\n this.offset = (this.offset + currentRecordCount);\r\n\r\n this.currentRowCount = (this.currentRowCount + currentRecordCount);\r\n\r\n // this.totalCount = totalRecords;\r\n\r\n let matterLookupList = _.union(this.state.matterLookupList, matterLookupListData);\r\n\r\n this.setState({\r\n matterLookupList: matterLookupList\r\n });\r\n }\r\n\r\n private resetSearchProperties() {\r\n this.offset = 0;\r\n this.currentRowCount = 0;\r\n }\r\n\r\n private createAbbreviation(value: string | null) {\r\n \r\n if(value) {\r\n let values = value.split(' ');\r\n\r\n if(values.length === 1) {\r\n return value.substr(0, 2);\r\n } else {\r\n \r\n let abbr = '';\r\n\r\n for (let index = 0; index < 2; index++) {\r\n abbr += values[index].substr(0, 1);\r\n }\r\n\r\n return abbr;\r\n }\r\n\r\n }\r\n return;\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onSelectItem = (matter: any) => () => {\r\n if (this.props.onSelectedItem) {\r\n this.props.onSelectedItem(matter);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private toggleVIP = (matter: Matters, idx: number) => (event: React.MouseEvent) => {\r\n\r\n const tempMatter: Matters = JSON.parse(JSON.stringify(matter));\r\n\r\n const matterLookupList = JSON.parse(JSON.stringify(this.state.matterLookupList));\r\n\r\n tempMatter.isVIP = !matter.isVIP;\r\n\r\n matterLookupList[idx] = tempMatter;\r\n\r\n client.mutate({\r\n mutation: updateMatterFavourite,\r\n variables: {\r\n matterId: matter.id,\r\n isVIP: tempMatter.isVIP,\r\n feeEarnerId: this.props.feeEarnerId\r\n }\r\n }).then((results: {\r\n data: {\r\n updateMatterAsFavourite: boolean\r\n }\r\n }) => {\r\n var response = results.data.updateMatterAsFavourite;\r\n if (response) {\r\n\r\n this.setState({\r\n matterLookupList: matterLookupList\r\n });\r\n }\r\n // tslint:disable-next-line:no-any\r\n }).catch((reason: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(reason);\r\n });\r\n }\r\n\r\n}\r\n\r\nconst updateMatterFavourite = gql`mutation UpdateMatterAsFavourite($matterId: Int!, $isVIP: Boolean, $feeEarnerId: String) {\r\n updateMatterAsFavourite(matterId: $matterId, shouldFavourite: $isVIP, feeEarnerId: $feeEarnerId)\r\n}`;\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(RecentMatterTab as any) as any;","import * as React from 'react';\r\nimport {\r\n withStyles,\r\n WithStyles,\r\n createStyles,\r\n Theme,\r\n Paper,\r\n Tabs,\r\n Tab,\r\n} from '@material-ui/core';\r\n// import Button from '@material-ui/core/Button';\r\n// import AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Typography from '@material-ui/core/Typography';\r\n// import CloseIcon from '@material-ui/icons/Close';\r\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\r\nimport PhoneIcon from '@material-ui/icons/Phone';\r\nimport FavoriteIcon from '@material-ui/icons/Favorite';\r\nimport PersonPinIcon from '@material-ui/icons/PersonPin';\r\n// import SaveIcon from '@material-ui/icons/Save';\r\n// import RecentList from './RecentList';\r\nimport Search from '../matter/Search';\r\nimport AllMatterTab from '../matter/AllMatterTab';\r\nimport _ from 'lodash';\r\nimport FavouriteMatterTab from '../matter/FavouriteMatterTab';\r\nimport RecentMatterTab from '../matter/RecentMatterTab';\r\nimport { MatterLookUpData, MatterLookUpQueryParams, retrieveMatterLookUpData } from '../matter/MatterLookUpRepository';\r\nimport { showNotification } from '../../App';\r\n\r\nexport const styles = (theme: Theme) =>\r\n createStyles({\r\n appBar: {\r\n position: 'relative',\r\n '& > div': {\r\n padding: 0,\r\n }\r\n },\r\n title: {\r\n flex: 1,\r\n textAlign: 'center',\r\n flexGrow: 1,\r\n fontSize: '21px',\r\n fontWeight: 100,\r\n color: '#333333',\r\n lineHeight: '32px',\r\n margin: 0,\r\n fontFamily: 'Segoe UI'\r\n },\r\n content: {\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column'\r\n },\r\n tabContent: {\r\n flex: 1,\r\n overflowY: 'auto',\r\n display: 'flex',\r\n flexFlow: 'column',\r\n '& .gridview > div': {\r\n flexFlow: 'column!important',\r\n },\r\n },\r\n tabs: {\r\n flexGrow: 1,\r\n maxWidth: 'none',\r\n flexBasis: 0,\r\n flexShrink: 1,\r\n minWidth: 0,\r\n },\r\n menu: {},\r\n searchContainer: {\r\n margin: '15px 0',\r\n // backgroundColor: '#f5f5f5'\r\n },\r\n spaceCreator: {\r\n width: '48px',\r\n height: '48px'\r\n },\r\n });\r\n\r\ninterface DialogProps extends WithStyles {\r\n onClose: () => void;\r\n // tslint:disable-next-line: no-any\r\n onData: (data: any) => void;\r\n favMattersFirst?: boolean;\r\n sourceSystem: string;\r\n feeEarnerId?: string;\r\n}\r\n\r\ninterface DialogStates {\r\n // tslint:disable-next-line:no-any\r\n tab: number;\r\n search: string;\r\n searchPlaceholder: string;\r\n // tslint:disable-next-line: no-any\r\n matterLookupList: any;\r\n}\r\n\r\nclass TimeslipMatterPage extends React.Component {\r\n\r\n constructor(props: DialogProps) {\r\n super(props);\r\n this.handleClose = this.handleClose.bind(this);\r\n this.handleTabChange = this.handleTabChange.bind(this);\r\n this.handleSave = this.handleSave.bind(this);\r\n this.onSearch = this.onSearch.bind(this);\r\n this.onMatterSelectedItem = this.onMatterSelectedItem.bind(this);\r\n this.onSelectItem = this.onSelectItem.bind(this);\r\n this.onAllMatterTabChange = this.onAllMatterTabChange.bind(this);\r\n this.fetchMatterData = this.fetchMatterData.bind(this);\r\n this.onDataRetrieved = this.onDataRetrieved.bind(this);\r\n\r\n this.state = {\r\n tab: 2,\r\n search: '',\r\n searchPlaceholder: 'Search favourite matters',\r\n matterLookupList: [],\r\n };\r\n this.fetchMatterData();\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: DialogProps, nextContext: DialogStates): void {\r\n // code here\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n let infiniteScrollWrapper: JSX.Element;\r\n\r\n if (this.state.tab === 0) {\r\n infiniteScrollWrapper = (\r\n \r\n );\r\n } else if (this.state.tab === 1) {\r\n infiniteScrollWrapper = (\r\n \r\n );\r\n } else {\r\n infiniteScrollWrapper = (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n Matter\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {infiniteScrollWrapper}\r\n
\r\n \r\n \r\n }\r\n label=\"RECENTS\"\r\n />\r\n }\r\n label=\"All\"\r\n />\r\n }\r\n label=\"FAVORITES\"\r\n />\r\n \r\n \r\n
\r\n \r\n );\r\n }\r\n private fetchMatterData() {\r\n var matterLookUpQueryParams: MatterLookUpQueryParams = {\r\n offset: 0,\r\n first: 1,\r\n filter: this.state.search,\r\n typeFilter: \"Favourite\",\r\n statusFilter: \"All\",\r\n isExcludeCompleted: false,\r\n feeEarnerId: this.props.feeEarnerId\r\n };\r\n\r\n retrieveMatterLookUpData(matterLookUpQueryParams,\r\n true, // refresh data\r\n (data) => this.onDataRetrieved(data),\r\n // tslint:disable-next-line:no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n });\r\n }\r\n\r\n private onDataRetrieved(data: MatterLookUpData) {\r\n // append the data if we already have some from previous loading\r\n const matterLookupListData = data.matterLookupList.matters;\r\n\r\n // Set the Total Record count for the search\r\n // const totalRecords = data.matterSummaryList.recordCount;\r\n\r\n // Current record count\r\n const currentRecordCount = matterLookupListData.length;\r\n if (currentRecordCount === 0) {\r\n this.setState({tab:0, searchPlaceholder: 'Search recent matters',})\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n private handleClose() {\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n private onSearch(value: string) {\r\n this.setState({\r\n search: value\r\n });\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onMatterSelectedItem(matter: any) {\r\n if (this.props.onData) {\r\n this.props.onData(matter);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onSelectItem = (matter: any) => () => {\r\n if (this.props.onData) {\r\n this.props.onData(matter);\r\n }\r\n }\r\n\r\n private handleSave() {\r\n if (this.props.onData) {\r\n this.props.onData('data');\r\n }\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n private onAllMatterTabChange(placeholder: string) {\r\n this.setState({\r\n searchPlaceholder: placeholder\r\n });\r\n }\r\n\r\n private handleTabChange(event: React.ChangeEvent<{}>, newValue: number) {\r\n let placeholder = '';\r\n switch (newValue) {\r\n case 0: {\r\n placeholder = 'Search recent matters';\r\n break;\r\n }\r\n case 1: {\r\n placeholder = 'Search all matters';\r\n break;\r\n }\r\n default: {\r\n placeholder = 'Search favourite matters';\r\n break;\r\n }\r\n }\r\n\r\n this.setState({\r\n tab: newValue,\r\n searchPlaceholder: placeholder,\r\n });\r\n\r\n }\r\n}\r\n\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(TimeslipMatterPage as any) as any;\r\n\r\n// tslint:disable-next-line:no-any\r\nexport function getMatterTitlePrefix(sourceSystem: string, matter: any): string {\r\n if (sourceSystem.toLowerCase() === 'inprotech') {\r\n return matter.propertyLabel ? matter.propertyLabel : '';\r\n }\r\n\r\n return matter.matterCategory ? matter.matterCategory : '';\r\n\r\n}\r\n","import * as React from 'react';\r\nimport { \r\n withStyles, \r\n WithStyles, \r\n createStyles, \r\n Theme,\r\n TextField,\r\n} from '@material-ui/core';\r\n// import AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Typography from '@material-ui/core/Typography';\r\n// import CloseIcon from '@material-ui/icons/Close';\r\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport moment from 'moment';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n appBar: {\r\n position: 'relative',\r\n '& > div': {\r\n padding: 0,\r\n }\r\n },\r\n title: {\r\n flex: 1,\r\n textAlign: 'center',\r\n flexGrow: 1,\r\n fontSize: '21px',\r\n fontWeight: 100,\r\n color: '#333333',\r\n lineHeight: '32px',\r\n margin: 0,\r\n fontFamily: 'Segoe UI'\r\n },\r\n dialog: {\r\n '& > div': {\r\n boxShadow: 'none',\r\n }\r\n },\r\n content: {\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column wrap',\r\n // padding: '0 15px',\r\n },\r\n textField: {\r\n margin: '0 15px',\r\n flex: 1,\r\n },\r\n dateContainer: {\r\n padding: '20px 0',\r\n },\r\n fieldContainer: {\r\n display: 'flex',\r\n margin: '0 -15px',\r\n }\r\n});\r\n\r\ninterface DialogProps extends WithStyles {\r\n onClose: () => void;\r\n // tslint:disable-next-line: no-any\r\n onData: (data: any) => void; \r\n date?: Date;\r\n}\r\n\r\ninterface DialogStates {\r\n date: {\r\n time: string;\r\n date: string;\r\n };\r\n}\r\n\r\nclass TimeslipStartPage extends React.Component {\r\n constructor(props: DialogProps) {\r\n super(props);\r\n this.handleClose = this.handleClose.bind(this);\r\n this.handleDateChange = this.handleDateChange.bind(this);\r\n this.handleSave = this.handleSave.bind(this);\r\n this.state = {\r\n date: {\r\n time: moment().format('HH:mm'),\r\n date: moment().format('YYYY-MM-DD'),\r\n }\r\n };\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: DialogProps, nextContext: DialogStates): void {\r\n // code here...\r\n if (this.props.date !== nextProps.date && nextProps.date) {\r\n var currDate = moment(nextProps.date);\r\n this.setState({ date: { time: currDate.format('HH:mm'), date: currDate.format('YYYY-MM-DD')}});\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n var currDate = moment(this.props.date);\r\n this.setState({ date: { time: currDate.format('HH:mm'), date: currDate.format('YYYY-MM-DD')}});\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n Starts\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
Start Date
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n ); \r\n }\r\n\r\n private handleClose() {\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n private handleSave() {\r\n if (this.props.onData) {\r\n const date = this.state.date.date + 'T' + this.state.date.time;\r\n const display = new Date(date);\r\n this.props.onData(display);\r\n }\r\n }\r\n\r\n private handleDateChange = (field: string) => (event: React.ChangeEvent) => {\r\n const date = this.state.date;\r\n date[field] = event.target.value;\r\n this.setState({ date: date });\r\n }\r\n\r\n}\r\n\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(TimeslipStartPage as any) as any;","import * as React from 'react';\r\nimport { \r\n withStyles, \r\n WithStyles, \r\n createStyles, \r\n Theme,\r\n Paper,\r\n Tabs,\r\n Tab,\r\n CircularProgress,\r\n List,\r\n ListItem,\r\n ListItemSecondaryAction,\r\n ListItemText,\r\n Divider\r\n} from '@material-ui/core';\r\n// import Button from '@material-ui/core/Button';\r\n// import AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Typography from '@material-ui/core/Typography';\r\n// import CloseIcon from '@material-ui/icons/Close';\r\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\r\n// import RecentList from './RecentList';\r\nimport gql from 'graphql-tag';\r\nimport StarIcon from '@material-ui/icons/Star';\r\nimport StarBorderIcon from '@material-ui/icons/StarBorder';\r\nimport { client } from '../..';\r\n// import SaveIcon from '@material-ui/icons/Save';\r\nimport Search from '../matter/Search';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n appBar: {\r\n position: 'relative',\r\n '& > div': {\r\n padding: 0,\r\n }\r\n },\r\n title: {\r\n flex: 1,\r\n textAlign: 'center',\r\n flexGrow: 1,\r\n fontSize: '21px',\r\n fontWeight: 100,\r\n color: '#333333',\r\n lineHeight: '32px',\r\n margin: 0,\r\n fontFamily: 'Segoe UI'\r\n },\r\n dialog: {\r\n '& > div': {\r\n boxShadow: 'none',\r\n }\r\n },\r\n content: {\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column wrap'\r\n },\r\n tabContent: {\r\n flex: 1,\r\n overflowY: 'auto'\r\n },\r\n tabContainer: {\r\n margin: '15px 0px',\r\n },\r\n tab: {\r\n flexGrow: 1,\r\n maxWidth: 'none',\r\n flexBasis: 0,\r\n flexShrink: 1,\r\n },\r\n spaceCreator: {\r\n width: '48px',\r\n height: '48px',\r\n },\r\n progress: {\r\n margin: '16px',\r\n textAlign: 'center'\r\n },\r\n starIcon: {\r\n color: '#cc1212',\r\n },\r\n searchContainer: {\r\n margin: '15px 0',\r\n },\r\n});\r\n\r\ninterface DialogProps extends WithStyles {\r\n onClose: () => void;\r\n // tslint:disable-next-line: no-any\r\n onData: (data: any) => void;\r\n favActivityFirst?: boolean;\r\n feeEarnerId?: string;\r\n}\r\n\r\ninterface DialogStates {\r\n tab: number;\r\n // tslint:disable-next-line:no-any\r\n activityLookupList: any;\r\n listHeight?: number;\r\n search: string;\r\n}\r\n\r\nclass TimeslipActivityPage extends React.Component {\r\n constructor(props: DialogProps) {\r\n super(props);\r\n this.handleClose = this.handleClose.bind(this);\r\n this.handleTabChange = this.handleTabChange.bind(this);\r\n this.handleSave = this.handleSave.bind(this);\r\n this.onSelectItem = this.onSelectItem.bind(this);\r\n this.toggleVIP = this.toggleVIP.bind(this);\r\n this.onSearch = this.onSearch.bind(this);\r\n this.state = {\r\n tab: this.props.favActivityFirst ? 0 : 1,\r\n activityLookupList: [],\r\n listHeight: 0,\r\n search: ''\r\n };\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: DialogProps, nextContext: DialogStates): void {\r\n // code here...\r\n }\r\n\r\n componentDidMount() {\r\n const listElement = jQuery('.tabContent');\r\n\r\n // tslint:disable-next-line: no-console\r\n console.log('height', listElement.height());\r\n\r\n let height = listElement.height() !== undefined ? listElement.height() : 200;\r\n\r\n this.setState({\r\n listHeight: height\r\n });\r\n\r\n this.fetchActivities();\r\n }\r\n\r\n timesheetActivityData(clientOnly: boolean) {\r\n const { classes } = this.props;\r\n const activities = this.state.activityLookupList ? this.state.activityLookupList.filter((value: { isVIP: boolean; }) => { \r\n return (value.isVIP || this.state.tab === 1); }) : null;\r\n \r\n const item = this.getPrivate(activities, classes);\r\n\r\n return (\r\n \r\n {item} \r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n Activity\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\n \r\n
\r\n {this.state.tab === 0 && this.timesheetActivityData(false)}\r\n {this.state.tab === 1 && this.timesheetActivityData(false)}\r\n
\r\n
\r\n \r\n ); \r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private getPrivate(activities: any, classes: any) {\r\n\r\n // tslint:disable-next-line: no-any\r\n const searchActivities = activities\r\n // tslint:disable-next-line: no-any\r\n .filter((activity: any) => activity.stringValue.toLowerCase().includes(this.state.search.toLowerCase()));\r\n\r\n if (activities) {\r\n return (\r\n \r\n {\r\n // tslint:disable-next-line: no-any\r\n searchActivities.map( (activity: any, idx: number) => \r\n (\r\n \r\n \r\n \r\n \r\n \r\n {\r\n activity.isVIP ?\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 } else {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n }\r\n\r\n private handleClose() {\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n private handleSave() {\r\n if (this.props.onData) {\r\n this.props.onData('data');\r\n }\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onSelectItem = (activity: any) => () => {\r\n if (this.props.onData) {\r\n this.props.onData(activity);\r\n }\r\n }\r\n\r\n private handleTabChange(event: React.ChangeEvent<{}>, newValue: number) {\r\n this.setState({ tab: newValue });\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private toggleVIP = (activity: any, idx: number) => (event: React.MouseEvent) => {\r\n\r\n // tslint:disable-next-line: no-any\r\n const tempActivity: any = JSON.parse(JSON.stringify(activity));\r\n \r\n const activityLookupList = JSON.parse(JSON.stringify(this.state.activityLookupList));\r\n\r\n tempActivity.isVIP = !tempActivity.isVIP;\r\n\r\n activityLookupList[idx] = tempActivity;\r\n\r\n client.mutate({\r\n mutation: updateActivityAsFavourite,\r\n variables: {\r\n activityId: tempActivity.id,\r\n isVIP: tempActivity.isVIP\r\n }\r\n }).then((results: {\r\n data: {\r\n updateActivityAsFavourite: boolean\r\n }\r\n }) => {\r\n var response = results.data.updateActivityAsFavourite;\r\n if (response) {\r\n\r\n this.setState({\r\n activityLookupList: activityLookupList\r\n });\r\n }\r\n // tslint:disable-next-line:no-any\r\n }).catch((reason: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(reason);\r\n });\r\n }\r\n\r\n private fetchActivities() {\r\n client.query({\r\n query: TimesheetActivitiesQuery,\r\n variables: {\r\n feeEarnerId: this.props.feeEarnerId\r\n },\r\n fetchPolicy: 'cache-first' \r\n }).then((results: {\r\n data: {\r\n timesheetActivities: {\r\n favouriteActivitiesCount: number\r\n // tslint:disable-next-line:no-any\r\n activities: any\r\n }\r\n }\r\n }) => {\r\n if (results.data.timesheetActivities) {\r\n this.setState({activityLookupList: results.data.timesheetActivities.activities, tab: results.data.timesheetActivities.favouriteActivitiesCount === 0 ? 1 : 0});\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n }).catch((reason: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(reason);\r\n });\r\n }\r\n\r\n private onSearch(_value: string) {\r\n this.setState({\r\n search: _value\r\n });\r\n }\r\n}\r\n\r\nconst TimesheetActivitiesQuery = gql\r\n`query timesheetActivities ($feeEarnerId: String) {\r\n timesheetActivities(clientOnly: false, feeEarnerId: $feeEarnerId) {\r\n favouriteActivitiesCount\r\n activities {\r\n id\r\n stringValue\r\n isVIP\r\n isFirmActivity\r\n }\r\n }\r\n }\r\n `;\r\n\r\nconst updateActivityAsFavourite = gql`mutation updateActivityAsFavourite($activityId: Int!, $isVIP: Boolean!, $feeEarnerId: String) {\r\n updateActivityAsFavourite(activityId: $activityId, shouldFavourite: $isVIP, feeEarnerId: $feeEarnerId)\r\n}`;\r\n \r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(TimeslipActivityPage as any) as any;","import * as React from 'react';\r\nimport { \r\n withStyles, \r\n WithStyles, \r\n createStyles, \r\n Theme,\r\n // Paper,\r\n // Tabs,\r\n // Tab,\r\n Button,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Divider,\r\n TextField,\r\n} from '@material-ui/core';\r\n// import Button from '@material-ui/core/Button';\r\n// import AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Typography from '@material-ui/core/Typography';\r\n// import CloseIcon from '@material-ui/icons/Close';\r\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport Search from '../matter/Search';\r\nimport { Query } from 'react-apollo';\r\nimport gql from 'graphql-tag';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n appBar: {\r\n position: 'relative',\r\n '& > div': {\r\n padding: 0,\r\n }\r\n },\r\n title: {\r\n flex: 1,\r\n textAlign: 'center',\r\n flexGrow: 1,\r\n fontSize: '21px',\r\n fontWeight: 100,\r\n color: '#333333',\r\n lineHeight: '32px',\r\n margin: 0,\r\n fontFamily: 'Segoe UI'\r\n },\r\n dialog: {\r\n '& > div': {\r\n boxShadow: 'none',\r\n }\r\n },\r\n content: {\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column wrap'\r\n },\r\n tabContainer: {\r\n margin: '15px 0px',\r\n },\r\n tab: {\r\n flexGrow: 1,\r\n maxWidth: 'none',\r\n flexBasis: 0,\r\n flexShrink: 1,\r\n },\r\n button: {\r\n \r\n },\r\n contentCol: {\r\n flex: 1,\r\n padding: '15px 0'\r\n },\r\n buttonWrapper: {\r\n textAlign: 'center',\r\n },\r\n listContainer: {\r\n\r\n },\r\n list: {\r\n\r\n },\r\n selectedContainer: {\r\n padding: '15px 15px',\r\n minHeight: '100px',\r\n fontSize: '18px',\r\n fontWeight: 600\r\n },\r\n searchWrapper: {\r\n // backgroundColor: '#f5f5f5',\r\n // margin: '0 -15px',\r\n padding: '15px 0',\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});\r\n\r\ninterface DialogProps extends WithStyles {\r\n onClose: () => void;\r\n // tslint:disable-next-line: no-any\r\n onData: (data: any, isInprotechNote: boolean) => void;\r\n note: string;\r\n isInprotechNote: boolean;\r\n title: string;\r\n}\r\n\r\ninterface DialogStates {\r\n tab: number;\r\n note: string;\r\n filter: string;\r\n}\r\n\r\nclass TimeslipNotesPage extends React.Component {\r\n constructor(props: DialogProps) {\r\n super(props);\r\n this.handleClose = this.handleClose.bind(this);\r\n this.handleTabChange = this.handleTabChange.bind(this);\r\n this.handleSave = this.handleSave.bind(this);\r\n this.handleTextChange = this.handleTextChange.bind(this);\r\n this.handleClear = this.handleClear.bind(this);\r\n this.onSelectItem = this.onSelectItem.bind(this);\r\n this.handleSearch = this.handleSearch.bind(this);\r\n this.state = {\r\n tab: 0,\r\n note: this.props.note,\r\n filter: ''\r\n };\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: DialogProps, nextContext: DialogStates): void {\r\n // code here...\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n \r\n {/* tslint:disable-next-line: no-any */}\r\n \r\n key=\"timesheet-notes\"\r\n query={standardNotesList}\r\n >\r\n {({\r\n // tslint:disable-next-line: no-shadowed-variable\r\n loading, error, data \r\n }) => {\r\n // tslint:disable-next-line:no-any\r\n var subjectList: any[] = [];\r\n // tslint:disable-next-line:no-any\r\n if (data && data.defaultNarrative) {\r\n data.defaultNarrative.narratives.forEach((s: { stringValue: string; }) => {\r\n // tslint:disable-next-line:no-console\r\n if (s.stringValue.toLowerCase().includes(this.state.filter.toLowerCase())) {\r\n subjectList.push(s.stringValue);\r\n\r\n }\r\n });\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {this.props.title}\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\n \r\n */}\r\n {this.props.isInprotechNote ?
:
\r\n
\r\n \r\n
\r\n \r\n {subjectList.map( (activity: string, index: number) => (\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\n return (
);\r\n \r\n }}\r\n \r\n \r\n ); \r\n }\r\n // tslint:disable-next-line:no-any\r\n private handleTextChange (event: any) {\r\n // tslint:disable-next-line:no-console\r\n this.setState({ note: event.target.value });\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private handleSearch (event: any) {\r\n // tslint:disable-next-line:no-console\r\n this.setState({ filter: event });\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onSelectItem = (note: any) => () => {\r\n // tslint:disable-next-line:no-console\r\n console.log('note', note);\r\n if (this.props.onData) {\r\n this.props.onData(note, this.props.isInprotechNote);\r\n }\r\n }\r\n\r\n private handleClear() {\r\n this.setState({ note: '' });\r\n }\r\n\r\n private handleClose() {\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n private handleSave() {\r\n if (this.props.onData) {\r\n this.props.onData(this.state.note, this.props.isInprotechNote);\r\n }\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n private handleTabChange(event: React.ChangeEvent<{}>, newValue: number) {\r\n this.setState({ tab: newValue });\r\n }\r\n}\r\nconst standardNotesList = gql`query DefaultNotes {\r\n defaultNarrative {\r\n recordCount\r\n narratives {\r\n stringValue\r\n }\r\n }\r\n}`;\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(TimeslipNotesPage as any) as any;","import * as React from 'react';\r\nimport {\r\n withStyles,\r\n WithStyles,\r\n createStyles,\r\n Theme,\r\n List,\r\n CircularProgress,\r\n ListItem,\r\n ListItemText,\r\n Divider,\r\n ListItemSecondaryAction,\r\n Button,\r\n TextField\r\n} from '@material-ui/core';\r\n// import AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Typography from '@material-ui/core/Typography';\r\n// import CloseIcon from '@material-ui/icons/Close';\r\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\r\n// import RecentList from './RecentList';\r\n// import StarBorderIcon from '@material-ui/icons/StarBorder';\r\nimport gql from 'graphql-tag';\r\nimport { client } from '../..';\r\n// import { RvInput } from '../../components/Input';\r\n\r\nexport const styles = (theme: Theme) => createStyles({\r\n appBar: {\r\n position: 'relative',\r\n '& > div': {\r\n padding: 0,\r\n }\r\n },\r\n title: {\r\n flex: 1,\r\n textAlign: 'center',\r\n flexGrow: 1,\r\n fontSize: '21px',\r\n fontWeight: 100,\r\n color: '#333333',\r\n lineHeight: '32px',\r\n margin: 0,\r\n fontFamily: 'Segoe UI'\r\n },\r\n dialog: {\r\n '& > div': {\r\n boxShadow: 'none',\r\n }\r\n },\r\n content: {\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column wrap'\r\n },\r\n tabContainer: {\r\n margin: '15px 30px',\r\n },\r\n tab: {\r\n flexGrow: 1,\r\n maxWidth: 'none',\r\n flexBasis: 0,\r\n flexShrink: 1,\r\n },\r\n spaceCreator: {\r\n width: '48px',\r\n height: '48px',\r\n },\r\n progress: {\r\n margin: '16px',\r\n textAlign: 'center'\r\n },\r\n searchContainer: {\r\n padding: '15px 0',\r\n // backgroundColor: '#f5f5f5'\r\n },\r\n listContent: {\r\n flex: 1,\r\n overflowY: 'auto',\r\n },\r\n textField: {\r\n width: '100%',\r\n },\r\n chargeRateInputWrapper: {\r\n display: 'flex',\r\n padding: '20px 0',\r\n margin: '0 -10px',\r\n '& .field-wrapper': {\r\n flex: 1,\r\n },\r\n '& > div': {\r\n padding: '0 10px'\r\n }\r\n }\r\n});\r\n\r\ninterface DialogProps extends WithStyles {\r\n onClose: () => void;\r\n // tslint:disable-next-line: no-any\r\n onData: (data: any) => void;\r\n sourceSystem: string;\r\n}\r\n\r\ninterface DialogStates {\r\n // tslint:disable-next-line:no-any\r\n chargeRateLookupList: any[];\r\n listHeight?: number;\r\n rate: number;\r\n}\r\n\r\nclass TimeslipChargeCodePage extends React.Component {\r\n constructor(props: DialogProps) {\r\n super(props);\r\n this.handleClose = this.handleClose.bind(this);\r\n this.onSelectItem = this.onSelectItem.bind(this);\r\n this.getPrivate = this.getPrivate.bind(this);\r\n this.fetchChargeCodes = this.fetchChargeCodes.bind(this);\r\n this.handleTextChange = this.handleTextChange.bind(this);\r\n this.handlePress = this.handlePress.bind(this);\r\n this.state = {\r\n chargeRateLookupList: [],\r\n rate: 0\r\n };\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: DialogProps, nextContext: DialogStates): void {\r\n // code here...\r\n }\r\n\r\n componentDidMount() {\r\n const listElement = jQuery('.tabContent');\r\n\r\n // tslint:disable-next-line: no-console\r\n console.log('height', listElement.height());\r\n\r\n let height = listElement.height() !== undefined ? listElement.height() : 200;\r\n\r\n this.setState({\r\n listHeight: height\r\n });\r\n var isPE = this.props.sourceSystem === 'PracticeEvolved';\r\n this.fetchChargeCodes(isPE);\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n var chargeCodeTitle = this.props.sourceSystem === 'Coyote' ? 'Task Code' : 'Charge Code';\r\n\r\n var chargeRateInput =
;\r\n if (this.props.sourceSystem === 'PracticeEvolved') {\r\n chargeRateInput =\r\n (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n {chargeCodeTitle}\r\n \r\n \r\n
\r\n
\r\n {chargeRateInput}\r\n
\r\n {this.timesheetActivityData()}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n timesheetActivityData() {\r\n const { classes } = this.props;\r\n const chargeCodes = this.state.chargeRateLookupList;\r\n const item = this.getPrivate(chargeCodes, classes);\r\n\r\n return (\r\n \r\n {item} \r\n \r\n );\r\n }\r\n\r\n private handleClose() {\r\n if (this.props.onClose) {\r\n return this.props.onClose();\r\n }\r\n }\r\n\r\n private handleTextChange(event: React.ChangeEvent) {\r\n\r\n var rate = parseInt(event.target.value, 10);\r\n this.setState({rate: rate});\r\n }\r\n\r\n private handlePress() {\r\n if (this.props.onData) {\r\n this.props.onData({ rate: this.state.rate, description: 'Custom Rate'});\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onSelectItem = (chargeCode: any) => () => {\r\n if (this.props.onData) {\r\n this.props.onData(chargeCode);\r\n }\r\n }\r\n\r\n private fetchChargeCodes(isPE: boolean) {\r\n\r\n if (isPE) {\r\n client.query({\r\n query: PeChargeCodes,\r\n fetchPolicy: 'network-only' \r\n }).then((results: {\r\n data: {\r\n pEChargeRates: {\r\n // tslint:disable-next-line:no-any\r\n pEChargeRate: any\r\n }\r\n }\r\n }) => {\r\n if (results.data.pEChargeRates) {\r\n this.setState({chargeRateLookupList: results.data.pEChargeRates.pEChargeRate});\r\n }\r\n \r\n // tslint:disable-next-line:no-any\r\n }).catch((reason: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(reason);\r\n });\r\n } else {\r\n client.query({\r\n query: ChargeCodes,\r\n fetchPolicy: 'network-only' \r\n }).then((results: {\r\n data: {\r\n chargeCodes: {\r\n // tslint:disable-next-line:no-any\r\n chargeCode: any\r\n }\r\n }\r\n }) => {\r\n if (results.data.chargeCodes) {\r\n this.setState({chargeRateLookupList: results.data.chargeCodes.chargeCode});\r\n }\r\n \r\n // tslint:disable-next-line:no-any\r\n }).catch((reason: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(reason);\r\n });\r\n }\r\n\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private getPrivate(activities: any, classes: any) {\r\n\r\n if (this.props.sourceSystem === 'PracticeEvolved') {\r\n var tempActivities = new Array;\r\n // tslint:disable-next-line:forin\r\n \r\n // tslint:disable-next-line:no-any\r\n activities.map((activity: any, idx: number) =>\r\n (tempActivities.push ({ id: activity.id, description: activity.stringValue, rate: activity.moneyValue})));\r\n \r\n activities = tempActivities;\r\n }\r\n if (activities) {\r\n return (\r\n \r\n {\r\n // tslint:disable-next-line: no-any\r\n activities.map( (activity: any, idx: number) => \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 } else {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n }\r\n}\r\nconst ChargeCodes = gql`query ChargeCodes {\r\n chargeCodes {\r\n chargeCode {\r\n description\r\n rate\r\n id\r\n }\r\n }\r\n }`;\r\n\r\nconst PeChargeCodes = gql`query PEChargeCodes {\r\n pEChargeRates {\r\n pEChargeRate {\r\n moneyValue\r\n stringValue\r\n id\r\n }\r\n }\r\n }`;\r\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(TimeslipChargeCodePage as any) as any;","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useState } from 'react';\r\nimport { makeStyles, Theme, createStyles, withStyles } from '@material-ui/core/styles';\r\n// import { name, random } from 'faker';\r\nimport gql from 'graphql-tag';\r\nimport { FetchPolicy } from 'apollo-client';\r\nimport { TextField, CircularProgress, ListItemText, ListItem, ListItemAvatar, Avatar, ListItemSecondaryAction, IconButton, Tooltip } from '@material-ui/core';\r\n// import { IAutoCompleteItem } from '../../typings/autoComplete';\r\nimport { RenderInputParams } from '@material-ui/lab';\r\nimport { useDebouncedCallback } from 'use-debounce/lib';\r\nimport { IAutoCompleteItem } from '../../typings/autoComplete';\r\nimport { showNotification } from '../../App';\r\nimport { InfiniteAutocomplete } from '../../components/InfiniteAutocomplete';\r\nimport { client } from '../..';\r\nimport StarIcon from '@material-ui/icons/Star';\r\nimport StarBorderIcon from '@material-ui/icons/StarBorder';\r\nimport { generateColor } from '../matter/ColorGenerator';\r\nimport { getMatterTitlePrefix } from '../page/TimeslipMatterPage';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n // minWidth: '200px',\r\n },\r\n textField: {\r\n // width: '100%',\r\n },\r\n iconSelected: {\r\n width: 17,\r\n height: 17,\r\n marginRight: 5,\r\n marginLeft: -2,\r\n },\r\n color: {\r\n width: 14,\r\n height: 14,\r\n flexShrink: 0,\r\n borderRadius: 3,\r\n marginRight: 8,\r\n marginTop: 2,\r\n },\r\n text: {\r\n flexGrow: 1,\r\n },\r\n close: {\r\n opacity: 0.6,\r\n width: 18,\r\n height: 18,\r\n },\r\n renderWrapper: {\r\n padding: '15px 0'\r\n },\r\n customRenderWrapper: {\r\n display: 'flex',\r\n margin: '0 -10px',\r\n width: '100%',\r\n '& > div': {\r\n padding: '0 10px',\r\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif',\r\n fontWeight: 400,\r\n },\r\n '& .icon-wrapper': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n '& .other': {\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column',\r\n '& .primary': {\r\n fontSize: '1rem',\r\n lineHeight: 1.5,\r\n letterSpacing: '0.00938em',\r\n },\r\n '& .secondary': {\r\n color: 'rgba(0, 0, 0, 0.54)',\r\n fontSize: '0.875rem',\r\n lineHeight: 1.43,\r\n letterSpacing: '0.01071em',\r\n }\r\n }\r\n },\r\n customList: {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n fontSize: '16px',\r\n '& .id': {\r\n color: '#cc1212',\r\n marginBottom: '5px',\r\n },\r\n '& .name': {\r\n marginBottom: '5px',\r\n },\r\n '& .category': {\r\n color: 'rgba(0, 0, 0, 0.54)',\r\n fontSize: '12px',\r\n }\r\n },\r\n starIcon: {\r\n color: '#cc1212',\r\n },\r\n listItem: {\r\n width: '100%',\r\n },\r\n listBox: {\r\n '& .MuiListItem-container': {\r\n width: '100%'\r\n }\r\n }\r\n })\r\n);\r\n\r\nexport interface MatterLookUpItem extends IAutoCompleteItem, Matter {\r\n\r\n}\r\n\r\ninterface MatterLookUpAutoCompleteSelectorProps {\r\n multiple?: boolean;\r\n label?: string;\r\n name: string;\r\n // tslint:disable-next-line: no-any\r\n value?: MatterLookUpItem | any; // value only available in single select\r\n onSelection?: (value: MatterLookUpItem | MatterLookUpItem[], name: string) => void;\r\n required?: boolean;\r\n id?: string;\r\n sourceSystem: string;\r\n disabled?: boolean;\r\n disablePortal?: boolean;\r\n onBlur?: React.FocusEventHandler;\r\n helperText?: string;\r\n error?: boolean;\r\n descriptionLimit?: number;\r\n tabIndex?: number;\r\n // tslint:disable-next-line: no-any\r\n ref?: any;\r\n autoFocus?: boolean;\r\n statusFilter: string;\r\n isExcludeCompleted?: boolean;\r\n}\r\n\r\ninterface MatterLookUpAutoCompleteSelectorState {\r\n hasNextPage: boolean;\r\n isNextPageLoading: boolean;\r\n offset: number;\r\n // tslint:disable-next-line: no-any\r\n items: MatterLookUpItem[];\r\n filter: string;\r\n open: boolean;\r\n}\r\n\r\n// tslint:disable-next-line:no-any\r\nlet observable: any = null;\r\n\r\nexport const MatterLookUpAutoCompleteSelector: React.FC = props => {\r\n\r\n const classes = useStyles();\r\n const loadBlockLimit = 20;\r\n\r\n const [delayedonInputChange] = useDebouncedCallback(\r\n // function\r\n (event: React.ChangeEvent<{}>, value: string, reason: 'input' | 'reset' | 'clear') => {\r\n\r\n let isClear = false;\r\n let offset = 0;\r\n let filter = '';\r\n\r\n if (reason === 'input') {\r\n filter = value;\r\n isClear = true;\r\n\r\n fetchData(filter, offset, isClear);\r\n }\r\n },\r\n // delay in ms\r\n 500\r\n );\r\n \r\n const [state, setState] = useState({\r\n hasNextPage: true,\r\n isNextPageLoading: false,\r\n offset: 0,\r\n items: [],\r\n filter: '',\r\n open: false\r\n });\r\n\r\n const fetchData = (filter: string, offset: number, isClear: boolean) => {\r\n\r\n if (observable) {\r\n // tslint:disable-next-line: no-console\r\n // console.log('observable unsubscribe', observable);\r\n observable.unsubscribe();\r\n }\r\n \r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isNextPageLoading: true,\r\n };\r\n });\r\n\r\n const matterLookupParams: MatterLookupQueryParams = {\r\n filter: filter,\r\n first: loadBlockLimit,\r\n offset: offset,\r\n statusFilter: props.statusFilter,\r\n typeFilter: undefined,\r\n isLimitedMatterSearch: true,\r\n isExcludeCompleted: props.isExcludeCompleted\r\n };\r\n\r\n observable =\r\n retrieveMatterLookupData(\r\n matterLookupParams,\r\n true, // this.state.isRefresh, -- Since we are updating and creating, we do not fetch cached data\r\n // tslint:disable-next-line: no-console\r\n (data) => onDataRetrieved(data, filter, offset, isClear),\r\n // tslint:disable-next-line:no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isNextPageLoading: false,\r\n };\r\n });\r\n }\r\n );\r\n };\r\n\r\n const onDataRetrieved = (data: MatterLookupData, filter: string, offset: number, isClear: boolean) => {\r\n\r\n const matterData = data.matterLookupList.matters;\r\n const rowCountWithoutFilters = data.matterLookupList.recordCount; \r\n\r\n // tslint:disable-next-line: no-any\r\n let itemsList: MatterLookUpItem[] = [];\r\n let items = state.items;\r\n \r\n if (!isClear) {\r\n itemsList = [...state.items];\r\n } else {\r\n items = [];\r\n }\r\n\r\n if (items && items.length === 0) {\r\n itemsList = matterData.map( (source: Matter) => (\r\n {\r\n ...source,\r\n label: source.fileNumber + ' (' + source.title + ')',\r\n value: source.fileNumber\r\n }));\r\n } else {\r\n for (const matter of matterData) {\r\n // tslint:disable-next-line: no-any\r\n const isExists = items.filter((item: any) => item.value === matter.fileNumber).length;\r\n\r\n // const isExists = items.filter((item: IndividualNameSummary) => \r\n // item.guidID.toString().toLowerCase().includes(nameSummary.guidID.toLowerCase())).length;\r\n\r\n if (isExists === 0) {\r\n itemsList.push({\r\n ...matter,\r\n label: matter.fileNumber + ' (' + matter.title + ')',\r\n value: matter.fileNumber,\r\n });\r\n }\r\n }\r\n }\r\n\r\n setState((prevState) => {\r\n \r\n return {\r\n ...prevState,\r\n filter: filter,\r\n isNextPageLoading: false,\r\n items: itemsList,\r\n offset: offset + loadBlockLimit,\r\n hasNextPage: matterData.length !== 0 && (offset + loadBlockLimit) < rowCountWithoutFilters,\r\n };\r\n });\r\n\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const loadNextPage = (...args: any) => {\r\n if (state.hasNextPage && !state.isNextPageLoading) {\r\n fetchData(state.filter, state.offset, false);\r\n }\r\n };\r\n\r\n // const onInputChange = (event: React.ChangeEvent<{}>, value: string, reason: 'input' | 'reset' | 'clear') => {\r\n // let isNextPageLoading = false;\r\n // let hasNextPage = false;\r\n // let isClear = false;\r\n // let offset = 0;\r\n // let filter = '';\r\n\r\n // if (reason === 'input') {\r\n // filter = value;\r\n // isClear = true;\r\n // isNextPageLoading = true;\r\n // hasNextPage = true;\r\n\r\n // fetchData(filter, offset, isNextPageLoading, hasNextPage, isClear);\r\n // } \r\n // };\r\n\r\n const getInputProps = (params: RenderInputParams, loading?: boolean) => {\r\n return ({ \r\n ...params.InputProps,\r\n endAdornment: (\r\n \r\n {loading ? : null}\r\n {params.InputProps.endAdornment}\r\n \r\n ), \r\n });\r\n };\r\n\r\n const onClose = (event: React.ChangeEvent<{}>) => {\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isNextPageLoading: false,\r\n hasNextPage: true,\r\n filter: '',\r\n offset: 0,\r\n items: [],\r\n open: false\r\n };\r\n });\r\n };\r\n\r\n const onOpen = (event: React.ChangeEvent<{}>) => {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n open: true\r\n };\r\n });\r\n fetchData(state.filter, 0, true);\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onSelection = (selection: any, name: string) => {\r\n if (props.onSelection) {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n open: false\r\n };\r\n });\r\n props.onSelection(selection, name);\r\n }\r\n };\r\n\r\n const createAbbreviation = (value: string | null) => {\r\n \r\n if (value) {\r\n let values = value.split(' ');\r\n\r\n if (values.length === 1) {\r\n return value.substr(0, 2);\r\n } else {\r\n \r\n let abbr = '';\r\n\r\n for (let index = 0; index < 2; index++) {\r\n abbr += values[index].substr(0, 1);\r\n }\r\n\r\n return abbr;\r\n }\r\n\r\n }\r\n return;\r\n };\r\n\r\n const listComponent = (matter: Matter, matterTitlePrefix: string) => {\r\n \r\n return (\r\n
\r\n {matter.fileNumber}\r\n {matter.client}\r\n {shortingTitle(`${matterTitlePrefix} | ${matter.title}`)}\r\n
\r\n );\r\n };\r\n\r\n const LightTooltip = withStyles((theme: Theme) => ({\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: 11,\r\n },\r\n arrow: {\r\n '&:before': {\r\n border: '1px solid #E6E8ED'\r\n },\r\n color: theme.palette.common.white\r\n },\r\n }))(Tooltip);\r\n\r\n const shortingTitle = (title: string) => {\r\n\r\n const limit = props.descriptionLimit ? props.descriptionLimit : 50;\r\n\r\n if (title === undefined || title === null) {\r\n return title;\r\n }\r\n\r\n if (title && title.length < limit) {\r\n return title;\r\n }\r\n\r\n return ( \r\n \r\n {`${title.substring(0, limit)}...`}\r\n \r\n );\r\n };\r\n\r\n return (\r\n
\r\n typeof option === 'string' ? option : option.label}\r\n onInputChange={delayedonInputChange}\r\n onBlur={props.onBlur}\r\n disabledFilterOptions={true}\r\n height={500}\r\n classes={{\r\n listbox: classes.listBox\r\n }}\r\n tabIndex={props.tabIndex}\r\n ref={props.ref}\r\n open={state.open}\r\n // reverseRender={true}\r\n // tslint:disable-next-line: no-any\r\n renderInput={(params: any) => (\r\n \r\n )}\r\n renderOption={(option, { selected }) => {\r\n\r\n const matterTitlePrefix = getMatterTitlePrefix(props.sourceSystem, option);\r\n \r\n return (\r\n <>\r\n \r\n \r\n \r\n {createAbbreviation(matterTitlePrefix)}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n option.isVIP ?\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\nexport function retrieveMatterLookupData(\r\n // tslint:disable-next-line:no-any\r\n // abortController: any,\r\n query: MatterLookupQueryParams,\r\n refreshData: boolean,\r\n onSuccess: (data: MatterLookupData) => void,\r\n // tslint:disable-next-line:no-any\r\n onError: (reason: any) => void\r\n): ZenObservable.Subscription {\r\n var fetchPolicy: FetchPolicy = refreshData === true ? 'network-only' : 'cache-first';\r\n\r\n var querySubscription = \r\n client\r\n .watchQuery({\r\n query: MATTER_LOOKUP_QUERY,\r\n variables: {\r\n filter: query.filter,\r\n first: query.first,\r\n offset: query.offset,\r\n typeFilter: query.typeFilter,\r\n statusFilter: query.statusFilter,\r\n isLimitedMatterSearch: query.isLimitedMatterSearch,\r\n isExcludeCompleted: query.isExcludeCompleted\r\n },\r\n fetchPolicy: fetchPolicy\r\n })\r\n .subscribe({\r\n next: ({data}) => {\r\n onSuccess(data);\r\n },\r\n // tslint:disable-next-line:no-any\r\n error: ((reason: any) => {\r\n onError(reason);\r\n })\r\n });\r\n\r\n return querySubscription;\r\n}\r\n\r\nexport interface MatterLookupQueryParams {\r\n offset?: number; \r\n first?: number;\r\n filter?: string;\r\n typeFilter?: string;\r\n statusFilter?: string;\r\n isLimitedMatterSearch?: Boolean;\r\n isExcludeCompleted?: Boolean;\r\n}\r\n\r\nexport interface MatterLookupData {\r\n matterLookupList: MatterLookupList;\r\n}\r\n\r\nexport interface MatterLookupList {\r\n recordCount: number;\r\n matters: Matter[];\r\n}\r\n\r\nexport interface Matter {\r\n id: number;\r\n fileNumber: string;\r\n matterCategory: string;\r\n matterType: string;\r\n matterTypeCategory: string;\r\n stage: string | null;\r\n title: string;\r\n description: string;\r\n client: string;\r\n status: string;\r\n inProgress: boolean;\r\n syncSystemID: string | null;\r\n state: string;\r\n family: string | null;\r\n property: string |null;\r\n propertyLabel: string |null;\r\n lastUpdate: Date | null;\r\n isVIP: boolean;\r\n}\r\n\r\nconst MATTER_LOOKUP_QUERY = gql`\r\nquery matterLookup (\r\n $offset: Int, \r\n $first: Int, \r\n $filter: String, \r\n $typeFilter: FilterOptionsType, \r\n $statusFilter: FilterOptionsStatus,\r\n $isLimitedMatterSearch: Boolean,\r\n $isExcludeCompleted: Boolean,\r\n){\r\n matterLookupList(\r\n typeFilter: $typeFilter, \r\n statusFilter: $statusFilter, \r\n first: $first, \r\n offset: $offset, \r\n filter: $filter,\r\n isLimitedMatterSearch: $isLimitedMatterSearch,\r\n isExcludeCompleted: $isExcludeCompleted\r\n ) {\r\n recordCount\r\n matters {\r\n id\r\n fileNumber\r\n matterCategory\r\n matterType\r\n matterTypeCategory\r\n stage\r\n title\r\n description\r\n client\r\n status\r\n inProgress\r\n syncSystemID\r\n state\r\n family\r\n property\r\n propertyLabel\r\n lastUpdate\r\n isVIP\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 { Autocomplete, RenderInputParams } from '@material-ui/lab';\r\nimport { TextField, CircularProgress, ListItem, ListItemText, ListItemSecondaryAction, IconButton } from '@material-ui/core';\r\n// import match from 'autosuggest-highlight/match';\r\n// import parse from 'autosuggest-highlight/parse';\r\nimport { IAutoCompleteItem } from '../../typings/autoComplete';\r\nimport gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\nimport StarIcon from '@material-ui/icons/Star';\r\nimport StarBorderIcon from '@material-ui/icons/StarBorder';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n // minWidth: '200px',\r\n },\r\n starIcon: {\r\n color: '#cc1212',\r\n },\r\n listBox: {\r\n '& .MuiListItem-container': {\r\n width: '100%'\r\n }\r\n },\r\n listItem: {\r\n width: '100%',\r\n },\r\n })\r\n);\r\n\r\nexport interface ActivityItem extends IAutoCompleteItem, Activity {\r\n\r\n}\r\n\r\ninterface ActivityAutoCompleteSelectorProps {\r\n disabled?: boolean;\r\n required?: boolean;\r\n multiple?: boolean;\r\n // tslint:disable-next-line: no-any\r\n value?: ActivityItem | any; // value only available in single select\r\n error?: boolean;\r\n onSelection?: (value: ActivityItem | ActivityItem[], name: string) => void;\r\n className?: string;\r\n helperText?: string;\r\n name?: string;\r\n label?: string;\r\n disablePortal?: boolean; \r\n tabIndex?: number;\r\n autoFocus?: boolean;\r\n feeEarnerId?: string;\r\n}\r\n\r\ninterface ActivityAutoCompleteSelectorState {\r\n isLoading: boolean;\r\n // tslint:disable-next-line: no-any\r\n options: ActivityItem[];\r\n // tslint:disable-next-line: no-any\r\n}\r\n\r\nexport const ActivityAutoCompleteSelector: React.FC = props => {\r\n\r\n const classes = useStyles();\r\n\r\n const [state, setState] = useState({\r\n isLoading: true,\r\n options: [],\r\n });\r\n\r\n const timesheetAcitivtiesQuery = useQuery(TimesheetActivitiesQuery, {\r\n fetchPolicy: 'cache-first',\r\n variables: {\r\n feeEarnerId: props.feeEarnerId\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n if (timesheetAcitivtiesQuery.data && !timesheetAcitivtiesQuery.loading && !timesheetAcitivtiesQuery.error) {\r\n\r\n const activities = timesheetAcitivtiesQuery.data ? timesheetAcitivtiesQuery.data.timesheetActivities.activities : [];\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n options: activities.map((source: Activity) => ({...source, value: source.stringValue, label: source.stringValue })),\r\n // tslint:disable-next-line: no-any\r\n // value: financialYear.map((source: FinancialYear) => ({...source, value: source.description, label: source.description })).find((v: any) => v.isCurrent),\r\n isLoading: false\r\n };\r\n });\r\n }\r\n // tslint:disable-next-line: align\r\n }, [timesheetAcitivtiesQuery.data, timesheetAcitivtiesQuery.loading, timesheetAcitivtiesQuery.error]);\r\n\r\n // tslint:disable-next-line: no-any\r\n const handleChange = (event: React.ChangeEvent<{}>, value: any) => {\r\n if (props.onSelection) {\r\n props.onSelection(value, props.name ? props.name : 'financialYear');\r\n }\r\n };\r\n\r\n const getInputProps = (params: RenderInputParams, isLoading?: boolean) => {\r\n return ({ \r\n ...params.InputProps,\r\n endAdornment: (\r\n \r\n {isLoading ? : null}\r\n {params.InputProps.endAdornment}\r\n \r\n ), \r\n });\r\n };\r\n\r\n return (\r\n
\r\n { props.multiple ? \r\n (\r\n option.label} \r\n getOptionSelected={(option, value) => value.value === option.value} \r\n classes={{\r\n listbox: classes.listBox\r\n }} \r\n tabIndex={props.tabIndex}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderInput={params => (\r\n \r\n )}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderOption={(option, { inputValue }) => {\r\n // const matches = match(option.label, inputValue);\r\n // const parts = parse(option.label, matches);\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {\r\n option.isVIP ?\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 option.label} \r\n getOptionSelected={(option, value) => value.value === option.value} \r\n classes={{\r\n listbox: classes.listBox\r\n }} \r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderInput={params => (\r\n \r\n )}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderOption={(option, { inputValue }) => {\r\n // const matches = match(option.label, inputValue);\r\n // const parts = parse(option.label, matches);\r\n \r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {\r\n option.isVIP ?\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\n\r\nexport interface TimesheetActivityData {\r\n timesheetActivities: TimesheetActivities;\r\n}\r\n\r\nexport interface TimesheetActivities {\r\n favouriteActivitiesCount: number;\r\n activities: Activity[];\r\n}\r\n\r\nexport interface Activity {\r\n id: number;\r\n stringValue: string;\r\n isVIP: boolean;\r\n isFirmActivity: boolean;\r\n}\r\n\r\nconst TimesheetActivitiesQuery = gql`\r\n query timesheetActivities($feeEarnerId: String) {\r\n timesheetActivities(clientOnly: false, feeEarnerId: $feeEarnerId) {\r\n favouriteActivitiesCount\r\n activities {\r\n id\r\n stringValue\r\n isVIP\r\n isFirmActivity\r\n }\r\n }\r\n }\r\n`;","import * as React from 'react';\r\nimport {\r\n withStyles,\r\n WithStyles,\r\n createStyles,\r\n Theme,\r\n Avatar,\r\n ListItemAvatar,\r\n Grid,\r\n Paper,\r\n ButtonGroup,\r\n TextField,\r\n // InputAdornment,\r\n Input,\r\n Typography,\r\n} from '@material-ui/core';\r\nimport TimeslipHeader from './TimeslipHeader';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\r\n// import TimeslipMatterDialog from './TimeslipMatterDialog';\r\n// import TimeslipTimeDialog from './TimeslipTimeDialog';\r\n// import TimeslipStartsDialog from './TimeslipStartsDialog';\r\n// import TimeslipActivityDialog from './TimeslipActivityDialog';\r\n// import TimeslipNotesDialog from './TimeslipNotesDialog';\r\nimport { parse } from 'url';\r\nimport { client } from '..';\r\nimport gql from 'graphql-tag';\r\nimport { showNotification } from '../App';\r\nimport TimeslipTimePage from './page/TimeslipTimePage';\r\nimport classNames from 'classnames';\r\nimport TimeslipMatterPage, { getMatterTitlePrefix } from './page/TimeslipMatterPage';\r\nimport TimeslipStartPage from './page/TimeslipStartPage';\r\nimport TimeslipActivityPage from './page/TimeslipActivityPage';\r\nimport TimeslipNotesPage from './page/TimeslipNotesPage';\r\nimport TimeslipChargeCodePage from './page/TimeslipChargeCodePage';\r\nimport { Query } from 'react-apollo';\r\nimport { RvLoader } from '../components/Loader';\r\nimport { fetchTypedUserSettings, TypedTenantUserOptions } from '../userSettings/UserSettingsRepository';\r\nimport { Button } from 'semantic-ui-react';\r\nimport { MatterFinancialsQueryParams, retrieveMatterFinancials, TimeslipSummaries } from '../timesheet/TimesheetRepository';\r\nimport { TooltipHost } from 'office-ui-fabric-react/lib/Tooltip';\r\nimport { generateColor } from './matter/ColorGenerator';\r\nimport { CurrencyDisplayStyle, FormattedCurrency } from '../components/DataDisplay/FormattedCurrency';\r\nimport { MatterTerminology } from '../MatterTerminology';\r\nimport { mainTheme } from '../Theme';\r\nimport { Matter, MatterData } from '../matterDetails/financials/FinancialsInfo';\r\nimport moment from 'moment';\r\nimport glamorous from 'glamorous';\r\nimport { MatterLookUpAutoCompleteSelector, MatterLookUpItem } from './selectors/MatterLookUpAutoCompleteSelector';\r\nimport { ActivityAutoCompleteSelector, ActivityItem } from './selectors/ActivityAutoCompleteSelector';\r\nimport { TimerSummaryElement } from '../timesheetTimer/TimesheetTimerRepository';\r\nimport DialogBox from '../Dashboard/Component/DialogBox';\r\nimport { formatNumber } from '../helpers/ChartHelper';\r\nimport { Systems } from '../hooks/useTimeRecording';\r\nimport { UserFeature, UserFeatureEnum } from '../types/UserFeature';\r\n\r\nexport const styles = (theme: Theme) =>\r\n createStyles({\r\n root: {\r\n position: 'relative',\r\n flexGrow: 1,\r\n display: 'flex',\r\n flexFlow: 'column wrap',\r\n },\r\n inline: {\r\n display: 'inline',\r\n },\r\n timeContent: {\r\n textAlign: 'center',\r\n '& > span': {\r\n fontSize: '24px',\r\n },\r\n },\r\n mainWrapper: {\r\n flex: 1,\r\n '& .MuiTypography-colorTextSecondary': {\r\n fontSize: '14px',\r\n },\r\n },\r\n timeWrapper: {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n position: 'absolute',\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n zIndex: 2,\r\n backgroundColor: '#fff',\r\n // display: 'none',\r\n },\r\n hide: {\r\n display: 'none',\r\n },\r\n buttonContainer: {\r\n width: '100%',\r\n paddingTop: '20px',\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'flex-start',\r\n '& .buttonWrapper': {\r\n minWidth: '87px',\r\n },\r\n },\r\n customList: {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n fontSize: '16px',\r\n '& .id': {\r\n color: '#cc1212',\r\n marginBottom: '5px',\r\n },\r\n '& .name': {\r\n marginBottom: '5px',\r\n },\r\n '& .category': {\r\n color: 'rgba(0, 0, 0, 0.54)',\r\n fontSize: '12px',\r\n },\r\n },\r\n primaryList: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n // paddingBottom: '10px',\r\n '& .col-1': {\r\n fontWeight: 500,\r\n },\r\n '& .col-2': {\r\n // fontWeight: 600,\r\n width: '200px',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n textAlign: 'right',\r\n },\r\n },\r\n secondaryList: {\r\n // paddingTop: '10px',\r\n display: 'flex',\r\n flexFlow: 'column wrap',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n '& .col-1': {\r\n color: '#000',\r\n },\r\n '& .col-2': {},\r\n },\r\n cardWrapper: {\r\n paddingTop: 10,\r\n display: 'flex',\r\n flex: 1,\r\n },\r\n paper: {\r\n display: 'flex',\r\n flexFlow: 'column wrap',\r\n // minHeight: '85px',\r\n background: '#fff',\r\n width: '100%',\r\n boxShadow: '1px 1px 1px 1px rgba(0,0,0,0.3)',\r\n // borderRadius: '5px',\r\n // marginBottom: '15px',\r\n padding: '5px',\r\n fontFamily: 'Nunito',\r\n textAlign: 'center',\r\n height: '100%',\r\n [`& .${`label`}`]: {\r\n fontWeight: '400',\r\n marginBottom: '5px',\r\n color: mainTheme.BrandColors.TemplatePrimary,\r\n },\r\n\r\n [`& .${`value`}`]: {\r\n textAlign: 'center',\r\n fontWeight: '400',\r\n fontSize: '21px',\r\n },\r\n [`& .${`value-string`}`]: {\r\n textAlign: 'center',\r\n fontWeight: '400',\r\n fontSize: '21px',\r\n },\r\n },\r\n unitFieldClass: {\r\n fontSize: 24,\r\n textAlign: 'center',\r\n },\r\n unitField: {\r\n maxWidth: '70px',\r\n },\r\n primaryListItemTex: {\r\n paddingRight: '20px',\r\n },\r\n inputDuration: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n maxWidth: '150px',\r\n margin: '0 auto',\r\n '& > .MuiTypography-root': {\r\n marginLeft: '10px',\r\n },\r\n },\r\n inputRoot: {\r\n textAlign: 'center',\r\n fontSize: 24,\r\n },\r\n timerButtonWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexFlow: 'column wrap',\r\n '& .buttonWrapper': {\r\n marginBottom: '5px',\r\n minWidth: '120px',\r\n },\r\n },\r\n seconds: {\r\n fontSize: '16px',\r\n paddingLeft: '5px',\r\n paddingBottom: '5px',\r\n },\r\n timeLoader: {\r\n fontSize: '14px',\r\n marginLeft: '5px',\r\n minWidth: '24px',\r\n },\r\n dialogAdittionalTitle: {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n alignItems: 'center',\r\n gap: '10px',\r\n marginBottom: '10px',\r\n },\r\n dialogAdditionalClient: {\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n },\r\n dialogAdditionalTitle: {\r\n fontSize: '18px',\r\n },\r\n thresholdText: {\r\n padding: '20px 0',\r\n fontSize: '18px',\r\n // fontWeight: 600,\r\n textAlign: 'center',\r\n color: 'red'\r\n },\r\n warning: {\r\n fontSize: '1.25rem',\r\n fontWeight: 500,\r\n lineHeight: 1.6,\r\n letterSpacing: '0.0075em',\r\n padding: '16px 0px',\r\n },\r\n });\r\n\r\n// tslint:disable-next-line: no-any\r\nconst ButtonGroupWrapper = glamorous(ButtonGroup)<{ theme?: any }>((props) => ({\r\n '& > .MuiButtonGroup-grouped': {\r\n marginBottom: 5,\r\n },\r\n}));\r\n\r\ninterface TimeslipPageProps extends WithStyles {\r\n onClose?: () => void;\r\n updateTimerAction: (timeslip: TimerSummaryElement, timerGuid?: string, shouldCreate?: boolean) => void;\r\n updateAction?: (timeslip: TimeslipSummaries, timerGuid?: string, shouldCreate?: boolean) => void;\r\n newTimer?: boolean;\r\n mergeAction: () => void;\r\n currDate?: Date;\r\n timeslips?: TimeslipSummaries[];\r\n isFromTimer?: boolean;\r\n timeWorkedMinutes?: number;\r\n selectedTimer?: TimerSummaryElement;\r\n onToggleTimer?: (selectedTimer?: TimerSummaryElement) => void;\r\n onSubmitTimer?: (selectedTimer?: TimerSummaryElement) => void;\r\n onSubmitTimerAsDraft?: (selectedTimer?: TimerSummaryElement) => void;\r\n feeEarnerId?: string;\r\n timeRecordSystem: Systems | null;\r\n}\r\n\r\ninterface TimeslipPageStates {\r\n hasChangedTime: boolean;\r\n favMattersFirst?: boolean;\r\n favActivityFirst?: boolean;\r\n allowDraft?: boolean;\r\n matterDialogOpen: boolean;\r\n timeDialogOpen: boolean;\r\n startsDialogOpen: boolean;\r\n activityDialogOpen: boolean;\r\n notesDialogOpen: boolean;\r\n chargeCodeDialogOpen: boolean;\r\n settings: TypedTenantUserOptions;\r\n noteHasBeenCustomised: boolean;\r\n isFromOutlook: boolean;\r\n shouldSubmit: boolean;\r\n inInprotechNotes: boolean;\r\n // tslint:disable-next-line: no-any\r\n timeslipsToRemove?: any;\r\n timeslip: {\r\n id?: number;\r\n // tslint:disable-next-line: no-any\r\n matter: any;\r\n // tslint:disable-next-line: no-any\r\n activity: any;\r\n // tslint:disable-next-line: no-any\r\n time: {\r\n // tslint:disable-next-line: no-any\r\n duration: any;\r\n minutes: number;\r\n hours: number;\r\n seconds: number;\r\n };\r\n units: number;\r\n // tslint:disable-next-line: no-any\r\n chargeCode: string;\r\n chargeCodeId: number;\r\n chargeRate: number;\r\n date: Date;\r\n note: string;\r\n inprotechNote: string;\r\n };\r\n isFinancialsLoading: boolean;\r\n matter?: Matter;\r\n inputFocus: number;\r\n // isMatterSelected: boolean;\r\n selectedTimer?: TimerSummaryElement;\r\n feeEarnerId?: string;\r\n showConfirm: boolean;\r\n hasChangedField: boolean;\r\n showConfirmBillingThreshold: boolean;\r\n billingConfirmThresholdText: string;\r\n}\r\n\r\nclass TimeslipPage extends React.Component {\r\n private sourceSystem: string;\r\n private timeCaptureMode: string;\r\n private currencySymbol: string;\r\n private localCurrency: string;\r\n // tslint:disable-next-line: no-any\r\n private interval: any;\r\n private threshold: number;\r\n\r\n constructor(props: TimeslipPageProps) {\r\n super(props);\r\n\r\n this.handleToggle = this.handleToggle.bind(this);\r\n this.onTimeData = this.onTimeData.bind(this);\r\n this.onActivityData = this.onActivityData.bind(this);\r\n this.onNotesData = this.onNotesData.bind(this);\r\n this.onMatterData = this.onMatterData.bind(this);\r\n this.onStartData = this.onStartData.bind(this);\r\n this.onSubmit = this.onSubmit.bind(this);\r\n this.onCloseTime = this.onCloseTime.bind(this);\r\n this.onCloseMatter = this.onCloseMatter.bind(this);\r\n this.onCloseStart = this.onCloseStart.bind(this);\r\n this.onCloseActivity = this.onCloseActivity.bind(this);\r\n this.onCloseNotes = this.onCloseNotes.bind(this);\r\n this.onChargeCodeData = this.onChargeCodeData.bind(this);\r\n this.onCloseChargeCode = this.onCloseChargeCode.bind(this);\r\n this.setDuration = this.setDuration.bind(this);\r\n this.setMatter = this.setMatter.bind(this);\r\n this.getActionButton = this.getActionButton.bind(this);\r\n this.handleUpdate = this.handleUpdate.bind(this);\r\n this.closePanel = this.closePanel.bind(this);\r\n this.handleCreateAndClose = this.handleCreateAndClose.bind(this);\r\n this.handleCreateAndNew = this.handleCreateAndNew.bind(this);\r\n this.handleCreateAndCopy = this.handleCreateAndCopy.bind(this);\r\n this.handleCreateAndPost = this.handleCreateAndPost.bind(this);\r\n this.primaryList = this.primaryList.bind(this);\r\n this.secondaryList = this.secondaryList.bind(this);\r\n this.getUnitsFromMinutes = this.getUnitsFromMinutes.bind(this);\r\n this.getMinutesFromUnits = this.getMinutesFromUnits.bind(this);\r\n this.matterListUI = this.matterListUI.bind(this);\r\n this.limitText = this.limitText.bind(this);\r\n this.onLongText = this.onLongText.bind(this);\r\n this.handleCheckBoxChange = this.handleCheckBoxChange.bind(this);\r\n this.onMatterSelected = this.onMatterSelected.bind(this);\r\n this.onMatterFinancialsRetrieved = this.onMatterFinancialsRetrieved.bind(this);\r\n this.onChangeUnit = this.onChangeUnit.bind(this);\r\n this.formatNumberBy0 = this.formatNumberBy0.bind(this);\r\n this.onChangeDuration = this.onChangeDuration.bind(this);\r\n this.onMatterLookupChange = this.onMatterLookupChange.bind(this);\r\n this.onActivityChange = this.onActivityChange.bind(this);\r\n this.onSaveToTimer = this.onSaveToTimer.bind(this);\r\n this.onToggleTimer = this.onToggleTimer.bind(this);\r\n this.onSubmitTimer = this.onSubmitTimer.bind(this);\r\n this.onSubmitTimerAsDraft = this.onSubmitTimerAsDraft.bind(this);\r\n this.updateRunningTime = this.updateRunningTime.bind(this);\r\n this.closePanelFromTimer = this.closePanelFromTimer.bind(this);\r\n this.onDeleteConfirm = this.onDeleteConfirm.bind(this);\r\n this.onShowThresholdConfirm = this.onShowThresholdConfirm.bind(this);\r\n this.isMatterAndActivtyEmpty = this.isMatterAndActivtyEmpty.bind(this);\r\n\r\n this.state = {\r\n hasChangedField: false,\r\n hasChangedTime: false,\r\n matterDialogOpen: false,\r\n timeDialogOpen: false,\r\n startsDialogOpen: false,\r\n activityDialogOpen: false,\r\n notesDialogOpen: false,\r\n chargeCodeDialogOpen: false,\r\n noteHasBeenCustomised: false,\r\n inInprotechNotes: false,\r\n settings: new TypedTenantUserOptions(),\r\n isFromOutlook: false,\r\n shouldSubmit: true,\r\n timeslip: {\r\n matter: {},\r\n activity: {},\r\n chargeCode: '',\r\n chargeCodeId: 0,\r\n chargeRate: 0,\r\n time: {\r\n duration: '',\r\n hours: this.props.isFromTimer && this.props.timeWorkedMinutes ? this.props.timeWorkedMinutes / 60 : 0,\r\n minutes: this.props.isFromTimer && this.props.timeWorkedMinutes ? this.props.timeWorkedMinutes : 0,\r\n seconds: this.props.isFromTimer && this.props.timeWorkedMinutes ? Math.floor(this.props.timeWorkedMinutes) * 60 : 0,\r\n },\r\n units: 0,\r\n date: props.currDate ? props.currDate : new Date(),\r\n note: '',\r\n inprotechNote: '',\r\n },\r\n isFinancialsLoading: true,\r\n inputFocus: 0,\r\n // isMatterSelected: false,\r\n selectedTimer: this.props.isFromTimer ? this.props.selectedTimer : undefined,\r\n feeEarnerId: this.props.feeEarnerId,\r\n showConfirm: false,\r\n showConfirmBillingThreshold: false,\r\n billingConfirmThresholdText: '',\r\n };\r\n this.sourceSystem = '';\r\n this.threshold = this.props.timeRecordSystem?.timeRecordingSettings?.config?.thresholdLevel ?? 0;\r\n }\r\n\r\n componentDidMount() {\r\n // eslint-disable-next-line no-restricted-globals\r\n const url = parse(location.href, true);\r\n const parsed = url.query;\r\n\r\n if (parsed.accessToken) {\r\n const token = parsed.accessToken as string;\r\n // tslint:disable-next-line:no-console\r\n if (token) {\r\n sessionStorage.setItem('accessToken', token);\r\n }\r\n }\r\n\r\n fetchTypedUserSettings(\r\n false,\r\n // tslint:disable-next-line:no-console\r\n (data: TypedTenantUserOptions) => {\r\n this.setState({\r\n settings: data,\r\n shouldSubmit: parsed.duration ? parsed.defaultToDraft !== 'True' : !data.defaultToDraft,\r\n allowDraft: parsed.duration ? parsed.allowDraft === 'True' : true,\r\n });\r\n this.setMatter(this.state.settings.defaultMatter);\r\n if (parsed.duration) {\r\n if (this.state.settings.emailDefaultActivity) {\r\n let activityObject = JSON.parse(this.state.settings.emailDefaultActivity);\r\n if (activityObject && activityObject.StringValue) {\r\n this.setActivity(activityObject.StringValue);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (!this.props.timeslips && !this.props.selectedTimer) {\r\n if (this.state.settings.defaultActivity) {\r\n let activityObject = JSON.parse(this.state.settings.defaultActivity);\r\n if (activityObject && activityObject.StringValue) {\r\n // const activity = {\r\n // stringValue: activityObject.StringValue\r\n // };\r\n this.setActivity(activityObject.StringValue);\r\n }\r\n }\r\n\r\n this.setDuration(this.state.settings.defaultDurationMinutes);\r\n }\r\n\r\n if (this.props.selectedTimer) {\r\n this.setDuration((this.props.selectedTimer.timeWorkedSecondsTemp ?? 0) / 60);\r\n }\r\n },\r\n (reason) => {\r\n showNotification('Failed to Fetch Layout Configuration', reason, 'error');\r\n },\r\n );\r\n\r\n // tslint:disable-next-line: no-any\r\n var timeslip: any;\r\n var timeslipsToDelete = [];\r\n\r\n if (!this.props.timeslips) {\r\n timeslip = {\r\n chargeRate: 0,\r\n matter: {},\r\n activity: {},\r\n chargeCode: '',\r\n chargeCodeId: 0,\r\n\r\n time: {\r\n duration: parsed.duration ? parsed.duration : '00:00',\r\n minutes: parsed.duration ? this.getMinutesFromDurationString(parsed.duration as string) : 0,\r\n hours: parsed.duration ? this.getHoursFromDurationString(parsed.duration as string) : 0,\r\n },\r\n units: this.getUnitsFromMinutes(parsed.duration ? this.getHoursFromDurationString(parsed.duration as string) : 0),\r\n date: parsed.date ? new Date('' + parsed.date) : this.props.currDate ? this.props.currDate : this.state.timeslip.date,\r\n note: parsed.notes ? '' + parsed.notes : '',\r\n inprotechNote: '',\r\n };\r\n } else {\r\n var template = this.props.timeslips[0];\r\n // var totalTime = 0;\r\n var newActivity = {\r\n stringValue: template.activityDescription,\r\n id: template.id,\r\n label: template.activityDescription,\r\n value: template.activityDescription,\r\n };\r\n var matter = {};\r\n if (template.matterID) {\r\n matter = {\r\n id: template.matterID,\r\n client: template.client,\r\n fileNumber: template.fileNumber,\r\n title: template.title,\r\n matterCategory: template.matterCategory,\r\n matterType: template.matterType,\r\n label: template.fileNumber + ' (' + template.title + ')',\r\n value: template.fileNumber,\r\n };\r\n }\r\n\r\n var totalMinutes = 0;\r\n var notes = '';\r\n var inprotechNotes = '';\r\n var distinctNotes = new Set();\r\n var distinctInprotechNotes = new Set();\r\n\r\n for (var item of this.props.timeslips) {\r\n if (item.id !== template.id) {\r\n timeslipsToDelete.push(item.id);\r\n }\r\n if (item.timeWorkedSeconds) {\r\n totalMinutes += item.timeWorkedSeconds / 60;\r\n }\r\n if (item.note) {\r\n distinctNotes.add(item.note);\r\n }\r\n if (item.timesheetNote) {\r\n distinctInprotechNotes.add(item.timesheetNote);\r\n }\r\n }\r\n\r\n var notesArray = Array.from(distinctNotes);\r\n notes = notesArray.join(', ');\r\n\r\n var inprotechNotesArray = Array.from(distinctInprotechNotes);\r\n inprotechNotes = inprotechNotesArray.join(', ');\r\n var minutes = totalMinutes % 60;\r\n var hours = Math.floor(totalMinutes / 60);\r\n var seconds = 0;\r\n\r\n var minutesString = '' + minutes;\r\n if (minutes < 10) {\r\n minutesString = '0' + minutes;\r\n }\r\n var durationString = hours + ':' + minutesString;\r\n timeslip = {\r\n id: template.id,\r\n chargeRate: 0,\r\n matter: matter,\r\n activity: newActivity,\r\n chargeCode: '',\r\n chargeCodeId: 0,\r\n time: {\r\n duration: durationString,\r\n minutes: minutes,\r\n hours: hours,\r\n seconds: seconds,\r\n },\r\n units: this.getUnitsFromMinutes(totalMinutes),\r\n date: template.itemDate ? new Date('' + template.itemDate) : this.props.currDate ? this.props.currDate : new Date(),\r\n note: notes,\r\n inprotechNote: inprotechNotes,\r\n };\r\n }\r\n\r\n if (this.props.selectedTimer) {\r\n var timer = this.props.selectedTimer;\r\n\r\n var activity = {\r\n stringValue: timer.activityDescription,\r\n id: timer.activityId,\r\n label: timer.activityDescription,\r\n value: timer.activityDescription,\r\n };\r\n\r\n if (timer.matterId) {\r\n matter = {\r\n id: timer.matterId,\r\n client: timer.client,\r\n fileNumber: timer.fileNumber,\r\n title: timer.title,\r\n matterCategory: timer.matterCategory,\r\n matterType: timer.matterType,\r\n label: timer.fileNumber + ' (' + timer.title + ')',\r\n value: timer.fileNumber,\r\n };\r\n } else {\r\n matter = {};\r\n }\r\n\r\n minutes = Math.floor(((timer.timeWorkedSeconds ?? 0) / 60) % 60);\r\n hours = Math.floor((timer.timeWorkedSeconds ?? 0) / (60 * 60));\r\n seconds = (timer.timeWorkedSeconds ?? 0) % (60 * 60);\r\n minutesString = '' + minutes;\r\n\r\n if (minutes < 10) {\r\n minutesString = '0' + minutes;\r\n }\r\n\r\n durationString = hours + ':' + minutesString;\r\n var billingNote = timer.billingNote;\r\n\r\n timeslip = {\r\n id: 1,\r\n chargeRate: 0,\r\n matter: matter,\r\n activity: activity,\r\n chargeCode: '',\r\n chargeCodeId: 0,\r\n time: {\r\n duration: durationString,\r\n minutes: minutes,\r\n hours: hours,\r\n seconds: seconds,\r\n },\r\n units: this.getUnitsFromMinutes(timer.timeWorkedSeconds ?? 0),\r\n date: timer.lastStarted ? new Date('' + timer.lastStarted) : this.props.currDate ? this.props.currDate : new Date(),\r\n note: billingNote,\r\n inprotechNote: timer.timesheetNote ?? '',\r\n };\r\n }\r\n\r\n this.setState({\r\n timeslip: timeslip,\r\n timeslipsToRemove: timeslipsToDelete,\r\n favActivityFirst: parsed.duration ? parsed.favActFirst === 'True' : undefined,\r\n favMattersFirst: parsed.duration ? parsed.favMatterFirst === 'True' : undefined,\r\n isFromOutlook: parsed.duration ? true : false,\r\n noteHasBeenCustomised: parsed.notes ? true : false,\r\n inInprotechNotes: false,\r\n });\r\n\r\n if (this.props.isFromTimer && this.state.selectedTimer && this.state.selectedTimer.isRunning) {\r\n this.interval = setInterval(this.updateRunningTime, 1000);\r\n }\r\n\r\n if (timeslip && timeslip.matter && Object.keys(timeslip.matter).length > 0) {\r\n this.onMatterSelected(timeslip.matter.id);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.props.isFromTimer && this.state.selectedTimer && this.state.selectedTimer.isRunning) {\r\n clearInterval(this.interval);\r\n }\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps: TimeslipPageProps, nextContext: TimeslipPageStates): void {\r\n if (nextProps.isFromTimer && nextProps.selectedTimer && nextProps.selectedTimer.isRunning) {\r\n clearInterval(this.interval);\r\n this.interval = setInterval(this.updateRunningTime, 1000);\r\n }\r\n\r\n if (nextProps.currDate !== this.props.currDate) {\r\n var timeslip = this.state.timeslip;\r\n timeslip.date = nextProps.currDate ? nextProps.currDate : new Date();\r\n this.setState({\r\n timeslip: timeslip,\r\n });\r\n }\r\n\r\n if (this.props.timeRecordSystem !== nextProps.timeRecordSystem) {\r\n this.threshold = nextProps.timeRecordSystem?.timeRecordingSettings?.config?.thresholdLevel ?? 0;\r\n }\r\n\r\n if (this.props.isFromTimer) {\r\n // set changes to the selected timer\r\n this.setState({\r\n selectedTimer: nextProps.selectedTimer,\r\n });\r\n }\r\n }\r\n\r\n getMinutesFromDurationString(durationString: string): number {\r\n // tslint:disable-next-line:radix\r\n return parseInt(durationString.split(':')[1]);\r\n }\r\n\r\n getHoursFromDurationString(durationString: string): number {\r\n // tslint:disable-next-line:radix\r\n return parseInt(durationString.split(':')[0]);\r\n }\r\n\r\n getUnitsFromMinutes(minutes: number): number {\r\n if (this.state.settings !== undefined) {\r\n var minutesPerUnit = 60 / this.state.settings.unitsPerHour;\r\n if (minutes === 0) {\r\n minutes = 1;\r\n }\r\n return Math.ceil(minutes / minutesPerUnit);\r\n }\r\n // tslint:disable-next-line:radix\r\n return 0;\r\n }\r\n\r\n getMinutesFromUnits(units: number): number {\r\n if (this.state.settings !== undefined) {\r\n var minutesPerUnit = 60 / this.state.settings.unitsPerHour;\r\n return units * minutesPerUnit;\r\n }\r\n // tslint:disable-next-line:radix\r\n return 0;\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n let financials = this.state.matter ? this.state.matter.financials : undefined;\r\n const displayZero = 0;\r\n\r\n var estimatedFeesColour: string | undefined = undefined;\r\n var billedTimeAndFees = 0;\r\n var unbilledTimeAndFees = 0;\r\n var estimatedFees = 0;\r\n\r\n if (financials) {\r\n billedTimeAndFees = financials.billedTimeAndFees ? financials.billedTimeAndFees : 0;\r\n unbilledTimeAndFees = financials.unbilledTimeAndFees ? financials.unbilledTimeAndFees : 0;\r\n estimatedFees = financials.estimatedCosts ? financials.estimatedCosts : 0;\r\n }\r\n\r\n estimatedFeesColour = billedTimeAndFees + unbilledTimeAndFees > estimatedFees ? 'red' : undefined;\r\n\r\n return (\r\n <>\r\n {this.state.showConfirm && (\r\n \r\n )}\r\n {this.state.showConfirmBillingThreshold && UserFeature.HasAccess(UserFeatureEnum.hasFeeEstimateWarning) && (\r\n \r\n
\r\n
{this.state.matter?.client}
\r\n
{this.state.matter?.title}
\r\n
\r\n {this.getMatterFinancials(classes, estimatedFeesColour, financials, displayZero, this.localCurrency)}\r\n {this.state.billingConfirmThresholdText && (\r\n
{this.state.billingConfirmThresholdText}
\r\n )}\r\n \r\n )}\r\n {/*tslint:disable-next-line: no-any */}\r\n query={TenantData} fetchPolicy=\"cache-first\">\r\n {({ loading, error, data }) => {\r\n if (loading || error || !data || !data.tenant || !data.tenant.sourceSystem || !data.settings) {\r\n return ;\r\n } else {\r\n this.sourceSystem = data.tenant.sourceSystem;\r\n this.timeCaptureMode = data.settings.systems.timeRecordingDefaults.config.timeCaptureMode;\r\n // this.threshold = data.settings.systems.timeRecordingSettings.config.thresholdLevel;\r\n this.currencySymbol = data.options.currencySymbol.symbol;\r\n\r\n const llocalCurrency = loading || error ? null : data.options.localCurrency;\r\n this.localCurrency = llocalCurrency ? llocalCurrency.currency : 'AUD';\r\n\r\n const hasChargeCodes =\r\n this.sourceSystem.toLowerCase() === 'infinity' ||\r\n this.sourceSystem.toLowerCase() === 'coyote' ||\r\n this.sourceSystem.toLowerCase() === 'practiceevolved';\r\n\r\n const hasPosting = this.sourceSystem.toLowerCase() === 'inprotech';\r\n\r\n const noteTitle = hasPosting && !this.state.inInprotechNotes ? 'Narrative' : 'Notes';\r\n\r\n // tslint:disable-next-line:no-console\r\n return (\r\n \r\n
\r\n
\r\n {this.state.timeDialogOpen ? (\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n
\r\n {this.state.matterDialogOpen ? (\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n
\r\n {this.state.startsDialogOpen ? (\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n
\r\n {this.state.activityDialogOpen ? (\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n
\r\n {this.state.chargeCodeDialogOpen ? (\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n
\r\n {this.state.notesDialogOpen ? (\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n {this.timeCaptureMode},\r\n classes: {\r\n input: classes.unitFieldClass,\r\n },\r\n }}\r\n onChange={this.onChangeUnit}\r\n className={classes.unitField}\r\n size=\"medium\"\r\n autoFocus={true}\r\n tabIndex={1}\r\n />\r\n {this.timeCaptureMode}\r\n
\r\n ) : (\r\n
\r\n \r\n \r\n :\r\n
\r\n \r\n {/* enabled to see the seconds in the UI */}\r\n {/* {this.props.isFromTimer && this.state.selectedTimer && this.state.selectedTimer.isRunning && (\r\n
\r\n {this.state.timeslip.time.seconds}\r\n
\r\n )} */}\r\n
\r\n {this.props.isFromTimer && this.state.selectedTimer && this.state.selectedTimer.isRunning && (\r\n \r\n )}\r\n
\r\n {''}\r\n
\r\n )\r\n }\r\n className={classes.timeContent}\r\n classes={{\r\n primary: classes.primaryListItemTex,\r\n }}\r\n tabIndex={-1}\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 // secondary={\r\n // this.state.timeslip.matter.fileNumber\r\n // ? this.matterListUI(this.state.timeslip.matter)\r\n // : ''\r\n // }\r\n classes={{\r\n primary: classes.primaryListItemTex,\r\n }}\r\n tabIndex={-1}\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\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n }\r\n classes={{\r\n primary: classes.primaryListItemTex,\r\n }}\r\n tabIndex={-1}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n {hasChargeCodes ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n\r\n \r\n\r\n {this.onLongText(\r\n \r\n \r\n \r\n }\r\n // secondary={this.limitText( this.state.timeslip!.note, 300)}\r\n classes={{\r\n primary: classes.primaryListItemTex,\r\n }}\r\n tabIndex={-1}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n this.state.timeslip!.note,\r\n 300,\r\n )}\r\n \r\n
{this.getActionButton(hasPosting)}
\r\n {this.state.matter && this.state.matter.financials && (\r\n <>\r\n {this.state.billingConfirmThresholdText && UserFeature.HasAccess(UserFeatureEnum.hasFeeEstimateWarning) && (\r\n
Warning
\r\n )}\r\n {this.getMatterFinancials(classes, estimatedFeesColour, financials, displayZero, this.localCurrency)}\r\n {this.state.billingConfirmThresholdText && UserFeature.HasAccess(UserFeatureEnum.hasFeeEstimateWarning) && (\r\n
{this.state.billingConfirmThresholdText}
\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 // tslint:disable-next-line: no-any\r\n private getMatterFinancials(classes: any, estimatedFeesColour: any, financials: any, displayZero: any, localCurrency: any) {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
{MatterTerminology.EstimatedCosts}
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
{MatterTerminology.CostAgreementReceived}
\r\n
\r\n {financials && financials.costAgreementReceived ? moment(financials.costAgreementReceived).format('d MMM YYYY') : null}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n
{MatterTerminology.Billed + ' ' + MatterTerminology.BilledTimeAndFees}
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n
{MatterTerminology.Billed + ' ' + MatterTerminology.Disbursements}
\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
{MatterTerminology.TotalOwing}
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
{MatterTerminology.TrustBalance}
\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
{MatterTerminology.Unbilled + ' ' + MatterTerminology.UnbilledTimeAndFees}
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
{MatterTerminology.Unbilled + ' ' + MatterTerminology.Disbursements}
\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 private isMatterAndActivtyEmpty(): boolean {\r\n if (!this.state.timeslip) {\r\n return true;\r\n }\r\n if (!(this.state.timeslip.activity && this.state.timeslip.matter)) {\r\n return true;\r\n }\r\n if (this.state.timeslip.activity.hasOwnProperty('value') && !this.state.timeslip.activity.value) {\r\n return true;\r\n }\r\n if (this.state.timeslip.matter.hasOwnProperty('value') && !this.state.timeslip.matter.value) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n private getActionButton(hasPosting: boolean) {\r\n const { classes } = this.props;\r\n\r\n if (this.props.isFromTimer) {\r\n return (\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 } else if (this.state.isFromOutlook) {\r\n return (\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n );\r\n } else {\r\n return (\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\n\r\n private setMatter(matter: string) {\r\n // tslint:disable-next-line:no-console\r\n if (matter) {\r\n var matterObject = JSON.parse(matter);\r\n if (matterObject && matterObject.title) {\r\n const timeslip = this.state.timeslip;\r\n timeslip.matter = { title: matterObject.title, id: matterObject.id };\r\n this.setState({ timeslip: timeslip });\r\n }\r\n }\r\n }\r\n\r\n private setActivity(activity: string) {\r\n // tslint:disable-next-line:no-console\r\n if (activity) {\r\n if (activity) {\r\n const tempData = {\r\n label: activity,\r\n value: activity,\r\n stringValue: activity,\r\n };\r\n const timeslip = this.state.timeslip;\r\n timeslip.activity = tempData;\r\n this.setState({ timeslip: timeslip });\r\n }\r\n }\r\n }\r\n\r\n private setDuration(totalMinutes: number) {\r\n var timeString = '';\r\n var hours = Math.floor(totalMinutes / 60);\r\n var minutes = Math.floor(totalMinutes - hours * 60);\r\n var seconds = Math.floor((totalMinutes - hours * 60 - minutes) * 60);\r\n\r\n const timeslip = this.state.timeslip;\r\n timeslip.units = this.getUnitsFromMinutes(totalMinutes );\r\n if (this.state.settings.tenantTimeCaptureMode === 'Units' || this.state.settings.timeCaptureMode === 'Units' && !this.state.selectedTimer) {\r\n timeString = timeslip.units + '';\r\n } else {\r\n var leading0 = minutes < 10;\r\n timeString = hours + ':' + (leading0 ? '0' : '') + minutes;\r\n }\r\n\r\n timeslip.time = { duration: timeString, minutes: minutes, hours: hours, seconds: seconds };\r\n timeslip.units = this.getUnitsFromMinutes(hours * 60 + minutes + seconds / 60);\r\n\r\n if (!this.props.isFromTimer) {\r\n var date = timeslip.date ? timeslip.date : new Date();\r\n var tempHours = 0;\r\n var tempMinutes = 0;\r\n\r\n var extraHour = 0;\r\n\r\n tempMinutes = date.getMinutes() - timeslip.time.minutes;\r\n if (tempMinutes < 0) {\r\n extraHour = 1;\r\n tempMinutes = 0;\r\n }\r\n\r\n tempHours = date.getHours() - timeslip.time.hours - extraHour;\r\n if (tempHours < 0) {\r\n tempHours = 0;\r\n }\r\n\r\n timeslip.date = new Date(date.setHours(tempHours, tempMinutes));\r\n } else {\r\n // the minutes worked is already calculated from the timer\r\n timeslip.date = new Date(timeslip.date.setHours(hours, minutes));\r\n }\r\n\r\n this.setState({ timeslip: timeslip });\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private matterListUI(matter: any) {\r\n const matterTitlePrefix = getMatterTitlePrefix(this.sourceSystem, matter);\r\n return (\r\n \r\n \r\n \r\n {this.createAbbreviation(matterTitlePrefix)}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private listComponent(matter: any): React.ReactNode {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n {matter.fileNumber}\r\n {matter.client}\r\n {`${matter.title}`}\r\n
\r\n );\r\n }\r\n\r\n private createAbbreviation(value: string | null) {\r\n if (value) {\r\n let values = value.split(' ');\r\n\r\n if (values.length === 1) {\r\n return value.substr(0, 2);\r\n } else {\r\n let abbr = '';\r\n\r\n for (let index = 0; index < 2; index++) {\r\n abbr += values[index].substr(0, 1);\r\n }\r\n\r\n return abbr;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private primaryList(title?: string, value?: any): React.ReactNode {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n {title && {title}}\r\n {value && {value}}\r\n
\r\n );\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private secondaryList(\r\n firstValue?: string,\r\n // tslint:disable-next-line:no-any\r\n secondValue?: any,\r\n ): React.ReactNode {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n {firstValue && {firstValue}}\r\n {secondValue && {secondValue}}\r\n
\r\n );\r\n }\r\n\r\n private handleCreateAndNew() {\r\n this.onSubmit(false, false, false);\r\n }\r\n\r\n private handleCreateAndCopy() {\r\n this.onSubmit(false, true, false);\r\n }\r\n\r\n private handleCreateAndClose() {\r\n this.onSubmit(true, false, false);\r\n }\r\n\r\n private handleCreateAndPost() {\r\n this.onSubmit(true, false, true);\r\n }\r\n\r\n private handleUpdate() {\r\n // if (this.props.onUpdate) {\r\n // this.props.onUpdate();\r\n // }\r\n }\r\n\r\n private closePanelFromTimer() {\r\n if (this.state.hasChangedTime || this.state.hasChangedField) {\r\n this.setState({\r\n showConfirm: true,\r\n });\r\n } else {\r\n if (this.props.onClose) {\r\n this.props.onClose();\r\n }\r\n }\r\n }\r\n\r\n private closePanel() {\r\n if (this.state.isFromOutlook) {\r\n CloseBrowserControl();\r\n } else {\r\n if (this.props.onClose) {\r\n this.props.onClose();\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onMatterData(data: any) {\r\n const tempData = {\r\n ...data,\r\n label: data.fileNumber + ' (' + data.title + ')',\r\n value: data.fileNumber,\r\n };\r\n\r\n const timeslip = this.state.timeslip;\r\n timeslip.matter = tempData;\r\n this.setState({\r\n timeslip: timeslip,\r\n matterDialogOpen: false,\r\n // isMatterSelected: tempData ? true : false,\r\n hasChangedField: true,\r\n });\r\n\r\n if (tempData.id) {\r\n this.onMatterSelected(tempData.id);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onTimeData(data: any) {\r\n const timeslip = this.state.timeslip;\r\n timeslip.time.hours = data.duration.hour;\r\n timeslip.time.minutes = data.duration.minute;\r\n var totalMinutes = data.duration.minute + 60 * data.duration.hour;\r\n this.setDuration(totalMinutes);\r\n this.setState({\r\n // timeslip: tempTimeslip,\r\n timeDialogOpen: false,\r\n hasChangedTime: true,\r\n hasChangedField: true,\r\n });\r\n // this.onToggleTimer();\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onStartData(data: any) {\r\n const timeslip = this.state.timeslip;\r\n timeslip.date = data;\r\n this.setState({\r\n timeslip: timeslip,\r\n startsDialogOpen: false,\r\n hasChangedField: true,\r\n });\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onActivityData(data: any) {\r\n // tslint:disable-next-line: no-any\r\n const tempData = {\r\n ...data,\r\n label: data.stringValue,\r\n value: data.stringValue,\r\n };\r\n\r\n const timeslip = this.state.timeslip;\r\n timeslip.activity = tempData;\r\n if (this.state.settings && this.state.settings.copyActivityAsNote && !this.state.noteHasBeenCustomised) {\r\n timeslip.note = tempData.stringValue;\r\n }\r\n this.setState({\r\n timeslip: timeslip,\r\n activityDialogOpen: false,\r\n hasChangedField: true,\r\n });\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onChargeCodeData(data: any) {\r\n const timeslip = this.state.timeslip;\r\n timeslip.chargeCode = data.description;\r\n timeslip.chargeCodeId = data.id;\r\n timeslip.chargeRate = data.rate;\r\n\r\n this.setState({\r\n timeslip: timeslip,\r\n chargeCodeDialogOpen: false,\r\n hasChangedField: true,\r\n });\r\n\r\n // tslint:disable-next-line:no-console\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private onNotesData(data: any, isInprotechNote: boolean) {\r\n const timeslip = this.state.timeslip;\r\n if (isInprotechNote) {\r\n timeslip.inprotechNote = data;\r\n this.setState({\r\n timeslip: timeslip,\r\n notesDialogOpen: false,\r\n hasChangedField: true,\r\n });\r\n } else {\r\n var customised = false;\r\n if (timeslip.note !== data) {\r\n customised = true;\r\n }\r\n timeslip.note = data;\r\n this.setState({\r\n timeslip: timeslip,\r\n notesDialogOpen: false,\r\n noteHasBeenCustomised: customised,\r\n hasChangedField: true,\r\n });\r\n }\r\n }\r\n\r\n private onSubmit(shouldClose: boolean, shouldCopy: boolean, shouldSubmit: boolean) {\r\n if (this.validateSubmission(shouldSubmit)) {\r\n var duration = this.state.timeslip.time.hours * 60 + this.state.timeslip.time.minutes + this.state.timeslip.time.seconds / 60;\r\n var units = this.getUnitsFromMinutes(duration);\r\n // only update the duration if it s a non draft submission\r\n if (this.state.shouldSubmit) {\r\n duration = this.getMinutesFromUnits(units);\r\n }\r\n\r\n var endTime = this.state.timeslip.date.getHours() * 3600 + this.state.timeslip.date.getMinutes() * 60;\r\n var startTime = endTime - duration * 60;\r\n\r\n // if the timeslip is outside of a 24 hour period, realign it\r\n if (startTime <= 0) {\r\n var difference = startTime;\r\n startTime = 0;\r\n endTime = endTime - difference;\r\n }\r\n if (!this.props.timeslips) {\r\n client\r\n .mutate({\r\n mutation: SubmitTimeslip,\r\n variables: {\r\n matterId: this.state.timeslip.matter.id,\r\n activityString: this.state.timeslip.activity.stringValue,\r\n itemDate: this.state.timeslip.date,\r\n timeWorkedMinutes: duration,\r\n billingNote: this.state.timeslip.note,\r\n timeUnits: units,\r\n chargeLevelId: this.state.timeslip.chargeCodeId,\r\n chargeRate: this.state.timeslip.chargeRate,\r\n startTimeSeconds: startTime,\r\n shouldSubmit: shouldSubmit,\r\n endTimeSeconds: endTime,\r\n timeslipNote: this.state.timeslip.inprotechNote,\r\n feeEarnerId: this.state.feeEarnerId,\r\n },\r\n })\r\n .then(\r\n (results: {\r\n data: {\r\n addNewTimeslip: {\r\n error: string;\r\n success: boolean;\r\n };\r\n };\r\n }) => {\r\n if (!results.data) {\r\n showNotification('Timeslip Submission Failed', 'Unknown Error', 'error');\r\n } else {\r\n if (results.data.addNewTimeslip.error) {\r\n showNotification('Timeslip Submission Failed', results.data.addNewTimeslip.error, 'error');\r\n } else {\r\n showNotification(null, 'Timeslip Submitted', 'info');\r\n if (this.props.updateAction) {\r\n var timeWorkedSeconds = this.state.timeslip.time.hours * 3600 + this.state.timeslip.time.minutes * 60;\r\n var timeslip: TimeslipSummaries = {\r\n id: -1,\r\n matterID: this.state.timeslip.matter.id,\r\n fileNumber: this.state.timeslip.matter.fileNumber,\r\n matterCategory: this.state.timeslip.matter.matterCategory,\r\n matterType: this.state.timeslip.matter.matterType,\r\n title: this.state.timeslip.matter.title,\r\n activityID: null,\r\n activityDescription: this.state.timeslip.activity.stringValue,\r\n chargeLevelID: null,\r\n chargeLevelDescription: null,\r\n client: this.state.timeslip.matter.client,\r\n itemDate: this.state.timeslip.date,\r\n startTimeSeconds: null,\r\n endTimeSeconds: null,\r\n timeWorkedSeconds: timeWorkedSeconds,\r\n amount: null,\r\n chargeRate: null,\r\n units: this.state.timeslip.units,\r\n note: this.state.timeslip.note,\r\n isSynced: null,\r\n syncErrorID: null,\r\n syncErrorDescription: null,\r\n isIncomplete: null,\r\n status: shouldSubmit ? 'Pending' : 'Draft',\r\n duration: null,\r\n startTime: null,\r\n endTime: null,\r\n timesheetNote: this.state.timeslip.inprotechNote,\r\n };\r\n this.props.updateAction(timeslip);\r\n }\r\n if (shouldClose) {\r\n if (this.state.isFromOutlook) {\r\n setTimeout(() => CloseBrowserControl(), 1000);\r\n }\r\n if (this.props.onClose) {\r\n this.props.onClose();\r\n }\r\n } else {\r\n fetchTypedUserSettings(\r\n true,\r\n // tslint:disable-next-line:no-console\r\n (data: TypedTenantUserOptions) => {\r\n this.setState({\r\n settings: data,\r\n matter: shouldCopy ? this.state.matter : undefined,\r\n timeslip: {\r\n matter: shouldCopy ? this.state.timeslip.matter : {},\r\n activity: shouldCopy ? this.state.timeslip.activity : {},\r\n chargeCode: '',\r\n chargeRate: 0,\r\n chargeCodeId: 0,\r\n time: {\r\n duration: '00:00',\r\n minutes: 0,\r\n hours: 0,\r\n seconds: 0,\r\n },\r\n units: 0,\r\n date: this.state.timeslip.date,\r\n note: '',\r\n inprotechNote: '',\r\n },\r\n });\r\n this.setMatter(this.state.settings.defaultMatter);\r\n this.setDuration(this.state.settings.defaultDurationMinutes);\r\n },\r\n (reason) => {\r\n showNotification('Failed to Fetch Layout Configuration', reason, 'error');\r\n },\r\n );\r\n }\r\n\r\n if (this.state.isFromOutlook) {\r\n setTimeout(() => CloseBrowserControl(), 1000);\r\n }\r\n }\r\n }\r\n },\r\n );\r\n } else {\r\n client\r\n .mutate({\r\n mutation: UpdateTimeslip,\r\n variables: {\r\n matterId: this.state.timeslip.matter.id,\r\n activityString: this.state.timeslip.activity.stringValue,\r\n itemDate: this.state.timeslip.date,\r\n timeWorkedMinutes: duration,\r\n billingNote: this.state.timeslip.note,\r\n timeUnits: units,\r\n chargeLevelId: this.state.timeslip.chargeCodeId,\r\n chargeRate: this.state.timeslip.chargeRate,\r\n startTimeSeconds: startTime,\r\n shouldSubmit: shouldSubmit,\r\n endTimeSeconds: endTime,\r\n timeslipId: this.state.timeslip.id,\r\n timeslipNote: this.state.timeslip.inprotechNote,\r\n feeEarnerId: this.state.feeEarnerId,\r\n },\r\n })\r\n .then(\r\n (results: {\r\n data: {\r\n updateTimeslip: {\r\n error: string;\r\n success: boolean;\r\n };\r\n };\r\n }) => {\r\n if (!results.data) {\r\n showNotification('Timeslip Submission Failed', 'Unknown Error', 'error');\r\n } else {\r\n if (results.data.updateTimeslip.error) {\r\n showNotification('Timeslip Submission Failed', results.data.updateTimeslip.error, 'error');\r\n } else {\r\n showNotification(null, 'Timeslip Submitted', 'info');\r\n if (this.props.updateAction) {\r\n var timeWorkedSeconds = this.state.timeslip.time.hours * 3600 + this.state.timeslip.time.minutes * 60;\r\n var timeslip: TimeslipSummaries = {\r\n id: -1,\r\n matterID: this.state.timeslip.matter.id,\r\n fileNumber: this.state.timeslip.matter.fileNumber,\r\n matterCategory: this.state.timeslip.matter.matterCategory,\r\n matterType: this.state.timeslip.matter.matterType,\r\n title: this.state.timeslip.matter.title,\r\n activityID: null,\r\n activityDescription: this.state.timeslip.activity.stringValue,\r\n chargeLevelID: null,\r\n chargeLevelDescription: null,\r\n client: this.state.timeslip.matter.client,\r\n itemDate: this.state.timeslip.date,\r\n startTimeSeconds: null,\r\n endTimeSeconds: null,\r\n timeWorkedSeconds: timeWorkedSeconds,\r\n amount: null,\r\n chargeRate: null,\r\n units: this.state.timeslip.units,\r\n note: this.state.timeslip.note,\r\n isSynced: null,\r\n syncErrorID: null,\r\n syncErrorDescription: null,\r\n isIncomplete: null,\r\n status: shouldSubmit ? 'Pending' : 'Draft',\r\n duration: null,\r\n startTime: null,\r\n endTime: null,\r\n timesheetNote: this.state.timeslip.inprotechNote,\r\n };\r\n this.props.updateAction(timeslip);\r\n if (shouldClose) {\r\n if (this.state.isFromOutlook) {\r\n // tslint:disable-next-line: align\r\n setTimeout(() => CloseBrowserControl(), 1000);\r\n }\r\n if (this.props.onClose) {\r\n this.props.onClose();\r\n }\r\n } else {\r\n fetchTypedUserSettings(\r\n true,\r\n // tslint:disable-next-line:no-console\r\n (data: TypedTenantUserOptions) => {\r\n this.setState({\r\n settings: data,\r\n matter: shouldCopy ? this.state.matter : undefined,\r\n timeslip: {\r\n matter: shouldCopy ? this.state.timeslip.matter : {},\r\n activity: shouldCopy ? this.state.timeslip.activity : {},\r\n chargeCode: '',\r\n chargeRate: 0,\r\n chargeCodeId: 0,\r\n time: {\r\n duration: '00:00',\r\n minutes: 0,\r\n hours: 0,\r\n seconds: 0,\r\n },\r\n units: 0,\r\n date: this.state.timeslip.date,\r\n note: '',\r\n inprotechNote: '',\r\n },\r\n });\r\n this.setMatter(this.state.settings.defaultMatter);\r\n this.setDuration(this.state.settings.defaultDurationMinutes);\r\n },\r\n (reason) => {\r\n showNotification('Failed to Fetch Layout Configuration', reason, 'error');\r\n },\r\n );\r\n }\r\n }\r\n if (this.state.isFromOutlook) {\r\n setTimeout(() => CloseBrowserControl(), 1000);\r\n }\r\n }\r\n }\r\n },\r\n );\r\n for (var timesheetId of this.state.timeslipsToRemove) {\r\n client.mutate({\r\n mutation: DeleteTimeslip,\r\n variables: {\r\n timeslipId: timesheetId,\r\n feeEarnerId: this.state.feeEarnerId,\r\n },\r\n });\r\n }\r\n if (this.props.mergeAction) {\r\n this.props.mergeAction();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private convertToMinutes(timeString: string): number {\r\n var minutes = 0;\r\n var items = timeString.split(':');\r\n\r\n minutes += parseInt(items[0], 10) * 60 + parseInt(items[1], 10);\r\n\r\n return minutes;\r\n }\r\n private validateSubmission(shouldSubmit: boolean): boolean {\r\n if (!this.state.timeslip) {\r\n showNotification('Timeslip Submission Failed', 'Timeslip must be filled', 'error');\r\n return false;\r\n }\r\n if (!this.state.timeslip.time || this.convertToMinutes(this.state.timeslip.time.duration) === 0) {\r\n showNotification('Timeslip Submission Failed', 'Cannot have a timeslip for zero minutes', 'error');\r\n return false;\r\n }\r\n if (!this.state.timeslip.matter.id && shouldSubmit) {\r\n showNotification('Timeslip Submission Failed', 'Please choose a matter', 'error');\r\n return false;\r\n }\r\n if (!this.state.timeslip.activity.stringValue && shouldSubmit) {\r\n showNotification('Timeslip Submission Failed', 'Please choose an activity', 'error');\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n private onCloseTime() {\r\n this.setState({\r\n timeDialogOpen: false,\r\n });\r\n }\r\n\r\n private onCloseMatter() {\r\n this.setState({\r\n matterDialogOpen: false,\r\n });\r\n }\r\n\r\n private onCloseStart() {\r\n this.setState({\r\n startsDialogOpen: false,\r\n });\r\n }\r\n\r\n private onCloseActivity() {\r\n this.setState({\r\n activityDialogOpen: false,\r\n });\r\n }\r\n\r\n private onCloseChargeCode() {\r\n this.setState({\r\n chargeCodeDialogOpen: false,\r\n });\r\n }\r\n\r\n private onCloseNotes() {\r\n this.setState({\r\n notesDialogOpen: false,\r\n });\r\n }\r\n\r\n private limitText(value: string, limit: number) {\r\n if (value.length > limit) {\r\n return value.substring(0, limit) + '...';\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n private onLongText(content: React.ReactNode, value: string, limit: number) {\r\n const calloutProps = { gapSpace: 0 };\r\n\r\n if (value && value.length > limit) {\r\n return (\r\n \r\n {content}\r\n \r\n );\r\n }\r\n\r\n return content;\r\n }\r\n\r\n private handleToggle = (value: string) => () => {\r\n switch (value) {\r\n case 'time': {\r\n if (this.state.selectedTimer) {\r\n var timer = this.state.selectedTimer;\r\n timer.isRunning = false;\r\n this.setState({\r\n timeDialogOpen: true,\r\n matterDialogOpen: false,\r\n startsDialogOpen: false,\r\n activityDialogOpen: false,\r\n notesDialogOpen: false,\r\n chargeCodeDialogOpen: false,\r\n selectedTimer: timer,\r\n });\r\n } else {\r\n this.setState({\r\n timeDialogOpen: true,\r\n matterDialogOpen: false,\r\n startsDialogOpen: false,\r\n activityDialogOpen: false,\r\n notesDialogOpen: false,\r\n chargeCodeDialogOpen: false,\r\n });\r\n }\r\n break;\r\n }\r\n case 'matter': {\r\n this.setState({\r\n timeDialogOpen: false,\r\n matterDialogOpen: true,\r\n startsDialogOpen: false,\r\n activityDialogOpen: false,\r\n notesDialogOpen: false,\r\n chargeCodeDialogOpen: false,\r\n });\r\n break;\r\n }\r\n case 'starts': {\r\n this.setState({\r\n timeDialogOpen: false,\r\n matterDialogOpen: false,\r\n startsDialogOpen: true,\r\n activityDialogOpen: false,\r\n notesDialogOpen: false,\r\n chargeCodeDialogOpen: false,\r\n });\r\n break;\r\n }\r\n case 'activity': {\r\n this.setState({\r\n timeDialogOpen: false,\r\n matterDialogOpen: false,\r\n startsDialogOpen: false,\r\n activityDialogOpen: true,\r\n notesDialogOpen: false,\r\n chargeCodeDialogOpen: false,\r\n });\r\n break;\r\n }\r\n case 'notes': {\r\n this.setState({\r\n timeDialogOpen: false,\r\n matterDialogOpen: false,\r\n startsDialogOpen: false,\r\n activityDialogOpen: false,\r\n notesDialogOpen: true,\r\n chargeCodeDialogOpen: false,\r\n inInprotechNotes: false,\r\n });\r\n break;\r\n }\r\n case 'inprotechNotes': {\r\n this.setState({\r\n timeDialogOpen: false,\r\n matterDialogOpen: false,\r\n startsDialogOpen: false,\r\n activityDialogOpen: false,\r\n notesDialogOpen: true,\r\n chargeCodeDialogOpen: false,\r\n inInprotechNotes: true,\r\n });\r\n break;\r\n }\r\n case 'chargeCode': {\r\n this.setState({\r\n timeDialogOpen: false,\r\n matterDialogOpen: false,\r\n startsDialogOpen: false,\r\n activityDialogOpen: false,\r\n notesDialogOpen: false,\r\n chargeCodeDialogOpen: true,\r\n });\r\n break;\r\n }\r\n default: {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private handleCheckBoxChange(event: React.ChangeEvent) {\r\n this.setState({\r\n shouldSubmit: !event.target.checked,\r\n });\r\n }\r\n\r\n private onMatterSelected(matterId: number) {\r\n let vm = this;\r\n var matterFinancialsQueryParams: MatterFinancialsQueryParams = {\r\n matterId: matterId,\r\n };\r\n\r\n retrieveMatterFinancials(\r\n matterFinancialsQueryParams,\r\n false,\r\n (data) => this.onMatterFinancialsRetrieved(data),\r\n // tslint:disable-next-line:no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n vm.setState({\r\n isFinancialsLoading: false,\r\n });\r\n },\r\n );\r\n }\r\n\r\n private onMatterFinancialsRetrieved(data: MatterData) {\r\n if (data.matter) {\r\n if (data.matter.financials && this.threshold !== 0 ) {\r\n let billed = data.matter.financials?.billedTimeAndFees;\r\n let unbilled = data.matter.financials?.unbilledTimeAndFees;\r\n let estimate = data.matter.financials?.estimatedCosts;\r\n let threshold = this.threshold / 100;\r\n if (estimate > 0 && (billed + unbilled) > threshold * estimate) {\r\n const text = `Time & Fees of ${this.currencySymbol}${formatNumber((billed + unbilled))} has surpassed ${formatNumber(threshold * 100)}% of ${\r\n this.currencySymbol\r\n }${formatNumber(estimate)} estimated fees`;\r\n\r\n this.setState({\r\n showConfirmBillingThreshold: true,\r\n billingConfirmThresholdText: text,\r\n });\r\n } else {\r\n this.setState({\r\n billingConfirmThresholdText: ''\r\n });\r\n }\r\n }\r\n\r\n this.setState({\r\n isFinancialsLoading: false,\r\n matter: data.matter,\r\n // matterFinancials: data.matter\r\n });\r\n }\r\n }\r\n\r\n private onChangeUnit(event: React.ChangeEvent) {\r\n if (Number.isNaN(+event.target.value)) {\r\n return;\r\n }\r\n var unitsValue = +event.target.value;\r\n\r\n this.setDuration(this.getMinutesFromUnits(unitsValue));\r\n this.setState({ hasChangedTime: true });\r\n // this.onToggleTimer();\r\n }\r\n\r\n private formatNumberBy0(value: number) {\r\n const newValue = Math.round(value);\r\n if (newValue < 10) {\r\n return '0' + newValue;\r\n // return ('0' + value).slice(-2);\r\n }\r\n\r\n return newValue;\r\n }\r\n\r\n private onChangeDuration = (field: string) => (event: React.ChangeEvent) => {\r\n if (Number.isNaN(+event.target.value)) {\r\n return;\r\n }\r\n\r\n const minHours = 0;\r\n const maxHours = 23;\r\n const minMinutes = 0;\r\n const maxMinutes = 59;\r\n\r\n if (field === 'minute') {\r\n if (event.target.value === '' || (Number(event.target.value) >= minMinutes && Number(event.target.value) <= maxMinutes)) {\r\n var minutes = +event.target.value;\r\n this.setDuration(this.state.timeslip.time.hours * 60 + minutes);\r\n }\r\n }\r\n\r\n if (field === 'hour') {\r\n if (event.target.value === '' || (Number(event.target.value) >= minHours && Number(event.target.value) <= maxHours)) {\r\n var hours = +event.target.value;\r\n this.setDuration(hours * 60 + this.state.timeslip.time.minutes);\r\n }\r\n }\r\n\r\n // if the duration is manually changed, then we stop the timer.\r\n const selectedTimer = this.state.selectedTimer;\r\n if (selectedTimer) {\r\n selectedTimer.isRunning = false;\r\n }\r\n\r\n this.setState({\r\n hasChangedTime: true,\r\n selectedTimer: selectedTimer,\r\n });\r\n // this.onToggleTimer();\r\n // code here\r\n }\r\n\r\n private onMatterLookupChange = (value: MatterLookUpItem, name: string) => {\r\n // check if selector has value\r\n const timeslip = this.state.timeslip;\r\n\r\n timeslip.matter = value;\r\n this.setState({\r\n timeslip: timeslip,\r\n // isMatterSelected: value ? true : false,\r\n hasChangedField: true,\r\n });\r\n\r\n if (value) {\r\n this.onMatterSelected(value.id);\r\n }\r\n }\r\n\r\n private onActivityChange = (value: ActivityItem, name: string) => {\r\n const timeslip = this.state.timeslip;\r\n timeslip.activity = value;\r\n this.setState({\r\n timeslip: timeslip,\r\n hasChangedField: true,\r\n });\r\n }\r\n\r\n private onNoteChange = (event: React.ChangeEvent) => {\r\n const timeslip = this.state.timeslip;\r\n const tempValue = event.target.value;\r\n if (this.sourceSystem.toLowerCase() == \"inprotech\") {\r\n timeslip.inprotechNote = tempValue;\r\n this.setState({\r\n timeslip: timeslip,\r\n hasChangedField: true,\r\n });\r\n } else {\r\n var customised = false;\r\n if (timeslip.note !== tempValue) {\r\n customised = true;\r\n }\r\n timeslip.note = tempValue;\r\n this.setState({\r\n timeslip: timeslip,\r\n noteHasBeenCustomised: customised,\r\n hasChangedField: true,\r\n });\r\n }\r\n }\r\n\r\n private onSaveToTimer() {\r\n if (this.props.updateTimerAction) {\r\n var timeWorkedSeconds = this.state.timeslip.time.hours * 60 * 60 + this.state.timeslip.time.minutes * 60 + this.state.timeslip.time.seconds;\r\n var isRunning = false;\r\n var timerGuid = null;\r\n var lastStarted = null;\r\n\r\n if (this.state.selectedTimer) {\r\n isRunning = this.state.selectedTimer.isRunning;\r\n lastStarted = this.state.selectedTimer.lastStarted;\r\n timerGuid = this.state.selectedTimer?.timerGuid;\r\n }\r\n\r\n var timer: TimerSummaryElement = {\r\n activityDescription: this.state.timeslip.activity ? this.state.timeslip.activity.label : null,\r\n activityId: this.state.timeslip.activity ? this.state.timeslip.activity.id : null,\r\n chargeRate: this.state.timeslip.chargeRate ?? null,\r\n chargeRateId: this.state.timeslip.chargeCodeId ?? null,\r\n billingNote: this.state.timeslip.note ?? null,\r\n client: this.state.timeslip.matter ? this.state.timeslip.matter.client : null,\r\n fileNumber: this.state.timeslip.matter ? this.state.timeslip.matter.fileNumber : null,\r\n matterCategory: this.state.timeslip.matter ? this.state.timeslip.matter.matterCategory : null,\r\n matterId: this.state.timeslip.matter ? this.state.timeslip.matter.id : null,\r\n matterType: this.state.timeslip.matter ? this.state.timeslip.matter.matterType : null,\r\n timesheetNote: this.state.timeslip.inprotechNote ?? null,\r\n title: this.state.timeslip.matter ? this.state.timeslip.matter.title : null,\r\n isRunning: this.state.hasChangedTime ? false : isRunning,\r\n timeWorkedSeconds: this.state.hasChangedTime ? timeWorkedSeconds : null,\r\n timeWorkedSecondsTemp: timeWorkedSeconds,\r\n timerGuid: timerGuid,\r\n lastStarted: lastStarted,\r\n inError: false,\r\n errorMessage: null,\r\n units: this.state.timeslip.units,\r\n };\r\n\r\n this.props.updateTimerAction(\r\n timer,\r\n this.state.selectedTimer && this.state.selectedTimer.timerGuid ? this.state.selectedTimer.timerGuid : undefined,\r\n this.props.newTimer,\r\n );\r\n }\r\n }\r\n\r\n private onToggleTimer() {\r\n if (this.props.onToggleTimer) {\r\n var timeWorkedSeconds = this.state.timeslip.time.hours * 60 * 60 + this.state.timeslip.time.minutes * 60 + this.state.timeslip.time.seconds ;\r\n var isRunning = false;\r\n var timerGuid = null;\r\n var lastStarted = null;\r\n\r\n if (this.state.selectedTimer) {\r\n isRunning = this.state.selectedTimer.isRunning;\r\n lastStarted = this.state.selectedTimer.lastStarted;\r\n timerGuid = this.state.selectedTimer?.timerGuid;\r\n }\r\n\r\n var timer: TimerSummaryElement = {\r\n activityDescription: this.state.timeslip.activity.label,\r\n activityId: this.state.timeslip.activity.id,\r\n chargeRate: this.state.timeslip.chargeRate,\r\n chargeRateId: this.state.timeslip.chargeCodeId,\r\n billingNote: this.state.timeslip.note,\r\n client: this.state.timeslip.matter.client,\r\n fileNumber: this.state.timeslip.matter.fileNumber,\r\n matterCategory: this.state.timeslip.matter.matterCategory,\r\n matterId: this.state.timeslip.matter.id,\r\n matterType: this.state.timeslip.matter.matterType,\r\n timesheetNote: this.state.timeslip.inprotechNote,\r\n title: this.state.timeslip.matter.title,\r\n isRunning: this.state.hasChangedTime ? false : isRunning,\r\n timeWorkedSeconds: this.state.hasChangedTime ? timeWorkedSeconds : null,\r\n timeWorkedSecondsTemp: timeWorkedSeconds,\r\n timerGuid: timerGuid,\r\n lastStarted: lastStarted,\r\n inError: false,\r\n errorMessage: null,\r\n units: this.state.timeslip.units,\r\n };\r\n\r\n this.props.onToggleTimer(timer);\r\n }\r\n }\r\n private onSubmitTimerAsDraft() {\r\n if (this.props.onSubmitTimerAsDraft) {\r\n var timeWorkedSeconds = this.state.timeslip.time.hours * 60 * 60 + this.state.timeslip.time.minutes * 60 + this.state.timeslip.time.seconds;\r\n var isRunning = false;\r\n var timerGuid = null;\r\n var lastStarted = null;\r\n\r\n if (this.state.selectedTimer) {\r\n isRunning = this.state.selectedTimer.isRunning;\r\n lastStarted = this.state.selectedTimer.lastStarted;\r\n timerGuid = this.state.selectedTimer?.timerGuid;\r\n }\r\n\r\n var timer: TimerSummaryElement = {\r\n activityDescription: this.state.timeslip.activity.label,\r\n activityId: this.state.timeslip.activity.id,\r\n chargeRate: this.state.timeslip.chargeRate,\r\n chargeRateId: this.state.timeslip.chargeCodeId,\r\n billingNote: this.state.timeslip.note,\r\n client: this.state.timeslip.matter.client,\r\n fileNumber: this.state.timeslip.matter.fileNumber,\r\n matterCategory: this.state.timeslip.matter.matterCategory,\r\n matterId: this.state.timeslip.matter.id,\r\n matterType: this.state.timeslip.matter.matterType,\r\n timesheetNote: this.state.timeslip.inprotechNote,\r\n title: this.state.timeslip.matter.title,\r\n isRunning: this.state.hasChangedTime ? false : isRunning,\r\n timeWorkedSeconds: timeWorkedSeconds,\r\n timeWorkedSecondsTemp: timeWorkedSeconds,\r\n timerGuid: timerGuid,\r\n lastStarted: lastStarted,\r\n inError: false,\r\n errorMessage: null,\r\n units: this.state.timeslip.units,\r\n };\r\n\r\n this.props.onSubmitTimerAsDraft(timer);\r\n }\r\n }\r\n private onSubmitTimer() {\r\n if (this.props.onSubmitTimer && this.validateSubmission(true)) {\r\n var timeWorkedSeconds = this.state.timeslip.time.hours * 60 * 60 + this.state.timeslip.time.minutes * 60 + this.state.timeslip.time.seconds;\r\n\r\n var isRunning = false;\r\n var timerGuid = null;\r\n var lastStarted = null;\r\n\r\n if (this.state.selectedTimer) {\r\n isRunning = this.state.selectedTimer.isRunning;\r\n lastStarted = this.state.selectedTimer.lastStarted;\r\n timerGuid = this.state.selectedTimer?.timerGuid;\r\n }\r\n\r\n var timer: TimerSummaryElement = {\r\n activityDescription: this.state.timeslip.activity.label,\r\n activityId: this.state.timeslip.activity.id,\r\n chargeRate: this.state.timeslip.chargeRate,\r\n chargeRateId: this.state.timeslip.chargeCodeId,\r\n billingNote: this.state.timeslip.note,\r\n client: this.state.timeslip.matter.client,\r\n fileNumber: this.state.timeslip.matter.fileNumber,\r\n matterCategory: this.state.timeslip.matter.matterCategory,\r\n matterId: this.state.timeslip.matter.id,\r\n matterType: this.state.timeslip.matter.matterType,\r\n timesheetNote: this.state.timeslip.inprotechNote,\r\n title: this.state.timeslip.matter.title,\r\n isRunning: this.state.hasChangedTime ? false : isRunning,\r\n timeWorkedSeconds: timeWorkedSeconds,\r\n timeWorkedSecondsTemp: timeWorkedSeconds,\r\n timerGuid: timerGuid,\r\n lastStarted: lastStarted,\r\n inError: false,\r\n errorMessage: null,\r\n units: this.state.timeslip.units,\r\n };\r\n this.props.onSubmitTimer(timer);\r\n }\r\n }\r\n\r\n private updateRunningTime() {\r\n if (this.state.selectedTimer?.isRunning === true) {\r\n const { hours, minutes, seconds } = this.state.timeslip.time;\r\n\r\n let updatedSeconds = seconds + 1;\r\n let updatedMinutes = minutes;\r\n let updatedHours = hours;\r\n\r\n if (updatedSeconds === 60) {\r\n updatedMinutes += 1;\r\n updatedSeconds = 0;\r\n }\r\n\r\n if (updatedMinutes === 60) {\r\n updatedHours += 1;\r\n updatedMinutes = 0;\r\n }\r\n\r\n this.setState({\r\n timeslip: {\r\n ...this.state.timeslip,\r\n time: {\r\n ...this.state.timeslip.time,\r\n hours: updatedHours,\r\n minutes: updatedMinutes,\r\n seconds: updatedSeconds,\r\n },\r\n },\r\n });\r\n }\r\n }\r\n\r\n private onDeleteConfirm(agree: boolean) {\r\n if (agree && this.props.onClose) {\r\n this.props.onClose();\r\n }\r\n this.setState({\r\n showConfirm: false,\r\n });\r\n }\r\n\r\n private onShowThresholdConfirm(agree: boolean) {\r\n this.setState({\r\n showConfirmBillingThreshold: false,\r\n });\r\n }\r\n}\r\n\r\nconst SubmitTimeslip = gql`\r\n mutation SubmitTimeslip(\r\n $matterId: Int\r\n $activityString: String\r\n $itemDate: DateTime!\r\n $timeWorkedMinutes: Int!\r\n $billingNote: String\r\n $timeUnits: Int!\r\n $startTimeSeconds: Int!\r\n $endTimeSeconds: Int!\r\n $chargeLevelId: Int\r\n $chargeRate: Decimal\r\n $shouldSubmit: Boolean!\r\n $timeslipNote: String\r\n $feeEarnerId: String\r\n ) {\r\n addNewTimeslip(\r\n matterId: $matterId\r\n activityString: $activityString\r\n itemDate: $itemDate\r\n activityId: -1\r\n timeWorkedMinutes: $timeWorkedMinutes\r\n timeUnits: $timeUnits\r\n billingNote: $billingNote\r\n startTimeSeconds: $startTimeSeconds\r\n endTimeSeconds: $endTimeSeconds\r\n shouldSubmit: $shouldSubmit\r\n source: \"ConnectWeb\"\r\n chargeLevelId: $chargeLevelId\r\n chargeRate: $chargeRate\r\n shouldPost: $shouldSubmit\r\n timeslipNote: $timeslipNote\r\n feeEarnerId: $feeEarnerId\r\n ) {\r\n error\r\n success\r\n }\r\n }\r\n`;\r\n\r\nconst UpdateTimeslip = gql`\r\n mutation UpdateTimeslip(\r\n $matterId: Int\r\n $activityString: String\r\n $itemDate: DateTime!\r\n $timeWorkedMinutes: Int!\r\n $billingNote: String\r\n $timeUnits: Int!\r\n $startTimeSeconds: Int!\r\n $endTimeSeconds: Int!\r\n $chargeLevelId: Int\r\n $chargeRate: Decimal\r\n $shouldSubmit: Boolean!\r\n $timeslipId: Int!\r\n $timeslipNote: String\r\n $feeEarnerId: String\r\n ) {\r\n updateTimeslip(\r\n matterId: $matterId\r\n activityString: $activityString\r\n itemDate: $itemDate\r\n activityId: -1\r\n timeWorkedMinutes: $timeWorkedMinutes\r\n timeUnits: $timeUnits\r\n billingNote: $billingNote\r\n startTimeSeconds: $startTimeSeconds\r\n endTimeSeconds: $endTimeSeconds\r\n shouldSubmit: $shouldSubmit\r\n source: \"ConnectWeb\"\r\n chargeLevelId: $chargeLevelId\r\n chargeRate: $chargeRate\r\n timesheetId: $timeslipId\r\n shouldPost: $shouldSubmit\r\n timeslipNote: $timeslipNote\r\n feeEarnerId: $feeEarnerId\r\n ) {\r\n error\r\n success\r\n }\r\n }\r\n`;\r\n\r\nconst DeleteTimeslip = gql`\r\n mutation DeleteTimeslip($timeslipId: Int!, $feeEarnerId: String) {\r\n deleteTimeslip(timesheetId: $timeslipId, feeEarnerId: $feeEarnerId) {\r\n error\r\n success\r\n }\r\n }\r\n`;\r\n\r\nconst TenantData = gql`\r\n query Tenant {\r\n tenant {\r\n sourceSystem\r\n tenantId\r\n }\r\n options {\r\n localCurrency {\r\n currency\r\n }\r\n currencySymbol {\r\n symbol\r\n }\r\n }\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\n// tslint:disable-next-line:no-any\r\nexport default withStyles(styles as any, { withTheme: true })(\r\n // tslint:disable-next-line: no-any\r\n TimeslipPage as any,\r\n // tslint:disable-next-line: no-any\r\n) as any;\r\n"],"sourceRoot":""}