{"version":3,"sources":["app/components/reports/logo.svg","app/utils/Date2.ts","app/services/FBService.ts","app/contexts/AppContext.tsx","app/components/misc/AppSpinner.tsx","app/components/nav/AccessToken.tsx","app/utils/Math2.ts","app/utils/Object2.ts","app/components/reports/TaskTable.tsx","app/components/reports/OpenCases.tsx","app/components/reports/PeopleList.tsx","app/components/reports/InfoBox.tsx","app/components/charts/ChartConfig.ts","app/utils/CSSVar.ts","app/components/charts/ChartLabel.tsx","app/managers/DateManager.ts","app/services/ProductionService.ts","app/components/reports/ProductionAverages.tsx","app/components/reports/ProductionTotals.tsx","app/components/reports/ProjectList.tsx","app/services/SupportService.ts","app/components/reports/SupportVolume.tsx","app/components/reports/TeamPerformance.tsx","app/data/NavOptions.ts","app/components/nav/Dashboard.tsx","app/components/reports/Report.tsx","app/App.tsx","index.tsx"],"names":["module","exports","Date2","date","getDate","toString","padStart","getMonth","getFullYear","months","map","item","slice","value","match","Date","toISOString","replace","API_URL","FBService","token","intervals","deleteInterval","ixInterval","a","fetch","method","body","JSON","stringify","forEach","cases","customer","edit","ixBug","ixProject","response","json","data","areas","query","max","UK_PROJECT_PREFIX","raw","sTitle","sProject","ixArea","sArea","ixStatus","sStatus","ixPriority","sPriority","ixFixFor","sFixFor","dtFixFor","dblStoryPts","hrsOrigEst","hrsCurrEst","hrsElapsed","ixCategory","sCategory","ixPersonAssignedTo","sPersonAssignedTo","ixPersonOpenedBy","ixPersonResolvedBy","ixPersonClosedBy","ixPersonLastEditedBy","dtOpened","dtResolved","dtClosed","dtDue","client","aProject","PROJECT_PREFIX_PATTERN","aTitle","aClient","undefined","Math","startDate","endDate","ixPerson","toUSDateString","dtStart","dtEnd","fDeleted","projects","people","filter","sEmail","indexOf","UK_DOMAIN","fetchToken","catch","e","console","error","isValid","DK_PROJECT_PREFIX","SUPPORT_PROJECT","AppContext","React","createContext","AppStore","state","loading","this","setState","validateToken","fetchProjects","allProjects","fetchPeople","tokenValid","Provider","onLoadingChange","onTokenChange","setToken","props","children","Component","AppSpinner","context","id","className","Spinner","animation","role","contextType","AccessToken","inputEl","dirty","onSubmit","preventDefault","current","createRef","tokenLength","length","maskedToken","Form","Row","Col","Text","xs","Button","size","type","variant","hasError","Control","ref","placeholder","isInvalid","href","target","rel","Label","renderInner","Math2","n","min","num","step","parseFloat","ceil","toFixed","countDecimals","str","decimalIndex","floor","round","Object2","obj","key","defaultValue","TaskTable","tasks","badgeText","getValue","badgeKey","dateValue","dateKey","dateFlag","dateFormatted","formatDate","onClick","window","open","Badge","renderHours","dateLabel","renderStatus","percent","color","ProgressBar","now","status","toLowerCase","renderTasks","OpenCases","area","CaseAreaData","ALL","onUpdateClick","fetchCases","Group","as","Object","keys","index","Check","label","name","defaultChecked","inline","eventKey","innerHtml","getCasesByProject","Card","Accordion","Toggle","Header","renderProjectHeader","Collapse","Body","defaultActiveKey","project","hoursFlag","pastEstTotal","dueFlag","pastDueTotal","renderControls","renderProjects","DEV","PM","arr","dt","proj","find","p","source","assign","resolvedTotal","hrsCurrEstTotal","hrsElapsedTotal","push","Error","Number","sort","b","localeCompare","PeopleList","encodeURIComponent","sFullName","renderPeople","InfoBox","Popover","Title","Content","style","width","OverlayTrigger","trigger","placement","overlay","renderPopover","ChartConfig","numCategories","numValues","bixaxial","legend","barSize","barCategoryGap","axisHeight","legendHeight","margin","top","bottom","colors100","colors200","colors400","colors700","pool","ary","gap","i","axisWidth","barGap","height","left","right","CSSVar","val","getComputedStyle","document","documentElement","getPropertyValue","split","rgb","parseInt","ChartLabel","x","y","rectX","rectY","rectInnerHeight","rectInnerWidth","rx","fill","hex","rectWidth","fontSize","textAnchor","dominantBaseline","outerWidth","DateManager","_today","_lastyear","getTime","setFullYear","_instance","instance","ProductionService","processArea","processProject","members","member","person","personTasks","productionTasks","prod","task","dblStoryPtsTotal","hrsElapsedAverage","pctCurrEstTotal","pctCurrEstAverage","pctCurrEstWeightedTotal","pctCurrEstWeightedAverage","production","processTask","group","ProductionAverages","ProductionAreas","lastyear","today","onDateChange","parseFromInput","currentTarget","getTasksByArea","toISODateString","onChange","Tabs","mountOnEnter","unmountOnExit","Tab","title","renderHourlyAveragesByAreaChart","renderHourlyAveragesByAreaTable","renderEstimateDifferenceByAreaChart","renderEstimateDifferenceByAreaTable","renderData","renderDataHeader","chartMargin","px","dynamicHeight","layout","strokeDasharray","horizontal","unit","dataKey","content","render","Table","striped","stroke","renderTabs","ProductionTotals","filtered","productionProjects","productionTasksByArea","productionTasksByProject","productionCaseTotal","productionHourTotal","getProjects","updateChartData","onCustomerChange","onFilterClick","onClearClick","getTasksByProject","reduce","acc","cur","renderDivide","renderFilter","renderTotalsByAreaChart","renderTotalsByAreaTable","renderTotalsByProjectChart","renderTotalsByProjectTable","xAxisId","orientation","verticalAlign","ProjectList","sPersonOwner","SupportService","groupKey","sGroup","ixGroup","month","fillMonths","c","ixMonth","getMonthKey","count","hours","labels","getGroupLabels","j","supportCountByGroup","sMonth","getMonthLabel","setMonth","months3","SupportVolume","market","Markets","UK","supportCustomers","supportTasksByArea","supportTasksByCustomer","monthlyByArea","monthlyAreaLabels","supportCaseTotal","supportHourTotal","getSupportCustomers","getSupportTasksByGroup","getSupportCountByGroup","renderMonthlyCasesByArea","renderMonthlyHoursByArea","renderTotalsByCustomerChart","renderTotalsByCustomerTable","colors","palette","vertical","align","wrapperStyle","paddingLeft","strokeWidth","DK","TeamPerformance","PerformanceAreas","performanceByArea","team","onAreaChange","clearData","updateTeamMembers","onPersonChange","fetchIntervals","getPerformanceByArea","getTeamMembers","renderHourlyAveragesByArea","renderEstimateDifferenceByArea","NavOptions","path","component","Dashboard","hidden","onTabClick","exact","to","Container","renderLinks","Report","renderRoutes","fluid","src","logo","alt","renderBody","App","ReactDOM","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.c0894a7c.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/logo.c91b6784.svg\";","\r\n\r\nexport class Date2 {\r\n\r\n static formatDate(date: Date) {\r\n return `${date.getDate().toString().padStart(2, \"0\")}-${(date.getMonth() + 1).toString().padStart(2, \"0\")}-${date.getFullYear()}`;\r\n }\r\n\r\n static months() {\r\n return [\r\n \"January\",\r\n \"February\",\r\n \"March\",\r\n \"April\",\r\n \"May\",\r\n \"June\",\r\n \"July\",\r\n \"August\",\r\n \"September\",\r\n \"October\",\r\n \"November\",\r\n \"December\"\r\n ];\r\n }\r\n\r\n static months3() {\r\n return Date2.months().map(item => item.slice(0, 3));\r\n }\r\n\r\n static parseFromInput(value: string): Date | undefined {\r\n const match = value.match(/^\\d{4}-\\d{2}-\\d{2}/);\r\n if (match) return new Date(value);\r\n return undefined;\r\n }\r\n\r\n static toISODateString(date: Date) {\r\n return date.toISOString().replace(/T.+$/, \"\");\r\n }\r\n\r\n static toUSDateString(date: Date) {\r\n return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`;\r\n }\r\n}","import { Date2 } from \"app/utils/Date2\";\r\nimport { IFBArea, IFBCaseResponse, IFBIntervalResponse, IFBPerson, IFBProject, IFBToken } from \"app/services/FBTypes\";\r\n\r\n\r\n/*****************************************************************************/\r\nconst API_URL = \"https://papirfly.fogbugz.com/f/api/0/jsonapi\";\r\nconst API_METHOD = \"POST\";\r\n\r\n\r\n/*****************************************************************************/\r\nexport class FBService {\r\n\r\n static readonly PROJECT_PREFIX_PATTERN = /^.+? [-|–|—|―] /i;\r\n\r\n static readonly DK_PROJECT_PREFIX = \"Papirfly Aps\";\r\n static readonly UK_PROJECT_PREFIX = \"Papirfly UK\";\r\n\r\n static readonly SUPPORT_PROJECT = \"Papirfly Support Inbox\";\r\n\r\n static readonly UK_DOMAIN = \"papirfly.com\";\r\n\r\n\r\n /**\r\n * Will bulk delete all interval IDs listed in the array if authenticated\r\n * user has administrator permission.\r\n * \r\n * *NOTE: Be very careful using this function!*\r\n */\r\n static async bulkDeleteIntervals(token: string, intervals: number[]) {\r\n\r\n const deleteInterval = async (ixInterval: number) => {\r\n await fetch(API_URL, {\r\n method: API_METHOD,\r\n body: JSON.stringify({\r\n \"cmd\": \"deleteInterval\",\r\n \"token\": token,\r\n \"ixInterval\": ixInterval\r\n }),\r\n });\r\n };\r\n\r\n intervals.forEach(item => {\r\n deleteInterval(item);\r\n });\r\n }\r\n\r\n /**\r\n * Be very careful using this function! Currently setup to change customer name.\r\n */\r\n static async bulkEditCases(token: string, cases: number[], customer: string) {\r\n\r\n const edit = async (ixBug: number) => {\r\n await fetch(API_URL, {\r\n method: API_METHOD,\r\n body: JSON.stringify({\r\n \"cmd\": \"edit\",\r\n \"token\": token,\r\n \"ixBug\": ixBug,\r\n \"plugin_customfields_at_fogcreek_com_clientk66\": customer\r\n }),\r\n });\r\n };\r\n\r\n cases.forEach(item => {\r\n edit(item);\r\n });\r\n }\r\n\r\n static async fetchArea(token: string, ixProject: number) {\r\n\r\n const response = await fetch(API_URL, {\r\n method: API_METHOD,\r\n body: JSON.stringify({\r\n \"cmd\": \"listAreas\",\r\n \"token\": token,\r\n \"ixProject\": ixProject\r\n }),\r\n });\r\n\r\n const json = await response.json();\r\n return json.data.areas as IFBArea[];\r\n }\r\n\r\n /**\r\n * Retrieves cases using the `search` command.\r\n * \r\n * **Search Syntax for `q`:** \r\n * [Searching in FogBugz: Syntax and the Search Axis](https://support.fogbugz.com/hc/en-us/articles/360011257174-Searching-in-FogBugz-Syntax-and-the-Search-Axis)\r\n * \r\n * **Notes:**\r\n * Search terms that include spaces must be encapsulted in quotes.\r\n */\r\n static async fetchCases(token: string, query?: string, max?: number) {\r\n\r\n query = query || `status:open project:'${FBService.UK_PROJECT_PREFIX}' area:Development`;\r\n\r\n const response = await fetch(API_URL, {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n \"cmd\": \"search\",\r\n \"q\": query,\r\n \"token\": token,\r\n \"max\": max,\r\n \"cols\": [\r\n \"ixBug\",\r\n \"sTitle\",\r\n \"ixProject\",\r\n \"sProject\",\r\n \"ixArea\",\r\n \"sArea\",\r\n \"ixStatus\",\r\n \"sStatus\",\r\n \"ixPriority\",\r\n \"sPriority\",\r\n \"ixFixFor\",\r\n \"sFixFor\",\r\n \"dtFixFor\",\r\n \"dblStoryPts\",\r\n \"hrsOrigEst\",\r\n \"hrsCurrEst\",\r\n \"hrsElapsed\",\r\n \"ixCategory\",\r\n \"sCategory\",\r\n \"ixPersonAssignedTo\",\r\n \"sPersonAssignedTo\",\r\n \"ixPersonOpenedBy\",\r\n \"ixPersonResolvedBy\",\r\n \"ixPersonClosedBy\",\r\n \"ixPersonLastEditedBy\",\r\n \"dtOpened\",\r\n \"dtResolved\",\r\n \"dtClosed\",\r\n \"dtDue\",\r\n \"client\"\r\n ]\r\n })\r\n });\r\n\r\n const json = await response.json();\r\n const raw = json.data.cases as IFBCaseResponse[];\r\n\r\n const data = raw.map(({\r\n ixBug,\r\n sTitle,\r\n ixProject,\r\n sProject,\r\n ixArea,\r\n sArea,\r\n ixStatus,\r\n sStatus,\r\n ixPriority,\r\n sPriority,\r\n ixFixFor,\r\n sFixFor,\r\n dtFixFor,\r\n dblStoryPts,\r\n hrsOrigEst,\r\n hrsCurrEst,\r\n hrsElapsed,\r\n ixCategory,\r\n sCategory,\r\n ixPersonAssignedTo,\r\n sPersonAssignedTo,\r\n ixPersonOpenedBy,\r\n ixPersonResolvedBy,\r\n ixPersonClosedBy,\r\n ixPersonLastEditedBy,\r\n dtOpened,\r\n dtResolved,\r\n dtClosed,\r\n dtDue,\r\n client,\r\n }) => {\r\n\r\n const aProject = sProject.replace(FBService.PROJECT_PREFIX_PATTERN, \"\");\r\n const aTitle = sTitle.replace(` - ${aProject}`, \"\");\r\n const aClient = client.replace(FBService.PROJECT_PREFIX_PATTERN, \"\");\r\n\r\n return {\r\n ixBug,\r\n sTitle: aTitle,\r\n ixProject,\r\n sProject: aProject,\r\n ixArea,\r\n sArea,\r\n ixStatus,\r\n sStatus,\r\n ixPriority,\r\n sPriority,\r\n ixFixFor,\r\n sFixFor,\r\n dtFixFor: (dtDue) ? new Date(dtFixFor) : undefined,\r\n dblStoryPts,\r\n hrsOrigEst: Math.max(0, hrsOrigEst),\r\n hrsCurrEst: Math.max(0, hrsCurrEst),\r\n hrsElapsed: Math.max(0, hrsElapsed),\r\n ixCategory,\r\n sCategory,\r\n ixPersonAssignedTo,\r\n sPersonAssignedTo,\r\n ixPersonOpenedBy,\r\n ixPersonResolvedBy,\r\n ixPersonClosedBy,\r\n ixPersonLastEditedBy,\r\n dtOpened: new Date(dtOpened),\r\n dtResolved: (dtResolved) ? new Date(dtResolved) : undefined,\r\n dtClosed: (dtClosed) ? new Date(dtClosed) : undefined,\r\n dtDue: (dtDue) ? new Date(dtDue) : undefined,\r\n client: aClient\r\n };\r\n });\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Retrieves all intervals within the specified dates.\r\n * \r\n * *NOTE: When retrieving intervals for a specific case, it seems you must also specify the person.*\r\n */\r\n static async fetchIntervals(token: string, startDate: Date, endDate: Date, ixPerson?: number, ixBug?: number) {\r\n\r\n const response = await fetch(API_URL, {\r\n method: API_METHOD,\r\n body: JSON.stringify({\r\n \"cmd\": \"listIntervals\",\r\n \"token\": token,\r\n \"ixBug\": ixBug,\r\n \"ixPerson\": ixPerson,\r\n \"dtStart\": Date2.toUSDateString(startDate),\r\n \"dtEnd\": Date2.toUSDateString(endDate)\r\n }),\r\n });\r\n\r\n const json = await response.json();\r\n const raw = json.data.intervals as IFBIntervalResponse[];\r\n\r\n const data = raw.map(({\r\n ixInterval,\r\n ixPerson,\r\n ixBug,\r\n sTitle,\r\n dtStart,\r\n dtEnd,\r\n fDeleted\r\n }) => {\r\n\r\n return {\r\n ixInterval,\r\n ixPerson,\r\n ixBug,\r\n sTitle,\r\n dtStart: new Date(dtStart),\r\n dtEnd: new Date(dtEnd),\r\n fDeleted\r\n };\r\n });\r\n\r\n return data;\r\n }\r\n\r\n static async fetchProjects(token: string): Promise {\r\n\r\n const response = await fetch(API_URL, {\r\n method: API_METHOD,\r\n body: JSON.stringify({\r\n \"cmd\": \"listProjects\",\r\n \"token\": token,\r\n }),\r\n });\r\n\r\n const json = await response.json();\r\n return json.data.projects as IFBProject[];\r\n }\r\n\r\n static async fetchPeople(token: string): Promise {\r\n\r\n const response = await fetch(API_URL, {\r\n method: API_METHOD,\r\n body: JSON.stringify({\r\n \"cmd\": \"listPeople\",\r\n \"token\": token,\r\n \"fIncludeVirtual\": 0\r\n }),\r\n });\r\n\r\n const json = await response.json();\r\n const raw = json.data.people as IFBPerson[];\r\n const data = raw.filter(item => item.sEmail.indexOf(FBService.UK_DOMAIN) > -1);\r\n\r\n return data;\r\n }\r\n\r\n static async validateToken(token?: string): Promise {\r\n\r\n let isValid: boolean;\r\n\r\n const response = await FBService.fetchToken(token)\r\n .catch(e => {\r\n console.error(e);\r\n isValid = false;\r\n });\r\n\r\n isValid = response === token;\r\n\r\n return isValid;\r\n }\r\n\r\n private static async fetchToken(token?: string): Promise {\r\n\r\n const response = await fetch(API_URL, {\r\n method: API_METHOD,\r\n body: JSON.stringify({\r\n \"cmd\": \"logon\",\r\n \"token\": token\r\n }),\r\n });\r\n\r\n const json = await response.json();\r\n return json.data.token;\r\n }\r\n}","import React from \"react\";\r\nimport { FBService } from \"app/services/FBService\";\r\nimport { IFBPerson, IFBProject } from \"app/services/FBTypes\";\r\n\r\n\r\n/*****************************************************************************/\r\ninterface IAppState {\r\n loading: boolean;\r\n projects: IFBProject[];\r\n people: IFBPerson[];\r\n token?: string;\r\n tokenValid?: boolean;\r\n}\r\n\r\ninterface IAppContext extends IAppState {\r\n onLoadingChange: (busy: boolean) => void;\r\n onTokenChange: (token?: string) => void;\r\n}\r\n\r\nconst AppContext = React.createContext({} as IAppContext);\r\n\r\nexport class AppStore extends React.Component<{}, IAppState> {\r\n\r\n state: IAppState = {\r\n loading: false,\r\n projects: [],\r\n people: []\r\n };\r\n\r\n async setToken(token?: string) {\r\n\r\n let loading;\r\n let tokenValid;\r\n\r\n if (token) {\r\n\r\n loading = true;\r\n this.setState({ loading });\r\n const isValid = await FBService.validateToken(token);\r\n\r\n if (isValid) {\r\n\r\n this.setState({ token },\r\n async () => {\r\n\r\n const allProjects = await FBService.fetchProjects(token);\r\n const projects = allProjects.filter(item => item.sProject.indexOf(FBService.UK_PROJECT_PREFIX) > -1);\r\n projects.forEach(item => {\r\n item.sProject = item.sProject.replace(FBService.PROJECT_PREFIX_PATTERN, \"\");\r\n });\r\n\r\n const people = await FBService.fetchPeople(token);\r\n\r\n loading = false;\r\n tokenValid = true;\r\n\r\n this.setState({\r\n loading,\r\n projects,\r\n people,\r\n tokenValid\r\n });\r\n }\r\n );\r\n }\r\n else {\r\n\r\n loading = false;\r\n tokenValid = false;\r\n\r\n this.setState({ loading, tokenValid });\r\n }\r\n }\r\n else {\r\n this.setState({\r\n token: undefined,\r\n tokenValid: undefined\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n this.setState({ loading }),\r\n onTokenChange: (token) => this.setToken(token)\r\n }}>\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default AppContext;","import AppContext from \"app/contexts/AppContext\";\r\nimport React from \"react\";\r\nimport { Spinner } from \"react-bootstrap\";\r\nimport \"app/components/misc/AppSpinner.css\";\r\n\r\n\r\nclass AppSpinner extends React.Component {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n render() {\r\n\r\n if (this.context.loading)\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
Loading...
\r\n
\r\n
\r\n );\r\n\r\n return null;\r\n }\r\n}\r\n\r\nexport default AppSpinner;\r\n","import AppContext from \"app/contexts/AppContext\";\r\nimport React, { FormEvent } from \"react\";\r\nimport { Button, Col, Form } from \"react-bootstrap\";\r\n\r\n\r\ninterface IAccessTokenState {\r\n dirty: boolean;\r\n}\r\n\r\nclass AccessToken extends React.Component<{}, IAccessTokenState> {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n inputEl: React.RefObject;\r\n\r\n state: IAccessTokenState = {\r\n dirty: false\r\n };\r\n\r\n constructor(props = {}) {\r\n super(props);\r\n this.inputEl = React.createRef();\r\n }\r\n\r\n onSubmit = (e: FormEvent) => {\r\n e.preventDefault();\r\n\r\n if (!this.context.token) {\r\n this.context.onTokenChange(this.inputEl.current?.value);\r\n this.setState({ dirty: true });\r\n }\r\n else {\r\n this.context.onTokenChange(undefined);\r\n this.setState({ dirty: false });\r\n }\r\n };\r\n\r\n renderInner() {\r\n\r\n if (!this.context.token) {\r\n\r\n const hasError = this.state.dirty && this.context.tokenValid === false;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Get your token from User Options\r\n \r\n \r\n \r\n );\r\n }\r\n else {\r\n\r\n const tokenLength = this.context.token.length;\r\n const maskedToken = this.context.token.slice(tokenLength - 4, tokenLength).padStart(tokenLength, \"*\");\r\n\r\n return (\r\n \r\n \r\n {maskedToken}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n\r\n render() {\r\n return (\r\n
\r\n FogBugz API token\r\n {this.renderInner()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default AccessToken;\r\n","\r\n\r\n\r\nexport class Math2 {\r\n\r\n static clamp(n: number, min: number, max: number): number {\r\n return Math.min(Math.max(n, min), max);\r\n }\r\n\r\n /**\r\n * Rounds upward to the nearest step.\r\n * @param num The number to round.\r\n * @param step The step increment to round to.\r\n */\r\n static ceil(num: number, step = 1): number {\r\n return parseFloat((Math.ceil(num / step) * step).toFixed(Math2.countDecimals(step)));\r\n }\r\n\r\n /**\r\n * Returns the number of decimals in a number.\r\n * @param num\r\n */\r\n static countDecimals(num: number) {\r\n\r\n const str: string = num.toString();\r\n const decimalIndex: number = str.indexOf(\".\");\r\n\r\n if (decimalIndex > -1)\r\n return str.length - 1 - decimalIndex;\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * Rounds downward to the nearest step.\r\n * @param num The number to round.\r\n * @param step The step increment to round to.\r\n */\r\n static floor(num: number, step = 1): number {\r\n return parseFloat((Math.floor(num / step) * step).toFixed(Math2.countDecimals(step)));\r\n }\r\n\r\n /**\r\n * Rounds to the nearest step.\r\n * @param num The number to round.\r\n * @param step The step increment to round to.\r\n */\r\n static round(num: number, step = 1): number {\r\n return parseFloat((Math.round(num / step) * step).toFixed(Math2.countDecimals(step)));\r\n }\r\n}","export class Object2 {\r\n\r\n static getValue(obj: T, key: string, defaultValue?: any) {\r\n\r\n const value = (obj as { [key: string]: any })[key];\r\n\r\n if (value)\r\n return value;\r\n\r\n return defaultValue;\r\n }\r\n}","import React from \"react\";\r\nimport { Badge, Col, ProgressBar, Row } from \"react-bootstrap\";\r\nimport { Date2 } from \"app/utils/Date2\";\r\nimport { IFBCase } from \"app/services/FBTypes\";\r\nimport { Math2 } from \"app/utils/Math2\";\r\nimport { Object2 } from \"app/utils/Object2\";\r\nimport \"app/components/reports/TaskTable.css\";\r\n\r\n\r\ninterface ITaskProps {\r\n tasks: IFBCase[];\r\n badgeKey: string;\r\n dateKey: string;\r\n dateLabel: string;\r\n dateFlag?: boolean;\r\n}\r\n\r\nclass TaskTable extends React.Component {\r\n\r\n renderTasks() {\r\n\r\n return this.props.tasks.map(item => {\r\n\r\n const badgeText = Object2.getValue(item, this.props.badgeKey, \"Unknown\");\r\n\r\n const dateValue = Object2.getValue(item, this.props.dateKey, undefined);\r\n const dateFlag = (this.props.dateFlag && dateValue && dateValue < new Date()) ? \"text-danger\" : \"\";\r\n const dateFormatted = (dateValue) ? Date2.formatDate(dateValue) : \"Unknown\";\r\n\r\n return (\r\n window.open(`https://papirfly.fogbugz.com/f/cases/${item.ixBug}`, undefined, \"noopener,noreferrer\")}>\r\n {badgeText} {item.sTitle}\r\n {this.renderHours(item.hrsCurrEst, item.hrsElapsed)}\r\n {this.props.dateLabel}: {dateFormatted}\r\n {this.renderStatus(item.sStatus)}\r\n \r\n );\r\n });\r\n }\r\n\r\n renderHours(hrsCurrEst: number, hrsElapsed: number) {\r\n\r\n hrsCurrEst = Math2.round(hrsCurrEst, 0.25);\r\n hrsElapsed = Math2.round(hrsElapsed, 0.25);\r\n\r\n const percent = Math.min(hrsElapsed / hrsCurrEst * 100, 100);\r\n const variant = (hrsElapsed > hrsCurrEst) ? \"danger\" : \"success\";\r\n const color = (hrsElapsed > hrsCurrEst) ? \"text-danger\" : \"\";\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {hrsElapsed} / {hrsCurrEst}\r\n \r\n \r\n );\r\n }\r\n\r\n renderStatus(sStatus: string) {\r\n\r\n const status = sStatus.toLowerCase();\r\n\r\n if (status.indexOf(\"resolved\") > -1)\r\n return Resolved;\r\n else if (status.indexOf(\"closed\") > -1)\r\n return Closed;\r\n\r\n return Open;\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n {this.renderTasks()}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default TaskTable;\r\n\r\n\r\n","import AppContext from \"app/contexts/AppContext\";\r\nimport React from \"react\";\r\nimport TaskTable from \"app/components/reports/TaskTable\";\r\nimport { Accordion, Badge, Button, Card, Col, Form, Row } from \"react-bootstrap\";\r\nimport { FBService } from \"app/services/FBService\";\r\nimport { IControlArea } from \"app/components/reports/ReportTypes\";\r\nimport { IFBCase, IFBProject } from \"app/services/FBTypes\";\r\n\r\n\r\ninterface IOpenCaseState {\r\n area: IControlArea;\r\n cases: IFBCase[];\r\n}\r\n\r\nclass OpenCases extends React.Component<{}, IOpenCaseState> {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n state: IOpenCaseState = {\r\n area: CaseAreaData.ALL,\r\n cases: []\r\n };\r\n\r\n onUpdateClick = async (e: React.MouseEvent) => {\r\n\r\n if (this.context.token) {\r\n this.context.onLoadingChange(true);\r\n\r\n const cases = await FBService.fetchCases(this.context.token, this.state.area.query);\r\n this.setState({ cases });\r\n this.context.onLoadingChange(false);\r\n }\r\n };\r\n\r\n renderControls() {\r\n\r\n return (\r\n
\r\n \r\n \r\n Area\r\n {Object.keys(CaseAreaData).map((key, index) => {\r\n\r\n const data = CaseAreaData[key];\r\n\r\n return this.setState({ area: data })}\r\n inline\r\n />;\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n renderProjects() {\r\n\r\n if (this.state.cases.length > 0) {\r\n\r\n const projects = getCasesByProject(this.state.cases, this.context.projects);\r\n let eventKey: string;\r\n\r\n const innerHtml = projects.map((item, index) => {\r\n\r\n eventKey = index.toString();\r\n\r\n return (\r\n \r\n \r\n {this.renderProjectHeader(item)}\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 {innerHtml}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderProjectHeader(project: ICasesByProject) {\r\n\r\n // Hours Icons: history, history_toggle, schedule, watch_later, update\r\n const hoursFlag = (project.pastEstTotal > 0) ? (schedule) : null;\r\n\r\n // Due Date Icons: insert_invitation, date_range, calendar_today\r\n const dueFlag = (project.pastDueTotal > 0) ? (insert_invitation) : null;\r\n\r\n return (\r\n \r\n \r\n {project.sProject}{project.cases.length}\r\n \r\n \r\n {hoursFlag} {dueFlag}\r\n \r\n \r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n

Open Cases Report

\r\n \r\n
\r\n {this.renderControls()}\r\n {this.renderProjects()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default OpenCases;\r\n\r\n\r\n\r\n/*****************************************************************************/\r\nconst CaseAreaData: { [key: string]: IControlArea } = {\r\n ALL: {\r\n id: \"all\",\r\n label: \"All\",\r\n query: `status:open project:'${FBService.UK_PROJECT_PREFIX}'`\r\n },\r\n DEV: {\r\n id: \"dev\",\r\n label: \"Development\",\r\n query: `status:open project:'${FBService.UK_PROJECT_PREFIX}' area:Development`\r\n },\r\n PM: {\r\n id: \"pm\",\r\n label: \"Project Management\",\r\n query: `status:open project:'${FBService.UK_PROJECT_PREFIX}' area:Management OR area:Testing`\r\n }\r\n};\r\n\r\n\r\n\r\n/*****************************************************************************/\r\ninterface ICasesByProject extends IFBProject {\r\n cases: IFBCase[];\r\n resolvedTotal: number;\r\n hrsCurrEstTotal: number;\r\n hrsElapsedTotal: number;\r\n pastEstTotal: number;\r\n pastDueTotal: number;\r\n}\r\n\r\nconst getCasesByProject = (cases: IFBCase[], projects: IFBProject[]) => {\r\n\r\n const arr: ICasesByProject[] = [];\r\n const dt = new Date();\r\n\r\n cases.forEach(item => {\r\n\r\n let proj = arr.find(p => p.ixProject === item.ixProject);\r\n\r\n if (!proj) {\r\n const source = projects.find(p => p.ixProject === item.ixProject);\r\n\r\n if (source) {\r\n proj = Object.assign({\r\n cases: [],\r\n resolvedTotal: 0,\r\n hrsCurrEstTotal: 0,\r\n hrsElapsedTotal: 0,\r\n pastEstTotal: 0,\r\n pastDueTotal: 0\r\n }, source);\r\n arr.push(proj);\r\n }\r\n }\r\n\r\n if (!proj)\r\n throw new Error(`Project \"${item.sProject}\" does not exist.`);\r\n\r\n proj.cases.push(item);\r\n proj.resolvedTotal += Number(!!item.dtResolved);\r\n proj.hrsCurrEstTotal += item.hrsCurrEst;\r\n proj.hrsElapsedTotal += item.hrsElapsed;\r\n proj.pastEstTotal += Number(!!(item.hrsElapsed > item.hrsCurrEst));\r\n proj.pastDueTotal += Number(!!(item.dtDue && item.dtDue < dt));\r\n });\r\n\r\n return arr.sort((a, b) => a.sProject.localeCompare(b.sProject));\r\n};\r\n","import AppContext from \"app/contexts/AppContext\";\r\nimport React from \"react\";\r\nimport { Col, Row } from \"react-bootstrap\";\r\n\r\n\r\n\r\nclass PeopleList extends React.Component {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n renderPeople() {\r\n return this.context.people.map(item => {\r\n return (\r\n window.open(`https://papirfly.fogbugz.com/f/search/?sSearchFor=editedby:${encodeURIComponent(item.sFullName)}`)}>\r\n {item.ixPerson}\r\n {item.sFullName}\r\n {item.sEmail}\r\n \r\n );\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n

People List

\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.renderPeople()}\r\n \r\n
IDNameEmail
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default PeopleList;\r\n","import React from \"react\";\r\nimport { OverlayTrigger, Popover } from \"react-bootstrap\";\r\nimport \"app/components/reports/InfoBox.css\";\r\n\r\n\r\n/*****************************************************************************/\r\ninterface IInfoBoxProps {\r\n width: number;\r\n}\r\n\r\nclass InfoBox extends React.Component {\r\n\r\n renderPopover() {\r\n return (\r\n \r\n About This Chart\r\n {this.props.children}\r\n \r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n info\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default InfoBox; ","\r\n\r\nexport class ChartConfig {\r\n\r\n static readonly axisWidth = 144;\r\n static readonly axisHeight = 32;\r\n static readonly barCategoryGap = 6;\r\n static readonly barGap = 2;\r\n static readonly barSize = 48;\r\n static readonly height = 432;\r\n static readonly legendHeight = 24;\r\n static readonly margin = {\r\n top: 5, bottom: 5, left: 5, right: 5\r\n };\r\n\r\n static dynamicHeight(numCategories: number, numValues = 1, bixaxial = false, legend = false) {\r\n\r\n // This calculation is off by a few pixels, unsure what is not being accounted for...\r\n return ChartConfig.barSize * numCategories * numValues\r\n + ChartConfig.barCategoryGap * numCategories\r\n + ChartConfig.axisHeight\r\n + Number(bixaxial) * ChartConfig.axisHeight\r\n + Number(legend) * ChartConfig.legendHeight\r\n + ChartConfig.margin.top + ChartConfig.margin.bottom;\r\n }\r\n\r\n static material(value: number, random = false) {\r\n // https://material.io/resources/color/#!/?view.left=0&view.right=0&primary.color=FFA726\r\n\r\n const colors100 = [\"#ff8a80\", \"#ff80ab\", \"#ea80fc\", \"#b388ff\", \"#8c9eff\", \"#82b1ff\", \"#80d8ff\", \"#84ffff\", \"#a7ffeb\", \"#b9f6ca\", \"#ccff90\", \"#f4ff81\", \"#ffe57f\", \"#ffd180\", \"#ff9e80\"];\r\n const colors200 = [\"#ff5252\", \"#ff4081\", \"#e040fb\", \"#7c4dff\", \"#536dfe\", \"#448aff\", \"#40c4ff\", \"#18ffff\", \"#64ffda\", \"#69f0ae\", \"#b2ff59\", \"#eeff41\", \"#ffff00\", \"#ffd740\", \"#ffab40\", \"#ff6e40\"];\r\n const colors400 = [\"#ff1744\", \"#f50057\", \"#d500f9\", \"#651fff\", \"#3d5afe\", \"#2979ff\", \"#00b0ff\", \"#00e5ff\", \"#1de9b6\", \"#00e676\", \"#76ff03\", \"#c6ff00\", \"#ffea00\", \"#ffc400\", \"#ff9100\", \"#ff3d00\"];\r\n const colors700 = [\"#d50000\", \"#c51162\", \"#aa00ff\", \"#6200ea\", \"#304ffe\", \"#2962ff\", \"#0091ea\", \"#00b8d4\", \"#00bfa5\", \"#00c853\", \"#64dd17\", \"#aeea00\", \"#ffd600\", \"#ffab00\", \"#ff6d00\", \"#dd2c00\"];\r\n\r\n const pool = [...colors100, ...colors200, ...colors400, ...colors700];\r\n\r\n const ary = [];\r\n const gap = Math.floor(pool.length / value) || 1;\r\n let i = 0;\r\n\r\n while (ary.length < value) {\r\n ary.push(pool[i % pool.length]);\r\n i += gap;\r\n }\r\n\r\n return ary;\r\n }\r\n\r\n static palette(value: number) {\r\n // Color generated by [Colorgorical](http://vrl.cs.brown.edu/color)\r\n\r\n if (value <= 4)\r\n return [\"#01c472\", \"#e71761\", \"#1ceaf9\", \"#7b2c31\"];\r\n if (value <= 8)\r\n return [\"#52ef99\", \"#f23b65\", \"#19a71f\", \"#e84fe1\", \"#65f112\", \"#7922b4\", \"#87aa23\", \"#785bae\", \"#fbd127\", \"#881d2a\", \"#4be8f9\", \"#c5667d\"];\r\n if (value <= 12)\r\n return [\"#52ef99\", \"#f23b65\", \"#19a71f\", \"#e84fe1\", \"#65f112\", \"#7922b4\", \"#87aa23\", \"#785bae\", \"#fbd127\", \"#881d2a\", \"#4be8f9\", \"#c5667d\"];\r\n if (value <= 16)\r\n return [\"#b4ddd4\", \"#881c23\", \"#5cf070\", \"#8d3f90\", \"#459521\", \"#d518bd\", \"#a7d64e\", \"#7129ed\", \"#fea53b\", \"#10558a\", \"#f1d438\", \"#315bf3\", \"#926026\", \"#dd8eeb\", \"#255026\", \"#fab5b5\"];\r\n\r\n // Max 20\r\n return [\"#72e5ef\", \"#d10f55\", \"#39f27a\", \"#f67fec\", \"#ade64f\", \"#6633b4\", \"#728e24\", \"#fa1bfc\", \"#3aa609\", \"#fcc2fb\", \"#02531d\", \"#c5d5f0\", \"#683c00\", \"#748ed7\", \"#edd45e\", \"#76406b\", \"#fba55c\", \"#304866\", \"#ec4b18\", \"#2da0a1\"];\r\n }\r\n}","\r\n\r\nexport class CSSVar {\r\n\r\n static hex(name: string): string {\r\n const val = getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\r\n\r\n if (val.indexOf(\"#\") === 0)\r\n return val;\r\n\r\n const arr = val.replace(/[^\\d,]/g, \"\").split(\",\");\r\n if (arr.length === 3) {\r\n const rgb = arr.map(item => parseInt(item));\r\n return \"#\" + ((1 << 24) + (rgb[0] << 16) + (rgb[1] << 8) + rgb[2]).toString(16).slice(1);\r\n }\r\n\r\n return \"#000000\";\r\n }\r\n\r\n static px(name: string): number {\r\n const val = getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\r\n return parseInt(val);\r\n }\r\n\r\n static raw(name: string): string {\r\n return getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { CSSVar } from \"app/utils/CSSVar\";\r\n\r\n\r\n/*****************************************************************************/\r\nconst margin = 8;\r\nconst padH = 8;\r\nconst padV = 6;\r\nconst rectInnerWidth = 56; // enough for 9 characters\r\nconst rectInnerHeight = 14;\r\nconst rectWidth = rectInnerWidth + padH * 2;\r\nconst rectHeight = rectInnerHeight + padV * 2;\r\n\r\n\r\n/*****************************************************************************/\r\nexport class ChartLabel {\r\n\r\n static readonly outerWidth = rectWidth + margin * 2;\r\n\r\n static render(props: any) {\r\n\r\n const { x, y, width, height, value } = props;\r\n\r\n const radius = 4;\r\n const rectX = x + width + margin;\r\n const rectY = Math.ceil((height - rectHeight) / 2) + y;\r\n\r\n return (\r\n \r\n \r\n \r\n {value} cases\r\n \r\n \r\n );\r\n }\r\n}","\r\n\r\nexport class DateManager {\r\n\r\n private static _instance: DateManager;\r\n\r\n static get instance(): DateManager {\r\n\r\n if (!DateManager._instance)\r\n DateManager._instance = new DateManager();\r\n\r\n return DateManager._instance;\r\n }\r\n\r\n static get today(): Date {\r\n return DateManager.instance._today;\r\n }\r\n\r\n static get lastyear(): Date {\r\n return DateManager.instance._lastyear;\r\n }\r\n\r\n private _today: Date;\r\n private _lastyear: Date;\r\n\r\n\r\n private constructor() {\r\n\r\n this._today = new Date();\r\n\r\n this._lastyear = new Date(this._today.getTime());\r\n this._lastyear.setFullYear(this._lastyear.getFullYear() - 1);\r\n }\r\n}","import { IFBCase, IFBInterval, IFBPerson } from \"app/services/FBTypes\";\r\nimport { IPerformanceByArea, IProductionProject, IProductionTasks, IProductionTasksByArea, IProductionTasksByProject } from \"app/services/ProductionTypes\";\r\nimport { Math2 } from \"app/utils/Math2\";\r\n\r\n\r\n/*****************************************************************************/\r\nexport class ProductionService {\r\n\r\n\r\n static getTasksByArea(tasks: IFBCase[], intervals: IFBInterval[] = []) {\r\n\r\n const arr: IProductionTasksByArea[] = [];\r\n let match;\r\n\r\n tasks.forEach(item => {\r\n\r\n match = intervals.find(i => i.ixBug === item.ixBug);\r\n\r\n if (match || intervals.length === 0)\r\n ProductionService.processArea(arr, item);\r\n });\r\n\r\n arr.forEach(item => {\r\n item.tasks.sort((a, b) => a.sProject.localeCompare(b.sProject));\r\n });\r\n return arr.sort((a, b) => a.sArea.localeCompare(b.sArea));\r\n }\r\n\r\n static getTasksByProject(tasks: IFBCase[]) {\r\n\r\n const arr: IProductionTasksByProject[] = [];\r\n\r\n tasks.forEach(item => {\r\n ProductionService.processProject(arr, item);\r\n });\r\n\r\n arr.forEach(item => {\r\n item.tasks.sort((a, b) => a.sProject.localeCompare(b.sProject));\r\n });\r\n return arr.sort((a, b) => a.sProject.localeCompare(b.sProject));\r\n }\r\n\r\n static getTeamMembers(members: string[], people: IFBPerson[]) {\r\n\r\n const arr: IFBPerson[] = [];\r\n let match;\r\n\r\n members.forEach(member => {\r\n\r\n match = people.find(person => person.sEmail === member);\r\n\r\n if (match)\r\n arr.push(match);\r\n });\r\n\r\n return arr;\r\n }\r\n\r\n static getPerformanceByArea(personTasks: IProductionTasksByArea[], productionTasks: IProductionTasksByArea[]) {\r\n\r\n const arr: IPerformanceByArea[] = [];\r\n let prod;\r\n\r\n personTasks.forEach(item => {\r\n\r\n prod = productionTasks.find(task => task.sArea === item.sArea);\r\n\r\n arr.push({\r\n ixArea: item.ixArea,\r\n sArea: item.sArea,\r\n person: {\r\n dblStoryPtsTotal: item.dblStoryPtsTotal,\r\n hrsElapsedTotal: item.hrsElapsedTotal,\r\n hrsElapsedAverage: item.hrsElapsedAverage,\r\n pctCurrEstTotal: item.pctCurrEstTotal,\r\n pctCurrEstAverage: item.pctCurrEstAverage,\r\n pctCurrEstWeightedTotal: item.pctCurrEstWeightedTotal,\r\n pctCurrEstWeightedAverage: item.pctCurrEstWeightedAverage\r\n },\r\n production: {\r\n dblStoryPtsTotal: prod?.dblStoryPtsTotal || 0,\r\n hrsElapsedTotal: prod?.hrsElapsedTotal || 0,\r\n hrsElapsedAverage: prod?.hrsElapsedAverage || 0,\r\n pctCurrEstTotal: prod?.pctCurrEstTotal || 0,\r\n pctCurrEstAverage: prod?.pctCurrEstAverage || 0,\r\n pctCurrEstWeightedTotal: prod?.pctCurrEstWeightedTotal || 0,\r\n pctCurrEstWeightedAverage: prod?.pctCurrEstWeightedAverage || 0\r\n }\r\n });\r\n });\r\n\r\n return arr;\r\n }\r\n\r\n static getProjects(tasks: IFBCase[]) {\r\n\r\n const arr: IProductionProject[] = [];\r\n\r\n tasks.forEach(item => {\r\n if (!arr.find(proj => proj.ixProject === item.ixProject))\r\n arr.push({ ixProject: item.ixProject, sProject: item.sProject });\r\n });\r\n\r\n return arr.sort((a, b) => a.sProject.localeCompare(b.sProject));\r\n }\r\n\r\n\r\n /*************************************************************************/\r\n private static processArea(areas: IProductionTasksByArea[], task: IFBCase) {\r\n\r\n let area: IProductionTasksByArea | undefined;\r\n\r\n area = areas.find(a => a.sArea.toLowerCase() === task.sArea.toLowerCase());\r\n\r\n if (!area) {\r\n\r\n area = {\r\n tasks: [],\r\n ixArea: task.ixArea,\r\n sArea: task.sArea,\r\n dblStoryPtsTotal: 0,\r\n hrsElapsedTotal: 0,\r\n hrsElapsedAverage: 0,\r\n pctCurrEstTotal: 0,\r\n pctCurrEstAverage: 0,\r\n pctCurrEstWeightedTotal: 0,\r\n pctCurrEstWeightedAverage: 0\r\n };\r\n\r\n areas.push(area);\r\n }\r\n\r\n ProductionService.processTask(area, task);\r\n }\r\n\r\n private static processProject(areas: IProductionTasksByProject[], task: IFBCase) {\r\n\r\n let area: IProductionTasksByProject | undefined;\r\n\r\n area = areas.find(a => a.sProject.toLowerCase() === task.sProject.toLowerCase());\r\n\r\n if (!area) {\r\n\r\n area = {\r\n tasks: [],\r\n ixProject: task.ixProject,\r\n sProject: task.sProject,\r\n dblStoryPtsTotal: 0,\r\n hrsElapsedTotal: 0,\r\n hrsElapsedAverage: 0,\r\n pctCurrEstTotal: 0,\r\n pctCurrEstAverage: 0,\r\n pctCurrEstWeightedTotal: 0,\r\n pctCurrEstWeightedAverage: 0\r\n };\r\n\r\n areas.push(area);\r\n }\r\n\r\n ProductionService.processTask(area, task);\r\n }\r\n\r\n private static processTask(group: IProductionTasks, task: IFBCase) {\r\n\r\n group.tasks.push(task);\r\n\r\n group.dblStoryPtsTotal += task.dblStoryPts || 1;\r\n\r\n group.hrsElapsedTotal = Math2.ceil(group.hrsElapsedTotal + task.hrsElapsed, 0.01);\r\n group.hrsElapsedAverage = Math2.ceil(group.hrsElapsedTotal / group.dblStoryPtsTotal, 0.25);\r\n\r\n group.pctCurrEstTotal += (task.hrsCurrEst - task.hrsElapsed) / task.hrsElapsed * 100;\r\n group.pctCurrEstAverage = Math2.ceil(group.pctCurrEstTotal / group.tasks.length, 0.01);\r\n\r\n group.pctCurrEstWeightedTotal += (task.hrsCurrEst - task.hrsElapsed) * 100;\r\n group.pctCurrEstWeightedAverage = Math2.ceil(group.pctCurrEstWeightedTotal / group.hrsElapsedTotal, 0.01);\r\n }\r\n}","import AppContext from \"app/contexts/AppContext\";\r\nimport InfoBox from \"app/components/reports/InfoBox\";\r\nimport React from \"react\";\r\nimport TaskTable from \"app/components/reports/TaskTable\";\r\nimport { Accordion, Badge, Button, Card, Col, Form, Row, Tab, Table, Tabs } from \"react-bootstrap\";\r\nimport { Bar, BarChart, CartesianGrid, Cell, LabelList, ReferenceLine, Tooltip, XAxis, YAxis } from \"recharts\";\r\nimport { ChartConfig } from \"app/components/charts/ChartConfig\";\r\nimport { ChartLabel } from \"app/components/charts/ChartLabel\";\r\nimport { CSSVar } from \"app/utils/CSSVar\";\r\nimport { Date2 } from \"app/utils/Date2\";\r\nimport { DateManager } from \"app/managers/DateManager\";\r\nimport { FBService } from \"app/services/FBService\";\r\nimport { IControlArea } from \"app/components/reports/ReportTypes\";\r\nimport { IProductionTasksByArea } from \"app/services/ProductionTypes\";\r\nimport { ProductionService } from \"app/services/ProductionService\";\r\n\r\n\r\n/*****************************************************************************/\r\ninterface IProductionAveragesState {\r\n area: IControlArea;\r\n startDate: Date;\r\n endDate: Date;\r\n productionTasks: IProductionTasksByArea[];\r\n}\r\n\r\nclass ProductionAverages extends React.Component<{}, IProductionAveragesState> {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n state: IProductionAveragesState = {\r\n area: ProductionAreas.ALL,\r\n startDate: new Date(DateManager.lastyear.getTime()),\r\n endDate: new Date(DateManager.today.getTime()),\r\n productionTasks: []\r\n };\r\n\r\n onDateChange = (e: React.ChangeEvent) => {\r\n\r\n const date = Date2.parseFromInput(e.currentTarget.value);\r\n\r\n if (date) {\r\n if (e.currentTarget.name === \"startDate\")\r\n this.setState({ startDate: date });\r\n else if (e.currentTarget.name === \"endDate\")\r\n this.setState({ endDate: date });\r\n }\r\n };\r\n\r\n onUpdateClick = async () => {\r\n\r\n if (this.context.token) {\r\n this.context.onLoadingChange(true);\r\n\r\n const query = `${this.state.area.query} opened:${Date2.toUSDateString(this.state.startDate)}-${Date2.toUSDateString(this.state.endDate)}`;\r\n const cases = await FBService.fetchCases(this.context.token, query);\r\n const productionTasks = ProductionService.getTasksByArea(cases);\r\n\r\n this.setState({ productionTasks });\r\n\r\n this.context.onLoadingChange(false);\r\n }\r\n };\r\n\r\n renderControls() {\r\n\r\n return (\r\n
\r\n \r\n \r\n Area\r\n {Object.keys(ProductionAreas).map((key) => {\r\n\r\n const data = ProductionAreas[key];\r\n\r\n return this.setState({ area: data })}\r\n inline\r\n />;\r\n })}\r\n \r\n \r\n Start Date\r\n \r\n \r\n \r\n End Date \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n renderTabs() {\r\n\r\n if (this.state.productionTasks.length > 0) {\r\n return (\r\n \r\n \r\n {this.renderHourlyAveragesByAreaChart()}\r\n {this.renderHourlyAveragesByAreaTable()}\r\n \r\n \r\n {this.renderEstimateDifferenceByAreaChart()}\r\n {this.renderEstimateDifferenceByAreaTable()}\r\n \r\n \r\n {this.renderData()}\r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderData() {\r\n\r\n if (this.state.productionTasks.length > 0) {\r\n\r\n let eventKey: string;\r\n\r\n const innerHtml = this.state.productionTasks.map((item, index) => {\r\n\r\n eventKey = index.toString();\r\n\r\n return (\r\n \r\n \r\n {this.renderDataHeader(item)}\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 {innerHtml}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderDataHeader(area: IProductionTasksByArea) {\r\n return (\r\n \r\n \r\n {area.sArea}{area.tasks.length}\r\n \r\n \r\n );\r\n }\r\n\r\n renderHourlyAveragesByAreaChart() {\r\n\r\n if (this.state.productionTasks.length > 0) {\r\n\r\n const chartMargin = {\r\n top: ChartConfig.margin.top,\r\n bottom: ChartConfig.margin.bottom,\r\n left: ChartConfig.margin.left,\r\n right: ChartLabel.outerWidth\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Hourly averages use the following calculation:\r\n
Σ(Hours Actual) / Σ(Story Points)\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 null;\r\n }\r\n\r\n renderHourlyAveragesByAreaTable() {\r\n\r\n if (this.state.productionTasks.length > 0) {\r\n\r\n const innerHtml = this.state.productionTasks.map((item, index) => {\r\n\r\n return (\r\n \r\n {item.sArea}\r\n {item.hrsElapsedAverage}\r\n {item.tasks.length}\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 \r\n \r\n \r\n \r\n {innerHtml}\r\n \r\n
AreaAverage HoursCases
\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderEstimateDifferenceByAreaChart() {\r\n\r\n if (this.state.productionTasks.length > 0) {\r\n\r\n return (\r\n \r\n \r\n \r\n The estimate difference is weighted using the following calculation:\r\n
Σ(Hours Actual - Hours Estimated) / Σ(Hours Actual)\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.state.productionTasks.map(item => = 0) ? \"success\" : \"danger\")} />)}\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderEstimateDifferenceByAreaTable() {\r\n\r\n if (this.state.productionTasks.length > 0) {\r\n\r\n const innerHtml = this.state.productionTasks.map((item, index) => {\r\n\r\n return (\r\n \r\n {item.sArea}\r\n {item.pctCurrEstWeightedAverage}%\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 \r\n \r\n \r\n {innerHtml}\r\n \r\n
AreaAverage Estimate
\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n

Production Averages

\r\n \r\n
\r\n {this.renderControls()}\r\n {this.renderTabs()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default ProductionAverages;\r\n\r\n\r\n/*****************************************************************************/\r\nconst ProductionAreas: { [key: string]: IControlArea } = {\r\n ALL: {\r\n id: \"all\",\r\n label: \"All\",\r\n query: `status:resolved OR status:closed elapsedtime:0.25..1000 project:'${FBService.UK_PROJECT_PREFIX}'`\r\n },\r\n DEV: {\r\n id: \"dev\",\r\n label: \"Development\",\r\n query: `status:resolved OR status:closed elapsedtime:0.25..1000 project:'${FBService.UK_PROJECT_PREFIX}' area:Development OR area:'Tech Lead'`\r\n },\r\n PM: {\r\n id: \"pm\",\r\n label: \"Project Management\",\r\n query: `status:resolved OR status:closed elapsedtime:0.25..1000 project:'${FBService.UK_PROJECT_PREFIX}' area:Management OR area:Testing`\r\n }\r\n};","import AppContext from \"app/contexts/AppContext\";\r\nimport React from \"react\";\r\nimport TaskTable from \"app/components/reports/TaskTable\";\r\nimport { Accordion, Badge, Button, Card, Col, Form, Row, Tab, Table, Tabs } from \"react-bootstrap\";\r\nimport { Bar, BarChart, CartesianGrid, Legend, Tooltip, XAxis, YAxis } from \"recharts\";\r\nimport { ChartConfig } from \"app/components/charts/ChartConfig\";\r\nimport { CSSVar } from \"app/utils/CSSVar\";\r\nimport { Date2 } from \"app/utils/Date2\";\r\nimport { DateManager } from \"app/managers/DateManager\";\r\nimport { FBService } from \"app/services/FBService\";\r\nimport { IControlArea } from \"app/components/reports/ReportTypes\";\r\nimport { IFBCase } from \"app/services/FBTypes\";\r\nimport { IProductionProject, IProductionTasksByArea, IProductionTasksByProject } from \"app/services/ProductionTypes\";\r\nimport { Math2 } from \"app/utils/Math2\";\r\nimport { ProductionService } from \"app/services/ProductionService\";\r\n\r\n\r\n/*****************************************************************************/\r\ninterface IProductionTotalsState {\r\n area: IControlArea;\r\n startDate: Date;\r\n endDate: Date;\r\n ixProject?: number;\r\n filtered: boolean;\r\n cases: IFBCase[];\r\n productionProjects: IProductionProject[];\r\n productionTasksByArea: IProductionTasksByArea[];\r\n productionTasksByProject: IProductionTasksByProject[];\r\n productionCaseTotal: number;\r\n productionHourTotal: number;\r\n}\r\n\r\nclass ProductionTotals extends React.Component<{}, IProductionTotalsState> {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n state: IProductionTotalsState = {\r\n area: ProductionAreas.ALL,\r\n startDate: new Date(DateManager.lastyear.getTime()),\r\n endDate: new Date(DateManager.today.getTime()),\r\n filtered: false,\r\n cases: [],\r\n productionProjects: [],\r\n productionTasksByArea: [],\r\n productionTasksByProject: [],\r\n productionCaseTotal: 0,\r\n productionHourTotal: 0\r\n };\r\n\r\n onDateChange = (e: React.ChangeEvent) => {\r\n\r\n const date = Date2.parseFromInput(e.currentTarget.value);\r\n\r\n if (date) {\r\n if (e.currentTarget.name === \"startDate\")\r\n this.setState({ startDate: date });\r\n else if (e.currentTarget.name === \"endDate\")\r\n this.setState({ endDate: date });\r\n }\r\n };\r\n\r\n onUpdateClick = async () => {\r\n\r\n if (this.context.token) {\r\n this.context.onLoadingChange(true);\r\n\r\n const query = `${this.state.area.query} opened:${Date2.toUSDateString(this.state.startDate)}-${Date2.toUSDateString(this.state.endDate)}`;\r\n const cases = await FBService.fetchCases(this.context.token, query);\r\n const productionProjects = ProductionService.getProjects(cases);\r\n const ixProject = productionProjects[0].ixProject;\r\n\r\n this.setState({\r\n cases,\r\n productionProjects,\r\n ixProject\r\n }, this.updateChartData);\r\n\r\n this.context.onLoadingChange(false);\r\n }\r\n };\r\n\r\n onCustomerChange = (e: React.ChangeEvent) => {\r\n const ixProject = Number(e.currentTarget.value);\r\n this.setState({ ixProject });\r\n };\r\n\r\n onFilterClick = (e: React.MouseEvent) => {\r\n this.setState({ filtered: true }, this.updateChartData);\r\n };\r\n\r\n onClearClick = (e: React.MouseEvent) => {\r\n this.setState({ filtered: false }, this.updateChartData);\r\n };\r\n\r\n updateChartData() {\r\n\r\n const cases = this.state.cases.filter((item) => {\r\n if (!this.state.filtered || !this.state.ixProject) return true;\r\n return item.ixProject === this.state.ixProject;\r\n });\r\n\r\n const productionTasksByArea = ProductionService.getTasksByArea(cases);\r\n const productionTasksByProject = ProductionService.getTasksByProject(cases);\r\n const productionCaseTotal = productionTasksByArea.reduce((acc, cur) => acc += cur.tasks.length, 0);\r\n const productionHourTotal = Math2.round(productionTasksByArea.reduce((acc, cur) => acc += cur.hrsElapsedTotal, 0), 0.01);\r\n\r\n this.setState({\r\n productionTasksByArea,\r\n productionTasksByProject,\r\n productionCaseTotal,\r\n productionHourTotal\r\n });\r\n }\r\n\r\n renderControls() {\r\n\r\n return (\r\n
\r\n \r\n \r\n Area\r\n {Object.keys(ProductionAreas).map((key) => {\r\n\r\n const data = ProductionAreas[key];\r\n\r\n return this.setState({ area: data })}\r\n inline\r\n />;\r\n })}\r\n \r\n \r\n Start Date\r\n \r\n \r\n \r\n End Date \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.renderDivide()}\r\n {this.renderFilter()}\r\n
\r\n );\r\n }\r\n\r\n renderDivide() {\r\n\r\n if (this.state.cases.length > 0) {\r\n return (\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderFilter() {\r\n\r\n if (this.state.cases.length > 0) {\r\n\r\n const project = this.state.productionProjects.find(item => item.ixProject === this.state.ixProject);\r\n\r\n return (\r\n \r\n \r\n Customer\r\n {\r\n !this.state.filtered\r\n ? \r\n {\r\n this.state.productionProjects.map(item => )\r\n }\r\n \r\n : {project?.sProject}\r\n }\r\n \r\n \r\n {\r\n !this.state.filtered\r\n ? \r\n : \r\n }\r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTabs() {\r\n\r\n if (this.state.productionTasksByArea.length > 0) {\r\n return (\r\n \r\n \r\n {this.renderTotalsByAreaChart()}\r\n {this.renderTotalsByAreaTable()}\r\n \r\n \r\n {this.renderTotalsByProjectChart()}\r\n {this.renderTotalsByProjectTable()}\r\n \r\n \r\n {this.renderData()}\r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderData() {\r\n\r\n if (this.state.productionTasksByArea.length > 0) {\r\n\r\n let eventKey: string;\r\n\r\n const innerHtml = this.state.productionTasksByArea.map((item, index) => {\r\n\r\n eventKey = index.toString();\r\n\r\n return (\r\n \r\n \r\n {this.renderDataHeader(item)}\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 {innerHtml}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderDataHeader(area: IProductionTasksByArea) {\r\n return (\r\n \r\n \r\n {area.sArea}{area.tasks.length}\r\n \r\n \r\n );\r\n }\r\n\r\n renderTotalsByAreaChart() {\r\n\r\n if (this.state.productionTasksByArea.length > 0) {\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 \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTotalsByAreaTable() {\r\n\r\n if (this.state.productionTasksByArea.length > 0) {\r\n\r\n const innerHtml = this.state.productionTasksByArea.map((item, index) => {\r\n\r\n return (\r\n \r\n {item.sArea}\r\n {item.hrsElapsedTotal}\r\n {item.tasks.length}\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 \r\n \r\n \r\n \r\n {innerHtml}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
AreaHoursCases
Totals:{this.state.productionHourTotal}{this.state.productionCaseTotal}
\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTotalsByProjectChart() {\r\n\r\n if (this.state.productionTasksByProject.length > 0) {\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 \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTotalsByProjectTable() {\r\n\r\n if (this.state.productionTasksByProject.length > 0) {\r\n\r\n const innerHtml = this.state.productionTasksByProject.map((item, index) => {\r\n\r\n return (\r\n \r\n {item.sProject}\r\n {item.hrsElapsedTotal}\r\n {item.tasks.length}\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 \r\n \r\n \r\n \r\n {innerHtml}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
AreaHoursCases
Totals:{this.state.productionHourTotal}{this.state.productionCaseTotal}
\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n

Production Totals

\r\n \r\n
\r\n {this.renderControls()}\r\n {this.renderTabs()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default ProductionTotals;\r\n\r\n\r\n/*****************************************************************************/\r\nconst ProductionAreas: { [key: string]: IControlArea } = {\r\n ALL: {\r\n id: \"all\",\r\n label: \"All\",\r\n query: `elapsedtime:0.25..1000 project:'${FBService.UK_PROJECT_PREFIX}'`\r\n },\r\n DEV: {\r\n id: \"dev\",\r\n label: \"Development\",\r\n query: `elapsedtime:0.25..1000 project:'${FBService.UK_PROJECT_PREFIX}' area:Development OR area:'Tech Lead'`\r\n },\r\n PM: {\r\n id: \"pm\",\r\n label: \"Project Management\",\r\n query: `elapsedtime:0.25..1000 project:'${FBService.UK_PROJECT_PREFIX}' area:Management OR area:Testing`\r\n }\r\n};","import AppContext from \"app/contexts/AppContext\";\r\nimport React from \"react\";\r\nimport { Col, Row } from \"react-bootstrap\";\r\n\r\n\r\n/*****************************************************************************/\r\nclass ProjectList extends React.Component {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n renderProjects() {\r\n return this.context.projects.map(item => {\r\n return (\r\n window.open(`https://papirfly.fogbugz.com/f/search/?sSearchFor=project%3A${item.sProject}`)}>\r\n {item.sProject}\r\n {item.sPersonOwner}\r\n \r\n );\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n

Project List

\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.renderProjects()}\r\n \r\n
NameProject Manager
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default ProjectList;\r\n","import { Date2 } from \"app/utils/Date2\";\r\nimport { IFBCase } from \"app/services/FBTypes\";\r\nimport { IMonthlySupportMetricsByGroup, ISupportTasksByGroup } from \"app/services/SupportTypes\";\r\nimport { Math2 } from \"app/utils/Math2\";\r\nimport { Object2 } from \"app/utils/Object2\";\r\n\r\n\r\n/*****************************************************************************/\r\nexport class SupportService {\r\n\r\n static getSupportTasksByGroup(tasks: IFBCase[], groupKey: string) {\r\n\r\n const arr: ISupportTasksByGroup[] = [];\r\n let group: ISupportTasksByGroup | undefined;\r\n let sGroup: string;\r\n\r\n tasks.forEach(item => {\r\n\r\n sGroup = Object2.getValue(item, groupKey, \"Unknown\");\r\n group = arr.find(a => a.sGroup.toLowerCase() === sGroup.toLowerCase());\r\n\r\n if (!group) {\r\n\r\n group = {\r\n tasks: [],\r\n ixGroup: arr.length,\r\n sGroup: sGroup,\r\n hrsElapsedTotal: 0\r\n };\r\n arr.push(group);\r\n }\r\n\r\n group.tasks.push(item);\r\n group.hrsElapsedTotal += item.hrsElapsed;\r\n });\r\n\r\n // Round hours and sort tasks by date\r\n arr.forEach(item => {\r\n item.tasks.sort((a, b) => a.dtOpened.getTime() - b.dtOpened.getTime());\r\n item.hrsElapsedTotal = Math2.round(item.hrsElapsedTotal, 0.01);\r\n });\r\n\r\n return arr.sort((a, b) => a.sGroup.localeCompare(b.sGroup));\r\n }\r\n\r\n static getSupportCountByGroup(tasks: IFBCase[], groupKey: string, startDate: Date, endDate: Date) {\r\n\r\n const arr: IMonthlySupportMetricsByGroup[] = SupportService.fillMonths([], startDate, endDate);\r\n let month: IMonthlySupportMetricsByGroup | undefined;\r\n let sGroup: string;\r\n\r\n tasks.forEach(item => {\r\n\r\n // Month should be returned as we filled the object when instantiating the array.\r\n month = arr.find(c => c.ixMonth === SupportService.getMonthKey(item.dtOpened));\r\n\r\n if (month) {\r\n sGroup = Object2.getValue(item, groupKey, \"Unknown\");\r\n\r\n if (!month.group[sGroup])\r\n month.group[sGroup] = {\r\n count: 0,\r\n hours: 0\r\n };\r\n\r\n month.group[sGroup].count++;\r\n month.group[sGroup].hours += item.hrsElapsed;\r\n }\r\n });\r\n\r\n // Add Missing Groups & Round Values\r\n const labels = SupportService.getGroupLabels(arr);\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n for (let j = 0; j < labels.length; j++) {\r\n if (!arr[i].group[labels[j]]) {\r\n arr[i].group[labels[j]] = {\r\n count: 0,\r\n hours: 0\r\n };\r\n }\r\n else {\r\n arr[i].group[labels[j]].hours = Math2.round(arr[i].group[labels[j]].hours, 0.01);\r\n }\r\n }\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n static getSupportCustomers(tasks: IFBCase[]) {\r\n\r\n const arr: string[] = [];\r\n\r\n tasks.forEach(item => {\r\n if (arr.indexOf(item.client) === -1)\r\n arr.push(item.client);\r\n });\r\n\r\n return arr.sort((a, b) => a.localeCompare(b));\r\n }\r\n\r\n static getGroupLabels(supportCountByGroup: IMonthlySupportMetricsByGroup[]) {\r\n\r\n const arr: string[] = [];\r\n\r\n for (let i = 0; i < supportCountByGroup.length; i++) {\r\n\r\n const keys = Object.keys(supportCountByGroup[i].group);\r\n\r\n for (let j = 0; j < keys.length; j++) {\r\n if (arr.indexOf(keys[j]) === -1)\r\n arr.push(keys[j]);\r\n }\r\n }\r\n\r\n arr.sort((a, b) => a.localeCompare(b));\r\n\r\n return arr;\r\n }\r\n\r\n private static fillMonths(target: IMonthlySupportMetricsByGroup[], startDate: Date, endDate: Date) {\r\n\r\n const dt: Date = new Date(startDate.getTime());\r\n\r\n do {\r\n\r\n target.push({\r\n ixMonth: SupportService.getMonthKey(dt),\r\n sMonth: SupportService.getMonthLabel(dt),\r\n group: {}\r\n });\r\n\r\n dt.setMonth(dt.getMonth() + 1);\r\n\r\n } while (dt.getTime() <= endDate.getTime());\r\n\r\n return target;\r\n }\r\n\r\n private static getMonthKey(date: Date) {\r\n return date.getFullYear() * 100 + date.getMonth();\r\n }\r\n\r\n private static getMonthLabel(date: Date) {\r\n return `${Date2.months3()[date.getMonth()]}'${date.getFullYear().toString().slice(2, 4)}`;\r\n }\r\n}\r\n","import AppContext from \"app/contexts/AppContext\";\r\nimport React from \"react\";\r\nimport TaskTable from \"app/components/reports/TaskTable\";\r\nimport { Accordion, Badge, Button, Card, Col, Form, Row, Tab, Table, Tabs } from \"react-bootstrap\";\r\nimport { Bar, BarChart, CartesianGrid, Legend, Line, LineChart, Tooltip, XAxis, YAxis } from \"recharts\";\r\nimport { ChartConfig } from \"app/components/charts/ChartConfig\";\r\nimport { CSSVar } from \"app/utils/CSSVar\";\r\nimport { Date2 } from \"app/utils/Date2\";\r\nimport { DateManager } from \"app/managers/DateManager\";\r\nimport { FBService } from \"app/services/FBService\";\r\nimport { IControlArea } from \"app/components/reports/ReportTypes\";\r\nimport { IFBCase } from \"app/services/FBTypes\";\r\nimport { IMonthlySupportMetricsByGroup, ISupportTasksByGroup } from \"app/services/SupportTypes\";\r\nimport { Math2 } from \"app/utils/Math2\";\r\nimport { SupportService } from \"app/services/SupportService\";\r\n\r\n\r\n/*****************************************************************************/\r\ninterface ISupportVolumeState {\r\n market: IControlArea;\r\n startDate: Date;\r\n endDate: Date;\r\n customer?: string;\r\n filtered: boolean;\r\n cases: IFBCase[];\r\n supportCustomers: string[];\r\n supportTasksByArea: ISupportTasksByGroup[];\r\n supportTasksByCustomer: ISupportTasksByGroup[];\r\n monthlyByArea: IMonthlySupportMetricsByGroup[];\r\n monthlyAreaLabels: string[];\r\n supportCaseTotal: number;\r\n supportHourTotal: number;\r\n}\r\n\r\nclass SupportVolume extends React.Component<{}, ISupportVolumeState> {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n state: ISupportVolumeState = {\r\n market: Markets.UK,\r\n startDate: new Date(DateManager.lastyear.getTime()),\r\n endDate: new Date(DateManager.today.getTime()),\r\n filtered: false,\r\n cases: [],\r\n supportCustomers: [],\r\n supportTasksByArea: [],\r\n supportTasksByCustomer: [],\r\n monthlyByArea: [],\r\n monthlyAreaLabels: [],\r\n supportCaseTotal: 0,\r\n supportHourTotal: 0\r\n };\r\n\r\n onDateChange = (e: React.ChangeEvent) => {\r\n\r\n const date = Date2.parseFromInput(e.currentTarget.value);\r\n\r\n if (date) {\r\n if (e.currentTarget.name === \"startDate\")\r\n this.setState({ startDate: date });\r\n else if (e.currentTarget.name === \"endDate\")\r\n this.setState({ endDate: date });\r\n }\r\n };\r\n\r\n onUpdateClick = async (e: React.MouseEvent) => {\r\n\r\n if (this.context.token) {\r\n this.context.onLoadingChange(true);\r\n\r\n const query = `${this.state.market.query} opened:${Date2.toUSDateString(this.state.startDate)}-${Date2.toUSDateString(this.state.endDate)}`;\r\n const filtered = false;\r\n const cases = await FBService.fetchCases(this.context.token, query);\r\n const supportCustomers = SupportService.getSupportCustomers(cases);\r\n const customer = supportCustomers[0];\r\n\r\n this.setState({\r\n customer,\r\n filtered,\r\n cases,\r\n supportCustomers,\r\n supportTasksByArea: [],\r\n supportTasksByCustomer: [],\r\n monthlyByArea: [],\r\n monthlyAreaLabels: []\r\n }, this.updateChartData);\r\n\r\n this.context.onLoadingChange(false);\r\n }\r\n };\r\n\r\n onCustomerChange = (e: React.ChangeEvent) => {\r\n const customer = e.currentTarget.value;\r\n this.setState({ customer });\r\n };\r\n\r\n onFilterClick = (e: React.MouseEvent) => {\r\n this.setState({ filtered: true }, this.updateChartData);\r\n };\r\n\r\n onClearClick = (e: React.MouseEvent) => {\r\n this.setState({ filtered: false }, this.updateChartData);\r\n };\r\n\r\n updateChartData() {\r\n\r\n const cases = this.state.cases.filter((item) => {\r\n if (!this.state.filtered || !this.state.customer) return true;\r\n return item.client === this.state.customer;\r\n });\r\n\r\n const supportTasksByArea = SupportService.getSupportTasksByGroup(cases, \"sArea\");\r\n const supportTasksByCustomer = SupportService.getSupportTasksByGroup(cases, \"client\");\r\n const monthlyByArea = SupportService.getSupportCountByGroup(cases, \"sArea\", this.state.startDate, this.state.endDate);\r\n const monthlyAreaLabels = SupportService.getGroupLabels(monthlyByArea);\r\n const supportCaseTotal = supportTasksByArea.reduce((acc, cur) => acc += cur.tasks.length, 0);\r\n const supportHourTotal = Math2.round(supportTasksByArea.reduce((acc, cur) => acc += cur.hrsElapsedTotal, 0), 0.01);\r\n\r\n this.setState({\r\n supportTasksByArea,\r\n supportTasksByCustomer,\r\n monthlyByArea,\r\n monthlyAreaLabels,\r\n supportCaseTotal,\r\n supportHourTotal\r\n });\r\n }\r\n\r\n renderControls() {\r\n\r\n return (\r\n
\r\n \r\n \r\n Market\r\n {Object.keys(Markets).map((key, index) => {\r\n\r\n const data = Markets[key];\r\n\r\n return this.setState({ market: data })}\r\n inline\r\n />;\r\n })}\r\n \r\n\r\n \r\n Start Date\r\n \r\n \r\n \r\n End Date \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.renderDivide()}\r\n {this.renderFilter()}\r\n
\r\n );\r\n }\r\n\r\n renderDivide() {\r\n\r\n if (this.state.cases.length > 0) {\r\n return (\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderFilter() {\r\n\r\n if (this.state.cases.length > 0) {\r\n return (\r\n \r\n \r\n Customer\r\n {\r\n !this.state.filtered\r\n ? \r\n {\r\n this.state.supportCustomers.map((item, index) => )\r\n }\r\n \r\n : {this.state.customer}\r\n }\r\n \r\n \r\n {\r\n !this.state.filtered\r\n ? \r\n : \r\n }\r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTabs() {\r\n\r\n if (this.state.supportTasksByArea.length > 0)\r\n return (\r\n \r\n \r\n {this.renderMonthlyCasesByArea()}\r\n {this.renderMonthlyHoursByArea()}\r\n \r\n \r\n {this.renderTotalsByAreaChart()}\r\n {this.renderTotalsByAreaTable()}\r\n \r\n \r\n {this.renderTotalsByCustomerChart()}\r\n {this.renderTotalsByCustomerTable()}\r\n \r\n \r\n {this.renderData()}\r\n \r\n \r\n );\r\n\r\n return null;\r\n }\r\n\r\n renderData() {\r\n\r\n if (this.state.supportTasksByArea.length > 0) {\r\n\r\n let eventKey: string;\r\n\r\n const innerHtml = this.state.supportTasksByArea.map((item, index) => {\r\n\r\n eventKey = index.toString();\r\n\r\n return (\r\n \r\n \r\n {this.renderDataHeader(item)}\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 {innerHtml}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderDataHeader(area: ISupportTasksByGroup) {\r\n return (\r\n \r\n \r\n {area.sGroup}{area.tasks.length}\r\n \r\n \r\n );\r\n }\r\n\r\n renderMonthlyCasesByArea() {\r\n\r\n if (this.state.monthlyByArea.length > 0) {\r\n\r\n const colors = ChartConfig.palette(this.state.monthlyByArea.length);\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 this.state.monthlyAreaLabels.map((item, index) => (\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\r\n renderMonthlyHoursByArea() {\r\n\r\n if (this.state.monthlyByArea.length > 0) {\r\n\r\n const colors = ChartConfig.palette(this.state.monthlyByArea.length);\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 this.state.monthlyAreaLabels.map((item, index) => (\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\r\n renderTotalsByAreaChart() {\r\n\r\n if (this.state.supportTasksByArea.length > 0) {\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 \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTotalsByAreaTable() {\r\n\r\n if (this.state.supportTasksByArea.length > 0) {\r\n\r\n const innerHtml = this.state.supportTasksByArea.map((item, index) => {\r\n\r\n return (\r\n \r\n {item.sGroup}\r\n {item.hrsElapsedTotal}\r\n {item.tasks.length}\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 \r\n \r\n \r\n \r\n {innerHtml}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
AreaHoursCases
Totals:{this.state.supportHourTotal}{this.state.supportCaseTotal}
\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTotalsByCustomerChart() {\r\n\r\n if (this.state.supportTasksByCustomer.length > 0) {\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 \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTotalsByCustomerTable() {\r\n\r\n if (this.state.supportTasksByCustomer.length > 0) {\r\n\r\n const innerHtml = this.state.supportTasksByCustomer.map((item, index) => {\r\n\r\n return (\r\n \r\n {item.sGroup}\r\n {item.hrsElapsedTotal}\r\n {item.tasks.length}\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 \r\n \r\n \r\n \r\n {innerHtml}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
AreaHoursCases
Totals:{this.state.supportHourTotal}{this.state.supportCaseTotal}
\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n

Support Volume

\r\n \r\n
\r\n {this.renderControls()}\r\n {this.renderTabs()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default SupportVolume;\r\n\r\n\r\n/*****************************************************************************/\r\nconst Markets: { [key: string]: IControlArea } = {\r\n ALL: {\r\n id: \"no\",\r\n label: \"Norway\",\r\n query: `project:'${FBService.SUPPORT_PROJECT}' -customer:'${FBService.DK_PROJECT_PREFIX}' -customer:'${FBService.UK_PROJECT_PREFIX}'`\r\n },\r\n DK: {\r\n id: \"dk\",\r\n label: \"Denmark\",\r\n query: `project:'${FBService.SUPPORT_PROJECT}' customer:'${FBService.DK_PROJECT_PREFIX}'`\r\n },\r\n UK: {\r\n id: \"uk\",\r\n label: \"United Kingdom\",\r\n query: `project:'${FBService.SUPPORT_PROJECT}' customer:'${FBService.UK_PROJECT_PREFIX}'`\r\n }\r\n};","import AppContext from \"app/contexts/AppContext\";\r\nimport InfoBox from \"app/components/reports/InfoBox\";\r\nimport React from \"react\";\r\nimport TaskTable from \"app/components/reports/TaskTable\";\r\nimport { Accordion, Badge, Button, Card, Col, Form, Row, Tab, Tabs } from \"react-bootstrap\";\r\nimport { Bar, BarChart, CartesianGrid, Cell, Legend, ReferenceLine, Tooltip, XAxis, YAxis } from \"recharts\";\r\nimport { ChartConfig } from \"app/components/charts/ChartConfig\";\r\nimport { CSSVar } from \"app/utils/CSSVar\";\r\nimport { Date2 } from \"app/utils/Date2\";\r\nimport { DateManager } from \"app/managers/DateManager\";\r\nimport { FBService } from \"app/services/FBService\";\r\nimport { IControlAreaWithPeople } from \"app/components/reports/ReportTypes\";\r\nimport { IFBPerson } from \"app/services/FBTypes\";\r\nimport { IPerformanceByArea, IProductionTasksByArea } from \"app/services/ProductionTypes\";\r\nimport { ProductionService } from \"app/services/ProductionService\";\r\n\r\n\r\n/*****************************************************************************/\r\ninterface ITeamPerformanceState {\r\n area: IControlAreaWithPeople;\r\n person?: IFBPerson;\r\n startDate: Date;\r\n endDate: Date;\r\n personTasks: IProductionTasksByArea[];\r\n performanceByArea: IPerformanceByArea[];\r\n team: IFBPerson[];\r\n}\r\n\r\nclass TeamPerformance extends React.Component<{}, ITeamPerformanceState> {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n state: ITeamPerformanceState = {\r\n area: PerformanceAreas.DEV,\r\n startDate: new Date(DateManager.lastyear.getTime()),\r\n endDate: new Date(DateManager.today.getTime()),\r\n personTasks: [],\r\n performanceByArea: [],\r\n team: []\r\n };\r\n\r\n onAreaChange = (area: IControlAreaWithPeople) => {\r\n this.setState({ area });\r\n this.clearData();\r\n this.updateTeamMembers();\r\n };\r\n\r\n onPersonChange = (e: React.ChangeEvent) => {\r\n\r\n const ixPerson = parseInt(e.currentTarget.value);\r\n const person = this.state.team.find(item => item.ixPerson === ixPerson);\r\n this.setState({ person });\r\n };\r\n\r\n onDateChange = (e: React.ChangeEvent) => {\r\n\r\n const date = Date2.parseFromInput(e.currentTarget.value);\r\n\r\n if (date) {\r\n if (e.currentTarget.name === \"startDate\")\r\n this.setState({ startDate: date });\r\n else if (e.currentTarget.name === \"endDate\")\r\n this.setState({ endDate: date });\r\n }\r\n };\r\n\r\n onUpdateClick = async (e: React.MouseEvent) => {\r\n\r\n if (this.context.token) {\r\n this.context.onLoadingChange(true);\r\n\r\n const query = `${this.state.area.query} opened:${Date2.toUSDateString(this.state.startDate)}-${Date2.toUSDateString(this.state.endDate)}`;\r\n const cases = await FBService.fetchCases(this.context.token, query);\r\n const intervals = await FBService.fetchIntervals(this.context.token, this.state.startDate, this.state.endDate, this.state.person?.ixPerson);\r\n const productionTasks = ProductionService.getTasksByArea(cases);\r\n const personTasks = ProductionService.getTasksByArea(cases, intervals);\r\n const performanceByArea = ProductionService.getPerformanceByArea(personTasks, productionTasks);\r\n this.setState({ personTasks, performanceByArea });\r\n\r\n this.context.onLoadingChange(false);\r\n }\r\n };\r\n\r\n componentDidUpdate() {\r\n this.updateTeamMembers();\r\n }\r\n\r\n componentDidMount() {\r\n this.updateTeamMembers();\r\n }\r\n\r\n clearData() {\r\n this.setState({\r\n personTasks: [],\r\n performanceByArea: [],\r\n team: []\r\n });\r\n }\r\n\r\n updateTeamMembers() {\r\n\r\n if (this.context.people.length > 0 && this.state.team.length === 0) {\r\n const team = ProductionService.getTeamMembers(this.state.area.people, this.context.people);\r\n const person = team[0];\r\n this.setState({ team, person });\r\n }\r\n }\r\n\r\n renderControls() {\r\n\r\n return (\r\n
\r\n \r\n \r\n Area\r\n {Object.keys(PerformanceAreas).map((key, index) => {\r\n\r\n const data = PerformanceAreas[key];\r\n\r\n return this.onAreaChange(data)}\r\n inline\r\n />;\r\n })}\r\n \r\n \r\n Team Member\r\n \r\n {\r\n this.state.team.map(item => )\r\n }\r\n \r\n \r\n \r\n Start Date\r\n \r\n \r\n \r\n End Date \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n renderTabs() {\r\n\r\n if (this.state.personTasks.length > 0) {\r\n\r\n return (\r\n \r\n \r\n {this.renderHourlyAveragesByArea()}\r\n \r\n \r\n {this.renderEstimateDifferenceByArea()}\r\n \r\n \r\n {this.renderData()}\r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderData() {\r\n\r\n if (this.state.personTasks.length > 0) {\r\n\r\n let eventKey: string;\r\n\r\n const innerHtml = this.state.personTasks.map((item, index) => {\r\n\r\n eventKey = index.toString();\r\n\r\n return (\r\n \r\n \r\n {this.renderDataHeader(item)}\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 {innerHtml}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderDataHeader(area: IProductionTasksByArea) {\r\n return (\r\n \r\n \r\n {area.sArea}{area.tasks.length}\r\n \r\n \r\n );\r\n }\r\n\r\n renderHourlyAveragesByArea() {\r\n\r\n if (this.state.performanceByArea.length > 0) {\r\n\r\n return (\r\n \r\n \r\n \r\n Hourly averages use the following calculation:\r\n
Σ(Hours Actual) / Σ(Story Points)\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 null;\r\n }\r\n\r\n renderEstimateDifferenceByArea() {\r\n\r\n if (this.state.performanceByArea.length > 0) {\r\n\r\n return (\r\n \r\n \r\n \r\n The estimate difference is weighted using the following calculation:\r\n
Σ(Hours Actual - Hours Estimated) / Σ(Hours Actual)\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.state.performanceByArea.map(item => = 0) ? \"success\" : \"danger\")} />)}\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n

Team Performance

\r\n \r\n
\r\n {this.renderControls()}\r\n {this.renderTabs()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default TeamPerformance;\r\n\r\n\r\n/*****************************************************************************/\r\nconst PerformanceAreas: { [key: string]: IControlAreaWithPeople } = {\r\n DEV: {\r\n id: \"dev\",\r\n label: \"Development\",\r\n query: `status:resolved OR status:closed project:'${FBService.UK_PROJECT_PREFIX}' area:Development AND -area:'Revision Development' elapsedtime:0.25..1000`,\r\n people: [\r\n \"andy@papirfly.com\",\r\n \"ivan@papirfly.com\",\r\n \"jake@papirfly.com\",\r\n \"rich@papirfly.com\",\r\n \"sefton@papirfly.com\"\r\n ]\r\n },\r\n PM: {\r\n id: \"pm\",\r\n label: \"Project Management\",\r\n query: `status:resolved OR status:closed project:'${FBService.UK_PROJECT_PREFIX}' area:Management OR area:Testing elapsedtime:0.25..1000`,\r\n people: [\r\n \"daniel.thorpe@papirfly.com\",\r\n \"helen@papirfly.com\",\r\n \"katrina@papirfly.com\",\r\n \"laura@papirfly.com\",\r\n \"scott@papirfly.com\"\r\n ]\r\n }\r\n};","import OpenCases from \"app/components/reports/OpenCases\";\r\nimport PeopleList from \"app/components/reports/PeopleList\";\r\nimport ProductionAverages from \"app/components/reports/ProductionAverages\";\r\nimport ProductionTotals from \"app/components/reports/ProductionTotals\";\r\nimport ProjectList from \"app/components/reports/ProjectList\";\r\nimport SupportVolume from \"app/components/reports/SupportVolume\";\r\nimport TeamPerformance from \"app/components/reports/TeamPerformance\";\r\n\r\n\r\n/*****************************************************************************/\r\ninterface INavOption {\r\n id: string;\r\n label: string;\r\n path: string;\r\n component: any;\r\n}\r\n\r\n\r\n/*****************************************************************************/\r\nconst NavOptions: INavOption[] = [\r\n {\r\n id: \"projectList\",\r\n label: \"Project List\",\r\n path: \"/\",\r\n component: ProjectList\r\n },\r\n {\r\n id: \"peopleList\",\r\n label: \"People List\",\r\n path: \"/people\",\r\n component: PeopleList\r\n },\r\n {\r\n id: \"openCases\",\r\n label: \"Open Cases\",\r\n path: \"/open-cases\",\r\n component: OpenCases\r\n },\r\n {\r\n id: \"productionAverages\",\r\n label: \"Production Averages\",\r\n path: \"/production-averages\",\r\n component: ProductionAverages\r\n },\r\n {\r\n id: \"productionTotals\",\r\n label: \"Production Totals\",\r\n path: \"/production-totals\",\r\n component: ProductionTotals\r\n },\r\n {\r\n id: \"team\",\r\n label: \"Team Performance\",\r\n path: \"/team-performance\",\r\n component: TeamPerformance\r\n }, {\r\n id: \"support\",\r\n label: \"Support Volume\",\r\n path: \"/support-volume\",\r\n component: SupportVolume\r\n }\r\n];\r\n\r\nexport default NavOptions;\r\n\r\n\r\n\r\n","import AccessToken from \"app/components/nav/AccessToken\";\r\nimport NavOptions from \"app/data/NavOptions\";\r\nimport React from \"react\";\r\nimport { Col, Container, Row } from \"react-bootstrap\";\r\nimport { NavLink } from \"react-router-dom\";\r\nimport \"app/components/nav/Dashboard.css\";\r\n\r\n\r\ninterface IDashboardState {\r\n hidden: boolean;\r\n}\r\n\r\n\r\nclass Dashboard extends React.Component<{}, IDashboardState> {\r\n\r\n state: IDashboardState = {\r\n hidden: false\r\n };\r\n\r\n onTabClick = (e: React.MouseEvent) => {\r\n this.setState({ hidden: !this.state.hidden });\r\n };\r\n\r\n renderLinks() {\r\n return NavOptions.map(item => {\r\n return (\r\n {item.label}\r\n );\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n

Dashboard

\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Reports
\r\n
\r\n {this.renderLinks()}\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default Dashboard;\r\n\r\n\r\n\r\n","import AppContext from \"app/contexts/AppContext\";\r\nimport logo from \"app/components/reports/logo.svg\";\r\nimport NavOptions from \"app/data/NavOptions\";\r\nimport React from \"react\";\r\nimport { Col, Container, Row } from \"react-bootstrap\";\r\nimport { Route, Switch } from \"react-router-dom\";\r\nimport \"app/components/reports/Report.css\";\r\n\r\n\r\nclass Report extends React.Component {\r\n\r\n static contextType = AppContext;\r\n context!: React.ContextType;\r\n\r\n renderRoutes() {\r\n return NavOptions.map(item => {\r\n return (\r\n \r\n );\r\n });\r\n }\r\n\r\n renderBody() {\r\n if (this.context.token)\r\n return (\r\n \r\n \r\n \r\n {this.renderRoutes()}\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n Please use the dashboard to authentic before viewing a report!\r\n \r\n \r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n \r\n \"papirfly\"\r\n \r\n \r\n {this.renderBody()}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default Report;\r\n\r\n\r\n","import AppSpinner from \"app/components/misc/AppSpinner\";\r\nimport Dashboard from \"app/components/nav/Dashboard\";\r\nimport React from \"react\";\r\nimport Report from \"app/components/reports/Report\";\r\nimport { AppStore } from \"app/contexts/AppContext\";\r\nimport { HashRouter } from \"react-router-dom\";\r\nimport \"app/Variables.css\";\r\nimport \"app/Overrides.css\";\r\nimport \"app/App.css\";\r\n\r\n\r\nclass App extends React.Component {\r\n\r\n render() {\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 }\r\n}\r\n\r\nexport default App;\r\n","import App from \"app/App\";\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.css\";\r\n\r\n\r\n// 2020-06-16: React Bootstrap won't work in StrictMode until updatd.\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);"],"sourceRoot":""}