{"version":3,"sources":["store/videoboard/types.ts","components/pages/CameraManagement.tsx","components/base/cameramgmt/Camera.tsx","components/base/SelectionRow.tsx","components/base/DummySearch.tsx","components/base/modals/AccessLevelLegendModal.tsx","constants/imageObjects.ts","components/base/editor/VideoboardEditor.tsx","components/base/modals/DismissableModal.tsx","components/base/editor/DroppableVideoItem.tsx","components/base/VideoboardSelector.tsx","components/base/display/Videoboard.tsx","components/base/modals/ConfirmationModal.tsx","store/camera/types.ts","models/Privileges.ts","store/videoboard/actions.ts","store/datasource/reducers.ts","store/profile/types.ts","store/profile/reducers.ts","store/camera/reducers.ts","store/videoboard/reducers.ts","store/index.ts","store/profile/actions.ts","components/base/layout/AuthenticationButton.tsx","components/base/layout/Header.tsx","models/Roles.ts","components/base/modals/ErrorModal.tsx","components/styled/Globals.ts","components/pages/RedirectContent.tsx","components/pages/Redirect.tsx","components/pages/Error.tsx","components/pages/OidcCallback.tsx","components/pages/NotFound.tsx","components/pages/AccessDenied.tsx","components/pages/LoggedOff.tsx","components/pages/OidcSilentRenew.tsx","components/base/layout/Sidebar.tsx","components/base/DatasourceSelector.tsx","components/base/SearchBox.tsx","components/base/editor/DraggableCamera.tsx","components/base/editor/CameraSelector.tsx","components/pages/Editor.tsx","components/pages/SiteGuide.tsx","components/Template.tsx","App.tsx","serviceWorkerRegistration.js","web.config","reportWebVitals.ts","index.tsx","utils/AppConstants.ts","store/api-version-constants.ts","utils/userManager.ts","components/base/layout/Content.tsx","store/camera/actions.ts","images/algo-logo.png","images/camera-disabled.png","images/camera-loading-preview.png","images/camera-no-camera.png","images/camera-no-preview.png","images/camera-unavailable.png","images/video_guide.pdf","images/gui/gui-arrow-left.png","images/gui/gui-arrow-right.png","images/gui/gui-search.png","images/index.ts","utils/data/getAccessToken.ts","store/datasource/types.ts","store/datasource/actions.ts","components/pages/Loading.tsx","constants/videojs-html5.ts","components/base/display/Stream.tsx"],"names":["INITIALIZE_VIDEOBOARD_SUCCESS","LOAD_VIDEOBOARD_SUCCESS","INITIALIZE_VIDEOBOARD_FAILURE","SET_NAME_SUCCESS","SET_NAME_FAILURE","SET_CAMERA_ITEM_SUCCESS","SET_CAMERA_ITEM_FAILURE","REMOVE_CAMERA_ITEM_SUCCESS","REMOVE_CAMERA_ITEM_FAILURE","ADD_PAGE_SUCCESS","ADD_PAGE_FAILURE","REMOVE_PAGE_SUCCESS","REMOVE_PAGE_FAILURE","RESIZE_PAGE_SUCCESS","RESIZE_PAGE_FAILURE","SAVE_VIDEOBOARD_BEGIN","SAVE_VIDEOBOARD_SUCCESS","SAVE_VIDEOBOARD_FAILURE","SAVE_PAGE_STATE","CLEAR_EDITOR_STATE","CLEAR_EDITOR_ERROR","GET_VIDEOBOARD_LIST_BEGIN","GET_VIDEOBOARD_LIST_SUCCESS","GET_VIDEOBOARD_LIST_FAILURE","DELETE_VIDEOBOARD_BEGIN","DELETE_VIDEOBOARD_SUCCESS","DELETE_VIDEOBOARD_FAILURE","videoJSConfig","html5","videojsHtml5","CameraManagement","props","cameraRefresher","pageRefresher","player","streamNodeRef","modalRef","disposeVideoJS","isDisposed","pause","ended","dispose","e","console","error","fetchCameras","camera","processing","getCameras","datasourceSelectorChange","region","setState","state","selectedRegion","datasourceSearchChange","event","persist","query","target","value","showLegendModal","errorModalDismissCallback","clearCameraStoreError","history","push","legendModalDismissCallback","reloadPage","window","location","reload","viewLivestreamClick","item","profile","userProfile","hasPrivilege","UNLIMITED_STREAMING","setInterval","STREAM_TIMEOUT_INTERVAL","viewingLivestream","livestreamItem","closeLivestreamClick","current","$","modal","clearInterval","toggleFullscreen","preventDefault","isFullscreen","exitFullscreen","requestFullscreen","isAvailableToUser","user","isNonExpiredUser","nuon","expired","hasAldot","INTERNAL_STREAM_ACCESS","hasFirstResponder","FIRST_RESPONDER_STREAM_ACCESS","hasMedia","MEDIA_STREAM_ACCESS","hasStakeholder","PRIVATE_SECTOR_STREAM_ACCESS","accessLevel","EATStreamAccessLevel","Public","Stakeholder","Media","FirstResponder","ALDOT","renderLivestreamModal","className","ref","id","tabIndex","role","type","onClick","controls","playsInline","preload","autoPlay","onDoubleClick","src","hlsUrl","renderCameraElements","items","length","map","index","isAdminView","isAvailable","responsibleRegion","alertMessage","renderLegendModal","displayModal","dismissCallback","React","loadDatasources","CAMERA_REFRESH_INTERVAL","EATRegion","this","loading","prevProps","curChecksum","checksum","curCount","count","prevChecksum","prevCount","getCamerasForManagement","Unknown","prevState","snapshot","videojs","log","level","play","camerasNotBusy","headersChange","mgmtFilteredItems","datasource","datasources","optionBlocks","title","subtitle","hidden","displayAbbreviation","displayName","selectorChange","pageHasSidebar","img","PAGE_IMAGES","DUMMY_SEARCH","SEARCH_ICON","callbackAction","defaultSelection","defaultStyles","selectionRowState","selectedIndex","connect","oidc","dispatch","bindActionCreators","refreshCameraLists","withRouter","Camera","snapshotRef","snapshotImageLoaded","aspectRatioClass","naturalWidth","naturalHeight","ASPECT_RATIO_16_10","snapshotAspectRatioClass","imageUrl","loadingImage","addEventListener","removeEventListener","alt","routeDesignator","crossStreet","disabled","DEFAULT_STYLES","SELECTION_ROW_BLOCKS","overflowX","fontSize","color","NAV_BUTTON","cursor","BLOCK_WRAPPER","paddingLeft","paddingRight","borderRadius","backgroundColor","active","background","BLOCK_TITLE","textAlign","minWidth","BLOCK_SUBTITLE","compileStyles","style1","style2","ruleString","compiledStyles","SelectionRow","renderButton","buttonSelector","navButtonObjects","imgObj","floatClass","width","height","style","undefined","selectOnClickFunction","onKeyUp","handleKeyUp","determineActive","optionBlock","decrementSelection","incrementSelection","validateDefaultSelection","handleBlockClick","key","parseInt","styles","OptionBlock","config","Math","random","renderBlockImage","renderBlockText","renderBlockTitle","renderBlockSubtitle","defaultTitleStyle","defaultSubtitleStyle","styleBlock","defaultBlockWrapperStyle","DummySearch","handleSearchChange","searchTerm","handleSearchClick","handleSearchKeyUp","placeholder","onChange","AccessLevelLegendModal","dismiss","instanceId","CAMERA_MANAGEMENT","SELECTION_ROW","LEFT_ARROW","leftArrow","RIGHT_ARROW","rightArrow","searchIcon","VideoboardEditor","updatePageIndex","newPageIndex","currentPageIndex","previousPage","nameChange","setName","currentTarget","rowSizeChange","rSize","editor","videoboard","videoPages","resizePage","columnSize","rowSize","columnSizeChange","cSize","addPage","removePage","saveVideoboard","tooltip","name","save","showNoNameModal","nameModalCallback","renderPage","page","colClass","rowClass","videoItems","videoItem","videoPageLocation","placement","itemLocation","cameraId","renderShowNoNameModal","showModal","message","renderEditor","htmlFor","display","justifyContent","alignItems","padding","pageIndex","pageCount","minimalNav","size","llipsisThreshold","ellipsisOffset","DEFAULT_PAGE_INDEX","initialized","savePageState","curPageIndex","clearEditorState","DismissableModal","DroppableVideoItem","componentRef","dragOverHandler","dataTransfer","dropEffect","classList","contains","add","dragLeaveHandler","remove","dropHandler","cId","getData","setCameraToVideoItem","removeClickHandler","removeCameraFromVideoItem","renderContent","backgroundImage","renderRemoveButton","find","element","onDrop","onDragOver","onDragLeave","displayRouteDesignator","VideoboardSelector","videoboardSelected","videoboards","boardId","selectedValue","onChangeCallback","onAddClick","onAddCallback","onRemoveClick","onRemoveCallback","bind","listItems","Array","isArray","marginRight","disabledPlaceholder","options","noDropBorder","menuAttached","callback","searchable","borderTopRightRadius","borderBottomRightRadius","borderTopLeftRadius","borderBottomLeftRadius","Videoboard","pageTransitionInterval","videoboardRef","fullscreenEventAction","fscreen","fullscreenElement","destroyPageTransition","isPaused","createPageTransition","keyListener","board","keyCode","pageTransitionHandler","pageTimer","changePageTimer","cameras","cameraItem","autoplay","defaultValue","toString","ConfirmationModal","confirm","confirmCallback","FETCH_CAMERAS_BEGIN","FETCH_CAMERAS_SUCCESS","FETCH_CAMERAS_FAILURE","FETCH_CAMERAS_NOCHANGE","UPDATE_ACCESS_LEVEL_BEGIN","UPDATE_ACCESS_LEVEL_SUCCESS","UPDATE_ACCESS_LEVEL_FAILURE","UPDATE_ACCESS_LEVEL_CLEAR","MODIFY_CAMERA_INFO_BEGIN","MODIFY_CAMERA_INFO_SUCCESS","MODIFY_CAMERA_INFO_FAILURE","BULK_UPDATE_BEGIN","BULK_UPDATE_SUCCESS","BULK_UPDATE_FAILURE","BULK_UPDATE_CLEAR","FILTER_DATASOURCES_CAMERA_BEGIN","FILTER_DATASOURCES_CAMERA_SUCCESS","FILTER_DATASOURCES_CAMERA_FAILURE","FILTER_EDITOR_CAMERA_BEGIN","FILTER_EDITOR_CAMERA_SUCCESS","FILTER_EDITOR_CAMERA_FAILURE","REFRESH_CAMERA_LISTS_BEGIN","REFRESH_CAMERA_LISTS_SUCCESS","REFRESH_CAMERA_LISTS_FAILURE","CLEAR_CAMERA_ERROR","VIEW_VIDEOBOARD","VIEW_CAMERA","apiUrlVideoboard","__API_URL__","CUR_API_VERSION","CUR_API_ENPOINTS","legacyVideoboards","initializeSuccess","TYPES","payload","loadSuccess","response","initializeFailure","setNameSuccess","setCameraFailure","removeCameraFailure","saveVideoboardSuccess","AVLegacyVideoBoard","data","saveVideoboardFailure","savePageStateSuccess","getVideoboardListSuccess","list","getVideoboardListFailure","deleteVideoboardSuccess","deleteVideoboardFailure","initializeVideoboardEditor","getState","a","loadVideoboard","videoboardId","getAccessToken","then","token","manager","LegacyVideoBoardNetworkManager","setAccessToken","getVideoboard","getById","catch","err","Error","colSize","pageLocation","forEach","itemIndex","boardToSave","createVideoBoard","create","status","updateVideoBoard","update","sanitizedRow","sanitizedCol","clearEditorError","getVideoboardList","getAll","deleteVideoboard","delete","listResponse","initialState","lastResponse","ProcessedResponse","FETCH_PROFILE_BEGIN","FETCH_PROFILE_SUCCESS","FETCH_PROFILE_FAILURE","UNLOAD_PROFILE","CLEAR_PROFILE_ERROR","AAUserAuthorizationProfile","editorFilteredItems","saveSuccess","rootReducer","combineReducers","action","FETCH_DATASOURCES_BEGIN","FETCH_DATASOURCES_SUCCESS","FETCH_DATASOURCES_FAILURE","CLEAR_DATASOURCES_ERROR","ATCamera","getChecksum","getCount","reducer","oidcMiddleware","createOidcMiddleware","userManager","store","compose","applyMiddleware","thunkMiddleware","createStore","createStoreWithMiddleware","loadUser","apiUrlProfile","users","fetchProfileBegin","fetchProfileSuccess","fetchProfileFailure","loadUserProfile","UserNetworkManager","getProfile","updateUserProfile","processed","unloadUserProfile","clearUserProfileError","AuthenticationButton","signIn","isLoading","signinRedirect","signOut","getUser","sessionStorage","removeItem","__AUTHORITY_URL__","replace","id_token","__CLIENT_URL__","preferred_username","pathname","btnClass","Header","userHasRoles","dashboardLink","exact","to","activeClassName","camerasLink","adminLink","isInRole","href","__ADMIN_URL__","guideLink","loadingLinks","links","algoLogo","default","ErrorModal","formattedMessage","formattedTitle","StyledMessageContainer","styled","div","flexSmart","StyledAlertContainer","StyledSubtext","StyledRootLink","RedirectContent","Content","go","OidcCallback","successCallback","path","errorCallback","NotFound","AccessDenied","LoggedOff","OidcSilentRenew","processSilentRenew","Sidebar","children","DatasourceSelector","datasourceSelected","dId","forceUpdate","scrollThreshold","SearchBox","autoComplete","DraggableCamera","dragStartHandler","setData","draggable","onDragStart","CameraSelector","datsourceSelectorChange","cameraSearchChange","getCamerasForEditor","cameraElements","Editor","setToEditor","displayMode","setToDisplay","videoboardSelectorChange","newVideoboard","removeVideoboard","showDeleteModal","deleteDismissCallback","deleteConfirmCallback","match","params","content","deleteModal","defaultChecked","CSSTransition","classNames","timeout","enter","exit","SiteGuide","videoGuide","Template","profileRefresher","serviceWorker","setupServiceWorker","Promise","resolve","navigator","controller","checkForRedirect","includes","userManagerUser","postMessage","accessToken","access_token","reject","dismissCameraError","dismissDatasourceError","clearDatasourceError","dismissVideoboardEditorError","dismissProfileError","injectErrorModal","updateProfile","PROFILE_REFRESH_INTERVAL","hasError","info","defaultLanding","Redirect","Loading","displayErrorModal","checkRouteAccess","privilege","result","TransitionGroup","component","App","EThemeOptions","Light","themeMode","getTheme","themeObject","theme","Provider","isLocalhost","Boolean","hostname","registerValidSW","swUrl","register","registration","onupdatefound","installingWorker","installing","onstatechange","onUpdate","onSuccess","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById","URL","process","origin","fetch","headers","contentType","get","indexOf","ready","unregister","checkValidServiceWorker","serviceWorkerRegistration","V1_ENDPOINTS","profiles","V2_ENDPOINTS","V3_ENDPOINTS","version","client_id","redirect_uri","response_type","scope","authority","post_logout_redirect_uri","silent_redirect_uri","automaticSilentRenew","filterProtocolClaims","loadUserInfo","createUserManager","apiUrlCamera","fetchCamerasFailure","filterDatasourceCamerasBegin","filterDatasourceCamerasSuccess","datasourceCameras","filterDatasourceCamerasFailure","refreshCameraListsSuccess","filteredItems","refreshCameraListsFailure","filterEditorCamerasSuccess","CameraNetworkManager","isKnownRegion","filtered","filterCameras","failure","cameraItems","filter","isSpecifiedRegion","toUpperCase","logoImg","videoGuidePdf","guiLeftArrow","guiRightArrow","guiSearch","reason","apiUrlDatasource","fetchDatasourcesFailure","DatasourceNetworkManager","processedResponse","ATLegacyDatasource","vhs","withCredentials","overrideNative","Stream","renderImageContent","videoClassNames","DefaultConfig","sources"],"mappings":"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","file":"static/js/main.6dea56f9.chunk.js","sourcesContent":["import { IProcessedResponse } from \"@algo/network-manager/managers/v3\";\r\nimport { IAVLegacyVideoBoard } from \"@algo/network-manager/models/v3/video\";\r\n\r\nexport interface EditorState {\r\n initialized: boolean;\r\n processing: boolean;\r\n loading: boolean;\r\n error: Error | null;\r\n list: IAVLegacyVideoBoard[];\r\n videoboard: IAVLegacyVideoBoard;\r\n currentPageIndex: number;\r\n rowSize: number;\r\n columnSize: number;\r\n}\r\n\r\nexport interface EditorPayload {\r\n videoboard: IAVLegacyVideoBoard;\r\n list: IAVLegacyVideoBoard[];\r\n currentPageIndex: number;\r\n rowSize: number;\r\n columnSize: number;\r\n error: Error | null;\r\n response: IProcessedResponse;\r\n}\r\n\r\nexport let INITIALIZE_VIDEOBOARD_SUCCESS = 'INITIALIZE_VIDEOBOARD_SUCCESS';\r\nexport let LOAD_VIDEOBOARD_SUCCESS = 'LOAD_VIDEOBOARD_SUCCESS';\r\nexport let INITIALIZE_VIDEOBOARD_FAILURE = 'INITIALIZE_VIDEOBOARD_FAILURE';\r\n\r\ninterface InitializeVideoboardSuccessAction {\r\n type: typeof INITIALIZE_VIDEOBOARD_SUCCESS,\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface LoadVideoboardSuccessAction {\r\n type: typeof LOAD_VIDEOBOARD_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface InitializeVideoboardFailureAction {\r\n type: typeof INITIALIZE_VIDEOBOARD_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let SET_NAME_SUCCESS = 'SET_NAME_SUCCESS';\r\nexport let SET_NAME_FAILURE = 'SET_NAME_FAILURE';\r\n\r\ninterface SetNameSuccessAction {\r\n type: typeof SET_NAME_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface SetNameFailureAction {\r\n type: typeof SET_NAME_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let SET_CAMERA_ITEM_SUCCESS = 'SET_CAMERA_ITEM_SUCCESS';\r\nexport let SET_CAMERA_ITEM_FAILURE = 'SET_CAMERA_ITEM_FAILURE';\r\n\r\ninterface SetCameraItemSuccessAction {\r\n type: typeof SET_CAMERA_ITEM_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface SetCameraItemFailureAction {\r\n type: typeof SET_CAMERA_ITEM_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let REMOVE_CAMERA_ITEM_SUCCESS = 'REMOVE_CAMERA_ITEM_SUCCESS';\r\nexport let REMOVE_CAMERA_ITEM_FAILURE = 'REMOVE_CAMERA_ITEM_FAILURE';\r\n\r\ninterface RemoveCameraItemSuccessAction {\r\n type: typeof REMOVE_CAMERA_ITEM_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface RemoveCameraItemFailureAction {\r\n type: typeof REMOVE_CAMERA_ITEM_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let ADD_PAGE_SUCCESS = 'ADD_PAGE_SUCCESS';\r\nexport let ADD_PAGE_FAILURE = 'ADD_PAGE_FAILURE';\r\n\r\ninterface AddPageSuccessAction {\r\n type: typeof ADD_PAGE_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface AddPageFailureAction {\r\n type: typeof ADD_PAGE_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let REMOVE_PAGE_SUCCESS = 'REMOVE_PAGE_SUCCESS';\r\nexport let REMOVE_PAGE_FAILURE = 'REMOVE_PAGE_FAILURE';\r\n\r\ninterface RemovePageSuccessAction {\r\n type: typeof REMOVE_PAGE_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface RemovePageFailureAction {\r\n type: typeof REMOVE_PAGE_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let RESIZE_PAGE_SUCCESS = 'RESIZE_PAGE_SUCCESS';\r\nexport let RESIZE_PAGE_FAILURE = 'RESIZE_PAGE_FAILURE';\r\n\r\ninterface ResizePageSuccessAction {\r\n type: typeof RESIZE_PAGE_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface ResizePageFailureAction {\r\n type: typeof RESIZE_PAGE_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let SAVE_VIDEOBOARD_BEGIN = 'SAVE_VIDEOBOARD_BEGIN';\r\nexport let SAVE_VIDEOBOARD_SUCCESS = 'SAVE_VIDEOBOARD_SUCCESS';\r\nexport let SAVE_VIDEOBOARD_FAILURE = 'SAVE_VIDEOBOARD_FAILURE';\r\n\r\ninterface SaveVideoboardBeginAction {\r\n type: typeof SAVE_VIDEOBOARD_BEGIN;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface SaveVideoboardSuccessAction {\r\n type: typeof SAVE_VIDEOBOARD_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface SaveVideoboardFailureAction {\r\n type: typeof SAVE_VIDEOBOARD_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let SAVE_PAGE_STATE = 'SAVE_PAGE_STATE';\r\n\r\ninterface SavePageStateAction {\r\n type: typeof SAVE_PAGE_STATE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let CLEAR_EDITOR_STATE = 'CLEAR_EDITOR_STATE';\r\n\r\ninterface ClearEditorStateAction {\r\n type: typeof CLEAR_EDITOR_STATE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let CLEAR_EDITOR_ERROR = 'CLEAR_EDITOR_ERROR';\r\n\r\ninterface ClearEditorErrorAction {\r\n type: typeof CLEAR_EDITOR_ERROR;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let GET_VIDEOBOARD_LIST_BEGIN = 'GET_VIDEOBOARD_LIST_BEGIN';\r\nexport let GET_VIDEOBOARD_LIST_SUCCESS = 'GET_VIDEOBOARD_LIST_SUCCESS';\r\nexport let GET_VIDEOBOARD_LIST_FAILURE = 'GET_VIDEOBOARD_LIST_FAILURE';\r\n\r\ninterface GetVideoboardListBeginAction {\r\n type: typeof GET_VIDEOBOARD_LIST_BEGIN;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface GetVideoboardListSuccessAction {\r\n type: typeof GET_VIDEOBOARD_LIST_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface GetVideoboardListFailureAction {\r\n type: typeof GET_VIDEOBOARD_LIST_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport let DELETE_VIDEOBOARD_BEGIN = 'DELETE_VIDEOBOARD_BEGIN';\r\nexport let DELETE_VIDEOBOARD_SUCCESS = 'DELETE_VIDEOBOARD_SUCCESS';\r\nexport let DELETE_VIDEOBOARD_FAILURE = 'DELETE_VIDEOBOARD_FAILURE';\r\n\r\ninterface DeleteVideoboardBeginAction {\r\n type: typeof DELETE_VIDEOBOARD_BEGIN;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface DeleteVideoboardSuccessAction {\r\n type: typeof DELETE_VIDEOBOARD_SUCCESS;\r\n payload: EditorPayload;\r\n}\r\n\r\ninterface DeleteVideoboardFailureAction {\r\n type: typeof DELETE_VIDEOBOARD_FAILURE;\r\n payload: EditorPayload;\r\n}\r\n\r\nexport type EditorTypes = InitializeVideoboardSuccessAction |\r\nLoadVideoboardSuccessAction |\r\nInitializeVideoboardFailureAction |\r\nSetNameSuccessAction |\r\nSetNameFailureAction |\r\nSetCameraItemSuccessAction |\r\nSetCameraItemFailureAction |\r\nRemoveCameraItemSuccessAction |\r\nRemoveCameraItemFailureAction |\r\nAddPageSuccessAction |\r\nAddPageFailureAction |\r\nRemovePageSuccessAction |\r\nRemovePageFailureAction |\r\nResizePageSuccessAction |\r\nResizePageFailureAction |\r\nSaveVideoboardBeginAction |\r\nSaveVideoboardSuccessAction | \r\nSaveVideoboardFailureAction |\r\nSavePageStateAction |\r\nClearEditorStateAction |\r\nClearEditorErrorAction |\r\nGetVideoboardListBeginAction |\r\nGetVideoboardListSuccessAction | \r\nGetVideoboardListFailureAction;","//libraries\r\nimport * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter, RouteComponentProps } from 'react-router-dom';\r\nimport { bindActionCreators, Dispatch } from \"redux\";\r\nimport videojs from 'video.js';\r\nimport { nuon } from \"@caps-mobile/common-lib\";\r\n// interfaces & models\r\nimport { \r\n IAAUserAuthorizationProfile \r\n} from '@algo/network-manager/models/v3/admin';\r\nimport { \r\n EATRegion, EATStreamAccessLevel, IATCamera\r\n} from \"@algo/network-manager/models/v3\";\r\n// components\r\nimport Content from '../base/layout/Content';\r\nimport Camera from '../base/cameramgmt/Camera';\r\nimport Loading from '../pages/Loading';\r\nimport SelectionRow from '../base/SelectionRow';\r\nimport DummySearch from '../base/DummySearch';\r\nimport AccessLevelLegendModal from '../base/modals/AccessLevelLegendModal';\r\n//store\r\nimport { AppState } from \"../../store\";\r\nimport { ProfileState } from \"../../store/profile/types\";\r\nimport { CameraState } from \"../../store/camera/types\";\r\nimport { DatasourceState } from \"../../store/datasource/types\";\r\nimport { User } from \"oidc-client\";\r\nimport { \r\n getCameras, getCamerasForManagement, \r\n refreshCameraLists, clearCameraStoreError \r\n} from '../../store/camera/actions';\r\nimport { loadDatasources } from '../../store/datasource/actions';\r\n\r\n//constants\r\nimport { CAMERA_REFRESH_INTERVAL } from '../../utils/AppConstants';\r\nimport {\r\n MEDIA_STREAM_ACCESS,\r\n FIRST_RESPONDER_STREAM_ACCESS,\r\n PRIVATE_SECTOR_STREAM_ACCESS,\r\n INTERNAL_STREAM_ACCESS,\r\n UNLIMITED_STREAMING\r\n} from '../../models/Privileges';\r\nimport {STREAM_TIMEOUT_INTERVAL} from '../../utils/AppConstants';\r\n\r\n//image constants\r\nimport {CAMERA_MANAGEMENT as PAGE_IMAGES} from '../../constants/imageObjects';\r\nimport { videojsHtml5 } from \"../../constants/videojs-html5\";\r\n\r\nconst videoJSConfig = {\r\n html5: videojsHtml5\r\n};\r\n\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n profile: ProfileState;\r\n camera: CameraState;\r\n datasource: DatasourceState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user,\r\n profile: state.profile,\r\n camera: state.camera,\r\n datasource: state.datasource\r\n };\r\n}\r\n\r\ninterface DispatchProps {\r\n loadDatasources: typeof loadDatasources;\r\n getCameras: typeof getCameras;\r\n getCamerasForManagement: typeof getCamerasForManagement;\r\n refreshCameraLists: typeof refreshCameraLists;\r\n clearCameraStoreError: typeof clearCameraStoreError;\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch) => {\r\n return bindActionCreators({\r\n loadDatasources: loadDatasources,\r\n getCameras: getCameras,\r\n getCamerasForManagement: getCamerasForManagement,\r\n refreshCameraLists: refreshCameraLists,\r\n clearCameraStoreError: clearCameraStoreError\r\n }, dispatch);\r\n}\r\n\r\ntype CameraManagementProps = \r\n StateProps & \r\n DispatchProps & \r\n RouteComponentProps;\r\n\r\ninterface CameraManagementState {\r\n selectedRegion: EATRegion;\r\n query: string;\r\n showLegendModal: boolean;\r\n\r\n // view livestream modal\r\n viewingLivestream: boolean;\r\n livestreamItem: IATCamera | null;\r\n isFullscreen: boolean;\r\n}\r\n\r\nclass CameraManagement extends React.Component {\r\n \r\n cameraRefresher: NodeJS.Timeout | null;\r\n pageRefresher: NodeJS.Timeout | null;\r\n player: videojs.Player | null;\r\n streamNodeRef: React.RefObject;\r\n modalRef: React.RefObject;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.pageRefresher = null;\r\n this.player = null;\r\n\r\n this.streamNodeRef = React.createRef();\r\n this.modalRef = React.createRef();\r\n\r\n this.fetchCameras();\r\n this.props.loadDatasources();\r\n\r\n this.cameraRefresher = \r\n setInterval(this.fetchCameras, CAMERA_REFRESH_INTERVAL);\r\n\r\n this.state = {\r\n viewingLivestream: false,\r\n isFullscreen: false,\r\n selectedRegion: EATRegion.ALDOT,\r\n query: '',\r\n showLegendModal: false\r\n } as CameraManagementState;\r\n\r\n }\r\n\r\n camerasNotBusy(){\r\n return (\r\n !this.props.camera.loading &&\r\n !this.props.camera.processing\r\n );\r\n }\r\n\r\n headersChange(prevProps: CameraManagementProps){\r\n let curChecksum: string = this.props.camera.checksum;\r\n let curCount: string = this.props.camera.count;\r\n\r\n let prevChecksum: string = prevProps.camera.checksum;\r\n let prevCount: string = prevProps.camera.count;\r\n \r\n return (\r\n (curChecksum !== prevChecksum) ||\r\n (curCount !== prevCount)\r\n );\r\n }\r\n\r\n componentWillUnmount() {\r\n this.disposeVideoJS();\r\n\r\n this.props.getCamerasForManagement(EATRegion.Unknown);\r\n\r\n if (this.pageRefresher) {\r\n clearInterval(this.pageRefresher);\r\n }\r\n\r\n this.cameraRefresher &&\r\n clearInterval(this.cameraRefresher);\r\n }\r\n\r\n componentDidUpdate(prevProps: any, prevState: any, snapshot: any) {\r\n if (this.streamNodeRef.current)\r\n this.player = videojs(this.streamNodeRef.current, videoJSConfig);\r\n\r\n if (this.state.viewingLivestream) {\r\n this.modalRef.current &&\r\n ($(this.modalRef.current) as any).modal('show');\r\n\r\n if (this.streamNodeRef.current)\r\n this.player = videojs(this.streamNodeRef.current, videoJSConfig);\r\n\r\n videojs.log.level('off');\r\n\r\n this.player?.play();\r\n }\r\n\r\n if ( \r\n this.camerasNotBusy() && \r\n ( this.headersChange(prevProps) || !this.props.camera.mgmtFilteredItems)\r\n ){\r\n this.props.getCamerasForManagement(this.state.selectedRegion, this.state.query);\r\n }\r\n\r\n if (this.state.selectedRegion !== prevState.selectedRegion) {\r\n this.props.getCamerasForManagement(this.state.selectedRegion, this.state.query);\r\n }\r\n else if (this.state.query !== prevState.query) {\r\n this.props.getCamerasForManagement(this.state.selectedRegion, this.state.query);\r\n }\r\n else if (\r\n (this.props.camera.mgmtFilteredItems?.length === 0) && //you suddenly have 0 mgmtFilteredItems...\r\n (prevProps.camera.mgmtFilteredItems.length > 0) && //but last time you have some...\r\n (this.state.query === prevState.query) && //and the query didn't change...\r\n (this.state.selectedRegion === prevState.selectedRegion)) //and the datasource stayed the same...\r\n \r\n //then you need to start another camera get, because you just got bamboozled by a previous ComponentWillUnmount call to wipe the cameras\r\n {this.props.getCamerasForManagement(this.state.selectedRegion, this.state.query);}\r\n }\r\n\r\n disposeVideoJS = () => {\r\n if (this.player){ \r\n try {\r\n if (!this.player.isDisposed)\r\n this.player.pause();\r\n this.player.ended();\r\n this.player.dispose();\r\n this.player = null;\r\n }\r\n catch(e){\r\n console.error(`Video.js Error: `, e);\r\n }\r\n }\r\n }\r\n\r\n fetchCameras = (): void => {\r\n if (!this.props.camera.processing) {\r\n this.props.getCameras();\r\n }\r\n }\r\n\r\n datasourceSelectorChange = (region: EATRegion): void => {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n selectedRegion: region\r\n };\r\n });\r\n }\r\n\r\n datasourceSearchChange = (event: React.ChangeEvent): void => {\r\n event.persist();\r\n \r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n query: event.target.value\r\n };\r\n });\r\n }\r\n\r\n showLegendModal = (): void => {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n showLegendModal: true\r\n };\r\n });\r\n };\r\n\r\n errorModalDismissCallback = (): void => {\r\n this.props.clearCameraStoreError();\r\n\r\n this.props.history.push('/cameras');\r\n }\r\n\r\n legendModalDismissCallback = (): void => {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n showLegendModal: false\r\n };\r\n });\r\n }\r\n\r\n reloadPage = (): void => {\r\n window.location.reload();\r\n }\r\n\r\n viewLivestreamClick = (item: IATCamera) => {\r\n if (!this.props.profile.userProfile.hasPrivilege(UNLIMITED_STREAMING)) {\r\n this.pageRefresher = setInterval(this.reloadPage, STREAM_TIMEOUT_INTERVAL);\r\n }\r\n\r\n this.setState({\r\n viewingLivestream: true,\r\n livestreamItem: item\r\n });\r\n }\r\n\r\n closeLivestreamClick = (event: React.MouseEvent): void => {\r\n this.modalRef.current &&\r\n ($(this.modalRef.current) as any).modal('hide');\r\n\r\n this.disposeVideoJS();\r\n\r\n this.setState({\r\n viewingLivestream: false,\r\n livestreamItem: null\r\n });\r\n\r\n if (!this.props.profile.userProfile.hasPrivilege(UNLIMITED_STREAMING)) {\r\n this.pageRefresher && \r\n clearInterval(this.pageRefresher);\r\n }\r\n }\r\n\r\n toggleFullscreen = (event: React.MouseEvent): void => {\r\n event.preventDefault();\r\n\r\n if (this.state.isFullscreen) {\r\n this.player?.exitFullscreen();\r\n }\r\n else {\r\n this.player?.requestFullscreen();\r\n }\r\n\r\n this.setState((state, props) => {\r\n return {\r\n isFullscreen: !state.isFullscreen\r\n };\r\n });\r\n }\r\n\r\n isAvailableToUser = (\r\n item?: IATCamera | null, \r\n user?: User | null, \r\n userProfile?: IAAUserAuthorizationProfile | null\r\n ) => {\r\n if (!item || !user || !userProfile) return false;\r\n\r\n let isNonExpiredUser: boolean = \r\n nuon(user) && !user.expired;\r\n let hasAldot: boolean = \r\n userProfile.hasPrivilege(INTERNAL_STREAM_ACCESS);\r\n let hasFirstResponder: boolean = \r\n userProfile.hasPrivilege(FIRST_RESPONDER_STREAM_ACCESS) || hasAldot;\r\n let hasMedia: boolean = \r\n userProfile.hasPrivilege(MEDIA_STREAM_ACCESS) || hasFirstResponder;\r\n let hasStakeholder: boolean = \r\n userProfile.hasPrivilege(PRIVATE_SECTOR_STREAM_ACCESS) || hasMedia;\r\n\r\n switch (item.accessLevel) {\r\n case EATStreamAccessLevel.Public:\r\n return isNonExpiredUser;\r\n case EATStreamAccessLevel.Stakeholder:\r\n return isNonExpiredUser && hasStakeholder;\r\n case EATStreamAccessLevel.Media:\r\n return isNonExpiredUser && hasMedia;\r\n case EATStreamAccessLevel.FirstResponder:\r\n return isNonExpiredUser && hasFirstResponder;\r\n case EATStreamAccessLevel.ALDOT:\r\n return isNonExpiredUser && hasAldot;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n renderLivestreamModal = (item: IATCamera | null): React.ReactNode => {\r\n if (!item) return null;\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n renderCameraElements = (\r\n items: IATCamera[] | null, \r\n selectedRegion: EATRegion\r\n ): React.ReactNode => {\r\n if (items && items.length > 0) {\r\n return items.map(\r\n (item, index) =>\r\n \r\n );\r\n }\r\n else {\r\n let alertMessage: string = (selectedRegion === \"Unknown\")\r\n ? 'Select a region from the toolbar to view cameras for that region'\r\n : 'No cameras found for given query';\r\n\r\n return (\r\n
\r\n
\r\n {alertMessage}\r\n
\r\n
\r\n );\r\n }\r\n }\r\n\r\n renderLegendModal = (displayModal: boolean) => {\r\n if (displayModal) {\r\n return (\r\n \r\n );\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n render() {\r\n let { camera, datasource } = this.props;\r\n\r\n if (datasource.loading || datasource.datasources.length === 0) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n let optionBlocks: any = [\r\n { id: 0, region: EATRegion.ALDOT, title: \"ALL\", subtitle: \"All Regions\", hidden: false}, //must manually handle All regions option\r\n ...datasource.datasources.map( //get the rest as function of datasource\r\n (item) => {\r\n return { \r\n id: item.id,\r\n region: item.region,\r\n title: item.displayAbbreviation, \r\n subtitle: item.displayName, \r\n hidden: false \r\n };\r\n }\r\n )\r\n ];\r\n\r\n let defaultSelection = 0;\r\n let selectorChange = this.datasourceSelectorChange;\r\n function callBack(selectionRowState: any){\r\n selectorChange(optionBlocks[selectionRowState.selectedIndex].region);\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n

Cameras

\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n {this.renderCameraElements(camera.mgmtFilteredItems, this.state.selectedRegion,)}\r\n {\r\n this.state.viewingLivestream\r\n ? this.renderLivestreamModal(this.state.livestreamItem)\r\n : ''\r\n }\r\n
\r\n
\r\n
\r\n
\r\n {this.renderLegendModal(this.state.showLegendModal)}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n mapDispatchToProps\r\n)(withRouter(CameraManagement));","// libraries\r\nimport * as React from 'react';\r\nimport { connect } from \"react-redux\";\r\n// models & interfaces\r\nimport { IATCamera } from '@algo/network-manager/models/v3';\r\n// store\r\nimport { AppState } from '../../../store';\r\nimport { ProfileState } from '../../../store/profile/types';\r\nimport { User } from 'oidc-client';\r\n// constants\r\nimport { ASPECT_RATIO_16_10 } from '../../../utils/AppConstants';\r\n\r\ninterface OwnProps {\r\n item: IATCamera;\r\n className?: string;\r\n isAdminView: boolean;\r\n isAvailable: boolean;\r\n viewLivestreamClick: (item: IATCamera) => void;\r\n}\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n profile: ProfileState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user,\r\n profile: state.profile\r\n };\r\n};\r\n\r\ntype CameraProps = OwnProps & StateProps;\r\n\r\ninterface CameraState {\r\n viewingLivestream: boolean;\r\n isFullscreen: boolean;\r\n imageUrl: string;\r\n loadingImage: boolean;\r\n snapshotAspectRatioClass: string;\r\n}\r\n\r\nclass Camera extends React.Component {\r\n /*\r\n * SNAPSHOT REF\r\n *\r\n * This tracks the instance of the snapshot in DOM \r\n * for an instance of the Camera Component\r\n * \r\n */\r\n snapshotRef: React.RefObject;\r\n \r\n constructor(props: Readonly) {\r\n super(props);\r\n /*\r\n * CREATE SNAPSHOT REF\r\n * \r\n * This creates the ref instance used \r\n * by this component instance\r\n * \r\n */ \r\n this.snapshotRef = React.createRef();\r\n\r\n this.state = {\r\n imageUrl: '',\r\n loadingImage: true,\r\n snapshotAspectRatioClass: 'fill'\r\n } as CameraState;\r\n }\r\n\r\n componentDidMount() {\r\n /*\r\n * SNAPSHOT IMAGE LOAD EVENT LISTENER\r\n * \r\n * Adding an event listener to fire off and event\r\n * when the image has loaded\r\n */ \r\n this.snapshotRef.current &&\r\n this.snapshotRef.current.addEventListener('load', this.snapshotImageLoaded);\r\n }\r\n\r\n componentWillUnmount() {\r\n /*\r\n * REMOVE SNAPSHOT IMAGE LOAD EVENT LISTENER\r\n * \r\n * Trying to avoid memory leaks.\r\n * \r\n */ \r\n\r\n this.snapshotRef.current &&\r\n this.snapshotRef.current.removeEventListener('load', this.snapshotImageLoaded);\r\n }\r\n\r\n /*\r\n * SNAPSHOT IMAGE LOADED EVENT\r\n * \r\n * When the snapshot image is loaded this event is fired.\r\n * \r\n * If the natural aspect ratio is 16:10 then set to object-fit to contain;\r\n * otherwise set object-fit to fill.\r\n * \r\n */ \r\n snapshotImageLoaded = (event: Event): void => {\r\n let snapshot = this.snapshotRef.current;\r\n\r\n if (snapshot) {\r\n\r\n let naturalAspectRatio: number = snapshot.naturalWidth / snapshot.naturalHeight;\r\n let aspectRatioClass: string = 'fill';\r\n\r\n if (naturalAspectRatio === ASPECT_RATIO_16_10)\r\n aspectRatioClass = 'contain';\r\n\r\n this.setState({\r\n ...this.state,\r\n snapshotAspectRatioClass: aspectRatioClass\r\n });\r\n }\r\n \r\n }\r\n\r\n reloadPage = (): void => {\r\n window.location.reload();\r\n }\r\n\r\n render() {\r\n const { item, className } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n {`Camera\r\n
\r\n
\r\n
\r\n {item.location.routeDesignator}\r\n
\r\n
\r\n {item.location.crossStreet}\r\n
\r\n
\r\n
\r\n { this.props.viewLivestreamClick(item) }}\r\n >\r\n View Livestream\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 connect(\r\n mapStateToProps\r\n)(Camera);","//libraries\r\nimport * as React from 'react';\r\n\r\nconst COLOR_CONSTANTS: any = {\r\n archiveCyan: \"linear-gradient(45deg, rgba(38,111,140,1) 0%,rgba(58,174,194,1) 12%,rgba(76,226,240,1) 29%,rgba(66,192,214,1) 50%,rgba(97,179,199,1) 60%,rgba(97,179,199,1) 60%,rgba(58,165,194,1) 74%,rgba(58,165,194,1) 74%,rgba(170,210,222,1) 100%,rgba(207,226,233,1) 100%)\",\r\n blue: \"dodgerBlue\",\r\n white: \"#fff\",\r\n secondary: \"antiqueWhite\",\r\n greyMedium: \"rgb(118,131,143)\",\r\n grayMedium: \"rgb(118, 131, 143)\",\r\n greyLight: \"WhiteSmoke\",\r\n grayLight: \"WhiteSmoke\",\r\n}\r\n\r\nconst DEFAULT_STYLES: any = {\r\n SELECTION_ROW_BLOCKS: {\r\n overflowX: \"auto\" as \"auto\",\r\n fontSize: \"16px\",\r\n color: COLOR_CONSTANTS.grayMedium,\r\n \"WebkitBoxShadow\": \"inset 0px 0px 12px -2px rgba(0,0,0,0.19)\",\r\n \"MozBoxShadow\": \"inset 0px 0px 12px -2px rgba(0, 0, 0, 0.19)\",\r\n \"BoxShadow\": \"inset 0px 0px 12px -2px rgba(0, 0, 0, 0.19)\",\r\n },\r\n NAV_BUTTON: {\r\n cursor: \"pointer\",\r\n },\r\n BLOCK_WRAPPER: {\r\n cursor: \"pointer\",\r\n paddingLeft: \"10px\",\r\n paddingRight: \"10px\",\r\n borderRadius: \"10px\",\r\n backgroundColor: COLOR_CONSTANTS.greyLight,\r\n active: {\r\n background: COLOR_CONSTANTS.archiveCyan,\r\n color: COLOR_CONSTANTS.white,\r\n borderRadius: \"10px\",\r\n }\r\n },\r\n BLOCK_TITLE: {\r\n textAlign: \"center\",\r\n fontSize: \"32px\",\r\n minWidth: \"70px\",\r\n cursor: \"pointer\",\r\n active: {\r\n //\r\n }\r\n },\r\n BLOCK_SUBTITLE: {\r\n textAlign: \"center\",\r\n minWidth: \"70px\",\r\n cursor: \"pointer\",\r\n active: {\r\n //\r\n }\r\n }\r\n}\r\n\r\n/* Used by SelectionRow and OptionObject to combine the default styles with the user-supplied styles */\r\nconst compileStyles = (style1: any = null, style2: any = null, ruleString: string): any => {\r\n if (!style1 && !style2) return {}; //if both null, return empty style object\r\n if (!style1 && style2) return style2[ruleString]; //if only style2, return style2 rule\r\n if (style1 && !style2) return style1[ruleString]; //if only style1, return style1 rule\r\n let compiledStyles: any = { \r\n ...style1[ruleString], \r\n ...style2[ruleString],\r\n }\r\n return compiledStyles; //otherwise return the two rules combined\r\n}\r\n\r\n/* \r\n * \r\n * \r\n * Displays a list of options for the User to select from.\r\n * When an option is chosen (either by a MouseClick, Enter Keypress, or Button increment/decrement) the Component state will be returned to parent via callbackAction prop\r\n * \r\n * \r\n */\r\n\r\ninterface IProps {\r\n defaultStyles?: boolean; //flag to signal self-styling\r\n defaultSelection?: number; //if missing, there will be no active selection by default ( defaults to value -1 ).\r\n navButtonObjects?: Array; //an array of objects containing information about NavButtons for the SelectionRow. If absent, no buttons are used ( current design expects a left button and right button, but there is room for expansion ).\r\n styles?: any; //styling object supplied by parent, if exists, will be decomposed into compiledStyles object, overwriting defaults if defaults flag is true (styling object MUST match the formatting of default object to guarantee success)\r\n optionBlocks: Array; //array of objects containing information about the choices available in the SelectionRow. Used by OptionBlock child Component to build up the contents of SelectionRow.\r\n callbackAction: any; //callback function called when an option is selected. function should expect to receive the Component state of SeletionRow as an argument\r\n}\r\n\r\ninterface IState {\r\n selectedIndex: number;\r\n}\r\n\r\nexport class SelectionRow extends React.Component {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n this.state = {\r\n selectedIndex: this.validateDefaultSelection(),\r\n }\r\n this.props.callbackAction(this.state); //update the parent with the default selection\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Lifecycle Functions \r\n ************************************************************************************************************************************************/\r\n\r\n componentDidUpdate(prevProps: any) {\r\n if (prevProps.optionBlocks.length !== this.props.optionBlocks.length)\r\n if (this.props.defaultSelection) this.validateDefaultSelection();\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Main Render \r\n ************************************************************************************************************************************************/\r\n\r\n render() {\r\n if (this.props.optionBlocks.length === 0) return null; //if empty list of options was supplied, cancel render\r\n return (\r\n
\r\n
\r\n {this.renderButton(0)} {/* render button 0, if it exists */}\r\n
\r\n
\r\n {this.props.optionBlocks.map(\r\n (optionBlock, index) => {\r\n if (!optionBlock.hidden) { //if the option was not set to hidden, render the option\r\n return (\r\n \r\n );\r\n }\r\n })\r\n }\r\n
\r\n
\r\n {this.renderButton(1)} {/* render button 1, if it exists */}\r\n
\r\n
\r\n );\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Helper Render \r\n ************************************************************************************************************************************************/\r\n\r\n /* render a NavButton in the option selection space based on the buttonSelector number provided */\r\n renderButton = (buttonSelector: number = 0) => { if (!this.props.navButtonObjects) return null; //if buttons are not supplied, just return\r\n let imgObj: any = this.props.navButtonObjects[buttonSelector]; //get object from list \r\n let floatClass = buttonSelector === 0 ? \"float-left\" : (buttonSelector === 1 ? \"float-right\" : \"\") //decide which way to float-align \r\n return (\r\n
\r\n
{/* apply the float class */}\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Logic Functions \r\n ************************************************************************************************************************************************/\r\n\r\n /* Used to determine if the given Block is currently selected */\r\n determineActive = (optionBlock: any) => {\r\n if (this.state.selectedIndex === null || this.state.selectedIndex === undefined || this.state.selectedIndex === -1) return false; //if NOTHING selected, false\r\n return (optionBlock.id === this.props.optionBlocks[this.state.selectedIndex].id); //if current Block id and selectedBlock id match, true\r\n }\r\n\r\n /* this function determines what function should be called when the corresponding NavButton is clicked */\r\n selectOnClickFunction = (buttonSelector: number) => {\r\n if (this.props.navButtonObjects) {\r\n let imgObj: any = this.props.navButtonObjects[buttonSelector]; //get the image object for the given index selector\r\n if (buttonSelector === 0) return this.decrementSelection; //index 0 reserved for the decrement function object\r\n else if (buttonSelector === 1) return this.incrementSelection; //index 1 reserved for the increment function object\r\n else if (imgObj.onClick) return imgObj.onClick; //remaining indicies should supply their own function\r\n }\r\n return () => { return null }; //no function supplied, means null function returned\r\n }\r\n\r\n /* Confirm that the current value of defaultSelection is valid */\r\n validateDefaultSelection = () => {\r\n let selectedIndex = this.props.defaultSelection; //rename for brevity\r\n if (\r\n selectedIndex === null || //cannot be null\r\n selectedIndex === undefined || //must be defined\r\n selectedIndex < 0 || //must be greater than 0\r\n selectedIndex > (this.props.optionBlocks.length - 1) //must be an index within the bounds of the list\r\n ) selectedIndex = -1; //if any condition fails, default value is -1 (unselected)\r\n return selectedIndex; //return the validated prop, or default value\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Event Handlers \r\n ************************************************************************************************************************************************/\r\n /* The default function implemented by NavButton 0 (the 'go back one' function of option selection) */\r\n decrementSelection = () => {\r\n if (this.state.selectedIndex <= 0) return null; //if selection 0 just return\r\n this.setState({\r\n ...this.state, selectedIndex: ( this.state.selectedIndex - 1 ), //update state with new selection\r\n })\r\n this.props.callbackAction({ ...this.state, selectedIndex: (this.state.selectedIndex - 1) }); //inform parent of the new selection\r\n }\r\n\r\n /* The default function implemented by NavButton 1 (the 'go forward one' function of option selection) */\r\n incrementSelection = () => {\r\n if (this.state.selectedIndex === ( this.props.optionBlocks.length - 1) ) return null; //if selection max index, just return\r\n this.setState({\r\n ...this.state, selectedIndex: (this.state.selectedIndex + 1 ), //update state with new selection\r\n })\r\n this.props.callbackAction({...this.state, selectedIndex: (this.state.selectedIndex + 1)}); //inform parent of the new selection\r\n }\r\n\r\n /* This is the callbackAction passed to the Block children so they may inform parent when they are interacted with */\r\n handleBlockClick = (index: number) => { \r\n this.setState({\r\n ...this.state,\r\n selectedIndex: index,\r\n });\r\n this.props.callbackAction({ ...this.state, selectedIndex: index }); //just pass the value they give you back up to your own callbackAction\r\n }\r\n \r\n /* Implemented by elements that want to respond as if they were clicked when the Enter key is pressed */\r\n handleKeyUp = (event: any) => {\r\n if (event.key === 'Enter') { //When the Enter key is pressed and released...\r\n let buttonSelector: number = parseInt(event.target.id[event.target.id.length - 1]); //parse out the affected element's buttonSelector\r\n this.selectOnClickFunction(buttonSelector)(); //get and call the appropriate on click function\r\n }\r\n }\r\n}\r\n\r\nexport default SelectionRow;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\ninterface IOptionBlockProps {\r\n defaultStyles?: any; //if true, indicates that the Block should style itself using the defaults provided in this file\r\n config: any; //object containing the string values of title and subtitle. In the future, may be abstracted as necessary to add other elements to a Block\r\n active: boolean; //identifies the Block as currently selected and changes its properties to reflect this\r\n index: number; //tells the Block what index it is in the parent's list, used for callbackAction\r\n callbackAction: any; //allows the Block to communicate a change to its parent\r\n}\r\n\r\ninterface IOptionBlockState {\r\n defaultTitleStyle: any; //exists to allow a state-ful change to the appearance of the Block title\r\n defaultSubtitleStyle: any; //exists to allow a state-ful change to the appearance of the Block subtitle\r\n defaultBlockWrapperStyle: any; //exists to allow a state-ful change to the appearance of the Block element\r\n}\r\n\r\nclass OptionBlock extends React.Component{\r\n\r\n constructor(props: any) { //get started with a default state\r\n super(props);\r\n const active = this.props.active;\r\n this.state = {\r\n defaultBlockWrapperStyle: active ? { ...DEFAULT_STYLES.BLOCK_WRAPPER, ...DEFAULT_STYLES.BLOCK_WRAPPER.active } : { ...DEFAULT_STYLES.BLOCK_WRAPPER },\r\n defaultTitleStyle: active ? { ...DEFAULT_STYLES.BLOCK_TITLE, ...DEFAULT_STYLES.BLOCK_TITLE.active} : { ...DEFAULT_STYLES.BLOCK_TITLE},\r\n defaultSubtitleStyle: active ? { ...DEFAULT_STYLES.BLOCK_SUBTITLE, ...DEFAULT_STYLES.BLOCK_SUBTITLE.active } : { ...DEFAULT_STYLES.BLOCK_SUBTITLE},\r\n }\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Lifecycle Functions \r\n ************************************************************************************************************************************************/\r\n\r\n componentDidUpdate(prevProps: any) {\r\n if (prevProps.active !== this.props.active) { //if props.active changed\r\n if (this.props.defaultStyles) {\r\n this.styleBlock();\r\n }\r\n }\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Main Render \r\n ************************************************************************************************************************************************/\r\n\r\n render() {\r\n if (this.props.config.hidden) return null;\r\n let active = this.props.active ? \"active\" : \"\";\r\n return (
\r\n \r\n
\r\n {this.renderBlockImage()}\r\n {this.renderBlockText()}\r\n
\r\n
\r\n );\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Helper Render \r\n ************************************************************************************************************************************************/\r\n\r\n renderBlockImage = () => {\r\n if (!this.props.config.img) return null;\r\n let active = this.props.active ? \"active\" : \"\";\r\n return (\r\n
\r\n
\r\n {this.props.config.img.alt}\r\n
\r\n
\r\n );\r\n }\r\n\r\n renderBlockText = () => {\r\n if (!this.props.config.title && !this.props.config.subtitle) return null;\r\n else return (
{this.renderBlockTitle()} {this.renderBlockSubtitle()}
);\r\n }\r\n\r\n renderBlockTitle = () => {\r\n if (!this.props.config.title) return null; //if no title was supplied, just return\r\n let active = this.props.active ? \"active\" : \"\";\r\n return (\r\n
{this.props.config.title}
\r\n );\r\n }\r\n \r\n renderBlockSubtitle = () => {\r\n if (!this.props.config.subtitle) return null; //if no subtitle was supplied, just return\r\n let active = this.props.active ? \"active\" : \"\";\r\n return (\r\n
{this.props.config.subtitle}
\r\n );\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Event Handlers\r\n ************************************************************************************************************************************************/\r\n\r\n handleBlockClick = (event: any) => {\r\n console.log(`a block was clicked`);\r\n console.log(`the blocks index is: `, this.props.index);\r\n console.log(`the block's active status is: `, this.props.active);\r\n this.props.callbackAction(this.props.index);\r\n }\r\n\r\n handleKeyUp = (event: any) => {\r\n if (event.key === 'Enter') { //if Enter was pressed and released\r\n this.handleBlockClick(event); //just call the onClick button\r\n }\r\n }\r\n\r\n\r\n /*************************************************************************************************************************************************\r\n Logic Functions\r\n ************************************************************************************************************************************************/\r\n\r\n styleBlock = () => {\r\n const active = this.props.active;\r\n this.setState({\r\n ...this.state,\r\n defaultBlockWrapperStyle: active ? { ...DEFAULT_STYLES.BLOCK_WRAPPER, ...DEFAULT_STYLES.BLOCK_WRAPPER.active } : { ...DEFAULT_STYLES.BLOCK_WRAPPER },\r\n defaultTitleStyle: active ? { ...DEFAULT_STYLES.BLOCK_TITLE, ...DEFAULT_STYLES.BLOCK_TITLE.active } : { ...DEFAULT_STYLES.BLOCK_TITLE },\r\n defaultSubtitleStyle: active ? { ...DEFAULT_STYLES.BLOCK_SUBTITLE, ...DEFAULT_STYLES.BLOCK_SUBTITLE.active } : { ...DEFAULT_STYLES.BLOCK_SUBTITLE },\r\n });\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\n\r\n/* \r\n * \r\n * A rip-out from the SmartSearch Component. DummySearch looks exactly like SmartSearch but provides absolutely no functional logic internally. \r\n * DummySearch simply acts as a middle-man between user and parent to pass up user search text. \r\n * \r\n * Expects:\r\n * \r\n * an img object to display the input-group-append icon of the form:\r\n * {\r\n * src: Typescript imported image object,\r\n * alt: string,\r\n * width: number,\r\n * height: number,\r\n * }\r\n * \r\n * a callbackAction to pass up the user input event to parent of the form: \r\n * function(event: any){}\r\n * \r\n * \r\n */\r\n\r\ninterface IProps {\r\n img: any, //the text-group-append img as an image object\r\n callbackAction: any; //a function to call when the search logic is complete. the function should expect a SmartSearch state object as argument\r\n}\r\n\r\ninterface IState {\r\n searchTerm: string; //the string value found in the search bar value field; used to update the component to show user input in real time\r\n}\r\n\r\nexport class DummySearch extends React.Component {\r\n\r\n constructor(props: any) { //get started with a default state\r\n super(props);\r\n this.state = {\r\n searchTerm: \"\",\r\n }\r\n }\r\n\r\n /*************************************************************************************************************************************************\r\n Main Render \r\n ************************************************************************************************************************************************/\r\n\r\n render() {\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 Event Handlers \r\n ************************************************************************************************************************************************/\r\n\r\n /* \r\n * handles user changes on the input element representing the search bar string\r\n */\r\n handleSearchChange = (event: any) => { //When the search bar value is changed, take that event and...\r\n event.persist();\r\n this.setState({ ...this.state, searchTerm: event.target.value }); //update the searchTerm in state so that the view knows about the user input\r\n this.props.callbackAction(event);\r\n return null;\r\n }\r\n\r\n /*\r\n * handles user clicks on the text-group-append span representing the search button\r\n */\r\n handleSearchClick = (event: any) => { //When the search icon is clicked...\r\n return null;\r\n }\r\n\r\n /*\r\n * handles user Enter key press on the text-group-append span representing the search button \r\n */\r\n handleSearchKeyUp = (event: any) => {\r\n if (event.key === 'Enter') { //When the Enter key is pressed and released...\r\n this.handleSearchClick(event); //call the same function that is used to handle clicking the search button\r\n }\r\n }\r\n}\r\n\r\nexport default DummySearch;","import * as React from 'react';\r\n\r\ninterface AccessLevelLegendModalProps {\r\n dismissCallback: (() => void);\r\n}\r\n\r\ninterface AccessLevelLegendModalState {\r\n instanceId: number;\r\n}\r\n\r\nexport default class AccessLevelLegendModal extends React.Component {\r\n modalRef: React.RefObject;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.modalRef = React.createRef();\r\n\r\n this.state = {\r\n instanceId: Math.random()\r\n } as AccessLevelLegendModalState;\r\n }\r\n\r\n componentDidMount() {\r\n this.modalRef.current && \r\n ($(this.modalRef.current) as any).modal('show');\r\n }\r\n\r\n dismiss = (event: React.MouseEvent): void => {\r\n const { dismissCallback } = this.props;\r\n\r\n event.preventDefault();\r\n\r\n this.modalRef.current &&\r\n ($(this.modalRef.current) as any).modal('hide');\r\n\r\n dismissCallback();\r\n }\r\n\r\n render() {\r\n\r\n return (\r\n \r\n );\r\n }\r\n}","import { leftArrow } from '../images';\r\nimport { rightArrow } from '../images';\r\nimport { searchIcon } from '../images';\r\n//pages\r\nexport const CAMERA_MANAGEMENT = {\r\n //components\r\n SELECTION_ROW: {\r\n //images\r\n LEFT_ARROW: {\r\n src: leftArrow,\r\n alt: \"double left-facing arrows\",\r\n width: 48,\r\n height: 48,\r\n },\r\n RIGHT_ARROW: {\r\n src: rightArrow,\r\n alt: \"double right-facing arrows\",\r\n width: 48,\r\n height: 48,\r\n }\r\n },\r\n DUMMY_SEARCH: {\r\n SEARCH_ICON: {\r\n src: searchIcon,\r\n alt: \"a small magnifying glass\",\r\n width: 16,\r\n height: 16,\r\n }\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators, Dispatch } from \"redux\";\r\n// components\r\nimport { IAVLegacyVideoBoard } from \"@algo/network-manager/models/v3/video\";\r\nimport DismissableModal from '../modals/DismissableModal';\r\nimport DroppableVideoItem from './DroppableVideoItem';\r\nimport {Pager} from \"@algo/pager\";\r\n// store\r\nimport { AppState } from '../../../store';\r\nimport { CameraState } from '../../../store/camera/types';\r\nimport { EditorState } from '../../../store/videoboard/types';\r\nimport {\r\n setName, addPage,removePage, resizePage,\r\n save, clearEditorState, savePageState\r\n} from '../../../store/videoboard/actions';\r\nimport { \r\n DEFAULT_PAGE_INDEX \r\n} from '../../../utils/AppConstants';\r\n\r\ninterface OwnProps {\r\n id: number;\r\n currentPageIndex: number;\r\n rowSize: number;\r\n columnSize: number;\r\n}\r\n\r\ninterface StateProps {\r\n camera: CameraState;\r\n editor: EditorState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState) => {\r\n return {\r\n camera: state.camera,\r\n editor: state.editor\r\n };\r\n}\r\n\r\ninterface DispatchProps {\r\n setName: typeof setName;\r\n addPage: typeof addPage;\r\n removePage: typeof removePage;\r\n resizePage: typeof resizePage;\r\n save: typeof save;\r\n clearEditorState: typeof clearEditorState;\r\n savePageState: typeof savePageState;\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch) => {\r\n return bindActionCreators({\r\n setName: setName,\r\n addPage: addPage,\r\n removePage: removePage,\r\n resizePage: resizePage,\r\n save: save,\r\n clearEditorState: clearEditorState,\r\n savePageState: savePageState\r\n }, dispatch);\r\n}\r\n\r\ntype VideoboardEditorProps = OwnProps & StateProps & DispatchProps;\r\n\r\ninterface VideoboardEditorState {\r\n currentPageIndex: number;\r\n rowSize: number;\r\n columnSize: number;\r\n showNoNameModal: boolean;\r\n}\r\n\r\nclass VideoboardEditor extends React.Component {\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.state = {\r\n currentPageIndex: props.currentPageIndex ? props.currentPageIndex : DEFAULT_PAGE_INDEX,\r\n rowSize: props.rowSize ? props.rowSize : 2,\r\n columnSize: props.columnSize ? props.columnSize : 2,\r\n showNoNameModal: false\r\n } as VideoboardEditorState;\r\n }\r\n\r\n componentDidMount() {\r\n ($('[data-toggle=\"tooltip\"]') as any).tooltip();\r\n }\r\n\r\n componentDidUpdate(prevProps: any, prevState: any, snapshot: any) {\r\n\r\n if (this.props.editor.initialized && this.state.currentPageIndex > this.props.editor.videoboard.videoPages.length) {\r\n this.setState((prevState, props) => {\r\n return {\r\n currentPageIndex: 0\r\n };\r\n });\r\n }\r\n\r\n if (this.state.currentPageIndex !== prevState.currentPageIndex || this.state.rowSize !== prevState.rowSize || this.state.columnSize !== prevState.columnSize) {\r\n this.props.savePageState(this.state.currentPageIndex, this.state.rowSize, this.state.columnSize);\r\n }\r\n\r\n if (this.props.editor.initialized !== prevProps.editor.initialized || this.state.currentPageIndex !== prevState.currentPageIndex) {\r\n let videoPages = this.props.editor.videoboard.videoPages;\r\n let curPageIndex = this.state.currentPageIndex;\r\n\r\n if (\r\n videoPages[curPageIndex] && \r\n (\r\n videoPages[curPageIndex].rowSize !== prevState.rowSize || \r\n videoPages[curPageIndex].columnSize !== prevState.columnSize\r\n )\r\n ) {\r\n this.setState({\r\n rowSize: videoPages[curPageIndex].rowSize,\r\n columnSize: videoPages[curPageIndex].columnSize\r\n });\r\n }\r\n }\r\n }\r\n\r\n updatePageIndex = (newPageIndex: number) => {\r\n this.setState({\r\n ...this.state,\r\n currentPageIndex: newPageIndex,\r\n });\r\n }\r\n\r\n previousPage = (): void => {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n currentPageIndex: (state.currentPageIndex - 1) < 0 ? 0 : (state.currentPageIndex - 1) \r\n };\r\n });\r\n }\r\n\r\n nameChange = (event: React.ChangeEvent): void => {\r\n event.preventDefault();\r\n\r\n this.props.setName(event.currentTarget.value);\r\n }\r\n\r\n rowSizeChange = (event: React.ChangeEvent): void => {\r\n event.preventDefault();\r\n\r\n const rSize = parseInt(event.currentTarget.value);\r\n\r\n if (this.props.editor.videoboard.videoPages[this.state.currentPageIndex]) {\r\n this.props.resizePage(this.state.currentPageIndex, rSize, this.state.columnSize);\r\n }\r\n\r\n this.setState({\r\n rowSize: rSize\r\n });\r\n }\r\n\r\n columnSizeChange = (event: React.ChangeEvent): void => {\r\n event.preventDefault();\r\n\r\n const cSize = parseInt(event.currentTarget.value);\r\n\r\n if (this.props.editor.videoboard.videoPages[this.state.currentPageIndex]) {\r\n this.props.resizePage(this.state.currentPageIndex, this.state.rowSize, cSize);\r\n }\r\n\r\n this.setState({\r\n columnSize: cSize\r\n });\r\n }\r\n\r\n addPage = (event: React.MouseEvent): void => {\r\n event.preventDefault();\r\n\r\n this.props.addPage(this.state.rowSize, this.state.columnSize);\r\n\r\n this.setState((prevState, props) => {\r\n return {\r\n currentPageIndex: props.editor.videoboard.videoPages.length - 1\r\n };\r\n });\r\n }\r\n\r\n removePage = (event: React.MouseEvent): void => {\r\n event.preventDefault();\r\n\r\n if (this.props.editor.videoboard.videoPages.length > 0) {\r\n this.previousPage();\r\n\r\n this.props.removePage(this.state.currentPageIndex);\r\n }\r\n }\r\n\r\n saveVideoboard = (event: React.MouseEvent): void => {\r\n event.preventDefault();\r\n ($('[data-toggle=\"tooltip\"]') as any).tooltip('hide');\r\n if (this.props.editor.videoboard.name && this.props.editor.videoboard.name !== '') {\r\n this.props.save();\r\n }\r\n else {\r\n this.setState({\r\n showNoNameModal: true\r\n });\r\n }\r\n }\r\n\r\n nameModalCallback = (): void => {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n showNoNameModal: false\r\n }\r\n });\r\n }\r\n\r\n renderPage = (videoboard: IAVLegacyVideoBoard, currentPageIndex: number): React.ReactNode => {\r\n let page = videoboard.videoPages[currentPageIndex];\r\n\r\n if (!page) {\r\n return (\r\n
\r\n
\r\n Add a page to start building your videoboard\r\n
\r\n
\r\n );\r\n }\r\n else {\r\n let colClass = page ? (`av-grid-col-${page.columnSize}`) : '';\r\n let rowClass = page ? (`av-grid-row-${page.rowSize}`) : '';\r\n\r\n return (\r\n
\r\n {page.videoItems.map((videoItem: any, index: any) => {\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n }\r\n\r\n renderShowNoNameModal = (showModal: boolean): React.ReactNode => {\r\n if (showModal) {\r\n return (\r\n \r\n );\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n renderEditor = (): React.ReactNode => {\r\n let { editor } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n Save Videoboard\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n Remove current page\r\n \r\n \r\n Add page\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n {this.renderPage(editor.videoboard, this.state.currentPageIndex)}\r\n
\r\n \r\n
\r\n {this.renderShowNoNameModal(this.state.showNoNameModal)}\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n if (!this.props.editor.initialized) {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n else {\r\n return this.renderEditor();\r\n }\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n mapDispatchToProps\r\n)(VideoboardEditor);","import * as React from 'react';\r\n\r\ninterface DismissableModalProps {\r\n dismissCallback: (() => void);\r\n title: string;\r\n message: string;\r\n type: string;\r\n}\r\n\r\ninterface DismissableModalState {\r\n instanceId: number;\r\n}\r\n\r\nexport default class DismissableModal extends React.Component {\r\n modalRef: React.RefObject;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.modalRef = React.createRef();\r\n\r\n this.state = {\r\n instanceId: Math.random()\r\n } as DismissableModalState;\r\n }\r\n\r\n componentDidMount() {\r\n this.modalRef.current &&\r\n ($(this.modalRef.current) as any).modal('show');\r\n }\r\n\r\n dismiss = (event: React.MouseEvent): void => {\r\n const { dismissCallback } = this.props;\r\n\r\n event.preventDefault();\r\n\r\n this.modalRef.current &&\r\n ($(this.modalRef.current) as any).modal('hide');\r\n\r\n dismissCallback();\r\n }\r\n\r\n render() {\r\n const { title, message, type } = this.props;\r\n\r\n\r\n return (\r\n \r\n );\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators, Dispatch } from \"redux\";\r\n\r\n// store\r\nimport { AppState } from '../../../store';\r\nimport { CameraState } from '../../../store/camera/types';\r\nimport { \r\n setCameraToVideoItem, removeCameraFromVideoItem\r\n} from '../../../store/videoboard/actions';\r\nimport { IATCamera } from '@algo/network-manager/models/v3';\r\n\r\ninterface OwnProps {\r\n className?: string;\r\n videoPageLocation: number;\r\n itemLocation: number;\r\n cameraId: number;\r\n}\r\n\r\ninterface StateProps {\r\n camera: CameraState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState) => {\r\n return {\r\n camera: state.camera\r\n };\r\n};\r\n\r\ninterface DispatchProps {\r\n setCameraToVideoItem: typeof setCameraToVideoItem;\r\n removeCameraFromVideoItem: typeof removeCameraFromVideoItem;\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch) => {\r\n return bindActionCreators({\r\n setCameraToVideoItem: setCameraToVideoItem,\r\n removeCameraFromVideoItem: removeCameraFromVideoItem\r\n }, dispatch);\r\n}\r\n\r\ntype DroppableVideoItemProps = OwnProps & StateProps & DispatchProps;\r\n\r\ninterface DroppableVideoItemState {\r\n videoPageLocation: number;\r\n itemLocation: number;\r\n cameraId: number;\r\n imageUrl: string;\r\n loadingImage: boolean;\r\n}\r\n\r\nclass DroppableVideoItem extends React.Component {\r\n componentRef: React.RefObject;\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.componentRef = React.createRef();\r\n\r\n this.state = {\r\n videoPageLocation: 0,\r\n itemLocation: 0,\r\n cameraId: 0,\r\n imageUrl: '',\r\n loadingImage: true\r\n } as DroppableVideoItemState;\r\n }\r\n\r\n componentDidMount() {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n videoPageLocation: props.videoPageLocation,\r\n itemLocation: props.itemLocation,\r\n cameraId: props.cameraId\r\n };\r\n });\r\n }\r\n\r\n dragOverHandler = (event: React.DragEvent): void => {\r\n event.preventDefault();\r\n\r\n event.dataTransfer.dropEffect = 'move';\r\n\r\n if (!this.componentRef.current?.classList.contains('active')) {\r\n this.componentRef.current?.classList.add('active');\r\n }\r\n }\r\n\r\n dragLeaveHandler = (event: React.DragEvent): void => {\r\n event.preventDefault();\r\n\r\n if (this.componentRef.current?.classList.contains('active')) {\r\n this.componentRef.current.classList.remove('active');\r\n }\r\n }\r\n\r\n dropHandler = (event: React.DragEvent): void => { \r\n event.preventDefault();\r\n\r\n if (this.componentRef.current?.classList.contains('active')) {\r\n this.componentRef.current.classList.remove('active');\r\n }\r\n\r\n var cId = parseInt(event.dataTransfer.getData(\"text/plain\"));\r\n\r\n this.setState((state) => {\r\n return {\r\n ...state,\r\n cameraId: cId\r\n };\r\n });\r\n\r\n this.props.setCameraToVideoItem(this.state.videoPageLocation, this.state.itemLocation, cId);\r\n }\r\n\r\n removeClickHandler = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n\r\n ($('[data-toggle=\"tooltip\"]') as any).tooltip('hide');\r\n\r\n this.props.removeCameraFromVideoItem(this.state.videoPageLocation, this.state.itemLocation);\r\n }\r\n\r\n renderContent = (item?: IATCamera | null): React.ReactNode => {\r\n if (item) {\r\n return (\r\n \r\n Stream preview\r\n \r\n );\r\n }\r\n else {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n }\r\n\r\n renderRemoveButton = (item?: IATCamera | null): React.ReactNode => {\r\n if (!item) return null;\r\n \r\n return (\r\n
\r\n \r\n \r\n \r\n Remove this camera\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { camera, className } = this.props;\r\n\r\n const item = ( this.state.cameraId !== 0 ) \r\n ? camera.items.find(\r\n (element) => {\r\n return element.id === this.state.cameraId;\r\n }\r\n ) \r\n : (null);\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n {item ? item.location.displayRouteDesignator : 'Unknown'}\r\n
\r\n
\r\n {item ? item.location.crossStreet : 'Unknown'}\r\n
\r\n {this.renderRemoveButton(item)}\r\n
\r\n
\r\n {this.renderContent(item)}\r\n
\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n mapDispatchToProps\r\n)(DroppableVideoItem);","// libraries\r\nimport * as React from 'react';\r\n// models & interfaces\r\nimport { IAVLegacyVideoBoard } from \"@algo/network-manager/models/v3/video\";\r\n// components\r\nimport {ThemedDropdown} from \"@caps-mobile/themed-dropdown\";\r\n\r\ninterface VideoboardSelectorProps {\r\n videoboards: IAVLegacyVideoBoard[];\r\n disabled: boolean;\r\n selectedValue: number;\r\n onChangeCallback: (videoboardId: number) => void;\r\n onAddCallback: () => void;\r\n onRemoveCallback: (videoboardId: number) => void;\r\n}\r\n\r\ninterface VideoboardSelectorState {\r\n selectedValue: number;\r\n selectedIndex: number | null;\r\n}\r\n\r\nexport default class VideoboardSelector extends React.Component {\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.videoboardSelected = this.videoboardSelected.bind(this);\r\n this.onAddClick = this.onAddClick.bind(this);\r\n this.onRemoveClick = this.onRemoveClick.bind(this);\r\n\r\n this.state = {\r\n selectedValue: 0,\r\n selectedIndex: null,\r\n } as VideoboardSelectorState;\r\n }\r\n\r\n componentDidUpdate(prevProps: any, prevState: any, snapshot: any) {\r\n if (this.props.selectedValue !== prevProps.selectedValue) {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n selectedValue: props.selectedValue\r\n };\r\n });\r\n }\r\n }\r\n\r\n videoboardSelected = (selectedIndex: number) => {\r\n if (selectedIndex === this.state.selectedIndex) return;\r\n\r\n if (!this.props.videoboards || !this.props.videoboards[selectedIndex]) \r\n return;\r\n\r\n let boardId: any = this.props.videoboards[selectedIndex].id;\r\n\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n selectedValue: boardId,\r\n selectedIndex: selectedIndex\r\n }\r\n });\r\n\r\n this.props.onChangeCallback(boardId);\r\n };\r\n\r\n onAddClick = (event: React.MouseEvent): void => {\r\n ($('[data-toggle=\"tooltip\"]') as any).tooltip('hide');\r\n\r\n this.props.onAddCallback();\r\n }\r\n\r\n onRemoveClick = (event: React.MouseEvent): void => {\r\n ($('[data-toggle=\"tooltip\"]') as any).tooltip('hide');\r\n\r\n this.setState({...this.state, selectedIndex: null});\r\n this.props.onRemoveCallback(this.state.selectedValue);\r\n }\r\n\r\n render() {\r\n let { videoboards, disabled } = this.props;\r\n\r\n const listItems = (Array.isArray(videoboards) && videoboards.length > 0) \r\n ? videoboards.map((item, index) => item.name || `Untitled Board ${index}`) \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}","// libraries\r\nimport * as React from 'react';\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators, Dispatch } from \"redux\";\r\nimport fscreen from 'fscreen';\r\n// interfaces & models\r\nimport { IAVLegacyVideoBoard } from \"@algo/network-manager/models/v3/video\";\r\nimport { IATCamera } from '@algo/network-manager/models/v3';\r\n// components\r\nimport Stream from './Stream';\r\nimport {Pager} from \"@algo/pager\";\r\n// store\r\nimport { savePageState } from '../../../store/videoboard/actions';\r\nimport { User } from 'oidc-client';\r\nimport { CameraState } from '../../../store/camera/types';\r\nimport { AppState } from '../../../store';\r\nimport { ProfileState } from '../../../store/profile/types';\r\n// constants\r\nimport { STREAM_TIMEOUT_INTERVAL } from '../../../utils/AppConstants';\r\nimport { DEFAULT_PAGE_INDEX } from '../../../utils/AppConstants';\r\nimport { UNLIMITED_STREAMING } from '../../../models/Privileges';\r\n\r\ninterface OwnProps {\r\n board: IAVLegacyVideoBoard;\r\n currentPageIndex: number;\r\n}\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n camera: CameraState;\r\n profile: ProfileState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user,\r\n camera: state.camera,\r\n profile: state.profile\r\n };\r\n}\r\n\r\ninterface DispatchProps {\r\n savePageState: typeof savePageState;\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch) => {\r\n return bindActionCreators({\r\n savePageState: savePageState\r\n }, dispatch);\r\n}\r\n\r\ntype VideoboardProps = OwnProps & StateProps & DispatchProps;\r\n\r\ninterface VideoboardState {\r\n currentPageIndex: number;\r\n pageTimer: number;\r\n isFullscreen: boolean;\r\n isPaused: boolean;\r\n}\r\n\r\nclass Videoboard extends React.Component {\r\n pageRefresher: NodeJS.Timeout | null;\r\n pageTransitionInterval: NodeJS.Timeout | null;\r\n\r\n videoboardRef: React.RefObject;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.videoboardRef = React.createRef();\r\n this.pageRefresher = null;\r\n this.pageTransitionInterval = null;\r\n\r\n if (!props.profile.userProfile.hasPrivilege(UNLIMITED_STREAMING)) {\r\n this.pageRefresher = setInterval(this.reloadPage, STREAM_TIMEOUT_INTERVAL);\r\n }\r\n\r\n fscreen.addEventListener('fullscreenchange', this.fullscreenEventAction);\r\n window.addEventListener('keydown', this.keyListener);\r\n\r\n this.state = {\r\n currentPageIndex: props.currentPageIndex ? props.currentPageIndex : DEFAULT_PAGE_INDEX,\r\n pageTimer: 60,\r\n isFullscreen: false,\r\n isPaused: false\r\n } as VideoboardState;\r\n }\r\n\r\n componentDidMount() {\r\n ($('[data-toggle=\"tooltip\"]') as any).tooltip();\r\n }\r\n\r\n componentDidUpdate(prevProps: any, prevState: any, snapshot: any) {\r\n ($('[data-toggle=\"tooltip\"]') as any).tooltip();\r\n\r\n if (this.state.currentPageIndex !== prevState.currentPageIndex) {\r\n this.props.savePageState(this.state.currentPageIndex);\r\n }\r\n\r\n if (\r\n this.state.isFullscreen && \r\n (prevState.isFullscreen !== this.state.isFullscreen)\r\n ) {\r\n this.videoboardRef.current && \r\n fscreen.requestFullscreen(this.videoboardRef.current);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n fscreen.removeEventListener('fullscreenchange', this.fullscreenEventAction);\r\n\r\n window.removeEventListener('keydown', this.keyListener);\r\n\r\n if (!this.props.profile.userProfile.hasPrivilege(UNLIMITED_STREAMING)) {\r\n this.pageRefresher &&\r\n clearInterval(this.pageRefresher);\r\n }\r\n\r\n this.destroyPageTransition();\r\n }\r\n\r\n reloadPage = (): void => {\r\n window.location.reload();\r\n }\r\n\r\n fullscreenEventAction = (): void => {\r\n if (fscreen.fullscreenElement === null) {\r\n this.destroyPageTransition();\r\n\r\n this.setState({\r\n isFullscreen: false,\r\n isPaused: false\r\n });\r\n }\r\n else if (fscreen.fullscreenElement?.classList.contains('av-stream-player')) {\r\n if (!this.state.isPaused) {\r\n this.destroyPageTransition();\r\n }\r\n }\r\n else if (\r\n fscreen.fullscreenElement?.classList.contains('av-videoboard') && \r\n typeof this.pageTransitionInterval !== 'function'\r\n ) {\r\n if (!this.state.isPaused) {\r\n this.createPageTransition();\r\n }\r\n }\r\n }\r\n\r\n toggleFullscreen = (event: React.MouseEvent): void => {\r\n event.preventDefault();\r\n\r\n if (!this.state.isFullscreen) {\r\n this.setState((prevState, props) => {\r\n return {\r\n isFullscreen: true\r\n };\r\n });\r\n }\r\n else {\r\n fscreen.exitFullscreen();\r\n\r\n this.setState((prevState, props) => {\r\n return {\r\n isFullscreen: false\r\n };\r\n });\r\n }\r\n }\r\n\r\n keyListener = (event: KeyboardEvent): void => {\r\n if (\r\n (this.props.board.videoPages.length > 1) &&\r\n this.state.isFullscreen && \r\n (event.keyCode === 37 || event.keyCode === 39)\r\n ) {\r\n \r\n if (!this.state.isPaused) {\r\n this.destroyPageTransition();\r\n }\r\n\r\n this.setState((prevState, props) => {\r\n if (event.keyCode === 37) {\r\n return {\r\n currentPageIndex: prevState.currentPageIndex === 0 \r\n ? (props.board.videoPages.length - 1) \r\n : (prevState.currentPageIndex - 1)\r\n };\r\n }\r\n else if (event.keyCode === 39) {\r\n return {\r\n currentPageIndex: \r\n (prevState.currentPageIndex === (props.board.videoPages.length - 1)) \r\n ? 0 \r\n : (prevState.currentPageIndex + 1)\r\n };\r\n }\r\n else{\r\n return {\r\n currentPageIndex: this.state.currentPageIndex\r\n }\r\n }\r\n });\r\n\r\n if (!this.state.isPaused) {\r\n this.createPageTransition();\r\n }\r\n }\r\n\r\n else if (this.props.board.videoPages.length > 1 && this.state.isFullscreen && event.keyCode === 32) {\r\n if (this.state.isPaused) {\r\n this.createPageTransition();\r\n }\r\n else {\r\n this.destroyPageTransition();\r\n }\r\n\r\n this.setState((prevState, props) => {\r\n return {\r\n isPaused: !prevState.isPaused\r\n };\r\n });\r\n }\r\n }\r\n \r\n createPageTransition = (): void => {\r\n this.pageTransitionInterval =\r\n setInterval(this.pageTransitionHandler, this.state.pageTimer * 1000);\r\n }\r\n\r\n destroyPageTransition = (): void => {\r\n this.pageTransitionInterval &&\r\n clearInterval(this.pageTransitionInterval);\r\n }\r\n\r\n pageTransitionHandler = (): void => {\r\n this.setState((state, props) => {\r\n return {\r\n currentPageIndex: ( props.board.videoPages.length === (state.currentPageIndex + 1) ) \r\n ? 0 \r\n : state.currentPageIndex + 1\r\n };\r\n });\r\n }\r\n\r\n updatePageIndex = (newPageIndex: number) => {\r\n this.setState({\r\n ...this.state,\r\n currentPageIndex: newPageIndex,\r\n });\r\n }\r\n\r\n changePageTimer = (event: React.ChangeEvent): void => {\r\n event.preventDefault();\r\n\r\n\r\n if (event.currentTarget.value !== '') {\r\n this.setState({\r\n pageTimer: parseInt(event.currentTarget.value)\r\n });\r\n }\r\n }\r\n\r\n renderPage = (\r\n board: IAVLegacyVideoBoard, \r\n currentPageIndex: number, \r\n cameras: IATCamera[]\r\n ): React.ReactNode => {\r\n let page = board.videoPages[currentPageIndex];\r\n\r\n if (!page) {\r\n return (\r\n
\r\n
\r\n No page available to view\r\n
\r\n
\r\n );\r\n }\r\n else {\r\n let colClass: string = `av-grid-col-${page.columnSize}`;\r\n let rowClass: string = `av-grid-row-${page.rowSize}`;\r\n\r\n return (\r\n
\r\n {page.videoItems.map((videoItem: any, index: any) => {\r\n const cameraItem = cameras.find((item) => { return item.id === videoItem.cameraId; });\r\n\r\n if (cameraItem) {\r\n return ( \r\n \r\n )\r\n }\r\n else {\r\n return (\r\n \r\n );\r\n }\r\n })}\r\n
\r\n );\r\n }\r\n }\r\n\r\n render() {\r\n const { board, camera } = this.props;\r\n\r\n return (\r\n
\r\n

{board.name}

\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n {board.name}\r\n
\r\n
\r\n \r\n \r\n \r\n Go Fullscreen\r\n \r\n \r\n
\r\n
\r\n
\r\n {this.renderPage(board, this.state.currentPageIndex, camera.items)}\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n mapDispatchToProps\r\n)(Videoboard);","import * as React from 'react';\r\n\r\ninterface ConfrimationModalProps {\r\n dismissCallback: (() => void);\r\n confirmCallback: (() => void);\r\n title: string;\r\n message: string;\r\n type: string;\r\n}\r\n\r\ninterface ConfirmationModalState {\r\n instanceId: number;\r\n}\r\n\r\nexport default class ConfirmationModal extends React.Component {\r\n modalRef: React.RefObject;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.modalRef = React.createRef();\r\n\r\n this.state = {\r\n instanceId: Math.random()\r\n } as ConfirmationModalState;\r\n }\r\n\r\n componentDidMount() {\r\n this.modalRef.current &&\r\n ($(this.modalRef.current) as any).modal('show');\r\n }\r\n\r\n dismiss = (event: React.MouseEvent): void => {\r\n const { dismissCallback } = this.props;\r\n\r\n event.preventDefault();\r\n\r\n this.modalRef.current &&\r\n ($(this.modalRef.current) as any).modal('hide');\r\n\r\n dismissCallback();\r\n }\r\n\r\n confirm = (event: React.MouseEvent): void => {\r\n const { confirmCallback } = this.props;\r\n\r\n event.preventDefault();\r\n\r\n this.modalRef.current &&\r\n ($(this.modalRef.current) as any).modal('hide');\r\n\r\n confirmCallback();\r\n }\r\n\r\n render() {\r\n const { title, message, type } = this.props;\r\n\r\n\r\n return (\r\n \r\n );\r\n }\r\n}","import { IProcessedResponse } from '@algo/network-manager/managers/v3';\r\nimport { IATCamera } from '@algo/network-manager/models/v3';\r\n\r\nexport let FETCH_CAMERAS_BEGIN = 'FETCH_CAMERAS_BEGIN';\r\nexport let FETCH_CAMERAS_SUCCESS = 'FETCH_CAMERAS_SUCCESS';\r\nexport let FETCH_CAMERAS_FAILURE = 'FETCH_CAMERAS_FAILURE';\r\nexport let FETCH_CAMERAS_NOCHANGE = 'FETCH_CAMERAS_NOCHANGE';\r\n\r\nexport let UPDATE_ACCESS_LEVEL_BEGIN = 'UPDATE_ACCESS_LEVEL_BEGIN';\r\nexport let UPDATE_ACCESS_LEVEL_SUCCESS = 'UPDATE_ACCESS_LEVEL_SUCCESS';\r\nexport let UPDATE_ACCESS_LEVEL_FAILURE = 'UPDATE_ACCESS_LEVEL_FAILURE';\r\nexport let UPDATE_ACCESS_LEVEL_CLEAR = 'UPDATE_ACCESS_LEVEL_CLEAR';\r\n\r\nexport let MODIFY_CAMERA_INFO_BEGIN = 'MODIFY_CAMERA_INFO_BEGIN';\r\nexport let MODIFY_CAMERA_INFO_SUCCESS = 'MODIFY_CAMERA_INFO_SUCCESS';\r\nexport let MODIFY_CAMERA_INFO_FAILURE = 'MODIFY_CAMERA_INFO_FAILURE';\r\n\r\nexport let BULK_UPDATE_BEGIN = 'BULK_UPDATE_BEGIN';\r\nexport let BULK_UPDATE_SUCCESS = 'BULK_UPDATE_SUCCESS';\r\nexport let BULK_UPDATE_FAILURE = 'BULK_UPDATE_FAILURE';\r\nexport let BULK_UPDATE_CLEAR = 'BULK_UPDATE_CLEAR';\r\n\r\nexport let FILTER_DATASOURCES_CAMERA_BEGIN = 'FILTER_DATASOURCES_CAMERA_BEGIN';\r\nexport let FILTER_DATASOURCES_CAMERA_SUCCESS = 'FILTER_DATASOURCES_CAMERA_SUCCESS';\r\nexport let FILTER_DATASOURCES_CAMERA_FAILURE = 'FILTER_DATASOURCES_CAMERA_FAILURE';\r\n\r\nexport let FILTER_EDITOR_CAMERA_BEGIN = 'FILTER_EDITOR_CAMERA_BEGIN';\r\nexport let FILTER_EDITOR_CAMERA_SUCCESS = 'FILTER_EDITOR_CAMERA_SUCCESS';\r\nexport let FILTER_EDITOR_CAMERA_FAILURE = 'FILTER_EDITOR_CAMERA_FAILURE';\r\n\r\nexport let REFRESH_CAMERA_LISTS_BEGIN = 'REFRESH_CAMERA_LISTS_BEGIN';\r\nexport let REFRESH_CAMERA_LISTS_SUCCESS = 'REFRESH_CAMERA_LISTS_SUCCESS';\r\nexport let REFRESH_CAMERA_LISTS_FAILURE = 'REFRESH_CAMERA_LISTS_FAILURE';\r\n\r\nexport let CLEAR_CAMERA_ERROR = 'CLEAR_CAMERA_ERROR';\r\n\r\nexport interface CameraState {\r\n items: IATCamera[];\r\n checksum: string;\r\n count: string;\r\n mgmtFilteredItems: IATCamera[] | null;\r\n editorFilteredItems: IATCamera[];\r\n loading: boolean;\r\n error: Error | null;\r\n processing: boolean;\r\n saveSuccess: boolean;\r\n lastResponse: IProcessedResponse;\r\n}\r\n\r\nexport interface CameraPayload {\r\n items: IATCamera[];\r\n checksum: string;\r\n count: string;\r\n mgmtFilteredItems: IATCamera[];\r\n editorFilteredItems: IATCamera[];\r\n error: Error | null;\r\n response: IProcessedResponse;\r\n}\r\n\r\ninterface FetchCamerasBeginAction {\r\n type: typeof FETCH_CAMERAS_BEGIN;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FetchCameraSuccessAction {\r\n type: typeof FETCH_CAMERAS_SUCCESS;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FetchCameraNoChangeAction {\r\n type: typeof FETCH_CAMERAS_NOCHANGE;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FetchCameraFailureAction {\r\n type: typeof FETCH_CAMERAS_FAILURE;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface UpdateAccessLevelBeginAction {\r\n type: typeof UPDATE_ACCESS_LEVEL_BEGIN;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface UpdateAccessLevelSuccessAction {\r\n type: typeof UPDATE_ACCESS_LEVEL_SUCCESS;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface UpdateAccessLevelClearAction {\r\n type: typeof UPDATE_ACCESS_LEVEL_CLEAR;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface UpdateAccessLevelFailureAction {\r\n type: typeof UPDATE_ACCESS_LEVEL_FAILURE;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface ModifyCameraInfoBeginAction {\r\n type: typeof MODIFY_CAMERA_INFO_BEGIN;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface ModifyCameraInfoSuccessAction {\r\n type: typeof MODIFY_CAMERA_INFO_SUCCESS;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface ModifyCameraInfoFailureAction {\r\n type: typeof MODIFY_CAMERA_INFO_FAILURE;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface BulkUpdateBeginAction {\r\n type: typeof BULK_UPDATE_BEGIN;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface BulkUpdateSuccessAction {\r\n type: typeof BULK_UPDATE_SUCCESS;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface BulkUpdateClearAction {\r\n type: typeof BULK_UPDATE_CLEAR;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface BulkUpdateFailureAction {\r\n type: typeof BULK_UPDATE_FAILURE;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FilterDatasourceCameraBeginAction {\r\n type: typeof FILTER_DATASOURCES_CAMERA_BEGIN;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FilterDatasourceCameraSuccessAction {\r\n type: typeof FILTER_DATASOURCES_CAMERA_SUCCESS;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FilterDatasourceCameraFailureAction {\r\n type: typeof FILTER_DATASOURCES_CAMERA_FAILURE;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FilterEditorCameraListBeginAction {\r\n type: typeof FILTER_EDITOR_CAMERA_BEGIN;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FilterEditorCameraListSuccessAction {\r\n type: typeof FILTER_EDITOR_CAMERA_SUCCESS;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface FilterEditorCameraListFailureAction {\r\n type: typeof FILTER_EDITOR_CAMERA_FAILURE;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface RefreshCameraListBeginAction {\r\n type: typeof REFRESH_CAMERA_LISTS_BEGIN;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface RefreshCameraListSuccessAction {\r\n type: typeof REFRESH_CAMERA_LISTS_SUCCESS;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface RefreshCameraListFailureAction {\r\n type: typeof REFRESH_CAMERA_LISTS_FAILURE;\r\n payload: CameraPayload;\r\n}\r\n\r\ninterface ClearCameraErrorAction {\r\n type: typeof CLEAR_CAMERA_ERROR;\r\n payload: CameraPayload;\r\n}\r\n\r\nexport type CameraTypes = FetchCamerasBeginAction | \r\nFetchCameraSuccessAction | \r\nFetchCameraNoChangeAction | \r\nFetchCameraFailureAction | \r\nUpdateAccessLevelBeginAction | \r\nUpdateAccessLevelSuccessAction |\r\nUpdateAccessLevelClearAction |\r\nUpdateAccessLevelFailureAction |\r\nModifyCameraInfoBeginAction |\r\nModifyCameraInfoSuccessAction |\r\nModifyCameraInfoFailureAction |\r\nBulkUpdateBeginAction | \r\nBulkUpdateSuccessAction | \r\nBulkUpdateClearAction | \r\nBulkUpdateFailureAction |\r\nFilterDatasourceCameraBeginAction |\r\nFilterDatasourceCameraSuccessAction |\r\nFilterDatasourceCameraFailureAction |\r\nFilterEditorCameraListBeginAction |\r\nFilterEditorCameraListSuccessAction |\r\nFilterEditorCameraListFailureAction |\r\nRefreshCameraListBeginAction |\r\nRefreshCameraListSuccessAction |\r\nRefreshCameraListFailureAction |\r\nClearCameraErrorAction;","export let CAMERA_ADMINISTRATOR = 'CameraAdministrator';\r\nexport let VIEW_VIDEOBOARD = 'ViewVideoboard';\r\nexport let CREATE_VIDEOBOARD = 'CreateVideoboard';\r\nexport let EDIT_VIDEOBOARD = 'EditVideoboard';\r\nexport let DELETE_VIDEOBOARD = 'DeleteVideoboard';\r\nexport let VIEW_CAMERA = 'ViewCamera';\r\nexport let EDIT_CAMERA = 'EditCamera';\r\nexport let SYSTEM_ADMINISTRATOR = 'SystemAdministrator';\r\nexport let CREATE_USER = 'CreateUser';\r\nexport let EDIT_USER = 'EditUser';\r\nexport let RESET_USER_PASSWORD = 'ResetUserPassword';\r\nexport let MEDIA_STREAM_ACCESS = 'MediaStreamAccess';\r\nexport let FIRST_RESPONDER_STREAM_ACCESS = 'FirstResponderStreamAccess';\r\nexport let PRIVATE_SECTOR_STREAM_ACCESS = 'PrivateSectorLimitedStreamAccess';\r\nexport let INTERNAL_STREAM_ACCESS = 'InternalStreamAccess';\r\nexport let UNLIMITED_STREAMING = 'UnlimitedStreaming';","//libraries\r\nimport { ThunkAction } from \"redux-thunk\";\r\nimport { AppState } from \"..\";\r\nimport { Action } from \"redux\";\r\nimport { getAccessToken } from \"../../utils/data/getAccessToken\";\r\n// interfaces & models\r\nimport { \r\n AVLegacyVideoBoard, IAVLegacyVideoBoard, IAVLegacyVideoBoardDto \r\n} from \"@algo/network-manager/models/v3/video\";\r\nimport { \r\n ICreateLegacyVideoBoard, IDeleteLegacyVideoBoard, \r\n IGetByIdLegacyVideoBoard, IProcessedResponse, IUpdateLegacyVideoBoard \r\n} from \"@algo/network-manager/managers/v3\";\r\nimport {\r\n LegacyVideoBoardNetworkManager, ILegacyVideoBoardNetworkManager\r\n} from \"@algo/network-manager/managers/v3\";\r\nimport * as TYPES from \"./types\";\r\n\r\n//constants\r\nimport { CUR_API_VERSION, CUR_API_ENPOINTS} from \"../api-version-constants\";\r\ndeclare var __API_URL__: string;\r\nconst apiUrlVideoboard: string = \r\n `${__API_URL__}/${CUR_API_VERSION}/${CUR_API_ENPOINTS(CUR_API_VERSION).legacyVideoboards}`;\r\n\r\n function initializeSuccess(videoboard: IAVLegacyVideoBoard): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.INITIALIZE_VIDEOBOARD_SUCCESS,\r\n payload: {\r\n videoboard: videoboard\r\n } as TYPES.EditorPayload\r\n };\r\n }\r\n\r\nfunction loadSuccess(response: IProcessedResponse): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.LOAD_VIDEOBOARD_SUCCESS,\r\n payload: { \r\n response: response\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction initializeFailure(error: Error) {\r\n return {\r\n type: TYPES.INITIALIZE_VIDEOBOARD_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * SET CAMERA STATE MESSAGES\r\n * \r\n */\r\n\r\nfunction setNameSuccess(videoboard: IAVLegacyVideoBoard): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.SET_NAME_SUCCESS,\r\n payload: {\r\n videoboard: videoboard\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction setNameFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.SET_NAME_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * SET CAMERA STATE MESSAGES\r\n * \r\n */\r\n\r\nfunction setCameraSuccess(videoboard: IAVLegacyVideoBoard): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.SET_CAMERA_ITEM_SUCCESS,\r\n payload: {\r\n videoboard: videoboard\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction setCameraFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.SET_CAMERA_ITEM_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * REMOVE CAMERA STATE MESSAGES\r\n * \r\n */\r\n\r\nfunction removeCameraSuccess(videoboard: IAVLegacyVideoBoard): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.REMOVE_CAMERA_ITEM_SUCCESS,\r\n payload: {\r\n videoboard: videoboard\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction removeCameraFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.REMOVE_CAMERA_ITEM_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * ADD PAGE STATE MESSAGES\r\n * \r\n */\r\n\r\n\r\nfunction addPageSuccess(videoboard: IAVLegacyVideoBoard): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.ADD_PAGE_SUCCESS,\r\n payload: {\r\n videoboard: videoboard\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction addPageFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.ADD_PAGE_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * REMOVE PAGE STATE MESSAGES\r\n * \r\n */\r\n\r\n\r\nfunction removePageSuccess(videoboard: IAVLegacyVideoBoard): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.REMOVE_PAGE_SUCCESS,\r\n payload: {\r\n videoboard: videoboard\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction removePageFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.REMOVE_PAGE_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * RESIZE PAGE STATE MESSAGES\r\n * \r\n */\r\n\r\n\r\nfunction resizePageSuccess(videoboard: IAVLegacyVideoBoard): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.RESIZE_PAGE_SUCCESS,\r\n payload: {\r\n videoboard: videoboard\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction resizePageFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.RESIZE_PAGE_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * SAVE VIDEOBOARD STATE MESSAGES\r\n * \r\n */ \r\n\r\nfunction saveVideoboardBegin(): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.SAVE_VIDEOBOARD_BEGIN,\r\n payload: {} as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction saveVideoboardSuccess(response: IProcessedResponse): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.SAVE_VIDEOBOARD_SUCCESS,\r\n payload: {\r\n videoboard: new AVLegacyVideoBoard(response.data)\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction saveVideoboardFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.SAVE_VIDEOBOARD_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * SAVE PAGE STATE STATE MESSAGES \r\n * \r\n */\r\nfunction savePageStateSuccess(\r\n currentPageIndex: number, \r\n rowSize: number, \r\n columnSize: number\r\n): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.SAVE_PAGE_STATE,\r\n payload: {\r\n currentPageIndex: currentPageIndex,\r\n rowSize: rowSize,\r\n columnSize: columnSize\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction clearError(): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.CLEAR_EDITOR_ERROR,\r\n payload: {} as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n/*\r\n * \r\n * GET VIDEOBOARD LIST STATE MESSAGES \r\n * \r\n */\r\nfunction getVideoboardListBegin(): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.GET_VIDEOBOARD_LIST_BEGIN,\r\n payload: {} as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction getVideoboardListSuccess(\r\n response: IProcessedResponse\r\n): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.GET_VIDEOBOARD_LIST_SUCCESS,\r\n payload: { \r\n list: response.data.map( (board: IAVLegacyVideoBoardDto) => new AVLegacyVideoBoard(board)),\r\n response: response\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction getVideoboardListFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.GET_VIDEOBOARD_LIST_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\n\r\nfunction deleteVideoboardBegin(): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.DELETE_VIDEOBOARD_BEGIN,\r\n payload: {} as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction deleteVideoboardSuccess(\r\n response: IProcessedResponse\r\n): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.DELETE_VIDEOBOARD_SUCCESS,\r\n payload: { \r\n list: response.data.map( (board: IAVLegacyVideoBoardDto) => new AVLegacyVideoBoard(board))\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nfunction deleteVideoboardFailure(error: Error): TYPES.EditorTypes {\r\n return {\r\n type: TYPES.DELETE_VIDEOBOARD_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.EditorPayload\r\n };\r\n}\r\n\r\nexport let initializeVideoboardEditor = (\r\n\r\n): ThunkAction> => async (dispatch, getState) => {\r\n var videoboard = new AVLegacyVideoBoard();\r\n videoboard.addPage(2, 2);\r\n\r\n dispatch(initializeSuccess(videoboard));\r\n}\r\n\r\nexport let loadVideoboard = (\r\n videoboardId: number\r\n): ThunkAction> => async (dispatch, getState) => {\r\n\r\n getAccessToken().then(\r\n (token: string) => {\r\n let manager: ILegacyVideoBoardNetworkManager = \r\n new LegacyVideoBoardNetworkManager(apiUrlVideoboard);\r\n\r\n manager.setAccessToken(token);\r\n\r\n let getVideoboard: IGetByIdLegacyVideoBoard = {id: videoboardId};\r\n manager.getById(getVideoboard)\r\n .then(\r\n (response: IProcessedResponse) => dispatch(loadSuccess(response))\r\n ).catch(\r\n (err: Error) => dispatch(initializeFailure(err))\r\n )\r\n }\r\n ).catch(\r\n (err: Error) => dispatch(initializeFailure(err))\r\n )\r\n}\r\n\r\nexport let addPage = (rowSize: number, columnSize: number): ThunkAction> => async (dispatch, getState) => {\r\n try {\r\n var board = getState().editor.videoboard;\r\n\r\n board.addPage(rowSize, columnSize);\r\n\r\n dispatch(addPageSuccess(board));\r\n }\r\n catch (err: any) {\r\n dispatch(addPageFailure(new Error(err)));\r\n }\r\n}\r\n\r\nexport let removePage = (index: number): ThunkAction> => async (dispatch, getState) => {\r\n try {\r\n var board = getState().editor.videoboard;\r\n board.removePage(index);\r\n dispatch(removePageSuccess(board));\r\n }\r\n catch (err: any) {\r\n dispatch(removePageFailure(new Error(err)));\r\n }\r\n}\r\n\r\nexport let resizePage = (index: number, rowSize: number, colSize: number): ThunkAction> => async (dispatch, getState) => {\r\n try {\r\n var board = getState().editor.videoboard;\r\n board.videoPages[index].resizePage(rowSize, colSize);\r\n dispatch(resizePageSuccess(board));\r\n }\r\n catch (err: any) {\r\n dispatch(resizePageFailure(new Error(err)));\r\n }\r\n}\r\n\r\nexport let setName = (\r\n name: string\r\n): ThunkAction> => async (dispatch, getState) => {\r\n try {\r\n var videoboard = getState().editor.videoboard;\r\n videoboard.name = name;\r\n dispatch(setNameSuccess(videoboard));\r\n }\r\n catch (err: any) {\r\n dispatch(setNameFailure(new Error(err)));\r\n }\r\n}\r\n\r\nexport let setCameraToVideoItem = (\r\n pageLocation: number, \r\n itemLocation: number, \r\n cameraId: number\r\n): ThunkAction> => async (dispatch, getState) => {\r\n try {\r\n var board = getState().editor.videoboard;\r\n\r\n if (board) {\r\n\r\n var item = board.videoPages\r\n .forEach((page: any, pageIndex: any) => {\r\n if (page.placement === pageLocation) {\r\n page.videoItems.forEach((item: any, itemIndex: any) => {\r\n if (item.placement === itemLocation) {\r\n board.videoPages[pageIndex].videoItems[itemIndex].cameraId = cameraId;\r\n }\r\n });\r\n }\r\n });\r\n\r\n dispatch(setCameraSuccess(board));\r\n }\r\n else {\r\n dispatch(setCameraFailure(new Error(\"Cannot find videoboard in state\")));\r\n }\r\n }\r\n catch (err: any) {\r\n dispatch(setCameraFailure(new Error(err)));\r\n }\r\n}\r\n\r\nexport let removeCameraFromVideoItem = (\r\n pageLocation: number, \r\n itemLocation: number\r\n): ThunkAction> => async (dispatch, getState) => {\r\n try {\r\n var board = getState().editor.videoboard;\r\n\r\n if (board) {\r\n\r\n var item = board.videoPages\r\n .forEach((page: any, pageIndex: any) => {\r\n if (page.placement === pageLocation) {\r\n page.videoItems.forEach((item: any, itemIndex: any) => {\r\n if (item.placement === itemLocation) {\r\n board.videoPages[pageIndex].videoItems[itemIndex].cameraId = 0;\r\n }\r\n });\r\n }\r\n });\r\n\r\n dispatch(removeCameraSuccess(board));\r\n }\r\n else {\r\n dispatch(removeCameraFailure(new Error(\"Cannot find videoboard in state\")));\r\n }\r\n }\r\n catch (err: any) {\r\n dispatch(removeCameraFailure(new Error(err)));\r\n }\r\n}\r\n\r\nexport let save = (): ThunkAction> => async (dispatch, getState) => {\r\n dispatch(saveVideoboardBegin());\r\n let boardToSave: IAVLegacyVideoBoard = getState().editor.videoboard;\r\n\r\n getAccessToken().then(\r\n (token: string) => {\r\n let manager: ILegacyVideoBoardNetworkManager = \r\n new LegacyVideoBoardNetworkManager(apiUrlVideoboard);\r\n\r\n manager.setAccessToken(token);\r\n\r\n if (boardToSave.id === 0){\r\n\r\n let createVideoBoard: ICreateLegacyVideoBoard = {\r\n videoboard: boardToSave,\r\n };\r\n\r\n manager.create(createVideoBoard)\r\n .then(\r\n (response: IProcessedResponse) => {\r\n\r\n if (response.error) {\r\n switch (response.status) {\r\n case 410:\r\n dispatch(saveVideoboardFailure(new Error(\"ALGO Video web app is no longer available. All ALGO Video features are now available on ALGO Traffic.\")));\r\n break;\r\n default:\r\n dispatch(saveVideoboardFailure(new Error(response.error.message)));\r\n break;\r\n }\r\n }\r\n else {\r\n dispatch(saveVideoboardSuccess(response));\r\n\r\n }\r\n } \r\n ).catch(\r\n (err: Error) => dispatch(saveVideoboardFailure(err))\r\n )\r\n }\r\n else {\r\n let updateVideoBoard: IUpdateLegacyVideoBoard = {\r\n videoboard: boardToSave,\r\n id: boardToSave.id\r\n };\r\n\r\n manager.update(updateVideoBoard)\r\n .then(\r\n (response: IProcessedResponse) => { \r\n if (response.error) {\r\n switch (response.status) {\r\n case 410:\r\n dispatch(saveVideoboardFailure(new Error(\"ALGO Video web app is no longer available. All ALGO Video features are now available on ALGO Traffic.\")));\r\n break;\r\n default:\r\n dispatch(saveVideoboardFailure(new Error(response.error.message)));\r\n break;\r\n } }\r\n else {\r\n dispatch(saveVideoboardSuccess(response));\r\n\r\n } }\r\n ).catch(\r\n (err: Error) => dispatch(saveVideoboardFailure(err))\r\n )\r\n }\r\n }\r\n ).catch(\r\n (err: Error) => dispatch(saveVideoboardFailure(err))\r\n )\r\n}\r\n\r\nexport let savePageState = (\r\n currentPageIndex: number, \r\n rowSize: number = 0, \r\n colSize: number = 0\r\n): ThunkAction> => async (dispatch, getState) => {\r\n var sanitizedRow = rowSize !== 0 ? rowSize : getState().editor.rowSize;\r\n var sanitizedCol = colSize !== 0 ? colSize : getState().editor.columnSize;\r\n\r\n dispatch(savePageStateSuccess(currentPageIndex, sanitizedRow, sanitizedCol));\r\n}\r\n\r\nexport let clearEditorState = (\r\n\r\n): ThunkAction> => async (dispatch, getState) => {\r\n if (getState().editor.initialized && !getState().editor.loading) {\r\n dispatch({\r\n type: TYPES.CLEAR_EDITOR_STATE\r\n });\r\n }\r\n}\r\n\r\nexport let clearEditorError = (\r\n\r\n): ThunkAction> => async (dispatch, getState) => {\r\n dispatch(clearError());\r\n}\r\n\r\nexport let getVideoboardList = (\r\n\r\n): ThunkAction> => async (dispatch, getState) => { \r\n dispatch(getVideoboardListBegin());\r\n\r\n getAccessToken().then(\r\n (token: string) => {\r\n let manager: ILegacyVideoBoardNetworkManager = \r\n new LegacyVideoBoardNetworkManager(apiUrlVideoboard);\r\n\r\n manager.setAccessToken(token);\r\n\r\n manager.getAll()\r\n .then(\r\n (response: IProcessedResponse) => dispatch(getVideoboardListSuccess(response))\r\n ).catch(\r\n (err: Error) => dispatch(getVideoboardListFailure(err))\r\n )\r\n }\r\n ).catch(\r\n (err: Error) => dispatch(getVideoboardListFailure(err))\r\n )\r\n}\r\n\r\nexport let deleteVideoboard = (\r\n videoboard: IAVLegacyVideoBoard\r\n): ThunkAction> => async (dispatch, getState) => {\r\n dispatch(deleteVideoboardBegin());\r\n\r\n getAccessToken().then(\r\n (token: string) => {\r\n let manager: ILegacyVideoBoardNetworkManager = new LegacyVideoBoardNetworkManager(apiUrlVideoboard);\r\n manager.setAccessToken(token);\r\n\r\n let deleteVideoboard: IDeleteLegacyVideoBoard = {\r\n id: videoboard.id\r\n }\r\n\r\n manager.delete(deleteVideoboard)\r\n .then(\r\n (response: IProcessedResponse) => {\r\n if (response.error) {\r\n switch (response.status) {\r\n case 410:\r\n dispatch(deleteVideoboardFailure(new Error(\"ALGO Video web app is no longer available. All ALGO Video features are now available on ALGO Traffic.\")));\r\n break;\r\n default:\r\n dispatch(deleteVideoboardFailure(new Error(response.error.message)));\r\n break;\r\n }\r\n }\r\n else {\r\n manager.getAll()\r\n .then(\r\n ( listResponse: IProcessedResponse) => {\r\n dispatch(deleteVideoboardSuccess(listResponse))\r\n }\r\n ).catch(\r\n (err: Error) => {\r\n dispatch(getVideoboardListFailure(err))\r\n }\r\n )\r\n } \r\n }\r\n ).catch(\r\n (err: Error) => dispatch(deleteVideoboardFailure(err))\r\n )\r\n }\r\n ).catch(\r\n (err: Error) => dispatch(deleteVideoboardFailure(err))\r\n )\r\n}","// types & interfaces\r\nimport { ProcessedResponse } from \"@algo/network-manager/managers/v3\";\r\nimport { \r\n DatasourceState, DatasourceTypes, CLEAR_DATASOURCES_ERROR,\r\n FETCH_DATASOURCES_BEGIN, FETCH_DATASOURCES_SUCCESS, \r\n FETCH_DATASOURCES_FAILURE \r\n} from \"./types\";\r\n\r\nlet initialState: DatasourceState = {\r\n loading: false,\r\n datasources: [],\r\n error: null,\r\n lastResponse: new ProcessedResponse()\r\n}\r\n\r\nexport function datasourceReducer(\r\n state = initialState, \r\n action: DatasourceTypes\r\n): DatasourceState {\r\n \r\n switch(action.type) {\r\n case FETCH_DATASOURCES_BEGIN:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case FETCH_DATASOURCES_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n datasources: action.payload.datasources\r\n };\r\n case FETCH_DATASOURCES_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload.error\r\n };\r\n case CLEAR_DATASOURCES_ERROR:\r\n return {\r\n ...state,\r\n error: null\r\n };\r\n default:\r\n return state;\r\n }\r\n}","import { IProcessedResponse } from '@algo/network-manager/managers/v3';\r\nimport { IAAUserAuthorizationProfile } from '@algo/network-manager/models/v3/admin';\r\n\r\nexport let FETCH_PROFILE_BEGIN = 'FETCH_PROFILE_BEGIN';\r\nexport let FETCH_PROFILE_SUCCESS = 'FETCH_PROFILE_SUCCESS';\r\nexport let FETCH_PROFILE_FAILURE = 'FETCH_PROFILE_FAILURE';\r\nexport let UNLOAD_PROFILE = 'UNLOAD_PROFILE';\r\nexport let CLEAR_PROFILE_ERROR = 'CLEAR_PROFILE_ERROR';\r\n\r\nexport interface ProfileState {\r\n userProfile: IAAUserAuthorizationProfile;\r\n loading: boolean;\r\n initialized: boolean;\r\n error: Error | null;\r\n lastResponse: IProcessedResponse;\r\n}\r\n\r\nexport interface ProfilePayload {\r\n userProfile: IAAUserAuthorizationProfile;\r\n error: Error | null;\r\n response: IProcessedResponse;\r\n}\r\n\r\ninterface FetchProfileBeginAction {\r\n type: typeof FETCH_PROFILE_BEGIN;\r\n payload: ProfilePayload;\r\n}\r\n\r\ninterface FetchProfileSuccessAction {\r\n type: typeof FETCH_PROFILE_SUCCESS;\r\n payload: ProfilePayload;\r\n}\r\n\r\ninterface FetchProfileFailureAction {\r\n type: typeof FETCH_PROFILE_FAILURE;\r\n payload: ProfilePayload;\r\n}\r\n\r\ninterface UnloadProfileAction {\r\n type: typeof UNLOAD_PROFILE;\r\n payload: ProfilePayload;\r\n}\r\n\r\ninterface ClearProfileErrorAction {\r\n type: typeof CLEAR_PROFILE_ERROR;\r\n payload: ProfilePayload;\r\n}\r\n\r\nexport type ProfileTypes = \r\n FetchProfileBeginAction | \r\n FetchProfileSuccessAction | \r\n FetchProfileFailureAction | \r\n UnloadProfileAction | \r\n ClearProfileErrorAction;","import { \r\n ProfileState, ProfileTypes, CLEAR_PROFILE_ERROR, \r\n UNLOAD_PROFILE, FETCH_PROFILE_BEGIN, FETCH_PROFILE_SUCCESS, \r\n FETCH_PROFILE_FAILURE \r\n} from \"./types\";\r\nimport { AAUserAuthorizationProfile } from '@algo/network-manager/models/v3/admin';\r\nimport { ProcessedResponse } from \"@algo/network-manager/managers/v3\";\r\n\r\nlet initialState: ProfileState = {\r\n userProfile: new AAUserAuthorizationProfile(),\r\n loading: false,\r\n initialized: false,\r\n error: null,\r\n lastResponse: new ProcessedResponse()\r\n}\r\n\r\nexport function profileReducer(state = initialState, action: ProfileTypes): ProfileState {\r\n switch(action.type) {\r\n case FETCH_PROFILE_BEGIN:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case FETCH_PROFILE_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n initialized: true,\r\n userProfile: new AAUserAuthorizationProfile(action.payload.response.data),\r\n lastResponse: action.payload.response\r\n };\r\n case FETCH_PROFILE_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload.error\r\n };\r\n case CLEAR_PROFILE_ERROR:\r\n return {\r\n ...state,\r\n error: null\r\n };\r\n case UNLOAD_PROFILE:\r\n return initialState;\r\n default:\r\n return state;\r\n }\r\n}","//types\r\nimport { ProcessedResponse } from \"@algo/network-manager/managers/v3\";\r\nimport { ATCamera, IATCameraDto } from \"@algo/network-manager/models/v3\";\r\nimport {\r\n CameraState, CameraTypes,\r\n FETCH_CAMERAS_BEGIN, FETCH_CAMERAS_SUCCESS, FETCH_CAMERAS_FAILURE, FETCH_CAMERAS_NOCHANGE,\r\n UPDATE_ACCESS_LEVEL_BEGIN, UPDATE_ACCESS_LEVEL_SUCCESS, UPDATE_ACCESS_LEVEL_FAILURE, UPDATE_ACCESS_LEVEL_CLEAR,\r\n FILTER_DATASOURCES_CAMERA_BEGIN, FILTER_DATASOURCES_CAMERA_SUCCESS, FILTER_DATASOURCES_CAMERA_FAILURE,\r\n MODIFY_CAMERA_INFO_BEGIN, MODIFY_CAMERA_INFO_SUCCESS, MODIFY_CAMERA_INFO_FAILURE,\r\n BULK_UPDATE_BEGIN, BULK_UPDATE_SUCCESS, BULK_UPDATE_FAILURE,\r\n FILTER_EDITOR_CAMERA_FAILURE, FILTER_EDITOR_CAMERA_SUCCESS, FILTER_EDITOR_CAMERA_BEGIN,\r\n REFRESH_CAMERA_LISTS_FAILURE, REFRESH_CAMERA_LISTS_SUCCESS, REFRESH_CAMERA_LISTS_BEGIN,\r\n BULK_UPDATE_CLEAR, CLEAR_CAMERA_ERROR\r\n} from \"./types\";\r\n\r\nlet initialState: CameraState = {\r\n items: [],\r\n checksum: \"\",\r\n count: \"\",\r\n mgmtFilteredItems: null,\r\n editorFilteredItems: [],\r\n loading: false,\r\n error: null,\r\n processing: false,\r\n saveSuccess: false,\r\n lastResponse: new ProcessedResponse()\r\n};\r\n\r\nexport function cameraReducer(state = initialState, action: CameraTypes): CameraState {\r\n switch (action.type) {\r\n case FETCH_CAMERAS_BEGIN:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case FETCH_CAMERAS_SUCCESS:\r\n return {\r\n ...state,\r\n items: action.payload.response?.data.map( (camera: IATCameraDto) => new ATCamera(camera)),\r\n checksum: action.payload.response.getChecksum(),\r\n count: action.payload.response.getCount().toString(),\r\n error: action.payload.response?.error,\r\n loading: false,\r\n lastResponse: action.payload.response\r\n };\r\n case FETCH_CAMERAS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload.error\r\n };\r\n case FETCH_CAMERAS_NOCHANGE:\r\n return {\r\n ...state,\r\n loading: false\r\n };\r\n case UPDATE_ACCESS_LEVEL_BEGIN:\r\n return {\r\n ...state,\r\n processing: true,\r\n saveSuccess: false\r\n };\r\n case UPDATE_ACCESS_LEVEL_SUCCESS:\r\n return {\r\n ...state,\r\n processing: false,\r\n saveSuccess: true\r\n };\r\n case UPDATE_ACCESS_LEVEL_FAILURE:\r\n return {\r\n ...state,\r\n processing: false,\r\n saveSuccess: false,\r\n error: action.payload.error\r\n };\r\n case UPDATE_ACCESS_LEVEL_CLEAR:\r\n return {\r\n ...state,\r\n saveSuccess: false\r\n };\r\n case FILTER_DATASOURCES_CAMERA_BEGIN:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case FILTER_DATASOURCES_CAMERA_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n mgmtFilteredItems: action.payload.mgmtFilteredItems\r\n };\r\n case FILTER_DATASOURCES_CAMERA_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload.error\r\n };\r\n case MODIFY_CAMERA_INFO_BEGIN:\r\n return state;\r\n case MODIFY_CAMERA_INFO_SUCCESS:\r\n return {\r\n ...state,\r\n items: action.payload.items\r\n };\r\n case MODIFY_CAMERA_INFO_FAILURE:\r\n return state;\r\n case BULK_UPDATE_BEGIN:\r\n return {\r\n ...state,\r\n processing: true\r\n };\r\n case BULK_UPDATE_SUCCESS:\r\n return {\r\n ...state,\r\n processing: false,\r\n saveSuccess: true\r\n };\r\n case BULK_UPDATE_FAILURE:\r\n return {\r\n ...state,\r\n processing: false,\r\n saveSuccess: true,\r\n error: action.payload.error\r\n };\r\n case BULK_UPDATE_CLEAR:\r\n return {\r\n ...state,\r\n saveSuccess: false\r\n };\r\n case REFRESH_CAMERA_LISTS_BEGIN:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case REFRESH_CAMERA_LISTS_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n items: action.payload.response?.data.map( (camera: IATCameraDto) => new ATCamera(camera)),\r\n mgmtFilteredItems: action.payload.mgmtFilteredItems,\r\n lastResponse: action.payload.response\r\n };\r\n case REFRESH_CAMERA_LISTS_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload.error\r\n };\r\n case CLEAR_CAMERA_ERROR:\r\n return {\r\n ...state,\r\n error: null\r\n };\r\n case FILTER_EDITOR_CAMERA_BEGIN:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case FILTER_EDITOR_CAMERA_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n editorFilteredItems: action.payload.editorFilteredItems\r\n };\r\n case FILTER_EDITOR_CAMERA_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload.error\r\n };\r\n default:\r\n return state;\r\n }\r\n}","import { AVLegacyVideoBoard } from \"@algo/network-manager/models/v3/video\";\r\nimport {\r\n EditorState, EditorTypes,\r\n INITIALIZE_VIDEOBOARD_SUCCESS, LOAD_VIDEOBOARD_SUCCESS, INITIALIZE_VIDEOBOARD_FAILURE,\r\n SET_NAME_SUCCESS, SET_NAME_FAILURE, SET_CAMERA_ITEM_SUCCESS, SET_CAMERA_ITEM_FAILURE,\r\n REMOVE_CAMERA_ITEM_SUCCESS, REMOVE_CAMERA_ITEM_FAILURE,\r\n ADD_PAGE_SUCCESS, ADD_PAGE_FAILURE,\r\n REMOVE_PAGE_SUCCESS, REMOVE_PAGE_FAILURE,\r\n RESIZE_PAGE_SUCCESS, RESIZE_PAGE_FAILURE,\r\n SAVE_VIDEOBOARD_BEGIN, SAVE_VIDEOBOARD_SUCCESS, SAVE_VIDEOBOARD_FAILURE,\r\n SAVE_PAGE_STATE, CLEAR_EDITOR_STATE, CLEAR_EDITOR_ERROR,\r\n GET_VIDEOBOARD_LIST_BEGIN, GET_VIDEOBOARD_LIST_SUCCESS, GET_VIDEOBOARD_LIST_FAILURE,\r\n DELETE_VIDEOBOARD_BEGIN, DELETE_VIDEOBOARD_SUCCESS, DELETE_VIDEOBOARD_FAILURE\r\n} from \"./types\";\r\n\r\nlet initialState = {\r\n initialized: false,\r\n processing: false,\r\n loading: false,\r\n error: null,\r\n list: [],\r\n videoboard: new AVLegacyVideoBoard(),\r\n currentPageIndex: 0,\r\n rowSize: 2,\r\n columnSize: 2\r\n} as EditorState;\r\n\r\nexport function editorReducer(state = initialState, action: EditorTypes): EditorState {\r\n switch (action.type) {\r\n case INITIALIZE_VIDEOBOARD_SUCCESS:\r\n return {\r\n ...state,\r\n initialized: true,\r\n videoboard: action.payload.videoboard,\r\n currentPageIndex: 0,\r\n rowSize: 2,\r\n columnSize: 2,\r\n };\r\n case LOAD_VIDEOBOARD_SUCCESS:\r\n return {\r\n ...state,\r\n initialized: true,\r\n videoboard: new AVLegacyVideoBoard(action.payload.response.data),\r\n };\r\n case INITIALIZE_VIDEOBOARD_FAILURE:\r\n return {\r\n ...state,\r\n initialized: false,\r\n error: action.payload.error\r\n };\r\n case SET_NAME_SUCCESS:\r\n return {\r\n ...state,\r\n videoboard: action.payload.videoboard\r\n };\r\n case SET_NAME_FAILURE:\r\n return {\r\n ...state,\r\n error: action.payload.error\r\n };\r\n case SET_CAMERA_ITEM_SUCCESS:\r\n return {\r\n ...state,\r\n videoboard: action.payload.videoboard\r\n };\r\n case SET_CAMERA_ITEM_FAILURE:\r\n return {\r\n ...state,\r\n error: action.payload.error\r\n };\r\n case REMOVE_CAMERA_ITEM_SUCCESS:\r\n return {\r\n ...state,\r\n videoboard: action.payload.videoboard\r\n };\r\n case REMOVE_CAMERA_ITEM_FAILURE:\r\n return {\r\n ...state,\r\n error: action.payload.error\r\n };\r\n case ADD_PAGE_SUCCESS:\r\n return {\r\n ...state,\r\n videoboard: action.payload.videoboard\r\n };\r\n case ADD_PAGE_FAILURE: \r\n return {\r\n ...state,\r\n error: action.payload.error\r\n };\r\n case REMOVE_PAGE_SUCCESS:\r\n return {\r\n ...state,\r\n videoboard: action.payload.videoboard\r\n };\r\n case REMOVE_PAGE_FAILURE:\r\n return {\r\n ...state,\r\n error: action.payload.error\r\n };\r\n case RESIZE_PAGE_SUCCESS:\r\n return {\r\n ...state,\r\n videoboard: action.payload.videoboard\r\n };\r\n case RESIZE_PAGE_FAILURE:\r\n return {\r\n ...state,\r\n error: action.payload.error\r\n };\r\n case SAVE_VIDEOBOARD_BEGIN:\r\n return {\r\n ...state,\r\n processing: true\r\n };\r\n case SAVE_VIDEOBOARD_SUCCESS: \r\n return {\r\n ...state,\r\n processing: false,\r\n videoboard: action.payload.videoboard\r\n };\r\n case SAVE_VIDEOBOARD_FAILURE:\r\n return {\r\n ...state,\r\n processing: false,\r\n error: action.payload.error\r\n };\r\n case SAVE_PAGE_STATE:\r\n return {\r\n ...state,\r\n currentPageIndex: action.payload.currentPageIndex,\r\n rowSize: action.payload.rowSize,\r\n columnSize: action.payload.columnSize\r\n };\r\n case CLEAR_EDITOR_STATE:\r\n return {\r\n ...state,\r\n initialized: false,\r\n currentPageIndex: 0,\r\n rowSize: 2,\r\n columnSize: 2,\r\n videoboard: new AVLegacyVideoBoard()\r\n };\r\n case CLEAR_EDITOR_ERROR:\r\n return {\r\n ...state,\r\n error: null\r\n };\r\n case GET_VIDEOBOARD_LIST_BEGIN:\r\n return {\r\n ...state,\r\n loading: true\r\n };\r\n case GET_VIDEOBOARD_LIST_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n list: action.payload.list,\r\n };\r\n case GET_VIDEOBOARD_LIST_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload.error\r\n };\r\n case DELETE_VIDEOBOARD_BEGIN:\r\n return {\r\n ...state,\r\n processing: true\r\n };\r\n case DELETE_VIDEOBOARD_SUCCESS:\r\n return {\r\n ...state,\r\n processing: false,\r\n list: action.payload.list\r\n };\r\n case DELETE_VIDEOBOARD_FAILURE:\r\n return {\r\n ...state,\r\n processing: false,\r\n error: action.payload.error\r\n };\r\n default:\r\n return state;\r\n }\r\n}","import { \r\n combineReducers,\r\n createStore,\r\n applyMiddleware,\r\n compose\r\n} from 'redux';\r\nimport createOidcMiddleware, {\r\n loadUser,\r\n reducer,\r\n} from 'redux-oidc';\r\nimport thunkMiddleware from 'redux-thunk';\r\nimport { datasourceReducer } from './datasource/reducers';\r\nimport { profileReducer } from './profile/reducers';\r\nimport { cameraReducer } from './camera/reducers';\r\nimport { editorReducer } from './videoboard/reducers';\r\nimport userManager from '../utils/userManager';\r\n\r\nlet rootReducer = combineReducers({\r\n datasource: datasourceReducer,\r\n profile: profileReducer,\r\n camera: cameraReducer,\r\n editor: editorReducer,\r\n oidc: reducer\r\n});\r\n\r\nexport type AppState = ReturnType;\r\n\r\nlet oidcMiddleware = createOidcMiddleware(userManager);\r\n\r\nlet createStoreWithMiddleware = \r\n compose(applyMiddleware(thunkMiddleware, oidcMiddleware))(createStore);\r\n\r\nlet initialState = {};\r\nlet store = createStoreWithMiddleware(rootReducer, initialState);\r\n\r\nloadUser(store, userManager);\r\n\r\nexport default store;","// liraries\r\nimport { ThunkAction } from \"redux-thunk\";\r\nimport { AppState } from \"..\";\r\nimport { Action } from \"redux\";\r\nimport { getAccessToken } from \"../../utils/data/getAccessToken\";\r\n// interfaces & models\r\nimport * as TYPES from \"./types\";\r\n//constants\r\nimport { CUR_API_VERSION, CUR_API_ENPOINTS } from \"../api-version-constants\";\r\nimport { \r\n IProcessedResponse,\r\n IUserNetworkManager, UserNetworkManager\r\n} from \"@algo/network-manager/managers/v3\";\r\ndeclare var __API_URL__: string;\r\nconst apiUrlProfile: string = \r\n `${__API_URL__}/${CUR_API_VERSION}/${CUR_API_ENPOINTS(CUR_API_VERSION).users}`;\r\n\r\n\r\n/*\r\nGet User Profile\r\n*/\r\nfunction fetchProfileBegin(): TYPES.ProfileTypes {\r\n return {\r\n type: TYPES.FETCH_PROFILE_BEGIN,\r\n payload: {} as TYPES.ProfilePayload\r\n };\r\n}\r\n\r\nfunction fetchProfileSuccess(response: IProcessedResponse): TYPES.ProfileTypes {\r\n return {\r\n type: TYPES.FETCH_PROFILE_SUCCESS,\r\n payload: {\r\n response: response,\r\n error: null\r\n } as TYPES.ProfilePayload\r\n };\r\n}\r\n\r\nfunction fetchProfileFailure(error: Error): TYPES.ProfileTypes {\r\n return {\r\n type: TYPES.FETCH_PROFILE_FAILURE,\r\n payload: {\r\n error: error\r\n } as TYPES.ProfilePayload\r\n };\r\n}\r\n\r\nexport let loadUserProfile = (\r\n\r\n): ThunkAction> => async (dispatch, getState) => {\r\n if (!getState().profile.loading) {\r\n dispatch(fetchProfileBegin());\r\n\r\n getAccessToken().then(\r\n (token) => {\r\n let manager: IUserNetworkManager = new UserNetworkManager(apiUrlProfile);\r\n manager.setAccessToken(token);\r\n\r\n // uses processedFetch rather than getData (User api has no head calls)\r\n manager.getProfile()\r\n .then(\r\n (response: IProcessedResponse) => {\r\n if (response.error) \r\n dispatch(fetchProfileFailure(response.error))\r\n else\r\n dispatch(fetchProfileSuccess(response))\r\n }\r\n ).catch(\r\n (err: Error) => {\r\n dispatch(fetchProfileFailure(err))\r\n }\r\n )\r\n }\r\n ).catch(\r\n (error: Error) => {\r\n dispatch(fetchProfileFailure(error))\r\n }\r\n )\r\n }\r\n}\r\n\r\nexport let updateUserProfile = (): ThunkAction> => async (dispatch, getState) => {\r\n if (getState().profile.initialized) {\r\n dispatch(fetchProfileBegin());\r\n\r\n getAccessToken().then(\r\n (token) => {\r\n let manager: IUserNetworkManager = new UserNetworkManager(apiUrlProfile);\r\n manager.setAccessToken(token);\r\n\r\n // uses processedFetch rather than getData (User api has no head calls)\r\n manager.getProfile()\r\n .then(\r\n (processed: IProcessedResponse) => {\r\n dispatch(fetchProfileSuccess(processed))\r\n }\r\n ).catch(\r\n (err: Error) => {\r\n dispatch(fetchProfileFailure(err))\r\n }\r\n )\r\n }\r\n ).catch(\r\n (error: Error) => {\r\n dispatch(fetchProfileFailure(error))\r\n }\r\n )\r\n }\r\n}\r\n\r\n/*\r\nUnload User Profile\r\n*/\r\n\r\nfunction unloadProfileState(): TYPES.ProfileTypes {\r\n return {\r\n type: TYPES.UNLOAD_PROFILE,\r\n payload: {} as TYPES.ProfilePayload\r\n };\r\n}\r\n\r\nexport let unloadUserProfile = (\r\n\r\n): ThunkAction> => async dispatch => {\r\n dispatch(unloadProfileState());\r\n}\r\n\r\n/*\r\nClear User Profile Error\r\n*/\r\n\r\nfunction clearUserProfileErrorState(): TYPES.ProfileTypes {\r\n return {\r\n type: TYPES.CLEAR_PROFILE_ERROR,\r\n payload: {} as TYPES.ProfilePayload\r\n };\r\n}\r\n\r\nexport let clearUserProfileError = (\r\n\r\n): ThunkAction> => async dispatch => {\r\n dispatch(clearUserProfileErrorState());\r\n}","import * as React from 'react';\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators, Dispatch } from 'redux';\r\nimport { withRouter, RouteComponentProps } from 'react-router-dom';\r\n\r\nimport userManager from '../../../utils/userManager';\r\nimport { unloadUserProfile } from '../../../store/profile/actions';\r\nimport { ProfileState } from '../../../store/profile/types';\r\nimport { AppState } from '../../../store';\r\nimport { User } from 'oidc-client';\r\n\r\ndeclare var __AUTHORITY_URL__: string;\r\ndeclare var __CLIENT_URL__: string;\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n profile: ProfileState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user,\r\n profile: state.profile\r\n };\r\n}\r\n\r\ninterface DispatchProps {\r\n unloadUserProfile: typeof unloadUserProfile;\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch) => {\r\n return bindActionCreators({\r\n unloadUserProfile: unloadUserProfile\r\n }, dispatch);\r\n}\r\n\r\ntype AuthenticationButtonProps = StateProps & DispatchProps & RouteComponentProps;\r\n\r\ninterface AuthenticationButtonState {\r\n isLoading: boolean;\r\n};\r\n\r\nclass AuthenticationButton extends React.Component {\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.state = {\r\n isLoading: false\r\n } as AuthenticationButtonState;\r\n }\r\n\r\n signIn = (event: React.MouseEvent): void => {\r\n event.preventDefault();\r\n\r\n this.setState({\r\n isLoading: true\r\n });\r\n\r\n userManager.signinRedirect();\r\n }\r\n\r\n signOut = (event: React.MouseEvent): void => {\r\n event.preventDefault();\r\n\r\n userManager.getUser()\r\n .then((user) => {\r\n this.props.unloadUserProfile();\r\n\r\n window.sessionStorage.removeItem(`oidc.user:${__AUTHORITY_URL__}:algovideo`);\r\n\r\n window.location.replace(\r\n `${__AUTHORITY_URL__}/connect/endsession?id_token_hint=${user?.id_token}` + \r\n `&post_logout_redirect_uri=${__CLIENT_URL__}/session_ended`\r\n );\r\n });\r\n }\r\n\r\n render() {\r\n const { user, location } = this.props;\r\n\r\n if (user && !user.expired) {\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 else if (location.pathname !== '/callback') {\r\n\r\n let btnClass: string = \r\n `av-auth-btn av-auth-signin-btn my-2 my-sm-0 mr-lg-0 mr-sm-0` +\r\n `${this.state.isLoading ? 'loading' : '' }`;\r\n\r\n return (\r\n \r\n );\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(AuthenticationButton));","// libraries\r\nimport * as React from 'react';\r\nimport { withRouter, NavLink, RouteComponentProps } from 'react-router-dom';\r\nimport { connect } from 'react-redux';\r\n// models & interfaces\r\nimport { VIEW_VIDEOBOARD, VIEW_CAMERA } from '../../../models/Privileges';\r\nimport { \r\n FIRST_RESPONDER_CAMERA_VIEWER, \r\n MEDIA_CAMERA_VIEWER, \r\n PRIVATE_SECTOR_CAMERA_VIEWER\r\n} from '../../../models/Roles';\r\n// components\r\nimport AuthenticationButton from './AuthenticationButton';\r\n// store\r\nimport { AppState } from '../../../store';\r\nimport { ProfileState } from '../../../store/profile/types';\r\nimport { User } from 'oidc-client';\r\n// resources\r\nimport { algoLogo } from '../../../images';\r\n\r\ninterface OwnProps {\r\n\r\n}\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n profile: ProfileState;\r\n}\r\n\r\nlet mapStateToProps = (store: AppState): StateProps => {\r\n return {\r\n user: store.oidc.user,\r\n profile: store.profile\r\n };\r\n}\r\n\r\ninterface DispatchProps {\r\n\r\n}\r\n\r\ntype HeaderProps = \r\n OwnProps & \r\n StateProps & \r\n DispatchProps & \r\n RouteComponentProps;\r\n\r\ndeclare var __ADMIN_URL__: string;\r\n\r\nclass Header extends React.Component {\r\n\r\n \r\n\r\n render() {\r\n let { user, profile } = this.props;\r\n\r\n // validations\r\n let isNonExpiredUser: boolean = (user !== null && user !== undefined && !user.expired);\r\n let userHasRoles: boolean = ( \r\n profile !== null && \r\n profile !== undefined && \r\n profile.userProfile.role !== null &&\r\n profile.userProfile.role !== undefined && \r\n profile.userProfile.role.length > 0\r\n );\r\n\r\n let dashboardLink = (user && !user.expired && profile.initialized) && profile.userProfile.hasPrivilege(VIEW_VIDEOBOARD) ? (\r\n
  • \r\n \r\n Dashboard\r\n \r\n
  • \r\n ) : (null);\r\n\r\n let camerasLink = (user && !user.expired && profile.initialized) && profile.userProfile.hasPrivilege(VIEW_CAMERA) ? (\r\n
  • \r\n \r\n Cameras\r\n \r\n
  • \r\n ) : (null);\r\n\r\n let adminLink = (\r\n ( isNonExpiredUser && profile.initialized ) && \r\n userHasRoles && \r\n !(\r\n profile.userProfile.isInRole(MEDIA_CAMERA_VIEWER) || \r\n profile.userProfile.isInRole(FIRST_RESPONDER_CAMERA_VIEWER) || \r\n profile.userProfile.isInRole(PRIVATE_SECTOR_CAMERA_VIEWER)\r\n ) \r\n ) ? (\r\n
  • \r\n \r\n Administration\r\n \r\n
  • \r\n ) : (null);\r\n\r\n let guideLink = (user && !user.expired && profile.initialized) ? (\r\n
  • \r\n \r\n Help\r\n \r\n
  • \r\n ): (null);\r\n\r\n let loadingLinks = (\r\n
  • \r\n Loading...\r\n
  • \r\n );\r\n\r\n const links =
      {!profile.initialized ? loadingLinks : [dashboardLink, camerasLink, adminLink, guideLink]}
    ;\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\nexport default connect(\r\n mapStateToProps\r\n)(withRouter(Header));","export let FIRST_RESPONDER_CAMERA_VIEWER = 'FirstResponderCameraViewer';\r\nexport let MEDIA_CAMERA_VIEWER = 'MediaCameraViewer';\r\nexport let PRIVATE_SECTOR_CAMERA_VIEWER = 'PrivateSectorCameraViewer';\r\n","import * as React from 'react';\r\nimport $ from \"jquery\";\r\n\r\ninterface ErrorModalProps {\r\n dismissCallback: (() => void);\r\n title?: string;\r\n message?: string;\r\n error?: Error;\r\n}\r\n\r\ninterface ErrorModalState {\r\n instanceId: number;\r\n}\r\n\r\nexport default class ErrorModal extends React.Component {\r\n modalRef: React.RefObject;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.modalRef = React.createRef();\r\n\r\n this.state = {\r\n instanceId: Math.random()\r\n } as ErrorModalState;\r\n }\r\n\r\n componentDidMount() {\r\n this.modalRef.current &&\r\n $(this.modalRef.current).modal('show');\r\n }\r\n\r\n dismiss = (event: React.MouseEvent): void => {\r\n const { dismissCallback } = this.props;\r\n\r\n event.preventDefault();\r\n\r\n this.modalRef.current &&\r\n $(this.modalRef.current).modal('hide');\r\n\r\n dismissCallback();\r\n }\r\n\r\n render() {\r\n let { title, message, error } = this.props;\r\n\r\n var formattedMessage: string | undefined;\r\n\r\n if (error) {\r\n formattedMessage = error.message;\r\n }\r\n else if (message) {\r\n formattedMessage = title;\r\n }\r\n else {\r\n formattedMessage = 'There was an error';\r\n }\r\n\r\n var formattedTitle: string;\r\n\r\n if (error) {\r\n formattedTitle = error.name;\r\n }\r\n else if (title) {\r\n formattedTitle = title;\r\n }\r\n else {\r\n formattedTitle = 'General Exception';\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}","import styled from \"styled-components\";\r\nimport { flexSmart } from \"@caps-mobile/styled-lib\";\r\n\r\nexport const StyledMessageContainer = styled.div`\r\n height: 100%;\r\n width: 100%;\r\n ${flexSmart(\"center center\")}\r\n`;\r\n\r\nexport const StyledAlertContainer = styled.div`\r\n height: 100%;\r\n width: 100%;\r\n\r\n ${flexSmart(\"center center\")}\r\n flex-direction: column;\r\n`;\r\n\r\nexport const StyledSubtext = styled.div`\r\n font-size: 14px;\r\n line-height: 16px;\r\n`;\r\n\r\nexport const StyledRootLink = styled.a`\r\n font-weight: 700;\r\n color: rgba(30, 130, 76, .85);\r\n\r\n :hover{\r\n color: rgba(30, 130, 76, 1);\r\n }\r\n`;","// libraries\r\nimport * as React from \"react\";\r\n// styles\r\nimport * as SC from \"../styled/Globals\";\r\n// components\r\nimport Content from '../base/layout/Content';\r\n// store\r\n\r\ntype RedirectProps = any;\r\n\r\nconst RedirectContent: React.FC = (props) => {\r\n return (\r\n \r\n
    \r\n

    \r\n Authenticating\r\n

    \r\n \r\n \r\n
    \r\n Please wait, you will be redirected shortly...\r\n
    \r\n \r\n If it has been more than 10 seconds and you have still not redirected, click here.\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default RedirectContent;","// libraries\r\nimport * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter, RouteComponentProps } from 'react-router-dom';\r\n// components\r\nimport RedirectContent from './RedirectContent';\r\n// store\r\nimport { AppState } from \"../../store\";\r\nimport { User } from \"oidc-client\";\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user\r\n };\r\n}\r\n\r\ntype RedirectProps = StateProps & RouteComponentProps;\r\n\r\nconst Redirect: React.FC = (props) => {\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n)(withRouter(Redirect));","// libraries\r\nimport * as React from \"react\";\r\n\r\nexport type IErrorProps = {\r\n //\r\n}\r\n\r\nexport const Error: React.FC = (props) => {\r\n\r\n return(\r\n
    \r\n
    \r\n

    Something went wrong

    \r\n

    Please refresh the page. If problems persist, please contact the system administrator.

    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default Error;","// libraries\r\nimport * as React from 'react';\r\nimport { CallbackComponent } from 'redux-oidc';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter, RouteComponentProps } from 'react-router-dom';\r\n// components\r\nimport RedirectContent from './RedirectContent';\r\n// store\r\nimport { AppState } from '../../store';\r\nimport { User } from 'oidc-client';\r\nimport userManager from '../../utils/userManager';\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user\r\n };\r\n}\r\n\r\ntype OidcCallbackProps = StateProps & RouteComponentProps;\r\n\r\nclass OidcCallback extends React.Component {\r\n constructor(props: Readonly) {\r\n super(props);\r\n }\r\n\r\n successCallback = (user: User): void => {\r\n window.location.replace(user.state ? user.state.path : '/');\r\n };\r\n\r\n errorCallback = (error: Error): void => {\r\n console.error('There was an error handling the token callback: ' + error.message);\r\n };\r\n\r\n render() {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n)(withRouter(OidcCallback));","// libraries\r\nimport * as React from 'react';\r\n// components\r\nimport Content from '../base/layout/Content';\r\n\r\nexport default class NotFound extends React.Component {\r\n constructor(props: any) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n

    \r\n Not Found\r\n

    \r\n
    \r\n
    \r\n
    \r\n This page does not exist\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\n// components\r\nimport Content from '../base/layout/Content';\r\n\r\nexport default class AccessDenied extends React.Component {\r\n constructor(props: any) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n

    \r\n Access Denied\r\n

    \r\n
    \r\n
    \r\n
    \r\n You do not have access to this page\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\n// components\r\nimport Content from '../base/layout/Content';\r\n\r\nexport default class LoggedOff extends React.Component {\r\n constructor(props: any) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n

    \r\n Signed Out\r\n

    \r\n
    \r\n
    \r\n
    \r\n Your session has ended\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\nimport { processSilentRenew } from 'redux-oidc';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter, RouteComponentProps } from 'react-router-dom';\r\n// store\r\nimport { AppState } from '../../store';\r\nimport { User } from 'oidc-client';\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user\r\n };\r\n}\r\n\r\ntype OidcSilentRenewProps = StateProps & RouteComponentProps;\r\n\r\nclass OidcSilentRenew extends React.Component {\r\n constructor(props: Readonly) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {\r\n processSilentRenew();\r\n }\r\n\r\n render() {\r\n return
    Renewing token...
    ;\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n)(withRouter(OidcSilentRenew));","// libraries\r\nimport * as React from 'react';\r\n\r\nexport default class Sidebar extends React.Component<{}, {}> {\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators, Dispatch } from 'redux';\r\n// interfaces & models\r\n// enums\r\nimport { EATRegion } from '@algo/network-manager/models/v3';\r\n// components\r\nimport {ThemedDropdown} from \"@caps-mobile/themed-dropdown\";\r\n// store\r\nimport { AppState } from '../../store';\r\nimport { ProfileState } from '../../store/profile/types';\r\nimport { DatasourceState } from '../../store/datasource/types';\r\nimport { User } from 'oidc-client';\r\nimport { loadDatasources } from '../../store/datasource/actions';\r\n\r\ninterface OwnProps {\r\n onChangeCallback: (region: EATRegion) => void;\r\n disabled: boolean;\r\n}\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n profile: ProfileState;\r\n datasource: DatasourceState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user,\r\n profile: state.profile,\r\n datasource: state.datasource\r\n };\r\n}\r\n\r\ninterface DispatchProps {\r\n loadDatasources: typeof loadDatasources;\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch) => {\r\n return bindActionCreators({\r\n loadDatasources: loadDatasources\r\n }, dispatch);\r\n}\r\n\r\ntype DatasourceSelectorProps = OwnProps & StateProps & DispatchProps;\r\n\r\ninterface DatasourceSelectorState {\r\n selectedValue: EATRegion;\r\n selectedIndex: number | null;\r\n disabled: boolean;\r\n}\r\n\r\nclass DatasourceSelector extends React.Component {\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedValue: EATRegion.Unknown,\r\n selectedIndex: null,\r\n disabled: false\r\n } as DatasourceSelectorState;\r\n }\r\n\r\n componentDidMount() {\r\n this.props.loadDatasources();\r\n this.forceUpdate();\r\n }\r\n\r\n componentDidUpdate(prevProps: any, prevState: any, snapshot: any) {\r\n let { onChangeCallback } = this.props;\r\n\r\n if (\r\n this.props.datasource.datasources.length === 1 && \r\n this.state.selectedValue === EATRegion.Unknown\r\n ) {\r\n onChangeCallback(this.props.datasource.datasources[0].region);\r\n\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n selectedValue: props.datasource.datasources[0].region,\r\n disabled: true\r\n };\r\n });\r\n }\r\n }\r\n\r\n datasourceSelected = (selectedIndex: number) => {\r\n let { datasource, onChangeCallback } = this.props;\r\n\r\n let dId = selectedIndex === 0 \r\n ? EATRegion.ALDOT\r\n : datasource.datasources[selectedIndex - 1].region;\r\n\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n selectedValue: dId,\r\n selectedIndex: selectedIndex\r\n }\r\n });\r\n\r\n onChangeCallback(dId);\r\n };\r\n\r\n render() {\r\n let { datasource } = this.props;\r\n\r\n let listItems: string[] = (datasource.datasources.length > 0) \r\n ? datasource.datasources.map(\r\n (item, index) => { return item.displayName;}\r\n )\r\n : [];\r\n\r\n listItems = [\"All\", ...listItems];\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\nexport default connect(\r\n mapStateToProps, \r\n mapDispatchToProps\r\n)(DatasourceSelector);","import * as React from 'react';\r\n\r\ninterface SearchBoxProps {\r\n disabled: boolean;\r\n onChange: ((event: React.ChangeEvent) => void);\r\n}\r\n\r\nexport default class SearchBox extends React.Component {\r\n constructor(props: Readonly) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n const { disabled, onChange } = this.props;\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n );\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\n// models & interfaces\r\nimport { IATCamera } from '@algo/network-manager/models/v3';\r\n// constants\r\nimport { ASPECT_RATIO_16_10 } from '../../../utils/AppConstants';\r\n\r\ninterface DraggableCameraProps {\r\n item: IATCamera;\r\n className?: string;\r\n}\r\n\r\ninterface DraggableCameraState {\r\n imageUrl: string;\r\n loadingImage: boolean;\r\n snapshotAspectRatioClass: string;\r\n}\r\n\r\nexport default class DraggableCamera extends React.Component {\r\n snapshotRef: React.RefObject;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.state = {\r\n imageUrl: '',\r\n loadingImage: true,\r\n snapshotAspectRatioClass: 'fill',\r\n } as DraggableCameraState;\r\n\r\n this.snapshotRef = React.createRef();\r\n }\r\n\r\n componentDidMount() {\r\n this.snapshotRef.current &&\r\n this.snapshotRef.current.addEventListener('load', this.snapshotImageLoaded);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.snapshotRef.current &&\r\n this.snapshotRef.current.removeEventListener('load', this.snapshotImageLoaded);\r\n }\r\n\r\n snapshotImageLoaded = (event: Event): void => {\r\n\r\n let snapshot = this.snapshotRef.current;\r\n\r\n if (snapshot) {\r\n\r\n let naturalAspectRatio: number = \r\n snapshot.naturalWidth / snapshot.naturalHeight;\r\n \r\n let aspectRatioClass: string = 'fill';\r\n\r\n if (naturalAspectRatio === ASPECT_RATIO_16_10)\r\n aspectRatioClass = 'contain';\r\n\r\n this.setState({\r\n ...this.state,\r\n snapshotAspectRatioClass: aspectRatioClass\r\n });\r\n }\r\n }\r\n\r\n dragStartHandler = (event: React.DragEvent): void => {\r\n event.persist();\r\n event.dataTransfer.setData(\"text/plain\", event.currentTarget.id);\r\n }\r\n\r\n render() {\r\n const { item, className } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {item.location.displayRouteDesignator}\r\n
    \r\n
    \r\n {item.location.crossStreet}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","// libraries\r\nimport * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators, Dispatch } from \"redux\";\r\n// models & interfaces\r\nimport { IATCamera } from '@algo/network-manager/models/v3';\r\n// enums\r\nimport { EATRegion } from '@algo/network-manager/models/v3';\r\n// components\r\nimport DatasourceSelector from '../DatasourceSelector';\r\nimport SearchBox from '../SearchBox';\r\nimport DraggableCamera from './DraggableCamera';\r\n// store\r\nimport { getCameras, getCamerasForEditor } from '../../../store/camera/actions';\r\nimport { DatasourceState } from '../../../store/datasource/types';\r\nimport { CameraState } from '../../../store/camera/types';\r\nimport { AppState } from '../../../store';\r\n\r\ninterface StateProps {\r\n datasource: DatasourceState;\r\n camera: CameraState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState) => {\r\n return {\r\n datasource: state.datasource,\r\n camera: state.camera\r\n }\r\n}\r\n\r\ninterface DispatchProps {\r\n getCameras: typeof getCameras;\r\n getCamerasForEditor: typeof getCamerasForEditor;\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch) => {\r\n return bindActionCreators({\r\n getCameras: getCameras,\r\n getCamerasForEditor: getCamerasForEditor\r\n }, dispatch);\r\n}\r\n\r\ntype CameraSelectorProps = StateProps & DispatchProps;\r\n\r\ninterface CameraSelectorState {\r\n selectedRegion: EATRegion;\r\n query: string;\r\n}\r\n\r\nclass CameraSelector extends React.Component {\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedRegion: EATRegion.Unknown,\r\n query: ''\r\n } as CameraSelectorState;\r\n }\r\n\r\n componentDidMount() {\r\n this.props.getCameras();\r\n }\r\n\r\n componentDidUpdate(prevProps: any, prevState: any, snapshot: any) {\r\n if (this.props.camera.items.length !== prevProps.camera.items.length) {\r\n this.props.getCamerasForEditor(this.state.selectedRegion, this.state.query);\r\n }\r\n else if (this.state.selectedRegion !== prevState.selectedRegion) {\r\n this.props.getCamerasForEditor(this.state.selectedRegion, this.state.query);\r\n }\r\n else if (this.state.query !== prevState.query) {\r\n this.props.getCamerasForEditor(this.state.selectedRegion, this.state.query);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.getCamerasForEditor(EATRegion.Unknown, '');\r\n }\r\n\r\n datsourceSelectorChange = (region: EATRegion): void => {\r\n\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n selectedRegion: region\r\n };\r\n });\r\n }\r\n\r\n cameraSearchChange = (event: React.ChangeEvent): void => {\r\n event.persist();\r\n\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n query: event.target.value\r\n };\r\n });\r\n }\r\n\r\n renderCameraElements = (items: IATCamera[]): React.ReactNode => {\r\n if (items.length > 0) {\r\n return (\r\n items.map(\r\n (item: IATCamera) => \r\n \r\n )\r\n )\r\n\r\n }\r\n else {\r\n return (\r\n
    \r\n
    \r\n No cameras found for given region and search term\r\n
    \r\n
    \r\n );\r\n }\r\n }\r\n\r\n render() {\r\n const { datasource, camera } = this.props;\r\n\r\n const cameraElements = (camera.editorFilteredItems.length > 0) \r\n ? ( camera.editorFilteredItems.map(\r\n (item, index) => \r\n \r\n )\r\n ) \r\n : (\r\n
    \r\n
    \r\n No cameras found for given region and search term\r\n
    \r\n
    \r\n );\r\n\r\n return (\r\n
    \r\n \r\n\r\n \r\n\r\n
    \r\n

    Cameras

    \r\n
    \r\n
    \r\n {cameraElements}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n mapDispatchToProps\r\n)(CameraSelector);","// libraries\r\nimport * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter, RouteComponentProps } from 'react-router-dom';\r\nimport { bindActionCreators, Dispatch } from \"redux\";\r\nimport { CSSTransition } from 'react-transition-group';\r\n// components\r\nimport Sidebar from '../base/layout/Sidebar';\r\nimport Content from '../base/layout/Content';\r\nimport CameraSelector from '../base/editor/CameraSelector';\r\nimport VideoboardEditor from '../base/editor/VideoboardEditor';\r\nimport VideoboardSelector from '../base/VideoboardSelector';\r\nimport Videoboard from '../base/display/Videoboard';\r\nimport ConfirmationModal from '../base/modals/ConfirmationModal';\r\n// store\r\nimport { AppState } from '../../store';\r\nimport { EditorState } from '../../store/videoboard/types';\r\nimport { User } from 'oidc-client';\r\nimport { getCameras } from '../../store/camera/actions';\r\nimport { \r\n clearEditorState, getVideoboardList, loadVideoboard, \r\n initializeVideoboardEditor, deleteVideoboard\r\n} from '../../store/videoboard/actions';\r\n// constants\r\nimport { CAMERA_REFRESH_INTERVAL } from '../../utils/AppConstants';\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n editor: EditorState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user,\r\n editor: state.editor\r\n };\r\n}\r\n\r\ninterface DispatchProps {\r\n clearEditorState: typeof clearEditorState;\r\n getCameras: typeof getCameras;\r\n getVideoboardList: typeof getVideoboardList;\r\n loadVideoboard: typeof loadVideoboard;\r\n initializeVideoboardEditor: typeof initializeVideoboardEditor;\r\n deleteVideoboard: typeof deleteVideoboard;\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch): DispatchProps => {\r\n return bindActionCreators({\r\n clearEditorState: clearEditorState,\r\n getCameras: getCameras,\r\n getVideoboardList: getVideoboardList,\r\n loadVideoboard: loadVideoboard,\r\n initializeVideoboardEditor: initializeVideoboardEditor,\r\n deleteVideoboard: deleteVideoboard\r\n }, dispatch);\r\n}\r\n\r\ntype EditorPageProps = StateProps & DispatchProps & RouteComponentProps;\r\n\r\ninterface EditorPageState {\r\n displayMode: boolean;\r\n videoboardId: number;\r\n showDeleteModal: boolean;\r\n}\r\n\r\nclass Editor extends React.Component {\r\n cameraRefresher: NodeJS.Timeout;\r\n\r\n constructor(props: Readonly) { \r\n super(props);\r\n\r\n this.cameraRefresher = setInterval(this.fetchCameras, CAMERA_REFRESH_INTERVAL);\r\n\r\n this.state = {\r\n displayMode: false,\r\n videoboardId: this.props.match.params.id | 0,\r\n showDeleteModal: false\r\n } as EditorPageState;\r\n }\r\n\r\n componentDidMount() {\r\n this.props.getVideoboardList();\r\n\r\n if (this.state.videoboardId === 0) {\r\n this.props.initializeVideoboardEditor();\r\n }\r\n else {\r\n this.props.loadVideoboard(this.state.videoboardId);\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: any, prevState: any, snapshot: any) {\r\n if (this.state.videoboardId !== prevState.videoboardId) {\r\n if (this.state.videoboardId === 0) {\r\n this.props.initializeVideoboardEditor();\r\n }\r\n else {\r\n this.props.loadVideoboard(this.state.videoboardId);\r\n }\r\n }\r\n\r\n if (this.props.editor.processing !== prevProps.editor.processing && !this.props.editor.processing) {\r\n this.props.getVideoboardList();\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n clearInterval(this.cameraRefresher);\r\n this.props.initializeVideoboardEditor();\r\n }\r\n\r\n fetchCameras = (): void => {\r\n this.props.getCameras();\r\n }\r\n\r\n setToEditor = (event: React.MouseEvent): void => {\r\n if (this.props.editor.initialized) {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n displayMode: false \r\n };\r\n });\r\n }\r\n }\r\n\r\n setToDisplay = (event: React.MouseEvent) => {\r\n if (this.props.editor.initialized) {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n displayMode: true \r\n };\r\n });\r\n }\r\n }\r\n\r\n videoboardSelectorChange = (id: number):void => {\r\n this.props.clearEditorState();\r\n\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n videoboardId: id,\r\n displayMode: false \r\n };\r\n });\r\n }\r\n\r\n newVideoboard = (): void => {\r\n this.props.initializeVideoboardEditor();\r\n\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n videoboardId: 0,\r\n displayMode: false \r\n };\r\n });\r\n }\r\n\r\n removeVideoboard = (id: number): void => {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n showDeleteModal: true\r\n };\r\n });\r\n }\r\n\r\n deleteDismissCallback = (): void => {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n showDeleteModal: false\r\n };\r\n });\r\n }\r\n\r\n deleteConfirmCallback = (): void => {\r\n this.setState((state, props) => {\r\n return {\r\n ...state,\r\n showDeleteModal: false,\r\n displayMode: false,\r\n videoboardId: 0\r\n };\r\n });\r\n\r\n this.props.deleteVideoboard(this.props.editor.videoboard);\r\n }\r\n\r\n render() {\r\n let { editor } = this.props;\r\n\r\n let content = this.state.displayMode ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\n let deleteModal = this.state.showDeleteModal ? (\r\n ) : (null);\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n\r\n

    \r\n Videoboard Editor\r\n

    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n {content}\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n {deleteModal}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n mapDispatchToProps\r\n)(withRouter(Editor));","// libraries\r\nimport * as React from 'react';\r\n// components\r\nimport Content from '../base/layout/Content';\r\n// resources\r\nimport { videoGuide } from '../../images';\r\n\r\nexport default class SiteGuide extends React.Component {\r\n constructor(props: any) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n

    Site Guide

    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}","// libraries\r\nimport * as React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators, Dispatch } from 'redux';\r\nimport { withRouter, Route, Switch, RouteComponentProps } from 'react-router-dom';\r\n// models & interfaces\r\nimport { VIEW_VIDEOBOARD, VIEW_CAMERA } from '../models/Privileges';\r\n// components\r\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\r\nimport Header from './base/layout/Header';\r\nimport ErrorModal from './base/modals/ErrorModal';\r\nimport Redirect from './pages/Redirect';\r\nimport Error from \"./pages/Error\";\r\nimport OidcCallback from './pages/OidcCallback';\r\nimport NotFound from './pages/NotFound';\r\nimport AccessDenied from './pages/AccessDenied';\r\nimport LoggedOff from './pages/LoggedOff';\r\nimport Loading from './pages/Loading';\r\nimport OidcSilentRenew from './pages/OidcSilentRenew';\r\nimport CameraManagement from './pages/CameraManagement';\r\nimport Editor from './pages/Editor';\r\nimport SiteGuide from './pages/SiteGuide';\r\n// store\r\nimport { AppState } from '../store';\r\nimport { DatasourceState } from '../store/datasource/types';\r\nimport { ProfileState } from '../store/profile/types';\r\nimport { CameraState } from '../store/camera/types';\r\nimport { EditorState } from '../store/videoboard/types';\r\n\r\nimport { User } from 'oidc-client';\r\nimport userManager from '../utils/userManager';\r\n\r\nimport { loadUserProfile, updateUserProfile, clearUserProfileError } from '../store/profile/actions';\r\nimport { clearCameraStoreError } from '../store/camera/actions';\r\nimport { clearDatasourceError } from '../store/datasource/actions';\r\nimport { clearEditorError } from '../store/videoboard/actions';\r\n// constants\r\nimport { PROFILE_REFRESH_INTERVAL } from '../utils/AppConstants';\r\n\r\ninterface StateProps {\r\n user: User | undefined;\r\n datasource: DatasourceState;\r\n profile: ProfileState;\r\n camera: CameraState;\r\n editor: EditorState;\r\n}\r\n\r\nlet mapStateToProps = (state: AppState): StateProps => {\r\n return {\r\n user: state.oidc.user,\r\n datasource: state.datasource,\r\n profile: state.profile,\r\n camera: state.camera,\r\n editor: state.editor\r\n };\r\n}\r\n\r\ninterface DispatchProps {\r\n loadUserProfile: typeof loadUserProfile,\r\n updateUserProfile: typeof updateUserProfile,\r\n clearUserProfileError: typeof clearUserProfileError,\r\n clearCameraStoreError: typeof clearCameraStoreError,\r\n clearDatasourceError: typeof clearDatasourceError,\r\n clearEditorError: typeof clearEditorError\r\n}\r\n\r\nlet mapDispatchToProps = (dispatch: Dispatch) => {\r\n return bindActionCreators({\r\n loadUserProfile: loadUserProfile,\r\n updateUserProfile: updateUserProfile,\r\n clearDatasourceError: clearDatasourceError,\r\n clearUserProfileError: clearUserProfileError,\r\n clearCameraStoreError: clearCameraStoreError,\r\n clearEditorError: clearEditorError\r\n }, dispatch);\r\n}\r\n\r\ntype TemplateProps = StateProps & DispatchProps & RouteComponentProps;\r\n\r\ninterface TemplateState {\r\n hasError: boolean;\r\n error: any;\r\n info: any;\r\n}\r\n\r\nclass Template extends React.Component {\r\n profileRefresher: NodeJS.Timeout;\r\n /*\r\n * SERVICE WORKER CLASS PROPERTY\r\n * \r\n * Property is used to track the service worker\r\n * that is in control of the current client.\r\n * \r\n */\r\n serviceWorker: ServiceWorker | null;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.serviceWorker = null;\r\n this.profileRefresher = \r\n setInterval(this.updateProfile, PROFILE_REFRESH_INTERVAL);\r\n\r\n this.state = {\r\n hasError: false,\r\n error: null,\r\n info: null,\r\n } as TemplateState;\r\n }\r\n\r\n componentDidMount() {\r\n this.checkForRedirect();\r\n\r\n this.props.loadUserProfile();\r\n\r\n this.setupServiceWorker();\r\n }\r\n\r\n componentDidUpdate(prevProps: any, prevState: any, snapshot: any) {\r\n this.checkForRedirect();\r\n }\r\n\r\n componentWillUnmount() {\r\n clearInterval(this.profileRefresher);\r\n }\r\n\r\n componentDidCatch(error: any, info: any) {\r\n this.setState({\r\n hasError: true,\r\n error: error,\r\n info: info\r\n });\r\n\r\n // TODO: LOGGING FOR CLIENT SIDE ERRORS\r\n }\r\n\r\n /*\r\n * Service worker reference is set to the serviceWorker class property\r\n * to be used for message sending from the client to the service worker.\r\n */\r\n setupServiceWorker = (): void => {\r\n\r\n let promise = new Promise(resolve => {\r\n if (navigator?.serviceWorker?.controller) {\r\n return resolve(`navigator.serviceWorker.controller found`);\r\n }\r\n\r\n navigator?.serviceWorker?.addEventListener(\r\n 'controllerchange', \r\n e => resolve(`navigator.serviceWorker event: controllerchange`)\r\n );\r\n });\r\n\r\n promise.then(() => {\r\n this.serviceWorker = navigator?.serviceWorker?.controller;\r\n });\r\n }\r\n\r\n checkForRedirect = (): void => {\r\n let doNotCheckForUser: string[] = [\r\n '/callback',\r\n '/silent_renew',\r\n '/session_ended'\r\n ];\r\n\r\n // Redirect to capture active session in new tab/window\r\n if (window.location && !doNotCheckForUser.includes(window.location.pathname)) {\r\n userManager.getUser()\r\n .then(userManagerUser => {\r\n if (!userManagerUser || userManagerUser.expired) {\r\n userManager.signinRedirect({\r\n data: {\r\n path: window.location.pathname\r\n }\r\n });\r\n }\r\n else {\r\n /*\r\n * ACCESS TOKEN MESSAGE SENDING TO SERVICE WORKER\r\n * \r\n * If the service worker is in control of the client\r\n * then post a message to the SW that includes user access token.\r\n * \r\n */ \r\n if (this.serviceWorker) {\r\n this.serviceWorker.postMessage({\r\n accessToken: userManagerUser.access_token\r\n });\r\n }\r\n }\r\n }, reject => {\r\n throw reject;\r\n })\r\n .catch(error => {\r\n throw error;\r\n });\r\n }\r\n }\r\n\r\n dismissCameraError = (): void => {\r\n this.props.clearCameraStoreError();\r\n }\r\n\r\n dismissDatasourceError = (): void => {\r\n this.props.clearDatasourceError();\r\n }\r\n\r\n dismissVideoboardEditorError = (): void => {\r\n this.props.clearEditorError();\r\n }\r\n\r\n dismissProfileError = (): void => {\r\n this.props.clearUserProfileError();\r\n }\r\n\r\n injectErrorModal = (): React.ReactNode => {\r\n let {\r\n camera,\r\n datasource,\r\n profile,\r\n editor\r\n } = this.props;\r\n\r\n if (camera.error) {\r\n console.error(`Camera Error: title: There was a problem fulfilling a camera request`, camera.error);\r\n return null;\r\n }\r\n else if (datasource.error) {\r\n return (\r\n \r\n );\r\n }\r\n else if (editor.error) {\r\n return ( \r\n \r\n );\r\n }\r\n else if (profile.error) {\r\n console.error(`Profile Error: title: There was a problem fulfilling a user profile request.`, profile.error);\r\n return null;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n updateProfile = (): void => {\r\n this.props.updateUserProfile();\r\n }\r\n\r\n render() {\r\n let {\r\n user,\r\n profile,\r\n location\r\n } = this.props;\r\n\r\n // This is yuck but avoids too many flashes of landing pages while state loads\r\n let defaultLanding = (!user || user.expired) \r\n ? Redirect\r\n : (\r\n (profile.initialized)\r\n ? AccessDenied \r\n : Loading\r\n );\r\n\r\n let displayErrorModal = this.injectErrorModal();\r\n\r\n if (this.state.hasError) return \r\n\r\n // used to validate whether a User currently has access to a Route, based on\r\n // their User data and privilege\r\n // return True only if non-expired user exists and has the optionally supplied property\r\n const checkRouteAccess = (privilege: any = null) => {\r\n\r\n // confirm non-expired user\r\n let result = (\r\n this.props.user &&\r\n !this.props.user.expired\r\n );\r\n \r\n // confirm user has this privilege\r\n if (privilege !== null){\r\n result = (result && profile.userProfile.hasPrivilege(privilege))\r\n }\r\n\r\n return result;\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 {displayErrorModal}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default connect(\r\n mapStateToProps, \r\n mapDispatchToProps\r\n)(withRouter(Template));","import * as React from 'react';\r\nimport {ThemeProvider} from \"styled-components\";\r\nimport { Provider } from 'react-redux';\r\nimport { OidcProvider } from 'redux-oidc';\r\nimport { BrowserRouter } from 'react-router-dom';\r\n\r\nimport { ThemeContext } from \"@caps-mobile/algo-theme\";\r\nimport { EThemeOptions, getTheme } from \"@caps-mobile/algo-theme\";\r\n\r\nimport store from './store';\r\nimport userManager from './utils/userManager';\r\nimport Template from './components/Template';\r\n\r\nexport type IProps = {\r\n\r\n};\r\n\r\nexport const App: React.FC = (props) => {\r\n\r\n const [themeMode, setThemeMode] = \r\n React.useState(EThemeOptions.Light);\r\n\r\n const [themeObject, setThemeObject] =\r\n React.useState(getTheme(themeMode));\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n