{"version":3,"file":"shared.rbundle.js","mappings":"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","sources":["webpack://moveit-react/./src/shared/api/commUtil.ts","webpack://moveit-react/./src/shared/api/services/ApiService.ts","webpack://moveit-react/./src/shared/api/services/ContactsApiService.ts","webpack://moveit-react/./src/shared/api/services/DownloadValidateApiService.ts","webpack://moveit-react/./src/shared/api/services/FoldersApiService.ts","webpack://moveit-react/./src/shared/api/services/OrgsApiService.ts","webpack://moveit-react/./src/shared/api/services/PackagesApiService.ts","webpack://moveit-react/./src/shared/api/services/PublicDownloadLinkApiService.ts","webpack://moveit-react/./src/shared/api/services/SettingsApiService.ts","webpack://moveit-react/./src/shared/api/services/TokenService.ts","webpack://moveit-react/./src/shared/api/services/UploadApiService.ts","webpack://moveit-react/./src/shared/api/services/UsersApiService.ts","webpack://moveit-react/./src/shared/api/services/index.ts","webpack://moveit-react/./src/shared/components/ApplicationLinkButton.tsx","webpack://moveit-react/./src/shared/components/Beltline.tsx","webpack://moveit-react/./src/shared/components/CommonModalFooterControls.tsx","webpack://moveit-react/./src/shared/components/CommonModalHeaderControls.tsx","webpack://moveit-react/./src/shared/components/ContentSectionWrapper.tsx","webpack://moveit-react/./src/shared/components/Control.tsx","webpack://moveit-react/./src/shared/components/DebouncedTextInput.tsx","webpack://moveit-react/./src/shared/components/ErrorAlert.tsx","webpack://moveit-react/./src/shared/components/FeatureGroup.tsx","webpack://moveit-react/./src/shared/components/FeatureGroupBoxedIconTitle.tsx","webpack://moveit-react/./src/shared/components/FeatureGroupIconTitle.tsx","webpack://moveit-react/./src/shared/components/FeatureGroupNumericTitle.tsx","webpack://moveit-react/./src/shared/components/FormattedLocaleDate.tsx","webpack://moveit-react/./src/shared/components/FormikFieldGroup.tsx","webpack://moveit-react/./src/shared/components/LabelledControl.tsx","webpack://moveit-react/./src/shared/components/LabelledProgressBar.tsx","webpack://moveit-react/./src/shared/components/LoadingSpinner.tsx","webpack://moveit-react/./src/shared/components/MITransferTable.tsx","webpack://moveit-react/./src/shared/components/PageWrapper.tsx","webpack://moveit-react/./src/shared/components/WaitIndicator.tsx","webpack://moveit-react/./src/shared/components/WarningAlert.tsx","webpack://moveit-react/./src/shared/components/index.ts","webpack://moveit-react/./src/shared/constants.ts","webpack://moveit-react/./src/shared/services/HashService.ts","webpack://moveit-react/./src/shared/services/HelpUrlBuilderService.ts","webpack://moveit-react/./src/shared/services/index.ts","webpack://moveit-react/./src/shared/utils/applicationUtils.ts","webpack://moveit-react/./src/shared/utils/componentUtils.ts","webpack://moveit-react/./src/shared/utils/debugUtils.ts","webpack://moveit-react/./src/shared/utils/fileUtils.ts","webpack://moveit-react/./src/shared/utils/formattingUtils.ts","webpack://moveit-react/./src/shared/utils/index.ts"],"sourcesContent":["import { Token } from \"./services/Token\";\r\n\r\nexport function getApiUrl(baseUrl: string, relativeUrl: string): string {\r\n if (relativeUrl && !relativeUrl.startsWith(\"/\")) {\r\n relativeUrl = `/${relativeUrl}`;\r\n }\r\n\r\n return baseUrl + \"/api/v1\" + relativeUrl;\r\n}\r\n\r\nexport function getFormHeaders(): object {\r\n return { \"Content-Type\": \"application/x-www-form-urlencoded\" };\r\n}\r\n\r\nexport function getTokenHeaders(token: Token): object {\r\n return token ? { Authorization: `Bearer ${token.access_token}` } : {};\r\n}\r\n\r\n// Necessary to stop IE from caching repeated GET requests of non-static content\r\nexport function getNoCacheHeaders(): object {\r\n return { \"Cache-Control\": \"no-cache\", \"Pragma\": \"no-cache\", \"Expires\": 0 };\r\n}\r\n","import axios, { AxiosError, AxiosProgressEvent, AxiosRequestConfig } from \"axios\";\r\n\r\nimport { IApiService, ApiRequestOptions } from \"./IApiService\";\r\nimport { TokenService } from \"./TokenService\";\r\nimport { ITokenService } from \"./ITokenService\";\r\nimport { Token } from \"./Token\";\r\nimport { getApiUrl, getTokenHeaders, getNoCacheHeaders } from \"../commUtil\";\r\n\r\ninterface ApiError {\r\n title: string;\r\n errorCode: number;\r\n detail: string;\r\n}\r\n\r\nfunction isString(object: any): boolean {\r\n return typeof object === \"string\";\r\n}\r\n\r\nfunction isApiError(object: any): object is ApiError {\r\n return object && !isString(object) && \"detail\" in object;\r\n}\r\n\r\nexport class ApiService implements IApiService {\r\n private readonly baseUrl: string = \"\";\r\n private readonly tokenService: ITokenService;\r\n\r\n constructor(baseUrl: string, language: string = \"\") {\r\n this.baseUrl = baseUrl;\r\n\r\n if (this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl = this.baseUrl.substr(0, this.baseUrl.length - 1);\r\n }\r\n\r\n this.tokenService = TokenService.getInstance(baseUrl, language);\r\n }\r\n\r\n public get(url: string, params?: object, preventCache?: boolean): Promise {\r\n const doRequest = (token: Token): Promise => {\r\n const fullUrl = getApiUrl(this.baseUrl, url);\r\n const headers = Object.assign(\r\n {},\r\n preventCache ? getNoCacheHeaders() : {},\r\n getTokenHeaders(token)\r\n );\r\n return axios.get(fullUrl, { headers, params }).then((response) => response.data as T);\r\n };\r\n\r\n return this.doRequestWithToken(doRequest);\r\n }\r\n\r\n public post(\r\n url: string,\r\n data: any,\r\n headers?: object,\r\n options?: ApiRequestOptions\r\n ): Promise {\r\n const doRequest = (token: Token): Promise => {\r\n const fullUrl = getApiUrl(this.baseUrl, url);\r\n headers = Object.assign({}, headers, getTokenHeaders(token));\r\n return axios\r\n .post(fullUrl, data, getAxiosRequestConfig(headers, options))\r\n .then((response) => response.data as T);\r\n };\r\n\r\n return this.doRequestWithToken(doRequest);\r\n }\r\n\r\n public put(\r\n url: string,\r\n data: any,\r\n headers?: object,\r\n options?: ApiRequestOptions\r\n ): Promise {\r\n const doRequest = (token: Token): Promise => {\r\n const fullUrl = getApiUrl(this.baseUrl, url);\r\n headers = Object.assign({}, headers, getTokenHeaders(token));\r\n return axios\r\n .put(fullUrl, data, getAxiosRequestConfig(headers, options))\r\n .then((response) => response.data as T);\r\n };\r\n\r\n return this.doRequestWithToken(doRequest);\r\n }\r\n\r\n public delete(url: string, headers?: object, options?: ApiRequestOptions): Promise {\r\n const doRequest = (token: Token): Promise => {\r\n const fullUrl = getApiUrl(this.baseUrl, url);\r\n headers = Object.assign({}, headers, getTokenHeaders(token));\r\n return axios\r\n .delete(fullUrl, getAxiosRequestConfig(headers, options))\r\n .then((response) => response.data as T);\r\n };\r\n\r\n return this.doRequestWithToken(doRequest);\r\n }\r\n\r\n public signOut(): Promise {\r\n return this.tokenService.revokeToken();\r\n }\r\n\r\n public stopTokenRefresh(): void {\r\n this.tokenService.stopTokenRefresh();\r\n }\r\n\r\n public startTokenRefresh(): void {\r\n this.tokenService.startTokenRefresh();\r\n }\r\n\r\n private doRequestWithToken(requestFn: (token: Token) => Promise): Promise {\r\n const getTokenAndExecuteRequest = (forceRefresh: boolean): Promise => {\r\n return this.tokenService.getToken(forceRefresh).then(requestFn);\r\n };\r\n\r\n const handleError = (error: AxiosError): Promise => {\r\n if (error.response) {\r\n if (error.response.status === 401) {\r\n // This error typically means that our current token, while unexpired, has\r\n // become invalid, maybe because the server was restarted. Try refreshing\r\n // the token. If that doesn't work, a new token will be requested.\r\n return getTokenAndExecuteRequest(true);\r\n }\r\n\r\n // If we don't recognize the error, pass it on for higher level handling.\r\n if (isApiError(error.response.data)) {\r\n return Promise.reject((error.response.data as ApiError).detail);\r\n }\r\n }\r\n\r\n // If we can't get any specific detail from the error, reject with the error message,\r\n // or failing that, the error itself.\r\n return Promise.reject(error.message || error);\r\n };\r\n\r\n return getTokenAndExecuteRequest(false).catch(handleError);\r\n }\r\n}\r\n\r\nfunction getAxiosRequestConfig(headers?: object, options?: ApiRequestOptions): AxiosRequestConfig {\r\n const axiosUploadHander = createAxiosUploadProgressHandler(options?.onUploadProgress);\r\n return {\r\n headers,\r\n onUploadProgress: axiosUploadHander || axios.defaults.onUploadProgress,\r\n validateStatus: (options && options.validateStatus) || axios.defaults.validateStatus,\r\n cancelToken: (options && options.cancelToken) || axios.defaults.cancelToken,\r\n };\r\n}\r\n\r\nfunction createAxiosUploadProgressHandler(\r\n genericHandler: (e: ProgressEvent) => void\r\n): (progressHandler: AxiosProgressEvent) => void {\r\n return genericHandler\r\n ? (progressHandler: AxiosProgressEvent) => {\r\n genericHandler(progressHandler.event);\r\n }\r\n : null;\r\n}\r\n","import { ApiService } from \"./ApiService\";\r\nimport { IContactsApiService } from \"./IContactsApiService\";\r\nimport { ContactModel } from \"../models/ContactModel\";\r\nimport { PagedModel } from \"../models/PagedModel\";\r\n\r\nexport class ContactsApiService extends ApiService implements IContactsApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n getContacts(\r\n page?: number,\r\n perPage?: number,\r\n sortField?: \"name\" | \"email\",\r\n sortDirection?: \"ascending\" | \"descending\",\r\n searchString?: string,\r\n onBehalfOf?: string\r\n ): Promise> {\r\n return this.get>(\"contacts\", {\r\n page,\r\n perPage,\r\n sortField,\r\n sortDirection,\r\n searchString,\r\n onBehalfOf,\r\n });\r\n }\r\n}\r\n","import { ApiService } from \"./ApiService\";\r\nimport IDownloadValidateApiService from \"./IDownloadValidateApiService\";\r\nimport ValidationResponse from \"../models/DownloadValidationResponseModel\";\r\n\r\nexport default class DownloadValidateApiService extends ApiService\r\n implements IDownloadValidateApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public validateDownloadHash(\r\n hash: string,\r\n downloadId?: string,\r\n fileId?: string,\r\n logId?: string\r\n ): Promise {\r\n const requestUrl = \"/downloads/check\";\r\n let params:\r\n | { hash: string; downloadid: string }\r\n | { hash: string; fileid: string; logid: string };\r\n if (!!downloadId?.length) {\r\n // use downloadId\r\n params = { hash, downloadid: downloadId };\r\n } else {\r\n // use fileId and logId\r\n params = { hash, fileid: fileId, logid: logId };\r\n }\r\n return this.get(requestUrl, params);\r\n }\r\n}\r\n","import { ApiService } from \".\";\r\nimport { IFoldersApiService } from \"./IFoldersApiService\";\r\nimport { PagedModel } from \"../models/PagedModel\";\r\nimport { SimpleFolderModel } from \"../models/SimpleFolderModel\";\r\n\r\nexport class FoldersApiService extends ApiService implements IFoldersApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public getFolderList(\r\n nameFilter: string = \"\",\r\n pathFilter: string = \"\",\r\n page: number = 1,\r\n perPage: number = 25,\r\n sortField: \"Name\" | \"Type\" | \"Path\" = \"Path\",\r\n sortDirection: \"ascending\" | \"descending\" = \"ascending\"\r\n ): Promise> {\r\n return this.get>(\"folders\", {\r\n name: nameFilter,\r\n path: pathFilter,\r\n page,\r\n perPage,\r\n sortField,\r\n sortDirection,\r\n });\r\n }\r\n\r\n public getFolderDetails(id: string): Promise {\r\n const [folderId, path] = id.split(\"-\");\r\n const param = path ? \"?pathhash=\" + encodeURIComponent(path) : \"\";\r\n return this.get(`folders/${folderId}${param}`);\r\n }\r\n}\r\n","import { ApiService } from \".\";\r\nimport IOrgsApiService from \"./IOrgsApiService\";\r\nimport { PagedModel } from \"../models/PagedModel\";\r\nimport OrgKeyModel from \"../models/OrgKeyModel\";\r\nimport KeyRotationPassphraseModel from \"../models/KeyRotationPassphraseModel\";\r\nimport KeyRotationStatusModel from \"../models/KeyRotationStatusModel\";\r\nimport ScheduleModel from \"../models/ScheduleModel\";\r\nimport ReminderModel from \"../models/KeyRotationReminderModel\";\r\n\r\nexport default class OrgsApiService extends ApiService implements IOrgsApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public getPublicKeys(\r\n orgId: string,\r\n page: number = 1,\r\n perPage: number = 25,\r\n sortField: \"timestamp\",\r\n sortDirection: \"ascending\" | \"descending\" = \"descending\"\r\n ): Promise> {\r\n return this.get>(\r\n this.makeUrl(orgId, \"/keys\"),\r\n {\r\n page,\r\n perPage,\r\n sortField,\r\n sortDirection,\r\n },\r\n true\r\n );\r\n }\r\n\r\n public beginKeyRotationEstimate(orgId: string): Promise {\r\n return this.post(\r\n this.makeUrl(orgId, \"/keys/rotation/estimate\"),\r\n {}\r\n );\r\n }\r\n\r\n public removeKeyRotationEstimate(orgId: string): Promise {\r\n return this.delete(this.makeUrl(orgId, \"/keys/rotation/estimate\"));\r\n }\r\n\r\n public getKeyRotationPassphrase(orgId: string): Promise {\r\n return this.get(\r\n this.makeUrl(orgId, \"/keys/passphrase\"),\r\n {},\r\n true\r\n );\r\n }\r\n\r\n public validateKeyRotationPassphrase(orgId: string, passphrase: string): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/passphrase\"), { passphrase });\r\n }\r\n\r\n public getKeyRotationReminder(orgId: string): Promise {\r\n return this.get(this.makeUrl(orgId, \"/keys/reminder\"), {}, true);\r\n }\r\n\r\n public setKeyRotationReminder(orgId: string, reminderDate: Date): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/reminder\"), { reminderDate });\r\n }\r\n\r\n public beginKeyRotation(\r\n orgId: string,\r\n passphrase: string,\r\n schedule: ScheduleModel\r\n ): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/rotation\"), {\r\n passphrase,\r\n schedule,\r\n });\r\n }\r\n\r\n public pauseKeyRotation(orgId: string): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/rotation/pause\"), {});\r\n }\r\n\r\n public resumeKeyRotation(orgId: string): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/rotation/resume\"), {});\r\n }\r\n\r\n public setKeyRotationSchedule(\r\n orgId: string,\r\n schedule: ScheduleModel\r\n ): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/rotation/schedule\"), {\r\n schedule,\r\n });\r\n }\r\n\r\n public getKeyRotationStatus(orgId: string): Promise {\r\n return this.get(this.makeUrl(orgId, \"/keys/rotation\"), {}, true);\r\n }\r\n\r\n public removeKeyRotationStatus(orgId: string): Promise {\r\n return this.delete(this.makeUrl(orgId, \"/keys/rotation\"));\r\n }\r\n\r\n private makeUrl(orgId: string, endpoint?: string) {\r\n return `organizations/${orgId}${endpoint}`;\r\n }\r\n}\r\n","import { PackageRequirementsModel } from \"../models/PackageRequirementsModel\";\r\nimport { ApiService } from \"./ApiService\";\r\nimport { IPackagesApiService } from \"./IPackagesApiService\";\r\n\r\nexport class PackagesApiService extends ApiService implements IPackagesApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public getPackageRequirements(): Promise {\r\n return this.get(\"packages/requirements\");\r\n }\r\n}\r\n","import { PublicDownloadLinkModel } from \"../models/PublicDownloadLinkModel\";\r\nimport { PublicDownloadLinkRequestModel } from \"../models/PublicDownloadLinkRequestModel\";\r\nimport { ApiService } from \"./ApiService\";\r\nimport { IPublicDownloadLinkApiService } from \"./IPublicDownloadLinkApiService\";\r\n\r\nexport class PublicDownloadLinkApiService extends ApiService\r\n implements IPublicDownloadLinkApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public generatePublicDownloadLink(\r\n fileId: number,\r\n publicLinkParams: PublicDownloadLinkRequestModel\r\n ): Promise {\r\n return this.post(`files/${fileId}/publiclinks`, publicLinkParams);\r\n }\r\n\r\n public getPublicLinkInfo(\r\n fileId: number,\r\n publicLinkId: string\r\n ): Promise {\r\n return this.get(`files/${fileId}/publiclinks/${publicLinkId}`);\r\n }\r\n\r\n public deletePublicLink(fileId: number, publicLinkId: string): Promise {\r\n return this.delete(`files/${fileId}/publiclinks/${publicLinkId}`);\r\n }\r\n}\r\n","import { ApiService } from \".\";\r\nimport { ISettingsApiService } from \"./ISettingsApiService\";\r\nimport { LogosInfoModel } from \"../models/LogosInfoModel\";\r\n\r\nexport class SettingsApiService extends ApiService implements ISettingsApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n updateLogos(\r\n useCustomNotifBranding: boolean,\r\n leftLogo?: File,\r\n rightLogo?: File,\r\n backgroundLogo?: File,\r\n resetRightLogo?: boolean,\r\n resetBackgroundLogo?: boolean\r\n ): Promise {\r\n const data = new FormData();\r\n data.append(\"useCustomNotifBranding\", useCustomNotifBranding ? \"1\" : \"0\");\r\n\r\n if (leftLogo) {\r\n data.append(\"leftLogo\", leftLogo, leftLogo.name);\r\n }\r\n\r\n if (resetRightLogo) {\r\n data.append(\"resetRightLogo\", \"1\");\r\n } else if (rightLogo) {\r\n data.append(\"rightLogo\", rightLogo, rightLogo.name);\r\n }\r\n\r\n if (resetBackgroundLogo) {\r\n data.append(\"resetBackgroundLogo\", \"1\");\r\n } else if (backgroundLogo) {\r\n data.append(\"backgroundLogo\", backgroundLogo, backgroundLogo.name);\r\n }\r\n\r\n return this.post(\"settings/appearance/brand/logos\", data);\r\n }\r\n}\r\n","import axios from \"axios\";\r\nimport * as qs from \"qs\";\r\n\r\nimport { Token } from \"./Token\";\r\nimport { ITokenService } from \"./ITokenService\";\r\nimport { getApiUrl, getFormHeaders } from \"../commUtil\";\r\n\r\nconst SESSIONSTORAGEKEY_TOKEN = \"moveit.token\";\r\n/** Number of seconds prior to token expiration within which we should refresh the token. */\r\nconst TOKEN_REFRESH_THRESHOLD_SECONDS = 60;\r\n\r\nconst tokenServicePool: { [baseUrl: string]: ITokenService } = {};\r\n\r\nexport class TokenService implements ITokenService {\r\n /**\r\n * Returns an ITokenService instance for the given base URL.\r\n * Uses an instance pool such that two calls with the\r\n * same base URL argument will return the same instance.\r\n */\r\n public static getInstance(baseUrl: string, language: string) {\r\n if (!tokenServicePool[baseUrl]) {\r\n tokenServicePool[baseUrl] = new TokenService(baseUrl, language);\r\n }\r\n\r\n return tokenServicePool[baseUrl];\r\n }\r\n\r\n /**\r\n * Clears all entries from the instance pool.\r\n */\r\n public static resetPool() {\r\n const poolEntries = Object.getOwnPropertyNames(tokenServicePool);\r\n for (const entry of poolEntries) {\r\n delete tokenServicePool[entry];\r\n }\r\n }\r\n\r\n private readonly baseUrl: string = \"\";\r\n private readonly language: string = \"\";\r\n private token: Token = null;\r\n private tokenPromise: Promise = null;\r\n private timerHandle: any = null;\r\n private refreshing: boolean = false;\r\n private autoRefresh: boolean = false;\r\n\r\n private constructor(baseUrl: string, language: string) {\r\n this.baseUrl = baseUrl;\r\n this.language = language;\r\n\r\n const tokenString = sessionStorage.getItem(SESSIONSTORAGEKEY_TOKEN);\r\n if (tokenString) {\r\n this.token = JSON.parse(tokenString) as Token;\r\n // Do not start token reset timer until a token is actually requested\r\n //if (isValidToken(this.token)) {\r\n // this.setTimer(this.token.expirationTimestamp);\r\n //}\r\n }\r\n }\r\n\r\n public getToken(forceRefresh?: boolean): Promise {\r\n if ((forceRefresh && !this.refreshing) || !this.tokenPromise) {\r\n this.resetTokenPromise(forceRefresh);\r\n }\r\n\r\n return this.tokenPromise;\r\n }\r\n\r\n public revokeToken(): Promise {\r\n const url = getApiUrl(this.baseUrl, \"token/revoke\");\r\n const data = { token: this.token.access_token };\r\n const formHeaders = getFormHeaders();\r\n return axios\r\n .post(url, qs.stringify(data), { headers: formHeaders })\r\n .then(() => this.clearToken());\r\n }\r\n\r\n public clearToken(): void {\r\n this.token = null;\r\n this.tokenPromise = null;\r\n sessionStorage.removeItem(SESSIONSTORAGEKEY_TOKEN);\r\n }\r\n\r\n public stopTokenRefresh(): void {\r\n this.autoRefresh = false;\r\n this.unsetTimer();\r\n }\r\n\r\n public startTokenRefresh(): void {\r\n if (this.autoRefresh) return; // Automatic token refresh is already enabled\r\n\r\n this.autoRefresh = true;\r\n if (this.token) {\r\n this.setTimer(this.token.expirationTimestamp);\r\n }\r\n }\r\n\r\n private resetTokenPromise(forceRefresh: boolean): void {\r\n this.unsetTimer();\r\n this.tokenPromise = new Promise((resolve, reject) => {\r\n const doAcquire = (): void => {\r\n this.acquireToken().then(\r\n (newToken) => resolve(newToken),\r\n (error) => reject(error)\r\n );\r\n };\r\n\r\n const doRefresh = (): void => {\r\n this.refreshToken().then(\r\n (newToken) => resolve(newToken),\r\n () => doAcquire()\r\n );\r\n };\r\n\r\n if (isValidToken(this.token)) {\r\n if (forceRefresh || shouldRefreshToken(this.token)) {\r\n doRefresh();\r\n } else {\r\n // Set refresh timer if not already set\r\n if (!this.timerHandle) {\r\n this.setTimer(this.token.expirationTimestamp);\r\n }\r\n resolve(this.token);\r\n }\r\n } else {\r\n doAcquire();\r\n }\r\n });\r\n }\r\n\r\n private processToken(token: Token): Token {\r\n token.expirationTimestamp = calculateTokenExpirationTimestamp(token);\r\n sessionStorage.setItem(SESSIONSTORAGEKEY_TOKEN, JSON.stringify(token));\r\n this.setTimer(token.expirationTimestamp);\r\n this.token = token;\r\n this.refreshing = false; // reset refresh status\r\n return token;\r\n }\r\n\r\n private acquireToken(): Promise {\r\n const url = getApiUrl(this.baseUrl, \"token\");\r\n const data = {\r\n grant_type: \"session\",\r\n language: this.language,\r\n };\r\n\r\n const formHeaders = getFormHeaders();\r\n return axios\r\n .post(url, qs.stringify(data), { headers: formHeaders })\r\n .then((response) => this.processToken(response.data as Token));\r\n }\r\n\r\n private refreshToken(): Promise {\r\n this.refreshing = true; // don't let extra refresh requests go through\r\n const url = getApiUrl(this.baseUrl, \"token\");\r\n const data = {\r\n grant_type: \"refresh_token\",\r\n refresh_token: this.token.refresh_token,\r\n };\r\n const formHeaders = getFormHeaders();\r\n return axios\r\n .post(url, qs.stringify(data), { headers: formHeaders })\r\n .then((response) => this.processToken(response.data as Token));\r\n }\r\n\r\n /**\r\n * Sets a timer that refreshes the token just after the refresh threshold\r\n * has been reached based on the provided token expiration timestamp.\r\n */\r\n private setTimer(expirationTimestamp: number): void {\r\n if (!this.autoRefresh) return;\r\n\r\n const dueTime =\r\n expirationTimestamp - Date.now() - (TOKEN_REFRESH_THRESHOLD_SECONDS - 1) * 1000;\r\n const executeRefresh = () => this.resetTokenPromise(false);\r\n\r\n if (dueTime > 0) {\r\n this.timerHandle = setTimeout(executeRefresh, dueTime);\r\n } else {\r\n executeRefresh();\r\n }\r\n }\r\n\r\n private unsetTimer(): void {\r\n if (this.timerHandle !== null) {\r\n clearTimeout(this.timerHandle);\r\n this.timerHandle = null;\r\n }\r\n }\r\n}\r\n\r\nfunction isValidToken(token: Token): boolean {\r\n return !!token && !isExpiredToken(token);\r\n}\r\n\r\nfunction isExpiredToken(token: Token): boolean {\r\n return token.expirationTimestamp <= Date.now();\r\n}\r\n\r\nfunction shouldRefreshToken(token: Token): boolean {\r\n return token.expirationTimestamp - Date.now() < TOKEN_REFRESH_THRESHOLD_SECONDS * 1000;\r\n}\r\n\r\nfunction calculateTokenExpirationTimestamp(token: Token): number {\r\n return Date.now() + token.expires_in * 1000;\r\n}\r\n","import { ApiService } from \"./ApiService\";\r\nimport { IUploadApiService, ContentRange } from \"./IUploadApiService\";\r\nimport { SimpleFileModel } from \"../models/SimpleFileModel\";\r\nimport { FileUploadResponseModel } from \"../models/FileUploadResponseModel\";\r\nimport { ApiRequestOptions } from \"./IApiService\";\r\nimport axios, { CancelTokenSource } from \"axios\";\r\n\r\nexport class UploadApiService extends ApiService implements IUploadApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public initResumableUpload(\r\n folderId: string,\r\n fileName: string,\r\n fileSize: number,\r\n comments: string\r\n ): Promise {\r\n const data = new FormData();\r\n data.append(\"name\", fileName);\r\n data.append(\"size\", fileSize.toString());\r\n data.append(\"comments\", comments);\r\n\r\n return this.post(\r\n `folders/${folderId}/files?uploadType=resumable`,\r\n data\r\n );\r\n }\r\n\r\n public continueResumableUpload(\r\n folderId: string,\r\n fileId: string,\r\n data: Blob,\r\n contentRange: ContentRange,\r\n fileHash?: string,\r\n onProgress?: (e: ProgressEvent) => void,\r\n cancelTokenSource?: CancelTokenSource\r\n ): Promise {\r\n const headers: {\r\n \"Content-Type\": string;\r\n \"Content-Range\": string;\r\n \"X-File-Hash\"?: string;\r\n } = {\r\n // We are sending raw data, so override the default content type to be octet-stream\r\n \"Content-Type\": \"application/octet-stream\",\r\n \"Content-Range\": makeContentRangeHeaderValue(contentRange),\r\n };\r\n if (fileHash) {\r\n headers[\"X-File-Hash\"] = fileHash;\r\n }\r\n const options: ApiRequestOptions = {\r\n onUploadProgress: onProgress,\r\n cancelToken: cancelTokenSource?.token,\r\n };\r\n\r\n if (isLastChunk(contentRange)) {\r\n return this.put(\r\n `folders/${folderId}/files?uploadType=resumable&fileId=${fileId}`,\r\n data,\r\n headers,\r\n options\r\n );\r\n } else {\r\n // Non-final chunk uploads should return a 308 status on success\r\n options.validateStatus = (status: number) => status === 308;\r\n return this.put(\r\n `folders/${folderId}/files?uploadType=resumable&fileId=${fileId}`,\r\n data,\r\n headers,\r\n options\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction makeContentRangeHeaderValue(value: ContentRange): string {\r\n // When uploading an empty file Content-Range: bytes 0-0/0 is an invalid header. bytes */0 is a valid header\r\n return value.totalSize === 0 ? `bytes */0` : `bytes ${value.startOffset}-${value.endOffset}/${value.totalSize}`;\r\n}\r\n\r\nfunction isLastChunk(contentRange: ContentRange): boolean {\r\n return contentRange.totalSize === 0 || contentRange.endOffset === contentRange.totalSize - 1;\r\n}\r\n","import { ApiService } from \".\";\r\nimport { IUsersApiService } from \"./IUsersApiService\";\r\nimport { UserDetailsModel } from \"../models/UserDetailsModel\";\r\nimport { SimpleUserModel } from \"../models/SimpleUserModel\";\r\nimport { PagedModel } from \"../models/PagedModel\";\r\n\r\nexport class UsersApiService extends ApiService implements IUsersApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public getSelf(): Promise {\r\n return this.get(\"users/self\");\r\n }\r\n\r\n public getUserList(\r\n usernameFilter?: string,\r\n fullNameFilter?: string,\r\n emailFilter?: string,\r\n permissionFilter?:\r\n | \"EndUsers\"\r\n | \"Administrators\"\r\n | \"FileAdmins\"\r\n | \"GroupAdmins\"\r\n | \"TemporaryUsers\"\r\n | \"SysAdmins\",\r\n statusFilter?: \"ActiveUsers\" | \"InactiveUsers\" | \"NeverSignedOnUsers\" | \"TemplateUsers\",\r\n page: number = 1,\r\n perPage: number = 25,\r\n sortField: \"username\" | \"fullname\" | \"email\" | \"lastLoginStamp\" = \"username\",\r\n sortDirection: \"ascending\" | \"descending\" = \"ascending\"\r\n ): Promise> {\r\n return this.get>(\"users\", {\r\n username: usernameFilter,\r\n fullName: fullNameFilter,\r\n email: emailFilter,\r\n permission: permissionFilter,\r\n status: statusFilter,\r\n page,\r\n perPage,\r\n sortField,\r\n sortDirection,\r\n });\r\n }\r\n}\r\n","export * from \"./ApiService\";\r\nexport * from \"./IApiService\";\r\nexport * from \"./ContactsApiService\";\r\nexport * from \"./IContactsApiService\";\r\nexport * from \"./FoldersApiService\";\r\nexport * from \"./IFoldersApiService\";\r\nexport * from \"./UsersApiService\";\r\nexport * from \"./IUsersApiService\";\r\nexport * from \"./IUploadApiService\";\r\nexport * from \"./UploadApiService\";\r\nexport { default as IDownloadValidateApiService } from \"./IDownloadValidateApiService\";\r\nexport { default as DownloadValidateApiService } from \"./DownloadValidateApiService\";\r\nexport * from \"./ISettingsApiService\";\r\nexport * from \"./SettingsApiService\";\r\n","import React, { FunctionComponent } from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { ButtonVariant } from \"react-bootstrap/types\";\r\n\r\nimport { ApplicationLinkProps, makeApplicationLink } from \"../utils/applicationUtils\";\r\n\r\ninterface ApplicationLinkButtonProps extends ApplicationLinkProps {\r\n variant: ButtonVariant;\r\n}\r\n\r\nconst ApplicationLinkButton: FunctionComponent = props => {\r\n const handleClick = (): void => {\r\n window.location.href = makeApplicationLink(props);\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default ApplicationLinkButton;\r\n","import React, { FunctionComponent, ReactElement } from \"react\";\r\nimport { useIntl } from \"react-intl\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./Beltline.scss\";\r\n\r\nexport interface BeltlineProps {\r\n children: ReactElement[];\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A heavily-styled family of flex components for displaying a wrapping row of related data fields and/or actions in a \"beltline\"\r\n * @param props\r\n */\r\nexport const Beltline: FunctionComponent = ({ children, className }) => {\r\n return
{children}
;\r\n};\r\n\r\nexport interface BeltineItemProps {\r\n label: {};\r\n content: {};\r\n labelClass?: string;\r\n contentClass?: string;\r\n className?: string;\r\n}\r\nexport const BeltlineItem: FunctionComponent = ({\r\n label,\r\n labelClass,\r\n content,\r\n contentClass,\r\n className,\r\n}) => {\r\n return (\r\n
\r\n {label}\r\n {content}\r\n
\r\n );\r\n};\r\n\r\nexport interface BeltlineItemQuantityProps {\r\n label: {};\r\n quantity: number | string | boolean | ReactElement;\r\n quantityTotal?: number | string | boolean | ReactElement;\r\n labelClass?: string;\r\n contentClass?: string;\r\n className?: string;\r\n}\r\nexport const BeltlineQuantity: FunctionComponent = ({\r\n label,\r\n labelClass,\r\n quantity,\r\n quantityTotal,\r\n contentClass,\r\n className,\r\n}) => {\r\n const intl = useIntl();\r\n const content = quantityTotal ? (\r\n intl.formatMessage(\r\n { id: \"common.unit.fraction\" },\r\n {\r\n part: {quantity},\r\n total: {quantityTotal},\r\n }\r\n )\r\n ) : (\r\n {quantity}\r\n );\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default Beltline;\r\n","import React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport classNames from \"classnames\";\r\n\r\nexport interface ButtonProps {\r\n label: string | JSX.Element;\r\n onClick: () => void;\r\n disable?: boolean;\r\n}\r\n\r\ninterface CommonModalFooterControlsProps {\r\n primary?: ButtonProps;\r\n secondary?: ButtonProps;\r\n cancel?: ButtonProps;\r\n}\r\n\r\nconst CommonModalFooterControls: FunctionComponent = (props) => {\r\n const primaryButton = props.primary ? makeButton(\"primary\", props.primary) : null;\r\n const secondaryButton = props.secondary ? makeButton(\"secondary\", props.secondary) : null;\r\n const cancelButton = props.cancel\r\n ? makeButton(\"link\", props.cancel, \"btn-footer-cancel\")\r\n : null;\r\n\r\n return (\r\n \r\n {primaryButton}\r\n {secondaryButton}\r\n {cancelButton}\r\n \r\n );\r\n};\r\n\r\nfunction makeButton(\r\n variant: \"primary\" | \"secondary\" | \"link\",\r\n props: ButtonProps,\r\n additionalClasses?: string\r\n): JSX.Element {\r\n return (\r\n \r\n {props.label}\r\n \r\n );\r\n}\r\n\r\nexport default CommonModalFooterControls;\r\n","import * as React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\n\r\ninterface CommonModalHeaderControlsProps {\r\n close?: boolean;\r\n onClose?: () => void;\r\n help?: boolean;\r\n onHelp?: () => void;\r\n}\r\n\r\nconst CommonModalHeaderControls: FunctionComponent = props => {\r\n const helpButton = props.help ? (\r\n \r\n ) : null;\r\n\r\n const closeButton = props.close ? (\r\n \r\n \r\n \r\n ) : null;\r\n\r\n return (\r\n
\r\n {helpButton}\r\n {closeButton}\r\n
\r\n );\r\n};\r\n\r\nexport default CommonModalHeaderControls;\r\n","import React, { FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./ContentSectionWrapper.scss\";\r\n\r\ninterface ContentSectionWrapperProps {\r\n sectionTitle: string;\r\n className?: string;\r\n}\r\n\r\nconst ContentSectionWrapper: FunctionComponent = props => {\r\n return (\r\n
\r\n

{props.sectionTitle}

\r\n {props.children}\r\n
\r\n );\r\n};\r\n\r\nexport default ContentSectionWrapper;\r\n","import * as React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./Control.scss\";\r\n\r\ninterface ControlProps {\r\n className?: string;\r\n}\r\n\r\nconst Control: FunctionComponent = props => {\r\n const classes = classNames(\"mi-react-control\", props.className);\r\n\r\n return
{props.children}
;\r\n};\r\n\r\nexport default Control;\r\n","import * as React from \"react\";\r\nimport { FunctionComponent, ChangeEvent, useState, useEffect } from \"react\";\r\n\r\nexport interface DebouncedTextInputProps {\r\n value: string;\r\n placeHolder: string;\r\n onImmediateChange: (value: string) => void;\r\n onDebouncedChange: (value: string) => void;\r\n debounceTime: number;\r\n}\r\n\r\nexport const DebouncedTextInput: FunctionComponent = props => {\r\n const [timerId, setTimerId] = useState(null);\r\n\r\n // Clear the timer when unmounted\r\n useEffect(() => clearTimer);\r\n\r\n function clearTimer() {\r\n if (timerId) {\r\n clearTimeout(timerId);\r\n }\r\n }\r\n\r\n function debounceChange(newValue: string) {\r\n clearTimer();\r\n setTimerId(setTimeout(() => props.onDebouncedChange(newValue), props.debounceTime));\r\n }\r\n\r\n function handleChange(e: ChangeEvent) {\r\n const newValue = e.target.value;\r\n props.onImmediateChange(newValue);\r\n debounceChange(newValue);\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React, { FunctionComponent } from \"react\";\r\nimport { FormattedMessage } from \"react-intl\";\r\nimport { Alert } from \"react-bootstrap\";\r\n\r\nimport \"./ErrorAlert.scss\";\r\n\r\ninterface ErrorAlertProps {\r\n messageId: string;\r\n message?: string;\r\n details?: string;\r\n}\r\n\r\nconst ErrorAlert: FunctionComponent = props => {\r\n return (\r\n \r\n
\r\n {props.messageId ? : props.message}\r\n
\r\n {!!props.details &&
{props.details}
}\r\n
\r\n );\r\n};\r\n\r\nexport default ErrorAlert;\r\n","import React, { FunctionComponent, ReactElement } from \"react\";\r\nimport classnames from \"classnames\";\r\n\r\nimport \"./FeatureGroup.scss\";\r\n\r\nexport const FeatureGroupContent: FunctionComponent<{}> = ({ children }) => {\r\n return
{children}
;\r\n};\r\n\r\nexport interface FeatureGroupProps {\r\n className?: string;\r\n}\r\n\r\nconst FeatureGroup: FunctionComponent = ({ className, children }) => {\r\n return
{children}
;\r\n};\r\n\r\nexport default FeatureGroup;\r\nexport * from \"./FeatureGroupNumericTitle\";\r\nexport * from \"./FeatureGroupIconTitle\";\r\nexport * from \"./FeatureGroupBoxedIconTitle\";\r\n","import React, { ReactElement, FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { Alert } from \"react-bootstrap\";\r\n\r\nimport \"./FeatureGroupBoxedIconTitle.scss\";\r\n\r\nexport interface FeatureGroupBoxedIconTitleProps {\r\n title: string | ReactElement;\r\n subtitle?: string | ReactElement;\r\n className?: string;\r\n alertBoxVariant: string;\r\n iconClassName: string;\r\n action?: ReactElement;\r\n}\r\n\r\nexport const FeatureGroupBoxedIconTitle: FunctionComponent = ({\r\n title,\r\n subtitle,\r\n className,\r\n alertBoxVariant,\r\n iconClassName,\r\n action,\r\n}) => {\r\n return (\r\n
\r\n \r\n
\r\n \r\n \r\n {title}\r\n {!!subtitle && (\r\n {subtitle}\r\n )}\r\n \r\n
\r\n {!!action &&
{action}
}\r\n
\r\n
\r\n );\r\n};\r\n","import React, { ReactElement, FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport interface FeatureGroupIconTitleProps {\r\n title: string | ReactElement;\r\n className?: string;\r\n iconClassName: string;\r\n}\r\n\r\nexport const FeatureGroupIconTitle: FunctionComponent = ({\r\n title,\r\n className,\r\n iconClassName,\r\n}) => {\r\n return (\r\n
\r\n \r\n
{title}
\r\n
\r\n );\r\n};\r\n","import React, { FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./FeatureGroupNumericTitle.scss\";\r\n\r\nexport interface FeatureGroupNumericTitleProps {\r\n title: string;\r\n className?: string;\r\n titleNumber: number;\r\n}\r\n\r\nexport const FeatureGroupNumericTitle: FunctionComponent = ({\r\n title,\r\n className,\r\n titleNumber,\r\n}) => {\r\n return (\r\n
\r\n {titleNumber}\r\n
{title}
\r\n
\r\n );\r\n};\r\n","import React, { FunctionComponent } from \"react\";\r\nimport { useIntl } from \"react-intl\";\r\nimport { formatTransferLocaleDate } from \"../utils\";\r\n\r\ninterface FormattedLocaleDateProps {\r\n date: Date;\r\n locale?: string;\r\n className?: string; // will use a span if present\r\n}\r\n\r\nconst FormattedLocaleDate: FunctionComponent = props => {\r\n const intl = useIntl();\r\n const date = formatTransferLocaleDate(props.date, props.locale || intl.locale);\r\n return props.className ? {date} : <>{date};\r\n};\r\n\r\nexport default FormattedLocaleDate;\r\n","import React from \"react\";\r\nimport { useField, FieldConfig } from \"formik\";\r\nimport FormGroup from \"react-bootstrap/FormGroup\";\r\nimport FormLabel from \"react-bootstrap/FormLabel\";\r\nimport FormControl from \"react-bootstrap/FormControl\";\r\nimport cn from \"classnames\";\r\n\r\ninterface FormikFieldGroupProps {\r\n type: string;\r\n className?: string;\r\n label?: string;\r\n placeholder?: string;\r\n maxLength?: number;\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n checked?: boolean;\r\n fragile?: boolean; // when true, an invalid field will display error even when touched is false\r\n}\r\n\r\nconst FormikFieldGroup: React.FunctionComponent = ({\r\n type,\r\n className,\r\n label,\r\n fragile,\r\n ...props\r\n}) => {\r\n const [field, meta] = useField(props);\r\n\r\n const isInvalid: boolean = meta.error && (fragile || meta.touched);\r\n\r\n return (\r\n \r\n {label}\r\n \r\n {isInvalid && (\r\n \r\n {meta.error || \"\"}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default FormikFieldGroup;\r\n","import * as React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\n\r\nimport Control from \"./Control\";\r\n\r\nimport \"./LabelledControl.scss\";\r\n\r\ninterface LabelledControlProps {\r\n label: string;\r\n}\r\n\r\nconst LabelledControl: FunctionComponent = props => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default LabelledControl;\r\n","import * as React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\nimport { ProgressBar, Row, Col } from \"react-bootstrap\";\r\n\r\nimport Control from \"./Control\";\r\n\r\nimport \"./LabelledProgressBar.scss\";\r\n\r\ninterface LabelledProgressBarProps {\r\n min: number;\r\n max: number;\r\n now: number;\r\n labelLeft: string;\r\n labelRight: string;\r\n}\r\n\r\nconst LabelledProgressBar: FunctionComponent = props => {\r\n const resolveLabel = (label: string): string => {\r\n return label.replace(/\\{(\\w+)\\}/, (match, group): string => {\r\n switch (group) {\r\n case \"percent\":\r\n return String(Math.round((props.now / props.max) * 100)) + \"%\";\r\n default:\r\n return \"\";\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n {resolveLabel(props.labelLeft)}\r\n \r\n \r\n {resolveLabel(props.labelRight)}\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 LabelledProgressBar;\r\n","import React, { FunctionComponent } from \"react\";\r\nimport cn from \"classnames\";\r\n\r\nconst LoadingSpinner: FunctionComponent<{ classNames?: string }> = ({ classNames }) => (\r\n // NOTE: Styles for the classes used by this component are defined in commons-ui-styles\r\n
\r\n
\r\n
\r\n);\r\n\r\nexport default LoadingSpinner;\r\n","import React, { useMemo } from \"react\";\r\nimport { useTable, Column, UseTableOptions } from \"react-table\";\r\nimport cx from \"classnames\";\r\n\r\nimport \"./MITransferTable.scss\";\r\n\r\nexport interface MITransferTableProps extends UseTableOptions {\r\n caption?: string;\r\n className?: string;\r\n}\r\n\r\nconst MITransferTable = (props: MITransferTableProps) => {\r\n const columns: Column[] = useMemo(() => props.columns, [props.columns]);\r\n\r\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = useTable({\r\n ...props,\r\n columns,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n {// Loop over the header rows\r\n headerGroups.map((headerGroup, ind1) => (\r\n // Apply the header row props\r\n \r\n {// Loop over the headers in each row\r\n headerGroup.headers.map((column, ind2) => (\r\n // Apply the header cell props\r\n \r\n {// Render the header\r\n column.render(\"Header\")}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n {/* Apply the table body props */}\r\n \r\n {// Loop over the table rows\r\n rows.map((row, ind1) => {\r\n // Prepare the row for display\r\n prepareRow(row);\r\n return (\r\n // Apply the row props\r\n \r\n {// Loop over the rows cells\r\n row.cells.map((cell, ind2) => {\r\n // Apply the cell props\r\n return (\r\n \r\n {// Render the cell contents\r\n cell.render(\"Cell\")}\r\n \r\n );\r\n })}\r\n \r\n );\r\n })}\r\n \r\n
{props.caption}
\r\n );\r\n};\r\n\r\nexport default MITransferTable;\r\n","import React, { FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./PageWrapper.scss\";\r\n\r\ninterface PageWrapperProps {\r\n pageTitle: string;\r\n className?: string;\r\n}\r\n\r\nconst PageWrapper: FunctionComponent = props => {\r\n return (\r\n
\r\n

{props.pageTitle}

\r\n {props.children}\r\n
\r\n );\r\n};\r\n\r\nexport default PageWrapper;\r\n","import React, { FunctionComponent, ReactElement, useMemo } from \"react\";\r\n\r\nimport { useBoolean } from \"../utils/componentUtils\";\r\n\r\nexport interface WaitIndicatorProps {\r\n title: string;\r\n description: string;\r\n}\r\n\r\nexport const WaitIndicator: FunctionComponent = ({ title, description }) => {\r\n // NOTE: Styles for the classes used by this component are defined in commons-ui-styles\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
{title}
\r\n
{description}
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Creates a wait element with methods to enable and disable it.\r\n */\r\nexport const useWaitIndicator = (\r\n title: string,\r\n description: string\r\n): [ReactElement, () => void, () => void] => {\r\n const [flag, setTrue, setFalse] = useBoolean(false);\r\n const waitElement = useMemo(\r\n () => ,\r\n []\r\n );\r\n\r\n return [flag ? waitElement : null, setTrue, setFalse];\r\n};\r\n\r\n/**\r\n * Creates a wait element with a method to display it while a provided\r\n * promise is active, and hide it when the promise settles.\r\n */\r\nexport const useWaitOnPromise = (\r\n title: string,\r\n description: string\r\n): [ReactElement, (promise: Promise) => void] => {\r\n const [waitElement, showWait, hideWait] = useWaitIndicator(title, description);\r\n\r\n const waitFunction = (promise: Promise): void => {\r\n showWait();\r\n promise.finally(hideWait);\r\n };\r\n\r\n return [waitElement, waitFunction];\r\n};\r\n","import React, { FunctionComponent } from \"react\";\r\nimport { FormattedMessage } from \"react-intl\";\r\nimport { Alert } from \"react-bootstrap\";\r\n\r\nimport \"./WarningAlert.scss\";\r\n\r\ninterface WarningAlertProps {\r\n messageId: string;\r\n messageValues?: {};\r\n message?: string;\r\n details?: string;\r\n}\r\n\r\nconst WarningAlert: FunctionComponent = props => {\r\n return (\r\n \r\n
\r\n {props.messageId ? (\r\n \r\n ) : (\r\n props.message\r\n )}\r\n
\r\n {!!props.details &&
{props.details}
}\r\n
\r\n );\r\n};\r\n\r\nexport default WarningAlert;\r\n","export { default as Control } from \"./Control\";\r\nexport { default as LabelledControl } from \"./LabelledControl\";\r\nexport { default as LabelledProgressBar } from \"./LabelledProgressBar\";\r\nexport { default as CommonModalHeaderControls } from \"./CommonModalHeaderControls\";\r\nexport { default as CommonModalFooterControls, ButtonProps } from \"./CommonModalFooterControls\";\r\nexport { default as ErrorAlert } from \"./ErrorAlert\";\r\nexport { default as WarningAlert } from \"./WarningAlert\";\r\nexport { default as ApplicationLinkButton } from \"./ApplicationLinkButton\";\r\nexport * from \"./DebouncedTextInput\";\r\nexport * from \"./WaitIndicator\";\r\n","export const DEBOUNCE_INTERVAL = 500; // milliseconds\r\nexport const TRANSFER_DOC_VERSION = \"2024\"; // if changing this value be sure to change it in /skels/utility.xslskel and in mi-dmz/libs/MOVEit.DMZ.Core/Constants.cs as well\r\n","import IHashService from \"./IHashService\";\r\n// Rusha has no TS types definition, so we need to ignore that in the compiler and just go with it\r\n//@ts-ignore\r\nimport * as Rusha from \"rusha\";\r\n\r\nexport default class HashService implements IHashService {\r\n public hashFile(file: File, onProgress?: (progress: number) => void): Promise {\r\n const md = Rusha.createHash();\r\n const chunksize = 10 * 1024 * 1024; // 10 MiB\r\n\r\n function hashNextPart(offset: number): Promise {\r\n const nextPart = file.slice(offset, offset + chunksize);\r\n const newOffset = offset + chunksize;\r\n\r\n return getBlobContent(nextPart).then((content) => {\r\n md.update(content);\r\n // report progress\r\n const progress = newOffset < file.size ? newOffset : file.size;\r\n onProgress?.(progress);\r\n return newOffset;\r\n });\r\n }\r\n\r\n function hashParts(offset: number, resolve: () => void) {\r\n if (offset >= file.size) {\r\n resolve();\r\n } else {\r\n hashNextPart(offset).then((newOffset) => hashParts(newOffset, resolve));\r\n }\r\n }\r\n\r\n return new Promise((resolve) => hashParts(0, resolve)).then(() => md.digest(\"hex\"));\r\n }\r\n}\r\n\r\nfunction getBlobContent(blob: Blob): Promise {\r\n return new Promise((resolve) => {\r\n const fr = new FileReader();\r\n fr.addEventListener(\"load\", () => resolve(fr.result as ArrayBuffer));\r\n fr.readAsArrayBuffer(blob);\r\n });\r\n}\r\n","import IHelpUrlBuilderService from \"./IHelpUrlBuilderService\";\r\nimport { TRANSFER_DOC_VERSION } from \"../constants\";\r\n\r\nexport default class HelpUrlBuilderService implements IHelpUrlBuilderService {\r\n // full structure: https://docs.ipswitch.com/MOVEit/Transfer/Help///.htm\r\n private readonly baseUrl = \"https://docs.ipswitch.com/MOVEit/\";\r\n // TODO: add user api service to dynamically fetch user type\r\n constructor(private readonly userType: string, private readonly languageCode: string) {}\r\n\r\n public getHelpUrl(targetId: string) {\r\n return `${this.baseUrl}Transfer${TRANSFER_DOC_VERSION}/Help/${this.userType}/${this.languageCode}/${targetId}.htm`;\r\n }\r\n}\r\n","export { default as HashService } from \"./HashService\";\r\nexport { default as IHashService } from \"./IHashService\";\r\n","export interface ApplicationLinkProps {\r\n arg01?: string;\r\n arg02?: string;\r\n arg03?: string;\r\n arg04?: string;\r\n arg05?: string;\r\n arg06?: string;\r\n arg07?: string;\r\n arg08?: string;\r\n arg09?: string;\r\n arg10?: string;\r\n arg11?: string;\r\n arg12?: string;\r\n}\r\n\r\nfunction makeLinkPart(name: string, value?: string): string {\r\n if (value) {\r\n return `${name}=${value}`;\r\n }\r\n}\r\n\r\nexport const makeApplicationLink = (props: ApplicationLinkProps): string => {\r\n const linkParts: string[] = [];\r\n\r\n linkParts.push(makeLinkPart(\"arg01\", props.arg01));\r\n linkParts.push(makeLinkPart(\"arg02\", props.arg02));\r\n linkParts.push(makeLinkPart(\"arg03\", props.arg03));\r\n linkParts.push(makeLinkPart(\"arg04\", props.arg04));\r\n linkParts.push(makeLinkPart(\"arg05\", props.arg05));\r\n linkParts.push(makeLinkPart(\"arg06\", props.arg06));\r\n linkParts.push(makeLinkPart(\"arg07\", props.arg07));\r\n linkParts.push(makeLinkPart(\"arg08\", props.arg08));\r\n linkParts.push(makeLinkPart(\"arg09\", props.arg09));\r\n linkParts.push(makeLinkPart(\"arg10\", props.arg10));\r\n linkParts.push(makeLinkPart(\"arg11\", props.arg11));\r\n linkParts.push(makeLinkPart(\"arg12\", props.arg12));\r\n\r\n return \"?\" + linkParts.filter(x => x).join(\"&\");\r\n};\r\n\r\nexport const navigateToApplicationLink = (props: ApplicationLinkProps): void => {\r\n const link = makeApplicationLink(props);\r\n window.location.href = link;\r\n};\r\n","import React, { useState } from \"react\";\r\n\r\nexport const useToggle = (\r\n initial: boolean = false\r\n): [boolean, () => void, React.Dispatch>] => {\r\n const [flag, setFlag] = useState(initial);\r\n const toggleFlag = () => setFlag(!flag);\r\n return [flag, toggleFlag, setFlag];\r\n};\r\nexport const useBoolean = (\r\n initial: boolean = false\r\n): [boolean, () => void, () => void, React.Dispatch>] => {\r\n const [flag, setFlag] = useState(initial);\r\n const setTrue = () => setFlag(true);\r\n const setFalse = () => setFlag(false);\r\n return [flag, setTrue, setFalse, setFlag];\r\n};\r\n\r\n/**\r\n * MOVEit Transfer uses underscores to separate sublanguages,\r\n * whereas react-intl requires dashes. Also, all language\r\n * codes should be lowercase.\r\n * @param value - the locale value given by the Transfer WebApp\r\n */\r\nexport function getLanguageCode(value: string): string {\r\n let output = value || \"en\";\r\n output = output.replace(\"_\", \"-\").toLowerCase();\r\n return output;\r\n}\r\n\r\n/**\r\n * A utility that returns a getter function for the latest value/ref to the given object (shallow comparison).\r\n * (Useful such as when an argument is a prop value and you want an async function to always use the most up-to-date value regardless of invocation time.)\r\n * @param obj the object whose latest reference you always want returned by the returned getter function\r\n * @returns a getter function that always returns the latest value/ref to the given object.\r\n *\r\n * Source: https://github.com/tannerlinsley/react-table/blob/aa2835766a7a34f70cd6b579628e4f7e820970ab/src/publicUtils.js#L140 (MIT License)\r\n */\r\nexport function useGetLatest(obj: T) {\r\n const ref = React.useRef();\r\n ref.current = obj;\r\n\r\n return React.useCallback(() => ref.current, []);\r\n}\r\n\r\n/**\r\n * Debounces a given function for a given timespan.\r\n * @param defaultFn\r\n * @param defaultWait\r\n *\r\n * Source: https://github.com/tannerlinsley/react-table/blob/aa2835766a7a34f70cd6b579628e4f7e820970ab/src/publicUtils.js#L163 (MIT License)\r\n */\r\nexport function useAsyncDebounce any>(\r\n defaultFn: T,\r\n defaultWait: number\r\n): T {\r\n const debounceRef = React.useRef<{\r\n promise?: Promise;\r\n resolve?: (value: T | PromiseLike) => void;\r\n reject?: (reason?: any) => void;\r\n timeout?: NodeJS.Timeout;\r\n }>({});\r\n\r\n // the given args could be props, which change, so we want to always use latest definitions.\r\n const getDefaultFn = useGetLatest(defaultFn);\r\n const getDefaultWait = useGetLatest(defaultWait);\r\n\r\n return React.useCallback(\r\n (async (...args) => {\r\n // make a promise\r\n if (!debounceRef.current.promise) {\r\n debounceRef.current.promise = new Promise((resolve, reject) => {\r\n debounceRef.current.resolve = resolve;\r\n debounceRef.current.reject = reject;\r\n });\r\n }\r\n\r\n if (debounceRef.current.timeout) {\r\n clearTimeout(debounceRef.current.timeout);\r\n }\r\n\r\n debounceRef.current.timeout = setTimeout(async () => {\r\n // Executing a debounced call--don't let it be canceled.\r\n delete debounceRef.current.timeout;\r\n try {\r\n debounceRef.current.resolve(await getDefaultFn()(...args));\r\n } catch (err) {\r\n debounceRef.current.reject(err);\r\n } finally {\r\n delete debounceRef.current.promise;\r\n }\r\n }, getDefaultWait());\r\n\r\n return debounceRef.current.promise;\r\n }) as T,\r\n [getDefaultFn, getDefaultWait]\r\n );\r\n}\r\n\r\nexport interface ISILTransactionArgs {\r\n [key: string]: string; // alows object to be indexed\r\n transaction: string; // required\r\n csrfToken: string; // required\r\n arg01?: string;\r\n arg02?: string;\r\n arg03?: string;\r\n arg04?: string;\r\n arg05?: string;\r\n arg06?: string;\r\n arg07?: string;\r\n arg08?: string;\r\n arg09?: string;\r\n arg10?: string;\r\n arg11?: string;\r\n arg12?: string;\r\n}\r\n// Taken and typified from post.jsskel :(\r\n// This function is called in the onclick handler of an anchor element that we\r\n// want to change to a POST dynamically.\r\n// Call like example: return postTransactionUrl({transaction: \"becoeinstadmin\", csfrToken: \"abcd123\", arg01: \"something\"})\r\nexport function postTransactionUrl(args: ISILTransactionArgs) {\r\n try {\r\n const form = document.createElement(\"form\") as HTMLFormElement;\r\n form.action = \"human.aspx\";\r\n form.method = \"post\";\r\n Object.keys(args).forEach(argName => {\r\n const field = document.createElement(\"input\") as HTMLInputElement;\r\n field.type = \"hidden\";\r\n field.name = argName;\r\n field.value = args[argName] || \"\";\r\n form.appendChild(field);\r\n });\r\n document.body.appendChild(form);\r\n form.submit();\r\n } catch (e) {\r\n alert(\"Post Transaction Failed: \" + e);\r\n }\r\n return false;\r\n}\r\n","import { Action } from \"../Action\";\r\n\r\nconst development: boolean = process.env.NODE_ENV && process.env.NODE_ENV === \"development\";\r\n\r\nexport function isDev(): boolean {\r\n return development;\r\n}\r\n\r\nexport function logDispatchedAction(state: any, action: Action): void {\r\n if (!isDev()) return;\r\n console.log(\r\n `\r\n%cAction Dispatched: %c%s\r\n%cCurrent State: %O\r\nPayload: %O\r\n `,\r\n \"font-weight: bold\",\r\n \"font-weight: bold; color: red;\",\r\n action.type,\r\n \"font-weight: normal\",\r\n state,\r\n action.payload\r\n );\r\n}\r\n","export function foldersWereDropped(dataTransfer: DataTransfer): boolean {\r\n const items = dataTransfer.items;\r\n const files = dataTransfer.files;\r\n\r\n if (items) {\r\n const count = items.length;\r\n for (let i = 0; i < count; i++) {\r\n if (dataTransferItemIsFolder(items[i])) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n // IE does not have an items collection on drag events,\r\n // and will return a zero-length files collection if\r\n // a folder was dropped.\r\n if (files.length === 0) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function getFileArrayFromDragDataTransfer(dataTransfer: DataTransfer): File[] {\r\n const items = dataTransfer.items;\r\n const files = dataTransfer.files;\r\n\r\n // IE will not have an items collection on drag events.\r\n return items ? getFileArrayFromDataTransferItemList(items) : getFileArrayFromFileList(files);\r\n}\r\n\r\nexport function getFileArrayFromFileList(items: FileList): File[] {\r\n const output = new Array();\r\n const count = items.length;\r\n for (let i = 0; i < count; i++) {\r\n output.push(items[i]);\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction getFileArrayFromDataTransferItemList(items: DataTransferItemList): File[] {\r\n const output = new Array();\r\n const count = items.length;\r\n for (let i = 0; i < count; i++) {\r\n const item = items[i];\r\n if (!dataTransferItemIsFolder(item)) {\r\n output.push(item.getAsFile());\r\n }\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction dataTransferItemIsFolder(item: DataTransferItem): boolean {\r\n if (item.webkitGetAsEntry) {\r\n const entryItem = item.webkitGetAsEntry();\r\n return entryItem.isDirectory;\r\n }\r\n\r\n return false;\r\n}\r\n","import { IntlShape } from \"react-intl\";\r\nimport moment from \"moment\";\r\n\r\nexport const KiB = 1024;\r\nexport const MiB = KiB * KiB;\r\nexport const GiB = KiB * MiB;\r\n\r\n/**\r\n * Checks for valid input and returns 0 if invalid.\r\n * Returns the floor of the number, to make sure we don't report 100%\r\n * if value is less than 100.\r\n */\r\nexport function formatPercent(num: number): string {\r\n if (Number.isNaN(num)) {\r\n return String(0);\r\n }\r\n return String(Math.floor(num));\r\n}\r\n\r\n/**\r\n * Returns the number if it is whole, or the number rounded to a single\r\n * decimal point if it is not whole, as a string.\r\n */\r\nexport function formatNumber(num: number): string {\r\n return Number.isInteger(num) ? num.toString() : num.toFixed(1);\r\n}\r\n\r\n/**\r\n * Returns a formatted bytecount with the appropriate translated unit\r\n * string appended.\r\n *\r\n * @param bytecount Bytecount to format.\r\n * @param intl Internationalization service object from react-intl.\r\n */\r\nexport function formatBytecount(bytecount: number, intl: IntlShape): string {\r\n if (bytecount >= GiB) {\r\n const gbCount = formatNumber(bytecount / GiB);\r\n return intl.formatMessage({ id: \"common.unit.gigabytes\" }, { value: gbCount });\r\n }\r\n\r\n if (bytecount >= MiB) {\r\n const mbCount = formatNumber(bytecount / MiB);\r\n return intl.formatMessage({ id: \"common.unit.megabytes\" }, { value: mbCount });\r\n }\r\n\r\n if (bytecount >= KiB) {\r\n const kbCount = formatNumber(bytecount / KiB);\r\n return intl.formatMessage({ id: \"common.unit.kilobytes\" }, { value: kbCount });\r\n }\r\n\r\n return intl.formatMessage({ id: \"common.unit.bytes\" }, { value: bytecount });\r\n}\r\n\r\n/**\r\n * Returns a simple formatted duration string with the provided value and unit string.\r\n *\r\n * @param value Value to display\r\n * @param unit Unit to display\r\n * @param intl Internationalization service object from react-intl\r\n */\r\nexport function formatDurationDescription(\r\n value: number,\r\n unit: \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"months\" | \"years\",\r\n intl: IntlShape\r\n): string {\r\n if (value === 1) {\r\n return intl.formatMessage(\r\n { id: \"common.duration.one\" },\r\n {\r\n unit: intl.formatMessage({\r\n id: `common.duration.unit.${unit}.single`,\r\n }),\r\n }\r\n );\r\n }\r\n\r\n return intl.formatMessage(\r\n { id: \"common.duration.multiple\" },\r\n {\r\n value,\r\n unit: intl.formatMessage({ id: `common.duration.unit.${unit}` }),\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Returns a formatted duration value with the appropriate translated units.\r\n *\r\n * @param milliseconds Length of duration\r\n * @param minimumUnit Smallest unit to include in resulting string\r\n * @param intl Internationalization service object from react-intl\r\n */\r\nexport function formatDuration(\r\n milliseconds: number,\r\n minimumUnit: \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"months\" | \"years\",\r\n intl: IntlShape\r\n): string {\r\n const duration = moment.duration(milliseconds);\r\n\r\n function lessThanOne(unit: string): string {\r\n return intl.formatMessage(\r\n { id: \"common.duration.lessThanOne\" },\r\n { unit: intl.formatMessage({ id: `common.duration.unit.${unit}.single` }) }\r\n );\r\n }\r\n\r\n function getDurationDescription(\r\n value: number,\r\n unit: \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"months\" | \"years\"\r\n ): string {\r\n return value < 1 ? \"\" : formatDurationDescription(value, unit, intl);\r\n }\r\n\r\n function assembleDescription(descriptionParts: string[]): string {\r\n return descriptionParts.filter((value) => value).join(\", \");\r\n }\r\n\r\n switch (minimumUnit) {\r\n case \"seconds\":\r\n if (duration.asSeconds() < 1) {\r\n return lessThanOne(\"seconds\");\r\n }\r\n break;\r\n case \"minutes\":\r\n if (duration.asMinutes() < 1) {\r\n return lessThanOne(\"minutes\");\r\n }\r\n break;\r\n case \"hours\":\r\n if (duration.asHours() < 1) {\r\n return lessThanOne(\"hours\");\r\n }\r\n break;\r\n case \"days\":\r\n if (duration.asDays() < 1) {\r\n return lessThanOne(\"days\");\r\n }\r\n break;\r\n case \"months\":\r\n if (duration.asMonths() < 1) {\r\n return lessThanOne(\"months\");\r\n }\r\n break;\r\n case \"years\":\r\n if (duration.asYears() < 1) {\r\n return lessThanOne(\"years\");\r\n }\r\n break;\r\n }\r\n\r\n const parts: string[] = [];\r\n\r\n parts.push(getDurationDescription(duration.years(), \"years\"));\r\n if (minimumUnit === \"years\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.months(), \"months\"));\r\n if (minimumUnit === \"months\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.days(), \"days\"));\r\n if (minimumUnit === \"days\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.hours(), \"hours\"));\r\n if (minimumUnit === \"hours\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.minutes(), \"minutes\"));\r\n if (minimumUnit === \"minutes\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.seconds(), \"seconds\"));\r\n return assembleDescription(parts);\r\n}\r\n\r\n// Adjusts a formatted datetime string to match MOVEit Transfer's existing datetime formatting\r\n// for various locales; these account for differences between .NET datetime formatting and\r\n// javascript datetime formatting.\r\nfunction adjustDateTimeString(locale: string, dateTimeString: string): string {\r\n // Remove commas and French à character\r\n dateTimeString = dateTimeString.replace(/,| (?:à)/, \"\");\r\n\r\n // Add space after character for Taiwanese\r\n if (locale === \"zh-TW\") {\r\n dateTimeString = dateTimeString.replace(/午/, \"午 \");\r\n }\r\n\r\n return dateTimeString;\r\n}\r\n\r\nexport function formatTransferLocaleDate(date: Date, intlLocale: string): string {\r\n let locale = intlLocale;\r\n const NUMERIC = \"numeric\";\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: NUMERIC,\r\n month: NUMERIC,\r\n day: NUMERIC,\r\n hour: locale === \"zh-TW\" ? \"2-digit\" : NUMERIC, // zh-TW uses 12 hour time, but two digit hours\r\n minute: NUMERIC,\r\n second: NUMERIC,\r\n };\r\n\r\n if (locale === \"zh-CN\") {\r\n // Chinese-Simple should have same format as Japanese\r\n locale = \"ja-JP\";\r\n }\r\n\r\n return adjustDateTimeString(locale, date.toLocaleDateString(locale, options));\r\n}\r\n\r\nexport function formatTransferLocaleTime(time: Date, intlLocale: string): string {\r\n let locale = intlLocale;\r\n const NUMERIC = \"numeric\";\r\n const options: Intl.DateTimeFormatOptions = {\r\n hour: locale === \"zh-TW\" ? \"2-digit\" : NUMERIC, // zh-TW uses 12 hour time, but two digit hours\r\n minute: NUMERIC,\r\n };\r\n\r\n if (locale === \"zh-CN\") {\r\n // Chinese-Simple should have same format as Japanese\r\n locale = \"ja-JP\";\r\n }\r\n\r\n return adjustDateTimeString(locale, time.toLocaleTimeString(locale, options));\r\n}\r\n","export * from \"./formattingUtils\";\r\nexport * from \"./fileUtils\";\r\nexport * from \"./componentUtils\";\r\nexport * from \"./debugUtils\";\r\nexport * from \"./applicationUtils\";\r\n"],"names":["baseUrl","relativeUrl","startsWith","token","Authorization","access_token","language","this","endsWith","substr","length","tokenService","TokenService","getInstance","get","url","params","preventCache","doRequestWithToken","fullUrl","getApiUrl","headers","Object","assign","getNoCacheHeaders","getTokenHeaders","then","response","data","post","options","getAxiosRequestConfig","put","delete","signOut","revokeToken","stopTokenRefresh","startTokenRefresh","requestFn","getTokenAndExecuteRequest","forceRefresh","getToken","catch","error","status","object","isString","Promise","reject","detail","message","genericHandler","onUploadProgress","progressHandler","event","defaults","validateStatus","cancelToken","ApiService","getContacts","page","perPage","sortField","sortDirection","searchString","onBehalfOf","ContactsApiService","validateDownloadHash","hash","downloadId","fileId","logId","downloadid","fileid","logid","getFolderList","nameFilter","pathFilter","name","path","getFolderDetails","id","split","folderId","param","encodeURIComponent","FoldersApiService","getPublicKeys","orgId","makeUrl","beginKeyRotationEstimate","removeKeyRotationEstimate","getKeyRotationPassphrase","validateKeyRotationPassphrase","passphrase","getKeyRotationReminder","setKeyRotationReminder","reminderDate","beginKeyRotation","schedule","pauseKeyRotation","resumeKeyRotation","setKeyRotationSchedule","getKeyRotationStatus","removeKeyRotationStatus","endpoint","getPackageRequirements","PackagesApiService","generatePublicDownloadLink","publicLinkParams","getPublicLinkInfo","publicLinkId","deletePublicLink","PublicDownloadLinkApiService","updateLogos","useCustomNotifBranding","leftLogo","rightLogo","backgroundLogo","resetRightLogo","resetBackgroundLogo","FormData","append","SettingsApiService","SESSIONSTORAGEKEY_TOKEN","tokenServicePool","tokenPromise","timerHandle","refreshing","autoRefresh","tokenString","sessionStorage","getItem","JSON","parse","resetPool","getOwnPropertyNames","entry","resetTokenPromise","formHeaders","getFormHeaders","qs","stringify","clearToken","removeItem","unsetTimer","setTimer","expirationTimestamp","resolve","doAcquire","acquireToken","newToken","Date","now","isExpiredToken","TOKEN_REFRESH_THRESHOLD_SECONDS","shouldRefreshToken","refreshToken","processToken","expires_in","calculateTokenExpirationTimestamp","setItem","grant_type","refresh_token","dueTime","executeRefresh","setTimeout","clearTimeout","initResumableUpload","fileName","fileSize","comments","toString","continueResumableUpload","contentRange","fileHash","onProgress","cancelTokenSource","value","totalSize","startOffset","endOffset","isLastChunk","UploadApiService","getSelf","getUserList","usernameFilter","fullNameFilter","emailFilter","permissionFilter","statusFilter","username","fullName","email","permission","UsersApiService","default","props","Button","variant","onClick","window","location","href","makeApplicationLink","children","Beltline","className","BeltlineItem","label","labelClass","content","contentClass","BeltlineQuantity","quantity","quantityTotal","intl","useIntl","formatMessage","part","total","makeButton","additionalClasses","disabled","disable","primaryButton","primary","secondaryButton","secondary","cancelButton","cancel","Fragment","helpButton","help","type","onHelp","closeButton","close","onClose","sectionTitle","classes","DebouncedTextInput","useState","timerId","setTimerId","clearTimer","useEffect","onChange","e","newValue","target","onImmediateChange","onDebouncedChange","debounceTime","debounceChange","placeholder","placeHolder","Alert","messageId","FormattedMessage","details","FeatureGroupContent","FeatureGroupBoxedIconTitle","title","subtitle","alertBoxVariant","iconClassName","action","FeatureGroupIconTitle","FeatureGroupNumericTitle","titleNumber","date","formatTransferLocaleDate","locale","fragile","useField","field","meta","isInvalid","touched","htmlFor","Feedback","resolveLabel","replace","match","group","String","Math","round","max","Row","Col","xs","labelLeft","labelRight","ProgressBar","min","classNames","columns","useMemo","useTable","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","cellPadding","caption","map","headerGroup","ind1","getHeaderGroupProps","key","column","ind2","getHeaderProps","scope","render","row","getRowProps","cells","cell","getCellProps","pageTitle","WaitIndicator","description","useWaitIndicator","useBoolean","flag","setTrue","setFalse","waitElement","useWaitOnPromise","showWait","hideWait","promise","finally","values","messageValues","DEBOUNCE_INTERVAL","TRANSFER_DOC_VERSION","hashFile","file","md","Rusha","createHash","chunksize","hashParts","offset","size","blob","nextPart","slice","newOffset","fr","FileReader","addEventListener","result","readAsArrayBuffer","update","progress","hashNextPart","digest","userType","languageCode","getHelpUrl","targetId","makeLinkPart","linkParts","push","arg01","arg02","arg03","arg04","arg05","arg06","arg07","arg08","arg09","arg10","arg11","arg12","filter","x","join","navigateToApplicationLink","link","useGetLatest","obj","ref","useRef","current","useCallback","useToggle","initial","setFlag","output","toLowerCase","defaultFn","defaultWait","debounceRef","getDefaultFn","getDefaultWait","timeout","args","document","createElement","method","keys","forEach","argName","appendChild","body","submit","alert","isDev","state","getFileArrayFromFileList","items","Array","count","i","dataTransferItemIsFolder","item","webkitGetAsEntry","isDirectory","dataTransfer","files","getAsFile","getFileArrayFromDataTransferItemList","formatNumber","num","Number","isInteger","toFixed","formatDurationDescription","unit","adjustDateTimeString","dateTimeString","KiB","MiB","GiB","isNaN","floor","bytecount","gbCount","mbCount","kbCount","milliseconds","minimumUnit","duration","lessThanOne","getDurationDescription","assembleDescription","descriptionParts","asSeconds","asMinutes","asHours","asDays","asMonths","asYears","parts","years","months","days","hours","minutes","seconds","intlLocale","NUMERIC","year","month","day","hour","minute","second","toLocaleDateString","time","toLocaleTimeString"],"sourceRoot":""}