{"version":3,"sources":["Components/Utilities/SweetAlert.jsx","Components/Widgets/GenericLookupSelect.jsx","Components/Main/SubComponents/GenericSyncfusion/GenericSyncfusionSelectors.tsx","Components/Main/SubComponents/GenericSyncfusion/GenericSyncfusionTable.tsx","Components/Widgets/Toast.js","Components/Main/Operations/AudienceApplications/AudienceApplications.tsx","Components/Widgets/GenericTrainingSelect.jsx","Components/Widgets/UserSelect.jsx","Components/Main/SubComponents/GenericSyncfusion/GenericActionsMenu.tsx","Components/Utilities/Routes.tsx","Components/Widgets/Breadcrumbs.jsx","Components/Footer.tsx","Components/Widgets/Menu.jsx","Components/LogoBar.tsx","Components/Main.tsx","Components/Utilities/userManager.tsx","Components/Widgets/User.tsx","Components/Header.tsx","Components/Unauthenticated.tsx","Components/AccessDenied.tsx","App.tsx","Components/SilentRenew.tsx","Components/Callback.tsx","serviceWorker.ts","index.tsx","Components/Widgets/ThemeLoader.jsx","app/hooks.tsx","adapters/index.ts","features/user/userSlice.ts","app/reducers.tsx","middleware/userMiddleware.tsx","app/store.ts","Components/Utilities/QueryHelper.jsx","Components/Hooks/Query.jsx","features/user/selectors.tsx","Components/Utilities/helpers.tsx","features/prefsFeature/prefsSlice.tsx","Auth/can.js"],"names":["swalWithBootstrapButtons","Swal","mixin","customClass","confirmButton","cancelButton","buttonsStyling","GenericLookupSelect","id","onChange","onBlur","value","resource_name","service_name","resource_label","cssClass","select_field","valueKey","useState","items","setItems","error","setError","isLoaded","setIsLoaded","helper","setHelper","useQuery","useEffect","fetchData","fetchLookupData","then","result","message","undefined","className","map","i","ThemeLoader","height","width","GenericSyncfusionSelectors","options","setSelectorQuery","showClearBtn","selectors","selectorValues","setSelectorValues","activeFilters","setActiveFilters","filterInputs","setFilterInputs","checkedDefaults","setCheckedDefaults","filterClass","dispatch","useAppDispatch","prefsPath","resourceType","resourceName","join","checkDefaultValues","svs","length","forEach","sv","push","field","op","values","setAPIPref","key","selectorChangeHandler","s","find","selector","newSelectedValues","filter","buildFilters","supportedDataTypes","selectorColumn","columns","column","includes","dataType","currentValue","GenericTrainingSelect","selectResource","label","e","target","service","selectField","v","htmlFor","style","padding","checked","default","change","UserSelect","multiple","disabled","department","selected","console","log","buildSelector","lsFilters","selectPrefByPath","select","dynamicDefault","filterValue","type","onClick","initialState","count","Array","GenericSyncfusionTable","ability","useContext","AbilityContext","accountId","useAppSelector","userId","activePage","setActivePage","defaultPageSize","pageSize","setPageSize","searchString","setSearchString","selectorQuery","sortParams","setSortParams","gridControl","useRef","history","useHistory","previousQueryData","setPreviousQueryData","queryData","setQueryData","refreshData","setRefreshData","defaultOrder","setDefaultOrder","afterFetchCallback","setTimeout","current","hideSpinner","isEqual","fetchNow","a","showSpinner","results","totalResults","catch","criteria","setMembershipV3","setMembership","setMace","setMemberPortal","setNotification","pageId","orderBy","defaultSort","c","direction","defaultQuery","setDefault","dq","sq","searchField","fields","refresh","pageOptions","pageCount","pageSizes","nameTemplate","props","tag","isArray","routePath","link","to","booleanTemplate","imageTemplate","src","alt","name","selectTemplate","enumeration","parseInt","customTemplate","customComponent","object","dateTemplate","dayjs","format","subResourceTemplate","columnParts","split","hasOwnProperty","isLabel","toolbarActions","showRefresh","text","tooltipText","prefixIcon","tableColumns","col","showInTable","sortBy","dangerouslySetInnerHTML","__html","title","can","showNew","customToolbar","tool","getCustomToolbarAction","dataSource","allowPaging","allowSorting","pageSettings","showColumnChooser","enablePersistence","toolbar","toolbarClick","args","item","dataStateChange","state","action","requestType","sortOrder","sorted","sort","take","currentPage","skip","ref","resizeSettings","mode","dataBound","autoFitColumns","columnProperties","headerText","clipMode","hideAtMedia","textAlign","template","maxWidth","showDelete","showClone","showEdit","actions","itemActions","callback","iconClass","newObject","index","createdOn","createdBy","modifiedOn","modifiedBy","deleteOnUpdate","dOu","findObjectTitle","toISOString","newStatus","status","createResource","data","cloneObject","fire","icon","showCancelButton","confirmButtonText","cancelButtonText","reverseButtons","isConfirmed","deleteResource","singularTitle","dismiss","DismissReason","cancel","GenericActionsMenu","services","Page","Sort","Group","Search","Toolbar","Resize","ColumnChooser","Toast","toast","position","showConfirmButton","timer","timerProgressBar","didOpen","addEventListener","stopTimer","resumeTimer","appCategories","getApplicationsResource","refreshCount","showSaveAndClose","showSaveAndNew","showOnForm","AudienceApplications","setRefreshCount","tableOptions","setTableOptions","toggleDefault","updatedItem","isDefaultApp","updateItem","toggleStatus","foreignKeyData","updateResource","prevCount","GenericSelect","userFilters","fetchAllData","filteredUsers","departmentFilter","r","toLowerCase","b","lastName","displayName","firstName","setTotalItems","sortField","searchCriteria","nsMarketingEmails","createOrderObject","memberLastName","pop","user","memberFirstName","isActive","setIsActive","closeMenu","document","removeEventListener","Routes","abbrev","rootpath","paths","path","showWelcome","crumbs","Breadcrumbs","location","useLocation","pathname","currentPath","setCurrentPath","Component","currentRouteObject","setCurrentRouteObject","cp","element","subpath","titleSlug","Footer","Date","getFullYear","Menu","activeMenu","setActiveMenu","isActiveSection","path_key","LogoBar","version","getEnvironmentFromLocation","SectionRoutes","lazy","NoMatch","Main","fallback","exact","component","userManager","createUserManager","generateUserManagerConfig","User","userProfile","href","role","userid","getUser","id_token","userIdToken","signoutRedirect","id_token_hint","Header","sideBarElement","getElementById","sideBarBtn","getElementsByClassName","classList","toggle","handleMenuCollapse","Unauthenticated","backgroundImage","signinRedirect","AccessDenied","redirectTimeout","setRedirectTimeout","interval","setInterval","currentCount","redirectToMemberPortal","clearInterval","connect","oidc_user","oidc","isLoading","setIsLoading","accessDenied","setAccessDenied","loginAor","URLSearchParams","window","search","get","hasCosmosAccess","caslAbilities","defineAbility","cannot","loadUser","store","Provider","AppVersion","SilentRenew","processSilentRenew","successCallback","errorCallback","Boolean","hostname","match","ReactDOM","render","App","Callback","navigator","serviceWorker","ready","registration","unregister","defaultParams","color","useDispatch","useSelector","base","base_url","fetchMemberData","createAsyncThunk","thunkAPI","axios","response","statusText","Error","profile","emptyUserState","userSlice","createSlice","reducers","extraReducers","builder","addCase","fulfilled","payload","pending","createRootReducer","combineReducers","router","connectRouter","oidcReducer","userReducer","prefs","prefsReducer","userMiddleware","next","USER_FOUND","userCore","token","access_token","defaults","headers","common","SILENT_RENEW_ERROR","USER_EXPIRING","USER_EXPIRED","USER_SIGNED_OUT","createBrowserHistory","configureStore","reducer","middleware","getDefaultMiddleware","serializableCheck","ignoredActions","ignoredPaths","concat","routerMiddleware","getToken","getState","QueryHelper","environment","operators","Equal","GreaterThan","GreaterThanOrEqual","LessThan","LessThanOrEqual","Between","NotEqual","NotEmpty","Like","HasAny","Contains","StartsWith","NotLike","ContainsAny","use_q","this","coreApi","notification_url","base_config","Accept","resp","put","post","resource","totalPages","expanded","exp","delete","MD5","JSON","stringify","toString","existing","parse","sessionStorage","getItem","unix","timestamp","add","Promise","resolve","reject","cached_data","setItem","contact_id","audienceId","file","campaignId","savedCallback","member","formatProfile","createSelector","loginId","memberId","officeId","officeMlsId","email","memberEmail","photoUrl","memberType","mapUserLevel","userclass","aorName","memberAOR","aorFullName","aor","aorId","isCrmlsAdmin","isCrmlsAorAdmin","isCrmlsOfficeAdmin","isAuthenticated","officeAOR","memberTypeId","office","officeCode","mainOfficeCode","memberKeyNumeric","userlevel","brokercode","brokerbranch","agentcode","memberIsAssistantTo","officeKeyNumeric","memberMlsSecurityClass","memberStatus","originatingSystemID","memberStateLicense","hasMemberPortalAccess","contactTypeId","order","memberStatusId","shortName","description","userLevels","userClass","member_code","ut","el","root","auth","client_id","redirect_uri","response_type","response_mode","scope","authority","silent_redirect_uri","automaticSilentRenew","filterProtocolClaims","loadUserInfo","post_logout_redirect_uri","monitorSession","includeIdTokenInSilentRenew","userStore","WebStorageStateStore","localStorage","acr_values","startOf","toDate","subtract","storageName","fetchAPIMemberPrefs","marketing","training","fetchStoredMemberPrefs","retrievedPrefs","fetchSessionMemberPrefs","prefsSlice","APIPrefs","localPrefs","sessionPrefs","currentState","dot","setLocalStoragePref","setSessionPref","createContext","createContextualCan","Consumer"],"mappings":"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","file":"static/js/main.e20ab860.chunk.js","sourcesContent":["import Swal from \"sweetalert2\";\r\n\r\nexport const swalWithBootstrapButtons = Swal.mixin({\r\n\tcustomClass: {\r\n\t\tconfirmButton: \"btn btn-success btn-square\",\r\n\t\tcancelButton: \"btn btn-danger btn-square ml-2\",\r\n\t},\r\n\tbuttonsStyling: false,\r\n});\r\n","import React, { useState, useEffect } from \"react\";\r\n// syncfusion imports\r\nimport \"@syncfusion/ej2-base/styles/bootstrap.css\";\r\nimport \"@syncfusion/ej2-buttons/styles/bootstrap.css\";\r\nimport \"@syncfusion/ej2-inputs/styles/bootstrap.css\";\r\nimport \"@syncfusion/ej2-react-dropdowns/styles/bootstrap.css\";\r\nimport useQuery from \"../Hooks/Query\";\r\nimport ThemeLoader from \"./ThemeLoader\";\r\nimport { isArray } from \"lodash\";\r\n\r\nconst GenericLookupSelect = ({ id, onChange, onBlur, value, resource_name, service_name, resource_label = \"One\", cssClass = \"form-control\", select_field = \"name\", valueKey = \"id\" }) => {\r\n\tconst [items, setItems] = useState([]);\r\n\tconst [error, setError] = useState(null);\r\n\tconst [isLoaded, setIsLoaded] = useState(false);\r\n\tconst [helper, setHelper] = useState(false);\r\n\tuseQuery(setHelper);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (helper) {\r\n\t\t\tfetchData();\r\n\t\t}\r\n\t}, [helper]);\r\n\r\n\tconst fetchData = () => {\r\n\t\tsetIsLoaded(false);\r\n\r\n\t\thelper.fetchLookupData(resource_name).then(\r\n\t\t\t(result) => {\r\n\t\t\t\tlet results = result;\r\n\r\n\t\t\t\tsetItems(results);\r\n\t\t\t\tsetIsLoaded(true);\r\n\t\t\t},\r\n\t\t\t(error) => {\r\n\t\t\t\tsetError(error);\r\n\t\t\t\tsetIsLoaded(true);\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n\r\n\tif (error) {\r\n\t\treturn
Error: {error.message ?? \"Could not retrieve results\"}
;\r\n\t} else if (!isLoaded) {\r\n\t\treturn ;\r\n\t} else {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport default GenericLookupSelect;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { selectorDefinition, selectorQueryDefinition, SyncfusionOptions } from \"../../../Utilities/Configuration\";\r\nimport GenericTrainingSelect from \"../../../Widgets/GenericTrainingSelect\";\r\nimport { enumSelectOptionType } from \"../../../Utilities/formHelper\";\r\nimport { SwitchComponent } from \"@syncfusion/ej2-react-buttons\";\r\nimport { selectPrefByPath, setAPIPref } from \"../../../../features/prefsFeature/prefsSlice\";\r\nimport { useAppDispatch } from \"../../../../app/hooks\";\r\nimport GenericLookupSelect from \"../../../Widgets/GenericLookupSelect\";\r\nimport UserSelect from \"../../../Widgets/UserSelect\";\r\n\r\ntype selectorValue = {\r\n\tid: string;\r\n\tvalue: string | boolean | number; // TODO: possibly add number support?\r\n};\r\n\r\nconst GenericSyncfusionSelectors = ({ options, setSelectorQuery, showClearBtn = false }: { options: SyncfusionOptions; setSelectorQuery: (selectorDefinitions: selectorQueryDefinition[]) => void; showClearBtn: boolean }) => {\r\n\tconst selectors = options.selectors;\r\n\tconst [selectorValues, setSelectorValues] = useState([]);\r\n\tconst [activeFilters, setActiveFilters] = useState(false);\r\n\tconst [filterInputs, setFilterInputs] = useState([]);\r\n\tconst [checkedDefaults, setCheckedDefaults] = useState(false);\r\n\tconst filterClass = \"form-control list-filter\";\r\n\tconst dispatch = useAppDispatch();\r\n\r\n\tlet prefsPath = [options.resourceType, options.resourceName, \"selectors\"].join(\".\");\r\n\r\n\t// Set query data as filters change\r\n\tuseEffect(() => {\r\n\t\tif (!checkedDefaults) {\r\n\t\t\tcheckDefaultValues();\r\n\t\t}\r\n\t\tlet svs: selectorQueryDefinition[] = [];\r\n\t\tif (selectorValues.length) {\r\n\t\t\tselectorValues.forEach((sv) => {\r\n\t\t\t\tsvs.push({\r\n\t\t\t\t\tfield: sv.id,\r\n\t\t\t\t\top: 0,\r\n\t\t\t\t\tvalues: [sv.value],\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\tsetActiveFilters(true);\r\n\t\t} else {\r\n\t\t\tsetActiveFilters(false);\r\n\t\t}\r\n\t\tsetSelectorQuery(svs);\r\n\t\tdispatch(\r\n\t\t\tsetAPIPref({\r\n\t\t\t\tkey: prefsPath,\r\n\t\t\t\tvalue: svs,\r\n\t\t\t})\r\n\t\t);\r\n\t}, [dispatch, setSelectorQuery, selectorValues]);\r\n\r\n\t// Set selected filter values for new or updated filters\r\n\tconst selectorChangeHandler = (id: string, value: string | boolean | number) => {\r\n\t\tlet s = selectorValues.find((selector) => selector.id === id);\r\n\t\tif (s) {\r\n\t\t\ts.value = value;\r\n\t\t} else {\r\n\t\t\tselectorValues.push({\r\n\t\t\t\tid: id,\r\n\t\t\t\tvalue: value,\r\n\t\t\t});\r\n\t\t}\r\n\t\t// remove any values that are unset\r\n\t\tlet newSelectedValues = selectorValues.filter((s) => s.value !== \"\" && s.value !== \"Select One\");\r\n\t\tsetSelectorValues(newSelectedValues);\r\n\t};\r\n\r\n\t// Build filter html elements\r\n\tconst buildSelector = (selector: selectorDefinition) => {\r\n\t\t// for now we can only support items where we know the values (eg. enum) or have a foreign key relationship)\r\n\t\tlet supportedDataTypes = [\"select\", \"staticSelect\", \"staticSelectInt\", \"enumSelect\", \"boolean\", \"lookup\", \"user\"];\r\n\t\t// this is not a good way to do it. . .\r\n\t\tlet selectorColumn = options.columns.filter((column) => supportedDataTypes.includes(column.dataType)).find((column) => column.id === selector.id);\r\n\t\tif (selectorColumn && selectorColumn.id && supportedDataTypes.includes(selectorColumn.dataType)) {\r\n\t\t\tlet i = selectorColumn.id;\r\n\t\t\tlet currentValue = selectorValues.find((filter) => filter.id === i);\r\n\t\t\tswitch (selectorColumn.dataType) {\r\n\t\t\t\tcase \"select\":\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t selectorChangeHandler(i, e.target.value)}\r\n\t\t\t\t\t\t\tonBlur={null}\r\n\t\t\t\t\t\t\tservice_name={selector.service}\r\n\t\t\t\t\t\t\tvalue={currentValue && typeof currentValue.value === \"string\" ? currentValue.value : \"Select One\"}\r\n\t\t\t\t\t\t\tcssClass={`${selector?.cssClass} ${filterClass}`}\r\n\t\t\t\t\t\t\tselect_field={selector.selectField ?? undefined}\r\n\t\t\t\t\t\t\tvalueKey={selector.valueKey ?? undefined}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t);\r\n\t\t\t\tcase \"staticSelect\":\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t);\r\n\t\t\t\tcase \"staticSelectInt\":\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t);\r\n\t\t\t\tcase \"enumSelect\":\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t);\r\n\t\t\t\tcase \"boolean\":\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t selectorChangeHandler(i, e.checked)} />\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t);\r\n\t\t\t\tcase \"lookup\":\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t selectorChangeHandler(i, e.target.value)}\r\n\t\t\t\t\t\t\tonBlur={null}\r\n\t\t\t\t\t\t\tservice_name={selector.service}\r\n\t\t\t\t\t\t\tvalue={currentValue && typeof currentValue.value === \"string\" ? currentValue.value : \"Select One\"}\r\n\t\t\t\t\t\t\tcssClass={`${selector?.cssClass} ${filterClass}`}\r\n\t\t\t\t\t\t\tselect_field={selector.selectField ?? undefined}\r\n\t\t\t\t\t\t\tvalueKey={selector.valueKey ?? undefined}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t);\r\n\t\t\t\tcase \"user\":\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t selectorChangeHandler(i, e.target.value)} \r\n\t\t\t\t\t\t\tdisabled={false} \r\n\t\t\t\t\t\t\tdepartment={false} \r\n\t\t\t\t\t\t\tselected={currentValue && typeof currentValue.value === \"string\" ? currentValue.value : \"Select One\"}\r\n\t\t\t\t\t\t\tcssClass={`${selector?.cssClass} ${filterClass}`} \r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t);\r\n\r\n\t\t\t}\r\n\t\t} else if (selectorColumn && !supportedDataTypes.includes(selectorColumn.dataType)) {\r\n\t\t\tconsole.log(\"Datatype not supported for selector\", selector);\r\n\t\t} else {\r\n\t\t\tconsole.log(\"No column definition found for selector\", selector);\r\n\t\t}\r\n\r\n\t\t// fail through to\r\n\t\treturn <>;\r\n\t};\r\n\r\n\tconst refreshFilters = () => {\r\n\t\tif (selectors && selectors.length) {\r\n\t\t\tsetSelectorValues([]);\r\n\t\t}\r\n\t};\r\n\r\n\tconst buildFilters = () => {\r\n\t\tif (selectors && selectors.length) {\r\n\t\t\tsetFilterInputs(selectors.map((selector) => buildSelector(selector)));\r\n\t\t}\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tbuildFilters();\r\n\t}, [selectorValues]);\r\n\r\n\tconst checkDefaultValues = () => {\r\n\t\tif (selectors && selectors.length) {\r\n\t\t\tconst lsFilters = selectPrefByPath(prefsPath);\r\n\t\t\tif (lsFilters && lsFilters.length) {\r\n\t\t\t\t// We have values in redux prefs - populate dropdowns with those values\r\n\t\t\t\tlsFilters.map((filter: any) => {\r\n\t\t\t\t\treturn selectorChangeHandler(filter.field, filter.values[0]);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// No stored prefs, so check if we have default values & populate default filters\r\n\t\t\t\tlet filtersWithDefaultValue = selectors.filter((select) => select.default || select.dynamicDefault);\r\n\t\t\t\tfiltersWithDefaultValue.map((filter) => {\r\n\t\t\t\t\t// check for dynamic default first\r\n\t\t\t\t\tif (filter.dynamicDefault) {\r\n\t\t\t\t\t\tlet filterValue = filter.dynamicDefault();\r\n\t\t\t\t\t\tif (filterValue) {\r\n\t\t\t\t\t\t\treturn selectorChangeHandler(filter.id, filterValue);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (filter.default) {\r\n\t\t\t\t\t\treturn selectorChangeHandler(filter.id, filter.default);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\tsetCheckedDefaults(true);\r\n\t};\r\n\r\n\tif (!selectors || selectors.length === 0) {\r\n\t\treturn <>;\r\n\t} else {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t{showClearBtn && activeFilters && (\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t\t{filterInputs}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport default GenericSyncfusionSelectors;\r\n","import React, { useContext, useEffect, useRef, useState } from \"react\";\r\nimport { OrderByType, selectorQueryDefinition, SyncfusionOptions } from \"../../../Utilities/Configuration\";\r\nimport useQuery from \"../../../Hooks/Query\";\r\nimport QueryHelper from \"../../../Utilities/QueryHelper\";\r\nimport { ColumnChooser, ColumnDirective, ColumnsDirective, GridComponent, Group, Inject, Page, Resize, Search, Sort, Toolbar } from \"@syncfusion/ej2-react-grids\";\r\nimport { swalWithBootstrapButtons } from \"../../../Utilities/SweetAlert\";\r\nimport Swal from \"sweetalert2\";\r\nimport dayjs from \"dayjs\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport { useAppSelector } from \"../../../../app/hooks\";\r\nimport { userId } from \"../../../../features/user/selectors\";\r\nimport { AbilityContext } from \"../../../../Auth/can\";\r\nimport ThemeLoader from \"../../../Widgets/ThemeLoader\";\r\nimport \"../../../../CSS/grid.css\";\r\nimport GenericSyncfusionSelectors from \"./GenericSyncfusionSelectors\";\r\nimport GenericActionsMenu from \"./GenericActionsMenu\";\r\nimport isEqual from \"lodash/isEqual\";\r\nimport { sortBy, isArray } from \"lodash\";\r\n\r\nconst initialState = {\r\n\tresult: [],\r\n\tcount: 0,\r\n};\r\n\r\nconst initialQueryData = {\r\n\tpageId: 0,\r\n\tpageSize: 10,\r\n\tcriteria: Array(),\r\n\torderBy: Array(),\r\n\tfields: Array(),\r\n\trefresh: undefined,\r\n};\r\n\r\nexport const findObjectTitle = (options: SyncfusionOptions) => {\r\n\tlet title;\r\n\r\n\toptions.columns.forEach((col) => {\r\n\t\tif (col.id === \"name\" || col.isLabel) {\r\n\t\t\ttitle = col.id;\r\n\t\t}\r\n\t});\r\n\r\n\treturn title;\r\n};\r\n\r\nconst GenericSyncfusionTable = ({ options }: { options: SyncfusionOptions }) => {\r\n\tconst ability = useContext(AbilityContext);\r\n\tconst accountId = useAppSelector(userId);\r\n\tconst [activePage, setActivePage] = useState(0);\r\n\tconst [pageSize, setPageSize] = useState(options.defaultPageSize);\r\n\tconst [isLoaded, setIsLoaded] = useState(false);\r\n\tconst [error, setError] = useState();\r\n\tconst [searchString, setSearchString] = useState(\"\");\r\n\tconst [selectorQuery, setSelectorQuery] = useState([]);\r\n\tconst [sortParams, setSortParams] = useState([]);\r\n\tconst [helper, setHelper] = useState(null);\r\n\tconst gridControl = useRef(\"\");\r\n\tuseQuery(setHelper);\r\n\tlet history = useHistory();\r\n\tconst [items, setItems] = useState(initialState);\r\n\tconst [previousQueryData, setPreviousQueryData] = useState();\r\n\tconst [queryData, setQueryData] = useState();\r\n\tconst [refreshData, setRefreshData] = useState(false);\r\n\tconst [defaultOrder, setDefaultOrder] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (helper) {\r\n\t\t\tfetchData();\r\n\t\t}\r\n\t}, [helper, activePage, pageSize, searchString, sortParams, options, selectorQuery]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (options.afterFetchCallback && items) {\r\n\t\t\toptions.afterFetchCallback(items);\r\n\t\t}\r\n\t\tif (items?.result?.length || items?.result) {\r\n //TODO this is a hack fix to keep the page from crashing on table load. unsure as to why this happens\r\n setTimeout(() => {\r\n setIsLoaded(true);\r\n if (gridControl?.current) {\r\n gridControl.current.hideSpinner();\r\n }\r\n }, 1000);\r\n }\r\n\t}, [items]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!refreshData && !defaultOrder && isEqual(queryData, previousQueryData)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (helper && queryData) {\r\n\t\t\tconst fetchNow = async () => {\r\n\t\t\t\t// console.log('ACTUALLY HITTING API', queryData)\r\n\t\t\t\tif (isLoaded && gridControl.current) {\r\n\t\t\t\t\tgridControl.current.showSpinner();\r\n\t\t\t\t}\r\n\t\t\t\thelper\r\n\t\t\t\t\t.fetchData(options.resourceName)\r\n\t\t\t\t\t.then((result) => {\r\n\t\t\t\t\t\tsetItems({\r\n\t\t\t\t\t\t\tresult: result.results,\r\n\t\t\t\t\t\t\tcount: result.totalResults,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.then(() => {\r\n\t\t\t\t\t\tif (isLoaded && gridControl.current) {\r\n\t\t\t\t\t\t\tgridControl.current.hideSpinner();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch((error: any) => {\r\n\t\t\t\t\t\tsetError(error.message);\r\n\t\t\t\t\t\tconsole.error(`error: ${error}`);\r\n\t\t\t\t\t});\r\n\t\t\t\tsetPreviousQueryData(queryData);\r\n\t\t\t};\r\n\t\t\tfetchNow();\r\n\r\n\t\t\treturn function () {\r\n\t\t\t\tsetRefreshData(false);\r\n\t\t\t\tsetDefaultOrder(false);\r\n\t\t\t};\r\n\t\t}\r\n\t}, [queryData]);\r\n\r\n\tconst fetchData = () => {\r\n\t\tif (helper) {\r\n\t\t\thelper.criteria = [];\r\n\t\t\tswitch (options.service) {\r\n\t\t\t\tcase \"membershipv3\":\r\n\t\t\t\t\thelper.setMembershipV3();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"membership\":\r\n\t\t\t\t\thelper.setMembership();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"mace\":\r\n\t\t\t\t\thelper.setMace();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"memberPortal\":\r\n\t\t\t\t\thelper.setMemberPortal();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"notification\":\r\n\t\t\t\t\thelper.setNotification();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\thelper.pageSize = pageSize;\r\n\t\t\thelper.pageId = activePage;\r\n\r\n\t\t\tif (sortParams.length) {\r\n\t\t\t\thelper.orderBy = sortParams;\r\n\t\t\t} else if (options.defaultSort && options.defaultSort.columns) {\r\n\t\t\t\t// convert from syncfusion sort object to q format\r\n\t\t\t\thelper.orderBy = options.defaultSort.columns.map((c) => {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfield: c.field,\r\n\t\t\t\t\t\tdirection: c.direction === \"Descending\" ? \"Desc\" : \"Asc\",\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t\tsetDefaultOrder(true);\r\n\t\t\t}\r\n\r\n\t\t\tif (selectorQuery.length) {\r\n\t\t\t\t// IF there's a default query, check if there's a selector intentionally set that overrides the\r\n\t\t\t\t// default query-- if not, then include the default query alongside the selectors\r\n\t\t\t\tif (options.defaultQuery) {\r\n\t\t\t\t\tlet setDefault = true;\r\n\t\t\t\t\toptions.defaultQuery?.forEach((dq) => {\r\n\t\t\t\t\t\tlet field = dq.field;\r\n\t\t\t\t\t\tselectorQuery.forEach((sq) => {\r\n\t\t\t\t\t\t\tif (sq.field === field) {\r\n\t\t\t\t\t\t\t\tsetDefault = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif (setDefault) {\r\n\t\t\t\t\t\thelper.criteria = options.defaultQuery;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\thelper.criteria = [...helper.criteria, ...selectorQuery];\r\n\t\t\t} else if (options.defaultQuery) {\r\n\t\t\t\thelper.criteria = options.defaultQuery;\r\n\t\t\t}\r\n\r\n\t\t\thelper.criteria = helper.criteria.filter((criteria) => criteria.field !== options.searchField);\r\n\t\t\tif (searchString.length) {\r\n\t\t\t\thelper.criteria.push({\r\n\t\t\t\t\tfield: options.searchField,\r\n\t\t\t\t\top: 10,\r\n\t\t\t\t\tvalues: [searchString],\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tsetQueryData({\r\n\t\t\t\tpageId: helper.pageId,\r\n\t\t\t\tpageSize: helper.pageSize,\r\n\t\t\t\tcriteria: helper.criteria,\r\n\t\t\t\torderBy: helper.orderBy,\r\n\t\t\t\tfields: helper.fields,\r\n\t\t\t\trefresh: options.refreshData,\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst handleStateChange = (state: any) => {\r\n\t\t// console.log(state);\r\n\t\tif (state.action) {\r\n\t\t\tsetItems(initialState); // try clearing this here\r\n\t\t\tif (state.action.requestType === \"sorting\") {\r\n\t\t\t\t// console.log(\"sorting\");\r\n\t\t\t\tif (\"sorted\" in state) {\r\n\t\t\t\t\tlet sortOrder: OrderByType[] = [];\r\n\t\t\t\t\tstate.sorted.forEach((sort: any) => {\r\n\t\t\t\t\t\tsortOrder.push({\r\n\t\t\t\t\t\t\tfield: sort.name,\r\n\t\t\t\t\t\t\tdirection: sort.direction === \"ascending\" ? \"Asc\" : \"Desc\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t\tsetActivePage(0);\r\n\t\t\t\t\tsetSortParams(sortOrder);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetSortParams([]);\r\n\t\t\t\t}\r\n\t\t\t} else if (state.action.requestType === \"searching\") {\r\n\t\t\t\t// console.log(\"searching\", state.action.searchString);\r\n\t\t\t\tsetActivePage(0);\r\n\t\t\t\tsetSearchString(state.action.searchString);\r\n\t\t\t} else if (state.action.requestType === \"paging\") {\r\n\t\t\t\t// console.log(\"paging\");\r\n\t\t\t\tif (state.take !== pageSize) {\r\n\t\t\t\t\t// console.log(state.take)\r\n\t\t\t\t\tsetPageSize(state.take);\r\n\t\t\t\t}\r\n\t\t\t\tif (state.action.currentPage - 1 !== activePage) {\r\n\t\t\t\t\tsetActivePage(state.action.currentPage - 1); // we're zero-indexed so subtract\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tstate.skip = 1;\r\n\t\t}\r\n\t};\r\n\r\n\tconst pageOptions = {\r\n\t\tpageCount: 4,\r\n\t\tpageSize: pageSize,\r\n\t\tpageSizes: [\"5\", \"10\", \"20\", \"50\", \"100\"],\r\n\t};\r\n\r\n\tconst deleteObject = (id: string) => {\r\n\t\tswalWithBootstrapButtons\r\n\t\t\t.fire({\r\n\t\t\t\ttitle: \"Are you sure?\",\r\n\t\t\t\ttext: \"You won't be able to revert this!\",\r\n\t\t\t\ticon: \"warning\",\r\n\t\t\t\tshowCancelButton: true,\r\n\t\t\t\tconfirmButtonText: \"Delete it!\",\r\n\t\t\t\tcancelButtonText: \"Cancel!\",\r\n\t\t\t\treverseButtons: true,\r\n\t\t\t})\r\n\t\t\t.then((result) => {\r\n\t\t\t\t// console.log(id)\r\n\t\t\t\tif (result.isConfirmed && helper) {\r\n\t\t\t\t\thelper.deleteResource(options.resourceName, id).then((result) => {\r\n\t\t\t\t\t\toptions.refreshData = !refreshData;\r\n\t\t\t\t\t\tfetchData();\r\n\t\t\t\t\t\tswalWithBootstrapButtons.fire(\"Deleted!\", `${options.singularTitle} deleted.`, \"success\");\r\n\t\t\t\t\t});\r\n\t\t\t\t} else if (result.dismiss === Swal.DismissReason.cancel) {\r\n\t\t\t\t\tconsole.log(\"cancelled\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst cloneObject = (object: any) => {\r\n\t\tlet newObject = { ...object };\r\n\t\tif (helper) {\r\n\t\t\t// remove this prop since it comes from syncfusion grid\r\n\t\t\tdelete newObject.column;\r\n\t\t\tdelete newObject.index;\r\n\t\t\tdelete newObject.id;\r\n\t\t\tdelete newObject.createdOn;\r\n\t\t\tdelete newObject.createdBy;\r\n\t\t\tdelete newObject.modifiedOn;\r\n\t\t\tdelete newObject.modifiedBy;\r\n\r\n\t\t\t// remove any model that isn't set\r\n\t\t\tif (options.deleteOnUpdate?.length) {\r\n\t\t\t\toptions.deleteOnUpdate.forEach((dOu) => delete newObject[dOu]);\r\n\t\t\t}\r\n\r\n\t\t\t// get the name of the title object\r\n\t\t\tlet title = findObjectTitle(options);\r\n\r\n\t\t\tif (title) {\r\n\t\t\t\tnewObject[title] = newObject[title] + \" - CLONE\";\r\n\t\t\t}\r\n\r\n\t\t\tnewObject.createdBy = accountId;\r\n\t\t\tnewObject.createdOn = dayjs().toISOString();\r\n\t\t\tnewObject.modifiedBy = accountId;\r\n\t\t\tnewObject.modifiedOn = dayjs().toISOString();\r\n\r\n\t\t\t// Not all cloned objects need a draft status - for now, check if this is a campaign, article or training event being cloned, and update the status if so\r\n\t\t\t// @TODO: This needs to be better thought out - campaigns store 'status' all uppercase 'DRAFT'. Training classes store 'Draft'.\r\n\t\t\tif ([\"campaign\", \"articles\", \"trainingClass\"].includes(options.resourceName)) {\r\n\t\t\t\tlet newStatus = options.resourceName === \"campaign\" ? \"DRAFT\" : \"Draft\";\r\n\t\t\t\tnewObject.status = newStatus;\r\n\t\t\t}\r\n\t\t\thelper\r\n\t\t\t\t.createResource(options.resourceName, newObject)\r\n\t\t\t\t.then((data) => {\r\n\t\t\t\t\thistory.push(`/${options.routePath}/edit/${data.id}`);\r\n\t\t\t\t})\r\n\t\t\t\t.catch((error: Error) => setError(error.message));\r\n\t\t}\r\n\t};\r\n\r\n\tconst nameTemplate = (props: any) => {\r\n\t\tlet field = props.column.field; // this will be the actual column\r\n\t\tlet tag = props[field] ?? \"No Name\";\r\n\t\tif (isArray(tag)) {\r\n\t\t\ttag = tag.join(\", \");\r\n\t\t}\r\n\t\tif (options.routePath) {\r\n\t\t\tlet link = `/${options.routePath}/edit/` + props.id;\r\n\t\t\treturn {tag};\r\n\t\t}\r\n\r\n\t\treturn tag;\r\n\t};\r\n\r\n\t// this is stupid but syncfusion can't handle more complex templates\r\n\tconst booleanTemplate = (props: any) => {\r\n\t\tlet value = props[props.column.field]; // this will be the actual value of the column\r\n\r\n\t\tif (value) {\r\n\t\t\treturn (\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tconst imageTemplate = (props: any) => {\r\n\t\tlet value = props[props.column.field]; // this will be the actual value of the column\r\n\r\n\t\tif (value) {\r\n\t\t\treturn {props.name;\r\n\t\t} else {\r\n\t\t\treturn ;\r\n\t\t}\r\n\t};\r\n\r\n\tconst selectTemplate = (props: any) => {\r\n\t\tlet column = options.columns.find((c) => {\r\n\t\t\treturn c.id === props.column.field && [\"staticSelect\", \"enumSelect\", \"staticSelectInt\"].includes(c.dataType);\r\n\t\t});\r\n\t\tlet value = props[props.column.field]; // this will be the actual value of the column\r\n\t\tif (column && column.values) {\r\n\t\t\tswitch (column.dataType) {\r\n\t\t\t\tcase \"enumSelect\":\r\n\t\t\t\t\tlet enumeration = column.values.find((e: any) => e.value === value);\r\n\t\t\t\t\tif (enumeration) {\r\n\t\t\t\t\t\treturn enumeration.label;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn \"No value found for \" + value;\r\n\t\t\t\t\t}\r\n\t\t\t\tcase \"staticSelect\":\r\n\t\t\t\t\treturn value ?? \"Undefined\";\r\n\t\t\t\tcase \"staticSelectInt\":\r\n\t\t\t\t\treturn column.values[parseInt(value)];\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t// catchall\r\n\t\t\t\t\treturn column.values[value] ?? column.values[parseInt(value)];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\treturn \"No value found for \" + value;\r\n\t\t}\r\n\t};\r\n\r\n\tconst customTemplate = (props: any) => {\r\n\t\tlet c = options.columns.find((column) => column.id === props.column.field);\r\n\t\tif (c && c.customComponent) {\r\n\t\t\treturn ;\r\n\t\t}\r\n\t};\r\n\r\n\tconst actionsTemplate = (props: any) => {\r\n\t\tlet itemActions: any[] = [];\r\n\t\tif (options.actions && options.actions.length) {\r\n\t\t\titemActions = [\r\n\t\t\t\t...options.actions.map((action) => {\r\n\t\t\t\t\treturn { ...action, callback: () => action.callback(props) };\r\n\t\t\t\t}),\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\tif (options.showClone === true && ability.can(\"clone\", options.resourceType)) {\r\n\t\t\titemActions.push({\r\n\t\t\t\tlabel: \"Clone Item\",\r\n\t\t\t\ticonClass: \"far fa-copy text-info\",\r\n\t\t\t\tcallback: () => cloneObject(props),\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (options.showDelete === true && ability.can(\"delete\", options.resourceType)) {\r\n\t\t\titemActions.push({\r\n\t\t\t\tlabel: \"Delete Item\",\r\n\t\t\t\ticonClass: \"far fa-trash-alt text-danger\",\r\n\t\t\t\tcallback: () => deleteObject(props.id),\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn ;\r\n\t};\r\n\r\n\tconst dateTemplate = (props: any) => {\r\n\t\tlet value = props[props.column.field]; // this will be the actual value of the column\r\n\t\tif (value) {\r\n\t\t\treturn dayjs(value).format(\"MMM D, YYYY hh:mm A\");\r\n\t\t}\r\n\t};\r\n\r\n\tconst subResourceTemplate = (props: any) => {\r\n\t\tlet column = options.columns.find((c) => c.id === props.column.field);\r\n\r\n\t\t// this template is used if we need to drill down into a subresource using dot notation\r\n\t\t// so we'll split the column name on the dots\r\n\t\tlet columnParts = props.column.field.split(\".\");\r\n\r\n\t\t// TODO: hardcode this to nesting only one level deep for now\r\n\t\tlet value = null;\r\n\r\n\t\tif (props.hasOwnProperty(columnParts[0]) && props[columnParts[0]]) {\r\n\t\t\tvalue = props[columnParts[0]][columnParts[1]]; // this will be the actual value of the column\r\n\t\t}\r\n\r\n\t\tif (value) {\r\n\t\t\tif (column && column.isLabel) {\r\n\t\t\t\tlet link = `/${options.routePath}/edit/` + props.id;\r\n\t\t\t\treturn {value};\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t} else {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t};\r\n\r\n\tconst buildFilters = () => {\r\n\t\tif (!options.selectors || options.selectors.length === 0) {\r\n\t\t\treturn <>;\r\n\t\t}\r\n\r\n\t\treturn ;\r\n\t};\r\n\r\n\t// Table header toolbar actions\r\n\tlet toolbarActions = [];\r\n\tif (options.searchField) {\r\n\t\ttoolbarActions.push(\"Search\");\r\n\t}\r\n\tif (options.showRefresh !== false) {\r\n\t\ttoolbarActions.push({\r\n\t\t\ttext: \"Refresh\",\r\n\t\t\ttooltipText: \"Refresh List\",\r\n\t\t\tprefixIcon: \"e-refresh\",\r\n\t\t\tid: \"RefreshView\",\r\n\t\t});\r\n\t}\r\n\ttoolbarActions.push(\"ColumnChooser\");\r\n\r\n\tconst handleToolbarClick = (args: any) => {\r\n\t\tif (args.item.id === \"RefreshView\") {\r\n\t\t\tsetRefreshData(true);\r\n\t\t\tfetchData();\r\n\t\t}\r\n\t};\r\n\r\n\tconst getCustomToolbarAction = (tool: any, key: number) => {\r\n\t\treturn (\r\n\t\t\t
  • \r\n\t\t\t\t{tool}\r\n\t\t\t
  • \r\n\t\t);\r\n\t};\r\n\r\n\tlet tableColumns = options.columns.filter((col) => col.showInTable !== false);\r\n\ttableColumns = sortBy(tableColumns, \"tableOrder\");\r\n\r\n\tif (error?.length) {\r\n\t\treturn
    {error}
    ;\r\n\t} else if (isLoaded) {\r\n\t\treturn (\r\n\t\t\t<>\r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t

    \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\t{ability.can(\"manage\", options.resourceType) && options.showNew !== false && options.routePath && (\r\n\t\t\t\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t New\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t{/* Additional toolbar options */}\r\n\t\t\t\t\t\t\t\t\t{options.customToolbar && options.customToolbar.length && options.customToolbar.map((tool, key) => getCustomToolbarAction(tool, key))}\r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t{buildFilters()}\r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t gridControl.current.autoFitColumns([])}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{tableColumns.map((c) => {\r\n\t\t\t\t\t\t\t\t\t\t\tlet columnProperties: { [key: string]: any } = {\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey: c.id,\r\n\t\t\t\t\t\t\t\t\t\t\t\tfield: c.id,\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth: c.width ?? undefined,\r\n\t\t\t\t\t\t\t\t\t\t\t\theaderText: c.label,\r\n\t\t\t\t\t\t\t\t\t\t\t\tclipMode: \"EllipsisWithTooltip\",\r\n\t\t\t\t\t\t\t\t\t\t\t\thideAtMedia: c.hideAtMedia ? `(min-width: ${c.hideAtMedia}px)` : undefined,\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextAlign: c.textAlign ?? undefined,\r\n\t\t\t\t\t\t\t\t\t\t\t\tallowSorting: c.allowSorting ?? undefined,\r\n\t\t\t\t\t\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tswitch (c.dataType) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"staticSelect\":\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"staticSelectInt\":\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"enumSelect\":\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t//columnProperties.headerText = '';\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.template = selectTemplate;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"image\":\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.template = imageTemplate;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.textAlign = \"center\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"subResource\":\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.template = subResourceTemplate;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"date\":\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.template = dateTemplate;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"currency\":\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t// add any specific updates for currency formatting, etc\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"boolean\":\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.template = booleanTemplate;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\tcase \"custom\":\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.template = customTemplate;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.template = nameTemplate;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnProperties.maxWidth = 290;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t\t\t{ability.can(\"manage\", options.resourceType) && (options.showDelete || options.showClone || options.showEdit || (options.actions && options.actions.length)) && (\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\r\n\t\t);\r\n\t} else {\r\n\t\treturn ;\r\n\t}\r\n};\r\n\r\nexport default GenericSyncfusionTable;\r\n","import Swal from \"sweetalert2\";\r\nimport \"../../CSS/toast.css\";\r\n\r\nconst Toast = Swal.mixin({\r\n\ttoast: true,\r\n\tposition: \"top-end\",\r\n\tshowConfirmButton: false,\r\n\ttimer: 3000,\r\n\ttimerProgressBar: true,\r\n\tdidOpen: (toast) => {\r\n\t\ttoast.addEventListener(\"mouseenter\", Swal.stopTimer);\r\n\t\ttoast.addEventListener(\"mouseleave\", Swal.resumeTimer);\r\n\t},\r\n});\r\n\r\nexport default Toast;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport GenericSyncfusionTable from \"../../SubComponents/GenericSyncfusion/GenericSyncfusionTable\";\r\nimport { SyncfusionOptions } from \"../../../Utilities/Configuration\";\r\nimport dayjs from \"dayjs\";\r\nimport { useAppSelector } from \"../../../../app/hooks\";\r\nimport { userId } from \"../../../../features/user/selectors\";\r\nimport useQuery from \"../../../Hooks/Query\";\r\nimport QueryHelper from \"../../../Utilities/QueryHelper\";\r\nimport Toast from \"../../../Widgets/Toast\";\r\n\r\nexport const appCategories = [\"AOR\", \"Broker\", \"Marketplace\", \"Member\"];\r\nexport const getApplicationsResource = (refreshCount?: any): SyncfusionOptions => {\r\n\tlet options: SyncfusionOptions = {\r\n\t\tresourceType: \"operations\",\r\n\t\tservice: \"memberPortal\",\r\n\t\tdefaultPageSize: 10,\r\n\t\tsearchField: \"name\",\r\n\t\tshowDelete: false,\r\n\t\tshowClone: false,\r\n\t\tshowSaveAndClose: true,\r\n\t\tshowSaveAndNew: true,\r\n\t\tresourceName: \"Applications\",\r\n\t\ttitle: \"Audience Applications\",\r\n\t\tsingularTitle: \"Audience Application\",\r\n\t\troutePath: \"operations/audience-applications\",\r\n\t\t//deleteOnUpdate: ['systemNotificationStatus'],\r\n\t\tdefaultSort: {\r\n\t\t\tcolumns: [\r\n\t\t\t\t{\r\n\t\t\t\t\tfield: \"createdOn\",\r\n\t\t\t\t\tdirection: \"Descending\",\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t},\r\n\t\tselectors: [\r\n\t\t\t{\r\n\t\t\t\tid: \"applicationCategory\",\r\n\t\t\t\tlabel: \"Category\",\r\n\t\t\t\tcssClass: \"col-md-2 ml-2\",\r\n\t\t\t\tservice: \"mace\",\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"status\",\r\n\t\t\t\tlabel: \"Status\",\r\n\t\t\t\tcssClass: \"col-md-2 ml-2\",\r\n\t\t\t\tservice: \"mace\",\r\n\t\t\t\tvalueKey: \"id\",\r\n\t\t\t},\r\n\t\t],\r\n\t\tcolumns: [\r\n\t\t\t{\r\n\t\t\t\tid: \"iconUrl\",\r\n\t\t\t\tlabel: \"Icon\",\r\n\t\t\t\tdataType: \"image\",\r\n\t\t\t\tshowInTable: true,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"name\",\r\n\t\t\t\tlabel: \"Name\",\r\n\t\t\t\tdataType: \"none\",\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"isDefaultApp\",\r\n\t\t\t\tlabel: \"Default\",\r\n\t\t\t\tdataType: \"boolean\",\r\n\t\t\t\thideAtMedia: \"1200\",\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"status\",\r\n\t\t\t\tlabel: \"Status\",\r\n\t\t\t\tdataType: \"none\",\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"shortName\",\r\n\t\t\t\tlabel: \"Short Name\",\r\n\t\t\t\tdataType: \"none\",\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"applicationCategory\",\r\n\t\t\t\tlabel: \"Category\",\r\n\t\t\t\tdataType: \"none\",\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"applicationCategory\",\r\n\t\t\t\tlabel: \"\",\r\n\t\t\t\tdataType: \"enumSelect\",\r\n\t\t\t\tshowInTable: false,\r\n\t\t\t\tshowOnForm: false,\r\n\t\t\t\tvalues: appCategories.map((s) => {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tvalue: s,\r\n\t\t\t\t\t\tlabel: s,\r\n\t\t\t\t\t};\r\n\t\t\t\t}),\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"createdOn\",\r\n\t\t\t\tlabel: \"Created\",\r\n\t\t\t\tdataType: \"date\",\r\n\t\t\t\tshowOnForm: false,\r\n\t\t\t\thideAtMedia: \"767\",\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: \"modifiedOn\",\r\n\t\t\t\tlabel: \"Modified\",\r\n\t\t\t\tdataType: \"date\",\r\n\t\t\t\tshowOnForm: false,\r\n\t\t\t\thideAtMedia: \"767\",\r\n\t\t\t},\r\n\t\t\t// these are just for the selectors\r\n\t\t\t{\r\n\t\t\t\tid: \"status\",\r\n\t\t\t\tlabel: \"\",\r\n\t\t\t\tdataType: \"enumSelect\",\r\n\t\t\t\tshowInTable: false,\r\n\t\t\t\tshowOnForm: false,\r\n\t\t\t\tdefault: \"Active\",\r\n\t\t\t\tvalues: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvalue: \"Active\",\r\n\t\t\t\t\t\tlabel: \"Active\",\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvalue: \"Inactive\",\r\n\t\t\t\t\t\tlabel: \"Inactive\",\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t],\r\n\t\trefreshData: refreshCount,\r\n\t};\r\n\r\n\treturn options;\r\n};\r\n\r\nfunction AudienceApplications() {\r\n\tconst accountId = useAppSelector(userId);\r\n\tconst [refreshCount, setRefreshCount] = useState(0);\r\n\tconst [tableOptions, setTableOptions] = useState(getApplicationsResource());\r\n\tconst [helper, setHelper] = useState(false);\r\n\tuseQuery(setHelper);\r\n\r\n\tconst toggleDefault = (props: any) => {\r\n\t\tconst updatedItem = { ...props };\r\n\r\n\t\tupdatedItem.isDefaultApp = !props.isDefaultApp;\r\n\t\tupdateItem(updatedItem);\r\n\t};\r\n\r\n\tconst toggleStatus = (props: any) => {\r\n\t\tconst updatedItem = { ...props };\r\n\r\n\t\tupdatedItem.status = props.status === \"Active\" ? \"Inactive\" : \"Active\";\r\n\t\tupdateItem(updatedItem);\r\n\t};\r\n\r\n\tconst updateItem = (updatedItem: any) => {\r\n\t\t// Set new properties for default value, modified by and on\r\n\t\tupdatedItem.modifiedBy = accountId;\r\n\t\tupdatedItem.modifiedOn = dayjs().toISOString();\r\n\r\n\t\t// Delete generic syncfusion column specific data\r\n\t\tdelete updatedItem.column;\r\n\t\tdelete updatedItem.foreignKeyData;\r\n\t\tdelete updatedItem.index;\r\n\r\n\t\t// Update the application resource with new item - then increment refreshCount to refresh the list view\r\n\t\tif (helper && updatedItem.id) {\r\n\t\t\thelper.setMemberPortal();\r\n\t\t\thelper\r\n\t\t\t\t.updateResource(\"Applications\", updatedItem.id, updatedItem)\r\n\t\t\t\t.then((results) => {\r\n\t\t\t\t\tToast.fire({\r\n\t\t\t\t\t\ticon: \"success\",\r\n\t\t\t\t\t\ttitle: \"Application updated\",\r\n\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tsetRefreshCount((prevCount) => prevCount + 1);\r\n\t\t\t\t})\r\n\t\t\t\t.catch((e) => {\r\n\t\t\t\t\tconsole.error(\"Error updating the application\", e);\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\ttableOptions.actions = [\r\n\t\t\t{\r\n\t\t\t\tlabel: \"Toggle Default\",\r\n\t\t\t\ticonClass: \"fas fa-check text-success\",\r\n\t\t\t\tcallback: toggleDefault,\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: \"Toggle Active\",\r\n\t\t\t\ticonClass: \"fas fa-toggle-on text-success\",\r\n\t\t\t\tcallback: toggleStatus,\r\n\t\t\t},\r\n\t\t];\r\n\t\tsetTableOptions(tableOptions);\r\n\t}, [tableOptions]);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetTableOptions(getApplicationsResource(refreshCount));\r\n\t}, [refreshCount, helper]);\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\t\t
    \r\n\t);\r\n}\r\n\r\nexport default AudienceApplications;\r\n","import React, { useState, useEffect } from \"react\";\r\n// syncfusion imports\r\nimport \"@syncfusion/ej2-base/styles/bootstrap.css\";\r\nimport \"@syncfusion/ej2-buttons/styles/bootstrap.css\";\r\nimport \"@syncfusion/ej2-inputs/styles/bootstrap.css\";\r\nimport \"@syncfusion/ej2-react-dropdowns/styles/bootstrap.css\";\r\nimport useQuery from \"../Hooks/Query\";\r\nimport ThemeLoader from \"./ThemeLoader\";\r\nimport { isArray } from \"lodash\";\r\n\r\nconst GenericSelect = ({ id, onChange, onBlur, value, resource_name, service_name, resource_label = \"One\", cssClass = \"form-control\", select_field = \"name\", valueKey = \"id\" }) => {\r\n\tconst [items, setItems] = useState([]);\r\n\tconst [error, setError] = useState(null);\r\n\tconst [isLoaded, setIsLoaded] = useState(false);\r\n\tconst [helper, setHelper] = useState(false);\r\n\tuseQuery(setHelper);\r\n\r\n\tconst userFilters = [\r\n\t\t{ service: \"mace\", department: [\"marketing\", \"training\"] },\r\n\t\t{ service: \"training\", department: \"training\" },\r\n\t];\r\n\r\n\tuseEffect(() => {\r\n\t\tif (helper) {\r\n\t\t\tfetchData();\r\n\t\t}\r\n\t}, [helper]);\r\n\r\n\tconst fetchData = () => {\r\n\t\tsetIsLoaded(false);\r\n\t\tswitch (service_name) {\r\n\t\t\tcase \"membershipv3\":\r\n\t\t\t\thelper.setMembershipV3();\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"membership\":\r\n\t\t\t\thelper.setMembership();\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"mace\":\r\n\t\t\t\thelper.setMace();\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"memberPortal\":\r\n\t\t\t\thelper.setMemberPortal();\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\thelper.criteria = [];\r\n\t\thelper.orderBy = [\r\n\t\t\t{\r\n\t\t\t\tfield: select_field,\r\n\t\t\t\tdirection: 0,\r\n\t\t\t},\r\n\t\t];\r\n\r\n\t\thelper.fetchAllData(resource_name).then(\r\n\t\t\t(result) => {\r\n\t\t\t\tlet results = result;\r\n\r\n\t\t\t\t// Filter user dropdown to relevant department users\r\n\t\t\t\tif (resource_name === \"user\" && userFilters.find((filter) => filter.service === service_name)) {\r\n\t\t\t\t\tlet filteredUsers;\r\n\t\t\t\t\tconst departmentFilter = userFilters.find((filter) => filter.service === service_name);\r\n\r\n\t\t\t\t\tif (departmentFilter && isArray(departmentFilter.department)) {\r\n\t\t\t\t\t\tfilteredUsers = result.filter((r) => departmentFilter.department.includes(r.department.toLowerCase()));\r\n\t\t\t\t\t} else if (departmentFilter) {\r\n\t\t\t\t\t\tfilteredUsers = results.filter((r) => r.department.toLowerCase() === departmentFilter.department);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (filteredUsers.length) {\r\n\t\t\t\t\t\tresults = filteredUsers;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresults = results.sort((a, b) => (a.lastName > b.lastName ? 1 : -1));\r\n\t\t\t\t\tresults.map((result) => {\r\n\t\t\t\t\t\treturn (result[\"displayName\"] = result.displayName ?? result.firstName + \" \" + result.lastName);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsetItems(results);\r\n\t\t\t\tsetIsLoaded(true);\r\n\t\t\t},\r\n\t\t\t(error) => {\r\n\t\t\t\tsetError(error);\r\n\t\t\t\tsetIsLoaded(true);\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n\r\n\tif (error) {\r\n\t\treturn
    Error: {error.message ?? \"Could not retrieve results\"}
    ;\r\n\t} else if (!isLoaded) {\r\n\t\treturn ;\r\n\t} else {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport default GenericSelect;\r\n","import { isArray } from \"lodash\";\r\nimport React, { useState, useEffect } from \"react\";\r\nimport useQuery from \"../Hooks/Query\";\r\nimport ThemeLoader from \"./ThemeLoader\";\r\n\r\nconst UserSelect = ({ id, selected, multiple, onChange, disabled, department, cssClass = \"form-control\" }) => {\r\n\tconst [activePage, setActivePage] = useState(1);\r\n\tconst [pageSize, setPageSize] = useState(50);\r\n\tconst [totalItems, setTotalItems] = useState(null);\r\n\tconst [sortField, setSortField] = useState(null);\r\n\tconst [sortOrder, setSortOrder] = useState(null);\r\n\tconst [searchCriteria, setSearchCriteria] = useState(\"\");\r\n\r\n\tconst [items, setItems] = useState([]);\r\n\tconst [error, setError] = useState(null);\r\n\tconst [isLoaded, setIsLoaded] = useState(false);\r\n\tconst [helper, setHelper] = useState(false);\r\n\tuseQuery(setHelper);\r\n\r\n\t// Temporary for NS - no users table to filter marketing department so need to use static list\r\n\tconst nsMarketingEmails = [\"mbisping@northstarmls.com\", \"mboldt@northstarmls.com\", \"acosta@northstarmls.com\", \"klattner@northstarmls.com\", \"dlewis@northstarmls.com\", \"doestreich@northstarmls.com\", \"dzimmerman@northstarmls.com\"]\r\n\r\n\tuseEffect(() => {\r\n\t\tif (helper) {\r\n\t\t\tfetchData();\r\n\t\t}\r\n\t}, [id, activePage, searchCriteria, helper]);\r\n\r\n\tconst fetchData = () => {\r\n\t\tif (helper) {\r\n\t\t\tsetIsLoaded(false);\r\n\r\n\t\t\t// set the vars for the query helper\r\n\t\t\thelper.pageId = activePage - 1; // subtract one since the framework uses zero index\r\n\t\t\thelper.pageSize = pageSize;\r\n\t\t\thelper.orderBy = createOrderObject();\r\n\t\t\thelper.fetchAllData(\"members\", [{\r\n\t\t\t\tfield: \"MemberPrimaryEmail\",\r\n\t\t\t\top: \"Equal\",\r\n\t\t\t\tvalues: nsMarketingEmails\r\n\t\t\t}]).then(\r\n\t\t\t\t(result) => {\r\n\t\t\t\t\tlet results = result;\r\n\t\t\t\t\t// Sort list by last name ascending\r\n\t\t\t\t\tresults = results.sort((a, b) => (a.memberLastName.split(\" \").pop()[0] > b.memberLastName.split(\" \").pop()[0] ? 1 : -1));\r\n\t\t\t\t\tsetTotalItems(results.length);\r\n\t\t\t\t\tsetItems(results);\r\n\t\t\t\t\tsetIsLoaded(true);\r\n\t\t\t\t},\r\n\t\t\t\t(error) => {\r\n\t\t\t\t\tsetIsLoaded(true);\r\n\t\t\t\t\tsetError(error);\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tconst createOrderObject = () => {\r\n\t\tif (!sortField || !sortOrder) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\treturn [\r\n\t\t\t{\r\n\t\t\t\tfield: sortField,\r\n\t\t\t\tdirection: sortOrder,\r\n\t\t\t},\r\n\t\t];\r\n\t};\r\n\r\n\tconst buildUsers = () => {\r\n\t\treturn items.map((user) => (\r\n\t\t\t\r\n\t\t));\r\n\t};\r\n\r\n\tif (error) {\r\n\t\treturn
    Error: {error.message ?? \"Could not retrieve results\"}
    ;\r\n\t} else if (!isLoaded) {\r\n\t\treturn ;\r\n\t} else {\r\n\t\treturn (\r\n\t\t\t<>\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport default UserSelect;\r\n","import React, { useState } from \"react\";\r\n\r\n/**** USAGE EXAMPLE\r\n *\r\n * const testAction = () => {\r\n * console.log('TRIGGERED TEST ACTION')\r\n * }\r\n *\r\n * const itemActions = [\r\n * { label: 'Custom Action', iconClass: 'fas fa-check text-info', callback: testAction },\r\n * { label: 'Another Action', iconClass: 'fas fa-check-circle text-success', callback: anotherAction }\r\n * ]\r\n *\r\n * \r\n *\r\n * ******/\r\n\r\nfunction GenericActionsMenu({ actions }: { actions: any[] | undefined }) {\r\n\tconst [isActive, setIsActive] = useState(false);\r\n\tlet className = \"crmls-actions-dropdown-container\";\r\n\tclassName += isActive ? \" active\" : \"\";\r\n\r\n\tconst toggleActiveState = () => {\r\n\t\tif (isActive) {\r\n\t\t\tcloseMenu();\r\n\t\t} else {\r\n\t\t\tsetIsActive(!isActive);\r\n\t\t\tdocument.addEventListener(\"click\", closeMenu);\r\n\t\t}\r\n\t};\r\n\r\n\tconst closeMenu = () => {\r\n\t\tsetIsActive(false);\r\n\t\tdocument.removeEventListener(\"click\", closeMenu);\r\n\t};\r\n\r\n\tif (actions && actions.length) {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t{isActive && (\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t{actions.map((action, i) => {\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t
    {}}>\r\n\t\t\t\t\t\t\t\t\t{action?.iconClass ? : \"\"}\r\n\t\t\t\t\t\t\t\t\t{action.label}\r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t
    \r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\treturn <>;\r\n}\r\n\r\nexport default GenericActionsMenu;\r\n","/*\r\n * NOTE: use fontawesome 5 free icons or icomoon icons but use full icon class, with fas etc.\r\n * FA 5: https://fontawesome.com/icons?d=gallery&q=buildin&m=free\r\n * IcoMoon: https://iconsmind.com/view_icons/\r\n */\r\n\r\nconst Routes = [\r\n\t{\r\n\t\tname: \"Communications\",\r\n\t\tabbrev: \"CO\",\r\n\t\ticon: \"fas fa-bullhorn\",\r\n\t\trootpath: \"/communications\",\r\n\t\tpaths: [\r\n\t\t\t{\r\n\t\t\t\tpath: \"/communications\",\r\n\t\t\t\tname: \"Dashboard\",\r\n\t\t\t\ticon: \"icon-Gaugage\",\r\n\t\t\t\tshowWelcome: true,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Communications\", path: \"/communications\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/communications/articles\",\r\n\t\t\t\tname: \"Articles\",\r\n\t\t\t\ticon: \"fas fa-file\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Communications\", path: \"/communications\" },\r\n\t\t\t\t\t{ name: \"Articles\", path: \"/communications/articles\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/communications/audiences\",\r\n\t\t\t\tname: \"Audiences\",\r\n\t\t\t\ticon: \"fas fa-users\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Communications\", path: \"/communications\" },\r\n\t\t\t\t\t{ name: \"Audiences\", path: \"/communications/audiences\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/communications/campaigns\",\r\n\t\t\t\tname: \"Campaigns\",\r\n\t\t\t\ticon: \"fas fa-envelope\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Communications\", path: \"/communications\" },\r\n\t\t\t\t\t{ name: \"Campaigns\", path: \"/communications/campaigns\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/communications/media\",\r\n\t\t\t\tname: \"Media Manager\",\r\n\t\t\t\ticon: \"fas fa-photo-video\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Communications\", path: \"/communications\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/communications/reports\",\r\n\t\t\t\tname: \"Reports\",\r\n\t\t\t\ticon: \"fas fa-chart-bar\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Communications\", path: \"/communications\" },\r\n\t\t\t\t\t{ name: \"Reports\", path: \"/communications/reports\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/communications/templates\",\r\n\t\t\t\tname: \"Templates\",\r\n\t\t\t\ticon: \"fas fa-file\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Communications\", path: \"/communications\" },\r\n\t\t\t\t\t{ name: \"Templates\", path: \"/communications/templates\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t],\r\n\t},\r\n\t{\r\n\t\tname: \"Operations\",\r\n\t\ticon: \"fas fa-building\",\r\n\t\tabbrev: \"OP\",\r\n\t\trootpath: \"/operations\",\r\n\t\tpaths: [\r\n\t\t\t{\r\n\t\t\t\tpath: \"/operations/audience-applications\",\r\n\t\t\t\tname: \"Applications\",\r\n\t\t\t\ticon: \"fas fa-users\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Operations\", path: \"/operations\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/operations/custom-canvases\",\r\n\t\t\t\tname: \"Custom Canvases\",\r\n\t\t\t\ticon: \"fas fa-table\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Operations\", path: \"/operations\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/operations/email-validator\",\r\n\t\t\t\tname: \"Email Validator\",\r\n\t\t\t\ticon: \"fas fa-envelope\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Operations\", path: \"/operations\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/operations/eula\",\r\n\t\t\t\tname: \"EULA Manager\",\r\n\t\t\t\ticon: \"fas fa-file-signature\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Operations\", path: \"/operations\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/operations/media\",\r\n\t\t\t\tname: \"Media Manager\",\r\n\t\t\t\ticon: \"fas fa-photo-video\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Operations\", path: \"/operations\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tpath: \"/operations/system-alerts\",\r\n\t\t\t\tname: \"System Messages\",\r\n\t\t\t\ticon: \"fas fa-bell\",\r\n\t\t\t\tshowWelcome: false,\r\n\t\t\t\tcrumbs: [\r\n\t\t\t\t\t{ name: \"Home\", path: \"/\" },\r\n\t\t\t\t\t{ name: \"Operations\", path: \"/operations\" },\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t],\r\n\t},\r\n];\r\n\r\nexport default Routes;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { NavLink } from \"react-router-dom\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport Routes from \"../Utilities/Routes\";\r\nimport \"../../CSS/breadcrumbs.css\";\r\nimport AudienceApplications from \"../Main/Operations/AudienceApplications/AudienceApplications\";\r\n\r\nconst Breadcrumbs = () => {\r\n\tlet location = useLocation();\r\n\r\n\tconst [currentPath, setCurrentPath] = useState(location.pathname);\r\n\tconst [currentRouteObject, setCurrentRouteObject] = useState({\r\n\t\tpath: \"/operations\",\r\n\t\tname: \"Applications\",\r\n\t\tComponent: AudienceApplications,\r\n\t\ticon: \"fas fa-users\",\r\n\t\tshowWelcome: false,\r\n\t\tcrumbs: [{ name: \"Home\", path: \"/operations\" }],\r\n\t});\r\n\r\n\tuseEffect(\r\n\t\tfunction () {\r\n\t\t\tsetCurrentRouteObject(() => {\r\n\t\t\t\tlet cp = currentRouteObject;\r\n\t\t\t\tRoutes.forEach((element) => {\r\n\t\t\t\t\tif (currentPath.includes(element.rootpath)) {\r\n\t\t\t\t\t\tif (element.paths.length > 0) {\r\n\t\t\t\t\t\t\telement.paths.forEach((subpath) => {\r\n\t\t\t\t\t\t\t\tif (currentPath.includes(subpath.path)) {\r\n\t\t\t\t\t\t\t\t\tcp = subpath;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tcp = element;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn cp;\r\n\t\t\t});\r\n\t\t},\r\n\t\t[currentPath, currentRouteObject]\r\n\t);\r\n\r\n\tuseEffect(\r\n\t\tfunction () {\r\n\t\t\tsetCurrentPath(location.pathname);\r\n\t\t},\r\n\t\t[location.pathname]\r\n\t);\r\n\r\n\tconst getSlug = () => {\r\n\t\tif (currentRouteObject.showWelcome) {\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t

    \r\n\t\t\t\t\t\t\t{currentRouteObject.name}\r\n\t\t\t\t\t\t

    \r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tconst titleSlug = getSlug();\r\n\treturn (\r\n\t\t<>\r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t{titleSlug && \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t{titleSlug}\r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default Breadcrumbs;\r\n","import React from \"react\";\r\n\r\nconst Footer = () => {\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t
    © Copyright {new Date().getFullYear()} COSMOS
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n};\r\n\r\nexport default Footer;\r\n","import React, { useEffect, useState } from 'react';\r\nimport Routes from \"../Utilities/Routes\";\r\nimport {NavLink, useLocation} from \"react-router-dom\";\r\n\r\nfunction Menu() {\r\n\tlet location = useLocation();\r\n\tconst [activeMenu, setActiveMenu] = useState(location.pathname);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetActiveMenu(location.pathname);\r\n\t}, [location.pathname])\r\n\r\n\tconst isActiveSection = (item) => {\r\n\t\treturn activeMenu.includes(item.rootpath);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t
      \r\n\t\t\t{Routes.map((item, key) =>\r\n\t\t\t\t
    • \r\n\t\t\t\t\t\r\n\t\t\t\t\t 0 ? 'has-arrow' : ''}`} to={item.rootpath}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{item.name}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t
        \r\n\t\t\t\t\t\t{item.paths.map((path, path_key) =>\r\n\t\t\t\t\t\t\t
      • \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{path.name}\r\n\t\t\t\t\t\t\t
      • \r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t
      \r\n\t\t\t\t
    • \r\n\t\t\t)}\r\n\t\t
    \r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default Menu;\r\n","import React from \"react\";\r\nimport Menu from \"./Widgets/Menu\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { getEnvironmentFromLocation } from \"./Utilities/helpers\";\r\n\r\nconst LogoBar = ({ version }: { version: string }) => {\r\n\tlet environment = getEnvironmentFromLocation();\r\n\r\n\tconst getLogo = () => {\r\n\t\t// let logo = \"Mace\";\r\n\r\n\t\t// switch (environment) {\r\n\t\t// \tcase \"development\":\r\n\t\t// \tdefault:\r\n\t\t// \t\tlogo = \"Mace\";\r\n\t\t// \t\tbreak;\r\n\t\t// \tcase \"testing\":\r\n\t\t// \t\tlogo = \"Mace\";\r\n\t\t// \t\tbreak;\r\n\t\t// \tcase \"staging\":\r\n\t\t// \t\tlogo = \"Mace\";\r\n\t\t// \t\tbreak;\r\n\t\t// \tcase \"production\":\r\n\t\t// \t\tlogo = \"Mace\";\r\n\t\t// \t\tbreak;\r\n\t\t// }\r\n\r\n\t\t// return logo;\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t\"Mace\"\r\n\t\t\t
    \r\n\t\t);\r\n\t};\r\n\r\n\treturn (\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default LogoBar;\r\n","import React, { lazy, Suspense } from \"react\";\r\nimport { Switch, Route, Redirect } from \"react-router-dom\";\r\nimport ThemeLoader from \"../Components/Widgets/ThemeLoader\";\r\n\r\n// lazy-load home components\r\nconst SectionRoutes = lazy(() => import(\"./Main/SectionRoutes\"));\r\nconst NoMatch = lazy(() => import(\"./NoMatch\"));\r\n\r\nconst Main = () => {\r\n\treturn (\r\n\t\t}>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default Main;\r\n","import { createUserManager } from \"redux-oidc\";\r\nimport { generateUserManagerConfig } from \"./helpers\";\r\n\r\nconst userManager = createUserManager(generateUserManagerConfig());\r\nexport default userManager;\r\n","import React from \"react\";\r\nimport { useAppSelector } from \"../../app/hooks\";\r\nimport { userProfile } from \"../../features/user/selectors\";\r\nimport userManager from \"../Utilities/userManager\";\r\n\r\nfunction User() {\r\n\tconst user = useAppSelector(userProfile);\r\n\r\n\tconst logOut = () => {\r\n\t\tsetTimeout(async () => {\r\n\t\t\tconst userIdToken = (await userManager.getUser())?.id_token;\r\n\t\t\tuserManager.signoutRedirect({ id_token_hint: userIdToken });\r\n\t\t}, 2000);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{/* \"\" */}\r\n\t\t\t\t\t\"\"\r\n\t\t\t\t\r\n\t\t\t\tHi, {user?.memberFirstName ?? user?.userid}\r\n\t\t\t\r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\r\n\t\t\t\t\t\tHi!{\" \"}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{user?.memberFirstName ?? user?.userid} {user?.memberLastName}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t{/*My Profile*/}\r\n\t\t\t\t
    \r\n\t\t\t\t\t logout\r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t\r\n\t);\r\n}\r\n\r\nexport default User;\r\n","import React from \"react\";\r\nimport User from \"./Widgets/User\";\r\n\r\nconst Header = () => {\r\n\t// NOTE: This is required for LITE version. Work around for metis menu - does not handle jquery class toggle.. oye\r\n\tconst handleMenuCollapse = (e: any) => {\r\n\t\tconst sideBarElement = document.getElementById(\"page-aside\");\r\n\t\tconst sideBarBtn = document.getElementsByClassName(\"sidenav-btn\");\r\n\t\tif (sideBarElement && sideBarBtn) {\r\n\t\t\tsideBarElement.classList.toggle(\"aside-folded\");\r\n\t\t\tfor (let i = 0; i < sideBarBtn.length; i++) {\r\n\t\t\t\tsideBarBtn[i].classList.toggle(\"toggler-folded\");\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t\r\n\t\t\t
      \r\n\t\t\t\t
    • \r\n\t\t\t\t\t\r\n\t\t\t\t
    • \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n};\r\n\r\nexport default Header;\r\n","import React from \"react\";\r\nimport Houses from \"../Assets/houses.jpg\";\r\nimport \"@sweetalert2/theme-bootstrap-4/bootstrap-4.css\";\r\nimport userManager from \"./Utilities/userManager\";\r\n\r\nconst Unauthenticated = () => {\r\n\tconst logIn = () => {\r\n\t\tuserManager.signinRedirect();\r\n\t};\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t
    Internal Resource
    \r\n\t\t\t\t\t\t\t\t

    COSMOS is an internal application. Please log in to gain access.

    \r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n};\r\n\r\nexport default Unauthenticated;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport userManager from \"./Utilities/userManager\";\r\n\r\nconst AccessDenied = () => {\r\n const redirectTimer = 10; // After access denied, redirect to member portal in x seconds\r\n const [redirectTimeout, setRedirectTimeout] = useState(0);\r\n\r\n useEffect(() => {\r\n setRedirectTimeout(redirectTimer);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (redirectTimeout !== 0) {\r\n const interval = setInterval(() => {\r\n // update the state after 1000ms\r\n setRedirectTimeout((currentCount) => currentCount - 1);\r\n }, 1000);\r\n\r\n if (redirectTimeout - 1 === 0) {\r\n redirectToMemberPortal();\r\n }\r\n\r\n // clean up the interval\r\n return () => clearInterval(interval);\r\n }\r\n }, [redirectTimeout]);\r\n\r\n const redirectToMemberPortal = () => {\r\n\t\tsetTimeout(async () => {\r\n\t\t\tconst userIdToken = (await userManager.getUser())?.id_token;\r\n\t\t\tuserManager.signoutRedirect({ id_token_hint: userIdToken });\r\n\t\t}, 2000);\r\n }\r\n\r\n\treturn (\r\n\t\t
    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t
    Access Denied
    \r\n\t\t\t\t\t\t\t\t

    Sorry, you do not have access to this area. You will be redirected to the Member Portal in {redirectTimeout} seconds.

    \r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t);\r\n};\r\n\r\nexport default AccessDenied;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport Breadcrumbs from \"./Components/Widgets/Breadcrumbs\";\r\nimport Footer from \"./Components/Footer\";\r\nimport LogoBar from \"./Components/LogoBar\";\r\nimport Main from \"./Components/Main\";\r\nimport Header from \"./Components/Header\";\r\nimport { AbilityContext } from \"./Auth/can\";\r\nimport { defineAbility } from \"@casl/ability\";\r\nimport { AppDispatch, RootState, store } from \"./app/store\";\r\nimport { connect } from \"react-redux\";\r\nimport { loadUser } from \"redux-oidc\";\r\nimport userManager from \"./Components/Utilities/userManager\";\r\nimport { AppVersion } from \".\";\r\nimport ThemeLoader from \"./Components/Widgets/ThemeLoader\";\r\nimport Unauthenticated from \"./Components/Unauthenticated\";\r\nimport { useAppSelector } from \"./app/hooks\";\r\nimport { userProfile } from \"./features/user/selectors\";\r\nimport AccessDenied from \"./Components/AccessDenied\";\r\n\r\nconst App = (props: any) => {\r\n\tconst { oidc_user } = props;\r\n\tconst [isLoading, setIsLoading] = useState(true);\r\n\tconst [accessDenied, setAccessDenied] = useState(false);\r\n\tconst queryParameters = new URLSearchParams(window.location.search);\r\n\tlet loginAor = queryParameters.get(\"loginAor\");\r\n\tconst user = useAppSelector(userProfile);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (user && user?.hasCosmosAccess === false) {\r\n\t\t\tsetAccessDenied(true);\r\n\t\t} else {\r\n\t\t\tsetAccessDenied(false);\r\n\t\t}\r\n\t}, [user]);\r\n\r\n\tconst caslAbilities = defineAbility((can, cannot) => {\r\n\t\tcan(\"manage\", \"all\"); // able to manage all\r\n\t\tcan(\"read\", \"all\"); // and can read all\r\n\t});\r\n\r\n\tuseEffect(() => {\r\n\t\tif (loginAor) {\r\n\t\t\tloadUser(store, userManager);\r\n\t\t\tuserManager.signinRedirect();\r\n\t\t} else {\r\n\t\t\t// Give a loading buffer for oidc user state\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tsetIsLoading(false);\r\n\t\t\t}, 2000);\r\n\t\t}\r\n\t}, []);\r\n\r\n\treturn accessDenied ? (\r\n\t\t\r\n\t) : isLoading ? (\r\n\t\t\r\n\t) : oidc_user ? (\r\n\t\t\r\n\t\t\t\r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t
    \r\n\t\t
    \r\n\t) : (\r\n\t\t\r\n\t);\r\n};\r\n\r\nfunction mapStateToProps(state: RootState) {\r\n\treturn {\r\n\t\toidc_user: state.oidc.user,\r\n\t};\r\n}\r\n\r\nfunction mapDispatchToProps(dispatch: AppDispatch) {\r\n\treturn {\r\n\t\tdispatch,\r\n\t};\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(App);\r\n","import React from \"react\";\r\nimport { processSilentRenew } from \"redux-oidc\";\r\n\r\nconst SilentRenew = () => {\r\n\t/**\r\n\t * this is currently erroring out in dev on my local machine, with `Frame window timed out` error. Possibly related\r\n\t * to SSL cert being missing / wrong on local box. See https://stackoverflow.com/questions/48086331/how-to-handle-oidc-silent-renew-error\r\n\t * and https://github.com/IdentityModel/oidc-client-js/issues/1088\r\n\t */\r\n\r\n\tprocessSilentRenew();\r\n\tconsole.log(\"silent renew\");\r\n\treturn <>;\r\n};\r\n\r\nexport default SilentRenew;\r\n","import React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { CallbackComponent } from \"redux-oidc\";\r\nimport { push } from \"connected-react-router\";\r\nimport userManager from \"../Components/Utilities/userManager\";\r\nimport { useAppDispatch } from \"../app/hooks\";\r\nimport { AppDispatch, RootState } from \"../app/store\";\r\n\r\nconst CallbackPage = () => {\r\n\tconst dispatch = useAppDispatch();\r\n\r\n\t// just redirect to '/' in both cases\r\n\treturn (\r\n\t\t {\r\n\t\t\t\tdispatch(push(\"/\"));\r\n\t\t\t}}\r\n\t\t\terrorCallback={(error) => {\r\n\t\t\t\tdispatch(push(\"/login\"));\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<>\r\n\t\t\r\n\t);\r\n};\r\n\r\nfunction mapStateToProps(state: RootState) {\r\n\treturn {\r\n\t\tuser: state.oidc.user,\r\n\t};\r\n}\r\n\r\nfunction mapDispatchToProps(dispatch: AppDispatch) {\r\n\treturn {\r\n\t\tdispatch,\r\n\t};\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CallbackPage);\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n\twindow.location.hostname === \"localhost\" ||\r\n\t\t// [::1] is the IPv6 localhost address.\r\n\t\twindow.location.hostname === \"[::1]\" ||\r\n\t\t// 127.0.0.0/8 are considered localhost for IPv4.\r\n\t\twindow.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\r\n);\r\n\r\ntype Config = {\r\n\tonSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n\tonUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n\tif (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\r\n\t\t// The URL constructor is available in all browsers that support SW.\r\n\t\tconst publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n\t\tif (publicUrl.origin !== window.location.origin) {\r\n\t\t\t// Our service worker won't work if PUBLIC_URL is on a different origin\r\n\t\t\t// from what our page is served on. This might happen if a CDN is used to\r\n\t\t\t// serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\twindow.addEventListener(\"load\", () => {\r\n\t\t\tconst swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n\t\t\tif (isLocalhost) {\r\n\t\t\t\t// This is running on localhost. Let's check if a service worker still exists or not.\r\n\t\t\t\tcheckValidServiceWorker(swUrl, config);\r\n\r\n\t\t\t\t// Add some additional logging to localhost, pointing developers to the\r\n\t\t\t\t// service worker/PWA documentation.\r\n\t\t\t\tnavigator.serviceWorker.ready.then(() => {\r\n\t\t\t\t\tconsole.log(\"This web app is being served cache-first by a service \" + \"worker. To learn more, visit https://bit.ly/CRA-PWA\");\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// Is not localhost. Just register service worker\r\n\t\t\t\tregisterValidSW(swUrl, config);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n\tnavigator.serviceWorker\r\n\t\t.register(swUrl)\r\n\t\t.then((registration) => {\r\n\t\t\tregistration.onupdatefound = () => {\r\n\t\t\t\tconst installingWorker = registration.installing;\r\n\t\t\t\tif (installingWorker == null) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tinstallingWorker.onstatechange = () => {\r\n\t\t\t\t\tif (installingWorker.state === \"installed\") {\r\n\t\t\t\t\t\tif (navigator.serviceWorker.controller) {\r\n\t\t\t\t\t\t\t// At this point, the updated precached content has been fetched,\r\n\t\t\t\t\t\t\t// but the previous service worker will still serve the older\r\n\t\t\t\t\t\t\t// content until all client tabs are closed.\r\n\t\t\t\t\t\t\tconsole.log(\"New content is available and will be used when all \" + \"tabs for this page are closed. See https://bit.ly/CRA-PWA.\");\r\n\r\n\t\t\t\t\t\t\t// Execute callback\r\n\t\t\t\t\t\t\tif (config && config.onUpdate) {\r\n\t\t\t\t\t\t\t\tconfig.onUpdate(registration);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// At this point, everything has been precached.\r\n\t\t\t\t\t\t\t// It's the perfect time to display a\r\n\t\t\t\t\t\t\t// \"Content is cached for offline use.\" message.\r\n\t\t\t\t\t\t\tconsole.log(\"Content is cached for offline use.\");\r\n\r\n\t\t\t\t\t\t\t// Execute callback\r\n\t\t\t\t\t\t\tif (config && config.onSuccess) {\r\n\t\t\t\t\t\t\t\tconfig.onSuccess(registration);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t};\r\n\t\t})\r\n\t\t.catch((error) => {\r\n\t\t\tconsole.error(\"Error during service worker registration:\", error);\r\n\t\t});\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n\t// Check if the service worker can be found. If it can't reload the page.\r\n\tfetch(swUrl, {\r\n\t\theaders: { \"Service-Worker\": \"script\" },\r\n\t})\r\n\t\t.then((response) => {\r\n\t\t\t// Ensure service worker exists, and that we really are getting a JS file.\r\n\t\t\tconst contentType = response.headers.get(\"content-type\");\r\n\t\t\tif (response.status === 404 || (contentType != null && contentType.indexOf(\"javascript\") === -1)) {\r\n\t\t\t\t// No service worker found. Probably a different app. Reload the page.\r\n\t\t\t\tnavigator.serviceWorker.ready.then((registration) => {\r\n\t\t\t\t\tregistration.unregister().then(() => {\r\n\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// Service worker found. Proceed as normal.\r\n\t\t\t\tregisterValidSW(swUrl, config);\r\n\t\t\t}\r\n\t\t})\r\n\t\t.catch(() => {\r\n\t\t\tconsole.log(\"No internet connection found. App is running in offline mode.\");\r\n\t\t});\r\n}\r\n\r\nexport function unregister() {\r\n\tif (\"serviceWorker\" in navigator) {\r\n\t\tnavigator.serviceWorker.ready\r\n\t\t\t.then((registration) => {\r\n\t\t\t\tregistration.unregister();\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tconsole.error(error.message);\r\n\t\t\t});\r\n\t}\r\n}\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { BrowserRouter, Route, Switch } from \"react-router-dom\";\r\nimport { store, history } from \"./app/store\";\r\nimport { Provider } from \"react-redux\";\r\nimport App from \"./App\";\r\nimport { OidcProvider, loadUser } from \"redux-oidc\";\r\nimport { ConnectedRouter } from \"connected-react-router\";\r\nimport SilentRenew from \"./Components/SilentRenew\";\r\nimport userManager from \"./Components/Utilities/userManager\";\r\nimport Callback from \"./Components/Callback\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\n\r\nloadUser(store, userManager);\r\nexport const AppVersion = \"5.0.0\";\r\n\r\nReactDOM.render(\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t,\r\n\tdocument.getElementById(\"page-wrapper\")\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n","import React from \"react\";\r\nimport Loader from \"react-loader-spinner\";\r\n\r\n// @todo: vk - replace instances of Loader with ThemeLoader\r\n// set default props to use theme variables\r\nconst defaultParams = {\r\n\ttype: \"ThreeDots\",\r\n\tcolor: \"#2BAD60\",\r\n\theight: 100,\r\n\twidth: 100,\r\n\tcustomClass: \"default-loader\",\r\n};\r\n\r\nexport const InputLoader = (props) => (\r\n\t
    \r\n\t\t\r\n\t\tLoading...\r\n\t
    \r\n);\r\n\r\nconst ThemeLoader = (props) => (\r\n\t
    \r\n\t\t\r\n\t
    \r\n);\r\n\r\nexport default ThemeLoader;\r\n","import { TypedUseSelectorHook, useDispatch, useSelector } from \"react-redux\";\r\nimport type { RootState, AppDispatch } from \"./store\";\r\n\r\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\r\nexport const useAppDispatch = () => useDispatch();\r\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\r\n","import { Action, AnyAction } from \"@reduxjs/toolkit\";\r\nimport axios from \"axios\";\r\nimport { getEnvironmentFromLocation } from \"../Components/Utilities/helpers\";\r\n\r\n// TODO: Need to set env var or otherwise figure out solid way to determine dev\r\nlet base, memberPortal;\r\nlet environment = getEnvironmentFromLocation();\r\n\r\n// this is assuming staging will be hitting prod endpoints. . .double check this!\r\nswitch (environment) {\r\n\tcase \"production\":\r\n\t\tbase = \"https://northstar-recenterhub-core-prod-app.azurewebsites.net/\";\r\n\t\tmemberPortal = \"https://member.northstarmls.com/\";\r\n\t\tbreak;\r\n\tcase \"staging\":\r\n\t\tbase = \"https://northstar-recenterhub-core-dev-appsvc.azurewebsites.net/\";\r\n\t\tmemberPortal = \"https://member-staging.northstarmls.com/\";\r\n\t\tbreak;\r\n\tcase \"local\":\r\n\tdefault:\r\n\t\tbase = \"https://northstar-recenterhub-core-dev-appsvc.azurewebsites.net/\";\r\n\t\tmemberPortal = \"http://localhost:44332/\";\r\n\t\tbreak;\r\n}\r\n\r\nexport const base_url = base;\r\nexport const memberPortalUrl = memberPortal;\r\n\r\nexport type axiosConfig = {\r\n\ttoken: string;\r\n\tendpoint?: string;\r\n};\r\n\r\nexport type derivedParameters = {\r\n\ttype: \"member\" | \"office\";\r\n\tid: string;\r\n};\r\n\r\nexport type crmlsPayload = {\r\n\tpageId: number;\r\n\tpageSize: number;\r\n\ttotalResults: number;\r\n\ttotalPages: number;\r\n\tisSuccessful: boolean;\r\n\tresults: any[];\r\n\texceptions?: string[];\r\n\tmessage?: string;\r\n};\r\n\r\nexport type qPayload = {\r\n\tpageId: number;\r\n\tpageSize: number;\r\n\tcriteria: qCriteria[];\r\n\torderBy: { field: string; direction: string }[];\r\n};\r\n\r\nexport type qCriteria = {\r\n\tfield: string;\r\n\top: string;\r\n\tvalues: any[] | string[];\r\n};\r\n\r\nexport function defaultCrmlsPayload() {\r\n\treturn {\r\n\t\tpageId: 0,\r\n\t\tpageSize: 0,\r\n\t\ttotalResults: 0,\r\n\t\ttotalPages: 0,\r\n\t\tisSuccessful: true,\r\n\t\tresults: [],\r\n\t};\r\n}\r\n\r\nexport function get(url: string, id?: string) {\r\n\tlet req_url = id ? url + id : url;\r\n\treturn axios.get(req_url);\r\n}\r\n\r\nexport function post(url: string, requestData: object) {\r\n\treturn axios.post(url, requestData);\r\n}\r\n\r\nexport function put(url: string, requestData: object) {\r\n\treturn axios.put(url, requestData);\r\n}\r\n\r\nexport function del(url: string, id: string) {\r\n\treturn axios.delete(url + \"/\" + id);\r\n}\r\n\r\nexport interface RejectedAction extends Action {\r\n\terror: Error;\r\n}\r\n\r\nexport function isRejectedAction(action: AnyAction): action is RejectedAction {\r\n\treturn action.type.endsWith(\"rejected\");\r\n}\r\n\r\nexport function isPendingAction(action: AnyAction) {\r\n\treturn action.type.endsWith(\"pending\");\r\n}\r\n\r\nexport function getMemberData() {\r\n\treturn axios.get(base_url + \"api/app/Members/AuthMemberDto\");\r\n}\r\n","import { createAsyncThunk, createSelector, createSlice } from \"@reduxjs/toolkit\";\r\nimport { emptyUserState, userCore } from \"./selectors\";\r\nimport { getMemberData } from \"../../adapters\";\r\nimport { RootState } from \"../../app/store\";\r\n\r\nexport const fetchMemberData = createAsyncThunk(\"user/fetchMemberData\", async (user: userCore, thunkAPI) => {\r\n\t// do additional lookups here\r\n\tconst response = await getMemberData();\r\n\tif (response.status < 200 || response.status > 299) {\r\n\t\tconst message = `An error has occurred: ${response.statusText}`;\r\n\t\tthrow new Error(message);\r\n\t}\r\n\r\n\treturn response.data;\r\n});\r\n\r\nconst initialState = {\r\n\tstatus: \"idle\",\r\n\tprofile: emptyUserState(),\r\n\terror: null,\r\n};\r\n\r\nexport const userSlice = createSlice({\r\n\tname: \"user\",\r\n\tinitialState,\r\n\treducers: {},\r\n\textraReducers: (builder) => {\r\n\t\tbuilder\r\n\t\t\t.addCase(fetchMemberData.fulfilled, (state, action) => {\r\n\t\t\t\tstate.status = \"idle\";\r\n\t\t\t\tstate.profile = action.payload;\r\n\t\t\t})\r\n\t\t\t.addCase(fetchMemberData.pending, (state, action) => {\r\n\t\t\t\tstate.status = \"loading\";\r\n\t\t\t});\r\n\t},\r\n});\r\n\r\n// export const { logout } = userSlice.actions\r\nexport default userSlice.reducer;\r\n","import { combineReducers } from \"redux\";\r\nimport { connectRouter } from \"connected-react-router\";\r\nimport { History, LocationState } from \"history\";\r\nimport { reducer as oidcReducer } from \"redux-oidc\";\r\nimport userReducer from \"../features/user/userSlice\";\r\nimport prefsReducer from \"../features/prefsFeature/prefsSlice\";\r\n\r\nconst createRootReducer = (history: History) =>\r\n\tcombineReducers({\r\n\t\trouter: connectRouter(history),\r\n\t\toidc: oidcReducer,\r\n\t\tuser: userReducer,\r\n\t\tprefs: prefsReducer,\r\n\t});\r\nexport default createRootReducer;\r\n","import { SILENT_RENEW_ERROR, USER_EXPIRED, USER_EXPIRING, USER_FOUND, USER_SIGNED_OUT } from \"redux-oidc\";\r\nimport { fetchMemberData } from \"../features/user/userSlice\";\r\nimport { userCore } from \"../features/user/selectors\";\r\nimport { Middleware } from \"@reduxjs/toolkit\";\r\nimport dayjs from \"dayjs\";\r\nimport axios from \"axios\";\r\n\r\nexport const userMiddleware: Middleware = (store) => (next) => (action) => {\r\n\tif (action.type === USER_FOUND) {\r\n\t\tlet user = action.payload;\r\n\t\tif (user) {\r\n\t\t\tlet userCore: userCore = {\r\n\t\t\t\tprofile: user.profile,\r\n\t\t\t\ttoken: user.access_token,\r\n\t\t\t};\r\n\t\t\taxios.defaults.headers.common[\"Authorization\"] = \"Bearer \" + user.access_token;\r\n\t\t\tstore.dispatch(fetchMemberData(userCore));\r\n\t\t}\r\n\t} else if (action.type === SILENT_RENEW_ERROR || action.type === USER_EXPIRING || action.type === USER_EXPIRED || action.type === USER_SIGNED_OUT) {\r\n\t\tconsole.log(action.type);\r\n\t\tconsole.log(action.payload);\r\n\t\tconsole.log(dayjs().format(\"dddd, MMMM D, YYYY h:mm A\"));\r\n\t}\r\n\r\n\treturn next(action);\r\n};\r\n","import { configureStore, ThunkAction, Action } from \"@reduxjs/toolkit\";\r\nimport { routerMiddleware } from \"connected-react-router\";\r\nimport { createBrowserHistory } from \"history\";\r\nimport createRootReducer from \"./reducers\";\r\nimport { userMiddleware } from \"../middleware/userMiddleware\";\r\n\r\nexport const history = createBrowserHistory();\r\n\r\nexport const store = configureStore({\r\n\treducer: createRootReducer(history),\r\n\tmiddleware: (getDefaultMiddleware) =>\r\n\t\tgetDefaultMiddleware({\r\n\t\t\tserializableCheck: {\r\n\t\t\t\t// this is to eliminate a problem with warnings: https://github.com/maxmantz/redux-oidc/issues/169\r\n\t\t\t\tignoredActions: [\"redux-oidc/USER_FOUND\"],\r\n\t\t\t\tignoredPaths: [\"oidc.user\"],\r\n\t\t\t},\r\n\t\t}).concat(routerMiddleware(history), userMiddleware),\r\n});\r\n\r\nexport type AppDispatch = typeof store.dispatch;\r\nexport type RootState = ReturnType;\r\nexport type AppThunk = ThunkAction>;\r\n\r\nexport function getToken() {\r\n\tlet state = store.getState();\r\n\tif (state.oidc && state.oidc.user) {\r\n\t\treturn state.oidc.user.access_token;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n","import axios from \"axios\";\r\nimport MD5 from \"crypto-js/md5\";\r\nimport dayjs from \"dayjs\";\r\n\r\nclass QueryHelper {\r\n\tenvironment;\r\n\t// generics\r\n\tcoreApi;\r\n\tbase_url;\r\n\tnotification_url;\r\n\tbase_config;\r\n\r\n\tconstructor({ environment }) {\r\n\t\tthis.environment = environment;\r\n\r\n\t\tif (this.environment === \"production\") {\r\n\t\t\tthis.base_url = \"https://northstar-recenterhub-core-prod-app.azurewebsites.net/api/app/\";\r\n\t\t\tthis.coreApi = \"https://northstar-recenterhub-core-prod-app.azurewebsites.net/api/app/\";\r\n\t\t\tthis.notification_url = \"https://northstar-recenterhub-notification-prod-app.azurewebsites.net/api/app/\";\r\n\t\t} else if (this.environment === \"staging\") {\r\n\t\t\tthis.base_url = \"https://northstar-recenterhub-core-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t\tthis.coreApi = \"https://northstar-recenterhub-core-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t\tthis.notification_url = \"https://northstar-notification-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t} else if (this.environment === \"testing\") {\r\n\t\t\tthis.base_url = \"https://northstar-recenterhub-core-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t\tthis.coreApi = \"https://northstar-recenterhub-core-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t\tthis.notification_url = \"https://northstar-notification-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t} else {\r\n\t\t\tthis.base_url = \"https://northstar-recenterhub-core-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t\tthis.coreApi = \"https://northstar-recenterhub-core-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t\tthis.notification_url = \"https://northstar-notification-dev-appsvc.azurewebsites.net/api/app/\";\r\n\t\t}\r\n\t\tthis.base_config = {\r\n\t\t\theaders: {\r\n\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\tAccept: \"application/json\",\r\n\t\t\t},\r\n\t\t};\r\n\t}\r\n\r\n\toperators = {\r\n\t\tEqual: 0,\r\n\t\tGreaterThan: 1,\r\n\t\tGreaterThanOrEqual: 2,\r\n\t\tLessThan: 3,\r\n\t\tLessThanOrEqual: 4,\r\n\t\tBetween: 5,\r\n\t\tNotEqual: 6,\r\n\t\tNotEmpty: 7,\r\n\t\tLike: 8,\r\n\t\tHasAny: 9,\r\n\t\tContains: 10,\r\n\t\tStartsWith: 11,\r\n\t\tNotLike: 12,\r\n\t\tContainsAny: 13,\r\n\t};\r\n\tpageId = 0;\r\n\tpageSize = 50;\r\n\tsearch = [];\r\n\tfield = \"\";\r\n\tcriteria = [];\r\n\torderBy = [];\r\n\tfields = [];\r\n\tuse_q = \"/q\";\r\n\r\n\tget payload() {\r\n\t\treturn {\r\n\t\t\tpageId: this.pageId,\r\n\t\t\tpageSize: this.pageSize,\r\n\t\t\tcriteria: this.criteria,\r\n\t\t\torderBy: this.orderBy,\r\n\t\t\tfields: this.fields,\r\n\t\t};\r\n\t}\r\n\r\n\tsetMace() {\r\n\t\tthis.base_url = this.coreApi;\r\n\t}\r\n\r\n\tsetNotification() {\r\n\t\tthis.base_url = this.notification_url;\r\n\t}\r\n\r\n\tsetMembership() {\r\n\t\tthis.base_url = this.coreApi;\r\n\t}\r\n\r\n\tsetMembershipV3() {\r\n\t\tthis.base_url = this.coreApi;\r\n\t}\r\n\r\n\tsetMemberPortal() {\r\n\t\tthis.base_url = this.coreApi;\r\n\t}\r\n\r\n\tset payload(payload) {}\r\n\r\n\tasync get(path) {\r\n\t\tconst resp = await axios.get(this.base_url + path, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync put(path, payload) {\r\n\t\tconst resp = await axios.put(this.base_url + path, payload, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync post(path, payload) {\r\n\t\tconst resp = await axios.post(this.base_url + path, payload, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync fetchData(resource) {\r\n\t\tconst resp = await axios.post(this.base_url + resource + this.use_q, this.payload, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync fetchDataWithCriteria(resource, criteria) {\r\n\t\tthis.criteria = criteria;\r\n\t\tconst resp = await axios.post(this.base_url + resource + this.use_q, this.payload, this.base_config);\r\n\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync fetchAllData(resource, criteria = []) {\r\n\t\tthis.pageSize = 10000;\r\n\t\tlet totalPages = 1;\r\n\t\tlet results = [];\r\n\r\n\t\tif (criteria && criteria.length) {\r\n\t\t\tthis.criteria = criteria;\r\n\t\t}\r\n\t\tlet resp = await axios.post(this.base_url + resource + this.use_q, this.payload, this.base_config);\r\n\t\tresults = resp.data.results;\r\n\r\n\t\ttotalPages = resp.data.totalResults / resp.data.pageSize;\r\n\r\n\t\twhile (this.pageId + 1 < totalPages) {\r\n\t\t\tthis.pageId++;\r\n\t\t\tresp = await axios.post(this.base_url + resource + this.use_q, this.payload, this.base_config);\r\n\t\t\tresults = results.concat(resp.data.results);\r\n\t\t}\r\n\r\n\t\treturn results;\r\n\t}\r\n\r\n\tasync fetchLookupData(resource) {\r\n\t\tlet results = [];\r\n\r\n\t\tlet resp = await axios.get(`${this.coreApi}lookupValues/${resource}`, this.base_config);\r\n\t\tresults = resp.data.results;\r\n\r\n\t\treturn results;\r\n\t}\r\n\r\n\tasync fetchResource(resource, id, expanded) {\r\n\t\tlet exp = expanded ? \"/expanded\" : \"\";\r\n\t\tconst resp = await axios.get(this.base_url + resource + \"/\" + id + exp, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync createResource(resource, payload) {\r\n\t\tconst resp = await axios.post(this.base_url + resource, payload, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync updateResource(resource, id, payload) {\r\n\t\tconst resp = await axios.put(this.base_url + resource + \"/\" + id, payload, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync deleteResource(resource, id) {\r\n\t\tconst resp = await axios.delete(this.base_url + resource + \"/\" + id, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync fetchAudienceMembers() {\r\n\t\tconst resp = await axios.post(this.coreApi + \"Members/q\", this.payload, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync fetchReportData(criteria) {\r\n\t\tconst key = MD5(JSON.stringify(criteria)).toString();\r\n\t\tlet existing = false;\r\n\t\ttry {\r\n\t\t\texisting = JSON.parse(sessionStorage.getItem(key));\r\n\t\t} catch (e) {\r\n\t\t\tconsole.log(e);\r\n\t\t}\r\n\r\n\t\tif (existing && existing.hasOwnProperty(\"timestamp\")) {\r\n\t\t\tif (dayjs.unix(existing.timestamp) > dayjs().add(50, \"second\").unix()) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconsole.log(\"returning cached\");\r\n\t\t\t\t\treturn new Promise(function (resolve, reject) {\r\n\t\t\t\t\t\tsetTimeout(() => resolve(existing.data), 1);\r\n\t\t\t\t\t});\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.log(e);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log(\"Cache expired\");\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconsole.log(\"No cache, returning fresh\");\r\n\t\t\tconst resp = await axios.post(this.notification_url + \"WebhookEvent/Stats\", criteria, this.base_config);\r\n\t\t\tlet cached_data = JSON.stringify({\r\n\t\t\t\ttimestamp: dayjs().unix(),\r\n\t\t\t\tdata: resp.data,\r\n\t\t\t});\r\n\r\n\t\t\tsessionStorage.setItem(key, cached_data);\r\n\t\t\treturn resp.data;\r\n\t\t}\r\n\t}\r\n\r\n\tasync fetchAudienceMember(contact_id) {\r\n\t\tlet payload = {\r\n\t\t\tpageId: 0,\r\n\t\t\tpageSize: 1,\r\n\t\t\tcriteria: [\r\n\t\t\t\t{\r\n\t\t\t\t\tfield: \"id\",\r\n\t\t\t\t\top: 0,\r\n\t\t\t\t\tvalues: [contact_id],\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t};\r\n\t\tconst resp = await axios.post(this.coreApi + \"Members/q\", payload, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync fetchAllAudienceMembers() {\r\n\t\t// set limit to max\r\n\t\tthis.pageSize = 10000;\r\n\t\tlet totalPages = 1;\r\n\t\tlet results = [];\r\n\t\tlet resp = await axios.post(this.coreApi + \"Members/q\", this.payload, this.base_config);\r\n\t\tresults = resp.data.results;\r\n\r\n\t\ttotalPages = resp.data.totalResults / resp.data.pageSize;\r\n\r\n\t\twhile (this.pageId + 1 < totalPages) {\r\n\t\t\tthis.pageId++;\r\n\t\t\tresp = await axios.post(this.coreApi + \"Members/q\", this.payload, this.base_config);\r\n\t\t\tresults = results.concat(resp.data.results);\r\n\t\t}\r\n\r\n\t\treturn results;\r\n\t}\r\n\r\n\tasync sendTestEmail(criteria) {\r\n\t\tconst resp = await axios.post(this.coreApi + \"Notification/SendPreview\", criteria, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync csvUpload(audienceId, file) {\r\n\t\tconst resp = await axios.post(this.coreApi + \"CustomContacts/uploadCsvFile/\" + audienceId, file, this.base_config);\r\n\t\treturn resp.data;\r\n\t}\r\n\r\n\tasync getRenderedPdf(campaignId) {\r\n\t\treturn await axios.get(`${this.coreApi}Campaign/PDFRender/${campaignId}`, this.base_config);\r\n\t}\r\n}\r\n\r\nexport default QueryHelper;\r\n","import { useEffect, useRef } from \"react\";\r\nimport QueryHelper from \"../Utilities/QueryHelper\";\r\nimport { getEnvironmentFromLocation } from \"../Utilities/helpers\";\r\n\r\nfunction useQuery(callback) {\r\n\tlet environment = getEnvironmentFromLocation();\r\n\r\n\t// callback will be a setQueryHelper function\r\n\tconst savedCallback = useRef();\r\n\r\n\tuseEffect(() => {\r\n\t\tsavedCallback.current = callback;\r\n\t}, [callback]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (environment) {\r\n\t\t\tsavedCallback.current(\r\n\t\t\t\tnew QueryHelper({\r\n\t\t\t\t\tenvironment: environment,\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t\t}\r\n\t}, [environment]);\r\n}\r\n\r\nexport default useQuery;\r\n","import { getToken, RootState } from \"../../app/store\";\r\nimport { createSelector } from \"@reduxjs/toolkit\";\r\nexport const user = (state: RootState) => state.user;\r\nexport const userProfile = (state: RootState) => state.user.profile;\r\nexport const userId = (state: RootState) => state.user.profile?.member?.id;\r\n\r\nexport const formattedProfile = createSelector(userProfile, (profile): userState => {\r\n\treturn formatProfile(profile);\r\n});\r\n\r\nexport const formatProfile = (profile: userPayload): userState => {\r\n\treturn {\r\n\t\tloginId: profile.userid,\r\n\t\tmemberId: profile?.member?.id ?? \"\",\r\n\t\tofficeId: profile.officeMlsId,\r\n\t\tfirstName: profile.memberFirstName,\r\n\t\tlastName: profile.memberLastName,\r\n\t\temail: profile.memberEmail,\r\n\t\tphotoUrl: profile.hasOwnProperty(\"member\") && profile.member.hasOwnProperty(\"photoUrl\") && profile.member.photoUrl ? profile.member.photoUrl : `https://ui-avatars.com/api/?background=0D8ABC&color=fff&name=${profile.memberFirstName + \" \" + profile.memberLastName}`,\r\n\t\tmemberType: mapUserLevel(profile.userclass),\r\n\t\taorName: profile.memberAOR,\r\n\t\taorFullName: profile?.aor?.name ?? \"\",\r\n\t\taorId: profile.memberAOR,\r\n\t\ttoken: getToken(),\r\n\t\tisCrmlsAdmin: profile.isCrmlsAdmin,\r\n\t\tisCrmlsAorAdmin: profile.isCrmlsAorAdmin,\r\n\t\tisCrmlsOfficeAdmin: profile.isCrmlsOfficeAdmin,\r\n\t\thasCosmosAccess: profile.hasCosmosAccess,\r\n\t};\r\n};\r\n\r\nexport const userAccessSelector = createSelector(userProfile, (profile): number => {\r\n\tif (!profile.isAuthenticated) {\r\n\t\treturn 0;\r\n\t} else if (profile.isCrmlsAorAdmin && profile.officeAOR === profile.memberAOR) {\r\n\t\treturn 4; // AOR admin\r\n\t} else if (profile.isCrmlsAdmin) {\r\n\t\treturn 5; // CRMLS admin\r\n\t}\r\n\r\n\tswitch (profile.member.memberTypeId) {\r\n\t\tcase 1: // Agent\r\n\t\tcase 5: // Personal Assist.\r\n\t\t\treturn 1; // Agent\r\n\t\tcase 2: // Broker\r\n\t\tcase 3: // Office Manager\r\n\t\tcase 4: // Office Assist.\r\n\t\t\tif (profile.office && (profile.office.officeCode === profile.office.mainOfficeCode || profile.office.mainOfficeCode === null)) {\r\n\t\t\t\treturn 3; // main office / broker\r\n\t\t\t}\r\n\t\t\treturn 2; // Broker\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t}\r\n});\r\n\r\nexport type userCore = {\r\n\tprofile: object;\r\n\ttoken: string;\r\n};\r\n\r\nexport type userState = {\r\n\tloginId: string;\r\n\tmemberId: string;\r\n\tofficeId: string;\r\n\tfirstName: string;\r\n\tlastName: string;\r\n\temail: string;\r\n\tphotoUrl: string;\r\n\tmemberType: memberType;\r\n\taorName: string;\r\n\taorFullName?: string;\r\n\taorId: string;\r\n\ttoken: string | null;\r\n\tisCrmlsAdmin: boolean;\r\n\tisCrmlsAorAdmin: boolean;\r\n\tisCrmlsOfficeAdmin: boolean;\r\n\thasCosmosAccess?: boolean | undefined;\r\n};\r\n\r\nexport type userPayload = {\r\n\tmemberKeyNumeric: number;\r\n\tuserid: string;\r\n\tuserlevel: string;\r\n\tbrokercode: string;\r\n\tuserclass: string;\r\n\tbrokerbranch: string;\r\n\tagentcode: string;\r\n\tmemberFirstName: string;\r\n\tmemberLastName: string;\r\n\tmemberAOR: string;\r\n\tmemberIsAssistantTo: string;\r\n\tofficeKeyNumeric: number;\r\n\tmemberMlsSecurityClass: string;\r\n\tmemberStatus: string;\r\n\toriginatingSystemID: string;\r\n\tofficeAOR: string;\r\n\tmemberEmail: string;\r\n\tofficeMlsId: string;\r\n\tmemberStateLicense: string;\r\n\thasMemberPortalAccess: boolean;\r\n\tisAuthenticated: boolean;\r\n\tisCrmlsAdmin: boolean;\r\n\tisCrmlsAorAdmin: boolean;\r\n\tisCrmlsOfficeAdmin: boolean;\r\n\tmember: memberPayload;\r\n\toffice?: officePayload;\r\n\taor?: aorPayload;\r\n\ttoken: string;\r\n\tmemberType: memberType;\r\n\thasCosmosAccess?: boolean | undefined;\r\n};\r\n\r\nexport type memberPayload = {\r\n\tfirstName: string;\r\n\tlastName: string;\r\n\tmiddleName?: string;\r\n\ttitle?: string;\r\n\tdisplayName: string;\r\n\tcontactTypeId: number;\r\n\tphotoUrl?: string;\r\n\tcomment?: string;\r\n\torder: number;\r\n\tofficeCode: string;\r\n\tloginId: string;\r\n\tmemberStatusId: number;\r\n\tmemberTypeId: number;\r\n\tdesignationId?: number;\r\n\tcreatedOn: string;\r\n\tcreatedBy?: string;\r\n\tid: string;\r\n\tmodifiedOn: string;\r\n\tmodifiedBy?: string;\r\n};\r\n\r\nexport type officePayload = {\r\n\tname: string;\r\n\tofficeCode: string;\r\n\taddress1: string;\r\n\tphone: string;\r\n\tfax: string;\r\n\tmainOfficeCode: string;\r\n\tofficeStatusId: number;\r\n\tofficeAorId: string;\r\n\tcreatedOn: string;\r\n\tid: string;\r\n\tmodifiedOn: string;\r\n};\r\n\r\nexport type aorPayload = {\r\n\tname: string;\r\n\tshortName: string;\r\n\tphone: string;\r\n\taddress1: string;\r\n\tstateAssociation: string;\r\n\tcreatedOn: string;\r\n\tid: string;\r\n\tmodifiedOn: string;\r\n\tlogoUrl?: string;\r\n};\r\n\r\nexport function emptyUserState(): userPayload {\r\n\treturn {\r\n\t\tmemberKeyNumeric: 0,\r\n\t\tuserid: \"\",\r\n\t\tuserlevel: \"\",\r\n\t\tbrokercode: \"\",\r\n\t\tuserclass: \"\",\r\n\t\tbrokerbranch: \"\",\r\n\t\tagentcode: \"\",\r\n\t\tmemberFirstName: \"\",\r\n\t\tmemberLastName: \"\",\r\n\t\tmemberAOR: \"\",\r\n\t\tmemberIsAssistantTo: \"\",\r\n\t\tofficeKeyNumeric: 0,\r\n\t\tmemberMlsSecurityClass: \"\",\r\n\t\tmemberStatus: \"\",\r\n\t\toriginatingSystemID: \"\",\r\n\t\tofficeAOR: \"\",\r\n\t\tmemberEmail: \"\",\r\n\t\tofficeMlsId: \"\",\r\n\t\tmemberStateLicense: \"\",\r\n\t\thasMemberPortalAccess: false,\r\n\t\tisAuthenticated: false,\r\n\t\tisCrmlsAdmin: false,\r\n\t\tisCrmlsAorAdmin: false,\r\n\t\tisCrmlsOfficeAdmin: false,\r\n\t\tmember: {\r\n\t\t\tfirstName: \"\",\r\n\t\t\tlastName: \"\",\r\n\t\t\tdisplayName: \"\",\r\n\t\t\tcontactTypeId: 0,\r\n\t\t\torder: 0,\r\n\t\t\tofficeCode: \"\",\r\n\t\t\tloginId: \"\",\r\n\t\t\tmemberStatusId: 0,\r\n\t\t\tmemberTypeId: 0,\r\n\t\t\tcreatedOn: new Date().toString(),\r\n\t\t\tid: \"\",\r\n\t\t\tmodifiedOn: new Date().toString(),\r\n\t\t},\r\n\t\ttoken: \"\",\r\n\t\tmemberType: {\r\n\t\t\tname: \"\",\r\n\t\t\tdisplayName: \"\",\r\n\t\t\tshortName: \"\",\r\n\t\t\tdescription: \"\",\r\n\t\t\tvalue: 0,\r\n\t\t},\r\n\t};\r\n}\r\n\r\nexport type memberType = {\r\n\tname: string;\r\n\tdisplayName: string;\r\n\tshortName: string;\r\n\tdescription: string;\r\n\tvalue: number;\r\n};\r\n\r\nexport const userLevels: memberType[] = [\r\n\t{\r\n\t\tname: \"Agent\",\r\n\t\tdisplayName: \"Agent\",\r\n\t\tshortName: \"A\",\r\n\t\tdescription: \"Agent\",\r\n\t\tvalue: 1,\r\n\t},\r\n\t{\r\n\t\tname: \"Broker\",\r\n\t\tdisplayName: \"Broker\",\r\n\t\tshortName: \"B\",\r\n\t\tdescription: \"Broker\",\r\n\t\tvalue: 2,\r\n\t},\r\n\t{\r\n\t\tname: \"Office Manager\",\r\n\t\tdisplayName: \"Office Manager\",\r\n\t\tshortName: \"OM\",\r\n\t\tdescription: \"Office Manager\",\r\n\t\tvalue: 3,\r\n\t},\r\n\t{\r\n\t\tname: \"Office Assistant\",\r\n\t\tdisplayName: \"Office Assistant\",\r\n\t\tshortName: \"OA\",\r\n\t\tdescription: \"Office Assistant\",\r\n\t\tvalue: 4,\r\n\t},\r\n\t{\r\n\t\tname: \"Personal Assistant\",\r\n\t\tdisplayName: \"Personal Assistant\",\r\n\t\tshortName: \"PA\",\r\n\t\tdescription: \"Personal Assistant\",\r\n\t\tvalue: 5,\r\n\t},\r\n\t{\r\n\t\tname: \"Appraiser\",\r\n\t\tdisplayName: \"Appraiser\",\r\n\t\tshortName: \"AP\",\r\n\t\tdescription: \"Appraiser\",\r\n\t\tvalue: 6,\r\n\t},\r\n\t{\r\n\t\tname: \"Photographer\",\r\n\t\tdisplayName: \"Photographer\",\r\n\t\tshortName: \"PH\",\r\n\t\tdescription: \"Photographer\",\r\n\t\tvalue: 7,\r\n\t},\r\n\t{\r\n\t\tname: \"Reciprocal\",\r\n\t\tdisplayName: \"Reciprocal\",\r\n\t\tshortName: \"RCP\",\r\n\t\tdescription: \"Reciprocal\",\r\n\t\tvalue: 8,\r\n\t},\r\n\t{\r\n\t\tname: \"Vendor\",\r\n\t\tdisplayName: \"Vendor\",\r\n\t\tshortName: \"V\",\r\n\t\tdescription: \"Vendor\",\r\n\t\tvalue: 9,\r\n\t},\r\n\t{\r\n\t\tname: \"Affiliate\",\r\n\t\tdisplayName: \"Affiliate\",\r\n\t\tshortName: \"AF\",\r\n\t\tdescription: \"Affiliate\",\r\n\t\tvalue: 10,\r\n\t},\r\n\t{\r\n\t\tname: \"Association Staff\",\r\n\t\tdisplayName: \"Association Staff\",\r\n\t\tshortName: \"AA\",\r\n\t\tdescription: \"Association Staff\",\r\n\t\tvalue: 11,\r\n\t},\r\n\t{\r\n\t\tname: \"MLS Staff\",\r\n\t\tdisplayName: \"MLS Staff\",\r\n\t\tshortName: \"MLS\",\r\n\t\tdescription: \"MLS Staff\",\r\n\t\tvalue: 12,\r\n\t},\r\n\t{\r\n\t\tname: \"System Staff\",\r\n\t\tdisplayName: \"System Staff\",\r\n\t\tshortName: \"ST\",\r\n\t\tdescription: \"System Staff\",\r\n\t\tvalue: 13,\r\n\t},\r\n\t{\r\n\t\tname: \"Other\",\r\n\t\tdisplayName: \"Other\",\r\n\t\tshortName: \"OTH\",\r\n\t\tdescription: \"Other\",\r\n\t\tvalue: 14,\r\n\t},\r\n];\r\n\r\nexport const mapUserLevel = (userClass: string): memberType => {\r\n\tlet member_code: string;\r\n\r\n\tswitch (userClass) {\r\n\t\tcase \"AG\":\r\n\t\tcase \"AN\":\r\n\t\tcase \"HA\":\r\n\t\tcase \"CA\":\r\n\t\t\tmember_code = \"A\";\r\n\t\t\tbreak;\r\n\t\tcase \"DB\":\r\n\t\tcase \"DN\":\r\n\t\tcase \"HB\":\r\n\t\tcase \"CB\":\r\n\t\t\tmember_code = \"B\";\r\n\t\t\tbreak;\r\n\t\tcase \"OM\":\r\n\t\tcase \"ON\":\r\n\t\tcase \"HM\":\r\n\t\t\tmember_code = \"OM\";\r\n\t\t\tbreak;\r\n\t\tcase \"OA\":\r\n\t\t\tmember_code = \"OA\";\r\n\t\t\tbreak;\r\n\t\tcase \"PA\":\r\n\t\t\tmember_code = \"PA\";\r\n\t\t\tbreak;\r\n\t\tcase \"AP\":\r\n\t\t\tmember_code = \"AP\";\r\n\t\t\tbreak;\r\n\t\tcase \"PH\":\r\n\t\t\tmember_code = \"PH\";\r\n\t\t\tbreak;\r\n\t\tcase \"OD\":\r\n\t\tcase \"OG\":\r\n\t\t\tmember_code = \"RCP\";\r\n\t\t\tbreak;\r\n\t\tcase \"TP\":\r\n\t\t\tmember_code = \"V\";\r\n\t\t\tbreak;\r\n\t\tcase \"AF\":\r\n\t\t\tmember_code = \"AF\";\r\n\t\t\tbreak;\r\n\t\tcase \"BANGM\":\r\n\t\tcase \"BANGN\":\r\n\t\tcase \"BANGL\":\r\n\t\tcase \"BANGK\":\r\n\t\t\tmember_code = \"AA\";\r\n\t\t\tbreak;\r\n\t\tcase \"BANGP\":\r\n\t\tcase \"BANGQ\":\r\n\t\tcase \"BANGG\":\r\n\t\tcase \"AS\":\r\n\t\t\tmember_code = \"MLS\";\r\n\t\t\tbreak;\r\n\t\tcase \"TA\":\r\n\t\t\tmember_code = \"ST\";\r\n\t\t\tbreak;\r\n\t\tcase \"NA\":\r\n\t\tcase \"IMS\":\r\n\t\tcase \"IMSM\":\r\n\t\tcase \"CRIB\":\r\n\t\tcase \"MLSTA\":\r\n\t\tcase \"WC\":\r\n\t\t\tmember_code = \"OTH\";\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tmember_code = \"OTH\";\r\n\t\t\tbreak;\r\n\t}\r\n\tconst ut = userLevels.find((el) => el.shortName === member_code);\r\n\r\n\treturn (\r\n\t\tut ?? {\r\n\t\t\tname: \"\",\r\n\t\t\tdisplayName: \"\",\r\n\t\t\tshortName: \"\",\r\n\t\t\tdescription: \"\",\r\n\t\t\tvalue: 0,\r\n\t\t}\r\n\t);\r\n};\r\n","import dayjs from \"dayjs\";\r\nimport { UserManagerSettings, WebStorageStateStore } from \"oidc-client\";\r\n\r\nexport function classNames(...classes: string[]) {\r\n\treturn classes.filter(Boolean).join(\" \");\r\n}\r\n\r\ntype environment = \"local\" | \"development\" | \"testing\" | \"staging\" | \"production\";\r\n\r\nexport function getEnvironmentFromLocation(): environment {\r\n\tif (window.location.href.includes(\"localhost\") && process.env.NODE_ENV === \"development\") {\r\n\t\treturn \"local\";\r\n\t// } else if (window.location.href.includes(\"cosmos-lite-dev.crmls.org\")) {\r\n\t// \treturn \"development\";\r\n\t// } else if (window.location.href.includes(\"cosmos-lite-uat.crmls.org\")) {\r\n\t// \treturn \"testing\";\r\n\t} else if (window.location.href.includes(\"cosmos-staging.northstarmls.com\")) {\r\n\t\treturn \"staging\";\r\n\t} else if (window.location.href.includes(\"cosmos.northstarmls.com\")) {\r\n\t\treturn \"production\";\r\n\t}\r\n\r\n\t// fail to dev\r\n\treturn \"development\";\r\n}\r\n\r\nexport function generateUserManagerConfig(): UserManagerSettings {\r\n\tlet redirect_uri, silent_redirect_uri, post_logout_uri;\r\n\tlet root: string = \"\";\r\n\tlet auth: string = \"\";\r\n\tlet clientId = \"memberPortalUI\";\r\n\tlet environment = getEnvironmentFromLocation();\r\n\tconst queryParameters = new URLSearchParams(window.location.search);\r\n\tlet loginAor = queryParameters.get(\"loginAor\");\r\n\r\n\tswitch (environment) {\r\n\t\tcase \"local\":\r\n\t\t\troot = \"https://localhost:44344\";\r\n\t\t\tauth = \"https://signin-dev.northstarmls.com/\";\r\n\t\t\tbreak;\r\n\t\t// case \"development\":\r\n\t\t// \troot = \"cosmos-lite-dev.crmls.org\";\r\n\t\t// \tauth = \"https://northstar-recore-idp-dev-appsvc.azurewebsites.net/\";\r\n\t\t// \tbreak;\r\n\t\t// case \"testing\":\r\n\t\t// \troot = \"cosmos-lite-uat.crmls.org\";\r\n\t\t// \tauth = \"https://northstar-recore-idp-dev-appsvc.azurewebsites.net/\";\r\n\t\t// \tbreak;\r\n\t\tcase \"staging\":\r\n\t\t\troot = \"https://cosmos-staging.northstarmls.com\";\r\n\t\t\tauth = \"https://identity-staging.northstarmls.com/\";\r\n\t\t\tbreak;\r\n\t\tcase \"production\":\r\n\t\t\troot = \"https://cosmos.northstarmls.com\";\r\n\t\t\tauth = \"https://signin.northstarmls.com/\";\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tredirect_uri = `${root}/callback`;\r\n\tsilent_redirect_uri = `${root}/silent_renew`;\r\n\tpost_logout_uri = `${root}/logged-out`;\r\n\r\n\treturn {\r\n\t\tclient_id: clientId,\r\n\t\tredirect_uri: redirect_uri,\r\n\t\tresponse_type: \"code\",\r\n\t\tresponse_mode: \"query\",\r\n\t\tscope: \"coredataapi\",\r\n\t\tauthority: auth,\r\n\t\tsilent_redirect_uri: silent_redirect_uri,\r\n\t\tautomaticSilentRenew: true,\r\n\t\tfilterProtocolClaims: true,\r\n\t\tloadUserInfo: true,\r\n\t\tpost_logout_redirect_uri: post_logout_uri,\r\n\t\tmonitorSession: false, // this seems to fix logout issue, possibly also related to https://github.com/IdentityModel/oidc-client-js/issues/1319#issuecomment-799944264\r\n\t\tincludeIdTokenInSilentRenew: false, // trying this, found at https://github.com/IdentityModel/oidc-client-js/issues/172#issuecomment-593581424\r\n\t\tuserStore: new WebStorageStateStore({ store: window.localStorage }), // use local storage - this will allow opening new tabs without being prompted to log in (https://github.com/IdentityModel/oidc-client-js/wiki)\r\n\t\tacr_values: loginAor ? loginAor : \"\",\r\n\t};\r\n}\r\n\r\nexport function convertUrlToString(url: string) {\r\n\tlet convertedLabel: any[] = [];\r\n\tlet convertUrlTab = url.split(\"-\");\r\n\tconvertUrlTab.forEach((word) => {\r\n\t\tif (word.length > 1) {\r\n\t\t\tconvertedLabel.push(word.charAt(0).toUpperCase() + word.slice(1));\r\n\t\t} else {\r\n\t\t\tconvertedLabel.push(word);\r\n\t\t}\r\n\t});\r\n\treturn convertedLabel.join(\" \");\r\n}\r\n\r\nexport function passwordValidation(value: string) {\r\n\t// Password must be at least 8 charcters long and contain at least one uppercase, lowercase, number and special character\r\n\tif (value.length >= 8 && /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])/.test(value)) {\r\n\t\treturn true;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nexport function secondsToReadable(seconds: any) {\r\n\tconst hours = Math.floor(seconds / 3600);\r\n\tconst minutes = Math.floor((seconds - hours * 3600) / 60);\r\n\tseconds = seconds - hours * 3600 - minutes * 60;\r\n\tif (!!hours) {\r\n\t\tif (!!minutes) {\r\n\t\t\treturn `${hours}h ${minutes}m ${seconds}s`;\r\n\t\t} else {\r\n\t\t\treturn `${hours}h ${seconds}s`;\r\n\t\t}\r\n\t}\r\n\tif (!!minutes) {\r\n\t\treturn `${minutes}m ${seconds}s`;\r\n\t}\r\n\treturn `${seconds} seconds`;\r\n}\r\n\r\nexport const calendarPresets = [\r\n {\r\n label: \"Today\",\r\n start: dayjs().startOf(\"day\").toDate(),\r\n end: dayjs().toDate(),\r\n },\r\n {\r\n label: \"Past week\",\r\n start: dayjs().subtract(7, \"day\").toDate(),\r\n end: dayjs().toDate(),\r\n },\r\n {\r\n label: \"Past month\",\r\n start: dayjs().subtract(1, \"month\").toDate(),\r\n end: dayjs().toDate(),\r\n },\r\n {\r\n label: \"Past year\",\r\n start: dayjs().subtract(365, \"day\").toDate(),\r\n end: dayjs().toDate(),\r\n },\r\n];\r\n","import { createAsyncThunk, createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport * as dot from \"dot-object\";\r\nimport { RootState, store } from \"../../app/store\";\r\n\r\nconst storageName = \"CosmosPrefs\";\r\n\r\nexport type Selector = (state: RootState) => S;\r\n\r\nexport type prefPayload = {\r\n\tkey: string; // this should be in dot notation for the whole nested structure, eg. marketing.campaigns.selectors.campaignType\r\n\tvalue: any; // this can be another object, array, etc.\r\n};\r\n\r\nexport type prefCategories = {\r\n\tmarketing: any;\r\n\ttraining: any;\r\n\t// add additional departments as we go\r\n};\r\n\r\nexport type crmlsUserPrefs = {\r\n\tAPIPrefs: prefCategories;\r\n\tlocalPrefs: prefCategories;\r\n\tsessionPrefs: prefCategories;\r\n};\r\n\r\n// Define the initial state\r\nconst initialState: crmlsUserPrefs = {\r\n\tAPIPrefs: {\r\n\t\tmarketing: null,\r\n\t\ttraining: null,\r\n\t},\r\n\tlocalPrefs: {\r\n\t\tmarketing: null,\r\n\t\ttraining: null,\r\n\t},\r\n\tsessionPrefs: {\r\n\t\tmarketing: null,\r\n\t\ttraining: null,\r\n\t},\r\n};\r\n\r\nexport const fetchAPIMemberPrefs = createAsyncThunk(\"prefs/fetchAPIMemberPrefs\", async () => {\r\n\t// do request to API service here\r\n\treturn {\r\n\t\tmarketing: {},\r\n\t\ttraining: {},\r\n\t};\r\n});\r\n\r\nexport const fetchStoredMemberPrefs = createAsyncThunk(\"prefs/fetchStoredMemberPrefs\", async () => {\r\n\t// do request to local storage service here\r\n\tlet retrievedPrefs = localStorage.getItem(storageName);\r\n\r\n\tif (retrievedPrefs && retrievedPrefs !== \"\") {\r\n\t\treturn JSON.parse(retrievedPrefs);\r\n\t}\r\n});\r\n\r\nexport const fetchSessionMemberPrefs = createAsyncThunk(\"prefs/fetchSessionMemberPrefs\", async () => {\r\n\t// do request to session service here\r\n\tlet retrievedPrefs = sessionStorage.getItem(storageName);\r\n\r\n\tif (retrievedPrefs && retrievedPrefs !== \"\") {\r\n\t\treturn JSON.parse(retrievedPrefs);\r\n\t}\r\n});\r\n\r\nexport const prefsSlice = createSlice({\r\n\tname: \"prefs\",\r\n\tinitialState,\r\n\treducers: {\r\n\t\tsetAPIPref: (state, action: PayloadAction) => {\r\n\t\t\tlet currentState = { ...state.APIPrefs };\r\n\t\t\t// unset the current path or dot-object pukes\r\n\t\t\tdot.delete(action.payload.key, currentState);\r\n\t\t\tdot.str(action.payload.key, action.payload.value, currentState);\r\n\t\t\t// TODO: write back to storage\r\n\t\t\tstate.APIPrefs = currentState;\r\n\t\t},\r\n\t\tsetLocalStoragePref: (state, action: PayloadAction) => {\r\n\t\t\tlet currentState = { ...state.localPrefs };\r\n\t\t\t// unset the current path or dot-object pukes\r\n\t\t\tdot.delete(action.payload.key, currentState);\r\n\t\t\tdot.str(action.payload.key, action.payload.value, currentState);\r\n\t\t\t// write back to storage\r\n\t\t\tlocalStorage.setItem(storageName, JSON.stringify(currentState));\r\n\t\t\tstate.localPrefs = currentState;\r\n\t\t},\r\n\t\tsetSessionPref: (state, action: PayloadAction) => {\r\n\t\t\tlet currentState = { ...state.sessionPrefs };\r\n\t\t\t// unset the current path or dot-object pukes\r\n\t\t\tdot.delete(action.payload.key, currentState);\r\n\t\t\tdot.str(action.payload.key, action.payload.value, currentState);\r\n\t\t\t// write back to storage\r\n\t\t\tsessionStorage.setItem(storageName, JSON.stringify(currentState));\r\n\t\t\tstate.sessionPrefs = currentState;\r\n\t\t},\r\n\t},\r\n\textraReducers: (builder) => {\r\n\t\tbuilder\r\n\t\t\t.addCase(fetchAPIMemberPrefs.fulfilled, (state, action) => {\r\n\t\t\t\tstate.APIPrefs = action.payload;\r\n\t\t\t})\r\n\t\t\t.addCase(fetchStoredMemberPrefs.fulfilled, (state, action) => {\r\n\t\t\t\tstate.localPrefs = action.payload;\r\n\t\t\t})\r\n\t\t\t.addCase(fetchSessionMemberPrefs.fulfilled, (state, action) => {\r\n\t\t\t\tstate.sessionPrefs = action.payload;\r\n\t\t\t});\r\n\t},\r\n});\r\n\r\nexport const selectPrefByPath = (path: string): any => {\r\n\tlet state: RootState = store.getState();\r\n\r\n\t// loop over the settings starting from the API level settings and work down\r\n\tif (dot.pick(path, state.prefs.APIPrefs)) {\r\n\t\treturn dot.pick(path, state.prefs.APIPrefs);\r\n\t}\r\n\tif (dot.pick(path, state.prefs.localPrefs)) {\r\n\t\treturn dot.pick(path, state.prefs.localPrefs);\r\n\t}\r\n\tif (dot.pick(path, state.prefs.sessionPrefs)) {\r\n\t\treturn dot.pick(path, state.prefs.sessionPrefs);\r\n\t}\r\n\r\n\treturn undefined;\r\n};\r\n\r\nexport const { setAPIPref, setLocalStoragePref, setSessionPref } = prefsSlice.actions;\r\nconst { reducer } = prefsSlice;\r\nexport default reducer;\r\n","import { createContext } from \"react\";\r\nimport { createContextualCan } from \"@casl/react\";\r\n\r\nexport const AbilityContext = createContext();\r\nexport const Can = createContextualCan(AbilityContext.Consumer);\r\n"],"sourceRoot":""}