{"version":3,"sources":["../../src/api/helpers.ts","../../src/api/Accounts/AccountsApi.ts","../../src/api/Authentication/AuthenticationApi.ts","../../src/api/UserGroups/UserGroupsApi.ts","../../src/common/Table/Buttons.tsx","../../src/common/Table/DefaultColumnsTypeProvider.tsx","../../src/common/Table/ActionsButtons.tsx","../../src/common/Table/Dialog.tsx","../../src/common/Table/DeleteDialog.tsx","../../src/common/Table/MetadataFilter.tsx","../../src/common/Table/MetatadaFormatter.tsx","../../src/common/Table/MetadataEditor.tsx","../../src/common/Table/Popup.tsx","../../src/utils/Utils.ts","../../src/common/Table/PopupEditing.tsx","../../src/common/Table/UsersFormatter.tsx","../../src/Accounts/Accounts.tsx","../../src/Auth/AuthService.ts","../../src/theme.tsx","../../src/Auth/LoginForm/useStyles.tsx","../../src/Auth/LoginForm/LoginForm.tsx","../../src/Auth/ResetPasswordForm/useStyles.tsx","../../src/Auth/ResetPasswordForm/ResetPasswordForm.tsx","../../src/Auth/UpdatePasswordForm/useStyles.tsx","../../src/Auth/UpdatePasswordForm/UpdatePasswordForm.tsx","../../src/Auth/Login/Login.tsx","../../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../../src/Timeseries/TimeseriesExplorer/Timeseries.tsx"],"names":["DEFAULT_OPTIONS","headers","fetchUrl","endPoint","mergedOptions","options","fetch","map","response","Error","flatMap","of","text","JSON","checkStatus","catchError","throwError","fetchAccount","host","method","additionalHeaders","Authorization","token","fetchAccounts","fetchToken","body","fetchUserGroups","tap","console","commandComponents","add","onExecute","style","textAlign","color","onClick","title","React","edit","delete","Command","id","CommandButton","DefaultColumnsFormatter","value","placement","TransitionComponent","Zoom","noWrap","variant","DefaultColumnsTypeProvider","formatterComponent","ActionsButtons","cancelButtonText","confirmButtonText","onCancel","onSubmit","isEditing","type","background","Dialog","props","dialogId","message","showDialog","open","onClose","DeleteDialog","selectedRow","closeDialog","handleDelete","InputFilterCell","filter","onFilter","column","onChange","e","operation","columnType","placeholder","inputProps","height","min","max","BooleanFilterCell","width","marginTop","fullWidth","labelId","FilterCellRow","TableFilterRow","metadataFilterService","predicate","columnName","row","regex","RegExp","arrayToLowerCase","item","myBooleanValue","result","filterRules","metadata","meta","key","MetadataFormatter","name","alignItems","label","marginRight","MetadataTypeProvider","MetadataEditor","onListChange","onError","useState","list","setList","multiText","setMultiText","error","setError","multiTextField","useRef","handleChange","re","useEffect","Object","i","margin","helperText","regExError","index","control","checked","values","multiple","renderInput","autoComplete","onDelete","newList","handleChipDelete","inputRef","InputProps","endAdornment","disabled","handleMultiText","NoBorderTextField","root","border","Popup","rows","onMetadataChange","onApplyChanges","onCancelChanges","users","isNew","defaultColumns","hasPassword","userGroupsDefaultSelected","passwordStrengthColor","setPasswordStrengthColor","passwordValid","setPasswordValid","duplicatedId","setDuplicatedId","position","password","strengthColor","score","passwordStrength","updatePasswordStrengthIndicator","container","spacing","xs","found","required","defaultUsersSelection","user","currentValues","f","a","b","getOptionSelected","option","val","getOptionLabel","v","padding","PopupEditing","allUsers","onSave","getRowId","addedRows","editingRowIds","createRowChange","rowChanges","changeRow","changeAddedRow","commitChangedRows","commitAddedRows","stopEditRows","cancelAddedRows","cancelChangedRows","editedRow","rowId","targetRow","rowIds","target","changeArgs","change","isMetadata","changeData","newValue","UsersFormatter","UsersTypeProvider","DEFAULT_COLUMNS","Accounts","setRows","userGroups","setUserGroups","deletedDialog","setDeletedDialog","deleteRow","setDeleteRow","filteringColumnExtensions","setFilteringColumnExtensions","metadataHeader","cur","columns","metadataColumnsArray","metadataColumns","usersColumn","defaultColumnsNameArray","fetchData","ug","deleteAccount","columnExtensions","defaultSorting","direction","onCommitChanges","added","changed","deleted","startingAddedId","changedRows","deletedSet","Set","window","for","showSortingControls","cellComponent","showAddCommand","showEditCommand","showDeleteCommand","commandComponent","popupComponent","createAccount","updateAccount","AuthService","login","Array","accessTokenList","form","otp","otpAuthenticator","onOtpRequired","loggedInUser","roles","role","firstResponse","onSuccess","requestResetPassword","resetPassword","confirmResetPassword","updatePassword","getSession","storage","localStorage","userStorage","accessToken","refreshToken","expiration","setSession","useLocalStorage","authResult","isAuthenticated","expirationStorage","expiresAt","Date","logout","this","DHITheme","createTheme","palette","primary","main","secondary","styles","display","flex","flexDirection","labels","fontSize","rememberMe","float","rememberMeLink","submit","button","shrink","backgroundColor","paddingLeft","paddingRight","useStyles","makeStyles","withTheme","LoginForm","userNamePlaceholder","passwordPlaceholder","showRememberMe","onResetPassword","showResetPassword","rememberMeLabelText","resetPasswordLabelText","loginButtonText","backButtonText","textFieldVariant","otpAuthPlaceholder","loading","setLoading","twoFA","setTwoFA","otpAuthenticatorIds","setOtpAuthenticatorIds","setForm","classes","auth","otpInfo","severity","className","defaultValue","undefined","size","resetBox","justifyContent","messages","backButton","ResetPasswordForm","mailTemplate","onBackToLogin","resetPasswordButtonText","errorText","successText","success","setSuccess","emailAddress","UpdatePasswordForm","onPasswordUpdated","newPasswordPlaceholder","confirmPasswordPlaceholder","updatePasswordButtonText","submitted","setSubmitted","confirmPassword","passwordsMatch","Login","showUpdatePassword","resetPasswordMailTemplate","resetPasswordToken","translations","showingResetPassword","setShowingResetPassword","togglePasswordResetForm","theme","updatePasswordEmailPlaceholder","resetPasswordButton","resetPasswordError","updatePasswordNewPasswordPlaceholder","updatePasswordConfirmPasswordPlaceholder","updatePasswordConfirmButton","loginButton","rememberMeLabel","resetPasswordLabel","clear","Symbol","iterator","asyncIterator"],"mappings":"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","file":"static/js/53.7a5dad75.chunk.js","sourcesContent":["import { from, of, throwError } from 'rxjs';\nimport { catchError, flatMap, map, tap } from 'rxjs/operators';\nimport { Options } from '../api/types';\n\nconst DEFAULT_OPTIONS = {\n headers: {\n 'Content-Type': 'application/json',\n },\n};\n\nconst checkStatus = (response: Response) => {\n if (response.status === 204 || response.status === 202) {\n return of(response);\n }\n\n return response.text().then((text) => {\n return text ? JSON.parse(text) : {};\n });\n};\n\nconst fetchUrl = (endPoint: RequestInfo, options?: Options) => {\n const mergedOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n headers: {\n ...DEFAULT_OPTIONS.headers,\n ...options?.additionalHeaders,\n },\n };\n\n return from(fetch(endPoint, mergedOptions as any)).pipe(\n // tap((response) => console.log(`Response status: ${response.status}`)),\n map((response) => {\n if (response.status >= 400) {\n throw new Error(`Error: ${response.status}, reason: ${response.statusText}`);\n } else {\n return response;\n }\n }),\n flatMap((response) => checkStatus(response)),\n catchError((error) => throwError(error)),\n );\n};\n\nexport { DEFAULT_OPTIONS, fetchUrl };\n","import { tap } from 'rxjs/operators';\nimport { fetchUrl } from '../helpers';\n\n/**\n * /api/accounts/{id}\n * Gets an account with the specified identifier.\n * @param host\n * @param token\n * @param id\n */\nconst fetchAccount = (host: string, token: string, id: string) =>\n fetchUrl(`${host}/api/accounts/${id}`, {\n method: 'GET',\n additionalHeaders: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n/**\n * /api/accounts\n * Gets a list of all accounts.\n * @param host\n * @param token\n */\nconst fetchAccounts = (host: string, token: string) =>\n fetchUrl(`${host}/api/accounts`, {\n method: 'GET',\n additionalHeaders: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n/**\n * /api/accounts/{id}\n * Deletes the account with the specified identifier.\n * @param host\n * @param token\n * @param username\n */\nconst deleteAccount = (host: string, token: string, username: string) =>\n fetchUrl(`${host}/api/accounts/${username}`, {\n method: 'DELETE',\n additionalHeaders: {\n Authorization: `Bearer ${token}`,\n },\n }).pipe(tap((res) => console.log('deleted account', res)));\n\n/**\n * /api/accounts\n * Updates an existing account.\n * NOTE: The password can be omitted from an update, but all other properties must be present. Otherwise, they will be set to null.\n * @param host\n * @param token\n * @param data\n */\nconst updateAccount = (host: string, token: string, data: Record) =>\n fetchUrl(`${host}/api/accounts`, {\n method: 'PUT',\n additionalHeaders: {\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(data),\n }).pipe(tap((json) => console.log('updated user', json)));\n\n/**\n * /api/accounts\n * Adds a new account.\n * NOTE: Adding a new account automatically activates the account.\n * @param host\n * @param token\n * @param data\n */\nconst createAccount = (host: string, token: string, data: Record) =>\n fetchUrl(`${host}/api/accounts`, {\n method: 'POST',\n additionalHeaders: {\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(data),\n });\n\n/**\n * /api/accounts/passwordreset\n * Generates a one-time token that allows for a password reset.\n * NOTE: Generates a one-time token that allows for a password reset for the account identified by the given email address\n or account ID. A password reset link with the generated reset token is sent to the user account in an email.\n * @param host \n * @param user \n * @param token \n */\nconst resetPassword = (host: string, mailBody: string, emailAddress: string) =>\n fetchUrl(`${host}/api/accounts/passwordreset?mailBody=${mailBody}`, {\n method: 'POST',\n body: `\"${emailAddress}\"`,\n }).pipe(tap((res) => console.log('password reset', res)));\n\n/**\n * /api/accounts/password\n * Updates the password for the user account associated with the given token.\n * NOTE: The necessary password reset token must be obtained from e.g. an email or a mobile text message.\n * @param host\n * @param token\n * @param passwordToken\n * @param newPassword\n */\nconst updatePassword = (host: string, token: string, newPassword: string) =>\n fetchUrl(`${host}/api/accounts/password?token=${token}`, {\n method: 'PUT',\n body: `\"${newPassword}\"`,\n }).pipe(tap((res) => console.log('password reset', res)));\n\n/**\n * /api/accounts/password\n * Updates the password for the user account associated with the given token.\n * @param host\n * @param token\n * @param accountToken\n */\nconst activateAccount = (host: string, token: string, accountToken: string) =>\n fetchUrl(`${host}/api/accounts/password/token=${accountToken}`, {\n method: 'PUT',\n additionalHeaders: {\n Authorization: `Bearer ${token}`,\n },\n }).pipe(tap((res) => console.log('account activiated', res)));\n\nexport {\n resetPassword,\n fetchAccounts,\n deleteAccount,\n updateAccount,\n createAccount,\n fetchAccount,\n updatePassword,\n activateAccount,\n};\n","import { tap } from 'rxjs/operators';\nimport { Token } from '../../Auth/types';\nimport { DEFAULT_OPTIONS, fetchUrl } from '../helpers';\nimport { User } from '../types';\n\n/**\n * /api/tokens\n * Creates a JWT authorization token.\n * @param host\n * @param user\n */\nconst fetchToken = (host: string, user: User) => {\n return fetchUrl(`${host}/api/tokens`, {\n method: 'POST',\n body: JSON.stringify(user),\n });\n // .pipe(\n // tap(\n // (res) => console.log('token res', res),\n // (error) => console.log(error),\n // ),\n // );\n};\n\n/**\n * /api/tokens/validation\n * Performs validation of token.\n * @param host\n * @param token\n */\nconst validateToken = (host: string, token: string) => {\n return fetch(`${host}/api/tokens/validation`, {\n ...DEFAULT_OPTIONS,\n method: 'POST',\n body: JSON.stringify(token),\n });\n};\n\nexport { fetchToken, validateToken };\n","import { tap } from 'rxjs/operators';\nimport { UserGroupsData } from '../../UserGroups/types';\nimport { fetchUrl } from '../helpers';\n\n// Could be an account name or `me`.\n\n/**\n * /api/usergroups\n * Gets a list of all user groups.\n * @param host\n * @param token\n */\nconst fetchUserGroups = (host: string, token: string) =>\n fetchUrl(`${host}/api/usergroups`, {\n method: 'GET',\n additionalHeaders: { Authorization: `Bearer ${token}` },\n }).pipe(tap((res) => console.log('fetchUserGroups', res)));\n\n/**\n * /api/usergroups/user/{userId}\n * Adds a user to all groups with the specified identifiers.\n * @param host\n * @param token\n * @param data\n */\nconst updateUserGroupsForUser = (host: string, token: string, data: { userId: string; groups: string[] }) =>\n fetchUrl(`${host}/api/usergroups/user/${data.userId}`, {\n method: 'POST',\n additionalHeaders: { Authorization: `Bearer ${token}` },\n body: JSON.stringify(data.groups),\n }).pipe(tap((res) => console.log('fetchUserGroups', res)));\n\n/**\n * /api/usergroups\n * Adds a new user group.\n * @param host\n * @param token\n * @param data\n */\nconst createUserGroup = (host: string, token: string, data: UserGroupsData) =>\n fetchUrl(`${host}/api/usergroups`, {\n method: 'POST',\n additionalHeaders: { Authorization: `Bearer ${token}` },\n body: JSON.stringify(data),\n }).pipe(tap((res) => console.log('createUserGroup', res)));\n\n/**\n * /api/usergroups\n * Updates an existing user group.\n * @param host\n * @param token\n * @param data\n */\nconst updateUserGroups = (host: string, token: string, data: UserGroupsData) =>\n fetchUrl(`${host}/api/usergroups`, {\n method: 'PUT',\n additionalHeaders: { Authorization: `Bearer ${token}` },\n body: JSON.stringify({\n id: data.id,\n name: data.name,\n users: data.users,\n metadata: data.metadata,\n }),\n }).pipe(tap((res) => console.log('updateUserGroups', res)));\n\n/**\n * /api/usergroups/{id}\n * Deletes the user group with the specified identifier.\n * @param host\n * @param token\n * @param id\n */\nconst deleteUserGroup = (host: string, token: string, id: string) =>\n fetchUrl(`${host}/api/usergroups/${id}`, {\n method: 'DELETE',\n additionalHeaders: {\n Authorization: `Bearer ${token}`,\n },\n }).pipe(tap((res) => console.log('deleted account', res)));\n\nexport { fetchUserGroups, updateUserGroupsForUser, createUserGroup, updateUserGroups, deleteUserGroup };\n","import { Button, IconButton } from '@material-ui/core';\nimport ControlPointIcon from '@material-ui/icons/ControlPoint';\nimport DeleteForeverIcon from '@material-ui/icons/DeleteForever';\nimport EditIcon from '@material-ui/icons/Edit';\nimport React from 'react';\n\nconst AddButton = ({ onExecute }) => (\n
\n \n
\n);\n\nconst EditButton = ({ onExecute }) => (\n \n \n \n);\n\nconst DeleteButton = ({ onExecute }) => (\n \n \n \n);\n\nconst commandComponents = {\n add: AddButton,\n edit: EditButton,\n delete: DeleteButton,\n // commit: CommitButton,\n // cancel: CancelButton,\n};\n\nconst Command = ({ id, onExecute }) => {\n const CommandButton = commandComponents[id];\n\n return ;\n};\n\nexport { AddButton, EditButton, DeleteButton, Command };\n","import { DataTypeProvider, DataTypeProviderProps } from '@devexpress/dx-react-grid';\nimport { Tooltip, Typography, Zoom } from '@material-ui/core';\nimport React from 'react';\n\nexport const DefaultColumnsFormatter = ({ value }) => {\n if (!value) return null;\n\n return (\n \n \n {value}\n \n \n );\n};\n\nexport const DefaultColumnsTypeProvider: React.ComponentType = (\n props: DataTypeProviderProps,\n) => ;\n","import { Button, DialogActions } from '@material-ui/core';\nimport React from 'react';\nimport { ActionsButtonsProps } from './types';\n\nconst ActionsButtons = ({\n cancelButtonText,\n confirmButtonText,\n onCancel,\n onSubmit,\n isEditing,\n}: ActionsButtonsProps) => {\n return (\n \n \n \n {isEditing ? 'Update' : confirmButtonText}\n \n \n );\n};\n\nexport default ActionsButtons;\n","import React from 'react';\nimport { Dialog as MUDialog, DialogContent, DialogContentText, DialogTitle } from '@material-ui/core';\n\nconst Dialog = (props) => {\n const { dialogId, title, message, showDialog, onConfirm, onCancel } = props;\n\n return (\n \n {title && {title}}\n {message && (\n \n {message}\n \n )}\n {props.children}\n \n );\n};\n\nexport default Dialog;\n","import React from 'react';\nimport ActionsButtons from './ActionsButtons';\nimport Dialog from './Dialog';\nimport { DeleteDialogProps } from './types';\n\nconst DeleteDialog = ({ selectedRow, showDialog, closeDialog, handleDelete }: DeleteDialogProps) => {\n return (\n \n closeDialog()}\n onSubmit={() => handleDelete(selectedRow[0])}\n />\n \n );\n};\n\nexport default DeleteDialog;\n","import { TableFilterRow } from '@devexpress/dx-react-grid-material-ui';\nimport { FormControl, Input, InputLabel, MenuItem, Select, TableCell } from '@material-ui/core';\nimport React from 'react';\n\nexport const InputFilterCell = ({ filter, onFilter, column }) => (\n \n \n onFilter(e.target.value ? { value: e.target.value, operation: 'contains', columnType: column.type } : null)\n }\n placeholder=\"search...\"\n inputProps={{\n style: { textAlign: 'right', height: 'inherit' },\n min: 1,\n max: 4,\n }}\n />\n \n);\n\nexport const BooleanFilterCell = ({ filter, onFilter, column }) => (\n \n \n \n Select\n \n \n onFilter(e.target.value ? { value: e.target.value, operation: 'contains', columnType: column.type } : null)\n }\n >\n All\n Yes\n No\n \n \n \n);\n\nexport const FilterCellRow = (props) => {\n const { column } = props;\n\n if (column.type === 'Boolean') {\n return ;\n }\n if (\n column.type === 'Text' ||\n column.type === 'SingleChoice' ||\n column.type === 'MultiChoice' ||\n column.type === 'MultiText'\n ) {\n return ;\n }\n\n return ;\n};\n\nconst metadataFilterService = [\n {\n type: 'SingleChoice',\n predicate: (value, filter, row) => {\n const { columnName } = filter;\n\n if (!row.metadata || !row.metadata[columnName]) return false;\n\n return row.metadata[columnName].toLowerCase().includes(filter.value.toLowerCase());\n },\n },\n {\n type: 'Text',\n predicate: (value, filter, row) => {\n const { columnName } = filter;\n\n if (!row.metadata || !row.metadata[columnName]) return false;\n\n return row.metadata[columnName].toLowerCase().includes(filter.value.toLowerCase());\n },\n },\n {\n type: 'MultiChoice',\n predicate: (value, filter, row) => {\n const { columnName } = filter;\n\n if (!row.metadata || !row.metadata[columnName]) return false;\n\n const regex = new RegExp(filter.value.toLowerCase(), 'g');\n const arrayToLowerCase = row.metadata[columnName].map((item) => item.toLowerCase());\n const result = regex.test(arrayToLowerCase);\n\n return result;\n },\n },\n {\n type: 'MultiText',\n predicate: (value, filter, row) => {\n const { columnName } = filter;\n\n if (!row.metadata || !row.metadata[columnName]) return false;\n\n const regex = new RegExp(filter.value.toLowerCase(), 'g');\n const arrayToLowerCase = row.metadata[columnName].map((item) => item.toLowerCase());\n const result = regex.test(arrayToLowerCase);\n\n return result;\n },\n },\n {\n type: 'Boolean',\n predicate: (value, filter, row) => {\n const { columnName } = filter;\n\n if (!row.metadata || !row.metadata[columnName]) return false;\n\n let result;\n const myBooleanValue = filter.value === 'Yes';\n\n if (filter) {\n if (filter.value) {\n result = row.metadata[columnName] === myBooleanValue;\n } else {\n result = false;\n }\n }\n\n return result;\n },\n },\n];\n\nexport const filterRules = (metadata) => {\n if (metadata) {\n return metadataFilterService.map((item) => {\n let result = {};\n\n metadata.forEach((meta) => {\n if (item.type === meta.type) {\n result = {\n ...item,\n columnName: meta.key,\n };\n }\n });\n\n return result;\n });\n } else {\n return [];\n }\n};\n","import { Column, DataTypeProvider, DataTypeProviderProps } from '@devexpress/dx-react-grid';\nimport { Box, Chip, Tooltip, Typography, Zoom } from '@material-ui/core';\nimport React from 'react';\n\ninterface MetadataFormatterProps extends Column {\n type?: string;\n}\n\nexport const MetadataFormatter = ({\n column,\n row,\n value,\n}: {\n column: MetadataFormatterProps;\n row?: any;\n value: any;\n}) => {\n const { metadata } = row;\n const { name, type } = column;\n\n if (metadata && metadata[name] !== undefined) {\n switch (type) {\n case 'SingleChoice':\n case 'Text':\n return (\n \n \n {metadata[name]}\n \n \n );\n\n case 'MultiText':\n case 'MultiChoice':\n return (\n \n \n {metadata[name].join(', ')}\n \n \n );\n\n case 'Boolean':\n return (\n \n \n \n );\n\n default:\n return null;\n }\n }\n\n return null;\n};\n\nexport const MetadataTypeProvider: React.ComponentType = (props: DataTypeProviderProps) => (\n \n);\n","import {\n Box,\n Button,\n Chip,\n FormControl,\n FormControlLabel,\n InputLabel,\n MenuItem,\n Select,\n Switch,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport { Autocomplete } from '@material-ui/lab';\nimport React, { Fragment, useEffect, useRef, useState } from 'react';\nimport { MetadataEditorProps } from './types';\n\nconst MetadataEditor = ({ metadata, row, onChange, onListChange, onError }: MetadataEditorProps) => {\n const [list, setList] = useState([]);\n const [multiText, setMultiText] = useState('');\n const [error, setError] = useState({});\n const multiTextField = useRef(null);\n\n const handleMultiText = (key) => {\n setList([...list, multiText]);\n setMultiText('');\n multiTextField.current.focus();\n onListChange(key, [...list, multiText], true);\n };\n\n const handleChipDelete = (key, item) => {\n const newList = row.metadata[key].filter((value) => value !== item);\n setList(newList);\n onListChange(key, newList, true);\n };\n\n const handleChange = (e: any, regex: string) => {\n const re = new RegExp(regex);\n const { value, name } = e.target;\n\n if (re.test(value)) {\n setError({\n ...error,\n [name]: false,\n });\n } else {\n setError({\n ...error,\n [name]: true,\n });\n }\n\n onChange(e);\n };\n\n useEffect(() => {\n onError(Object.keys(error).some((v) => error[v] === true));\n }, [error]);\n\n useEffect(() => {\n metadata.map((meta) => {\n if (meta.type === 'MultiText') {\n if (!row.metadata) {\n setList((meta.default as string[]) || []);\n } else {\n setList(row.metadata[meta.key] || []);\n }\n }\n });\n }, []);\n\n return (\n <>\n {metadata &&\n metadata.map((item, i) => {\n const { type, label, key } = item;\n\n if (type === 'Text') {\n return (\n handleChange(e, item.regEx)}\n />\n );\n } else if (type === 'SingleChoice') {\n return (\n \n {label}\n \n {item.options.map((item, index) => (\n \n {item}\n \n ))}\n \n \n );\n } else if (type === 'Boolean') {\n return (\n \n }\n label={label}\n />\n );\n } else if (type === 'MultiChoice') {\n return (\n onListChange(key, values, true)}\n multiple\n renderInput={(props) => (\n \n )}\n style={{\n marginTop: 8,\n }}\n />\n );\n } else if (type === 'MultiText') {\n return (\n \n {list?.length > 0 && {label} list}\n {list?.map((item, i) => (\n \n handleChipDelete(key, item)}\n />\n \n ))}\n\n setMultiText(e.target.value)}\n error={error[key]}\n helperText={error[key] && item.regExError}\n InputProps={{\n endAdornment: (\n \n ),\n }}\n />\n \n );\n }\n\n return null;\n })}\n \n );\n};\n\nexport default MetadataEditor;\n","import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormGroup,\n Grid,\n InputAdornment,\n TextField,\n withStyles,\n} from '@material-ui/core';\nimport { FiberManualRecord } from '@material-ui/icons';\nimport { Autocomplete } from '@material-ui/lab';\nimport React, { useEffect, useState } from 'react';\nimport { passwordStrength } from '../../utils/Utils';\nimport MetadataEditor from './MetadataEditor';\nimport { PopupProps } from './types';\n\nconst NoBorderTextField = withStyles({\n root: {\n '& .MuiOutlinedInput-root': {\n 'color': 'rgba(0, 0, 0, 0.87); !important',\n '& fieldset': {\n border: 'none',\n },\n },\n },\n})(TextField);\n\nconst Popup: React.FC = ({\n row,\n rows,\n onChange,\n onListChange,\n onMetadataChange,\n onApplyChanges,\n onCancelChanges,\n open,\n title,\n users,\n isNew,\n defaultColumns,\n metadata,\n hasPassword,\n userGroupsDefaultSelected,\n}) => {\n const [error, setError] = useState(false);\n const [passwordStrengthColor, setPasswordStrengthColor] = useState('red');\n const [passwordValid, setPasswordValid] = useState(true);\n const [duplicatedId, setDuplicatedId] = useState(false);\n\n const endAdornment = (\n \n \n \n );\n\n const updatePasswordStrengthIndicator = (password: string) => {\n let strengthColor = 'red';\n\n switch (passwordStrength(password)) {\n case 0:\n strengthColor = 'red';\n break;\n case 1:\n strengthColor = 'yellow';\n break;\n case 2:\n strengthColor = 'orange';\n break;\n case 3:\n case 4:\n strengthColor = 'green';\n break;\n default:\n strengthColor = '';\n }\n\n setPasswordStrengthColor(strengthColor);\n };\n\n useEffect(() => {\n if (row.password !== row.repeatPassword) {\n setPasswordValid(false);\n setError(true);\n } else {\n setPasswordValid(true);\n setError(false);\n }\n }, [row.password, row.repeatPassword]);\n\n useEffect(() => {\n updatePasswordStrengthIndicator(row.password as string);\n }, [row.password]);\n\n const handleOnChange = (e) => {\n const found = rows.some((item) => item.id === e.target.value);\n setDuplicatedId(found);\n setError(found);\n\n onChange(e);\n };\n\n return (\n \n {title || ''}\n \n \n \n \n {isNew ? (\n \n ) : (\n \n )}\n\n {hasPassword && (\n <>\n \n {/* Must be 'new-password' to avoid autoComplete. https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Browser_compatibility */}\n \n \n )}\n\n {defaultColumns.map((column, i) => {\n if (column.name === 'userGroups' || column.name === 'users') {\n const defaultUsersSelection = [];\n\n userGroupsDefaultSelected &&\n userGroupsDefaultSelected.forEach((userId) => {\n const found = users.filter((user) => user.id === userId);\n defaultUsersSelection.push(...found);\n });\n\n const currentValues =\n row[column.name] != null\n ? users.filter((f) => row[column.name].includes(f.id) || row[column.name].includes(f.name))\n : column.name === 'userGroups' && userGroupsDefaultSelected\n ? defaultUsersSelection\n : [];\n\n return (\n a.name - b.name) || []}\n value={currentValues}\n getOptionSelected={(option, val) => option.name === val.name}\n getOptionLabel={(option) => option.name}\n onChange={(e, values) =>\n onListChange(\n column.name,\n values.map((v: any) => v.id),\n )\n }\n multiple\n renderInput={(props) => (\n \n )}\n />\n );\n } else {\n if (column.name !== 'id') {\n return (\n \n );\n } else {\n return null;\n }\n }\n })}\n \n \n {metadata && (\n \n \n \n \n \n )}\n \n \n \n \n \n \n \n );\n};\n\nexport default Popup;\n","import { addHours, differenceInMinutes, parseISO } from 'date-fns';\nimport { format, toDate, utcToZonedTime } from 'date-fns-tz';\nimport jp from 'jsonpath';\nimport { isArray } from 'lodash';\nimport { Condition, DescriptionField, Scenario, Status } from '../Scenarios/types';\nimport ReportProblemOutlinedIcon from '@material-ui/icons/ReportProblemOutlined';\nimport { ErrorRounded } from '@material-ui/icons';\n\nconst dataObjectToArray = (data: { [x: string]: any }) => {\n return Object.keys(data).map((key) => ({\n id: key,\n data: data[key],\n }));\n};\n\nconst getObjectProperty = (objectItem: any, property: string): any => {\n if (!objectItem) return null;\n\n const value = jp.query(objectItem, property);\n\n return value.length > 0 ? value[0] : null;\n};\n\nconst setObjectProperty = (objectItem: any, property: string, newValue: any) => {\n // Use jsonpath to apply in a deep path approach\n jp.apply(objectItem, `$.${property}`, () => newValue);\n};\n\nconst trimRecursive = (obj) => {\n for (const k in obj) {\n if (typeof obj[k] === 'string') obj[k] = obj[k].trim();\n else if (typeof obj[k] === 'object' && !(obj[k] instanceof Array)) trimRecursive(obj[k]);\n }\n\n return obj;\n};\n\nconst getDescriptions = (\n scenarioData: Scenario,\n descriptionFields: DescriptionField[] | undefined,\n timeZone: string | undefined,\n) => {\n const descriptions: { name: string; value: any }[] = [];\n\n if (!descriptionFields) {\n return descriptions;\n }\n\n for (const field of descriptionFields) {\n const value = getObjectProperty(scenarioData, field.field);\n\n // if (!value) {\n // console.warn(`Could not find field reference: ${field.field}!`);\n // continue;\n // }\n\n // Check if valid conditions met\n if (!field.condition || checkCondition(scenarioData, field.condition)) {\n // Formatting\n let formattedValue = value;\n\n // Formatting if date/time type\n if (value && field.dataType === 'dateTime') {\n let date: Date = parseISO(value);\n\n if (timeZone) {\n date = utcToTz(value, timeZone);\n }\n\n formattedValue = format(date, field.format ? field.format : 'yyyy-MM-dd HH:mm:ss');\n }\n\n descriptions.push({\n name: field.name,\n value: formattedValue,\n });\n }\n }\n\n return descriptions;\n};\n\n/**\n * Check if the property passed in the condition object is in the Scenario object\n * @param scenarioData Scenario Data\n * @param condition A object with a condition\n * @returns true or false\n */\nconst checkCondition = (scenarioData: Scenario, condition: Condition) => {\n let conditions: string[] = [];\n let isInverse = false;\n\n if (condition) {\n if (condition!.field.indexOf('!') === 0) {\n isInverse = true;\n }\n\n // If we have a value, check that it matches\n // If we didn't specify a value, just want to check if this field has data or not\n if (condition.value) {\n if (isArray(condition.value)) {\n conditions = [...condition.value];\n } else {\n conditions = [condition.value!];\n }\n\n return conditions.indexOf(getObjectProperty(scenarioData, condition!.field.replace('!', ''))) >= 0 === !isInverse;\n } else {\n return (getObjectProperty(scenarioData, condition!.field.replace('!', '')) != null) === !isInverse;\n }\n } else {\n return true;\n }\n};\n\n/**\n * Check if any of the listed properties are in the Scenario object\n * @param scenarioData Scenario Data\n * @param conditions Array of conditions\n * @returns true or false\n */\nconst checkConditions = (scenarioData: Scenario, conditions: Condition[]) => {\n let conditionsValue: string[] = [];\n let isInverse = false;\n const check = [];\n\n conditions.forEach((condition) => {\n if (condition) {\n if (condition!.field.indexOf('!') === 0) {\n isInverse = true;\n }\n\n const dtoProperty = getObjectProperty(scenarioData, condition!.field.replace('!', ''));\n\n // If we have a value, check that it matches\n // If we didn't specify a value, just want to check if this field has data or not\n if (condition.value) {\n if (isArray(condition.value)) {\n conditionsValue = [...condition.value];\n } else {\n conditionsValue = [condition.value!];\n }\n\n // * If checking field exists in the model, compare as normal *\n // * If checking field does NOT exist in the model, skip unless a boolean check equalling `false` *\n // This ensures we have backwards-compatibility where newly added DTO properties may not exist in older scenarioData's\n // but if it DOES exist, 'false' matches are explicitly checked.\n const values = conditionsValue\n .filter((val) => dtoProperty !== null || val !== 'false')\n .map((val) => (val === 'true' || val === 'false' ? val === 'true' : val));\n\n if (values.length > 0) {\n check.push(values.indexOf(dtoProperty) >= 0 === !isInverse);\n }\n } else {\n check.push((dtoProperty != null) === !isInverse);\n }\n } else {\n check.push(true);\n }\n });\n\n const finalCheck = check.filter((item) => item === false);\n\n return !(finalCheck.length > 0);\n};\n\nconst changeObjectProperty = (objectItem: any, property: string, intent: any) => {\n const properties = property.split('.');\n let value = objectItem;\n const body = [value];\n\n for (let i = 0; i < properties.length; i++) {\n value = value[properties[i]];\n body.push(value);\n }\n\n body[properties.length] = intent;\n\n for (let j = properties.length; j > 0; j--) {\n body[j - 1][properties[j - 1]] = body[j];\n }\n\n return body[0];\n};\n\nconst checkStatus = (scenario: Scenario, status: Status[], scenarioOLD?: boolean) => {\n let scenarioStatus;\n let progress;\n\n if (scenarioOLD) {\n scenarioStatus = getObjectProperty(scenario, 'lastJobStatus');\n progress = Number(getObjectProperty(scenario, 'lastJobProgress'));\n } else {\n scenarioStatus = getObjectProperty(scenario, 'status');\n progress = Number(getObjectProperty(scenario, 'progress'));\n }\n\n const currentStatus = {\n ...status.find((s) => s.name === scenarioStatus),\n progress: scenarioStatus === 'InProgress' ? progress : 0,\n };\n\n let result;\n\n if (!scenarioStatus) {\n result = {\n color: '#FD3F75',\n name: 'Error',\n message: 'Unknown Status',\n Icon: ErrorRounded,\n } as Status;\n } else {\n result = currentStatus;\n }\n\n return result;\n};\n\n/**\n * This converts the date provided to a specific IANA time zone\n * @param date The UTC date to convert. No time zone provided\n * @param timeZone The time zone to convert it to\n */\nconst utcToTz = (date: string, timeZone: string) => utcToZonedTime(`${date}Z`, timeZone);\n\nconst queryProp = (query: any) => {\n return typeof query === 'undefined' ? '' : query;\n};\n\nconst uniqueId = () => `${format(new Date(), 'yyyyMMddhhmmss')}-${s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`;\n\nconst s4 = () =>\n Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n\nexport const passwordStrength = (password?: string) => {\n let score = 0;\n\n if (!password) {\n return 0;\n }\n\n // Length 4 or less\n if (password.length < 5) {\n score += 3;\n // Length between 5 and 7\n } else if (password.length < 8) {\n score += 6;\n // Length between 8 and 15\n } else if (password.length < 16) {\n score += 12;\n // Length 16 or more\n } else {\n score += 18;\n }\n\n // At least one lower case letter\n if (password.match(/[a-z]/)) {\n score += 3;\n }\n\n // At least one upper case letter\n if (password.match(/[A-Z]/)) {\n score += 6;\n }\n\n // At least one number\n if (password.match(/\\d+/)) {\n score += 6;\n }\n\n // At least three numbers\n if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) {\n score += 6;\n }\n\n // At least one special character\n if (password.match(/.[!,@,#,$,%,^,&,*,?,_,~]/)) {\n score += 6;\n }\n\n // Aat least two special characters\n if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) {\n score += 8;\n }\n\n // Combinations both upper and lower case\n if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {\n score += 5;\n }\n\n // Both letters and numbers\n if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) {\n score += 5;\n }\n\n // Letters, numbers, and special characters\n if (password.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/)) {\n score += 5;\n }\n\n if (score < 16) {\n return 0;\n }\n\n if (score < 25) {\n return 1;\n }\n\n if (score < 35) {\n return 2;\n }\n\n if (score < 45) {\n return 3;\n }\n\n if (score > 45) {\n return 4;\n }\n\n return 0;\n};\n\nconst calcTimeDifference = (beginDate: string, endDate: string) => {\n const difference = differenceInMinutes(new Date(endDate), new Date(beginDate));\n const hour = Math.floor(difference / 60);\n const minute = Math.floor(difference - hour * 60);\n\n if (isNaN(difference)) {\n return '';\n }\n\n if (hour === 0 && minute === 0) {\n return '<1m';\n } else if (hour !== 0) {\n const minutes = minute - hour * 60;\n\n return `${hour}h ${minutes < 10 ? '0' : ''}${minutes}m`;\n } else {\n return `${minute}m`;\n }\n};\n\n/**\n * Convert and format data to from UTC to Zoned Time\n * @param date Date and Time\n * @param timeZone 'Australia/Brisbane'\n * @param dateTimeFormat 'Date time format. 'yyyy-MM-dd HH:mm:ss'\n */\nconst zonedTimeFromUTC = (date, timeZone, dateTimeFormat) => {\n date = `${date.replace('Z', '')}Z`;\n\n return format(utcToZonedTime(date, timeZone), dateTimeFormat);\n};\n\n/**\n * This the current utc time possibly offset by a number of hours. The returned string is without time zone\n * @param offsetHours An optional number of hours to offset the time\n */\nconst utcNow = (offsetHours?: number | null) =>\n format(addHours(utcToZonedTime(new Date(), 'UTC'), offsetHours == null ? 0 : offsetHours), 'yyyy-MM-dd HH:mm:ss');\n\n/**\n * This converts the date provided in a specific IANA time zone to UTC\n * @param date The date in a time zone to convert. No time zone provided\n * @param timeZone The time zone its in\n */\nconst tzToUtc = (date: string | Date, timeZone: string) =>\n date\n ? format(utcToZonedTime(toDate(date, { timeZone }), 'UTC'), 'yyyy-MM-dd HH:mm:ss')\n : format(utcToZonedTime(toDate(utcNow(), { timeZone }), 'UTC'), 'yyyy-MM-dd HH:mm:ss');\n\nconst toISOLocal = (d: Date) => {\n const z = (n) => `0${n}`.slice(-2);\n const zz = (n) => `00${n}`.slice(-3);\n let off = d.getTimezoneOffset();\n off = Math.abs(off);\n\n return `${d.getFullYear()}-${z(d.getMonth() + 1)}-${z(d.getDate())}T${z(d.getHours())}:${z(d.getMinutes())}:${z(\n d.getSeconds(),\n )}.${zz(d.getMilliseconds())}`;\n};\n\n/**\n * A recursive function that will add a children property into the object when it matches the current obj.value\n * @param obj Object where the recursive function will look for its property\n * @param name Name of the value to match the current loop\n * @param children object that will be added\n */\nconst recursive = (obj: any, name: string, children: any) => {\n if (obj.value === name && !obj.fetched) {\n obj.children = children;\n obj.fetched = true;\n }\n\n Array.isArray(obj.children) && obj.children.map((obj) => recursive(obj, name, children));\n};\n\nexport {\n dataObjectToArray,\n getObjectProperty,\n setObjectProperty,\n getDescriptions,\n trimRecursive,\n changeObjectProperty,\n checkCondition,\n checkConditions,\n checkStatus,\n utcToTz,\n queryProp,\n uniqueId,\n calcTimeDifference,\n zonedTimeFromUTC,\n tzToUtc,\n toISOLocal,\n recursive,\n};\n","import { Plugin, Template, TemplateConnector, TemplatePlaceholder } from '@devexpress/dx-react-core';\nimport React from 'react';\nimport { PopupEditingProps } from './types';\n\nconst PopupEditing = React.memo(\n ({\n popupComponent: Popup,\n title,\n allUsers,\n defaultColumns,\n metadata,\n onSave,\n hasPassword,\n userGroupsDefaultSelected,\n }: PopupEditingProps) => (\n \n \n \n \n ),\n);\n\nexport default PopupEditing;\n","import { DataTypeProvider, DataTypeProviderProps } from '@devexpress/dx-react-grid';\nimport { Tooltip, Typography, Zoom } from '@material-ui/core';\nimport React from 'react';\n\nexport const UsersFormatter = ({ value }) => {\n if (!value) return null;\n\n const list = value?.join(', ');\n\n return (\n \n \n {list}\n \n \n );\n};\n\nexport const UsersTypeProvider: React.ComponentType = (props: DataTypeProviderProps) => (\n \n);\n","import {\n EditingState,\n FilteringState,\n IntegratedFiltering,\n IntegratedSorting,\n SortingState,\n} from '@devexpress/dx-react-grid';\nimport {\n ColumnChooser,\n Grid,\n TableColumnVisibility,\n TableEditColumn,\n TableFilterRow,\n TableHeaderRow,\n Toolbar,\n VirtualTable,\n} from '@devexpress/dx-react-grid-material-ui';\nimport Paper from '@material-ui/core/Paper';\nimport React, { useEffect, useState } from 'react';\nimport { createAccount, deleteAccount, fetchAccounts, fetchUserGroups, updateAccount } from '../api';\nimport {\n Command,\n DefaultColumnsTypeProvider,\n DeleteDialog,\n FilterCellRow,\n filterRules,\n MetadataTypeProvider,\n Popup,\n PopupEditing,\n UsersTypeProvider,\n} from '../common/Table';\nimport { UserGroupProps, UserGroupsData } from '../UserGroups/types';\n\nconst DEFAULT_COLUMNS = [\n {\n title: 'Username',\n name: 'id',\n },\n {\n title: 'Name',\n name: 'name',\n },\n {\n title: 'Email',\n name: 'email',\n },\n {\n title: 'User Groups',\n name: 'userGroups',\n },\n];\n\nconst Accounts: React.FC = ({ host, token, userGroupsDefaultSelected, metadata }) => {\n const [rows, setRows] = useState([]);\n const [userGroups, setUserGroups] = useState[]>([]);\n const [deletedDialog, setDeletedDialog] = useState(false);\n const [deleteRow, setDeleteRow] = useState({});\n const [filteringColumnExtensions, setFilteringColumnExtensions] = useState([]);\n const getRowId = (row) => row.id;\n\n const metadataHeader = metadata\n ? metadata.reduce(\n (acc, cur) => [\n ...acc,\n {\n title: cur.label,\n type: cur.type,\n name: cur.key,\n },\n ],\n [],\n )\n : [];\n\n const [columns] = useState(DEFAULT_COLUMNS.concat(metadataHeader));\n const metadataColumnsArray = metadata ? metadata.reduce((acc, cur) => [...acc, cur.key], []) : [];\n const [metadataColumns] = useState(metadataColumnsArray);\n const [usersColumn] = useState(['userGroups']);\n const [defaultColumnsNameArray] = useState(DEFAULT_COLUMNS.map((column) => column.name));\n\n const fetchData = () => {\n fetchAccounts(host, token).subscribe(\n async (body: Record) => {\n setRows(body as any);\n },\n (error) => {\n console.error('AU Error: ', error);\n },\n );\n\n fetchUserGroups(host, token).subscribe(async (body) => {\n const userGroups = body.map((ug) => ({\n id: ug.id,\n name: ug.name,\n }));\n setUserGroups(userGroups);\n });\n };\n\n const commitChanges = ({ added, changed, deleted }) => {\n let changedRows;\n\n if (added) {\n const startingAddedId = rows.length > 0 ? rows[rows.length - 1].id + 1 : 0;\n\n changedRows = [\n ...rows,\n ...added.map((row, index) => ({\n id: startingAddedId + index,\n ...row,\n })),\n ];\n }\n if (changed) {\n changedRows = rows.map((row) => (changed[row.id] ? { ...row, ...changed[row.id] } : row));\n }\n if (deleted) {\n setDeletedDialog(true);\n const deletedSet = new Set(deleted);\n const selectedRow = rows.filter((row) => deletedSet.has(row.id));\n setDeleteRow(selectedRow);\n\n // return the same rows and let the handleDelete deal with the data, otherwise it will be undefined and crash with no rows\n changedRows = rows;\n }\n\n setRows(changedRows);\n };\n\n const handleSubmit = (row, isNew = false) => {\n if (isNew) {\n return (\n createAccount(host, token, { ...row }).subscribe(() => {\n fetchData();\n }),\n (error) => {\n console.log('Create Account: ', error);\n }\n );\n } else {\n return (\n updateAccount(host, token, { ...row }).subscribe(() => {\n fetchData();\n }),\n (error) => {\n console.log('Update Accounts: ', error);\n }\n );\n }\n };\n\n const handleDelete = (row) => {\n deleteAccount(host, token, row.id).subscribe(\n () => {\n fetchData();\n setDeletedDialog(false);\n },\n (error) => console.log(error),\n );\n };\n\n useEffect(() => {\n fetchData();\n\n if (metadata) {\n setFilteringColumnExtensions(filterRules(metadata));\n }\n }, []);\n\n return (\n \n setDeletedDialog(false)}\n handleDelete={handleDelete}\n />\n \n \n \n\n \n \n\n \n \n\n \n {metadataColumns && }\n \n\n \n \n\n \n \n \n \n \n \n \n );\n};\n\nexport { UserGroupProps, Accounts };\n","import { fetchAccount, fetchToken, resetPassword, updatePassword } from '../api';\nimport { Form, OtpInfo, Token, User } from './types';\n\nexport default class AuthService {\n host: string | string[];\n\n constructor(host: string | string[]) {\n this.host = host;\n }\n\n login = (\n form: Form,\n onOtpRequired: (otpInfo: OtpInfo) => void,\n onSuccess: (user: User, token: Token) => void,\n onError: (err: string) => void,\n ) => {\n if (Array.isArray(this.host)) {\n let firstResponse;\n const accessTokenList = [];\n\n this.host.forEach((host, index) => {\n fetchToken(host, {\n id: form.id,\n password: form.password,\n otp: form.otp,\n otpAuthenticator: form.otpAuthenticator,\n }).subscribe(\n (response) => {\n if ((response as OtpInfo).otpRequired && !form.otp) {\n onOtpRequired(response as OtpInfo);\n } else {\n fetchAccount(host, response.accessToken.token, 'me').subscribe(\n (user) => {\n const loggedInUser: User = {\n ...user,\n roles: user.roles ? user.roles.split(',').map((role: string) => role.trim()) : [],\n metadata: user.metadata ? user.metadata : {},\n };\n\n if (index === 0) {\n this.setSession(response, loggedInUser, form.rememberMe);\n firstResponse = response;\n\n if (onSuccess != null) {\n onSuccess(loggedInUser, response);\n }\n } else {\n accessTokenList.push({ ...response, host });\n this.setSession(firstResponse, loggedInUser, form.rememberMe, accessTokenList);\n }\n },\n (err) => {\n if (onError != null) {\n onError(err);\n }\n },\n );\n }\n },\n (error) => onError(error),\n );\n });\n } else {\n fetchToken(this.host, {\n id: form.id,\n password: form.password,\n otp: form.otp,\n otpAuthenticator: form.otpAuthenticator,\n }).subscribe(\n (response) => {\n if ((response as OtpInfo).otpRequired && !form.otp) {\n onOtpRequired(response as OtpInfo);\n } else {\n fetchAccount(this.host as string, response.accessToken.token, 'me').subscribe(\n (user) => {\n const loggedInUser: User = {\n ...user,\n roles: user.roles ? user.roles.split(',').map((role: string) => role.trim()) : [],\n metadata: user.metadata ? user.metadata : {},\n };\n\n this.setSession(response, loggedInUser, form.rememberMe);\n\n if (onSuccess != null) {\n onSuccess(loggedInUser, response);\n }\n },\n (err) => {\n if (onError != null) {\n onError(err);\n }\n },\n );\n }\n },\n (error) => onError(error),\n );\n }\n };\n\n requestResetPassword = (\n mailBody: string,\n emailAddress: string,\n onSuccess: () => void,\n onError: (err: string) => void,\n ) => {\n return resetPassword(this.host as string, mailBody, emailAddress).subscribe(\n (response) => {\n if (onSuccess != null) {\n onSuccess();\n }\n },\n (error) => onError(error),\n );\n };\n\n confirmResetPassword = (\n token: string,\n newPassword: string,\n onSuccess: () => void,\n onError: (err: string) => void,\n ) => {\n return updatePassword(this.host as string, token, newPassword).subscribe(\n (response) => {\n if (onSuccess != null) {\n onSuccess();\n }\n },\n (error) => onError(error),\n );\n };\n\n // Get user details in local storage\n getSession = () => {\n const storage = localStorage.getItem('accessToken') != null ? localStorage : sessionStorage;\n const userStorage = storage.getItem('user');\n const accessTokenList = storage.getItem('accessTokenList');\n\n return {\n accessToken: storage.getItem('accessToken'),\n refreshToken: storage.getItem('refreshToken'),\n user: userStorage ? JSON.parse(userStorage) : null,\n expiration: storage.getItem('expiration'),\n accessTokenList: accessTokenList ? JSON.parse(accessTokenList) : null,\n };\n };\n\n // Sets user details in localStorage\n setSession = (authResult: Token, user: User, useLocalStorage: boolean, list?: any) => {\n // Set the time that the access token will expire at\n // const expiresAt = JSON.stringify(authResult.expiresIn * 1000 + new Date().getTime());\n const storage = useLocalStorage ? localStorage : sessionStorage;\n\n storage.setItem('accessToken', authResult.accessToken.token);\n\n storage.setItem('refreshToken', authResult.refreshToken.token);\n\n storage.setItem('user', JSON.stringify(user));\n\n storage.setItem('expiration', authResult.accessToken.expiration);\n\n if (list) {\n storage.setItem('accessTokenList', JSON.stringify(list));\n }\n };\n\n // checks if the user is authenticated\n isAuthenticated = (): boolean => {\n const storage = localStorage.getItem('accessToken') != null ? localStorage : sessionStorage;\n const expirationStorage = storage.getItem('expiration');\n const accessToken = storage.getItem('accessToken');\n\n if (expirationStorage && accessToken) {\n // Check whether the current time is past the\n // access token's expiry time (in UTC, but once it goes into new Date() it will be converted to local time)\n const expiresAt = new Date(expirationStorage);\n const now = new Date();\n // Get and check against UTC date\n // const nowUtc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);\n\n return now < expiresAt;\n }\n\n return false;\n };\n\n // removes user details from localStorage\n logout = () => {\n const storage = localStorage.getItem('accessToken') != null ? localStorage : sessionStorage;\n // Clear access token and ID token from local storage\n\n storage.removeItem('accessToken');\n storage.removeItem('refreshToken');\n storage.removeItem('user');\n storage.removeItem('expiration');\n storage.removeItem('accessTokenList');\n };\n}\n","import { createTheme } from '@material-ui/core/styles';\n\nconst DHITheme = createTheme({\n palette: {\n primary: {\n main: '#0B4566', // DHI Primary color\n },\n secondary: {\n main: '#3d6079', // Automatically generated secondary color\n },\n },\n});\n\nexport default DHITheme;\n","import { makeStyles } from '@material-ui/core/styles';\nimport { WithStylesOptions } from '@material-ui/styles/withStyles';\n\nconst styles = () => ({\n root: {\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n height: '100%',\n },\n labels: { 'fontSize': 14, '& label': { fontSize: 14 } },\n rememberMe: { float: 'left', marginTop: 12 },\n rememberMeLink: { marginRight: 15 },\n submit: {\n float: 'right',\n marginTop: 15,\n display: 'flex',\n alignItems: 'center',\n },\n button: {\n marginRight: 15,\n },\n shrink: {\n backgroundColor: '#FFF',\n paddingLeft: 5,\n paddingRight: 5,\n },\n});\n\nconst useStyles = makeStyles(styles as any, { withTheme: true } as WithStylesOptions<{}>);\n\nexport default useStyles;\n","import {\n Button,\n Checkbox,\n CircularProgress,\n FormControl,\n FormControlLabel,\n InputLabel,\n MenuItem,\n Select,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport Alert from '@material-ui/lab/Alert';\nimport React, { useEffect, useState } from 'react';\nimport AuthService from '../AuthService';\nimport LoginFormProps from './types';\nimport useStyles from './useStyles';\n\nconst LoginForm = (props: LoginFormProps) => {\n const {\n userNamePlaceholder = 'Username',\n passwordPlaceholder = 'Password',\n host,\n onSuccess,\n onError,\n showRememberMe,\n onResetPassword,\n showResetPassword,\n rememberMeLabelText = 'Remember me?',\n resetPasswordLabelText = 'Reset password',\n loginButtonText = 'Login',\n backButtonText = 'Back',\n textFieldVariant = 'outlined',\n otpAuthPlaceholder = 'Please enter One Time Password',\n } = props;\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n const [twoFA, setTwoFA] = useState(false);\n const [otpAuthenticatorIds, setOtpAuthenticatorIds] = useState([]);\n const [form, setForm] = useState({\n id: '',\n password: '',\n rememberMe: showRememberMe,\n otpAuthenticator: null,\n otp: null,\n });\n const classes = useStyles();\n const auth = new AuthService(host);\n const validate = () => form.id && form.password;\n\n const handleChange = (name: string, value: string | boolean) => {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n setForm({ ...form, [name]: value });\n };\n\n const handleSubmit = (e: { preventDefault: () => void }) => {\n e.preventDefault();\n setError(false);\n\n if (validate()) {\n setLoading(true);\n }\n\n if (twoFA && form.otp === null) {\n setError(true);\n }\n\n auth.login(\n form,\n (otpInfo) => {\n setTwoFA(otpInfo.otpRequired);\n setOtpAuthenticatorIds(otpInfo.otpAuthenticatorIds);\n setLoading(false);\n },\n (user, token) => {\n console.log('login success');\n setLoading(false);\n\n if (onSuccess != null) {\n onSuccess(user, token);\n }\n },\n (error) => {\n console.log('login error');\n setLoading(false);\n setError(true);\n\n if (onError != null) {\n onError(error);\n }\n },\n );\n };\n\n const handleBack = () => {\n setTwoFA(false);\n setError(false);\n\n setForm({\n ...form,\n otpAuthenticator: null,\n otp: null,\n });\n };\n\n const handleDefaultAuthenticator = () => {\n setForm({\n ...form,\n otpAuthenticator: otpAuthenticatorIds[0] || null,\n });\n };\n\n useEffect(() => {\n handleDefaultAuthenticator();\n }, [otpAuthenticatorIds]);\n\n return (\n
\n {error && (\n {`Username ${\n twoFA ? 'or One Time Password is invalid' : 'and/or password is invalid'\n }`}\n )}\n\n {twoFA ? (\n <>\n {otpAuthenticatorIds.length > 1 && (\n <>\n Please select One Time Password authenticator\n \n \n Authenticator\n \n handleChange('otpAuthenticator', e.target.value as string)}\n >\n {otpAuthenticatorIds?.map((item, index) => (\n \n {item}\n \n ))}\n \n \n \n )}\n handleChange('otp', e.target.value)}\n label={otpAuthPlaceholder}\n error={error}\n variant={textFieldVariant}\n />\n \n ) : (\n <>\n handleChange('id', e.target.value)}\n label={userNamePlaceholder}\n variant={textFieldVariant}\n />\n handleChange('password', e.target.value)}\n label={passwordPlaceholder}\n variant={textFieldVariant}\n />\n \n )}\n
\n {showRememberMe && (\n handleChange('rememberMe', e.target.checked)}\n />\n }\n label={{rememberMeLabelText}}\n />\n )}\n
\n
\n {showResetPassword && (\n {\n onResetPassword(true);\n }\n : undefined\n }\n >\n {resetPasswordLabelText}\n \n )}\n {twoFA && (\n \n )}\n\n \n
\n \n );\n};\n\nexport { LoginFormProps, LoginForm };\n","import { makeStyles } from '@material-ui/core/styles';\nimport { WithStylesOptions } from '@material-ui/styles/withStyles';\n\nconst styles = () => ({\n resetBox: {\n display: 'flex',\n marginTop: 15,\n alignItems: 'center',\n justifyContent: 'flex-end',\n },\n messages: {\n flex: 1,\n marginTop: 15,\n },\n labels: { 'fontSize': 14, '& label': { fontSize: 14 } },\n backButton: { margin: '0 15px' },\n});\n\nconst useStyles = makeStyles(styles as any, { withTheme: true } as WithStylesOptions<{}>);\n\nexport default useStyles;\n","import { Button, CircularProgress, TextField, Typography } from '@material-ui/core';\nimport { Alert, AlertTitle } from '@material-ui/lab';\nimport React, { useState } from 'react';\nimport AuthService from '../AuthService';\nimport ResetPasswordFormProps from './types';\nimport useStyles from './useStyles';\n\nconst ResetPasswordForm = (props: ResetPasswordFormProps) => {\n const {\n host,\n mailTemplate,\n onResetPassword,\n onBackToLogin,\n userNamePlaceholder = 'Email Address',\n resetPasswordButtonText = 'Reset Password',\n errorText = 'The has been an error sending your password reset request. Please contact support if this problem continues.',\n successText = 'Your password reset request has been sent to the above email address.',\n textFieldVariant,\n } = props;\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n const [success, setSuccess] = useState(false);\n const [form, setForm] = useState({\n emailAddress: '',\n });\n const classes = useStyles();\n const auth = new AuthService(host);\n const validate = () => form.emailAddress;\n const handleChange = (name: string, value: string) => setForm({ ...form, [name]: value });\n\n const handleSubmit = (e: { preventDefault: () => void }) => {\n e.preventDefault();\n\n if (validate()) {\n setLoading(true);\n\n auth.requestResetPassword(\n mailTemplate,\n form.emailAddress,\n () => {\n if (onResetPassword) onResetPassword();\n\n setError(false);\n setSuccess(true);\n setLoading(false);\n },\n (err) => {\n console.log(err);\n setLoading(false);\n setSuccess(false);\n setError(true);\n },\n );\n }\n };\n\n return (\n <>\n
\n handleChange('emailAddress', e.target.value)}\n label={userNamePlaceholder}\n variant={textFieldVariant as any}\n />\n\n
\n \n \n
\n
\n {success && {successText}}\n {error && {errorText}}\n
\n \n \n );\n};\n\nexport { ResetPasswordFormProps, ResetPasswordForm };\n","import { makeStyles } from '@material-ui/core/styles';\nimport { WithStylesOptions } from '@material-ui/styles/withStyles';\n\nconst styles = () => ({\n resetBox: {\n display: 'flex',\n marginTop: 15,\n alignItems: 'center',\n justifyContent: 'flex-end',\n },\n messages: {\n flex: 1,\n marginTop: 15,\n },\n labels: { 'fontSize': 14, '& label': { fontSize: 14 } },\n backButton: { margin: '0 15px' },\n});\n\nconst useStyles = makeStyles(styles as any, { withTheme: true } as WithStylesOptions<{}>);\n\nexport default useStyles;\n","import { Button, CircularProgress, TextField, Typography } from '@material-ui/core';\nimport { Alert, AlertTitle } from '@material-ui/lab';\nimport React, { useState } from 'react';\nimport AuthService from '../AuthService';\nimport UpdatePasswordFormProps from './types';\nimport useStyles from './useStyles';\n\nconst UpdatePasswordForm = (props: UpdatePasswordFormProps) => {\n const {\n host,\n token,\n onPasswordUpdated,\n onBackToLogin,\n newPasswordPlaceholder = 'New Password',\n confirmPasswordPlaceholder = 'Confirm New Password',\n updatePasswordButtonText = 'Reset Password',\n errorText = 'The has been an error resetting your password. Please contact support if this problem continues.',\n successText = 'Your password has been reset successfully.',\n textFieldVariant,\n } = props;\n const [loading, setLoading] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [error, setError] = useState(false);\n const [success, setSuccess] = useState(false);\n const [form, setForm] = useState({\n password: '',\n confirmPassword: '',\n });\n const classes = useStyles();\n const auth = new AuthService(host);\n const validate = () => form.password !== '' && form.confirmPassword !== '' && form.password === form.confirmPassword;\n const handleChange = (name: string, value: string) => setForm({ ...form, [name]: value });\n\n const handleSubmit = (e: { preventDefault: () => void }) => {\n e.preventDefault();\n\n setSubmitted(true);\n\n if (validate()) {\n setLoading(true);\n\n auth.confirmResetPassword(\n token,\n form.password,\n () => {\n if (onPasswordUpdated) onPasswordUpdated();\n\n setError(false);\n setSuccess(true);\n setLoading(false);\n },\n (err) => {\n console.log(err);\n setLoading(false);\n setSuccess(false);\n setError(true);\n },\n );\n }\n };\n\n const passwordsMatch = () =>\n !submitted || (form.password !== '' && form.confirmPassword !== '' && form.password === form.confirmPassword);\n\n return (\n <>\n
\n handleChange('password', e.target.value)}\n label={newPasswordPlaceholder}\n variant={textFieldVariant as any}\n />\n handleChange('confirmPassword', e.target.value)}\n label={confirmPasswordPlaceholder}\n variant={textFieldVariant as any}\n />\n\n
\n \n \n
\n
\n {success && {successText}}\n {error && {errorText}}\n
\n \n \n );\n};\n\nexport { UpdatePasswordFormProps, UpdatePasswordForm };\n","import { ThemeProvider } from '@material-ui/styles';\nimport React, { useState } from 'react';\nimport DHITheme from '../../theme';\nimport { LoginForm } from '../LoginForm/LoginForm';\nimport { ResetPasswordForm } from '../ResetPasswordForm/ResetPasswordForm';\nimport { UpdatePasswordForm } from '../UpdatePasswordForm/UpdatePasswordForm';\nimport LoginProps from './types';\n\nconst Login = (props: LoginProps) => {\n const {\n host,\n showRememberMe,\n showResetPassword,\n showUpdatePassword,\n resetPasswordMailTemplate,\n resetPasswordToken,\n textFieldVariant,\n translations,\n onBackToLogin,\n onSuccess,\n onError,\n } = props;\n const [showingResetPassword, setShowingResetPassword] = useState(false);\n\n const togglePasswordResetForm = (value: boolean) => {\n setShowingResetPassword(value);\n };\n\n return (\n \n {showingResetPassword && (\n togglePasswordResetForm(value)}\n userNamePlaceholder={translations?.updatePasswordEmailPlaceholder}\n resetPasswordButtonText={translations?.resetPasswordButton}\n errorText={translations?.resetPasswordError}\n textFieldVariant={textFieldVariant}\n />\n )}\n {showUpdatePassword && (\n \n )}\n {!showingResetPassword && !showUpdatePassword && (\n togglePasswordResetForm(value)}\n textFieldVariant={textFieldVariant}\n userNamePlaceholder={translations?.userNamePlaceholder}\n passwordPlaceholder={translations?.passwordPlaceholder}\n loginButtonText={translations?.loginButton}\n rememberMeLabelText={translations?.rememberMeLabel}\n resetPasswordLabelText={translations?.resetPasswordLabel}\n />\n )}\n
\n
\n );\n};\n\nexport { LoginProps, Login };\n","// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","import { Grid, Typography } from '@material-ui/core';\nimport Skeleton from '@material-ui/lab/Skeleton';\nimport { format } from 'date-fns';\nimport React, { useEffect, useState } from 'react';\nimport { fetchTimeseriesFullNames, fetchTimeseriesValues } from '../../api';\nimport { BaseChart } from '../../ECharts/BaseChart';\nimport DHITheme from '../../theme';\nimport { recursive } from '../../utils/Utils';\nimport TreeView from '../TreeView/TreeView';\nimport { TimeseriesStyles } from './styles';\nimport { TimeseriesProps } from './types';\n\nconst NAME_TEXT_STYLE = {\n padding: 12,\n fontFamily: '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n fontSize: 15,\n};\n\nconst DATA_ZOOM = [\n {\n type: 'inside',\n },\n {\n type: 'slider',\n height: 40,\n bottom: 10,\n labelFormatter: (value) => format(value, 'dd MMM yyyy'),\n },\n];\n\nconst GRID = {\n bottom: 100,\n top: 80,\n};\n\nconst TEXT_STYLE = {\n width: '100%',\n color: DHITheme.palette.primary.main,\n fontWeight: 'bold',\n fontSize: window.innerHeight >= 1200 ? 24 : 18,\n fontFamily: '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n};\n\nconst AXIS_LABEL = {\n fontFamily: '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n fontSize: 12,\n color: DHITheme.palette.primary.main,\n};\n\nconst X_AXIS = {\n name: 'Time',\n nameLocation: 'center',\n nameTextStyle: NAME_TEXT_STYLE,\n min: 'dataMin',\n axisLabel: AXIS_LABEL,\n};\n\nconst Y_AXIS = {\n name: 'Bench Levels',\n nameLocation: 'center',\n nameTextStyle: NAME_TEXT_STYLE,\n axisLabel: AXIS_LABEL,\n};\n\nconst LEGEND_STYLE = {\n backgroundColor: 'rgba(255,255,255,1)',\n padding: 8,\n borderRadius: 5,\n shadowColor: 'rgba(0, 0, 0, 0.25)',\n shadowBlur: 5,\n shadowOffsetX: 3,\n shadowOffsetY: 3,\n};\n\nconst TimeseriesExplorer = ({\n token,\n dataSources,\n title,\n legendPosition = 'right',\n legendPositionOffset,\n}: TimeseriesProps) => {\n const classes = TimeseriesStyles();\n const [list, setList] = useState([]);\n const [loading, setLoading] = useState(false);\n const [options, setOptions] = useState({\n title: {\n text: title,\n left: 'center',\n textStyle: TEXT_STYLE,\n },\n grid: GRID,\n dataZoom: DATA_ZOOM,\n legend: {\n ...LEGEND_STYLE,\n top: legendPosition === 'left' ? 90 : 35,\n left: legendPosition === 'left' ? legendPositionOffset ?? 150 : undefined,\n right: legendPosition === 'right' ? legendPositionOffset ?? 60 : undefined,\n align: legendPosition,\n },\n xAxis: X_AXIS,\n yAxis: Y_AXIS,\n tooltip: {},\n series: [],\n });\n\n const fetchTopLevelTreeView = (group = '') => {\n fetchTimeseriesFullNames(dataSources, token, group.replace(/\\/$/, '')).subscribe(\n (res) => {\n const data = res.map((d) => ({\n value: d,\n label: d,\n topLevel: true,\n ...(d.slice(-1) === '/' && {\n children: [\n {\n value: '',\n label: '',\n },\n ],\n }),\n }));\n\n setList(data);\n },\n (err) => console.log(err),\n );\n };\n\n const addChildren = (childrenList, group) => {\n return childrenList.map((child) => ({\n value: child,\n label: child.replace(group, ''),\n ...(child.slice(-1) === '/' && {\n children: [\n {\n value: '',\n label: '',\n },\n ],\n }),\n }));\n };\n\n const handleOnExpand = (group) => {\n setLoading(true);\n\n if (group.slice(-1) === '/' || group === '') {\n fetchTimeseriesFullNames(dataSources, token, group.replace(/\\/$/, '')).subscribe(\n (res) => {\n const children = addChildren(res, group);\n list.map((item) => recursive(item, group, children));\n\n setList(list);\n setLoading(false); // in place to forceUpdate after the recursive fn updates the object.\n },\n (error) => console.log(error),\n );\n }\n };\n\n const handleOnCheck = (ids) => {\n dataSources[0].ids = ids;\n\n fetchTimeseriesValues(dataSources, token).subscribe((res) => {\n const series = res.map((item) => ({\n name: item.id.substring(item.id.lastIndexOf('/') + 1),\n data: item.data.map((d) => [new Date(d[0]).getTime(), d[1]]),\n type: 'line',\n symbol: 'diamond',\n }));\n\n const updatedOptions = {\n ...options,\n xAxis: {\n ...options.xAxis,\n axisLabel: {\n ...options.xAxis.axisLabel,\n formatter: (value) => format(value, 'dd MMM yyyy'),\n },\n },\n yAxis: {\n ...options.yAxis,\n axisLabel: {\n ...options.yAxis.axisLabel,\n formatter: (value) => value,\n },\n },\n legend: {\n ...options.legend,\n data: series.map((item) => item.name),\n },\n series,\n };\n\n setOptions(updatedOptions);\n });\n };\n\n useEffect(() => {\n fetchTopLevelTreeView();\n }, []);\n\n return (\n
\n \n \n handleOnExpand(expand)}\n onChecked={(checked) => handleOnCheck(checked)}\n />\n \n \n {options.series.length > 0 ? (\n window.innerHeight * 0.4}\n options={options}\n notMerge\n />\n ) : (\n <>\n \n No Timeseries Selected\n \n \n \n \n )}\n \n \n
\n );\n};\n\nexport { TimeseriesExplorer, TimeseriesProps };\n"],"sourceRoot":""}