{"version":3,"sources":["components/Home.tsx","components/api-authorization/ApiAuthorizationConstants.js","components/api-authorization/AuthorizeService.js","components/api-authorization/LoginMenu.js","components/NavMenu.tsx","components/Layout.tsx","constants/weekendFilter.ts","datagrid helpers/calculateWeekendFilterExpression.ts","stores/allAssetsStore.ts","datagrid helpers/exportAssetGridAsync.ts","api/markAssetsAsExportedAsync.ts","datagrid helpers/orderWeekendHeaderFilter.ts","components/AllAssets.tsx","stores/assetStore.ts","components/AssetSummary.tsx","api/generateNewAssetIdAsync.ts","constants/assetDataFIelds.ts","constants/format.ts","constants/leaseTermParams.ts","stores/assetCodingClassStore.ts","stores/assetEntryServiceLivesStore.ts","stores/assetTypeStore.ts","stores/studyRoomStore.ts","stores/studyStructureStore.ts","stores/unitOfMeasureStore.ts","utility functions/calculateAggregateReplacementValue.ts","utility functions/calculateLeaseEndValue.ts","utility functions/calculateLeaseTotalPayment.ts","utility functions/calculateLeaseYearlyPayment.ts","components/DollarBuyoutInfo.tsx","components/AssetSummaryDrillDown.tsx","constants/yearRange.ts","stores/assetServiceLifeStore.ts","stores/autoAssetStore.ts","utility functions/getUpdatedAssetFilter.ts","components/AssetAutoNumberBox.tsx","components/AssetAutocomplete.tsx","components/AssetEntryPanelSummary.tsx","components/CRSEntry.jsx","stores/roomTypeStore.ts","components/StudyRoom.tsx","stores/structureLocationTypeStore.ts","components/StudyStructure.tsx","constants/budgetContingencySalesDataFields.ts","constants/studyCampusDataFields.ts","constants/studyDataFields.ts","stores/newClubListOnlyStore.ts","stores/studyStore.ts","components/StudySelect.tsx","components/StudySummary.tsx","components/StudyUpload.tsx","services/apiService.ts","components/ActivityLogsGrid.tsx","components/LoginCountsChart.tsx","components/ApiUsageChart.tsx","components/UsageGraphsChart.tsx","components/ActionCountsChart.tsx","components/StudyCountsCard.tsx","components/StudiesByCreatorChart.tsx","components/AnalyticsDashboard.tsx","stores/assetGroupStore.ts","components/AssetCodingClass.tsx","components/AssetGroup.tsx","components/AssetServiceLife.tsx","components/AssetType.tsx","components/RoomType.tsx","components/StructureLocationType.tsx","components/UnitOfMeasure.tsx","components/api-authorization/Login.js","components/api-authorization/Logout.js","components/api-authorization/ApiAuthorizationRoutes.js","components/AssetBulkEdit.tsx","constants/inflationDataFields.ts","stores/inflationStore.ts","constants/studyConstants.ts","components/BaseInflationEditor.tsx","components/InflationGrid.tsx","App.tsx","registerServiceWorker.js","index.tsx"],"names":["Home","React","createElement","Container","ApplicationName","QueryParameterNames","LogoutActions","LoginActions","prefix","ApplicationPaths","DefaultLoginRedirectPath","concat","ApiAuthorizationClientConfigurationUrl","ApiAuthorizationPrefix","Login","LoginFailed","LoginCallback","Register","Profile","LogOut","LoggedOut","LogOutCallback","IdentityRegisterPath","IdentityManagePath","authService","constructor","_callbacks","_nextSubscriptionId","_user","_isAuthenticated","_popUpDisabled","isAuthenticated","this","getUser","profile","ensureUserManagerInitialized","user","userManager","getAccessToken","access_token","signIn","state","silentUser","signinSilent","createArguments","updateState","success","silentError","console","log","Error","popUpUser","signinPopup","popUpError","message","error","signinRedirect","redirect","redirectError","completeSignIn","url","signinCallback","signOut","signoutPopup","undefined","popupSignOutError","signoutRedirect","redirectSignOutError","completeSignOut","response","signoutCallback","data","notifySubscribers","subscribe","callback","push","subscription","unsubscribe","subscriptionId","subscriptionIndex","map","element","index","found","filter","length","splice","i","useReplaceToNavigate","status","AuthenticationResultStatus","Fail","Success","Redirect","fetch","ok","settings","json","automaticSilentRenew","includeIdTokenInSilentRenew","userStore","WebStorageStateStore","UserManager","events","addUserSignedOut","async","removeUser","instance","LoginMenu","Component","props","super","userName","menuClassName","componentDidMount","_subscription","populateState","componentWillUnmount","Promise","all","setState","name","render","profilePath","logoutPath","pathname","local","authenticatedView","registerPath","loginPath","anonymousView","Fragment","NavItem","NavLink","tag","Link","className","to","UncontrolledButtonDropdown","DropdownToggle","caret","DropdownMenu","DropdownItem","FontAwesomeIcon","icon","color","NavMenu","currentStudyName","setCurrentStudyName","useState","collapsed","setCollapsed","useEffect","method","headers","then","result","catch","e","Navbar","light","NavbarToggler","onClick","toggleNavbar","isCollapsed","Collapse","isOpen","navbar","Layout","fluid","children","_Layout","displayName","WEEKEND_FILTER","text","value","calculateWeekendFilterExpression","selectedFilterOperations","target","dataField","dayOfTheWeek","rowData","fieldValue","date","Date","isNaN","valueOf","getDay","handleErrors","statusText","ALL_ASSETS_URL","token","allAssetsStore","CustomStore","loadMode","key","load","Authorization","exportAssetGridAsync","exportFileName","_e$component","component","beginUpdate","workbook","Workbook","worksheet","addWorksheet","exportedAssetIds","exportDataGrid","customizeCell","_ref","_e$column","gridCell","excelCell","assetData","includes","id","rowType","column","xlsx","writeBuffer","buffer","saveAs","Blob","type","_e$component2","jsonString","JSON","stringify","assetIds","body","window","location","reload","alert","markAssetsAsExportedAsync","endUpdate","cancel","orderWeekendHeaderFilter","dataSource","postProcess","results","allowedPageSizes","gridDataSource","DataSource","store","AllAssets","DataGrid","showBorders","allowColumnResizing","columnAutoWidth","allowColumnReordering","onExporting","repaintChangesOnly","Export","enabled","fileName","allowExportSelectedData","FilterPanel","visible","Scrolling","useNative","scrollByContent","scrollByThumb","showScrollbar","columnRenderingMode","Selection","mode","Pager","showPageSizeSelector","showNavigationButtons","showInfo","infoText","HeaderFilter","allowSearch","SearchPanel","Column","caption","allowEditing","dataType","allowExporting","calculateFilterExpression","format","allowFiltering","KEY_VALUE","ASSETS_URL","loadAsync","assetStore","byKey","insert","_","insertParams","values","update","remove","AssetSummary","keyExpr","handleResponse","ASSET_DATA_FIELDS","ID","STRUCTURE_LOCATION_NAME","ROOM_AREA_NAME","STUDY_ROOM_ID","ASSET_CODING_CLASS","ASSET_TYPE_ID","STUDY_STRUCTURE_ID","IS_LEASED","ASSET_SUB_TYPE_NAME","ASSET_MANUFACTURER_NAME","DESCRIPTION","ASSET_MODEL_NAME","ASSET_ID","IS_LEGACY_LEASE","QTY","UNIT_OF_MEASURE_ID","YEAR_INSTALLED","ASSET_SERVICE_LIFE_ID","ASSET_LIFE_CYCLE","UNIT_REPLACEMENT_VALUE","AGGREGATE_REPLACEMENT_VALUE","INITIAL_RY_AUTO","INITIAL_RY_MANUAL","LAST_RY_CYCLE","LEDGER_ID","NOTES","LEASE_START","LEASE_END","LEASE_DOLLAR_BUYOUT_AMOUNT","LEASE_MONTHLY_PAYMENT","LEASE_TERM","LEASE_TOTAL_PAYMENT","LEASE_YEARLY_PAYMENT","FORMAT","SINGLE_DECIMAL","TWO_DECIMALS","LEASE_TERM_PARAMS","MIN","MAX","URL","assetCodingClassStore","assetEntryServiceLifeStore","assetTypeStore","studyRoomStore","studyStructureStore","unitOfMeasureStore","calculateAggregateReplacementValue","unitReplacementCost","qty","calculateLeaseEndValue","leaseStart","leaseTerm","fromDate","monthsToAdd","copyDate","copyDateMonth","getUTCMonth","setUTCMonth","addMonthsToDateUtc","calculateLeaseTotalPayment","leaseMonthlyPayment","calculateLeaseYearlyPayment","DollarBuyoutInfo","iconClassName","toolTipPosition","toolTipWidth","Tooltip","showEvent","hideEvent","width","position","contentRender","renderToolTipContent","style","whiteSpace","NEW_LEASE_FORM_ITEMS","LEGACY_LEASE_INFO_TEXT_ITEM","ONE_CENT","thousandsAndDecimalEditorOptions","wholeNumberEditorOptions","INITIAL_ASSET_ID_EDITOR_STATE","initialAssetIdValue","initialCodingClassIdValue","AssetSummaryDrillDown","dataGrid","useRef","autoExpandAll","setAutoExpandAll","assetIdEditorState","setAssetIdEditorState","handleAssetCodingClassChangeAsync","newValue","params","err","notify","my","at","generateNewAssetIdAsync","assetCodingClassId","idOfExistingAsset","customizeItem","useCallback","item","newLeasedFormItem","itemType","isNewLeasedFormItem","legacyLeasedOrStandardFormItem","isLegacyLeasedOrStandardFormItem","legacyLeaseOnlyFormItem","isLegacyLeasedOnlyFormItem","dataGridInstance","current","editing","option","rowIndex","getRowIndexByKey","editRowKey","isLeased","cellValue","isLegacyLease","onEditorPreparing","_e$row","row","parentType","editorOptions","_e$row2","_e$row2$data","isStructureNotSet","studyStructureId","disabled","_e$row3","_e$row3$data","defaultValueChangeHandler","onValueChanged","_dataGrid$current","newAssetIdValue","onEditingStart","_e$data","_e$data2","assetId","onEditCanceled","ref","Paging","defaultPageSize","Editing","allowUpdating","allowDeleting","Popup","title","showTitle","fullScreen","Form","Item","colSpan","SimpleItem","GroupItem","colCount","height","DOLLAR_BUYOUT_TOTAL_COLUMNS","Grouping","expandMode","groupIndex","FormItem","setCellValue","setStructureValue","studyRoomId","Lookup","valueExpr","displayExpr","options","allowClearing","setLeaseStatusValue","newData","RequiredRule","setQtyCellValue","currentData","aggregateReplacementValue","unitReplacementValue","setYearInstalledCellValue","assetLifeCycle","yearInstalled","initialRYAuto","RangeRule","min","setAssetLifeCycleCellValue","setUnitReplacmentCellValue","editorType","setLeaseStartCellValue","leaseEnd","setLeaseTermCellValue","leaseTotalPayment","max","setLeaseMonthlyPaymentCellValue","leaseYearlyPayment","leaseDollarBuyoutAmount","ColumnFixing","CheckBox","onAutoExpandAllChanged","isExpanded","YEAR_RANGE","assetServiceLifeStore","autoAssetStore","createStore","loadUrl","addFilter","currentFilters","field","rule","getUpdatedAssetFilterValue","manufacturerValue","subTypeValue","descriptionValue","modelNameValue","AssetAutoNumberBox","filterByManufacturerValue","filterBySubTypeValue","filterByDescriptionValue","filterByModelNameValue","overrideValue","rest","suggestedValue","setSuggestedValue","useMemo","select","sort","selector","desc","paginate","pageSize","handleFilterValueChanges","unitValueToSet","filteredAssets","NumberBox","Object","assign","step","AssetAutocomplete","filterBysubTypeValue","searchMode","showClearButton","minSearchLength","group","keysList","g","toLowerCase","replace","m","toUpperCase","Set","autoCompleteRef","updatedFilterValue","_autoCompleteRef$curr","currentDataSource","getDataSource","Autocomplete","CLASSNAMES","SYNC_STATUS","assetListSearchExpr","AssetEntryPanelSummary","assetCountThisRoom","dbSyncStatus","assetsThisRoom","unsyncedRoomCount","unsyncedAssetCount","editingItemId","handleDBSyncButtonClicked","updateStatesAfterSync","editPanelItemClicked","panelOpen","setPanelOpen","isUnsynced","showRefreshButton","some","asset","cursor","togglePanelOpen","Box","direction","align","baseSize","Button","List","searchEnabled","searchExpr","itemRender","description","descriptionText","slice","isUnsyncedItem","onItemClick","_e$itemData","itemData","selectedItemKeys","pageLoadMode","studyStructureLookup","studyRoomsLookup","studyAssetsLookup","assetSubtypeAutocomplete","assetManufacturerAutocomplete","UnsyncedRooms","UnsyncedAssets","studyRoomTemplate","roomTypeId","math","create","CRSEntry","onAssetServiceLifeChanged","AssetServiceLifeID","auto","getAssetLifeCycleParams","AssetLifeCycle","clearNewRoom","StudyRoomId","AssetCodingClassId","AssetTypeId","AssetSubTypeId","AssetManufacturerName","AssetModelName","IsLeased","AssetSubTypeName","Description","Qty","UnitOfMeasureId","YearInstalled","UnitReplacementValue","AggregateReplacementValue","InitialRYAuto","InitialRYManual","LastRYCycle","Notes","EditAssetId","AssetLifeCycleMinimum","AssetLifeCycleMaximum","LedgerId","clearNewAsset","clearNewCodingType","clearSaveDuplicate","validateForm","validationGroup","validate","isValid","asyncResultIsValid","complete","onSaveNewAssetClick","isSaving","newAssetStudyRoomId","formValues","addAssetAsync","syncassets","assets","studyroomid","assetCount","AssetCountThisRoom","AssetsThisRoom","overrideDisabled","topOfForm","scrollIntoView","behavior","block","populateEdit","assetTypeId","assetSubTypeName","assetManufacturerName","assetModelName","unitOfMeasureId","assetServiceLifeId","initialRYManual","lastRYCycle","notes","ledgerId","onSaveNewAssetClickOffline","newAssetId","generateNewOfflineId","Math","apply","addToStudyAssetsLookup","CurrentUser","addToUnsyncedAssets","UnsyncedAssetCount","DBSyncStatus","onSaveStartNewRoomClick","onSaveStartNewRoomClickOffline","onSaveNewRoomClick","srt","NewRoomName","NewRoomStructureId","NewRoomType","addRoomAsync","syncdropdowns","newRoomId","StructureId","newList","room","studystructureid","studyRoomsLookupFiltered","RoomCount","NewRoomPopupVisible","onSaveNewRoomClickOffline","unsyncedRoom","UnsyncedRoomCount","onSaveCodingTypeClick","onSaveCodingTypeClickOffline","onSavingDuplicateClick","onSavingDuplicateClickOffline","parseServiceLife","serviceLife","match","x","y","onNewRoomButtonClick","SyncRoomsWithDB","forEach","tempAssetId","Id","indexToRemove","findIndex","indexToRemoveUA","tempRoomId","syncrooms","r","indexToRemoveUR","createRef","assetValidationGroup","studyStructures","itemIndex","studyRooms","studyAssets","createdBy","numbersOnlyRule","validationRules","structure","assetSubType","onStructureChanged","bind","onRoomChanged","onAssetCodingClassChanged","onAssetTypeChanged","onAssetSubtypeChanged","onAssetManufacturerNameChanged","onAssetModelNameChanged","onAssetLeaseStatusChanged","onAssetDetailDescriptionChanged","onQuantityChanged","onUomChanged","onYearInstalledChanged","onAssetLifeCycleChanged","onGeneralNotesChanged","onUnitReplacementValueChanged","onInitialRYAutoChanged","onInitialRYManualChanged","onLastRYCycleChanged","onLedgerIdChanged","handleRoomPopupHidden","handleRoomPopupShowing","onNewAssetClick","overrideUnitReplacementValue","onNewRoomClick","onNewRoomStructureChanged","onNewRoomNameChanged","onNewRoomTypeChanged","onQuantityFocusOut","onLeaseStartChanged","onLeaseMonthlyPaymentChanged","onLeaseTermChanged","onLeaseDollarBuyoutChanged","evt","editId","assetEdit","leaseEndDate","leaseStartYear","getFullYear","showNewLeaseView","greaterThanZeroIfLeased","requiredIfLeased","validateYearIfNotLeased","LoadPanel","shadingColor","showPane","showIndicator","shading","closeOnOutsideClick","ValidationGroup","SelectBox","placeholder","Validator","stylingMode","useSubmitBehavior","assetCodingClass","assetType","display","justifyContent","alignItems","defaultValue","TextBox","onFocusOut","NumericRule","PatternRule","pattern","uom","CustomRule","validationCallback","assetServiceLife","AsyncRule","validatationResult","resolve","readOnly","TextArea","DateBox","openOnFieldClick","labelLocation","ValidationSummary","dragEnabled","onHiding","onShowing","roomType","form","currentStructure","roomId","chosenStructureId","valueToUse","trim","qtyResult","evaluate","roundedQtyResult","round","onBeforeSend","ajaxOptions","xhrFields","withCredentials","onLoaded","createdby","manufacturer","usecreatedby","split","newId","formvalues","saveAsset","assetServiceLifeTextValue","startsWith","parseInt","minMaxRange","minimumLifeCycle","maximumLifecycle","currentMinimumId","Number","isInteger","newRoom","a","syncRoomLookup","dateTime","getCurrentDateTime","newAsset","syncAssetLookup","useId","today","getMonth","getDate","getHours","getMinutes","getSeconds","roomTypeStore","StudyRoom","allowAdding","toggleAutoExpandAll","structureLocationTypeStore","StudyStructure","copyColumnsEnabled","setCopyColumnsEnabled","toggleCopyColumnsEnabled","isEnabled","onToolbarPreparing","_e$toolbarOptions","_e$toolbarOptions$ite","toolbarOptions","items","unshift","widget","BUDGET_CONTENGENCY_SALES_DATA_FIELDS","STUDY_ID","SALES_TAX_RATE","BUDGETARY_CONTINGENCY_SALES_PERCENTAGE","INFLATION_RATE","STUDY_CAMPUS_DATA_FIELDS","NAME","STREET","ZIPCODE","CITY","STATE_PROVINCE","COUNTRY","DATE_CREATED","CREATED_BY","DATE_MODIFIED","MODIFIED_BY","STUDY_DATA_FIELDS","ENTITY_ID","CLUB_NAME","CLIENT_NAME","CLIENT_SALUTATION","CLIENT_TITLE","COMPANY_ID","YEAR","DATE_OF_EXECUTIVE_REPORT","CB_REPRESENTATIVE","CB_TITLE_OF_REPRESENTATIVE","FILE_NAME","COMPASS_PUBLISHED_BY","COMPASS_PUBLISH_DATE","STUDY_CAMPUS","BUDGETARY_CONTINGENCY_SALES","CLUBS_LIST_URL","NEW_CLUBS_LIST_URL","newClubListOnlyStore","STUDIES_URL","studyStore","StudySelect","selectBox","onOptionChanged","_selectBox$current","TOOLBAR_TEMPLATE_NAME","StudySummary","studyId","setStudyId","popupVisible","setPopupVisible","publishError","setPublishError","dataGridRef","loading","setLoading","togglePopupVisible","isVisible","onChooseUploadStudy","href","refreshDataGrid","_dataGridRef$current","refresh","of","template","isNewRow","popup","DGButton","compassPublishDate","selectedStudyId","onPublishButtonClick","Template","toolbarItemRender","hideInfo","hidePublishErrors","ScrollView","parse","StudyUpload","selectedFiles","setSelectedFiles","uploadResponse","setUploadResponse","uploadNewStudyUrl","setUploadNewStudyUrl","replaceStudyUrl","setReplaceStudyUrl","onSelectedFilesChanged","onUploaded","request","resp","updateQueryStringParameter","uploadUrl","re","RegExp","separator","indexOf","clubListDataSource","ratio","selectedClubId","currentUrl","FileUploader","multiple","uploadMode","file","lastModifiedDate","lastModified","size","API_BASE_URL","ActivityLogsGrid","setData","setError","logs","fetchActivityLogs","getData","margin","FilterRow","sortOrder","LoginCountsChart","parsedData","fetchLoginCounts","Chart","ArgumentAxis","argumentType","Label","formatter","toLocaleDateString","month","day","year","rotationAngle","ValueAxis","Series","argumentField","valueField","ZoomAndPan","argumentAxis","valueAxis","dragToZoom","panKey","ApiUsageChart","apiUsageData","fetchApiUsage","PieChart","palette","Connector","UsageGraphsChart","fetchUsageGraphs","Legend","ScrollBar","ActionCountsChart","actionCounts","fetchActionCounts","rotated","overlappingBehavior","StudyCountsCard","counts","setCounts","fetchStudyCounts","getCounts","totalStudies","publishedStudies","StudiesByCreatorChart","studies","fetchStudiesByCreator","AnalyticsDashboard","assetGroupStore","AssetCodingClass","AssetGroup","AssetServiceLife","AssetType","RoomType","StructureLocationType","UnitOfMeasure","action","login","getReturnUrl","processLoginCallback","URLSearchParams","search","get","redirectToProfile","redirectToRegister","returnUrl","navigateToReturnUrl","fromQuery","origin","redirectToApiAuthorizationPath","encodeURI","apiAuthorizationPath","redirectUrl","Logout","isReady","authenticated","history","logout","processLogoutCallback","populateAuthenticationState","ApiAuthorizationRoutes","Route","path","loginAction","logoutAction","ChangeType","createRangeRuleMessage","fieldName","range","DEFAULT_LOADING_PANEL_STATE","AssetBulkEdit","setAssets","workingAssets","setWorkingAssets","processResults","setProcessResults","loadPanelState","setLoadPanelState","loadAssetsAsync","loadingMessage","finally","changes","working","existing","find","ex","changedData","keys","existingValue","workingValue","Update","c","onChangesChange","foundChange","changed","resetEditorAsync","handleRevertClicked","handleSaveClicked","changedKeys","confirmResult","confirm","modifiedAssets","isSuccess","errorMessage","positiveIfNotLeased","requiredIfNotLeased","saveButton","revertButton","noChangesExist","handleClearAllFilters","_dataGrid$current2","clearFilter","Toolbar","ToolbarItem","onCellDblClick","combinedFilter","getCombinedFilter","dataStore","fa","ryAuto","arv","updateAllRowsByKeyValuePair","refreshMode","allowSorting","reevaluate","setInitialRYManualValue","INFLATION_DATA_FIELDS","PROJECT_YEAR","PERIOD","FISCAL_YEAR","YEARLY_INFLATION","CUMULATIVE_INFLATION","INFLATION_URL","inflationStore","STUDY_CONSTANTS","BASE_INFLATION_RATE_TEXT","BASE_INFLATION_URL","BaseInflationEditor","onAfterSaveSuccess","showGenerateButton","setIsSaving","initialInflationRate","setInitialInflationRate","currentInflationRate","setCurrentInflationRate","loadBaseInflation","baseInflation","onSaveInflationClicked","actionsDisabled","toolTipText","crossAlign","hint","onCancelClicked","InflationGrid","inflationExists","setInflationExists","popupIsVisible","setPopupIsVisible","showPopup","inflationDoesNotExist","showCloseButton","closePopup","renderAsync","onContentReady","totalCount","renderInflationEditor","library","add","fab","faCheckSquare","faBalanceScale","faChalkboard","faSave","faSignal","faCloudShowersHeavy","faEdit","faAngleDoubleLeft","faAngleDoubleRight","faInfoCircle","App","exact","isLocalhost","Boolean","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","msg","handleConnectionChange","event","offlineDivs","document","getElementsByClassName","onlineDivs","offDiv","toLocaleString","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","BrowserRouter","basename","addEventListener","process","ready","unregister","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.c7aa8f89.chunk.js","sourcesContent":["import React from \"react\";\r\nimport { Container } from \"reactstrap\";\r\n\r\nexport const Home = () => {\r\n return (\r\n \r\n
\r\n

CRS Study Tool

\r\n

\r\n This tool developed by Club Benchmarking is used by the CRS\r\n team for data collection. Inside the{\" \"}\r\n CRS Study Tool application, there are\r\n numerous displays:\r\n

\r\n \r\n
\r\n
\r\n );\r\n};\r\n","export const ApplicationName = 'CRS';\r\n\r\nexport const QueryParameterNames = {\r\n ReturnUrl: 'returnUrl',\r\n Message: 'message'\r\n};\r\n\r\nexport const LogoutActions = {\r\n LogoutCallback: 'logout-callback',\r\n Logout: 'logout',\r\n LoggedOut: 'logged-out'\r\n};\r\n\r\nexport const LoginActions = {\r\n Login: 'login',\r\n LoginCallback: 'login-callback',\r\n LoginFailed: 'login-failed',\r\n Profile: 'profile',\r\n Register: 'register'\r\n};\r\n\r\nconst prefix = '/authentication';\r\n\r\nexport const ApplicationPaths = {\r\nDefaultLoginRedirectPath: `${prefix}/${LoginActions.Login}`,\r\n ApiAuthorizationClientConfigurationUrl: `/_configuration/${ApplicationName}`,\r\n ApiAuthorizationPrefix: prefix,\r\n Login: `${prefix}/${LoginActions.Login}`,\r\n LoginFailed: `${prefix}/${LoginActions.LoginFailed}`,\r\n LoginCallback: `${prefix}/${LoginActions.LoginCallback}`,\r\n Register: `${prefix}/${LoginActions.Register}`,\r\n Profile: `${prefix}/${LoginActions.Profile}`,\r\n LogOut: `${prefix}/${LogoutActions.Logout}`,\r\n LoggedOut: `${prefix}/${LogoutActions.LoggedOut}`,\r\n LogOutCallback: `${prefix}/${LogoutActions.LogoutCallback}`,\r\n IdentityRegisterPath: '/Identity/Account/Register',\r\n IdentityManagePath: '/Identity/Account/Manage'\r\n};\r\n","import { UserManager, WebStorageStateStore } from 'oidc-client';\r\nimport { ApplicationPaths, ApplicationName } from './ApiAuthorizationConstants';\r\n\r\nexport class AuthorizeService {\r\n _callbacks = [];\r\n _nextSubscriptionId = 0;\r\n _user = null;\r\n _isAuthenticated = false;\r\n\r\n // By default pop ups are disabled because they don't work properly on Edge.\r\n // If you want to enable pop up authentication simply set this flag to false.\r\n _popUpDisabled = true;\r\n\r\n async isAuthenticated() {\r\n const user = await this.getUser();\r\n return !!user;\r\n }\r\n\r\n async getUser() {\r\n if (this._user && this._user.profile) {\r\n return this._user.profile;\r\n }\r\n\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.getUser();\r\n return user && user.profile;\r\n }\r\n\r\n async getAccessToken() {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.getUser();\r\n return user && user.access_token;\r\n }\r\n\r\n // We try to authenticate the user in three different ways:\r\n // 1) We try to see if we can authenticate the user silently. This happens\r\n // when the user is already logged in on the IdP and is done using a hidden iframe\r\n // on the client.\r\n // 2) We try to authenticate the user using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 3) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\r\n // redirect flow.\r\n async signIn(state) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const silentUser = await this.userManager.signinSilent(this.createArguments());\r\n this.updateState(silentUser);\r\n return this.success(state);\r\n } catch (silentError) {\r\n // User might not be authenticated, fallback to popup authentication\r\n console.log(\"Silent authentication error: \", silentError);\r\n\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\r\n }\r\n\r\n const popUpUser = await this.userManager.signinPopup(this.createArguments());\r\n this.updateState(popUpUser);\r\n return this.success(state);\r\n } catch (popUpError) {\r\n if (popUpError.message === \"Popup window closed\") {\r\n // The user explicitly cancelled the login action by closing an opened popup.\r\n return this.error(\"The user closed the window.\");\r\n } else if (!this._popUpDisabled) {\r\n console.log(\"Popup authentication error: \", popUpError);\r\n }\r\n\r\n // PopUps might be blocked by the user, fallback to redirect\r\n try {\r\n await this.userManager.signinRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectError) {\r\n console.log(\"Redirect authentication error: \", redirectError);\r\n return this.error(redirectError);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async completeSignIn(url) {\r\n try {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.signinCallback(url);\r\n this.updateState(user);\r\n return this.success(user && user.state);\r\n } catch (error) {\r\n console.log('There was an error signing in: ', error);\r\n return this.error('There was an error signing in.');\r\n }\r\n }\r\n\r\n // We try to sign out the user in two different ways:\r\n // 1) We try to do a sign-out using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 2) If the method above fails, we redirect the browser to the IdP to perform a traditional\r\n // post logout redirect flow.\r\n async signOut(state) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\r\n }\r\n\r\n await this.userManager.signoutPopup(this.createArguments());\r\n this.updateState(undefined);\r\n return this.success(state);\r\n } catch (popupSignOutError) {\r\n console.log(\"Popup signout error: \", popupSignOutError);\r\n try {\r\n await this.userManager.signoutRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectSignOutError) {\r\n console.log(\"Redirect signout error: \", redirectSignOutError);\r\n return this.error(redirectSignOutError);\r\n }\r\n }\r\n }\r\n\r\n async completeSignOut(url) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const response = await this.userManager.signoutCallback(url);\r\n this.updateState(null);\r\n return this.success(response && response.data);\r\n } catch (error) {\r\n console.log(`There was an error trying to log out '${error}'.`);\r\n return this.error(error);\r\n }\r\n }\r\n\r\n updateState(user) {\r\n this._user = user;\r\n this._isAuthenticated = !!this._user;\r\n this.notifySubscribers();\r\n }\r\n\r\n subscribe(callback) {\r\n this._callbacks.push({ callback, subscription: this._nextSubscriptionId++ });\r\n return this._nextSubscriptionId - 1;\r\n }\r\n\r\n unsubscribe(subscriptionId) {\r\n const subscriptionIndex = this._callbacks\r\n .map((element, index) => element.subscription === subscriptionId ? { found: true, index } : { found: false })\r\n .filter(element => element.found === true);\r\n if (subscriptionIndex.length !== 1) {\r\n throw new Error(`Found an invalid number of subscriptions ${subscriptionIndex.length}`);\r\n }\r\n\r\n this._callbacks.splice(subscriptionIndex[0].index, 1);\r\n }\r\n\r\n notifySubscribers() {\r\n for (let i = 0; i < this._callbacks.length; i++) {\r\n const callback = this._callbacks[i].callback;\r\n callback();\r\n }\r\n }\r\n\r\n createArguments(state) {\r\n return { useReplaceToNavigate: true, data: state };\r\n }\r\n\r\n error(message) {\r\n return { status: AuthenticationResultStatus.Fail, message };\r\n }\r\n\r\n success(state) {\r\n return { status: AuthenticationResultStatus.Success, state };\r\n }\r\n\r\n redirect() {\r\n return { status: AuthenticationResultStatus.Redirect };\r\n }\r\n\r\n async ensureUserManagerInitialized() {\r\n if (this.userManager !== undefined) {\r\n return;\r\n }\r\n\r\n let response = await fetch(ApplicationPaths.ApiAuthorizationClientConfigurationUrl);\r\n if (!response.ok) {\r\n throw new Error(`Could not load settings for '${ApplicationName}'`);\r\n }\r\n\r\n let settings = await response.json();\r\n settings.automaticSilentRenew = true;\r\n settings.includeIdTokenInSilentRenew = true;\r\n settings.userStore = new WebStorageStateStore({\r\n prefix: ApplicationName\r\n });\r\n\r\n this.userManager = new UserManager(settings);\r\n\r\n this.userManager.events.addUserSignedOut(async () => {\r\n await this.userManager.removeUser();\r\n this.updateState(undefined);\r\n });\r\n }\r\n\r\n static get instance() { return authService }\r\n}\r\n\r\nconst authService = new AuthorizeService();\r\n\r\nexport default authService;\r\n\r\nexport const AuthenticationResultStatus = {\r\n Redirect: 'redirect',\r\n Success: 'success',\r\n Fail: 'fail'\r\n};\r\n","import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport React, { Component, Fragment } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { DropdownItem, DropdownMenu, DropdownToggle, NavItem, NavLink, UncontrolledButtonDropdown } from 'reactstrap';\r\nimport { ApplicationPaths } from './ApiAuthorizationConstants';\r\nimport authService from './AuthorizeService';\r\n//import { Offline, Online } from 'react-detect-offline';\r\nimport 'devextreme/dist/css/dx.common.css';\r\nimport 'devextreme/dist/css/dx.light.css';\r\n\r\n\r\nexport class LoginMenu extends Component {\r\n\r\n \r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isAuthenticated: false,\r\n userName: null,\r\n menuClassName: 'dx-menu-item dx-menu-item-text'\r\n };\r\n console.log(\"this.state: \", this.state);\r\n }\r\n\r\n componentDidMount() {\r\n this._subscription = authService.subscribe(() => this.populateState());\r\n this.populateState();\r\n }\r\n\r\n componentWillUnmount() {\r\n authService.unsubscribe(this._subscription);\r\n }\r\n\r\n async populateState() {\r\n const [isAuthenticated, user] = await Promise.all([authService.isAuthenticated(), authService.getUser()])\r\n this.setState({\r\n isAuthenticated,\r\n userName: user && user.name\r\n });\r\n }\r\n\r\n render() {\r\n const { isAuthenticated, userName } = this.state;\r\n if (!isAuthenticated) {\r\n const registerPath = `${ApplicationPaths.Register}`;\r\n const loginPath = `${ApplicationPaths.Login}`;\r\n return this.anonymousView(registerPath, loginPath);\r\n } else {\r\n const profilePath = `${ApplicationPaths.Profile}`;\r\n const logoutPath = { pathname: `${ApplicationPaths.LogOut}`, state: { local: true } };\r\n return this.authenticatedView(userName, profilePath, logoutPath);\r\n }\r\n\r\n }\r\n\r\n \r\n authenticatedView(userName, profilePath, logoutPath) {\r\n return (\r\n \r\n Study Setup\r\n \r\n \r\n Asset Entry\r\n \r\n \r\n \r\n Structures & Rooms\r\n \r\n \r\n Study Structures\r\n Study Rooms\r\n \r\n \r\n \r\n \r\n Asset Summaries\r\n \r\n \r\n Asset Summary For Export\r\n Asset Summary Drill Down\r\n All Assets\r\n Bulk Assets Editor\r\n \r\n \r\n \r\n \r\n Lookups\r\n \r\n \r\n Asset Coding Class\r\n Asset Group\r\n Asset Service Life\r\n Asset Type\r\n Room Type\r\n Structure/Location Type\r\n Unit Of Measure\r\n Inflation\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n Analytics\r\n \r\n \r\n Analytics Dashboard\r\n Activity Log\r\n \r\n \r\n \r\n Profile\r\n \r\n \r\n Logout\r\n \r\n
);\r\n\r\n }\r\n\r\n anonymousView(registerPath, loginPath) {\r\n return (\r\n \r\n Login\r\n \r\n );\r\n }\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n\tCollapse,\r\n\tContainer,\r\n\tNavItem,\r\n\tNavLink,\r\n\tNavbar,\r\n\tNavbarToggler\r\n} from \"reactstrap\";\r\nimport \"./NavMenu.css\";\r\nimport { LoginMenu } from \"./api-authorization/LoginMenu\";\r\n\r\nexport const NavMenu = () => {\r\n const [currentStudyName, setCurrentStudyName] = useState(\"\");\r\n const [collapsed, setCollapsed] = useState(true);\r\n\r\n useEffect(() => {\r\n fetch(\"/api/studycontext/\", {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then((result) => {\r\n return result.json();\r\n })\r\n .then((json) => {\r\n var currentStudyName = json.name;\r\n setCurrentStudyName(currentStudyName);\r\n })\r\n .catch((e) => console.log(\"errors\", e));\r\n }, []);\r\n\r\n const toggleNavbar = () => {\r\n setCollapsed((isCollapsed) => !isCollapsed);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n
{currentStudyName}
\r\n \r\n \r\n
    \r\n \r\n \r\n Home\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n );\r\n};\r\n","import React, { Component } from 'react';\r\nimport { Container } from 'reactstrap';\r\nimport { NavMenu } from './NavMenu';\r\n\r\nexport class Layout extends Component {\r\n static displayName = Layout.name;\r\n\r\n render () {\r\n return (\r\n
\r\n \r\n \r\n {this.props.children}\r\n \r\n
\r\n );\r\n }\r\n}\r\n","export const WEEKEND_FILTER = {\r\n\ttext: \"Weekends\",\r\n\tvalue: \"weekends\",\r\n}","\r\nimport { dxDataGridColumn } from \"devextreme/ui/data_grid\";\r\nimport { WEEKEND_FILTER } from \"../constants/weekendFilter\";\r\nimport { Asset } from \"../types/asset\";\r\n\r\nexport function calculateWeekendFilterExpression (this: dxDataGridColumn,\r\n value: string,\r\n selectedFilterOperations: string | null,\r\n target: string\r\n) {\r\n const dataField = this.dataField as keyof Asset\r\n\r\n const dayOfTheWeek = (rowData: Asset) =>{\r\n const fieldValue = rowData[dataField]\r\n\r\n const isValidDateParam = typeof value === \"number\" || typeof value === \"string\"\r\n\r\n if(isValidDateParam){\r\n const date = new Date(fieldValue as string | number)\r\n\r\n const isValidDate = !isNaN(date.valueOf())\r\n\r\n if(isValidDate){\r\n return date.getDay()\r\n }\r\n }\r\n } \r\n\r\n if (dataField && target === \"headerFilter\" && value === WEEKEND_FILTER.value) {\r\n return [[dayOfTheWeek, \"=\", 0], \"or\", [dayOfTheWeek, \"=\", 6]];\r\n }\r\n};\r\n\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { Asset } from \"../types/asset\";\r\n\r\nconst KEY_VALUE: keyof Asset = \"id\";\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nexport const ALL_ASSETS_URL = \"/api/allassets/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nexport const allAssetsStore = new CustomStore({\r\n loadMode: \"raw\",\r\n key: KEY_VALUE,\r\n load: async () =>\r\n await fetch(ALL_ASSETS_URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${token}`,\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json())\r\n});\r\n","import { exportDataGrid } from \"devextreme/excel_exporter\";\r\nimport dxDataGrid from \"devextreme/ui/data_grid\";\r\nimport { Workbook } from \"exceljs\";\r\nimport saveAs from \"file-saver\";\r\nimport { markAssetsAsExportedAsync } from \"../api/markAssetsAsExportedAsync\";\r\nimport { Asset } from \"../types/asset\";\r\n\r\nexport const exportAssetGridAsync = async(e: { component?: dxDataGrid; cancel?: boolean }, exportFileName: string) => {\r\n e.component?.beginUpdate();\r\n const workbook = new Workbook();\r\n const worksheet = workbook.addWorksheet(\"Study Data\");\r\n \r\n const exportedAssetIds: number[] = [];\r\n\r\n exportDataGrid({\r\n component: e.component,\r\n worksheet: worksheet,\r\n customizeCell: ({ gridCell, excelCell }) => {\r\n var e = gridCell;\r\n if (!e) {\r\n return;\r\n }\r\n\r\n const assetData = e.data as Asset\r\n\r\n if (assetData && !exportedAssetIds.includes(assetData.id)) {\r\n exportedAssetIds.push(assetData.id);\r\n }\r\n\r\n if (\r\n e.rowType === \"data\" &&\r\n e.column?.dataField === \"isLeased\"\r\n ) {\r\n if (e.value === \"true\") {\r\n excelCell.value = \"Y\";\r\n } else {\r\n excelCell.value = \"\";\r\n }\r\n }\r\n },\r\n })\r\n .then(function () {\r\n workbook.xlsx.writeBuffer().then(function (buffer) {\r\n saveAs(\r\n new Blob([buffer], {\r\n type: \"application/octet-stream\",\r\n }),\r\n exportFileName + \".xlsx\"\r\n );\r\n });\r\n })\r\n .then(async()=> {\r\n await markAssetsAsExportedAsync(exportedAssetIds)\r\n \r\n e.component?.endUpdate();\r\n });\r\n\r\n e.cancel = true;\r\n};","import { ALL_ASSETS_URL } from \"../stores/allAssetsStore\";\r\n\r\n\r\nexport const markAssetsAsExportedAsync = async (\r\n assetIds: number[]\r\n) => {\r\n var jsonString = JSON.stringify(assetIds);\r\n return await fetch(ALL_ASSETS_URL + \"markasexported\", {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then((result) => {\r\n if (result.status >= 200 && result.status < 300) {\r\n // @ts-ignore \r\n window.location.reload(true);\r\n }\r\n return result;\r\n })\r\n .catch((error) => {\r\n alert(\"Exported Time Update Failed\");\r\n console.error(\"Error:\", error);\r\n });\r\n}","import { WEEKEND_FILTER } from \"../constants/weekendFilter\";\r\n\r\ntype HeaderFilterData = {\r\n dataSource: {\r\n postProcess: (\r\n results: Array<{ text: string; value: string }>\r\n ) => Array<{ text: string; value: string }>;\r\n };\r\n}\r\n\r\nexport const orderWeekendHeaderFilter = (data: HeaderFilterData) => {\r\n data.dataSource.postProcess = (results) => [\r\n ...results,\r\n WEEKEND_FILTER,\r\n ];\r\n};","import React, { useEffect } from \"react\";\r\n\r\nimport DataGrid, {\r\n Column,\r\n Export,\r\n FilterPanel,\r\n HeaderFilter,\r\n Pager,\r\n Scrolling,\r\n SearchPanel,\r\n Selection,\r\n} from \"devextreme-react/data-grid\";\r\n\r\nimport dxDataGrid from \"devextreme/ui/data_grid\";\r\n\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport { calculateWeekendFilterExpression } from \"../datagrid helpers/calculateWeekendFilterExpression\";\r\nimport { exportAssetGridAsync } from \"../datagrid helpers/exportAssetGridAsync\";\r\nimport { orderWeekendHeaderFilter } from \"../datagrid helpers/orderWeekendHeaderFilter\";\r\nimport { allAssetsStore } from \"../stores/allAssetsStore\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\n\r\n\r\nconst AllAssets = () => {\r\n\r\n const onExporting = async(e: { component?: dxDataGrid; cancel?: boolean }) => await exportAssetGridAsync(e, \"AllAssets\")\r\n\r\n //The below method ensures that the grid re-loads each time the user visits the 'All Assets' screen.\r\n useEffect(()=>{\r\n gridDataSource.reload()\r\n },[]) \r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = new DataSource({\r\n store: allAssetsStore,\r\n})\r\n\r\nexport default AllAssets;\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { Asset } from \"../types/asset\";\r\n\r\nconst KEY_VALUE: keyof Asset = \"id\";\r\n\r\ntype KeyType = Asset[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nexport const ASSETS_URL = '/api/assets/';\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? ASSETS_URL + key : ASSETS_URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const assetStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(ASSETS_URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json())\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(ASSETS_URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(ASSETS_URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n } \r\n});\r\n","import React, { useEffect } from \"react\";\r\n\r\nimport DataGrid, {\r\n Column,\r\n Export,\r\n FilterPanel,\r\n HeaderFilter,\r\n Pager,\r\n Scrolling,\r\n SearchPanel,\r\n Selection,\r\n} from \"devextreme-react/data-grid\";\r\n\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport dxDataGrid from \"devextreme/ui/data_grid\";\r\nimport { calculateWeekendFilterExpression } from \"../datagrid helpers/calculateWeekendFilterExpression\";\r\nimport { exportAssetGridAsync } from \"../datagrid helpers/exportAssetGridAsync\";\r\nimport { orderWeekendHeaderFilter } from \"../datagrid helpers/orderWeekendHeaderFilter\";\r\nimport { assetStore } from \"../stores/assetStore\";\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst AssetSummary = () => {\r\n const onExporting = async (e: {\r\n component?: dxDataGrid;\r\n cancel?: boolean;\r\n }) => await exportAssetGridAsync(e, \"CRSExport\");\r\n\r\n //The below method ensures that the grid re-loads each time the user visits the 'Asset Summary for Export' screen.\r\n useEffect(()=>{\r\n gridDataSource.reload()\r\n },[])\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = new DataSource({\r\n store: assetStore,\r\n})\r\n\r\nexport default AssetSummary;\r\n","import notify from \"devextreme/ui/notify\";\r\nimport { ASSETS_URL } from \"../stores/assetStore\";\r\nimport { GenerateNewAssetIdParams } from \"../types/generateNewAssetIdParams\";\r\n\r\nconst handleResponse = async (response: Response) => {\r\n if (!response.ok)\r\n throw Error(\r\n response.status === 400\r\n ? await response.text()\r\n : \"An error occured while generating the new asset id.\"\r\n );\r\n return response;\r\n};\r\n\r\nexport const generateNewAssetIdAsync = async (\r\n params: GenerateNewAssetIdParams\r\n) => {\r\n var jsonString = JSON.stringify(params);\r\n return await fetch(ASSETS_URL + \"generatenewassetid\", {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then(handleResponse)\r\n .then((response) => response.text())\r\n .catch((err) => {\r\n notify(\r\n {\r\n message: err.message,\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"error\",\r\n 5000\r\n );\r\n });\r\n};\r\n","import { Asset } from \"../types/asset\";\r\nimport { createDataFields } from \"../utility functions/createDataFields\";\r\n\r\nexport const ASSET_DATA_FIELDS = createDataFields()({\r\n ID: \"id\",\r\n STRUCTURE_LOCATION_NAME: \"structureLocationName\",\r\n ROOM_AREA_NAME: \"roomAreaName\",\r\n STUDY_ROOM_ID: \"studyRoomId\",\r\n ASSET_CODING_CLASS: \"assetCodingClassId\",\r\n ASSET_TYPE_ID: \"assetTypeId\",\r\n STUDY_STRUCTURE_ID: \"studyStructureId\",\r\n IS_LEASED: \"isLeased\",\r\n ASSET_SUB_TYPE_NAME: \"assetSubTypeName\",\r\n ASSET_MANUFACTURER_NAME: \"assetManufacturerName\",\r\n DESCRIPTION: \"description\",\r\n ASSET_MODEL_NAME: \"assetModelName\",\r\n ASSET_ID: \"assetId\",\r\n IS_LEGACY_LEASE: \"isLegacyLease\",\r\n QTY: \"qty\",\r\n UNIT_OF_MEASURE_ID: \"unitOfMeasureId\",\r\n YEAR_INSTALLED: \"yearInstalled\",\r\n ASSET_SERVICE_LIFE_ID: \"assetServiceLifeId\",\r\n ASSET_LIFE_CYCLE: \"assetLifeCycle\",\r\n UNIT_REPLACEMENT_VALUE: \"unitReplacementValue\",\r\n AGGREGATE_REPLACEMENT_VALUE: \"aggregateReplacementValue\",\r\n INITIAL_RY_AUTO: \"initialRYAuto\",\r\n INITIAL_RY_MANUAL: \"initialRYManual\",\r\n LAST_RY_CYCLE: \"lastRYCycle\",\r\n LEDGER_ID: \"ledgerId\",\r\n NOTES: \"notes\",\r\n\r\n //New Lease Properties\r\n LEASE_START: \"leaseStart\",\r\n LEASE_END: \"leaseEnd\",\r\n LEASE_DOLLAR_BUYOUT_AMOUNT: \"leaseDollarBuyoutAmount\",\r\n LEASE_MONTHLY_PAYMENT: \"leaseMonthlyPayment\",\r\n LEASE_TERM: \"leaseTerm\",\r\n LEASE_TOTAL_PAYMENT: \"leaseTotalPayment\",\r\n LEASE_YEARLY_PAYMENT: \"leaseYearlyPayment\"\r\n})","export const FORMAT = {\r\n THOUSANDS_AND_DECIMAL: \"#,##0.##\",\r\n WHOLE_NUMBER: \"#\",\r\n PERCENT: {\r\n SINGLE_DECIMAL: \"#0.0%\",\r\n TWO_DECIMALS: \"#0.00%\"\r\n }\r\n}","export const LEASE_TERM_PARAMS = {\r\n MIN: 1,\r\n MAX: 120\r\n}","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { AssetCodingClass } from \"../types/assetCodingClass\";\r\n\r\nconst KEY_VALUE: keyof AssetCodingClass = \"id\";\r\n\r\ntype KeyType = AssetCodingClass[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = \"/api/assetcodingclasses/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const assetCodingClassStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json())\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n } \r\n});\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { AssetServiceLife } from \"../types/assetServiceLife\";\r\n\r\nconst KEY_VALUE: keyof AssetServiceLife = \"id\";\r\n\r\ntype KeyType = AssetServiceLife[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = '/api/assetentryservicelives/';\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const assetEntryServiceLifeStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n});\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { AssetType } from \"../types/assetType\";\r\n\r\nconst KEY_VALUE: keyof AssetType = \"id\";\r\n\r\ntype KeyType = AssetType[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = \"/api/assettypes/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const assetTypeStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json())\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n } \r\n});\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { StudyRoom } from \"../types/studyRoom\";\r\n\r\nconst KEY_VALUE: keyof StudyRoom = \"id\";\r\n\r\ntype KeyType = StudyRoom[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = \"/api/studyrooms/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const studyRoomStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json());\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n } \r\n});\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { StudyStructure } from \"../types/studyStructure\";\r\n\r\nconst KEY_VALUE: keyof StudyStructure = \"id\";\r\n\r\ntype KeyType = StudyStructure[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = \"/api/studystructures/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const studyStructureStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json());\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => \r\n {await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n }\r\n});\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { UnitOfMeasure } from \"../types/unitOfMeasure\";\r\n\r\nconst KEY_VALUE: keyof UnitOfMeasure = \"id\";\r\n\r\ntype KeyType = UnitOfMeasure[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = \"/api/unitofmeasures/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const unitOfMeasureStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json())\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n } \r\n});\r\n","export const calculateAggregateReplacementValue = (unitReplacementCost?: number | null, qty?: number | null) => unitReplacementCost !== undefined && unitReplacementCost !== null && qty !== undefined && qty !== null ? unitReplacementCost * qty : null","\r\nfunction addMonthsToDateUtc(fromDate: Date, monthsToAdd: number) {\r\n\tconst copyDate = new Date(fromDate);\r\n\r\n\tconst copyDateMonth = copyDate.getUTCMonth()\r\n\r\n\tcopyDate.setUTCMonth(copyDateMonth + monthsToAdd + 1, 0);\r\n\treturn copyDate;\r\n}\r\n\r\nexport const calculateLeaseEndValue = (leaseStart?: Date | null, leaseTerm?: number | null) => {\r\n return leaseStart && leaseTerm ? addMonthsToDateUtc(leaseStart, leaseTerm) : null\r\n}","export const calculateLeaseTotalPayment = (leaseMonthlyPayment?: number | null, leaseTerm?: number | null) => leaseMonthlyPayment && leaseTerm ? leaseMonthlyPayment * leaseTerm : null","export const calculateLeaseYearlyPayment = (leaseMonthlyPayment?: number | null) => leaseMonthlyPayment ? leaseMonthlyPayment * 12 : null","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { Tooltip } from \"devextreme-react\";\r\nimport { positionConfig } from \"devextreme/animation/position\";\r\nimport React from \"react\";\r\n\r\ninterface DollarBuyoutInfoProps {\r\n iconClassName?: string;\r\n toolTipPosition:\r\n | \"top\"\r\n | \"left\"\r\n | \"right\"\r\n | \"bottom\"\r\n | positionConfig\r\n | undefined;\r\n toolTipWidth?: number;\r\n}\r\n\r\nexport const DollarBuyoutInfo = ({\r\n iconClassName,\r\n toolTipPosition,\r\n toolTipWidth = 400,\r\n}: DollarBuyoutInfoProps) => {\r\n const renderToolTipContent = () => {\r\n return (\r\n
\r\n If a value is entered for the Dollar Buyout Amount, the study will\r\n include only one lease term and the dollar buyout amount will be\r\n applied at the end of that lease term. If no value is entered\r\n the study will show subsequent lease terms up to the 20 year\r\n lookout.\r\n
\r\n );\r\n };\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\nimport { CheckBox } from \"devextreme-react\";\r\nimport DataGrid, {\r\n Column,\r\n ColumnFixing,\r\n Editing,\r\n Form,\r\n FormItem,\r\n Grouping,\r\n HeaderFilter,\r\n IFormItemProps,\r\n Lookup,\r\n Pager,\r\n Paging,\r\n Popup,\r\n RangeRule,\r\n RequiredRule,\r\n SearchPanel\r\n} from \"devextreme-react/data-grid\";\r\nimport { GroupItem, Item, SimpleItem } from \"devextreme-react/form\";\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport { generateNewAssetIdAsync } from \"../api/generateNewAssetIdAsync\";\r\nimport { ASSET_DATA_FIELDS } from \"../constants/assetDataFIelds\";\r\nimport { FORMAT } from \"../constants/format\";\r\nimport { LEASE_TERM_PARAMS } from \"../constants/leaseTermParams\";\r\nimport { assetCodingClassStore } from \"../stores/assetCodingClassStore\";\r\nimport { assetEntryServiceLifeStore } from \"../stores/assetEntryServiceLivesStore\";\r\nimport { assetStore } from \"../stores/assetStore\";\r\nimport { assetTypeStore } from \"../stores/assetTypeStore\";\r\nimport { studyRoomStore } from \"../stores/studyRoomStore\";\r\nimport { studyStructureStore } from \"../stores/studyStructureStore\";\r\nimport { unitOfMeasureStore } from \"../stores/unitOfMeasureStore\";\r\nimport { EditorPreparingEventInternal } from \"../types/editorPreparingEventInternal\";\r\nimport { NullableAsset } from \"../types/nullableAsset\";\r\nimport { calculateAggregateReplacementValue } from \"../utility functions/calculateAggregateReplacementValue\";\r\nimport { calculateLeaseEndValue } from \"../utility functions/calculateLeaseEndValue\";\r\nimport { calculateLeaseTotalPayment } from \"../utility functions/calculateLeaseTotalPayment\";\r\nimport { calculateLeaseYearlyPayment } from \"../utility functions/calculateLeaseYearlyPayment\";\r\nimport { DollarBuyoutInfo } from \"./DollarBuyoutInfo\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\nconst defaultPageSize = 10;\r\n\r\nconst NEW_LEASE_FORM_ITEMS = \"newLeaseFormItems\";\r\nconst LEGACY_LEASE_INFO_TEXT_ITEM = \"legacyLeaseInfoText\";\r\nconst GROUP_FORM_ITEM_TYPE = \"group\";\r\n\r\nconst ONE_CENT = 0.01;\r\n\r\nconst thousandsAndDecimalEditorOptions = {\r\n format: FORMAT.THOUSANDS_AND_DECIMAL,\r\n};\r\nconst wholeNumberEditorOptions = { format: FORMAT.WHOLE_NUMBER };\r\n\r\nconst DOLLAR_BUYOUT_TOTAL_COLUMNS = 40;\r\nconst DOLLAR_BUYOUT_ICON_COLUMN_SPAN = 1;\r\n\r\ninterface AssetCodingClassEditorState {\r\n initialAssetIdValue: string | null | undefined\r\n initialCodingClassIdValue: number | null | undefined\r\n};\r\n\r\nconst INITIAL_ASSET_ID_EDITOR_STATE: AssetCodingClassEditorState = {\r\n initialAssetIdValue: null,\r\n initialCodingClassIdValue: null,\r\n};\r\n\r\nconst AssetSummaryDrillDown = () => {\r\n const dataGrid = useRef(null);\r\n const [autoExpandAll, setAutoExpandAll] = useState(false);\r\n const [assetIdEditorState, setAssetIdEditorState] =\r\n useState(INITIAL_ASSET_ID_EDITOR_STATE);\r\n\r\n const onAutoExpandAllChanged = () => {\r\n setAutoExpandAll((isExpanded) => !isExpanded);\r\n };\r\n\r\n const handleAssetCodingClassChangeAsync = async (\r\n newValue: number,\r\n id: number | null | undefined\r\n ) =>\r\n await generateNewAssetIdAsync({\r\n assetCodingClassId: newValue,\r\n idOfExistingAsset: id,\r\n })\r\n\r\n const onEditorPreparing = async (\r\n e: EditorPreparingEventInternal\r\n ) => {\r\n const rowIndex = e.row?.rowIndex;\r\n if (e.parentType === \"dataRow\") {\r\n if (\r\n e.dataField === ASSET_DATA_FIELDS.STUDY_ROOM_ID &&\r\n e.editorOptions\r\n ) {\r\n const isStructureNotSet =\r\n e.row?.data?.studyStructureId === undefined;\r\n\r\n e.editorOptions.disabled = isStructureNotSet;\r\n }\r\n\r\n if (\r\n e.dataField === ASSET_DATA_FIELDS.ASSET_CODING_CLASS &&\r\n e.editorOptions\r\n ) {\r\n const id = e.row?.data?.id;\r\n const defaultValueChangeHandler =\r\n e.editorOptions.onValueChanged;\r\n\r\n e.editorOptions.onValueChanged = async function (e: {\r\n value: number | null | undefined;\r\n }) {\r\n defaultValueChangeHandler(e);\r\n const newValue = e.value;\r\n let newAssetIdValue: string | null | undefined;\r\n if (!newValue) {\r\n newAssetIdValue = null;\r\n } else {\r\n if (\r\n newValue ===\r\n assetIdEditorState.initialCodingClassIdValue\r\n ) {\r\n newAssetIdValue = assetIdEditorState.initialAssetIdValue\r\n } else {\r\n const generatedAssetId =\r\n await handleAssetCodingClassChangeAsync(\r\n newValue,\r\n id\r\n );\r\n \r\n newAssetIdValue = generatedAssetId || assetIdEditorState.initialAssetIdValue\r\n }\r\n }\r\n\r\n dataGrid.current?.instance.cellValue(\r\n rowIndex || 0,\r\n ASSET_DATA_FIELDS.ASSET_ID,\r\n newAssetIdValue\r\n );\r\n };\r\n }\r\n }\r\n };\r\n\r\n const getFilteredRooms = (options: { data: NullableAsset }) => {\r\n return {\r\n store: studyRoomStore,\r\n filter: options.data\r\n ? [\r\n ASSET_DATA_FIELDS.STUDY_STRUCTURE_ID,\r\n \"=\",\r\n options.data.studyStructureId,\r\n ]\r\n : null,\r\n };\r\n };\r\n\r\n const setStructureValue = (rowData: NullableAsset, value: number) => {\r\n rowData.studyRoomId = null;\r\n rowData.studyStructureId = value;\r\n };\r\n\r\n const setUnitReplacmentCellValue = (\r\n rowData: NullableAsset,\r\n value: number,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.aggregateReplacementValue = calculateAggregateReplacementValue(\r\n currentData.qty,\r\n value\r\n );\r\n rowData.unitReplacementValue = value;\r\n };\r\n\r\n const setQtyCellValue = (\r\n rowData: NullableAsset,\r\n value: number,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.aggregateReplacementValue = calculateAggregateReplacementValue(\r\n value,\r\n currentData.unitReplacementValue\r\n );\r\n rowData.qty = value;\r\n };\r\n\r\n const setLeaseStatusValue = (newData: NullableAsset, value: boolean) => {\r\n newData.isLeased = value;\r\n };\r\n\r\n const isNewLeasedFormItem = (item: IFormItemProps): boolean => {\r\n return (\r\n item &&\r\n item.itemType === GROUP_FORM_ITEM_TYPE &&\r\n item.name === NEW_LEASE_FORM_ITEMS\r\n );\r\n };\r\n\r\n const isLegacyLeasedOrStandardFormItem = (\r\n item: IFormItemProps\r\n ): boolean => {\r\n return (\r\n item &&\r\n (item.dataField === ASSET_DATA_FIELDS.YEAR_INSTALLED ||\r\n item.dataField === ASSET_DATA_FIELDS.INITIAL_RY_AUTO ||\r\n item.dataField === ASSET_DATA_FIELDS.INITIAL_RY_MANUAL ||\r\n item.dataField === ASSET_DATA_FIELDS.LAST_RY_CYCLE ||\r\n item.dataField === ASSET_DATA_FIELDS.UNIT_REPLACEMENT_VALUE ||\r\n item.dataField ===\r\n ASSET_DATA_FIELDS.AGGREGATE_REPLACEMENT_VALUE)\r\n );\r\n };\r\n\r\n const isLegacyLeasedOnlyFormItem = (item: IFormItemProps): boolean =>\r\n item && item.name === LEGACY_LEASE_INFO_TEXT_ITEM;\r\n\r\n const customizeItem = useCallback((item: IFormItemProps) => {\r\n const newLeasedFormItem = isNewLeasedFormItem(item);\r\n const legacyLeasedOrStandardFormItem =\r\n isLegacyLeasedOrStandardFormItem(item);\r\n const legacyLeaseOnlyFormItem = isLegacyLeasedOnlyFormItem(item);\r\n if (\r\n newLeasedFormItem ||\r\n legacyLeasedOrStandardFormItem ||\r\n legacyLeaseOnlyFormItem\r\n ) {\r\n const dataGridInstance = dataGrid.current!.instance;\r\n const editing = dataGridInstance.option(\"editing\");\r\n const rowIndex = dataGridInstance.getRowIndexByKey(\r\n editing?.editRowKey!\r\n );\r\n const isLeased = dataGridInstance.cellValue(\r\n rowIndex,\r\n ASSET_DATA_FIELDS.IS_LEASED\r\n );\r\n const isLegacyLease = dataGridInstance.cellValue(\r\n rowIndex,\r\n ASSET_DATA_FIELDS.IS_LEGACY_LEASE\r\n );\r\n item.visible =\r\n (isLegacyLease && isLeased && legacyLeaseOnlyFormItem) ||\r\n (newLeasedFormItem && isLeased && !isLegacyLease) ||\r\n (legacyLeasedOrStandardFormItem &&\r\n (isLegacyLease || !isLeased));\r\n }\r\n }, []);\r\n\r\n const setLeaseStartCellValue = (\r\n rowData: NullableAsset,\r\n value: Date | null,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.leaseEnd = calculateLeaseEndValue(value, currentData.leaseTerm);\r\n rowData.leaseStart = value;\r\n };\r\n\r\n const setLeaseTermCellValue = (\r\n rowData: NullableAsset,\r\n value: number | null,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.leaseEnd = calculateLeaseEndValue(\r\n currentData.leaseStart,\r\n value\r\n );\r\n rowData.leaseTotalPayment = calculateLeaseTotalPayment(\r\n currentData.leaseMonthlyPayment,\r\n value\r\n );\r\n rowData.leaseTerm = value || null; //Do not allow zero but default to null.\r\n };\r\n\r\n const setLeaseMonthlyPaymentCellValue = (\r\n rowData: NullableAsset,\r\n value: number | null,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.leaseTotalPayment = calculateLeaseTotalPayment(\r\n value,\r\n currentData.leaseTerm\r\n );\r\n rowData.leaseYearlyPayment = calculateLeaseYearlyPayment(value);\r\n rowData.leaseMonthlyPayment = value || null; //Do not allow zero but default to null.\r\n };\r\n\r\n function setDollarBuyoutCellValue(\r\n rowData: NullableAsset,\r\n value: number | null\r\n ) {\r\n rowData.leaseDollarBuyoutAmount = value || null; //Do not allow zero but default to null.\r\n }\r\n\r\n const onEditingStart = (e: { data?: NullableAsset }) => {\r\n setAssetIdEditorState({\r\n initialAssetIdValue: e.data?.assetId,\r\n initialCodingClassIdValue: e.data?.assetCodingClassId,\r\n });\r\n };\r\n\r\n const onEditCanceled = () => {\r\n setAssetIdEditorState(INITIAL_ASSET_ID_EDITOR_STATE);\r\n };\r\n\r\n //The below method ensures that the grid re-loads each time the user visits the 'Asset Summary Drill Down' screen.\r\n useEffect(()=>{\r\n gridDataSource.reload()\r\n },[])\r\n\r\n const setYearInstalledCellValue = (\r\n rowData: NullableAsset,\r\n value: number | null,\r\n currentData: NullableAsset\r\n ) => {\r\n const assetLifeCycle = currentData.assetLifeCycle\r\n rowData.yearInstalled = value\r\n rowData.initialRYAuto = value && assetLifeCycle ? value + assetLifeCycle : null\r\n };\r\n\r\n const setAssetLifeCycleCellValue = (\r\n rowData: NullableAsset,\r\n value: number | null,\r\n currentData: NullableAsset\r\n ) => {\r\n const yearInstalled = currentData.yearInstalled;\r\n rowData.assetLifeCycle = value\r\n rowData.initialRYAuto = value && yearInstalled ? value + yearInstalled : null\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n The asset being edited is a legacy lease asset\r\n and the new lease form cannot be used.\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n \r\n \r\n
\r\n\r\n \r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = new DataSource({\r\n store: assetStore,\r\n});\r\n\r\nexport default AssetSummaryDrillDown;\r\n","export const YEAR_RANGE = {\r\n MIN: 1900,\r\n MAX: 2099\r\n}","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { AssetServiceLife } from \"../types/assetServiceLife\";\r\n\r\nconst KEY_VALUE: keyof AssetServiceLife = \"id\";\r\n\r\ntype KeyType = AssetServiceLife[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = \"/api/assetservicelives/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const assetServiceLifeStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json())\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n } \r\n});\r\n","import { createStore } from \"devextreme-aspnet-data-nojquery\";\r\nimport { Asset } from \"../types/asset\";\r\n\r\nconst KEY_VALUE: keyof Asset = \"id\";\r\n\r\nconst URL = \"/api/assets/autocomplete\";\r\n\r\nexport const autoAssetStore = createStore({\r\n key: KEY_VALUE,\r\n loadUrl: URL,\r\n});\r\n","import { Asset } from \"../types/asset\";\r\n\r\ntype FilterEqualityRule = \"=\" | \"startswith\";\r\n\r\ntype FilterChainRule = \"and\" | \"or\";\r\n\r\nconst manufacturerValueExpr: keyof Asset = \"assetManufacturerName\";\r\nconst subTypeValueExpr: keyof Asset = \"assetSubTypeName\";\r\nconst descriptionValueExpr: keyof Asset = \"description\"\r\nconst modelNameValueExpr: keyof Asset = \"assetModelName\";\r\n\r\n\r\ntype FilterField =\r\n | typeof manufacturerValueExpr\r\n | typeof subTypeValueExpr\r\n | typeof modelNameValueExpr\r\n | typeof descriptionValueExpr\r\n\r\ntype AssetFilter = [FilterField, FilterEqualityRule, Asset[K]];\r\n\r\ntype FilterCollection = FilterChainRule | AssetFilter;\r\n\r\nconst addFilter = (\r\n currentFilters: FilterCollection[],\r\n field: K,\r\n rule: FilterEqualityRule,\r\n value?: Asset[K]\r\n) => {\r\n if (value) {\r\n if (currentFilters.length > 0) {\r\n currentFilters.push(\"and\");\r\n }\r\n currentFilters.push([field, rule, value]);\r\n }\r\n};\r\n\r\n/*\r\n The purpose of this method is to create conditional filters for assets.\r\n Currently the only allowable filtering is on the fields listed in the \r\n type FilterField above.\r\n*/\r\nexport const getUpdatedAssetFilterValue = (\r\n manufacturerValue?: Asset[typeof manufacturerValueExpr],\r\n subTypeValue?: Asset[typeof subTypeValueExpr],\r\n descriptionValue?: Asset[typeof subTypeValueExpr],\r\n modelNameValue?: Asset[typeof modelNameValueExpr],\r\n) => {\r\n let filter: FilterCollection[] = [];\r\n\r\n addFilter(filter, manufacturerValueExpr, \"=\", manufacturerValue);\r\n addFilter(filter, subTypeValueExpr, \"=\", subTypeValue);\r\n addFilter(filter, descriptionValueExpr, \"=\", descriptionValue);\r\n addFilter(filter, modelNameValueExpr, \"=\", modelNameValue);\r\n\r\n return filter.length > 0 ? filter : null;\r\n};\r\n","import { NumberBox } from \"devextreme-react\";\r\nimport { INumberBoxOptions } from \"devextreme-react/number-box\";\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport React, {\r\n ReactNode,\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from \"react\";\r\nimport { autoAssetStore } from \"../stores/autoAssetStore\";\r\nimport { ValidKey } from \"../types/ValidKey\";\r\nimport { Asset } from \"../types/asset\";\r\nimport { OmitStrict } from \"../types/omitStrict\";\r\nimport { getUpdatedAssetFilterValue } from \"../utility functions/getUpdatedAssetFilter\";\r\n\r\ninterface AssetAutoNumberBoxProps\r\n extends OmitStrict<\r\n INumberBoxOptions,\r\n \"defaultValue\" | \"onValueChanged\" | \"step\"\r\n > {\r\n valueExpr: string & ValidKey;\r\n filterByManufacturerValue?: string;\r\n filterBySubTypeValue?: string;\r\n filterByDescriptionValue?: string;\r\n filterByModelNameValue?: string;\r\n onValueChanged: (newValue?: number) => void;\r\n overrideValue: (newValue?: number) => void;\r\n children: ReactNode;\r\n}\r\n\r\nconst sortByField: keyof Asset = \"dateModified\";\r\n\r\n/*\r\n The purpose of this Component is to AutoPopulate the numberbox based on \r\n other selected values on an Asset. Only when ALL of the values for the \r\n filterBy fields have been selected will the NumberBox update with the\r\n suggested value.\r\n*/\r\nexport const AssetAutoNumberBox = ({\r\n valueExpr,\r\n filterByManufacturerValue,\r\n filterBySubTypeValue,\r\n filterByDescriptionValue,\r\n filterByModelNameValue,\r\n overrideValue,\r\n onValueChanged,\r\n children,\r\n ...rest\r\n}: AssetAutoNumberBoxProps) => {\r\n const [suggestedValue, setSuggestedValue] = useState(\r\n undefined\r\n );\r\n const dataSource = useMemo(\r\n () =>\r\n new DataSource({\r\n store: autoAssetStore,\r\n /*\r\n The select property is not required for this component to function, \r\n however is used to only the object property needed by this component and no other properties.\r\n */\r\n select: valueExpr,\r\n //The sort field is needed in order to only return the moset recent value by dateModified.\r\n sort: [{ selector: sortByField, desc: true }],\r\n //The paginate and pageSize properties make sure that we only return a single record.\r\n paginate: true,\r\n pageSize: 1,\r\n }),\r\n [valueExpr]\r\n );\r\n\r\n const handleFilterValueChanges = useCallback(async () => {\r\n let unitValueToSet: number | null | undefined = null;\r\n\r\n if (\r\n filterByManufacturerValue &&\r\n //filterByDescriptionValue && FilterByDescription is optional and therefore we don't check for a value.\r\n filterByModelNameValue &&\r\n filterBySubTypeValue\r\n ) {\r\n const filter = getUpdatedAssetFilterValue(\r\n filterByManufacturerValue,\r\n filterBySubTypeValue,\r\n filterByDescriptionValue,\r\n filterByModelNameValue\r\n );\r\n\r\n if (filter) {\r\n dataSource.filter(filter);\r\n\r\n const filteredAssets: Array> =\r\n await dataSource.load();\r\n\r\n if (filteredAssets.length > 0) {\r\n unitValueToSet = filteredAssets[0][valueExpr];\r\n }\r\n }\r\n }\r\n\r\n overrideValue(unitValueToSet || undefined);\r\n }, [\r\n dataSource,\r\n filterByDescriptionValue,\r\n filterByManufacturerValue,\r\n filterByModelNameValue,\r\n filterBySubTypeValue,\r\n overrideValue,\r\n valueExpr,\r\n ]);\r\n\r\n /*\r\n The side Effect that should occur is that only when ALL of the filterBy\r\n fields have been selected, the dataSource should return the value\r\n associated with the valueExpr on the Asset and populate the value automatically.\r\n */\r\n useEffect(() => {\r\n handleFilterValueChanges();\r\n }, [handleFilterValueChanges]);\r\n\r\n const handleValueChange = (e: { value?: number }) => {\r\n onValueChanged(e.value);\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import { Autocomplete } from \"devextreme-react\";\r\nimport { IAutocompleteOptions } from \"devextreme-react/autocomplete\";\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport React, { ReactNode, useEffect, useMemo, useRef } from \"react\";\r\nimport { autoAssetStore } from \"../stores/autoAssetStore\";\r\nimport { ValidKey } from \"../types/ValidKey\";\r\nimport { Asset } from \"../types/asset\";\r\nimport { OmitStrict } from \"../types/omitStrict\";\r\nimport { getUpdatedAssetFilterValue } from \"../utility functions/getUpdatedAssetFilter\";\r\n\r\ninterface GroupedAssets {\r\n key: string;\r\n items: Asset[];\r\n}\r\n\r\nconst manufacturerKey: keyof Asset = \"assetManufacturerName\";\r\nconst subTypeKey: keyof Asset = \"assetSubTypeName\";\r\n\r\n/*The props for this component contain a Generic K that is assigned to \r\n valueExpr and is restricted to be a property on an Asset the value for which is a string. \r\n If the valueExpr is 'assetManufacturerName' or 'assetSubTypeName', the associated filterBy \r\n value cannot be set.\r\n*/\r\ninterface AssetAutocompleteProps>\r\n extends OmitStrict<\r\n IAutocompleteOptions,\r\n \"dataSource\" | \"valueExpr\" | \"onValueChanged\"\r\n > {\r\n valueExpr: K;\r\n filterByManufacturerValue?: K extends typeof manufacturerKey\r\n ? never\r\n : string;\r\n filterBysubTypeValue?: K extends typeof subTypeKey ? never : string;\r\n children: ReactNode;\r\n}\r\n\r\n/*\r\n This component is a reusable Autocomplete for Assets that is built on top of\r\n the Devextreme Autocomplete and automatically filters based on other selected \r\n values such as manufacturer and subtype, both of which are optional and if not \r\n passed the AutoComplete will not be filtered by those values.\r\n*/\r\n\r\nexport const AssetAutocomplete = >({\r\n valueExpr,\r\n filterByManufacturerValue,\r\n filterBysubTypeValue,\r\n children,\r\n searchMode = \"contains\", //Optional: defaults to 'startswith'\r\n showClearButton = true, //Optional: defaults to true\r\n minSearchLength = 3, //Optional: defaults to 3\r\n ...rest\r\n}: AssetAutocompleteProps) => {\r\n const dataSource = useMemo(\r\n () =>\r\n new DataSource({\r\n store: autoAssetStore,\r\n /*The select property is not required for this component to function, \r\n however is used to only the object property needed by this component and no other properties.\r\n */\r\n select: valueExpr,\r\n //The group property AND the postprocess property are required in order to only return distinct values.\r\n group: valueExpr,\r\n postProcess: (result: GroupedAssets[]) => {\r\n const keysList =\r\n valueExpr === manufacturerKey\r\n ? result.map((g) =>\r\n g.key\r\n .toLowerCase()\r\n .replace(/(^\\w|\\s\\w)/g, (m) =>\r\n m.toUpperCase()\r\n )\r\n )\r\n : result.map((g) => g.key);\r\n\r\n const uniqueList = [...new Set(keysList)];\r\n\r\n return uniqueList.map((key) => ({ [valueExpr]: key }));\r\n },\r\n }),\r\n [valueExpr]\r\n );\r\n\r\n const autoCompleteRef = useRef(null);\r\n\r\n /*\r\n The Side Effect that needs to happen is that whenever the filterByManufacturerValue\r\n or filterBySubtypeValue changes, the dataSource should reload the filtered values\r\n to be suggested by the autocomplete.\r\n */\r\n useEffect(() => {\r\n const updatedFilterValue = getUpdatedAssetFilterValue(\r\n filterByManufacturerValue,\r\n filterBysubTypeValue\r\n );\r\n\r\n if (updatedFilterValue) {\r\n const currentDataSource =\r\n autoCompleteRef.current?.instance.getDataSource();\r\n if (currentDataSource) {\r\n currentDataSource.filter(updatedFilterValue);\r\n currentDataSource.reload();\r\n }\r\n }\r\n }, [\r\n filterByManufacturerValue,\r\n filterBysubTypeValue,\r\n ]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { Box, Button, List } from \"devextreme-react\";\r\nimport { Item } from \"devextreme-react/box\";\r\nimport React, { useState } from \"react\";\r\nimport { AssetSummary } from \"../types/assetSummary\";\r\nimport \"./summaryPanel.css\";\r\n\r\ninterface AssetEntryPanelSummaryProps {\r\n assetCountThisRoom: number;\r\n dbSyncStatus: string;\r\n assetsThisRoom: AssetSummary[];\r\n unsyncedRoomCount: number;\r\n unsyncedAssetCount: number;\r\n editingItemId: number;\r\n handleDBSyncButtonClicked: () => void;\r\n updateStatesAfterSync: () => void;\r\n editPanelItemClicked: (editId: number) => void;\r\n}\r\n\r\nconst CLASSNAMES = {\r\n PANEL_OPEN: \"panelOpened\",\r\n PANEL_CLOSED: \"panelClosed\",\r\n SHOW: \"showContent\",\r\n HIDE: \"hideContent\",\r\n UNSYNCED: \"unsynced\",\r\n};\r\n\r\nconst SYNC_STATUS = {\r\n NOT_SYNCED: \"NOT SYNCED\",\r\n};\r\n\r\nconst assetListKeyExpr: keyof AssetSummary = \"id\";\r\nconst assetListSearchExpr: (keyof AssetSummary)[] = [\r\n \"name\",\r\n \"description\",\r\n];\r\n\r\nexport const AssetEntryPanelSummary = ({\r\n assetCountThisRoom,\r\n dbSyncStatus,\r\n assetsThisRoom,\r\n unsyncedRoomCount,\r\n unsyncedAssetCount,\r\n editingItemId,\r\n handleDBSyncButtonClicked,\r\n updateStatesAfterSync,\r\n editPanelItemClicked,\r\n}: AssetEntryPanelSummaryProps) => {\r\n const [panelOpen, setPanelOpen] = useState(true);\r\n\r\n const togglePanelOpen = () => {\r\n setPanelOpen((isOpen) => !isOpen);\r\n };\r\n\r\n const PanelItem = (item: AssetSummary) => {\r\n const { id, description, name } = item;\r\n\r\n const descriptionText = description\r\n ? description.length > 20\r\n ? description.slice(0, 20) + \"...\"\r\n : description\r\n : \"empty description\";\r\n\r\n const isUnsyncedItem = id <= 0;\r\n\r\n return (\r\n <>\r\n {name}\r\n {\" - \"+ descriptionText}\r\n {isUnsyncedItem && (\r\n <>\r\n {\" - \"}\r\n {\"UNSYNCED\"}\r\n \r\n )}\r\n {\" - \"}\r\n \r\n \r\n );\r\n };\r\n\r\n const isUnsynced = dbSyncStatus === SYNC_STATUS.NOT_SYNCED;\r\n\r\n const showRefreshButton = assetsThisRoom.some((asset) => asset.id < 0);\r\n\r\n const handlePanelItemClick = (e: { itemData?: AssetSummary }) => {\r\n const id = e.itemData?.id;\r\n if (id) {\r\n editPanelItemClicked(id);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n
\r\n

