{"version":3,"file":"splash-page.js","mappings":"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","sources":["webpack://asp.net/./Scripts/AssetTracker/cookie-confirmation-handler.ts","webpack://asp.net/./Scripts/SplashPage/splash-page.ts","webpack://asp.net/../TrifortCMS.Web.Common/Scripts/Common/bootstrap-helpers.ts","webpack://asp.net/../TrifortCMS.Web.Common/Scripts/Common/constants.ts","webpack://asp.net/../TrifortCMS.Web.Common/Scripts/Common/http-service.ts","webpack://asp.net/../TrifortCMS.Web.Common/Scripts/Common/string.ts","webpack://asp.net/../TrifortCMS.Web.Common/Scripts/Common/toast-service.ts","webpack://asp.net/../TrifortCMS.Web.Common/Scripts/Common/validation-helper.ts","webpack://asp.net/webpack/bootstrap","webpack://asp.net/webpack/startup"],"sourcesContent":["export class CookieConfirmationHandler {\r\n public static ShowCookieConfirmationDialogIfRequired() {\r\n var consentAnswer = localStorage.getItem(\"AssetTrackerCookieConsent\");\r\n \r\n if (!consentAnswer) {\r\n $(\"#cookieConsent\").removeClass(\"accepted\")\r\n }\r\n\r\n $(\"#acceptCookies\").off(\"click\").on(\"click\", function () {\r\n localStorage.setItem(\"AssetTrackerCookieConsent\", \"Accepted\");\r\n $(\"#cookieConsent\").addClass(\"accepted\")\r\n });\r\n }\r\n}","import { BootstrapHelpers } from \"../../../TrifortCMS.Web.Common/Scripts/Common/bootstrap-helpers\";\r\nimport { HttpService } from \"../../../TrifortCMS.Web.Common/Scripts/Common/http-service\";\r\nimport { ISubscriptionTemplate } from \"../Interfaces\";\r\nimport { CookieConfirmationHandler } from \"../AssetTracker/cookie-confirmation-handler\";\r\n\r\nclass SplashPageViewModel {\r\n private _subscriptionTemplates: ISubscriptionTemplate[];\r\n\r\n public async InitAsync() {\r\n \"use strict\"; // Start of use strict\r\n var self = this;\r\n\r\n // Smooth scrolling using jQuery easing\r\n $('a.js-scroll-trigger[href*=\"#\"]:not([href=\"#\"])').click(function () {\r\n var thisObj = this as any;\r\n\r\n if (location.pathname.replace(/^\\//, '') == thisObj.pathname.replace(/^\\//, '') && location.hostname == thisObj.hostname) {\r\n var target = $(thisObj.hash);\r\n target = target.length ? target : $('[name=' + thisObj.hash.slice(1) + ']');\r\n if (target.length) {\r\n \r\n $('html, body').animate({\r\n scrollTop: (target.offset().top - 48)\r\n }, 1000, \"easeInOutExpo\");\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n // Closes responsive menu when a scroll trigger link is clicked\r\n $('.js-scroll-trigger').click(function () {\r\n $('.navbar-collapse').collapse('hide');\r\n });\r\n\r\n // Activate scrollspy to add active class to navbar items on scroll\r\n $('body').scrollspy({\r\n target: '#mainNav',\r\n offset: 54\r\n });\r\n\r\n // Collapse Navbar\r\n var navbarCollapse = function () {\r\n if ($(\"#mainNav\").offset().top > 100) {\r\n $(\"#mainNav\").addClass(\"navbar-shrink\");\r\n } else {\r\n $(\"#mainNav\").removeClass(\"navbar-shrink\");\r\n }\r\n };\r\n // Collapse now if page is not at top\r\n navbarCollapse();\r\n // Collapse the navbar when page is scrolled\r\n $(window).scroll(navbarCollapse);\r\n\r\n // Populate the subscriptionTemplates array\r\n var subscriptionTemplatesResponse = await HttpService.getDataAsync('/Metadata/SubscriptionTemplates', null);\r\n if (subscriptionTemplatesResponse.Ok) {\r\n self._subscriptionTemplates = subscriptionTemplatesResponse.Data as ISubscriptionTemplate[];\r\n\r\n // Set the appropriate number of plans to select\r\n $('#PlanSelector').attr('max', self._subscriptionTemplates.length - 1);\r\n\r\n // Set the initial plan to the first plan\r\n $('#PlanSelector').val(0);\r\n\r\n self.updateDisplayedPlan();\r\n }\r\n\r\n // Configure the Subscription Dialog\r\n // Modify the displayed plan when the user changes the plan type selector\r\n $('#PlanSelector').on('input', function () {\r\n self.updateDisplayedPlan();\r\n });\r\n\r\n // If the User hasn't accepted our Cookie Policy, show the dialog.\r\n CookieConfirmationHandler.ShowCookieConfirmationDialogIfRequired();\r\n }\r\n\r\n updateDisplayedPlan() {\r\n var self = this;\r\n\r\n var selectedPlanIndex = $('#PlanSelector').val() as number;\r\n\r\n var selectedPlanTemplate = self._subscriptionTemplates[selectedPlanIndex];\r\n\r\n $('#NewSubscriptionTemplateName').text(selectedPlanTemplate.name);\r\n $('#NewSubscriptionTemplateCost').text('£' + selectedPlanTemplate.pricePerMonth + ' / Month');\r\n $('#NewSubscriptionItem1').text(selectedPlanTemplate.maxAssets + ' Assets');\r\n $('#NewSubscriptionItem2').text(selectedPlanTemplate.maxUsers + ' User Logins');\r\n $('#NewSubscriptionItem3').text(selectedPlanTemplate.maxContacts != undefined ? selectedPlanTemplate.maxContacts + ' Contacts' : 'Unlimited Contacts');\r\n\r\n BootstrapHelpers.InitialiseBootstrapTooltips();\r\n }\r\n}\r\n\r\n$(document).ready(async function () {\r\n var vm = new SplashPageViewModel();\r\n await vm.InitAsync();\r\n});","/**\r\n * A collection of helper functions for bootstrap 4\r\n */\r\nexport module BootstrapHelpers {\r\n\r\n var bootstrap = (globalThis as any).bootstrap;\r\n\r\n export function IsDropdownMenu(elementSelector: string) {\r\n return $(elementSelector).hasClass('dropdown-menu');\r\n }\r\n\r\n export function IsDropdownMenuShown(elementSelector: string) {\r\n return $(elementSelector).hasClass('show');\r\n }\r\n\r\n export function GetDropdownMenuLink(menuElementSelector: string) : JQuery {\r\n // We need to find the previous dropdown-toggle element and click it\r\n return $(menuElementSelector).prev('.dropdown-toggle');\r\n }\r\n\r\n export function IsTab(elementSelector: string) {\r\n return $(elementSelector).hasClass('nav-item');\r\n }\r\n\r\n export async function ShowTabBySelector(elementSelector: string) {\r\n $(elementSelector).tab('show');\r\n // Wait a bit for the tab to render\r\n await new Promise(resolve => setTimeout(resolve, 250));;\r\n }\r\n\r\n // Show the specified tab.\r\n // htmlElement is the a link for the tab\r\n export function ShowTab(htmlElement: HTMLElement) {\r\n new bootstrap.Tab(htmlElement).show();\r\n }\r\n\r\n export function InitialiseBootstrapTooltips() {\r\n var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\r\n var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl: any) {\r\n return new bootstrap.Tooltip(tooltipTriggerEl)\r\n })\r\n }\r\n\r\n export function TooltipHtmlFor(message: string) : string {\r\n return ``;\r\n }\r\n\r\n export function MoreInfoHtmlFor(moreInfoUrl: string) : string {\r\n return ``;\r\n }\r\n\r\n export function ClearTooltip(jquerySelector: JQuery) {\r\n jquerySelector.removeAttr('title');\r\n jquerySelector.tooltip('dispose');\r\n }\r\n\r\n export function AddTooltip(jquerySelector: JQuery, tooltipText: string) {\r\n jquerySelector.data('bs-toggle', \"tooltip\");\r\n jquerySelector.data('bs-placement', \"top\");\r\n jquerySelector.attr('title', tooltipText);\r\n jquerySelector.tooltip();\r\n }\r\n\r\n /**\r\n * Closes a bootstrap dropdown menu and optionally sets the autoClose property\r\n * @param dropdownMenuLinkSelector\r\n * @param disableAutoClose\r\n * @returns\r\n */\r\n export function CloseDropdownMenu(dropdownMenuLinkSelector: string, autoClose?: boolean) {\r\n\r\n // Find the dropdown menu link element\r\n const $dropdownMenuLink = $(dropdownMenuLinkSelector);\r\n\r\n if ($dropdownMenuLink.length === 0) {\r\n return;\r\n }\r\n\r\n const dropdown = new bootstrap.Dropdown($dropdownMenuLink[0]);\r\n\r\n dropdown.hide();\r\n\r\n if (autoClose !== undefined) {\r\n dropdown._config.autoClose = autoClose;\r\n }\r\n }\r\n\r\n /**\r\n * Opens a bootstrap dropdown menu and returns a promise which resolves when the dropdown menu is visible\r\n * @param dropdownMenuLinkSelector\r\n * @returns\r\n */\r\n export function OpenDropdownMenuFromLink(dropdownMenuLinkSelector: string, disableAutoClose?: boolean): Promise {\r\n return new Promise((resolve, reject) => {\r\n // Ensure jQuery is loaded\r\n if (typeof jQuery === 'undefined') {\r\n reject(new Error('jQuery is not loaded'));\r\n return;\r\n }\r\n\r\n // Find the dropdown menu link element\r\n const $dropdownMenuLink = $(dropdownMenuLinkSelector);\r\n\r\n if ($dropdownMenuLink.length === 0) {\r\n reject(new Error('Dropdown menu link element not found'));\r\n return;\r\n }\r\n\r\n try {\r\n // Bootstrap 5 dropdown instance\r\n const dropdown = new bootstrap.Dropdown($dropdownMenuLink[0]);\r\n\r\n // Open the dropdown\r\n dropdown.show();\r\n\r\n // Disable close on click\r\n if (disableAutoClose === true) {\r\n dropdown._config.autoClose = false;\r\n }\r\n resolve();\r\n\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n export function ClickButton(buttonSelector: string) {\r\n const $button = $(buttonSelector);\r\n\r\n if ($button.length === 0) {\r\n return;\r\n }\r\n\r\n $button.click();\r\n }\r\n}","export const EmptyGuid = \"00000000-0000-0000-0000-000000000000\";\r\nexport const EmptyImageDataStream = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAMSURBVBhXY/j//z8ABf4C/qc1gYQAAAAASUVORK5CYII=\";\r\n\r\nexport const SyncfusionLicenceKey = 'ORg4AjUWIQA/Gnt2VFhhQlJBfV5AQmBIYVp/TGpJfl96cVxMZVVBJAtUQF1hSn5WdkFjUXtddXJUR2NV';\r\n\r\nexport const MethodNotAllowedMessage = \"Could not perform action.\";\r\nexport const ConcurrencyErrorMessage = \"Changes have been made since this page was loaded. Please refresh the page.\";\r\n\r\nexport const FileTypeImageId = \"f4becaa9-bd9f-4ca9-810d-5816d9df2df3\";\r\nexport const FileTypeHtmlId = \"3fb8421c-c62a-47e7-808c-6a80310a2399\";\r\nexport const FileTypeOfficeId = \"f3cd09cc-8d2c-468a-9e2a-3640bfda0a77\";\r\nexport const FileTypeGDocsId = \"c1f25d8a-9b3c-4717-a71f-36c76ed02ed6\";\r\nexport const FileTypeTextId = \"ad476ff5-b79e-4a33-bf68-6aa248473bee\";\r\nexport const FileTypeVideoId = \"4c384976-1f78-4a9e-9cf1-450d02bbae9b\";\r\nexport const FileTypeAudioId = \"5267f47d-2dad-41d0-9264-e0ad171e2321\";\r\nexport const FileTypeFlashId = \"395d2eb6-522f-415d-a688-c477296abbe2\";\r\nexport const FileTypePdfId = \"4c4f6c97-bd7e-411f-846c-fa97baf856c6\";\r\n\r\nexport const FileTypesToAcceptedFileTypes: {[fileTypeId: string]: string } = {\r\n [FileTypeImageId]: \"image/*\",\r\n [FileTypeHtmlId]: \"text/html\",\r\n [FileTypeOfficeId]: \".doc, .docx, .xls, .xlsx, .ppt, .pptx, .pps, .pot, .potx\",\r\n [FileTypeGDocsId]: \".doc, .docx, .xls, .xlsx, .ppt, .pptx, .pps, .pot, .potx, .rtf, .ods, .odt, .pages, .ai, .dxf, .ttf, .tif, .tiff, .wmf , .eps, .ps\",\r\n [FileTypeTextId]: \"text/*\",\r\n [FileTypeVideoId]: \"video/*\",\r\n [FileTypeAudioId]: \"audio/*\",\r\n [FileTypeFlashId]: \"application/x-shockwave-flash\",\r\n [FileTypePdfId]: \"application/pdf\",\r\n}\r\n\r\n/// \r\n/// Scope names which help us inform the browser when to fetch new data\r\n/// \r\nexport class BrowserCacheScopes {\r\n /// \r\n /// Refresh cache when system is restarted\r\n /// \r\n public static SystemDataChanged = \"SystemDataChanged\";\r\n}\r\n\r\nexport class DataAttributeNames {\r\n public static DomRootFieldTags = 'trifort-cms-field-tags';\r\n}","import { StringUtilities } from \"../Common/string\";\r\nimport { ConcurrencyErrorMessage, MethodNotAllowedMessage } from \"./constants\";\r\nimport { ToastService } from \"./toast-service\";\r\nimport { ValidationHelper } from \"./validation-helper\";\r\n\r\nexport enum HttpMethod {\r\n POST = \"POST\",\r\n GET = \"GET\",\r\n PUT = \"PUT\",\r\n DELETE = \"DELETE\"\r\n}\r\n\r\nexport interface IHttpRequest {\r\n /** The Http Method */\r\n Method: HttpMethod;\r\n /** The Data to send */\r\n Data?: TRequest;\r\n /** The Url */\r\n Url: string;\r\n /** The query names and values */\r\n Query?: Record;\r\n /** The Toast Success Message */\r\n SuccessMessage?: string;\r\n /** Whether to supress the Success Message */\r\n SupressSuccessMessage?: boolean;\r\n /** The key for the Validation Store */\r\n ValidationKey?: string;\r\n /** The element(s?) to show validation on */\r\n ValidationElement?: string;\r\n ContentType?: string;\r\n DownloadFile?: boolean;\r\n CustomHeaders?: Headers;\r\n}\r\n\r\nexport interface IHttpFileUploadRequest {\r\n /** File object that will be uploaded */\r\n Filedata: any;\r\n /** Additional Data to send */\r\n OtherData?: TRequest;\r\n /** The Url */\r\n Url: string;\r\n /** The Toast Success Message */\r\n SuccessMessage?: string;\r\n /** Whether to supress the Success Message */\r\n SupressSuccessMessage?: boolean;\r\n /** The key for the Validation Store */\r\n ValidationKey?: string;\r\n}\r\n\r\nexport interface IErrorCollection {\r\n isWarning: boolean;\r\n errorMessage: string;\r\n objectId: string;\r\n}\r\n\r\nexport interface IHttpResponseData {\r\n [key: string]: any;\r\n hasError?: boolean;\r\n hasBoundErrors?: boolean;\r\n errorCollection?: IErrorCollection[];\r\n}\r\n\r\nexport interface IHttpResponse {\r\n Data?: TResponse;\r\n Status: number;\r\n Headers: Headers;\r\n StatusText: string;\r\n Ok: boolean;\r\n AccessDenied: boolean;\r\n}\r\n\r\nexport class HttpResponse implements IHttpResponse {\r\n public Data?: TResponse;\r\n public Status: number;\r\n public StatusText: string;\r\n public Ok: boolean;\r\n public Redirected: boolean = false;\r\n public AccessDenied: boolean = false;\r\n public Headers: Headers;\r\n\r\n // Some clever stuff, by TypeScript, allow initializing this object, with a \"Partial\" definition of itself\r\n public constructor(init?: Partial>) {\r\n Object.assign(this, init);\r\n }\r\n}\r\n\r\n/**\r\n * A Module containing functions to assist in calling http endpoints\r\n */\r\nexport module HttpService {\r\n\r\n export function createQueryString(params: { [key: string]: any }): string {\r\n const queryString = Object.keys(params)\r\n .map(key => {\r\n const value = params[key];\r\n if (Array.isArray(value)) {\r\n return value.map(val => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`).join('&');\r\n } else {\r\n return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\r\n }\r\n })\r\n .join('&');\r\n return queryString;\r\n }\r\n\r\n export async function getFileAsync(url: string, data: any, buttonSelector ?: string | HTMLElement): Promise> {\r\n if(data != null) {\r\n var dataParams = $.param(data);\r\n data = null;\r\n url += \"?\" + dataParams;\r\n }\r\n return await sendDataAsync(HttpMethod.GET, url, data, buttonSelector, null, true, true);\r\n }\r\n\r\n /// \r\n /// Sends a POST request to the server that downloads a file\r\n /// \r\n export async function getFileFromServerAsPostAsync(url: string, data: any, buttonSelector?: string | HTMLElement): Promise> {\r\n return await sendDataAsync(HttpMethod.POST, url, data, buttonSelector, null, true, true);\r\n }\r\n\r\n export async function getDataAsync(url: string, data: any, buttonSelector ?: string | HTMLElement): Promise > {\r\n if(data != null) {\r\n var dataParams = $.param(data);\r\n data = null;\r\n url += \"?\" + dataParams;\r\n }\r\n\r\n return await sendDataAsync(HttpMethod.GET, url, data, buttonSelector, null, true);\r\n }\r\n \r\n export async function postDataAsync(url: string, data: any, buttonSelector: string | HTMLElement, validationKey: string, surpressSuccessMessage: boolean = false): Promise> {\r\n return await sendDataAsync(HttpMethod.POST, url, data, buttonSelector, validationKey, surpressSuccessMessage);\r\n }\r\n\r\n export async function deleteDataAsync(url: string, data: any, buttonSelector: string, validationKey: string): Promise> {\r\n return await sendDataAsync(HttpMethod.DELETE, url, data, buttonSelector, validationKey);\r\n }\r\n \r\n\r\n async function sendDataAsync(method: HttpMethod, url: string, data: any, buttonIdentifier: string | HTMLElement, validationKey: string, surpressSuccessMessage: boolean = false, downloadFile: boolean = false): Promise> {\r\n // Disable the button and put a spinner there\r\n let button: JQuery = null;\r\n \r\n if(buttonIdentifier as HTMLElement != null) {\r\n button = $(buttonIdentifier as HTMLElement);\r\n } else {\r\n button = $(buttonIdentifier as string);\r\n }\r\n\r\n button.prop('disabled', true);\r\n\r\n button.append(' ');\r\n\r\n var httpResponse = await callHttpService({\r\n Method: method,\r\n Url: url,\r\n Data: data,\r\n ValidationKey: validationKey,\r\n SupressSuccessMessage: surpressSuccessMessage,\r\n DownloadFile: downloadFile\r\n });\r\n\r\n // Remove the spinner\r\n $(button).find(\"i.fa-spinner\").remove();\r\n\r\n button.prop('disabled', false);\r\n\r\n return httpResponse;\r\n }\r\n \r\n export async function postFileDataAsync(url: string, data: any, buttonSelector: string, validationKey: string): Promise> {\r\n // Disable the button and put a spinner there\r\n var button = $(buttonSelector);\r\n\r\n button.prop('disabled', true);\r\n\r\n button.append(' ');\r\n\r\n var httpResponse = await callHttpService({\r\n Method: HttpMethod.POST,\r\n Url: url,\r\n Data: data,\r\n ContentType: 'multipart/form-data',\r\n ValidationKey: validationKey\r\n });\r\n\r\n button.prop('disabled', false);\r\n\r\n // Remove the spinner\r\n $(buttonSelector + \" > i.fa-spinner\").remove();\r\n\r\n return httpResponse;\r\n }\r\n \r\n export function hasErrors(response: IHttpResponseData): boolean {\r\n return response.AccessDenied || !response.Ok || (response.Data != undefined && response.Data.hasError);\r\n }\r\n\r\n /**\r\n * \r\n * @param request The Request to Execute\r\n */\r\n export async function call(request: IHttpRequest): Promise> {\r\n try {\r\n var contentType = 'application/json';\r\n var body = null as BodyInit;\r\n var headers = new Headers({\r\n 'X-Requested-With': 'XMLHttpRequest' // AJAX Request\r\n });\r\n\r\n if (request.ContentType == 'multipart/form-data') {\r\n contentType = undefined; // Browser will override this\r\n body = request.Data as FormData;\r\n }\r\n else {\r\n if (request.Data != null) {\r\n body = JSON.stringify(request.Data);\r\n }\r\n headers.append('content-type', contentType);\r\n headers.append('accept', 'application/json');\r\n }\r\n\r\n if (request.CustomHeaders != null) {\r\n request.CustomHeaders.forEach((value: string, key: string, parent: Headers) => {\r\n headers.append(key, value);\r\n });\r\n }\r\n\r\n const response = await fetch(request.Url, {\r\n method: request.Method,\r\n body: body,\r\n headers: headers,\r\n redirect: \"follow\"\r\n });\r\n\r\n // Check if the response status is 401 and if there is a RedirectLocation header\r\n if (response.status === 401 && response.headers.has('Location')) {\r\n const redirectUrl = response.headers.get('Location');\r\n // Redirect the user to the specified location\r\n window.location.href = redirectUrl;\r\n }\r\n\r\n if (request.DownloadFile)\r\n return await handleFileDownload(response);\r\n else\r\n return await handleUrlResponse(response);\r\n }\r\n catch (err) {\r\n // TODO: Could maybe throw and let store action handle?\r\n }\r\n }\r\n \r\n export async function callHttpService (request: IHttpRequest): Promise> {\r\n ValidationHelper.RemoveFormErrors(request.ValidationKey);\r\n\r\n // Add on CSRF token into header if one is available\r\n var csrfToken = $('[name=\"__RequestVerificationToken\"]').val();\r\n if(csrfToken != null) {\r\n request.CustomHeaders = request.CustomHeaders = request.CustomHeaders || new Headers();\r\n\r\n request.CustomHeaders.append('RequestVerificationToken', csrfToken as string);\r\n }\r\n \r\n const response = await HttpService.call(request);\r\n\r\n if (response == null) {\r\n ToastService.sendToast({ Message: \"No Response Recieved From Server\", Status: \"Error\", RemoveExistingToasts: true });\r\n } else if (response.AccessDenied) {\r\n ToastService.sendToast({ Message: \"You don't have permissions for this operation.\", Status: \"Error\", RemoveExistingToasts: true });\r\n }\r\n else if (!response.Ok) {\r\n var errorMessage = \"\";\r\n \r\n if (response.Status == 405)\r\n errorMessage = MethodNotAllowedMessage;\r\n else if (response.Status == 409)\r\n errorMessage = ConcurrencyErrorMessage\r\n else\r\n errorMessage = \"Unexpected error encountered, operation failed.\"\r\n\r\n ToastService.sendToast({ Message: errorMessage, Status: \"Error\", RemoveExistingToasts: true });\r\n }\r\n else if (response.Data != undefined && response.Data.hasError) {\r\n if (request.ValidationKey) {\r\n ValidationHelper.ParseValidation(response.Data.errorCollection, request.ValidationKey);\r\n }\r\n else {\r\n // If no validation key was specified, just display a toast\r\n var options: ToastrOptions = {\r\n closeButton: true,\r\n timeOut: 0\r\n };\r\n \r\n response.Data.errorCollection.map(function (item, index) {\r\n ToastService.sendToast({ Message: item.errorMessage, Status: \"Error\", Options: options, RemoveExistingToasts: index == 0 });\r\n });\r\n }\r\n }\r\n else if (request.SupressSuccessMessage !== true) {\r\n // Response was ok, possibly reload the page?\r\n ToastService.sendToast({ Message: request.SuccessMessage || \"Operation completed Successfully\", Status: \"Success\", RemoveExistingToasts: true });\r\n }\r\n\r\n return response;\r\n }\r\n\r\n async function handleUrlResponse(response: Response): Promise> {\r\n try {\r\n const fnResponse = new HttpResponse({\r\n StatusText: response.statusText,\r\n Ok: response.ok,\r\n Status: response.status,\r\n Headers: response.headers,\r\n })\r\n\r\n if (fnResponse.Ok && !response.redirected) {\r\n // Only de-serialize data if the response was a good one and the response body actually has some data.\r\n var bodyText = await response.text();\r\n\r\n if (bodyText.length > 0) {\r\n fnResponse.Data = (JSON.parse(bodyText)) as TResponse;\r\n }\r\n }\r\n\r\n if (fnResponse.Ok && response.redirected && StringUtilities.contains(response.url, \"AccessDenied\")) {\r\n // Response is ok, however we've been redirected (due to not having the correct permissions)\r\n return new HttpResponse({\r\n Ok: false,\r\n StatusText: null,\r\n Status: 0,\r\n AccessDenied: true,\r\n Headers: response.headers\r\n });\r\n }\r\n\r\n return fnResponse;\r\n }\r\n catch (err) {\r\n const errorsFromHttp = err;\r\n // TODO: Could maybe throw and let store action handle?\r\n }\r\n }\r\n\r\n async function handleFileDownload(response: Response): Promise> {\r\n try {\r\n var contentType = response.headers.get('content-type');\r\n const fnResponse = new HttpResponse({\r\n StatusText: response.statusText,\r\n Ok: response.ok,\r\n Status: response.status,\r\n Headers: response.headers,\r\n });\r\n\r\n // in some cases we dont have data so we dont return an empty file we return Http code NoContect\r\n if (fnResponse.Status === 204) {\r\n return fnResponse;\r\n }\r\n\r\n //if there is a validation error we dont get the file we get error collection as json.\r\n if (response.ok && contentType.lastIndexOf(\"json\") < 0) {\r\n var blob = await response.blob();\r\n var file = window.URL.createObjectURL(blob);\r\n var fileNameHeader = response.headers.get('Content-Disposition');\r\n if (fileNameHeader == null) {\r\n window.open(file);\r\n }\r\n else {\r\n var fileNameHeaders = response.headers.get('Content-Disposition').split(\";\");\r\n var startFileName = fileNameHeaders.find(x => x.indexOf(\"filename=\") > 0);\r\n var fileName = startFileName.replace(\"filename=\", \"\").trim();\r\n var a = document.createElement('a');\r\n a.href = file;\r\n a.download = fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n }\r\n }\r\n else if (response.ok && contentType.lastIndexOf(\"json\") > 0) {\r\n if (fnResponse.Ok && !response.redirected) {\r\n // Only de-serialize data if the response was a good one and the response body actually has some data.\r\n var bodyText = await response.text();\r\n if (bodyText.length > 0) {\r\n fnResponse.Data = (JSON.parse(bodyText));\r\n }\r\n }\r\n }\r\n return fnResponse;\r\n\r\n }\r\n catch (err) {\r\n const errorsFromHttp = err;\r\n // TODO: Could maybe throw and let store action handle?\r\n }\r\n }\r\n}\r\n","/**\r\n * A collection of helper functions for strings\r\n */\r\nexport module StringUtilities {\r\n\r\n\r\n\r\n export function ApiDateToDisplayedDate(apiDate: string) {\r\n if (apiDate == '' || apiDate == undefined) {\r\n return '';\r\n }\r\n\r\n var date = new Date(apiDate);\r\n if (!isValidDate(date)) {\r\n return '';\r\n }\r\n\r\n var mm = date.getMonth() + 1; // getMonth() is zero-based\r\n var dd = date.getDate();\r\n\r\n return [(dd > 9 ? '' : '0') + dd + \"/\",\r\n (mm > 9 ? '' : '0') + mm + \"/\",\r\n date.getFullYear(),\r\n ].join('');\r\n }\r\n\r\n export function isValidDate(dateInstance: Date) {\r\n return dateInstance instanceof Date;\r\n }\r\n\r\n export function removeSpaces(s: string): string {\r\n if (s == null) {\r\n return null;\r\n }\r\n\r\n return s.replace(/\\s/g, '');\r\n }\r\n\r\n /**\r\n * Returns a boolean (true) if the string is empty.\r\n * @param str The string\r\n */\r\n export function isEmpty(str: string) {\r\n return str.length === 0;\r\n }\r\n\r\n /**\r\n * Returns a boolean (true) if the string is null or empty.\r\n * @param str The string\r\n */\r\n export function isEmptyOrNull(str: string) {\r\n return typeof str === 'undefined' || str === null || str.length === 0;\r\n }\r\n\r\n /**\r\n * Returns a boolean (true) if the string is null, empty or just whitespace.\r\n * @param str The string\r\n */\r\n export function isWhitespaceOrNull(str: string) {\r\n return typeof str === 'undefined' || str === null || str.trim().length === 0;\r\n }\r\n\r\n /**\r\n * Returns a boolean (true) if the base string contains the search term\r\n * @param baseString The string the search\r\n * @param searchTerm The search term\r\n * @param caseInsensitive Case Insensitive search?\r\n */\r\n export function contains(baseString: string, searchTerm: string, caseInsensitive: boolean = true) {\r\n if (caseInsensitive) {\r\n return baseString.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1;\r\n }\r\n\r\n return baseString.indexOf(searchTerm) !== -1;\r\n }\r\n\r\n export function capitaliseFirstChar(s: string) {\r\n if (typeof s !== 'string')\r\n return '';\r\n\r\n return s.charAt(0).toUpperCase() + s.slice(1);\r\n }\r\n\r\n export function decapitaliseFirstChar(s: string) {\r\n if (typeof s !== 'string')\r\n return '';\r\n\r\n return s.charAt(0).toLowerCase() + s.slice(1);\r\n }\r\n\r\n export function toCamelCase(s: string) {\r\n if (typeof s !== 'string')\r\n return '';\r\n\r\n return s.charAt(0).toLowerCase() + s.slice(1);\r\n }\r\n\r\n // takes a string in the format \"AStringLikeThis\" and converts it to \r\n // \"A String Like This\" by using capital letters as word boundaries\r\n export function convertToSentenceCase(input: string): string {\r\n const sb: string[] = [];\r\n\r\n for (let i = 0; i < input.length; i++) {\r\n const isFirstChar = i === 0;\r\n const isLastChar = i === input.length - 1;\r\n const charIsUpper = input[i] === input[i].toUpperCase();\r\n const nextCharIsUpper = !isLastChar && input[i + 1] === input[i + 1].toUpperCase();\r\n const prevCharWasLower = !isFirstChar && input[i - 1] === input[i - 1].toLowerCase();\r\n\r\n if (!isFirstChar && charIsUpper && sb[i - 1] !== ' ' && (!nextCharIsUpper || prevCharWasLower)) {\r\n sb.push(' ');\r\n }\r\n\r\n sb.push(input[i]);\r\n }\r\n\r\n return sb.join('');\r\n }\r\n\r\n export function coalesce(input: string | null, defaultValue: string): string {\r\n return input != null ? input : defaultValue;\r\n }\r\n}","export module ToastService {\r\n const _defaultOptions: ToastrOptions =\r\n {\r\n progressBar: true\r\n }\r\n\r\n export interface IToastRequest {\r\n RemoveExistingToasts: boolean,\r\n Message: string,\r\n Status: \"Error\" | \"Success\" | \"Info\" | \"Warning\",\r\n Options?: ToastrOptions;\r\n }\r\n\r\n export function sendToast(request: IToastRequest) {\r\n // If no options are defined, use the default settings\r\n request.Options ??= _defaultOptions;\r\n\r\n if (request.RemoveExistingToasts) {\r\n // Remove existing toasts from the screen\r\n toastr.remove()\r\n }\r\n\r\n const toastrFunc = (toastr as any)[request.Status.toLowerCase()];\r\n toastrFunc(request.Message, \"\", request.Options);\r\n }\r\n}","import { IErrorCollection } from \"./http-service\";\r\nimport { ToastService } from \"./toast-service\";\r\n\r\nexport class ValidationHelper {\r\n public static RaiseToastsForValidationErrors(httpResponseData: any) {\r\n if (httpResponseData != null && httpResponseData.errorCollection != null) {\r\n var options: ToastrOptions = {\r\n closeButton: true,\r\n timeOut: 0\r\n };\r\n\r\n (httpResponseData.errorCollection as []).map(function (item: any, index) {\r\n ToastService.sendToast({ Message: item.errorMessage, Status: \"Error\", Options: options, RemoveExistingToasts: index == 0 });\r\n });\r\n }\r\n }\r\n\r\n // ----------------------------------------------------------\r\n // Clears any errors off the form\r\n // ----------------------------------------------------------\r\n public static RemoveFormErrors(formId: string) {\r\n if (formId == null) {\r\n return;\r\n }\r\n\r\n if (!formId.startsWith('#') && !formId.startsWith('.')) {\r\n formId = '#' + formId;\r\n }\r\n\r\n $(formId + ' .has-error').removeClass('has-error');\r\n $(formId + ' .has-error-inline').removeClass('has-error-inline');\r\n $(formId + ' .error-state').removeClass('error-state');\r\n $(formId + ' .help-block').remove();\r\n }\r\n\r\n public static ParseValidation(data: IErrorCollection[], formId: string) {\r\n var formSelector = formId;\r\n if (!formId.startsWith('#') && !formId.startsWith('.')) {\r\n formSelector = '#' + formId;\r\n }\r\n\r\n ValidationHelper.RemoveFormErrors(formSelector);\r\n\r\n var message = '';\r\n if (data.length > 0) {\r\n $.each(data, function (i, item) {\r\n message = message + '

' + data[i].errorMessage + '

';\r\n \r\n if (data[i].objectId && data[i].objectId != '') {\r\n if (data[i].objectId.indexOf('.') > -1) {\r\n // If we've got a [.] in the Id (object Id generated by ASP.NET Core Validation) then escape it for jQuery selector (jQuery sees this as a class selector)\r\n data[i].objectId = data[i].objectId.replace('.', '\\\\.');\r\n }\r\n\r\n var ctrl = $(formSelector + ' #' + data[i].objectId);\r\n if (ctrl.length == 0) {\r\n // try with name\r\n ctrl = $(formSelector + ' [name=\"' + data[i].objectId + '\"]');\r\n }\r\n \r\n if (ctrl.length > 0) {\r\n ctrl.addClass('has-error');\r\n ctrl.addClass('error-state');\r\n\r\n var label = ctrl.closest('div.form-group, label');\r\n\r\n if (label.length == 0) {\r\n // If no label was found using standard search, search within the root div for a label 'for' the specified control\r\n label = $(formSelector + \" label[for='\" + data[i].objectId + \"']\");\r\n }\r\n\r\n var errorBlock = '' + data[i].errorMessage + '';\r\n\r\n if (label.length > 0) {\r\n label.addClass('has-error');\r\n }\r\n\r\n var helpBlockLocation = ctrl.next('.help-block-location');\r\n\r\n if (helpBlockLocation.length == 0) {\r\n // If no help block location was found using standard search, search within the root div for a label 'for' the specified control\r\n helpBlockLocation = $(formSelector + \" .help-block-location[for='\" + data[i].objectId + \"']\");\r\n }\r\n\r\n if (helpBlockLocation.length > 0) {\r\n helpBlockLocation.append(errorBlock);\r\n }\r\n else if (label.length > 0) {\r\n // no explicit help block location, add the error message after the label, if we have one\r\n label.append(errorBlock);\r\n }\r\n }\r\n else {\r\n // Display toasts for any unbound errors\r\n toastr.error(data[i].errorMessage);\r\n }\r\n }\r\n else {\r\n // Display toasts for any unbound errors\r\n toastr.error(data[i].errorMessage);\r\n }\r\n });\r\n }\r\n else {\r\n message = 'An Error Occurred Saving Changes';\r\n }\r\n }\r\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(78525);\n"],"names":["ShowCookieConfirmationDialogIfRequired","localStorage","getItem","$","removeClass","off","on","setItem","addClass","CookieConfirmationHandler","InitAsync","self","this","click","thisObj","location","pathname","replace","hostname","target","hash","length","slice","animate","scrollTop","offset","top","collapse","scrollspy","navbarCollapse","window","scroll","HttpService","getDataAsync","subscriptionTemplatesResponse","Ok","_subscriptionTemplates","Data","attr","val","updateDisplayedPlan","selectedPlanIndex","selectedPlanTemplate","text","name","pricePerMonth","maxAssets","maxUsers","undefined","maxContacts","BootstrapHelpers","InitialiseBootstrapTooltips","document","ready","SplashPageViewModel","bootstrap","globalThis","IsDropdownMenu","elementSelector","hasClass","IsDropdownMenuShown","GetDropdownMenuLink","menuElementSelector","prev","IsTab","ShowTabBySelector","tab","Promise","resolve","setTimeout","ShowTab","htmlElement","Tab","show","call","querySelectorAll","map","tooltipTriggerEl","Tooltip","TooltipHtmlFor","message","MoreInfoHtmlFor","moreInfoUrl","ClearTooltip","jquerySelector","removeAttr","tooltip","AddTooltip","tooltipText","data","CloseDropdownMenu","dropdownMenuLinkSelector","autoClose","$dropdownMenuLink","dropdown","Dropdown","hide","_config","OpenDropdownMenuFromLink","disableAutoClose","reject","jQuery","error","Error","ClickButton","buttonSelector","$button","EmptyGuid","EmptyImageDataStream","SyncfusionLicenceKey","MethodNotAllowedMessage","ConcurrencyErrorMessage","FileTypeImageId","FileTypeHtmlId","FileTypeOfficeId","FileTypeGDocsId","FileTypeTextId","FileTypeVideoId","FileTypeAudioId","FileTypeFlashId","FileTypePdfId","FileTypesToAcceptedFileTypes","SystemDataChanged","BrowserCacheScopes","DomRootFieldTags","DataAttributeNames","HttpMethod","init","Redirected","AccessDenied","Object","assign","HttpResponse","sendDataAsync","method","url","buttonIdentifier","validationKey","surpressSuccessMessage","downloadFile","button","prop","append","callHttpService","Method","Url","ValidationKey","SupressSuccessMessage","DownloadFile","httpResponse","find","remove","request","ValidationHelper","RemoveFormErrors","csrfToken","CustomHeaders","Headers","response","ToastService","sendToast","Message","Status","RemoveExistingToasts","hasError","ParseValidation","errorCollection","options","closeButton","timeOut","item","index","errorMessage","Options","SuccessMessage","handleUrlResponse","fnResponse","StatusText","statusText","ok","status","headers","redirected","bodyText","JSON","parse","StringUtilities","contains","handleFileDownload","contentType","get","lastIndexOf","blob","file","URL","createObjectURL","open","fileNameHeaders","split","startFileName","x","indexOf","fileName","trim","a","createElement","href","download","body","appendChild","createQueryString","params","keys","key","value","Array","isArray","encodeURIComponent","join","getFileAsync","dataParams","param","GET","getFileFromServerAsPostAsync","POST","postDataAsync","deleteDataAsync","DELETE","postFileDataAsync","ContentType","hasErrors","stringify","forEach","parent","fetch","redirect","has","redirectUrl","isValidDate","dateInstance","Date","ApiDateToDisplayedDate","apiDate","date","mm","getMonth","dd","getDate","getFullYear","removeSpaces","s","isEmpty","str","isEmptyOrNull","isWhitespaceOrNull","baseString","searchTerm","caseInsensitive","toLowerCase","capitaliseFirstChar","charAt","toUpperCase","decapitaliseFirstChar","toCamelCase","convertToSentenceCase","input","sb","i","isFirstChar","isLastChar","charIsUpper","nextCharIsUpper","prevCharWasLower","push","coalesce","defaultValue","_defaultOptions","progressBar","toastr","toastrFunc","RaiseToastsForValidationErrors","httpResponseData","formId","startsWith","formSelector","each","objectId","ctrl","label","closest","errorBlock","helpBlockLocation","next","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__"],"sourceRoot":""}