Room Asset Count: {assetCountThisRoom}

\r\n

\r\n DB Sync Status:{\" \"}\r\n {\r\n \r\n {dbSyncStatus}\r\n \r\n }\r\n

\r\n {isUnsynced ? (\r\n

\r\n Unsynced Rooms:{\" \"}\r\n \r\n {unsyncedRoomCount}\r\n \r\n   Unsynced Assets:{\" \"}\r\n \r\n {unsyncedAssetCount}\r\n \r\n

\r\n ) : (\r\n

No Unsynced Items

\r\n )}\r\n \r\n \r\n \r\n Sync With Database\r\n \r\n \r\n \r\n \r\n Refresh Display\r\n \r\n \r\n \r\n {assetsThisRoom.length > 0 && (\r\n <>\r\n
Assets:
\r\n \r\n \r\n )}\r\n
\r\n \r\n );\r\n};\r\nexport default AssetEntryPanelSummary;\r\n","import React from 'react';\r\n\r\nimport { LoadPanel } from \"devextreme-react\";\r\nimport { Button } from 'devextreme-react/button';\r\nimport Popup from 'devextreme-react/popup';\r\nimport ValidationSummary from 'devextreme-react/validation-summary';\r\nimport notify from 'devextreme/ui/notify';\r\nimport { Container } from 'reactstrap';\r\nimport authService from './api-authorization/AuthorizeService';\r\n\r\nimport { DateBox, Form, ValidationGroup } from 'devextreme-react';\r\nimport { AsyncRule, CustomRule, SimpleItem } from 'devextreme-react/form';\r\nimport { NumberBox } from 'devextreme-react/number-box';\r\nimport TextArea from 'devextreme-react/text-area';\r\nimport TextBox from 'devextreme-react/text-box';\r\n\r\nimport { createStore } from 'devextreme-aspnet-data-nojquery';\r\nimport { CheckBox } from 'devextreme-react/check-box';\r\nimport SelectBox from 'devextreme-react/select-box';\r\nimport CustomStore from 'devextreme/data/custom_store';\r\nimport { all, create } from 'mathjs';\r\n\r\nimport './CRSEntry.css';\r\n\r\nimport { NumericRule, PatternRule, RangeRule, RequiredRule, Validator } from 'devextreme-react/validator';\r\n\r\nimport { FORMAT } from \"../constants/format\";\r\nimport { LEASE_TERM_PARAMS } from '../constants/leaseTermParams';\r\nimport { YEAR_RANGE } from \"../constants/yearRange\";\r\nimport { assetServiceLifeStore } from '../stores/assetServiceLifeStore';\r\nimport { calculateAggregateReplacementValue } from '../utility functions/calculateAggregateReplacementValue';\r\nimport { calculateLeaseEndValue } from '../utility functions/calculateLeaseEndValue';\r\nimport { calculateLeaseTotalPayment } from '../utility functions/calculateLeaseTotalPayment';\r\nimport { calculateLeaseYearlyPayment } from '../utility functions/calculateLeaseYearlyPayment';\r\nimport { AssetAutoNumberBox } from './AssetAutoNumberBox';\r\nimport { AssetAutocomplete } from './AssetAutocomplete';\r\nimport { AssetEntryPanelSummary } from './AssetEntryPanelSummary';\r\nimport { DollarBuyoutInfo } from './DollarBuyoutInfo';\r\n\r\nconst studyStructureLookup = [];\r\nconst studyRoomsLookup = [];\r\nconst studyAssetsLookup = [];\r\nconst assetSubtypeAutocomplete = [];\r\nconst assetManufacturerAutocomplete = [];\r\nconst UnsyncedRooms = [];\r\nconst UnsyncedAssets = [];\r\n\r\n\r\nconst studyRoomTemplate = {\r\n\tstudyStructureId: -1,\r\n\tname: '',\r\n\troomTypeId: -1\r\n};\r\n\r\nconst math = create(all);\r\n\r\nconst DEFAULT_MINIMUM_ASSET_LIFECYCLE = 0;\r\nconst DEFAULT_MAXIMUM_ASSET_LIFECYCLE = 100;\r\n\r\nclass CRSEntry extends React.Component {\r\n\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.topOfForm = React.createRef();\r\n\t\tthis.assetValidationGroup = React.createRef();\r\n\r\n\t\tthis.state = {\r\n\t\t\t//Asset Details\r\n\t\t\tStructureId: \"\",\r\n\t\t\tStudyRoomId: \"\",\r\n\t\t\tAssetCodingClassId: \"\",\r\n\t\t\tAssetTypeId: \"\",\r\n\t\t\tAssetSubTypeName: \"\",\r\n\t\t\tAssetManufacturerName: \"\",\r\n\t\t\tAssetModelName: \"\",\r\n\t\t\tIsLeased: false,\r\n\t\t\tDescription: \"\",\r\n\t\t\tQty: null,\r\n\t\t\tUnitOfMeasureId: \"\",\r\n\t\t\tYearInstalled: null,\r\n\t\t\tAssetServiceLifeID: \"\",\r\n\t\t\tAssetLifeCycle: null,\r\n\t\t\tNotes: \"\",\r\n\t\t\tUnitReplacementValue: null,\r\n\t\t\tAggregateReplacementValue: null,\r\n\t\t\tInitialRYAuto: null,\r\n\t\t\tInitialRYManual: null,\r\n\t\t\tLastRYCycle: null,\r\n\t\t\tLedgerId: undefined,\r\n\r\n\t\t\tNewRoomPopupVisible: false,\r\n\t\t\tNewRoomStructureId: \"\",\r\n\t\t\tNewRoomName: \"\",\r\n\t\t\tNewRoomType: 1,\r\n\t\t\tstudyRoomsLookupFiltered: [],\r\n\t\t\tRoomCount: 0,\r\n\t\t\tAssetCountThisRoom: 0,\r\n\t\t\tDBSyncStatus: \"Synced with Server\",\r\n\t\t\tUnsyncedRoomCount: 0,\r\n\t\t\tUnsyncedAssetCount: 0,\r\n\t\t\tAssetsThisRoom: [],\r\n\t\t\tEditAssetId: 0,\r\n\t\t\tAssetLifeCycleMinimum: 0,\r\n\t\t\tAssetLifeCycleMaximum: 100,\r\n\t\t\toverrideDisabled: false,\r\n\t\t\t\r\n\t\t\t//lease Asset Params\r\n\t\t\tleaseStart: undefined,\r\n\t\t\tleaseTerm: undefined,\r\n\t\t\tleaseEnd: undefined,\r\n\t\t\tleaseDollarBuyoutAmount: undefined,\r\n\t\t\tleaseMonthlyPayment: undefined,\r\n\t\t\tleaseYearlyPayment: undefined,\r\n\t\t\tleaseTotalPayment: undefined,\r\n\t\t\tisLegacyLease: false,\r\n\r\n\t\t\t//Component State\r\n\t\t\tisSaving: false\r\n\t\t};\r\n\r\n\t\tloadStudyStructureLookup();\r\n\t\tloadStudyRoomsLookup();\r\n\t\tloadStudyAssetsLookup();\r\n\t\tthis.studyRoomsLookupFiltered = [];\r\n\t\tthis.assetSubtypeAutocomplete = [];\r\n\t\tthis.assetManufacturerAutocomplete = [];\r\n\r\n\t\tthis.numbersOnlyRule = { 'h': /[0-9]/ };\r\n\r\n\t\tthis.validationRules = {\r\n\t\t\tstructure: [\r\n\t\t\t\t{ type: 'required', message: 'Structure is required.' },\r\n\t\t\t],\r\n\t\t\troom: [\r\n\t\t\t\t{ type: 'required', message: 'Room is required.' }\r\n\t\t\t],\r\n\t\t\tassetSubType: [\r\n\t\t\t\t{ type: 'required', message: 'Asset Subtype is required.' }\r\n\t\t\t]\r\n\t\t};\r\n\r\n\t\tthis.onStructureChanged = this.onStructureChanged.bind(this);\r\n\t\tthis.onRoomChanged = this.onRoomChanged.bind(this);\r\n\t\tthis.onAssetCodingClassChanged = this.onAssetCodingClassChanged.bind(this);\r\n\t\tthis.onAssetTypeChanged = this.onAssetTypeChanged.bind(this);\r\n\t\tthis.onAssetSubtypeChanged = this.onAssetSubtypeChanged.bind(this);\r\n\t\tthis.onAssetManufacturerNameChanged = this.onAssetManufacturerNameChanged.bind(this);\r\n\t\tthis.onAssetModelNameChanged = this.onAssetModelNameChanged.bind(this);\r\n\t\tthis.onAssetLeaseStatusChanged = this.onAssetLeaseStatusChanged.bind(this);\r\n\t\tthis.onAssetDetailDescriptionChanged = this.onAssetDetailDescriptionChanged.bind(this);\r\n\t\tthis.onQuantityChanged = this.onQuantityChanged.bind(this);\r\n\t\tthis.onUomChanged = this.onUomChanged.bind(this);\r\n\t\tthis.onYearInstalledChanged = this.onYearInstalledChanged.bind(this);\r\n\t\tthis.onAssetServiceLifeChanged = this.onAssetServiceLifeChanged.bind(this);\r\n\t\tthis.onAssetLifeCycleChanged = this.onAssetLifeCycleChanged.bind(this);\r\n\t\tthis.onGeneralNotesChanged = this.onGeneralNotesChanged.bind(this);\r\n\t\tthis.onUnitReplacementValueChanged = this.onUnitReplacementValueChanged.bind(this);\r\n\t\tthis.onInitialRYAutoChanged = this.onInitialRYAutoChanged.bind(this);\r\n\t\tthis.onInitialRYManualChanged = this.onInitialRYManualChanged.bind(this);\r\n\t\tthis.onLastRYCycleChanged = this.onLastRYCycleChanged.bind(this);\r\n\t\tthis.onLedgerIdChanged = this.onLedgerIdChanged.bind(this);\r\n\r\n\t\tthis.handleRoomPopupHidden = this.handleRoomPopupHidden.bind(this);\r\n\t\tthis.handleRoomPopupShowing = this.handleRoomPopupShowing.bind(this);\r\n\t\tthis.onNewAssetClick = this.onNewAssetClick.bind(this);\r\n\t\tthis.onSaveNewAssetClick = this.onSaveNewAssetClick.bind(this);\r\n\t\tthis.onSaveNewAssetClickOffline = this.onSaveNewAssetClickOffline.bind(this);\r\n\t\tthis.onSaveStartNewRoomClick = this.onSaveStartNewRoomClick.bind(this);\r\n\t\tthis.onSaveStartNewRoomClickOffline = this.onSaveStartNewRoomClickOffline.bind(this);\r\n\t\tthis.onSaveCodingTypeClick = this.onSaveCodingTypeClick.bind(this);\r\n\t\tthis.onSaveCodingTypeClickOffline = this.onSaveCodingTypeClickOffline.bind(this);\r\n\t\tthis.onSavingDuplicateClick = this.onSavingDuplicateClick.bind(this);\r\n\t\tthis.onSavingDuplicateClickOffline = this.onSavingDuplicateClickOffline.bind(this);\r\n\t\tthis.overrideUnitReplacementValue = this.overrideUnitReplacementValue.bind(this)\r\n\r\n\t\tthis.onNewRoomClick = this.onNewRoomClick.bind(this);\r\n\t\tthis.onNewRoomButtonClick = this.onNewRoomButtonClick.bind(this);\r\n\r\n\t\tthis.onNewRoomStructureChanged = this.onNewRoomStructureChanged.bind(this);\r\n\t\tthis.onNewRoomNameChanged = this.onNewRoomNameChanged.bind(this);\r\n\t\tthis.onNewRoomTypeChanged = this.onNewRoomTypeChanged.bind(this);\r\n\r\n\t\tthis.handleDBSyncButtonClicked = this.handleDBSyncButtonClicked.bind(this);\r\n\t\tthis.SyncRoomsWithDB = this.SyncRoomsWithDB.bind(this);\r\n\r\n\t\tthis.updateStatesAfterSync = this.updateStatesAfterSync.bind(this);\r\n\r\n\t\tthis.editPanelItemClicked = this.editPanelItemClicked.bind(this);\r\n\t\tthis.onQuantityFocusOut = this.onQuantityFocusOut.bind(this);\r\n\r\n\t\tthis.onLeaseStartChanged = this.onLeaseStartChanged.bind(this)\r\n\t\tthis.onLeaseMonthlyPaymentChanged = this.onLeaseMonthlyPaymentChanged.bind(this)\r\n\t\tthis.onLeaseTermChanged = this.onLeaseTermChanged.bind(this)\r\n\t\tthis.onLeaseDollarBuyoutChanged = this.onLeaseDollarBuyoutChanged.bind(this)\r\n\t}\r\n\tasync componentDidMount() {\r\n\t\tconst user = await authService.getUser();\r\n\t\tthis.setState({\r\n\t\t\tCurrentUser: user\r\n\t\t});\r\n\t}\r\n\tonNewRoomNameChanged(e) {\r\n\t\tlet newValue = e.value;\r\n\t\tthis.setState({\r\n\t\t\tNewRoomName: newValue\r\n\t\t});\r\n\t}\r\n\tonNewRoomTypeChanged(e) {\r\n\t\tlet newValue = e.value;\r\n\t\tthis.setState({\r\n\t\t\tNewRoomType: newValue\r\n\t\t});\r\n\t}\r\n\tonNewRoomStructureChanged(e) {\r\n\t\tlet newValue = e.value;\r\n\t\tthis.setState({\r\n\t\t\tNewRoomStructureId: newValue\r\n\t\t});\r\n\t}\r\n\tupdateStatesAfterSync() {\r\n\t\t// Make sure it's cleared, since the index doesn't update\r\n\t\tUnsyncedAssets.length = 0;\r\n\r\n\t\t// Make sure the panel items are updated to stop the sync.\r\n\t\tif (UnsyncedAssets.length == 0 && UnsyncedRooms.length == 0) {\r\n\t\t\tthis.setState({\r\n\t\t\t\tDBSyncStatus: \"Synced with Server\"\r\n\t\t\t});\r\n\t\t}\r\n\t\tlet unsyncedAssetCount = UnsyncedAssets.length;\r\n\t\tlet assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid == this.state.StudyRoomId);\r\n\t\t//console.log(assetsThisRoom);\r\n\t\tthis.setState({\r\n\t\t\tUnsyncedAssetCount: unsyncedAssetCount,\r\n\t\t\tAssetsThisRoom: assetsThisRoom\r\n\t\t});\r\n\t}\r\n\thandleDBSyncButtonClicked(evt) {\r\n\t\tthis.SyncRoomsWithDB();\r\n\t\tthis.updateStatesAfterSync();\r\n\t}\r\n\teditPanelItemClicked(editId) {\r\n\t\tassetEdit.load(editId)\r\n\t\t\t.then(\r\n\t\t\t\t(data) => {\r\n\t\t\t\t\tthis.populateEdit(data);\r\n\t\t\t\t\tconsole.log('this.state.overrideDisabled: ', this.state.overrideDisabled)\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t}\r\n\r\n onLeaseStartChanged(e) {\r\n\t\tconst {value: leaseStart} = e\r\n this.setState(state=>{\r\n\t\t\tconst leaseEndDate = calculateLeaseEndValue(leaseStart, state.leaseTerm)\r\n\t\t\treturn { \r\n\t\t\tleaseStart: leaseStart, \r\n\t\t\tleaseEnd: leaseEndDate\r\n\t\t}})\r\n }\r\n\r\n onLeaseTermChanged(e) {\r\n\t\tconst {value: leaseTerm} = e\r\n this.setState(state=>({ \r\n\t\t\tleaseTerm: leaseTerm, \r\n\t\t\tleaseEnd: calculateLeaseEndValue(state.leaseStart, leaseTerm),\r\n\t\t\tleaseTotalPayment: calculateLeaseTotalPayment(state.leaseMonthlyPayment, leaseTerm),\r\n\t\t}));\r\n }\r\n\r\n onLeaseMonthlyPaymentChanged(e) {\r\n\t\tconst {value: leaseMonthlyPayment} = e\r\n this.setState(state=>({ \r\n\t\t\tleaseMonthlyPayment: leaseMonthlyPayment,\r\n\t\t\tleaseYearlyPayment: calculateLeaseYearlyPayment(leaseMonthlyPayment),\r\n\t\t\tleaseTotalPayment: calculateLeaseTotalPayment(leaseMonthlyPayment, state.leaseTerm)\r\n\t\t}));\r\n }\r\n\r\n onLeaseDollarBuyoutChanged(e) {\r\n this.setState({leaseDollarBuyoutAmount: e.value});\r\n }\r\n\r\n\trender() {\r\n\t\tconst {leaseStart, IsLeased, isLegacyLease, AssetServiceLifeID} = this.state\r\n\r\n\t\tconst leaseStartYear = leaseStart ? new Date(leaseStart).getFullYear() : undefined\r\n\r\n\t\tconst showNewLeaseView = IsLeased && !isLegacyLease\r\n\r\n\t\tconst greaterThanZeroIfLeased = (e) =>{\r\n\t\t\tconst value = e.value;\r\n\t\t\treturn showNewLeaseView && value != null ? value > 0 : true\r\n\t\t}\r\n\r\n\t\tconst positiveIfNotLeased = (e) => {\r\n\t\t\tconst value = e.value;\r\n\t\t\treturn !showNewLeaseView && value != null ? value >= 0 : true\r\n\t\t}\r\n\r\n\t\tconst requiredIfLeased = (e) =>{\r\n\t\t\treturn showNewLeaseView ? e.value : true\r\n\t\t}\r\n\t\r\n\t\tconst validateLeaseTermMaxValue = (e) =>{\r\n\t\t\tconst {value} = e\r\n\t\t\treturn showNewLeaseView && value ? value <= LEASE_TERM_PARAMS.MAX : true\r\n\t\t}\r\n\r\n\t\tconst validateYearIfNotLeased = (e) => {\r\n\t\t\tconst { data, value } = e;\r\n\t\t\treturn (!data?.isLeased || data.isLegacyLease) && value !== null\r\n\t\t\t\t? value >= YEAR_RANGE.MIN && value <= YEAR_RANGE.MAX\r\n\t\t\t\t: true;\r\n\t\t};\r\n\t\t\r\n\t\t\tconst validateLifeCycleAsync = async (e) => {\r\n\t\t\t\tconst { value } = e;\r\n\t\t\r\n\t\t\t\tconst validatationResult = {\r\n\t\t\t\t\tisValid: true,\r\n\t\t\t\t\tmessage: undefined,\r\n\t\t\t\t};\r\n\t\t\r\n\t\t\t\tif (!AssetServiceLifeID) return validatationResult;\r\n\t\t\r\n\t\t\t\tconst { min, max } = await getAssetLifeCycleParams(AssetServiceLifeID);\r\n\t\t\r\n\t\t\t\tif (value && value > max) {\r\n\t\t\t\t\tvalidatationResult.isValid = false;\r\n\t\t\t\t\tvalidatationResult.message = `Value is greater than the maximum value of ${max} by Service Life.`;\r\n\t\t\t\t} else if (value && value < min) {\r\n\t\t\t\t\tvalidatationResult.isValid = false;\r\n\t\t\t\t\tvalidatationResult.message = `Value is less than the minimum value of ${min} by Service Life.`;\r\n\t\t\t\t}\r\n\t\t\r\n\t\t\t\treturn Promise.resolve(validatationResult);\r\n\t\t\t};\r\n\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\r\n\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
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t
Where are you?
\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t
Structure
\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\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\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
Room\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\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\r\n\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
Enter Asset Details
\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t
Asset Coding Class
\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\t
\r\n\t\t\t\t\t\t\t\t
Asset Type
\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\t
\r\n\t\t\t\t\t\t\t\t
Leased?
\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\t
\r\n\t\t\t\t\t\t\t\t
Asset Sub-Type
\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\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
Asset Manufacturer
\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
Asset Detail Description
\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
Asset Model ID
\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
Qty
\r\n\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\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\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\t
\r\n\t\t\t\t\t\t\t\t
Year Installed
\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\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\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
Asset Service Life
\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\t
\r\n\t\t\t\t\t\t\t\t
Asset Life Cycle
\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\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
Unit Replacement Value
\r\n\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\t\r\n\t\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\t
\r\n\t\t\t\t\t\t\t\t
Aggregate Replacement Value
\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
Initial RY, Auto
\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
Initial RY, Manual
\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\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
Last RY Cycle in Service
\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\r\n\t\t\t\t\t\t\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\t
Ledger Id
\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
\r\n\t\t\t\t\t\t\t\t
General Notes or Comments
\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
\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\tCurrent Lease Term Start\r\n\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\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\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\tLease Term in Months\r\n\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\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\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\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\tCurrent Monthly Payment\r\n\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\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\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\t
\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\tDollar Buyout Amount\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\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\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\r\n\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\t\t\r\n\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\t\t\r\n\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\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\t
\r\n\t\t\t\t\t\t\t{IsLeased && isLegacyLease && \r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t
The asset being edited is a legacy lease asset and the new lease form cannot be used.
\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
\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\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
\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\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
\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\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
\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\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
\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
\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\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
Enter New Room
\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t
Structure
\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\t
\r\n\t\t\t\t\t\t\t\t\t
Room Name
\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\t
\r\n\t\t\t\t\t\t\t\t\t
Room Type
\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\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\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
\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
\r\n\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\t\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n\tonNewAssetClick(form) {\r\n\t\tvar formValues = this.state;\r\n\r\n\t\tvar jsonString = JSON.stringify(formValues);\r\n\t\treturn fetch('/api/assets/', {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\tbody: jsonString,\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t}\r\n\t\t}).then(\r\n\t\t\tthis.clearNewAsset()\r\n\t\t).then(\r\n\t\t\tnotify({\r\n\t\t\t\tmessage: 'You have submitted the form and are ready to add a new asset.',\r\n\t\t\t\tposition: {\r\n\t\t\t\t\tmy: 'center top',\r\n\t\t\t\t\tat: 'center top'\r\n\t\t\t\t}\r\n\t\t\t}, 'success', 3000)\r\n\t\t).then(handleErrors);\r\n\t}\r\n\r\n\tonNewRoomClick(form, e) {\r\n\r\n\t\tvar formValues = this.state;\r\n\r\n\t\tvar jsonString = JSON.stringify(formValues);\r\n\t\treturn fetch('/api/assets/', {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\tbody: jsonString,\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t}\r\n\t\t}).then(\r\n\t\t\tthis.clearNewRoom()\r\n\t\t).then(\r\n\t\t\tnotify({\r\n\t\t\t\tmessage: 'You have submitted the form. Choose a new room before adding the new asset.',\r\n\t\t\t\tposition: {\r\n\t\t\t\t\tmy: 'center top',\r\n\t\t\t\t\tat: 'center top'\r\n\t\t\t\t}\r\n\t\t\t}, 'success', 3000)\r\n\t\t).then(handleErrors);\r\n\t}\r\n\r\n\thandleRoomPopupHidden() {\r\n\t\tthis.setState({\r\n\t\t\tNewRoomPopupVisible: false\r\n\t\t});\r\n\t}\r\n\r\n\thandleRoomPopupShowing() {\r\n\t\tlet currentStructure = this.state.StructureId;\r\n\t\tthis.setState({\r\n\t\t\tNewRoomStructureId: currentStructure\r\n\t\t});\r\n\t}\r\n\r\n\tonRoomChanged(e) {\r\n\t\tthis.clearNewAsset();\r\n\t\tconst roomId = e.value;\r\n\t\tconst assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid === roomId);\r\n\t\tconst assetCount = assetsThisRoom.length;\r\n\t\tthis.setState({\r\n\t\t\tStudyRoomId: roomId,\r\n\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\tAssetsThisRoom: assetsThisRoom\r\n\t\t});\r\n\t}\r\n\tonStructureChanged(e) {\r\n\t\tthis.clearNewAsset();\r\n\r\n\t\tconst chosenStructureId = e.value;\r\n\t\tconst newList = studyRoomsLookup.filter(room => room.studystructureid === chosenStructureId);\r\n\t\r\n\t\tthis.setState({\r\n\t\t\tStructureId: chosenStructureId,\r\n\t\t\tstudyRoomsLookupFiltered: newList,\r\n\t\t\tRoomCount: newList.length,\r\n\t\t\tAssetCountThisRoom: 0,\r\n\t\t\tAssetsThisRoom: []\r\n\t\t});\r\n\t}\r\n\r\n\tonAssetCodingClassChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tAssetCodingClassId: e.value\r\n\t\t});\r\n\t}\r\n\r\n\tonAssetTypeChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tAssetTypeId: e.value,\r\n\t\t\tAssetSubTypeName: e.value == 9 ? 'Flooring' : this.state.AssetSubTypeName\r\n\t\t});\r\n\t}\r\n\r\n\tonAssetSubtypeChanged(e) {\r\n\t\tconst {value} = e\r\n\t\tthis.setState(state=>({\r\n\t\t\tAssetSubTypeName: value,\r\n\t\t\t...(!state.overrideDisabled && {AssetModelName: \"\", Description: \"\"})\r\n\t\t}));\r\n\t}\r\n\r\n\tonAssetManufacturerNameChanged(e) {\r\n\t\tconst {value} = e\r\n\t\tthis.setState(state=>({\r\n\t\t\tAssetManufacturerName: value,\r\n\t\t\t...(!state.overrideDisabled && {AssetModelName: \"\", Description: \"\"})\r\n\t\t}));\r\n\t}\r\n\r\n\tonAssetModelNameChanged(e) {\r\n\t\tconst {value} = e\r\n\t\tthis.setState({\r\n\t\t\tAssetModelName: value\r\n\t\t});\r\n\t}\r\n\r\n\tonAssetLeaseStatusChanged(e) {\r\n\t\tconst isLeased = e.value\r\n\t\tthis.setState({\r\n\t\t\tIsLeased: isLeased,\r\n\t\t});\r\n\t}\r\n\r\n\tonAssetDetailDescriptionChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tDescription: e.value\r\n\t\t});\r\n\t}\r\n\r\n\tonQuantityChanged(e) {\r\n\t\tconst {value} = e\r\n\t\t//The Qty field allows strings in order to accomodate equations. We convert empty string to null.\r\n\t\tconst valueToUse = value?.trim() === '' ? null : value;\r\n\t\tthis.setState(state=>({\r\n\t\t\tQty: valueToUse,\r\n\t\t\tAggregateReplacementValue: calculateAggregateReplacementValue(state.UnitReplacementValue, valueToUse)\r\n\t\t}));\r\n\t}\r\n\r\n\tonLedgerIdChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tLedgerId: e.value\r\n\t\t});\r\n\t}\r\n\r\n\tonUomChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tUnitOfMeasureId: e.value\r\n\t\t});\r\n\t}\r\n\r\n\tonYearInstalledChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tYearInstalled: e.value,\r\n\t\t\tInitialRYAuto: e.value + this.state.AssetLifeCycle == 0 ? '' : e.value + this.state.AssetLifeCycle\r\n\r\n\t\t});\r\n\t}\r\n\r\n\tonAssetServiceLifeChanged = async (e) => {\r\n\t\tthis.setState({\r\n\t\t\tAssetServiceLifeID: e.value\r\n\t\t});\r\n\r\n\t\tif (e.value) {\r\n\t\t\tconst {auto} = await getAssetLifeCycleParams(e.value);\r\n\t\t\tif(auto){\r\n\t\t\t\tthis.setState({AssetLifeCycle: auto})\r\n\t\t\t}\r\n\t\t} \r\n\t}\r\n\r\n\tonAssetLifeCycleChanged(e) {\r\n\t\tthis.setState(state=>({\r\n\t\t\tAssetLifeCycle: e.value,\r\n\t\t\tInitialRYAuto: e.value + state.YearInstalled === 0 ? '' : e.value + state.YearInstalled\r\n\t\t}));\r\n\t}\r\n\r\n\toverrideUnitReplacementValue(newValue) {\r\n\t\tif(!this.state.overrideDisabled){\r\n\t\t\tthis.setState(state=>\r\n\t\t\t\t({UnitReplacementValue: newValue,\r\n\t\t\t\tAggregateReplacementValue: calculateAggregateReplacementValue(newValue, state.Qty)\r\n\t\t\t}));\r\n\t\t}\r\n\t}\r\n\r\n\tonUnitReplacementValueChanged(newValue) {\r\n\t\tthis.setState(state=>({\r\n\t\t\tUnitReplacementValue: newValue,\r\n\t\t\tAggregateReplacementValue: calculateAggregateReplacementValue(newValue, state.Qty),\r\n\t\t}));\r\n\t}\r\n\r\n\tonInitialRYAutoChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tInitialRYAuto: e.value\r\n\t\t});\r\n\t}\r\n\r\n\tonInitialRYManualChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tInitialRYManual: e.value\r\n\t\t});\r\n\t}\r\n\r\n\tonLastRYCycleChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tLastRYCycle: e.value\r\n\t\t});\r\n\t}\r\n\r\n\tonGeneralNotesChanged(e) {\r\n\t\tthis.setState({\r\n\t\t\tNotes: e.value\r\n\t\t});\r\n\t}\r\n\r\n\tonQuantityFocusOut(e) {\r\n\t\ttry {\r\n\t\t\tconst qtyResult = math.evaluate(this.state.Qty);\r\n\t\t\tconst roundedQtyResult = math.round(qtyResult)\r\n\t\t\tthis.setState(state=>({\r\n\t\t\t\tQty: roundedQtyResult,\r\n\t\t\t\tAggregateReplacementValue: calculateAggregateReplacementValue(state.UnitReplacementValue, roundedQtyResult)\r\n\t\t\t}))\r\n\t\t} catch (err) {\r\n\t\t\t// error already propagated on focus out through validator.\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tclearNewRoom = () => {\r\n\t\tthis.setState({\r\n\t\t\tStudyRoomId: \"\",\r\n\t\t\tAssetCodingClassId: \"\",\r\n\t\t\tAssetTypeId: \"\",\r\n\t\t\tAssetSubTypeId: \"\",\r\n\t\t\tAssetManufacturerName: \"\",\r\n\t\t\tAssetModelName: \"\",\r\n\t\t\tIsLeased: false,\r\n\t\t\tAssetSubTypeName: \"\",\r\n\t\t\tDescription: \"\",\r\n\t\t\tQty: \"\",\r\n\t\t\tUnitOfMeasureId: \"\",\r\n\t\t\tYearInstalled: null,\r\n\t\t\tAssetServiceLifeID: \"\",\r\n\t\t\tAssetLifeCycle: null,\r\n\t\t\tUnitReplacementValue: null,\r\n\t\t\tAggregateReplacementValue: null,\r\n\t\t\tInitialRYAuto: null,\r\n\t\t\tInitialRYManual: null,\r\n\t\t\tLastRYCycle: null,\r\n\t\t\tNotes: \"\",\r\n\t\t\tEditAssetId: 0,\r\n\t\t\tAssetLifeCycleMinimum: 0,\r\n\t\t\tAssetLifeCycleMaximum: 100,\r\n\t\t\tLedgerId: undefined,\r\n\r\n\t\t\t//Clear Leased Asset Details\r\n\t\t\tleaseStart: undefined,\r\n\t\t\tleaseTerm: undefined,\r\n\t\t\tleaseEnd: undefined,\r\n\t\t\tleaseDollarBuyoutAmount: undefined,\r\n\t\t\tleaseMonthlyPayment: undefined,\r\n\t\t\tleaseYearlyPayment: undefined,\r\n\t\t\tleaseTotalPayment: undefined,\r\n\t\t\tisLegacyLease: false\r\n\t\t})\r\n\t}\r\n\r\n\tclearNewAsset = () => {\r\n\t\tthis.setState({\r\n\t\t\tAssetCodingClassId: \"\",\r\n\t\t\tAssetTypeId: \"\",\r\n\t\t\tAssetSubTypeId: \"\",\r\n\t\t\tAssetManufacturerName: \"\",\r\n\t\t\tAssetModelName: \"\",\r\n\t\t\tIsLeased: false,\r\n\t\t\tAssetSubTypeName: \"\",\r\n\t\t\tDescription: \"\",\r\n\t\t\tQty: \"\",\r\n\t\t\tUnitOfMeasureId: \"\",\r\n\t\t\tYearInstalled: null,\r\n\t\t\tAssetServiceLifeID: \"\",\r\n\t\t\tAssetLifeCycle: null,\r\n\t\t\tUnitReplacementValue: null,\r\n\t\t\tAggregateReplacementValue: null,\r\n\t\t\tInitialRYAuto: null,\r\n\t\t\tInitialRYManual: null,\r\n\t\t\tLastRYCycle: null,\r\n\t\t\tNotes: \"\",\r\n\t\t\tEditAssetId: 0,\r\n\t\t\tAssetLifeCycleMinimum: 0,\r\n\t\t\tAssetLifeCycleMaximum: 100,\r\n\t\t\tLedgerId: undefined,\r\n\r\n\t\t\t//Clear Leased Asset Details\r\n\t\t\tleaseStart: undefined,\r\n\t\t\tleaseTerm: undefined,\r\n\t\t\tleaseEnd: undefined,\r\n\t\t\tleaseDollarBuyoutAmount: undefined,\r\n\t\t\tleaseMonthlyPayment: undefined,\r\n\t\t\tleaseYearlyPayment: undefined,\r\n\t\t\tleaseTotalPayment: undefined,\r\n\t\t\tisLegacyLease: false\r\n\t\t})\r\n\t}\r\n\r\n\tclearNewCodingType = () => {\r\n\t\tthis.setState({\r\n\t\t\tAssetSubTypeId: \"\",\r\n\t\t\tAssetManufacturerName: \"\",\r\n\t\t\tAssetModelName: \"\",\r\n\t\t\tIsLeased: false,\r\n\t\t\tAssetSubTypeName: \"\",\r\n\t\t\tDescription: \"\",\r\n\t\t\tQty: \"\",\r\n\t\t\tUnitOfMeasureId: \"\",\r\n\t\t\tYearInstalled: null,\r\n\t\t\tAssetServiceLifeID: \"\",\r\n\t\t\tAssetLifeCycle: null,\r\n\t\t\tUnitReplacementValue: null,\r\n\t\t\tAggregateReplacementValue: null,\r\n\t\t\tInitialRYAuto: null,\r\n\t\t\tInitialRYManual: null,\r\n\t\t\tLastRYCycle: null,\r\n\t\t\tNotes: \"\",\r\n\t\t\tEditAssetId: 0,\r\n\t\t\tAssetLifeCycleMinimum: 0,\r\n\t\t\tAssetLifeCycleMaximum: 100,\r\n\t\t\tLedgerId: undefined,\r\n\r\n\t\t\t//Clear Leased Asset Details\r\n\t\t\tleaseStart: undefined,\r\n\t\t\tleaseTerm: undefined,\r\n\t\t\tleaseEnd: undefined,\r\n\t\t\tleaseDollarBuyoutAmount: undefined,\r\n\t\t\tleaseMonthlyPayment: undefined,\r\n\t\t\tleaseYearlyPayment: undefined,\r\n\t\t\tleaseTotalPayment: undefined,\r\n\t\t\tisLegacyLease: false\r\n\t\t})\r\n\t}\r\n\r\n\tclearSaveDuplicate = () => {\r\n\t\tthis.setState({\r\n\t\t\tEditAssetId: 0\r\n\t\t})\r\n\t}\r\n\r\n\tvalidateForm = async (e) => {\r\n const result = e.validationGroup.validate();\r\n if (!result.isValid) return;\r\n\r\n let asyncResultIsValid = true;\r\n if (result.status === \"pending\") {\r\n const asyncResult = await result.complete;\r\n\r\n asyncResultIsValid = asyncResult.isValid;\r\n }\r\n\r\n return result.isValid && asyncResultIsValid;\r\n }\r\n\r\n\tonSaveNewAssetClick = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet newAssetStudyRoomId = this.state.StudyRoomId;\r\n\t\t\tvar formValues = this.state;\r\n\t\t\tawait addAssetAsync(formValues).then(syncassets => {\r\n\t\t\t\tthis.clearNewAsset();\r\n\t\t\t\tlet assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid == newAssetStudyRoomId);\r\n\t\t\t\tlet assetCount = assetsThisRoom.length;\r\n\t\t\t\tthis.setState({\r\n\t\t\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\t\t\tAssetsThisRoom: assetsThisRoom,\r\n\t\t\t\t\toverrideDisabled: false\r\n\t\t\t\t});\r\n\t\t\t\tthis.topOfForm.current.scrollIntoView({\r\n\t\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\t\tblock: \"nearest\"\r\n\t\t\t\t});\r\n\t\t\t})\r\n }\r\n\t\tthis.setState({isSaving: false})\r\n\t}\r\n\r\n\tpopulateEdit = (data) => {\r\n\t\tthis.setState({\r\n\t\t\tEditAssetId: data.id,\r\n\t\t\tAssetCodingClassId: data.assetCodingClassId,\r\n\t\t\tAssetTypeId: data.assetTypeId,\r\n\t\t\tAssetSubTypeName: data.assetSubTypeName,\r\n\t\t\tAssetManufacturerName: data.assetManufacturerName,\r\n\t\t\tAssetModelName: data.assetModelName,\r\n\t\t\tIsLeased: data.isLeased,\r\n\t\t\tDescription: data.description,\r\n\t\t\tQty: data.qty,\r\n\t\t\tUnitOfMeasureId: data.unitOfMeasureId,\r\n\t\t\tYearInstalled: data.yearInstalled,\r\n\t\t\tAssetServiceLifeID: data.assetServiceLifeId,\r\n\t\t\tAssetLifeCycle: data.assetLifeCycle,\r\n\t\t\tUnitReplacementValue: data.unitReplacementValue,\r\n\t\t\tAggregateReplacementValue: data.aggregateReplacementValue,\r\n\t\t\tInitialRYAuto: data.initialRYAuto,\r\n\t\t\tInitialRYManual: data.initialRYManual,\r\n\t\t\tLastRYCycle: data.lastRYCycle,\r\n\t\t\tNotes: data.notes,\r\n\t\t\tLedgerId: data.ledgerId,\r\n\r\n\t\t\t//Lease Details\r\n\t\t\tleaseStart: data.leaseStart,\r\n\t\t\tleaseTerm: data.leaseTerm,\r\n\t\t\tleaseEnd: data.leaseEnd,\r\n\t\t\tleaseDollarBuyoutAmount: data.leaseDollarBuyoutAmount,\r\n\t\t\tleaseMonthlyPayment: data.leaseMonthlyPayment,\r\n\t\t\tleaseYearlyPayment: data.leaseYearlyPayment,\r\n\t\t\tleaseTotalPayment: data.leaseTotalPayment,\r\n\t\t\tisLegacyLease: data.isLegacyLease,\r\n\t\t\toverrideDisabled: true\r\n\t\t});\r\n\t}\r\n\r\n\tonSaveNewAssetClickOffline = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet newAssetStudyRoomId = this.state.StudyRoomId;\r\n\t\t\tvar formValues = this.state;\r\n\r\n\t\t\tvar min = Math.min.apply(null, studyAssetsLookup.map(item => item.id));\r\n\t\t\tlet newAssetId = generateNewOfflineId(min);\r\n\t\t\tif (this.state.EditAssetId > 0) {\r\n\t\t\t\tnewAssetId = this.state.EditAssetId;\r\n\t\t\t}\r\n\t\t\taddToStudyAssetsLookup(newAssetId, formValues.AssetSubTypeName, newAssetStudyRoomId, formValues.CurrentUser.name, formValues.AssetManufacturerName, formValues.Description);\r\n\t\t\taddToUnsyncedAssets(newAssetId, formValues);\r\n\t\t\tthis.clearNewAsset();\r\n\t\t\tlet assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid == newAssetStudyRoomId);\r\n\t\t\tlet assetCount = assetsThisRoom.length;\r\n\t\t\tlet unsyncedAssetCount = this.state.UnsyncedAssetCount + 1;\r\n\t\t\tthis.setState({\r\n\t\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\t\tAssetsThisRoom: assetsThisRoom,\r\n\t\t\t\tDBSyncStatus: \"NOT SYNCED\",\r\n\t\t\t\tUnsyncedAssetCount: unsyncedAssetCount,\r\n\t\t\t\toverrideDisabled: false,\r\n\t\t\t});\r\n\t\t\tthis.topOfForm.current.scrollIntoView({\r\n\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\tblock: \"nearest\"\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\r\n\tonSaveStartNewRoomClick = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tvar formValues = this.state;\r\n\t\t\tawait addAssetAsync(formValues).then(syncassets => {\r\n\t\t\t\tthis.clearNewAsset();\r\n\t\t\t\tthis.setState({\r\n\t\t\t\t\tAssetCountThisRoom: 0,\r\n\t\t\t\t\tAssetsThisRoom: [],\r\n\t\t\t\t\tStudyRoomId: \"\",\r\n\t\t\t\t\toverrideDisabled: false\r\n\t\t\t\t});\r\n\t\t\t\tthis.topOfForm.current.scrollIntoView({\r\n\t\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\t\tblock: \"nearest\"\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\tonSaveStartNewRoomClickOffline = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet newAssetStudyRoomId = this.state.StudyRoomId;\r\n\t\t\tvar formValues = this.state;\r\n\t\t\tvar min = Math.min.apply(null, studyRoomsLookup.map(item => item.id));\r\n\t\t\tlet newAssetId = generateNewOfflineId(min);\r\n\t\t\tif (this.state.EditAssetId > 0) {\r\n\t\t\t\tnewAssetId = this.state.EditAssetId;\r\n\t\t\t}\r\n\t\t\taddToStudyAssetsLookup(newAssetId, formValues.AssetSubTypeName, newAssetStudyRoomId, formValues.CurrentUser.name, formValues.AssetManufacturerName, formValues.Description);\r\n\t\t\taddToUnsyncedAssets(newAssetId, formValues);\r\n\t\t\tthis.clearNewAsset();\r\n\t\t\tlet unsyncedAssetCount = this.state.UnsyncedAssetCount + 1;\r\n\t\t\tthis.setState({\r\n\t\t\t\tAssetCountThisRoom: 0,\r\n\t\t\t\tAssetsThisRoom: [],\r\n\t\t\t\tStudyRoomId: \"\",\r\n\t\t\t\tDBSyncStatus: \"NOT SYNCED\",\r\n\t\t\t\tUnsyncedAssetCount: unsyncedAssetCount,\r\n\t\t\t\toverrideDisabled: false\r\n\t\t\t});\r\n\t\t\tthis.topOfForm.current.scrollIntoView({\r\n\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\tblock: \"nearest\"\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\r\n\tonSaveNewRoomClick = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet srt = studyRoomTemplate;\r\n\t\t\tsrt.name = this.state.NewRoomName;\r\n\t\t\tsrt.studyStructureId = this.state.NewRoomStructureId;\r\n\t\t\tsrt.roomTypeId = this.state.NewRoomType;\r\n\t\t\tawait addRoomAsync(srt).then(syncdropdowns => {\r\n\t\t\t\tlet newRoomId = syncdropdowns;\r\n\t\t\t\tthis.setState({\r\n\t\t\t\t\tStructureId: srt.studyStructureId,\r\n\t\t\t\t});\r\n\t\t\t\tlet newList = studyRoomsLookup.filter(room => room.studystructureid == this.state.StructureId);\r\n\t\t\t\tthis.setState({\r\n\t\t\t\t\tstudyRoomsLookupFiltered: newList,\r\n\t\t\t\t\tRoomCount: newList.length,\r\n\t\t\t\t\tStudyRoomId: newRoomId,\r\n\t\t\t\t\tNewRoomName: \"\",\r\n\t\t\t\t\tNewRoomPopupVisible: false,\r\n\t\t\t\t\toverrideDisabled: false\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\r\n\tonSaveNewRoomClickOffline = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet srt = {\r\n\t\t\t\tname: this.state.NewRoomName,\r\n\t\t\t\tstudyStructureId: this.state.NewRoomStructureId,\r\n\t\t\t\troomTypeId: this.state.NewRoomType,\r\n\t\t\t\tCurrentUser: this.state.CurrentUser,\r\n\t\t\t\tUnsyncedAssets: []\r\n\t\t\t};\r\n\t\t\tvar min = Math.min.apply(null, studyRoomsLookup.map(item => item.id));\r\n\t\t\tlet newRoomId = generateNewOfflineId(min);\r\n\t\t\tsrt.id = newRoomId;\r\n\t\t\tstudyRoomsLookup.push({ 'id': srt.id, 'name': srt.name, 'studystructureid': srt.studyStructureId });\r\n\t\t\taddToUnsyncedRooms(srt);\r\n\t\t\tthis.setState({\r\n\t\t\t\tStructureId: srt.studyStructureId,\r\n\t\t\t});\r\n\t\t\tlet newList = studyRoomsLookup.filter(room => room.studystructureid == this.state.StructureId);\r\n\t\t\tthis.setState({\r\n\t\t\t\tstudyRoomsLookupFiltered: newList,\r\n\t\t\t\tRoomCount: newList.length\r\n\t\t\t});\r\n\t\t\tthis.setState({\r\n\t\t\t\tStudyRoomId: newRoomId\r\n\t\t\t});\r\n\t\t\tthis.setState({\r\n\t\t\t\tNewRoomName: \"\",\r\n\t\t\t\tNewRoomPopupVisible: false\r\n\t\t\t});\r\n\t\t\tlet assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid == newRoomId);\r\n\t\t\tlet assetCount = assetsThisRoom.length;\r\n\t\t\tlet unsyncedRoomCount = UnsyncedRooms.length;\r\n\t\t\tthis.setState({\r\n\t\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\t\tAssetsThisRoom: assetsThisRoom,\r\n\t\t\t\tDBSyncStatus: \"NOT SYNCED\",\r\n\t\t\t\tUnsyncedRoomCount: unsyncedRoomCount,\r\n\t\t\t\toverrideDisabled: false,\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\r\n\tonSaveCodingTypeClick = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet newAssetStudyRoomId = this.state.StudyRoomId;\r\n\t\t\tvar formValues = this.state;\r\n\t\t\tawait addAssetAsync(formValues).then(syncassets => {\r\n\t\t\t\tthis.clearNewCodingType();\r\n\t\t\t\tlet assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid == newAssetStudyRoomId);\r\n\t\t\t\tlet assetCount = assetsThisRoom.length;\r\n\t\t\t\tthis.setState({\r\n\t\t\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\t\t\tAssetsThisRoom: assetsThisRoom,\r\n\t\t\t\t\toverrideDisabled: false\r\n\t\t\t\t});\r\n\t\t\t\tthis.topOfForm.current.scrollIntoView({\r\n\t\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\t\tblock: \"nearest\"\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\r\n\tonSaveCodingTypeClickOffline = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet newAssetStudyRoomId = this.state.StudyRoomId;\r\n\t\t\tvar formValues = this.state;\r\n\t\t\tvar min = Math.min.apply(null, studyAssetsLookup.map(item => item.id));\r\n\t\t\tlet newAssetId = generateNewOfflineId(min);\r\n\t\t\tif (this.state.EditAssetId > 0) {\r\n\t\t\t\tnewAssetId = this.state.EditAssetId;\r\n\t\t\t}\r\n\t\t\taddToStudyAssetsLookup(newAssetId, formValues.AssetSubTypeName, newAssetStudyRoomId, formValues.CurrentUser.name, formValues.AssetManufacturerName, formValues.Description);\r\n\t\t\taddToUnsyncedAssets(newAssetId, formValues);\r\n\t\t\tthis.clearNewCodingType();\r\n\t\t\tlet assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid == newAssetStudyRoomId);\r\n\t\t\tlet assetCount = assetsThisRoom.length;\r\n\t\t\tlet unsyncedAssetCount = this.state.UnsyncedAssetCount + 1;\r\n\t\t\tthis.setState({\r\n\t\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\t\tAssetsThisRoom: assetsThisRoom,\r\n\t\t\t\tDBSyncStatus: \"NOT SYNCED\",\r\n\t\t\t\tUnsyncedAssetCount: unsyncedAssetCount,\r\n\t\t\t\toverrideDisabled: false\r\n\t\t\t});\r\n\t\t\tthis.topOfForm.current.scrollIntoView({\r\n\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\tblock: \"nearest\"\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\r\n\tonSavingDuplicateClick = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet newAssetStudyRoomId = this.state.StudyRoomId;\r\n\t\t\tvar formValues = this.state;\r\n\t\t\tawait addAssetAsync(formValues).then(syncassets => {\r\n\t\t\t\tthis.clearSaveDuplicate();\r\n\t\t\t\tlet assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid == newAssetStudyRoomId);\r\n\t\t\t\tlet assetCount = assetsThisRoom.length;\r\n\t\t\t\tthis.setState({\r\n\t\t\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\t\t\tAssetsThisRoom: assetsThisRoom\r\n\t\t\t\t});\r\n\t\t\t\tthis.topOfForm.current.scrollIntoView({\r\n\t\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\t\tblock: \"nearest\"\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\r\n\tonSavingDuplicateClickOffline = async(e) => {\r\n\t\tthis.setState({isSaving: true})\r\n\t\tconst isValid = await this.validateForm(e)\r\n if (isValid) {\r\n\t\t\tlet newAssetStudyRoomId = this.state.StudyRoomId;\r\n\t\t\tvar formValues = this.state;\r\n\t\t\tvar min = Math.min.apply(null, studyAssetsLookup.map(item => item.id));\r\n\t\t\tlet newAssetId = generateNewOfflineId(min);\r\n\t\t\tif (this.state.EditAssetId > 0) {\r\n\t\t\t\tnewAssetId = this.state.EditAssetId;\r\n\t\t\t}\r\n\t\t\taddToStudyAssetsLookup(newAssetId, formValues.AssetSubTypeName, newAssetStudyRoomId, formValues.CurrentUser.name, formValues.AssetManufacturerName, formValues.Description);\r\n\t\t\taddToUnsyncedAssets(newAssetId, formValues);\r\n\t\t\tthis.clearSaveDuplicate();\r\n\t\t\tlet assetsThisRoom = studyAssetsLookup.filter(assets => assets.studyroomid == newAssetStudyRoomId);\r\n\t\t\tlet assetCount = assetsThisRoom.length;\r\n\t\t\tlet unsyncedAssetCount = this.state.UnsyncedAssetCount + 1;\r\n\t\t\tthis.setState({\r\n\t\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\t\tAssetsThisRoom: assetsThisRoom,\r\n\t\t\t\tDBSyncStatus: \"NOT SYNCED\",\r\n\t\t\t\tUnsyncedAssetCount: unsyncedAssetCount\r\n\t\t\t});\r\n\t\t\tthis.topOfForm.current.scrollIntoView({\r\n\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\tblock: \"nearest\"\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.setState({isSaving: false});\r\n\t}\r\n\r\n\tparseServiceLife = (serviceLife) => {\r\n\t\tvar list = serviceLife.match(/\\d+/g); // Get a list of all integers\r\n\t\tlist.sort(function (x, y) { // Sort list\r\n\t\t\treturn x - y;\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tonNewRoomButtonClick = () => {\r\n\t\tthis.setState({\r\n\t\t\tNewRoomPopupVisible: true\r\n\t\t});\r\n\t}\r\n\r\n\tSyncRoomsWithDB = () => {\r\n\r\n\t\tif (UnsyncedAssets.length > 0) {\r\n\t\t\t// Copy the array so we can remove from the original as we sync\r\n\t\t\tlet UnsyncedAssetsToIterate = UnsyncedAssets;\r\n\t\t\tUnsyncedAssetsToIterate.forEach(asset => {\r\n\t\t\t\tlet tempAssetId = asset.Id;\r\n\t\t\t\tif (tempAssetId < 0) {\r\n\t\t\t\t\tasset.Id = 0;\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\taddAssetAsync(asset).then(syncassets => {\r\n\t\t\t\t\t// studyAssetsLookup should have the newly added item. Remove the placeholder with the negative id.\r\n\t\t\t\t\tlet indexToRemove = studyAssetsLookup.findIndex(asset => asset.id === tempAssetId);\r\n\t\t\t\t\tstudyAssetsLookup.splice(indexToRemove, 1);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Remove from the UnsyncedAssets array\r\n\t\t\t\t\tlet indexToRemoveUA = UnsyncedAssets.findIndex(asset => asset.id === tempAssetId);\r\n\t\t\t\t\tUnsyncedAssets.splice(indexToRemoveUA, 1);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (UnsyncedRooms.length > 0) {\r\n\t\t\t// Sync Rooms with DB\r\n\t\t\tlet UnsyncedRoomsToIterate = UnsyncedRooms;\r\n\t\t\tUnsyncedRoomsToIterate.forEach(room => {\r\n\t\t\t\tlet tempRoomId = room.id;\r\n\t\t\t\troom.id = 0;\r\n\t\t\t\taddRoomAsync(room).then(syncrooms => {\r\n\t\t\t\t\tlet newRoomId = syncrooms;\r\n\t\t\t\t\t// studyRoomsLookup should have the newly added item. Remove the placeholder with the negative id.\r\n\t\t\t\t\tlet indexToRemove = studyRoomsLookup.findIndex(r => r.id === tempRoomId);\r\n\t\t\t\t\tstudyRoomsLookup.splice(indexToRemove, 1);\r\n\t\t\t\t\t// Update any UnsyncedAssets with the new room id.\r\n\t\t\t\t\troom.UnsyncedAssets.forEach(asset => {\r\n\t\t\t\t\t\tif (asset.StudyRoomId == tempRoomId) {\r\n\t\t\t\t\t\t\t//console.log(\"Match:\", tempRoomId);\r\n\t\t\t\t\t\t\t//console.log(\"newRoomId:\", newRoomId);\r\n\t\t\t\t\t\t\tasset.Id = 0;\r\n\t\t\t\t\t\t\tasset.StudyRoomId = newRoomId;\r\n\t\t\t\t\t\t\taddAssetAsync(asset);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//console.log(\"asset:\", asset);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// Remove from the UnsyncedAssets array\r\n\t\t\t\t\tlet indexToRemoveUR = UnsyncedRooms.findIndex(room => room.id === tempRoomId);\r\n\t\t\t\t\tUnsyncedRooms.splice(indexToRemoveUR, 1);\r\n\r\n\t\t\t\t\t/*let assetsThisRoom = studyRoomsLookup.filter(assets => assets.studyroomid == r.StudyRoomId);\r\n\t\t\t\t\tlet assetCount = assetsThisRoom.length;\r\n\t\t\t\t\tthis.setState({\r\n\t\t\t\t\t\tAssetCountThisRoom: assetCount,\r\n\t\t\t\t\t\tAssetsThisRoom: assetsThisRoom\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});\r\n\t\t\tUnsyncedRooms.length = 0;\r\n\r\n\t\t}\r\n\t}\r\n}\r\n\r\nconst studyStructures = createStore({\r\n\tkey: 'Id',\r\n\tloadUrl: '/api/studystructures',\r\n\tonBeforeSend: (method, ajaxOptions) => {\r\n\t\tajaxOptions.xhrFields = { withCredentials: true };\r\n\t},\r\n\tonLoaded: () => { }\r\n});\r\n\r\nconst studyRooms = createStore({\r\n\tkey: 'Id',\r\n\tloadUrl: '/api/studyrooms',\r\n\tonBeforeSend: (method, ajaxOptions) => {\r\n\t\tajaxOptions.xhrFields = { withCredentials: true };\r\n\t}\r\n});\r\n\r\nconst studyAssets = createStore({\r\n\tkey: 'Id',\r\n\tloadUrl: '/api/assets/',\r\n\tonBeforeSend: (method, ajaxOptions) => {\r\n\t\tajaxOptions.xhrFields = { withCredentials: true };\r\n\t}\r\n});\r\n\r\n\r\nfunction loadStudyStructureLookup() {\r\n\tstudyStructures.load()\r\n\t\t.then(\r\n\t\t\t(data) => {\r\n\t\t\t\tdata.forEach(element => {\r\n\t\t\t\t\tvar itemIndex = studyStructureLookup.findIndex(x => x.id === element.id);\r\n\t\t\t\t\tif (itemIndex == -1) {\r\n\t\t\t\t\t\t//not found, add new\r\n\t\t\t\t\t\tstudyStructureLookup.push({ 'id': element.id, 'name': element.name });\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t//found, update name\r\n\t\t\t\t\t\tstudyStructureLookup[itemIndex].name = element.name;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t}\r\n\t\t)\r\n}\r\n\r\nfunction loadStudyRoomsLookup() {\r\n\tstudyRooms.load()\r\n\t\t.then(\r\n\t\t\t(data) => {\r\n\t\t\t\tdata.forEach(element => {\r\n\t\t\t\t\tvar itemIndex = studyRoomsLookup.findIndex(x => x.id === element.id);\r\n\t\t\t\t\tif (itemIndex == -1) {\r\n\t\t\t\t\t\t//not found, add new\r\n\t\t\t\t\t\tstudyRoomsLookup.push({ 'id': element.id, 'name': element.name, 'studystructureid': element.studyStructureId });\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t//found, update name\r\n\t\t\t\t\t\tstudyRoomsLookup[itemIndex].name = element.name;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t}\r\n\t\t)\r\n}\r\n\r\nfunction loadStudyAssetsLookup() {\r\n\tstudyAssets.load()\r\n\t\t.then(\r\n\t\t\t(data) => {\r\n\t\t\t\tdata.forEach(element => addToStudyAssetsLookup(element.id, element.assetSubTypeName, element.studyRoomId, element.createdBy, element.assetManufacturerName, element.description));\r\n\t\t\t}\r\n\t\t)\r\n}\r\n\r\nfunction addToStudyAssetsLookup(id, name, studyroomid, createdby, manufacturer, description) {\r\n\tlet usecreatedby = \"\";\r\n\tif (createdby.length > 0) {\r\n\t\tusecreatedby = createdby.split(\"@\")[0];\r\n\t}\r\n\tvar itemIndex = studyAssetsLookup.findIndex(x => x.id === id);\r\n\tif (itemIndex == -1) {\r\n\t\tstudyAssetsLookup.push({ 'id': id, 'name': name, 'studyroomid': studyroomid, 'createdby': usecreatedby, 'manufacturer': manufacturer, 'description': description });\r\n\t} else {\r\n\t\t//found, update name\r\n\t\tstudyAssetsLookup[itemIndex].name = name;\r\n\t\tstudyAssetsLookup[itemIndex].description = description;\r\n\t}\r\n\r\n\tvar subtypeIndex = assetSubtypeAutocomplete.findIndex(x => x.name === name);\r\n\tif (subtypeIndex == -1) {\r\n\t\tassetSubtypeAutocomplete.push({ 'name': name });\r\n\t}\r\n\tvar manufacturerIndex = assetManufacturerAutocomplete.findIndex(x => x.manufacturer === manufacturer);\r\n\tif (manufacturerIndex == -1) {\r\n\t\tassetManufacturerAutocomplete.push({ 'manufacturer': manufacturer });\r\n\t}\r\n}\r\n\r\nfunction addToUnsyncedRooms(unsyncedRoom) {\r\n\tUnsyncedRooms.push(unsyncedRoom);\r\n}\r\n\r\nfunction addToUnsyncedAssets(newId, formvalues) {\r\n\tlet saveAsset = {\r\n\t\tId: newId,\r\n\t\tStudyRoomId: formvalues.StudyRoomId,\r\n\t\tAssetCodingClassId: formvalues.AssetCodingClassId,\r\n\t\tAssetTypeId: formvalues.AssetTypeId,\r\n\t\tAssetSubTypeId: formvalues.AssetSubTypeId,\r\n\t\tAssetManufacturerName: formvalues.AssetManufacturerName,\r\n\t\tAssetModelName: formvalues.AssetModelName,\r\n\t\tIsLeased: formvalues.IsLeased,\r\n\t\tAssetSubTypeName: formvalues.AssetSubTypeName,\r\n\t\tDescription: formvalues.Description,\r\n\t\tQty: formvalues.Qty,\r\n\t\tUnitOfMeasureId: formvalues.UnitOfMeasureId,\r\n\t\tYearInstalled: formvalues.YearInstalled,\r\n\t\tAssetServiceLifeID: formvalues.AssetServiceLifeID,\r\n\t\tAssetLifeCycle: formvalues.AssetLifeCycle,\r\n\t\tUnitReplacementValue: formvalues.UnitReplacementValue,\r\n\t\tAggregateReplacementValue: formvalues.AggregateReplacementValue,\r\n\t\tInitialRYAuto: formvalues.InitialRYAuto,\r\n\t\tInitialRYManual: formvalues.InitialRYManual,\r\n\t\tLastRYCycle: formvalues.LastRYCycle,\r\n\t\tNotes: formvalues.Notes,\r\n\t\tCurrentUser: formvalues.CurrentUser,\r\n\r\n\t\t//Leased Asset Details\r\n\t\tleaseStart: formvalues.leaseStart,\r\n\t\tleaseTerm: formvalues.leaseTerm,\r\n\t\tleaseEnd: formvalues.leaseEnd,\r\n\t\tleaseDollarBuyoutAmount: formvalues.leaseDollarBuyoutAmount,\r\n\t\tleaseMonthlyPayment: formvalues.leaseMonthlyPayment,\r\n\t\tleaseYearlyPayment: formvalues.leaseYearlyPayment,\r\n\t\tleaseTotalPayment: formvalues.leaseTotalPayment,\r\n\t\tisLegacyLease: formvalues.isLegacyLease\r\n\t}\r\n\tUnsyncedAssets.push(saveAsset);\r\n}\r\n\r\nconst assetCodingClass = createStore({\r\n\tkey: 'Id',\r\n\tloadUrl: '/api/assetcodingclasses/',\r\n\tloadMode: 'raw',//needed for searching\r\n\tonBeforeSend: (method, ajaxOptions) => {\r\n\t\tajaxOptions.xhrFields = { withCredentials: true };\r\n\t}\r\n});\r\n\r\nconst assetType = createStore({\r\n\tkey: 'Id',\r\n\tloadUrl: '/api/assettypes/',\r\n\tloadMode: 'raw',\r\n\tonBeforeSend: (method, ajaxOptions) => {\r\n\t\tajaxOptions.xhrFields = { withCredentials: true };\r\n\t}\r\n});\r\n\r\nconst getAssetLifeCycleParams = async (assetServiceLifeId) => {\r\n\tconst values = {\r\n\t\tmin: DEFAULT_MINIMUM_ASSET_LIFECYCLE,\r\n\t\tmax: DEFAULT_MAXIMUM_ASSET_LIFECYCLE,\r\n\t\tauto: null,\r\n\t};\r\n\r\n\tif (assetServiceLifeId) {\r\n\t\tconst assetServiceLife = await assetServiceLifeStore.byKey(\r\n\t\t\tassetServiceLifeId\r\n\t\t)\r\n\t\tif (!assetServiceLife) return values;\r\n\t\tconst assetServiceLifeTextValue = assetServiceLife.name;\r\n\t\tif (assetServiceLifeTextValue.startsWith(\"to\")) {\r\n\t\t\tconst assetLifeCycle = parseInt(\r\n\t\t\t\tassetServiceLifeTextValue.replace(\"to\", \"\").trim()\r\n\t\t\t);\r\n\r\n\t\t\tvalues.min = assetLifeCycle;\r\n\t\t\tvalues.max = assetLifeCycle;\r\n\t\t\tvalues.auto = assetLifeCycle;\r\n\t\t} else {\r\n\t\t\tconst minMaxRange = assetServiceLifeTextValue.split(\"to\");\r\n\t\t\tminMaxRange.sort(function (x, y) {\r\n\t\t\t\t// Sort list\r\n\t\t\t\treturn parseInt(x) - parseInt(y);\r\n\t\t\t});\r\n\t\t\tlet [minimumLifeCycle, maximumLifecycle] = [\r\n\t\t\t\tminMaxRange[0],\r\n\t\t\t\tminMaxRange[1],\r\n\t\t\t];\r\n\r\n\t\t\tvalues.min = parseInt(minimumLifeCycle);\r\n\t\t\tvalues.max = parseInt(maximumLifecycle);\r\n\t\t}\r\n\t}\r\n\r\n\treturn values;\r\n};\r\n\r\nconst uom = createStore({\r\n\tkey: 'Id',\r\n\tloadUrl: '/api/unitofmeasures/',\r\n\tloadMode: 'raw',\r\n\tonBeforeSend: (method, ajaxOptions) => {\r\n\t\tajaxOptions.xhrFields = { withCredentials: true };\r\n\t}\r\n});\r\n\r\nconst roomType = createStore({\r\n\tkey: 'Id',\r\n\tloadUrl: '/api/roomtypes/',\r\n\tloadMode: 'raw',\r\n\tonBeforeSend: (method, ajaxOptions) => {\r\n\t\tajaxOptions.xhrFields = { withCredentials: true };\r\n\t}\r\n});\r\n\r\nconst assetServiceLife = createStore({\r\n\tkey: 'Id',\r\n\tloadUrl: '/api/assetentryservicelives/',\r\n\tloadMode: 'raw',\r\n\tonBeforeSend: (method, ajaxOptions) => {\r\n\t\tajaxOptions.xhrFields = { withCredentials: true };\r\n\t}\r\n});\r\n\r\nconst assetEdit = new CustomStore({\r\n\tkey: 'id',\r\n\tload: (id) => {\r\n\t\treturn fetch(\"/api/assets/\" + id, {\r\n\t\t\tmethod: \"GET\",\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t}\r\n\t\t}).then(result => result.json())\r\n\t\t\t.catch(handleErrors);\r\n\t}\r\n});\r\n\r\nfunction handleErrors(response) {\r\n\tif (!response.ok) {\r\n\t\talert(\"Editing items is not available while offline.\");\r\n\t\tthrow Error(response.statusText);\r\n\t}\r\n\treturn response;\r\n}\r\n\r\n// Using the current minium ID value, generate a new negative ID for Offline saving\r\nfunction generateNewOfflineId(currentMinimumId) {\r\n\tlet newId;\r\n\tif (Number.isInteger(currentMinimumId)) {\r\n\t\tif (currentMinimumId > 0) {\r\n\t\t\tnewId = -1;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tnewId = currentMinimumId - 1;\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\tnewId = -1;\r\n\t}\r\n\treturn newId;\r\n}\r\n\r\nasync function addRoomAsync(values) {\r\n\tvar jsonString = JSON.stringify(values);\r\n\tconst response = await fetch('/api/studyrooms/', {\r\n\t\tmethod: \"POST\",\r\n\t\tbody: jsonString,\r\n\t\theaders: {\r\n\t\t\t'Content-Type': 'application/json'\r\n\t\t}\r\n\t}).then((response) => response.json())\r\n\t\t.then((newRoom) => {\r\n\t\t\treturn newRoom;\r\n\t\t});\r\n\t// .then(handleErrors);\r\n\r\n\tconst syncRoomLookup = async () => {\r\n\t\tconst a = await response;\r\n\t\tstudyRoomsLookup.push({ 'id': a.id, 'name': a.name, 'studystructureid': a.studyStructureId });\r\n\t\treturn a.id;\r\n\t};\r\n\r\n\treturn syncRoomLookup();\r\n}\r\n\r\nasync function addAssetAsync(formValues) {\r\n\tvar jsonString = JSON.stringify(formValues);\r\n\t//var fileName = \"assets.json\"\r\n\t//const assetBlob = new Blob([jsonString],\r\n\t//\t{\r\n\t//\t\ttype: 'application/json',\r\n\t//\t\tname: fileName\r\n\t//\t});\r\n\r\n\t//saveAs(assetBlob, fileName);\r\n\r\n\t//console.log(\"jsonString\", jsonString);\r\n\tif (formValues.EditAssetId == \"0\" || formValues.Id == 0) {\r\n\t\t// New Asset\r\n\t\tconst response = await fetch('/api/assets/', {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\tbody: jsonString,\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t}\r\n\t\t}).then((response) => {\r\n\t\t\tif (response.status >= 200 && response.status < 300) {\r\n\t\t\t\tconst dateTime = getCurrentDateTime();\r\n\r\n\t\t\t\tnotify({\r\n\t\t\t\t\tmessage: 'You successfully added the asset ' + formValues.AssetSubTypeName + ' on ' + dateTime,\r\n\t\t\t\t\tposition: {\r\n\t\t\t\t\t\tmy: 'center top',\r\n\t\t\t\t\t\tat: 'center top'\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 'success', 5000);\r\n\t\t\t\treturn response.json();\r\n\t\t\t} else {\r\n\t\t\t\tnotify({\r\n\t\t\t\t\tmessage: 'Asset was not added. Try again.',\r\n\t\t\t\t\tposition: {\r\n\t\t\t\t\t\tmy: 'center top',\r\n\t\t\t\t\t\tat: 'center top'\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 'error', 5000);\r\n\t\t\t}\r\n\t\t})\r\n\t\t\t.then((newAsset) => {\r\n\t\t\t\treturn newAsset;\r\n\t\t\t\tconsole.log('new Asset: ', newAsset);\r\n\t\t\t});\r\n\r\n\t\tconst syncAssetLookup = async () => {\r\n\t\t\tconst a = await response;\r\n\t\t\tconsole.log('a: ', a)\r\n\t\t\tif (response) {\r\n\t\t\t\taddToStudyAssetsLookup(a.id, a.assetSubTypeName, a.studyRoomId, formValues.CurrentUser.name, a.assetManufacturerName, a.description);\r\n\t\t\t\treturn a.id;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn syncAssetLookup();\r\n\t}\r\n\telse {\r\n\t\t// Editing Existing Asset\r\n\t\tlet useId = formValues.EditAssetId;\r\n\t\tif (formValues.Id > 0) {\r\n\t\t\tuseId = formValues.Id;\r\n\t\t}\r\n\t\tconst response = await fetch('/api/assets/' + useId, {\r\n\t\t\tmethod: 'PUT',\r\n\t\t\tbody: jsonString,\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',// Remove on PUT because response is blank\r\n\t\t\t\t'Authorization': \"Bearer \" + authService.getAccessToken()\r\n\t\t\t}\r\n\t\t}).then(result => {\r\n\t\t\tif (result.status >= 200 && result.status < 300) {\r\n\r\n\t\t\t\tconst dateTime = getCurrentDateTime();\r\n\r\n\t\t\t\tnotify({\r\n\t\t\t\t\tmessage: 'You successfully edited the asset ' + formValues.AssetSubTypeName + ' on ' + dateTime,\r\n\t\t\t\t\tposition: {\r\n\t\t\t\t\t\tmy: 'center top',\r\n\t\t\t\t\t\tat: 'center top'\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 'success', 5000);\r\n\r\n\t\t\t\treturn result;\r\n\t\t\t} else {\r\n\t\t\t\tnotify({\r\n\t\t\t\t\tmessage: 'Asset was not edited. Try again.',\r\n\t\t\t\t\tposition: {\r\n\t\t\t\t\t\tmy: 'center top',\r\n\t\t\t\t\t\tat: 'center top'\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 'error', 5000);\r\n\t\t\t}\r\n\t\t})\r\n\t\t.catch(error => {\r\n\t\t\talert(\"Editing items is not available while offline.\");\r\n\t\t\tconsole.error('Error:', error);\r\n\t\t});\r\n\r\n\t\tconst syncAssetLookup = async () => {\r\n\t\t\tconst a = await response;\r\n\t\t\t//console.log(formValues.EditAssetId, formValues.AssetSubTypeName, formValues.StudyRoomId, formValues.CurrentUser.name);\r\n\t\t\tif (response) {\r\n\t\t\t\taddToStudyAssetsLookup(formValues.EditAssetId,\r\n\t\t\t\t\tformValues.AssetSubTypeName,\r\n\t\t\t\t\tformValues.StudyRoomId,\r\n\t\t\t\t\tformValues.CurrentUser.name,\r\n\t\t\t\t\tformValues.AssetManufacturerName,\r\n\t\t\t\t\tformValues.Description);\r\n\r\n\t\t\t\treturn a;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn syncAssetLookup();\r\n\r\n\t}\r\n}\r\n\r\nfunction getCurrentDateTime() {\r\n\tconst today = new Date();\r\n\tconst date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();\r\n\tconst time = today.getHours() + \":\" + today.getMinutes() + \":\" + today.getSeconds();\r\n\treturn date + ' ' + time;\r\n}\r\n\r\nexport default CRSEntry;\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { RoomType } from \"../types/roomType\";\r\n\r\nconst KEY_VALUE: keyof RoomType = \"id\";\r\n\r\ntype KeyType = RoomType[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = \"/api/roomtypes/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const roomTypeStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json());\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n }\r\n})\r\n","import React, { useState } from \"react\";\r\n\r\nimport { CheckBox } from \"devextreme-react\";\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n FormItem,\r\n Grouping,\r\n HeaderFilter,\r\n Lookup,\r\n Pager,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\nimport { roomTypeStore } from \"../stores/roomTypeStore\";\r\nimport { studyRoomStore } from \"../stores/studyRoomStore\";\r\nimport { studyStructureStore } from \"../stores/studyStructureStore\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst StudyRoom = () => {\r\n const [autoExpandAll, setAutoExpandAll] = useState(false);\r\n\r\n const toggleAutoExpandAll = () => {\r\n setAutoExpandAll((isExpanded) => !isExpanded);\r\n };\r\n \r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = {\r\n store: studyRoomStore,\r\n}\r\n\r\nexport default StudyRoom;\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { StructureLocationType } from \"../types/structureLocationType\";\r\n\r\nconst KEY_VALUE: keyof StructureLocationType = \"id\";\r\n\r\ntype KeyType = StructureLocationType[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = \"/api/structurelocationtypes/\";\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const structureLocationTypeStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json())\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n } \r\n});\r\n","import React, { useState } from \"react\";\r\n\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n FormItem,\r\n HeaderFilter,\r\n Lookup,\r\n Pager,\r\n PatternRule,\r\n RequiredRule,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\nimport { structureLocationTypeStore } from \"../stores/structureLocationTypeStore\";\r\nimport { studyStructureStore } from \"../stores/studyStructureStore\";\r\nimport { ToolbarPreparingEventingInternal } from \"../types/toolbarPreparingEventInternal\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nexport const StudyStructure = () => {\r\n const [copyColumnsEnabled, setCopyColumnsEnabled] = useState(false);\r\n\r\n const onToolbarPreparing = (e: ToolbarPreparingEventingInternal) => {\r\n e.toolbarOptions?.items?.unshift(\r\n {\r\n location: \"before\",\r\n widget: \"dxButton\",\r\n options: {\r\n text: copyColumnsEnabled\r\n ? \"Show All Columns\"\r\n : \"Show Excel Copy Columns\",\r\n onClick: toggleCopyColumnsEnabled,\r\n },\r\n }\r\n );\r\n };\r\n\r\n const toggleCopyColumnsEnabled = () => {\r\n setCopyColumnsEnabled((isEnabled) => !isEnabled);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = {\r\n store: studyStructureStore,\r\n}\r\n\r\nexport default StudyStructure;\r\n","import { BudgetContingencySales } from \"../types/budgetContengencySales\";\r\nimport { createDataFields } from \"../utility functions/createDataFields\";\r\n\r\nexport const BUDGET_CONTENGENCY_SALES_DATA_FIELDS = createDataFields()({\r\n ID: \"id\",\r\n STUDY_ID: \"studyId\",\r\n SALES_TAX_RATE: \"salesTaxRate\",\r\n BUDGETARY_CONTINGENCY_SALES_PERCENTAGE: \"budgetaryContingencyPercentage\",\r\n INFLATION_RATE: \"inflationRate\"\r\n})","import { StudyCampus } from \"../types/studyCampus\";\r\nimport { createDataFields } from \"../utility functions/createDataFields\";\r\n\r\nexport const STUDY_CAMPUS_DATA_FIELDS = createDataFields()({\r\n ID: \"id\",\r\n STUDY_ID: \"studyId\",\r\n NAME: \"name\",\r\n STREET: \"street\",\r\n ZIPCODE: \"zipCode\",\r\n CITY: \"city\",\r\n STATE_PROVINCE: \"stateProvince\",\r\n COUNTRY: \"country\",\r\n DATE_CREATED: \"dateCreated\",\r\n CREATED_BY: \"createdBy\",\r\n DATE_MODIFIED: \"dateModified\",\r\n MODIFIED_BY: \"modifiedBy\"\r\n})","import { Study } from \"../types/study\";\r\nimport { createDataFields } from \"../utility functions/createDataFields\";\r\n\r\nexport const STUDY_DATA_FIELDS = createDataFields()({\r\n ID: \"id\",\r\n ENTITY_ID: \"entityId\",\r\n CLUB_NAME: \"clubName\",\r\n NAME: \"name\",\r\n CLIENT_NAME: \"clientName\",\r\n CLIENT_SALUTATION: \"clientSalutation\",\r\n CLIENT_TITLE: \"clientTitle\",\r\n COMPANY_ID: \"companyId\",\r\n YEAR: \"year\",\r\n DATE_OF_EXECUTIVE_REPORT: \"dateOfExecutiveReport\",\r\n CB_REPRESENTATIVE: \"cB_Representative\",\r\n CB_TITLE_OF_REPRESENTATIVE: \"cB_TitleOfRepresentative\",\r\n FILE_NAME: \"fileName\",\r\n DATE_CREATED: \"dateCreated\",\r\n CREATED_BY: \"createdBy\",\r\n DATE_MODIFIED: \"dateModified\",\r\n MODIFIED_BY: \"modifiedBy\",\r\n COMPASS_PUBLISHED_BY: \"compassPublishBy\",\r\n COMPASS_PUBLISH_DATE: \"compassPublishDate\",\r\n STUDY_CAMPUS: \"studyCampus\",\r\n BUDGETARY_CONTINGENCY_SALES: \"budgetaryContingencySales\"\r\n})","import CustomStore from \"devextreme/data/custom_store\";\r\nimport { ClubList } from \"../types/clubList\";\r\n\r\nconst KEY_VALUE: keyof ClubList = \"id\";\r\n\r\ntype KeyType = ClubList[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst CLUBS_LIST_URL = \"/api/clublists/\";\r\n\r\nconst NEW_CLUBS_LIST_URL = CLUBS_LIST_URL + \"uploadnewclubsonly/\";\r\n\r\nexport const newClubListOnlyStore = new CustomStore({\r\n loadMode: \"raw\",\r\n key: KEY_VALUE,\r\n byKey: async (key) =>\r\n await fetch(CLUBS_LIST_URL + key, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json()),\r\n load: async () =>\r\n await fetch(NEW_CLUBS_LIST_URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json()),\r\n});\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport { Study } from \"../types/study\";\r\n\r\nconst KEY_VALUE: keyof Study = \"id\";\r\n\r\ntype KeyType = Study[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nexport const STUDIES_URL = \"/api/studies/\";\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? STUDIES_URL + key : STUDIES_URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const studyStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n insert: async (values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(STUDIES_URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }).then(handleErrors).then(result=>result.json())\r\n },\r\n update: async (key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n await fetch(STUDIES_URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }).then(handleErrors);\r\n },\r\n remove: async (key) => {\r\n await fetch(STUDIES_URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }).then(handleErrors);\r\n },\r\n});","import SelectBox, { ISelectBoxOptions } from \"devextreme-react/select-box\";\r\n\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport React, { useRef } from \"react\";\r\nimport { studyStore } from \"../stores/studyStore\";\r\nimport { OmitStrict } from \"../types/omitStrict\";\r\nimport { Study } from \"../types/study\";\r\n\r\ntype StudySelectProps = OmitStrict<\r\n ISelectBoxOptions,\r\n \"dataSource\" | \"displayExpr\" | \"valueExpr\"\r\n>;\r\n\r\nexport const StudySelect = ({\r\n placeholder = \"Choose Existing Study...\",\r\n searchEnabled = true,\r\n showClearButton = true,\r\n ...props\r\n}: StudySelectProps) => {\r\n const selectBox = useRef(null)\r\n\r\n const valueExpr: keyof Study = \"id\";\r\n const displayExpr: keyof Study = \"clubName\"; \r\n\r\n const onOptionChanged = (e: { name?: string; value?: boolean }) => {\r\n /*The below codeblock needed to be added in order to re-populate \r\n the selection items after the clear button was clicked.*/\r\n if (e.name === \"isActive\" && e.value === false) {\r\n const dataSource = selectBox.current?.instance.getDataSource();\r\n if (dataSource) {\r\n dataSource.load();\r\n }\r\n }\r\n if(props.onOptionChanged){\r\n props.onOptionChanged(e)\r\n }\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst dataSource = new DataSource({\r\n store: studyStore\r\n})\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\n\r\nimport Button from \"devextreme-react/button\";\r\nimport { Template } from \"devextreme-react/core/template\";\r\nimport DataGrid, {\r\n Column,\r\n ColumnFixing,\r\n Button as DGButton,\r\n Editing,\r\n FormItem,\r\n HeaderFilter,\r\n Lookup,\r\n Pager,\r\n Paging,\r\n RangeRule,\r\n RequiredRule,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\nimport LoadPanel from \"devextreme-react/load-panel\";\r\n\r\nimport { ScrollView } from \"devextreme-react\";\r\nimport Popup from \"devextreme-react/popup\";\r\nimport notify from \"devextreme/ui/notify\";\r\nimport parse from \"html-react-parser\";\r\nimport { BUDGET_CONTENGENCY_SALES_DATA_FIELDS } from \"../constants/budgetContingencySalesDataFields\";\r\nimport { FORMAT } from \"../constants/format\";\r\nimport { STUDY_CAMPUS_DATA_FIELDS } from \"../constants/studyCampusDataFields\";\r\nimport { STUDY_DATA_FIELDS } from \"../constants/studyDataFields\";\r\nimport { newClubListOnlyStore } from \"../stores/newClubListOnlyStore\";\r\nimport { studyStore } from \"../stores/studyStore\";\r\nimport { EditorPreparingEventInternal } from \"../types/editorPreparingEventInternal\";\r\nimport { Study } from \"../types/study\";\r\nimport { ToolbarPreparingEventingInternal } from \"../types/toolbarPreparingEventInternal\";\r\nimport { StudySelect } from \"./StudySelect\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\nconst defaultPageSize = 10;\r\n\r\nconst TOOLBAR_TEMPLATE_NAME = \"chooseStudy\";\r\ninterface Row {\r\n data: Study;\r\n}\r\n\r\nconst StudySummary = () => {\r\n const [studyId, setStudyId] = useState(null);\r\n const [popupVisible, setPopupVisible] = useState(false);\r\n const [publishError, setPublishError] = useState(null);\r\n const dataGridRef = useRef(null);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const togglePopupVisible = () => {\r\n setPopupVisible((isVisible) => !isVisible);\r\n };\r\n\r\n const onChooseUploadStudy = () => {\r\n window.location.href = \"/study-upload\";\r\n };\r\n\r\n const onStudyChanged = (e: { value?: number }) => {\r\n let newValue = e.value || null;\r\n setStudyId(newValue);\r\n };\r\n\r\n const onPublishButtonClick = async (selectedStudyId: number) => {\r\n setLoading(true); // progress bar\r\n try {\r\n const response = await fetch(\r\n \"/api/publish/\" + selectedStudyId,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }\r\n );\r\n\r\n const result = await response.json();\r\n\r\n if (!response.ok) {\r\n throw new Error(\"Network response was not ok\");\r\n } else if(!result.status) {\r\n setPublishError(result.message)\r\n }else{\r\n notify(\r\n {\r\n message: \"Study published successfully.\",\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"success\",\r\n 3000\r\n );\r\n \r\n if (dataGridRef.current) {\r\n dataGridRef.current.instance.refresh();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(\r\n \"There was a problem with the fetch operation:\",\r\n error\r\n );\r\n notify(\r\n {\r\n message:\r\n \"An error occurred while publishing the study. Please try again.\",\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"error\",\r\n 3000\r\n );\r\n } finally {\r\n setLoading(false); // Hide the progress bar\r\n }\r\n };\r\n\r\n const isPublishButtonVisible = (e: { row: Row }) => {\r\n return e.row.data.compassPublishDate === null;\r\n };\r\n\r\n const onSaveNewStudyClick = async () => {\r\n try {\r\n var jsonString = JSON.stringify({ studyId: studyId });\r\n\r\n await fetch(\"/api/studycontext/\" + studyId, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }).then(handleErrors);\r\n\r\n notify(\r\n {\r\n message: \"Study loaded successfully.\",\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"success\",\r\n 3000\r\n );\r\n\r\n if (dataGridRef.current) {\r\n dataGridRef.current.instance.refresh();\r\n }\r\n\r\n window.location.href = \"/crs-entry\";\r\n } catch {\r\n notify(\r\n {\r\n message:\r\n \"An error occured while loading the study. Please try again.\",\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"error\",\r\n 3000\r\n );\r\n }\r\n };\r\n\r\n const onToolbarPreparing = (e: ToolbarPreparingEventingInternal) => {\r\n e.toolbarOptions?.items?.unshift({\r\n location: \"after\",\r\n template: TOOLBAR_TEMPLATE_NAME,\r\n });\r\n };\r\n\r\n const hideInfo = () => {\r\n setStudyId(null);\r\n togglePopupVisible();\r\n };\r\n\r\n const hidePublishErrors = () => {\r\n setPublishError(null);\r\n };\r\n\r\n const toolbarItemRender = () => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n };\r\n\r\n const refreshDataGrid = () => {\r\n dataGridRef.current?.instance.refresh();\r\n };\r\n\r\n useEffect(() => {\r\n refreshDataGrid();\r\n }, [studyId]);\r\n\r\n //Only allow choosing the club when inserting a study.\r\n const onEditorPreparing = (e: EditorPreparingEventInternal) => {\r\n if (\r\n e.dataField === STUDY_DATA_FIELDS.ENTITY_ID &&\r\n e.parentType === \"dataRow\" &&\r\n e.editorOptions\r\n ) {\r\n e.editorOptions.disabled = !e.row?.isNewRow;\r\n }\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n onPublishButtonClick(e.row.data.id)\r\n }\r\n />\r\n \r\n\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {publishError && (\r\n \r\n {parse(publishError)}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nfunction handleErrors(response: Response) {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n}\r\n\r\nconst gridDataSource = {\r\n store: studyStore,\r\n};\r\n\r\nexport default StudySummary;\r\n","import React, { useState } from \"react\";\r\n\r\nimport Box, { Item } from \"devextreme-react/box\";\r\nimport FileUploader from \"devextreme-react/file-uploader\";\r\nimport SelectBox from \"devextreme-react/select-box\";\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport parse from \"html-react-parser\";\r\nimport { Container } from \"reactstrap\";\r\nimport { newClubListOnlyStore } from \"../stores/newClubListOnlyStore\";\r\nimport { StudySelect } from \"./StudySelect\";\r\n\r\nconst StudyUpload = () => {\r\n const [selectedFiles, setSelectedFiles] = useState();\r\n const [uploadResponse, setUploadResponse] = useState(\"\");\r\n const [uploadNewStudyUrl, setUploadNewStudyUrl] = useState(\r\n \"/api/upload\"\r\n );\r\n const [replaceStudyUrl, setReplaceStudyUrl] = useState(\r\n \"/api/replace\"\r\n );\r\n\r\n const onNewStudyClubIdChanged = (e: { value?: number }) => {\r\n const selectedClubId = e.value;\r\n if (selectedClubId) {\r\n setUploadNewStudyUrl((currentUrl) =>\r\n updateQueryStringParameter(\r\n currentUrl,\r\n \"id\",\r\n selectedClubId\r\n )\r\n );\r\n }\r\n };\r\n\r\n const onReplaceStudyIdChanged = (e: { value?: number }) => {\r\n const selectedStudyId = e.value;\r\n if (selectedStudyId) {\r\n setReplaceStudyUrl((currentUrl) =>\r\n updateQueryStringParameter(\r\n currentUrl,\r\n \"id\",\r\n selectedStudyId\r\n )\r\n );\r\n }\r\n };\r\n\r\n const onSelectedFilesChanged = (e: { value?: File[] }) => {\r\n setUploadResponse(\"\")\r\n setSelectedFiles(e.value);\r\n };\r\n\r\n const onUploaded = (e: { request?: XMLHttpRequest }) => {\r\n const request = e.request;\r\n if (request) {\r\n var resp = JSON.parse(request.response);\r\n setUploadResponse(resp.message);\r\n }\r\n };\r\n\r\n const updateQueryStringParameter = (\r\n uploadUrl: string,\r\n key: string,\r\n value: number\r\n ) => {\r\n var re = new RegExp(\"([?&])\" + key + \"=.*?(&|$)\", \"i\");\r\n var separator = uploadUrl.indexOf(\"?\") !== -1 ? \"&\" : \"?\";\r\n if (uploadUrl.match(re)) {\r\n return uploadUrl.replace(re, \"$1\" + key + \"=\" + value + \"$2\");\r\n } else {\r\n return uploadUrl + separator + key + \"=\" + value;\r\n }\r\n };\r\n\r\n const clubListDataSource = new DataSource({\r\n store: newClubListOnlyStore,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n

Upload New Study

\r\n

\r\n Note: Only new clubs that have no uploaded studies \r\n can be selected. Use Replace Existing Study to replace an existing study.\r\n

\r\n

Choose a Club for this Study:

\r\n \r\n \r\n
\r\n \r\n

Replace Existing Study

\r\n

\r\n Warning: This will completely overwrite the chosen study\r\n in the database. Make sure you are choosing the correct\r\n study to replace.\r\n

\r\n

Choose an Existing Study to Completely Replace:

\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n {selectedFiles && (\r\n 0 ? \"block\" : \"none\",\r\n }}\r\n >\r\n
\r\n

File Details

\r\n {selectedFiles.map((file, i) => {\r\n const lastModifiedDate = new Date(\r\n file.lastModified\r\n );\r\n return (\r\n
\r\n \r\n {`Name: ${file.name}`}\r\n
\r\n
\r\n \r\n {`Size ${file.size}`}\r\n
\r\n
\r\n \r\n {`Type ${file.size}`}\r\n
\r\n
\r\n {`Last Modified Date: ${lastModifiedDate}`}\r\n
\r\n );\r\n })}\r\n
\r\n \r\n )}\r\n 0\r\n ? \"block\"\r\n : \"none\",\r\n }}\r\n >\r\n
\r\n

Upload Results

\r\n
{parse(uploadResponse)}
\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default StudyUpload;\r\n","\r\nconst API_BASE_URL = '/api/dashboard';\r\n\r\nexport interface ActivityLogDto {\r\n id: number;\r\n dateTime: string; \r\n productId: number;\r\n userId: string | null;\r\n userName: string | null;\r\n clubId: number;\r\n sessionId: string | null;\r\n detail: string | null;\r\n className: string | null;\r\n methodName: string | null;\r\n eventType: string | null;\r\n description: string | null;\r\n errorDetails: string | null;\r\n}\r\n\r\nexport interface LoginCount {\r\n date: Date; \r\n count: number;\r\n}\r\n\r\nexport const fetchLoginCounts = async (): Promise => {\r\n const response = await fetch('/api/dashboard/login-counts');\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: LoginCount[] = await response.json();\r\n return data;\r\n};\r\n\r\nexport interface ApiUsage {\r\n apiName: string;\r\n count: number;\r\n}\r\n\r\nexport const fetchApiUsage = async (): Promise => {\r\n const response = await fetch('/api/dashboard/api-usage');\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: ApiUsage[] = await response.json();\r\n return data;\r\n};\r\n\r\nexport const fetchActivityLogs = async (): Promise => {\r\n const response = await fetch(`${API_BASE_URL}/activity-logs`);\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: ActivityLogDto[] = await response.json();\r\n return data;\r\n};\r\n\r\nexport interface ActionCount {\r\n methodName: string;\r\n actionCount: number;\r\n}\r\n\r\nexport const fetchActionCounts = async (): Promise => {\r\n const response = await fetch(`${API_BASE_URL}/actions`);\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: ActionCount[] = await response.json();\r\n return data;\r\n};\r\n\r\nexport interface ErrorLog extends ActivityLogDto {\r\n \r\n}\r\n\r\nexport const fetchErrorLogs = async (): Promise => {\r\n const response = await fetch('/api/dashboard/errors');\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: ErrorLog[] = await response.json();\r\n return data;\r\n};\r\n\r\nexport interface UsageData {\r\n date: Date;\r\n usage: number;\r\n}\r\n\r\nexport const fetchUsageGraphs = async (): Promise => {\r\n const response = await fetch('/api/dashboard/usage-graphs');\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: UsageData[] = await response.json();\r\n return data;\r\n};\r\n\r\n\r\n// Function with query parameters\r\nexport const fetchAssetActions = async (\r\n startDate?: Date,\r\n endDate?: Date\r\n): Promise => {\r\n const url = new URL(`${API_BASE_URL}/asset-actions`, window.location.origin);\r\n if (startDate) url.searchParams.append('startDate', startDate.toISOString());\r\n if (endDate) url.searchParams.append('endDate', endDate.toISOString());\r\n\r\n const response = await fetch(url.toString());\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: ActivityLogDto[] = await response.json();\r\n return data;\r\n};\r\n\r\nexport interface StudyCounts {\r\n totalStudies: number;\r\n publishedStudies: number;\r\n}\r\n\r\nexport interface StudiesByCreator {\r\n createdBy: string;\r\n studyCount: number;\r\n}\r\n\r\n// Function to fetch study counts\r\nexport const fetchStudyCounts = async (): Promise => {\r\n const response = await fetch('/api/dashboard/study-counts');\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: StudyCounts = await response.json();\r\n return data;\r\n};\r\n\r\n// Function to fetch studies by creator\r\nexport const fetchStudiesByCreator = async (): Promise => {\r\n const response = await fetch('/api/dashboard/studies-by-creator');\r\n if (!response.ok) {\r\n throw new Error('Network response was not ok');\r\n }\r\n const data: StudiesByCreator[] = await response.json();\r\n return data;\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport {\r\n DataGrid,\r\n Column,\r\n Pager,\r\n Paging,\r\n FilterRow,\r\n FilterPanel,\r\n SearchPanel,\r\n HeaderFilter\r\n} from 'devextreme-react/data-grid';\r\nimport { fetchActivityLogs, ActivityLogDto } from '../services/apiService';\r\n\r\nconst ActivityLogsGrid: React.FC = () => {\r\n const [data, setData] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(null);\r\n\r\n useEffect(() => {\r\n const getData = async () => {\r\n try {\r\n const logs = await fetchActivityLogs();\r\n setData(logs);\r\n } catch (err) {\r\n console.error('Error fetching activity logs:', err);\r\n setError(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n getData();\r\n }, []);\r\n\r\n if (loading) return
Loading activity logs...
;\r\n if (error) return
Error loading activity logs: {error.message}
;\r\n\r\n return (\r\n
\r\n
\r\n

Activity Logs

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ActivityLogsGrid;\r\n","import React, { useEffect, useState } from 'react';\r\nimport {\r\n Chart,\r\n Series,\r\n ArgumentAxis,\r\n ValueAxis,\r\n Label,\r\n Tooltip,\r\n ZoomAndPan\r\n} from 'devextreme-react/chart';\r\nimport { fetchLoginCounts, LoginCount } from '../services/apiService';\r\n\r\nconst LoginCountsChart: React.FC = () => {\r\n const [data, setData] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(null);\r\n\r\n useEffect(() => {\r\n const getData = async () => {\r\n try {\r\n const loginCounts = await fetchLoginCounts();\r\n // Parse date strings into Date objects\r\n const parsedData = loginCounts.map((item) => ({\r\n ...item,\r\n date: new Date(item.date),\r\n }));\r\n setData(parsedData);\r\n } catch (err) {\r\n console.error('Error fetching login counts:', err);\r\n setError(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n getData();\r\n }, []);\r\n\r\n if (loading) return
Loading login counts...
;\r\n if (error) return
Error loading login counts: {error.message}
;\r\n\r\n return (\r\n
\r\n

User Login Counts Over Time

\r\n \r\n \r\n \r\n value.toLocaleDateString(undefined, {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric',\r\n }),\r\n }}\r\n rotationAngle={45}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default LoginCountsChart;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { PieChart, Series, Label, Connector, Tooltip } from 'devextreme-react/pie-chart';\r\nimport { fetchApiUsage, ApiUsage } from '../services/apiService';\r\n\r\nconst ApiUsageChart: React.FC = () => {\r\n const [data, setData] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(null);\r\n\r\n useEffect(() => {\r\n const getData = async () => {\r\n try {\r\n const apiUsageData = await fetchApiUsage();\r\n setData(apiUsageData);\r\n } catch (err) {\r\n console.error('Error fetching API usage data:', err);\r\n setError(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n getData();\r\n }, []);\r\n\r\n if (loading) return
Loading API usage data...
;\r\n if (error) return
Error loading API usage data: {error.message}
;\r\n\r\n return (\r\n
\r\n

Frequently Used APIs

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ApiUsageChart;\r\n","import React, { useEffect, useState } from 'react';\r\nimport {\r\n Chart,\r\n Series,\r\n ArgumentAxis,\r\n ValueAxis,\r\n Legend,\r\n Tooltip,\r\n Label,\r\n ZoomAndPan,\r\n ScrollBar,\r\n} from 'devextreme-react/chart';\r\nimport { fetchUsageGraphs, UsageData } from '../services/apiService';\r\n\r\nconst UsageGraphsChart: React.FC = () => {\r\n const [data, setData] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(null);\r\n\r\n useEffect(() => {\r\n const getData = async () => {\r\n try {\r\n const usageData = await fetchUsageGraphs();\r\n // Parse date strings into Date objects\r\n const parsedData = usageData.map((item) => ({\r\n ...item,\r\n date: new Date(item.date),\r\n }));\r\n setData(parsedData);\r\n } catch (err) {\r\n console.error('Error fetching usage data:', err);\r\n setError(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n getData();\r\n }, []);\r\n\r\n if (loading) return
Loading usage data...
;\r\n if (error) return
Error loading usage data: {error.message}
;\r\n\r\n return (\r\n
\r\n

Usage Over Time

\r\n \r\n \r\n \r\n value.toLocaleDateString(undefined, {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric',\r\n }),\r\n }}\r\n rotationAngle={45}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default UsageGraphsChart;\r\n","import React, { useEffect, useState } from 'react';\r\nimport {\r\n Chart,\r\n Series,\r\n ArgumentAxis,\r\n Label,\r\n Tooltip,\r\n ZoomAndPan,\r\n ScrollBar,\r\n} from 'devextreme-react/chart';\r\nimport { fetchActionCounts, ActionCount } from '../services/apiService';\r\n\r\nconst ActionCountsChart: React.FC = () => {\r\n const [data, setData] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(null);\r\n\r\n useEffect(() => {\r\n const getData = async () => {\r\n try {\r\n const actionCounts = await fetchActionCounts();\r\n setData(actionCounts);\r\n } catch (err) {\r\n console.error('Error fetching action counts:', err);\r\n setError(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n getData();\r\n }, []);\r\n\r\n if (loading) return
Loading action counts...
;\r\n if (error) return
Error loading action counts: {error.message}
;\r\n\r\n return (\r\n
\r\n

Action Counts by API

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ActionCountsChart;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { fetchStudyCounts, StudyCounts } from '../services/apiService';\r\nimport './StudyCountsCard.css'; // Import the CSS file for styling\r\n\r\nconst StudyCountsCard: React.FC = () => {\r\n const [counts, setCounts] = useState(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(null);\r\n\r\n useEffect(() => {\r\n const getCounts = async () => {\r\n try {\r\n const data = await fetchStudyCounts();\r\n setCounts(data);\r\n } catch (err) {\r\n console.error('Error fetching study counts:', err);\r\n setError(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n getCounts();\r\n }, []);\r\n\r\n if (loading) return
Loading study counts...
;\r\n if (error) return
Error loading study counts: {error.message}
;\r\n\r\n return (\r\n
\r\n
\r\n
{counts?.totalStudies}
\r\n
Total Studies
\r\n
\r\n
\r\n
{counts?.publishedStudies}
\r\n
Studies have been published to Compass AE
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default StudyCountsCard;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Chart, Series, ArgumentAxis, Label, Tooltip, ZoomAndPan } from 'devextreme-react/chart';\r\nimport { fetchStudiesByCreator, StudiesByCreator } from '../services/apiService';\r\n\r\nconst StudiesByCreatorChart: React.FC = () => {\r\n const [data, setData] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(null);\r\n\r\n useEffect(() => {\r\n const getData = async () => {\r\n try {\r\n const studies = await fetchStudiesByCreator();\r\n setData(studies);\r\n } catch (err) {\r\n console.error('Error fetching studies by creator:', err);\r\n setError(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n getData();\r\n }, []);\r\n\r\n if (loading) return
Loading studies by creator...
;\r\n if (error) return
Error loading studies by creator: {error.message}
;\r\n\r\n return (\r\n
\r\n

CB Representative Study Count

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default StudiesByCreatorChart;\r\n","import React from 'react';\r\nimport './AnalyticsDashboard.css';\r\nimport LoginCountsChart from './LoginCountsChart';\r\nimport ApiUsageChart from './ApiUsageChart';\r\nimport UsageGraphsChart from './UsageGraphsChart';\r\nimport ActionCountsChart from './ActionCountsChart';\r\nimport StudyCountsCard from './StudyCountsCard';\r\nimport StudiesByCreatorChart from './StudiesByCreatorChart';\r\n\r\nconst AnalyticsDashboard: React.FC = () => {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default AnalyticsDashboard;\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { AssetGroup } from \"../types/assetGroup\";\r\n\r\nconst KEY_VALUE: keyof AssetGroup = \"id\";\r\n\r\ntype KeyType = AssetGroup[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst URL = '/api/assetgroups/';\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? URL + key : URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nexport const assetGroupStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(),\r\n\r\n insert: async(values) => {\r\n //The next line desctructures and discards the key value before inserting. Only the other paramaters remain as insertParams.\r\n const {[KEY_VALUE]: _, ...insertParams } = values\r\n var jsonString = JSON.stringify(insertParams);\r\n return await fetch(URL, {\r\n method: \"POST\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(handleErrors).then(result=>result.json())\r\n },\r\n\r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n\r\n remove: async(key) => {\r\n await fetch(URL + key, {\r\n method: \"DELETE\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors)\r\n } \r\n});\r\n","import React from 'react';\r\n\r\nimport 'devextreme/dist/css/dx.common.css';\r\nimport 'devextreme/dist/css/dx.light.css';\r\n\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n FormItem,\r\n HeaderFilter,\r\n Lookup,\r\n Pager,\r\n PatternRule,\r\n RequiredRule,\r\n SearchPanel\r\n} from 'devextreme-react/data-grid';\r\nimport 'devextreme-react/text-area';\r\n\r\nimport 'whatwg-fetch';\r\n\r\nimport 'devextreme/data/array_store';\r\nimport { assetCodingClassStore } from '../stores/assetCodingClassStore';\r\nimport { assetGroupStore } from '../stores/assetGroupStore';\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst AssetCodingClass = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\nconst gridDataSource = {\r\n store: assetCodingClassStore\r\n}\r\n\r\nexport default AssetCodingClass;\r\n","import React from \"react\";\r\n\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n HeaderFilter,\r\n Pager,\r\n PatternRule,\r\n RequiredRule,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\n\r\nimport { assetGroupStore } from \"../stores/assetGroupStore\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst AssetGroup = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = {\r\n store: assetGroupStore,\r\n};\r\n\r\nexport default AssetGroup;\r\n","import React from \"react\";\r\n\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n HeaderFilter,\r\n Pager,\r\n PatternRule,\r\n RequiredRule,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\nimport { assetServiceLifeStore } from \"../stores/assetServiceLifeStore\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst AssetServiceLife = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = {\r\n store: assetServiceLifeStore,\r\n};\r\n\r\nexport default AssetServiceLife;\r\n","import React from 'react';\r\n\r\nimport 'devextreme/dist/css/dx.common.css';\r\nimport 'devextreme/dist/css/dx.light.css';\r\n\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n HeaderFilter,\r\n Pager,\r\n PatternRule,\r\n RequiredRule,\r\n SearchPanel\r\n} from 'devextreme-react/data-grid';\r\nimport DataSource from 'devextreme/data/data_source';\r\nimport { assetTypeStore } from '../stores/assetTypeStore';\r\n\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst AssetType = () => {\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst gridDataSource = new DataSource({\r\n store: assetTypeStore\r\n})\r\n\r\nexport default AssetType;\r\n","import React from \"react\";\r\n\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n HeaderFilter,\r\n Pager,\r\n PatternRule,\r\n RequiredRule,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\nimport { roomTypeStore } from \"../stores/roomTypeStore\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst RoomType = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = {\r\n store: roomTypeStore,\r\n}\r\n\r\nexport default RoomType;\r\n","import React from \"react\";\r\n\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n HeaderFilter,\r\n Pager,\r\n PatternRule,\r\n RequiredRule,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\n\r\nimport { structureLocationTypeStore } from \"../stores/structureLocationTypeStore\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst StructureLocationType = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = {\r\n store: structureLocationTypeStore,\r\n}\r\n\r\nexport default StructureLocationType;\r\n","import React from \"react\";\r\n\r\nimport DataGrid, {\r\n Column,\r\n Editing,\r\n HeaderFilter,\r\n Pager,\r\n PatternRule,\r\n RequiredRule,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\nimport { unitOfMeasureStore } from \"../stores/unitOfMeasureStore\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nexport const UnitOfMeasure = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst gridDataSource = {\r\n store: unitOfMeasureStore,\r\n};\r\n\r\nexport default UnitOfMeasure;\r\n","import React from 'react'\r\nimport { Component } from 'react';\r\nimport authService from './AuthorizeService';\r\nimport { AuthenticationResultStatus } from './AuthorizeService';\r\nimport { LoginActions, QueryParameterNames, ApplicationPaths } from './ApiAuthorizationConstants';\r\n\r\n// The main responsibility of this component is to handle the user's login process.\r\n// This is the starting point for the login process. Any component that needs to authenticate\r\n// a user can simply perform a redirect to this component with a returnUrl query parameter and\r\n// let the component perform the login and return back to the return url.\r\nexport class Login extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LoginActions.Login:\r\n this.login(this.getReturnUrl());\r\n break;\r\n case LoginActions.LoginCallback:\r\n this.processLoginCallback();\r\n break;\r\n case LoginActions.LoginFailed:\r\n const params = new URLSearchParams(window.location.search);\r\n const error = params.get(QueryParameterNames.Message);\r\n this.setState({ message: error });\r\n break;\r\n case LoginActions.Profile:\r\n this.redirectToProfile();\r\n break;\r\n case LoginActions.Register:\r\n this.redirectToRegister();\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n render() {\r\n const action = this.props.action;\r\n const { message } = this.state;\r\n\r\n if (!!message) {\r\n return
{message}
\r\n } else {\r\n switch (action) {\r\n case LoginActions.Login:\r\n return (
Processing login
);\r\n case LoginActions.LoginCallback:\r\n return (
Processing login callback
);\r\n case LoginActions.Profile:\r\n case LoginActions.Register:\r\n return (
);\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n }\r\n\r\n async login(returnUrl) {\r\n const state = { returnUrl };\r\n const result = await authService.signIn(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid status result ${result.status}.`);\r\n }\r\n }\r\n\r\n async processLoginCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignIn(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeSignIn finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid authentication result status '${result.status}'.`);\r\n }\r\n }\r\n\r\n getReturnUrl(state) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) || fromQuery || `${window.location.origin}/`;\r\n }\r\n\r\n redirectToRegister() {\r\n this.redirectToApiAuthorizationPath(`${ApplicationPaths.IdentityRegisterPath}?${QueryParameterNames.ReturnUrl}=${encodeURI(ApplicationPaths.Login)}`);\r\n }\r\n\r\n redirectToProfile() {\r\n this.redirectToApiAuthorizationPath(ApplicationPaths.IdentityManagePath);\r\n }\r\n\r\n redirectToApiAuthorizationPath(apiAuthorizationPath) {\r\n const redirectUrl = `${window.location.origin}${apiAuthorizationPath}`;\r\n // It's important that we do a replace here so that when the user hits the back arrow on the\r\n // browser he gets sent back to where it was on the app instead of to an endpoint on this\r\n // component.\r\n window.location.replace(redirectUrl);\r\n }\r\n\r\n navigateToReturnUrl(returnUrl) {\r\n // It's important that we do a replace here so that we remove the callback uri with the\r\n // fragment containing the tokens from the browser history.\r\n window.location.replace(returnUrl);\r\n }\r\n}\r\n","import React from 'react'\r\nimport { Component } from 'react';\r\nimport authService from './AuthorizeService';\r\nimport { AuthenticationResultStatus } from './AuthorizeService';\r\nimport { QueryParameterNames, LogoutActions, ApplicationPaths } from './ApiAuthorizationConstants';\r\n\r\n// The main responsibility of this component is to handle the user's logout process.\r\n// This is the starting point for the logout process, which is usually initiated when a\r\n// user clicks on the logout button on the LoginMenu component.\r\nexport class Logout extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined,\r\n isReady: false,\r\n authenticated: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n if (!!window.history.state.state.local) {\r\n this.logout(this.getReturnUrl());\r\n } else {\r\n // This prevents regular links to /authentication/logout from triggering a logout\r\n this.setState({ isReady: true, message: \"The logout was not initiated from within the page.\" });\r\n }\r\n break;\r\n case LogoutActions.LogoutCallback:\r\n this.processLogoutCallback();\r\n break;\r\n case LogoutActions.LoggedOut:\r\n this.setState({ isReady: true, message: \"You successfully logged out!\" });\r\n this.navigateToReturnUrl('/'); // Have a screen for the user to go back to the login\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n\r\n this.populateAuthenticationState();\r\n }\r\n\r\n render() {\r\n const { isReady, message } = this.state;\r\n if (!isReady) {\r\n return
\r\n }\r\n if (!!message) {\r\n return (
{message}
);\r\n } else {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n return (
Processing logout
);\r\n case LogoutActions.LogoutCallback:\r\n return (
Processing logout callback
);\r\n case LogoutActions.LoggedOut:\r\n return (
{message}
);\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n }\r\n\r\n async logout(returnUrl) {\r\n const state = { returnUrl };\r\n const isauthenticated = await authService.isAuthenticated();\r\n if (isauthenticated) {\r\n const result = await authService.signOut(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n } else {\r\n //this.setState({ message: \"You successfully logged out!\" });\r\n await this.navigateToReturnUrl('/'); // Have a screen for the user to go back to the login\r\n this.setState({ message: \"You successfully logged out!\" });\r\n }\r\n }\r\n\r\n async processLogoutCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignOut(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeAuthentication finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n }\r\n\r\n async populateAuthenticationState() {\r\n const authenticated = await authService.isAuthenticated();\r\n this.setState({ isReady: true, authenticated });\r\n }\r\n\r\n getReturnUrl(state) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) ||\r\n fromQuery ||\r\n `${window.location.origin}${ApplicationPaths.LoggedOut}`;\r\n }\r\n\r\n navigateToReturnUrl(returnUrl) {\r\n return window.location.replace(returnUrl);\r\n }\r\n}\r\n","import React, { Component, Fragment } from 'react';\r\nimport { Route } from 'react-router';\r\nimport { Login } from './Login'\r\nimport { Logout } from './Logout'\r\nimport { ApplicationPaths, LoginActions, LogoutActions } from './ApiAuthorizationConstants';\r\n\r\nexport default class ApiAuthorizationRoutes extends Component {\r\n\r\n render () {\r\n return(\r\n \r\n loginAction(LoginActions.Login)} />\r\n loginAction(LoginActions.LoginFailed)} />\r\n loginAction(LoginActions.LoginCallback)} />\r\n loginAction(LoginActions.Profile)} />\r\n loginAction(LoginActions.Register)} />\r\n logoutAction(LogoutActions.Logout)} />\r\n logoutAction(LogoutActions.LogoutCallback)} />\r\n logoutAction(LogoutActions.LoggedOut)} />\r\n );\r\n }\r\n}\r\n\r\nfunction loginAction(name){\r\n return ();\r\n}\r\n\r\nfunction logoutAction(name) {\r\n return ();\r\n}\r\n","import { Box, Button, LoadPanel, ScrollView, Toolbar } from \"devextreme-react\";\r\nimport { Item } from \"devextreme-react/box\";\r\nimport DataGrid, {\r\n AsyncRule,\r\n Column,\r\n ColumnFixing,\r\n CustomRule,\r\n Editing,\r\n HeaderFilter,\r\n Lookup,\r\n Pager,\r\n Paging,\r\n PatternRule,\r\n Popup,\r\n RangeRule,\r\n RequiredRule,\r\n SearchPanel,\r\n} from \"devextreme-react/data-grid\";\r\nimport { Item as ToolbarItem } from \"devextreme-react/toolbar\";\r\nimport ArrayStore from \"devextreme/data/array_store\";\r\nimport { dxDataGridColumn } from \"devextreme/ui/data_grid\";\r\nimport { confirm } from \"devextreme/ui/dialog\";\r\nimport notify from \"devextreme/ui/notify\";\r\nimport parse from \"html-react-parser\";\r\nimport React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { ASSET_DATA_FIELDS } from \"../constants/assetDataFIelds\";\r\nimport { FORMAT } from \"../constants/format\";\r\nimport { LEASE_TERM_PARAMS } from \"../constants/leaseTermParams\";\r\nimport { YEAR_RANGE } from \"../constants/yearRange\";\r\nimport { assetCodingClassStore } from \"../stores/assetCodingClassStore\";\r\nimport { assetEntryServiceLifeStore } from \"../stores/assetEntryServiceLivesStore\";\r\nimport { ASSETS_URL } from \"../stores/assetStore\";\r\nimport { assetTypeStore } from \"../stores/assetTypeStore\";\r\nimport { studyRoomStore } from \"../stores/studyRoomStore\";\r\nimport { studyStructureStore } from \"../stores/studyStructureStore\";\r\nimport { unitOfMeasureStore } from \"../stores/unitOfMeasureStore\";\r\nimport { AssetServiceLife } from \"../types/assetServiceLife\";\r\nimport { NullableAsset } from \"../types/nullableAsset\";\r\nimport { ToolbarPreparingEventingInternal } from \"../types/toolbarPreparingEventInternal\";\r\nimport { calculateAggregateReplacementValue } from \"../utility functions/calculateAggregateReplacementValue\";\r\nimport { calculateLeaseEndValue } from \"../utility functions/calculateLeaseEndValue\";\r\nimport { calculateLeaseTotalPayment } from \"../utility functions/calculateLeaseTotalPayment\";\r\nimport { calculateLeaseYearlyPayment } from \"../utility functions/calculateLeaseYearlyPayment\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\nconst defaultPageSize = 10;\r\n\r\nconst thousandsAndDecimalEditorOptions = {\r\n format: FORMAT.THOUSANDS_AND_DECIMAL,\r\n};\r\nconst wholeNumberEditorOptions = { format: FORMAT.WHOLE_NUMBER };\r\n\r\nconst WHOLE_NUMBER_PATTERN = \"^\\\\d+$\";\r\n\r\nconst DEFAULT_MINIMUM_ASSET_LIFECYCLE = 0;\r\nconst DEFAULT_MAXIMUM_ASSET_LIFECYCLE = 100;\r\nconst ONE_CENT = 0.01;\r\n\r\ntype AssetServiceLifeParams = {\r\n max: number;\r\n min: number;\r\n auto: number | null;\r\n};\r\n\r\ntype AsyncValidationResult = {\r\n isValid: boolean;\r\n message: string | undefined;\r\n};\r\n\r\nenum ChangeType {\r\n Insert = \"insert\",\r\n Update = \"update\",\r\n Delete = \"delete\",\r\n}\r\n\r\ninterface DataChange {\r\n data: Partial;\r\n key: number | null;\r\n type: ChangeType;\r\n}\r\n\r\ninterface LoadPanelState {\r\n visible: boolean;\r\n message: string;\r\n}\r\n\r\ninterface ProcessResult {\r\n isSuccess: boolean;\r\n errorMessage: string;\r\n}\r\n\r\ntype MinRange = { MIN: number; MAX: undefined };\r\ntype MaxRange = { MIN: undefined; MAX: number };\r\ntype MinMaxRange = { MIN: number; MAX: number };\r\n\r\nconst createRangeRuleMessage = (\r\n fieldName: string,\r\n range: MinRange | MaxRange | MinMaxRange\r\n) => {\r\n let message = `${fieldName} needs to be `;\r\n\r\n if (range.MIN !== undefined && range.MAX !== undefined) {\r\n message += `between ${range.MIN} and ${range.MAX}.`;\r\n } else if (range.MIN !== undefined) {\r\n message += `greater than ${range.MIN}.`;\r\n } else if (range.MAX !== undefined) {\r\n message += `less than ${range.MAX}.`;\r\n }\r\n\r\n return message;\r\n};\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nconst DEFAULT_LOADING_PANEL_STATE: LoadPanelState = {\r\n visible: false,\r\n message: \"\",\r\n};\r\n\r\nconst MIN_WARN = 20;\r\n\r\nexport const AssetBulkEdit = () => {\r\n const dataGrid = useRef(null);\r\n const [assets, setAssets] = useState([]);\r\n const [workingAssets, setWorkingAssets] = useState([]);\r\n const [processResults, setProcessResults] = useState(\r\n undefined\r\n );\r\n const [loadPanelState, setLoadPanelState] = useState(\r\n DEFAULT_LOADING_PANEL_STATE\r\n );\r\n\r\n const getFilteredRooms = (options: { data: NullableAsset }) => {\r\n return {\r\n store: studyRoomStore,\r\n filter: options.data\r\n ? [\r\n ASSET_DATA_FIELDS.STUDY_STRUCTURE_ID,\r\n \"=\",\r\n options.data.studyStructureId,\r\n ]\r\n : null,\r\n };\r\n };\r\n\r\n const setStructureValue = (rowData: NullableAsset, value: number) => {\r\n rowData.studyRoomId = null;\r\n rowData.studyStructureId = value;\r\n };\r\n\r\n const setUnitReplacmentCellValue = (\r\n rowData: NullableAsset,\r\n value: number,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.aggregateReplacementValue = calculateAggregateReplacementValue(\r\n currentData.qty,\r\n value\r\n );\r\n rowData.unitReplacementValue = value;\r\n };\r\n\r\n const setQtyCellValue = (\r\n rowData: NullableAsset,\r\n value: number,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.aggregateReplacementValue = calculateAggregateReplacementValue(\r\n value,\r\n currentData.unitReplacementValue\r\n );\r\n rowData.qty = value;\r\n };\r\n\r\n const setInitialRYManualValue = (\r\n newData: NullableAsset,\r\n value: number | null\r\n ) => {\r\n newData.initialRYManual = value;\r\n };\r\n\r\n const setLeaseStatusValue = (newData: NullableAsset, value: boolean) => {\r\n newData.isLeased = value;\r\n };\r\n\r\n const setLeaseStartCellValue = (\r\n rowData: NullableAsset,\r\n value: Date | null,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.leaseEnd = calculateLeaseEndValue(value, currentData.leaseTerm);\r\n rowData.leaseStart = value;\r\n };\r\n\r\n const setLeaseTermCellValue = (\r\n rowData: NullableAsset,\r\n value: number | null,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.leaseEnd = calculateLeaseEndValue(\r\n currentData.leaseStart,\r\n value\r\n );\r\n rowData.leaseTotalPayment = calculateLeaseTotalPayment(\r\n currentData.leaseMonthlyPayment,\r\n value\r\n );\r\n rowData.leaseTerm = value || null; //Do not allow zero but default to null.\r\n };\r\n\r\n const setLeaseMonthlyPaymentCellValue = (\r\n rowData: NullableAsset,\r\n value: number | null,\r\n currentData: NullableAsset\r\n ) => {\r\n rowData.leaseTotalPayment = calculateLeaseTotalPayment(\r\n value,\r\n currentData.leaseTerm\r\n );\r\n rowData.leaseYearlyPayment = calculateLeaseYearlyPayment(value);\r\n rowData.leaseMonthlyPayment = value || null; //Do not allow zero but default to null.\r\n };\r\n\r\n function setDollarBuyoutCellValue(\r\n rowData: NullableAsset,\r\n value: number | null\r\n ) {\r\n rowData.leaseDollarBuyoutAmount = value || null; //Do not allow zero but default to null.\r\n }\r\n\r\n const loadAssetsAsync = useCallback(async (loadingMessage: string) => {\r\n setLoadPanelState({ visible: true, message: loadingMessage });\r\n return await fetch(ASSETS_URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((response) => response.json())\r\n .then((assets) => {\r\n setAssets(assets);\r\n setWorkingAssets(assets);\r\n })\r\n .catch(() => {\r\n notify(\r\n {\r\n message: `An error occured while attempting to load the assets.`,\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"error\",\r\n 5000\r\n );\r\n })\r\n .finally(() => {\r\n setLoadPanelState(DEFAULT_LOADING_PANEL_STATE);\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadAssetsAsync(\"loading\");\r\n }, [loadAssetsAsync]);\r\n\r\n const setYearInstalledCellValue = (\r\n rowData: NullableAsset,\r\n value: number | null,\r\n currentData: NullableAsset\r\n ) => {\r\n const assetLifeCycle = currentData.assetLifeCycle;\r\n rowData.yearInstalled = value;\r\n rowData.initialRYAuto =\r\n value && assetLifeCycle ? value + assetLifeCycle : null;\r\n };\r\n\r\n const setAssetLifeCycleCellValue = (\r\n rowData: NullableAsset,\r\n value: number | null,\r\n currentData: NullableAsset\r\n ) => {\r\n const yearInstalled = currentData.yearInstalled;\r\n rowData.assetLifeCycle = value;\r\n rowData.initialRYAuto =\r\n value && yearInstalled ? value + yearInstalled : null;\r\n };\r\n\r\n const updateAllRowsByKeyValuePair = async (\r\n key: Key,\r\n value?: NullableAsset[Key]\r\n ) => {\r\n const dataGridInstance = dataGrid.current?.instance;\r\n if (dataGridInstance) {\r\n const combinedFilter = dataGridInstance.getCombinedFilter();\r\n\r\n const dataStore = dataGridInstance\r\n .getDataSource()\r\n .store() as ArrayStore;\r\n\r\n const filteredAssets = (await dataStore.load({\r\n filter: combinedFilter,\r\n })) as NullableAsset[];\r\n\r\n setWorkingAssets((current) =>\r\n current.map((a) => {\r\n //If asset is not included in the current filter return as-is\r\n if (filteredAssets.findIndex((fa) => fa.id === a.id) === -1)\r\n return a;\r\n\r\n //Set all auto-calculated values\r\n let ryAuto = a.initialRYAuto;\r\n let arv = a.aggregateReplacementValue;\r\n let leaseEnd = a.leaseEnd;\r\n let leaseTotalPayment = a.leaseTotalPayment;\r\n let leaseYearlyPayment = a.leaseYearlyPayment;\r\n\r\n switch (key) {\r\n case ASSET_DATA_FIELDS.YEAR_INSTALLED:\r\n ryAuto =\r\n value && a.assetLifeCycle\r\n ? (value as number) + a.assetLifeCycle\r\n : null;\r\n break;\r\n case ASSET_DATA_FIELDS.ASSET_LIFE_CYCLE:\r\n ryAuto =\r\n value && a.yearInstalled\r\n ? (value as number) + a.yearInstalled\r\n : null;\r\n break;\r\n case ASSET_DATA_FIELDS.UNIT_REPLACEMENT_VALUE:\r\n arv = calculateAggregateReplacementValue(\r\n a.qty,\r\n value as number | null | undefined\r\n );\r\n break;\r\n case ASSET_DATA_FIELDS.QTY:\r\n arv = calculateAggregateReplacementValue(\r\n a.qty,\r\n value as number | null | undefined\r\n );\r\n break;\r\n case ASSET_DATA_FIELDS.LEASE_START:\r\n leaseEnd = calculateLeaseEndValue(\r\n value as Date | null | undefined,\r\n a.leaseTerm\r\n );\r\n break;\r\n case ASSET_DATA_FIELDS.LEASE_TERM:\r\n leaseEnd = calculateLeaseEndValue(\r\n a.leaseStart,\r\n value as number | null | undefined\r\n );\r\n leaseTotalPayment = calculateLeaseTotalPayment(\r\n a.leaseMonthlyPayment,\r\n value as number | null | undefined\r\n );\r\n break;\r\n case ASSET_DATA_FIELDS.LEASE_MONTHLY_PAYMENT:\r\n leaseTotalPayment = calculateLeaseTotalPayment(\r\n value as number | null | undefined,\r\n a.leaseTerm\r\n );\r\n leaseYearlyPayment = calculateLeaseYearlyPayment(\r\n value as number | null | undefined\r\n );\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return {\r\n ...a,\r\n initialRYAuto: ryAuto,\r\n aggregateReplacementValue: arv,\r\n leaseEnd: leaseEnd,\r\n leaseTotalPayment: leaseTotalPayment,\r\n leaseYearlyPayment: leaseYearlyPayment,\r\n [key]: value,\r\n };\r\n })\r\n );\r\n }\r\n };\r\n\r\n const onCellDblClick = async (e: {\r\n value?: any;\r\n column?: dxDataGridColumn;\r\n rowType?: string;\r\n }) => {\r\n const { value, rowType, column } = e;\r\n if (column && column?.allowEditing && rowType === \"data\") {\r\n const dataField = e.column?.dataField as keyof NullableAsset;\r\n updateAllRowsByKeyValuePair(dataField, value);\r\n }\r\n };\r\n\r\n const changes = useMemo(() => {\r\n const current: DataChange[] = workingAssets.map(\r\n (working) => {\r\n const existing = assets.find((ex) => ex.id === working.id);\r\n\r\n let changedData: Partial = {};\r\n\r\n if (existing) {\r\n const keys = Object.keys(existing);\r\n\r\n for (const key of keys) {\r\n const dataField = key as keyof NullableAsset;\r\n const existingValue = existing[dataField];\r\n const workingValue = working[dataField];\r\n if (existingValue !== workingValue) {\r\n Object.assign(changedData, {\r\n [dataField]: workingValue,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n data: changedData,\r\n type: ChangeType.Update,\r\n key: working.id as number,\r\n };\r\n }\r\n );\r\n\r\n return current.filter((c) => Object.keys(c.data).length !== 0);\r\n }, [assets, workingAssets]);\r\n\r\n // It is essential that usecallback is used here.\r\n // If it is not, this will be triggered twice and result in an infinite callstack.\r\n const onChangesChange = useCallback(\r\n async (changed: DataChange[]) => {\r\n setWorkingAssets((current) =>\r\n current.map((a) => {\r\n const foundChange = changed.find((c) => c.key === a.id);\r\n return foundChange ? { ...a, ...foundChange.data } : a;\r\n })\r\n );\r\n },\r\n []\r\n );\r\n\r\n const getAssetLifeCycleParams = async (assetServiceLifeId: number) => {\r\n const values: AssetServiceLifeParams = {\r\n min: DEFAULT_MINIMUM_ASSET_LIFECYCLE,\r\n max: DEFAULT_MAXIMUM_ASSET_LIFECYCLE,\r\n auto: null,\r\n };\r\n\r\n if (assetServiceLifeId) {\r\n const assetServiceLife = (await assetEntryServiceLifeStore.byKey(\r\n assetServiceLifeId\r\n )) as AssetServiceLife;\r\n if (!assetServiceLife) return values;\r\n const assetServiceLifeTextValue = assetServiceLife.name;\r\n if (assetServiceLifeTextValue.startsWith(\"to\")) {\r\n const assetLifeCycle = parseInt(\r\n assetServiceLifeTextValue.replace(\"to\", \"\").trim()\r\n );\r\n\r\n values.min = assetLifeCycle;\r\n values.max = assetLifeCycle;\r\n values.auto = assetLifeCycle;\r\n } else {\r\n const minMaxRange = assetServiceLifeTextValue.split(\"to\");\r\n minMaxRange.sort(function (x, y) {\r\n // Sort list\r\n return parseInt(x) - parseInt(y);\r\n });\r\n let [minimumLifeCycle, maximumLifecycle] = [\r\n minMaxRange[0],\r\n minMaxRange[1],\r\n ];\r\n\r\n values.min = parseInt(minimumLifeCycle);\r\n values.max = parseInt(maximumLifecycle);\r\n }\r\n }\r\n\r\n return values;\r\n };\r\n\r\n const resetEditorAsync = useCallback(async () => {\r\n await loadAssetsAsync(\"Reloading\");\r\n setProcessResults(undefined);\r\n }, [loadAssetsAsync]);\r\n\r\n const handleRevertClicked = useCallback(async () => {\r\n await resetEditorAsync();\r\n }, [resetEditorAsync]);\r\n\r\n const handleSaveClicked = useCallback(async () => {\r\n const changedKeys = changes.map((c) => c.key);\r\n\r\n const confirmResult =\r\n changedKeys.length > MIN_WARN\r\n ? confirm(\r\n `You are about to updated more than ${MIN_WARN} assets. Are you sure?`,\r\n \"Confirm Save\"\r\n )\r\n : Promise.resolve(true);\r\n\r\n const saveAccepted = await confirmResult;\r\n\r\n if (saveAccepted) {\r\n setProcessResults(undefined);\r\n setLoadPanelState({\r\n visible: true,\r\n message: \"Saving...\",\r\n });\r\n\r\n const modifiedAssets = workingAssets.filter((a) =>\r\n changedKeys.includes(a.id)\r\n );\r\n\r\n await fetch(\"api/assetbulk/\", {\r\n method: \"PUT\",\r\n body: JSON.stringify(modifiedAssets),\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json())\r\n .then((results: ProcessResult) => {\r\n if (!results.isSuccess) {\r\n setProcessResults(results.errorMessage);\r\n } else {\r\n notify(\r\n {\r\n message:\r\n \"Assets have been updated successfully.\",\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"success\",\r\n 5000\r\n );\r\n return resetEditorAsync();\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(\"err: \", err);\r\n notify(\r\n {\r\n message:\r\n \"An internal server error occured while attempting to process the bulk edit, please try again\",\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"error\",\r\n 5000\r\n );\r\n })\r\n .finally(() => {\r\n setLoadPanelState(DEFAULT_LOADING_PANEL_STATE);\r\n });\r\n }\r\n }, [changes, workingAssets, resetEditorAsync]);\r\n\r\n const validateYearIfNotLeased = (e: {\r\n value: number;\r\n data?: NullableAsset;\r\n }) => {\r\n const { data, value } = e;\r\n return (!data?.isLeased || data.isLegacyLease) && value !== null\r\n ? value >= YEAR_RANGE.MIN && value <= YEAR_RANGE.MAX\r\n : true;\r\n };\r\n\r\n const positiveIfNotLeased = (e: {\r\n value: number;\r\n data?: NullableAsset;\r\n }) => {\r\n const { data, value } = e;\r\n return (!data?.isLeased || data.isLegacyLease) && value !== null\r\n ? value >= 0\r\n : true;\r\n };\r\n\r\n const validateLastRYCycleAsync = (e: {\r\n data?: NullableAsset;\r\n value?: number;\r\n }) => {\r\n const { data, value } = e;\r\n\r\n const validatationResult: AsyncValidationResult = {\r\n isValid: true,\r\n message: undefined,\r\n };\r\n\r\n if (value && (!data?.isLeased || data.isLegacyLease)) {\r\n if (data?.initialRYManual && value < data.initialRYManual) {\r\n validatationResult.isValid = false;\r\n validatationResult.message =\r\n \"The Last RY Cycle cannot be less than Initial RY Manual.\";\r\n } else if (data?.initialRYAuto && value < data.initialRYAuto) {\r\n validatationResult.isValid = false;\r\n validatationResult.message =\r\n \"The Last RY Cycle cannot be less than Initial RY Auto.\";\r\n }\r\n }\r\n\r\n return Promise.resolve(validatationResult);\r\n };\r\n\r\n const validateLifeCycleAsync = async (e: {\r\n data?: NullableAsset;\r\n value?: number;\r\n }) => {\r\n const { data, value } = e;\r\n const { assetServiceLifeId } = data as NullableAsset;\r\n\r\n const validatationResult: AsyncValidationResult = {\r\n isValid: true,\r\n message: undefined,\r\n };\r\n\r\n if (!assetServiceLifeId) return validatationResult;\r\n\r\n const { min, max } = await getAssetLifeCycleParams(assetServiceLifeId);\r\n\r\n if (value && value > max) {\r\n validatationResult.isValid = false;\r\n validatationResult.message = `Value is greater than the maximum value of ${max} by Service Life.`;\r\n } else if (value && value < min) {\r\n validatationResult.isValid = false;\r\n validatationResult.message = `Value is less than the minimum value of ${min} by Service Life.`;\r\n }\r\n\r\n return Promise.resolve(validatationResult);\r\n };\r\n\r\n const requiredIfLeased = (e: { value: Date; data?: NullableAsset }) => {\r\n const { data, value } = e;\r\n return data?.isLeased && !data.isLegacyLease ? value : true;\r\n };\r\n\r\n const requiredIfNotLeased = (e: { value: Date; data?: NullableAsset }) => {\r\n const { data, value } = e;\r\n return !data?.isLeased || data.isLegacyLease ? value : true;\r\n };\r\n\r\n const onToolbarPreparing = useCallback(\r\n (e: ToolbarPreparingEventingInternal) => {\r\n e.cancel = true;\r\n if (e.toolbarOptions?.items) {\r\n const saveButton = e.toolbarOptions.items.find(\r\n (i) => i.name === \"saveButton\"\r\n );\r\n if (saveButton && saveButton.options) {\r\n saveButton.options.visible = false;\r\n saveButton.options.disabled = true;\r\n }\r\n\r\n const revertButton = e.toolbarOptions.items.find(\r\n (i) => i.name === \"revertButton\"\r\n );\r\n if (revertButton && revertButton.options) {\r\n revertButton.options.visible = false;\r\n revertButton.options.disabled = true;\r\n }\r\n }\r\n },\r\n []\r\n );\r\n\r\n const noChangesExist = useMemo(\r\n () => changes.length === 0,\r\n [changes.length]\r\n );\r\n\r\n const handleClearAllFilters = useCallback(() => {\r\n const dataGridInstance = dataGrid.current?.instance;\r\n if (dataGridInstance) {\r\n dataGridInstance.clearFilter();\r\n }\r\n }, []);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n Clear All Filters\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {processResults && (\r\n \r\n
{parse(processResults)}
\r\n \r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { Inflation } from \"../types/inflation\";\r\nimport { createDataFields } from \"../utility functions/createDataFields\";\r\n\r\nexport const INFLATION_DATA_FIELDS = createDataFields()({\r\n ID: \"id\",\r\n STUDY_ID: \"studyId\",\r\n PROJECT_YEAR: \"projectYear\",\r\n PERIOD: \"period\",\r\n FISCAL_YEAR: \"fiscalYear\",\r\n YEARLY_INFLATION: \"yearlyInflation\",\r\n CUMULATIVE_INFLATION: \"cumulativeInflation\",\r\n});\r\n","import CustomStore from \"devextreme/data/custom_store\";\r\nimport authService from \"../components/api-authorization/AuthorizeService\";\r\nimport { Inflation } from \"../types/inflation\";\r\n\r\nconst KEY_VALUE: keyof Inflation = \"id\";\r\n\r\ntype KeyType = Inflation[typeof KEY_VALUE];\r\n\r\nconst handleErrors = (response: Response) => {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n};\r\n\r\nexport const INFLATION_URL = \"/api/inflation/\";\r\n\r\nconst loadAsync = async (key?: KeyType) =>\r\n await fetch(key ? INFLATION_URL + key : INFLATION_URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n 'Authorization': `Bearer ${token}`\r\n },\r\n })\r\n .then(handleErrors)\r\n .then((result) => result.json());\r\n\r\nconst token = authService.getAccessToken();\r\n\r\nexport const inflationStore = new CustomStore({\r\n loadMode: 'raw',\r\n key: KEY_VALUE,\r\n byKey: async (key) => await loadAsync(key),\r\n load: async () => await loadAsync(), \r\n update: async(key, values) => {\r\n var jsonString = JSON.stringify(values);\r\n return await fetch(INFLATION_URL + key, {\r\n method: \"PUT\",\r\n body: jsonString,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': \"Bearer \" + authService.getAccessToken()\r\n }\r\n }).then(handleErrors);\r\n },\r\n })","export const STUDY_CONSTANTS = {\r\n STUDY_LOOKOUT_YEARS: 20,\r\n BASE_INFLATION_START_YEAR: 4\r\n}","import { Box, Button, LoadPanel, NumberBox, Tooltip } from \"devextreme-react\";\r\nimport React from \"react\";\r\n\r\nimport { Item } from \"devextreme-react/box\";\r\nimport notify from \"devextreme/ui/notify\";\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { STUDY_CONSTANTS } from \"../constants/studyConstants\";\r\nimport { INFLATION_URL } from \"../stores/inflationStore\";\r\n\r\nconst BASE_INFLATION_RATE_TEXT = \"Base Inflation Rate\";\r\n\r\ninterface BaseInflationEditorProps {\r\n onAfterSaveSuccess?: () => void;\r\n showGenerateButton?: boolean;\r\n}\r\n\r\nconst BASE_INFLATION_URL = INFLATION_URL + \"baseinflation/\";\r\n\r\nexport const BaseInflationEditor = ({\r\n onAfterSaveSuccess,\r\n showGenerateButton = false,\r\n}: BaseInflationEditorProps) => {\r\n const [isSaving, setIsSaving] = useState(false);\r\n const [initialInflationRate, setInitialInflationRate] = useState<\r\n number | undefined\r\n >(undefined);\r\n const [currentInflationRate, setCurrentInflationRate] = useState<\r\n number | undefined\r\n >(undefined);\r\n\r\n const loadBaseInflation = useCallback(async () => {\r\n await fetch(BASE_INFLATION_URL, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then((response: Response) => {\r\n if (!response.ok) {\r\n if (response.status === 404) return null;\r\n throw new Error();\r\n }\r\n return response.json();\r\n })\r\n .then((baseInflation: number | null) => {\r\n if (!Number.isNaN(baseInflation)) {\r\n setInitialInflationRate(baseInflation as number);\r\n setCurrentInflationRate(baseInflation as number);\r\n }\r\n })\r\n .catch(() => {\r\n notify(\r\n {\r\n message: `An error occured while attempting to load the current ${BASE_INFLATION_RATE_TEXT} for the study.`,\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"error\",\r\n 5000\r\n );\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadBaseInflation();\r\n }, [loadBaseInflation]);\r\n\r\n const onSaveInflationClicked = useCallback(async () => {\r\n setIsSaving(true);\r\n\r\n await fetch(BASE_INFLATION_URL, {\r\n method: \"PUT\",\r\n body: JSON.stringify(currentInflationRate),\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n })\r\n .then(handleErrors)\r\n .then(async () => {\r\n await loadBaseInflation();\r\n if (onAfterSaveSuccess) {\r\n onAfterSaveSuccess();\r\n }\r\n notify(\r\n {\r\n message: `You successfully updated the ${BASE_INFLATION_RATE_TEXT}.`,\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"success\",\r\n 5000\r\n );\r\n })\r\n .catch(() => {\r\n notify(\r\n {\r\n message: `An error occured while attempting to update ${BASE_INFLATION_RATE_TEXT}. Try again.`,\r\n position: {\r\n my: \"center top\",\r\n at: \"center top\",\r\n },\r\n },\r\n \"error\",\r\n 5000\r\n );\r\n })\r\n .finally(() => {\r\n setIsSaving(false);\r\n });\r\n }, [currentInflationRate, loadBaseInflation, onAfterSaveSuccess]);\r\n\r\n const actionsDisabled = useMemo(\r\n () => currentInflationRate === initialInflationRate,\r\n [currentInflationRate, initialInflationRate]\r\n );\r\n\r\n const onCancelClicked = () => {\r\n setCurrentInflationRate(initialInflationRate || undefined);\r\n };\r\n\r\n useEffect(() => {\r\n setCurrentInflationRate(initialInflationRate || undefined);\r\n }, [initialInflationRate]);\r\n\r\n const onInflationRateChanged = (e: { value?: number }) => {\r\n setCurrentInflationRate(e.value);\r\n };\r\n\r\n const toolTipText = `The ${BASE_INFLATION_RATE_TEXT} is the rate of increase in prices\r\n over a given period of time. Modifying the\r\n ${BASE_INFLATION_RATE_TEXT} value will adjust the inflation for\r\n years ${STUDY_CONSTANTS.BASE_INFLATION_START_YEAR} through ${\r\n STUDY_CONSTANTS.STUDY_LOOKOUT_YEARS\r\n } of the study. To modify the inflation values\r\n for the first ${\r\n STUDY_CONSTANTS.BASE_INFLATION_START_YEAR - 1\r\n } years of the study, edit the individual years in\r\n the Inflation Grid.`;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {toolTipText}\r\n
\r\n \r\n
\r\n \r\n
\r\n {BASE_INFLATION_RATE_TEXT}:\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n {showGenerateButton ? (\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nfunction handleErrors(response: Response) {\r\n if (!response.ok) throw Error(response.statusText);\r\n return response;\r\n}\r\n","import DataGrid, {\r\n Column,\r\n Editing,\r\n HeaderFilter,\r\n Pager,\r\n SearchPanel\r\n} from \"devextreme-react/data-grid\";\r\nimport React, { useEffect } from \"react\";\r\n\r\nimport { Button, Popup, Template } from \"devextreme-react\";\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport { useRef, useState } from \"react\";\r\nimport { FORMAT } from \"../constants/format\";\r\nimport { INFLATION_DATA_FIELDS } from \"../constants/inflationDataFields\";\r\nimport { inflationStore } from \"../stores/inflationStore\";\r\nimport { ToolbarPreparingEventingInternal } from \"../types/toolbarPreparingEventInternal\";\r\nimport { BaseInflationEditor } from \"./BaseInflationEditor\";\r\n\r\nconst allowedPageSizes = [10, 20, 50, 100];\r\n\r\nconst INFLATION_EDITOR_TEMPLATE_NAME = \"inflationEditor\";\r\n\r\nexport const InflationGrid = () => {\r\n const [inflationExists, setInflationExists] = useState(true);\r\n const [popupIsVisible, setPopupIsVisible] = useState(false);\r\n const dataGridRef = useRef(null);\r\n\r\n //The below method ensures that the inflation grid loads each time the user visits the inflation screen.\r\n useEffect(()=>{\r\n gridDataSource.reload()\r\n },[])\r\n\r\n const editorOptions = { format: FORMAT.PERCENT.SINGLE_DECIMAL };\r\n\r\n const isEditable = (rowIndex: number) => {\r\n return rowIndex && rowIndex > 2;\r\n };\r\n\r\n const allowEditing = (e: { row: { rowIndex: number } }) => {\r\n return !isEditable(e.row.rowIndex);\r\n };\r\n\r\n const refreshDataGrid = () => {\r\n const dataGridInstance = dataGridRef.current?.instance;\r\n if (dataGridInstance) {\r\n dataGridInstance.refresh();\r\n }\r\n };\r\n\r\n const showPopup = () => {\r\n setPopupIsVisible(true);\r\n };\r\n\r\n const closePopup = () => {\r\n setPopupIsVisible(false);\r\n };\r\n\r\n const onToolbarPreparing = (e: ToolbarPreparingEventingInternal) => {\r\n e.toolbarOptions?.items?.unshift({\r\n location: \"after\",\r\n widget: \"dxButton\",\r\n options: {\r\n text: \"Edit Base Inflation\",\r\n onClick: showPopup,\r\n },\r\n });\r\n };\r\n\r\n const renderInflationEditor = () => (\r\n