{"version":3,"sources":["utils/CacheBuster.js","redux/reducers/index.js","redux/reducers/UserReducers.js","resources/img/backoffice_icon.png","components/loadings/CircularLoading.js","redux/actions/UserActions.js","utils/SessionServices.js","utils/APIRequester.js","resources/Language.js","components/notifications/MessageSnackbar.js","components/forms/loginform/LoginForm.js","pages/LoginPage.js","routes/ScrollToTop.js","resources/img/logo_eneida_blue.svg","components/navigation/SideMenu.js","components/navigation/NavBar.js","components/headers/PageHeader.js","components/modals/ConfirmationModal.js","components/inputs/MuiInputText.js","components/modals/EnvironmentModal.js","components/cards/GenericCard.js","pages/DashboardPage.js","pages/EnvironmentPage.js","components/MenuItems/MenuItems.js","components/loadings/PageLoading.js","utils/FirmwareServices.js","utils/BrowserServices.js","pages/UploadFirmwarePage.js","components/stepper/DialogStepper.js","components/panels/SelectVersions.js","components/tables/RawVirtualizedGrid.js","components/panels/UpdateReview.js","components/tables/MuiFiltersSelectAllVirtualizedTable.js","components/tables/MuiVirtualizedTable.js","utils/Enums.js","components/filters/FilterPopover.js","utils/DateServices.js","components/tables/TableHeader.js","components/panels/SelectDevices.js","components/panels/UpdateFirmwarePanel.js","pages/UpdateFirmwarePage.js","components/tables/MuiPaginatedVirtualizedTable.js","components/icons/ExcelIcon.js","components/buttons/RectanguleButton.js","pages/devices/ListDevicePage.js","utils/DeviceServices.js","components/inputs/InputPassword.js","components/buttons/OvalButtons.js","components/buttons/CircularButtons.js","components/dialogs/Dialog.js","components/panels/settings/NTPSettings.js","components/panels/settings/APNSettings.js","components/panels/settings/SelectDeviceSettings.js","components/panels/settings/UpdateNTPSettingsReview.js","components/panels/settings/UpdateAPNSettingsReview.js","components/dialogs/add/DeviceSettingsDialog.js","pages/devices/settings/APNSettingsPage.js","pages/devices/settings/NTPSettingsPage.js","pages/devices/EditDevicePage.js","routes/ProtectedRoutes.js","routes/Routes.js","redux/store/AppProvider.js","components/themes/MuiTheme.js","App.js","index.js"],"names":["semverGreaterThan","versionA","versionB","versionsA","split","versionsB","length","a","Number","shift","b","isNaN","CacheBuster","props","state","loading","isLatestVersion","refreshCacheAndReload","console","log","caches","keys","then","names","name","delete","window","location","reload","fetch","headers","response","json","meta","latestVersion","version","currentVersion","process","setState","this","children","Component","rootReducer","combineReducers","userStatus","action","type","isLoggedIn","userData","user","withStyles","theme","progress","zIndex","position","top","left","classes","CircularProgress","color","size","thickness","className","setLoggedUser","SetUserData","AUTH_TOKEN","IS_AUTH","KEEP_LOGGED","AUTH_USERNAME","REDIRECT_TO","SessionServices","getAuthToken","localStorage","getItem","getKeepLogged","value","getUsername","sessionStorage","isAuth","setAuthContext","authToken","username","keepLogged","setItem","cleanAuthContext","clear","getSessionData","token","decoded","jwt","isExpired","exp","Date","now","error","saveRedirectTo","getRedirectTo","cleanRedirectTo","removeItem","Object","freeze","api","axios","create","baseURL","sendAuthRequest","config","withCredentials","Authorization","sendRequest","handleThen","catch","handleCatch","status","data","undefined","Promise","reject","result","message","store","dispatch","EnvironmentAPI","method","url","envId","FirmwareAPI","deviceTypeName","deviceVersion","microController","deviceId","formData","ResourceLang","device_firmware_table","available_versions_table","add","address","all","Apn_Settings","apply_to","api_key","Auth","available_versions","back","cancel","changes_saved","CHAP","clean","close","confirm","confirmation_required","cuh_label","cnt_label","creation_date","CurrentIP","update_version","dashboard","data_update_apn","data_update_ntp","deepgrid","delete_environment_msg","device","device_settings_update","device_to_be_upgraded","device_to_be_updated","device_updated_with_success","devices","earth_label","edit","email","empty_result","enb_label","eneida_backoffice","environment","export","filters","get_devices","generic_error","htp","keep_me_logged","hardware_version","ICCID","MSP","PIC","MEA","COM","firmware_id","current_version","Alert","elevation","variant","MessageSnackbar","open","autoHideDuration","onClose","handleClose","event","reason","Snackbar","anchorOrigin","vertical","horizontal","severity","LoginForm","onChangeUsername","target","isValid","onChangePassword","password","onClickEnter","charCode","onClicklogin","validateForm","submit","promise","URLSearchParams","append","requestLogin","isLoading","access_token","token_type","login","success","loginFailed","username_password_incorrect","failMessage","requestFailMessage","requestFail","submitForm","preventDefault","onChangeKeepLogged","onEnterPressed","key","renderSnackbar","handleSnackbarClose","test","field","onClick","disabled","readOnly","style","backgroundColor","alt","src","LogoBackOffice","width","getClassNameInput","data-validate","missing_username","onChange","placeholder","onKeyPress","data-placeholder","missing_password","id","checked","htmlFor","renderSubmit","height","connect","setUserinStore","removeUserFromStore","setUserData","withRouter","history","redirectUser","setTimeout","redirectUserTo","redirectTo","replace","substring","ScrollToTop","prevProps","scrollTo","SideMenu","envID","toggleMenu","handleSelectMenuItem","newRoute","push","Drawer","anchor","role","onKeyDown","List","subheader","ListSubheader","component","ListItemText","LogoEneida","Typography","Divider","ListItem","button","e","ListItemIcon","primary","useStyles","makeStyles","root","flexGrow","menuButton","marginRight","spacing","title","logout","clearUserData","match","React","useState","sideMenu","setSideMenu","anchorEl","setAnchorEl","Boolean","envName","context","handleMenu","currentTarget","handleLogout","toggleSideMenu","isOpen","AppBar","Toolbar","IconButton","edge","aria-label","fontSize","aria-controls","aria-haspopup","Menu","keepMounted","getContentAnchorEl","transformOrigin","MenuItem","params","leftIcon","margin","float","toolbar","paddingLeft","paddingRight","display","alignItems","boxSizing","flexDirection","divider","marginTop","marginLeft","flex","PageHeader","icon","styles","warningClass","buttonConfirm","buttonCancel","ConfirmationModal","warning","critialToken","setValid","onTokenInputChange","isTokenValid","handleToggle","closeModal","backdrop","centered","ModalHeader","toggle","ModalBody","Label","Row","marginBottom","Col","xs","textAlign","ConfirmationMessage","fontWeight","Input","invalid","bsSize","ModalFooter","Button","startIcon","confirmAction","MuiInputText","label","required","minLength","maxLength","validate","inputValue","setInputValue","isError","validateRange","TextField","fullWidth","onBlur","inputProps","InputLabelProps","DEFAULT_STATE","errors","EnvironmentModal","env","useEffect","onPropertyChange","prevState","newState","handleSubmit","isCreate","Id","handleError","Error","non_unique_error","Grid","container","item","Name","helperText","Address","ApiKey","cardRoot","GenericCard","element","hasActions","handleClick","Card","CardActionArea","CardContent","CardActions","Tooltip","handleEdit","handleDelete","renderActions","padding","contentRoot","grid","environments","selectedItem","envModalOpen","deleteModalOpen","snakcbarOpen","snakcbarMsg","snakcbarVariant","handleAddEnvironment","renderEmptyContent","renderEnvironmentCard","handleEnvironmentClick","handleEnvironmentDelete","handleEnvironmentEdit","gutterBottom","handleModalClose","handleModalChange","handleDeleteConfirm","handleCloseDeleteModal","Fab","map","curEnv","sm","lg","renderContent","handleUploadFirmwareClick","handleUpdateFirmwareClick","handleListDeviceClick","renderHeader","upload_firmware","update_firmware","list_device","justifyContent","paddingTop","overflow","paddingBottom","colors","yellow","letterSpacing","DeviceMenuItems","menuItems","ItemSelected","renderTree","nodes","TreeItem","nodeId","handleSelection","toString","Array","isArray","node","TreeView","defaultCollapseIcon","defaultExpandIcon","obj","index","Modal","modalRoot","document","createElement","div","useLayoutEffect","body","appendChild","removeChild","createPortal","PageLoading","data-testid","translateObjectToMenu","jsonObjectResponse","deviceOptionIdentifier","forEach","subMenuItem","device_type_name","hw_versions","micro_controllers","MicroControllers","micro","findElementById","elementFound","deviceType","body_info","body_dropzone","treeView","content","chip","DropZoneAreakey","setDropZoneAreaKey","fileToUpload","setFile","MenuItems","setMenuItems","snackbar","setSnackbar","micro_controller","setMicro","setDevice","device_version","setVersion","handleChange","uploadToServer","FormData","Blob","upload_success_message","upload_error_file_size_message","upload_error_no_file","deviceSelected","paragraph","micro_controller_info","Chip","filesLimit","dropzoneText","upload_dropzone_area_firmware_message","showFileNames","maxFileSize","bind","upload","instructions","DialogStepper","activeStep","steps","stepProps","labelProps","other","Stepper","Step","StepLabel","formControl","minWidth","body_content","SelectVersions","availableVersions","versionSelected","versionChoosen","setVersionChoosen","setOpen","update_version_choose","FormControl","InputLabel","Select","labelId","onOpen","current_firmware_version","x","y","compareValues","localeCompare","handleBodyResize","navbar","getElementById","navbarHeight","clientHeight","innerHeight","gridColumn","headerContainer","palette","main","borderRadius","headerGrid","border","bodyGrid","headerCell","bodyCell","borderBottom","borderLeft","truncateText","whiteSpace","textOverflow","evenRow","oddRow","flexContainer","rowCount","columns","columnWidth","rowHeight","overscanRowCount","rowGetter","headerCellRenderer","columnIndex","rowIndex","column","dataKey","TableCell","join","bodyCellRenderer","rowData","cellData","render","toLocaleDateString","toLocaleTimeString","Math","round","JSON","stringify","renderGrid","clientWidth","onScroll","scrollLeft","scrollHeight","scrollTop","scrollWidth","scrollBarSize","recalc","scrollDiv","offsetWidth","scrollbarSize","headerRowHeight","columnCount","cellRenderer","scrollProps","UploadReview","next_version","DeviceKeysEnum","renderDeviceItems","filter","MENU_TYPE","collectTriggerProps","ConnectedMenu","connectMenu","contextMenuOptions","trigger","Paper","MenuList","hideMenu","MuiFiltersSelectAllVirtualizedTable","firstCell","date","numeric","decimalPlaces","toFixed","link","stopPropagation","to","clsx","tableCell","align","getColumnAlign","headerRenderer","sortBy","sortDirection","selectAll","allSelected","headerHeight","Checkbox","getHeaderRowClassName","disableSort","rowRendererDetailed","detailRowHeight","detailRowRenderer","selectedIndex","defaultTableRowRenderer","TableRow","getAttribute","parentNode","previousElementSibling","click","renderDetailButton","isSelected","expandIcon","HideDetails","ShowDetails","_handleExpandClick","getRowClassName","tableRow","tableRowHover","noClick","getRowHeight","tableRef","createRef","_isRowLoaded","_loadMoreRows","args","onLoadMore","newIndex","recomputeRowHeights","disableHeader","tableProps","footerHeight","rowContentRenderer","rowRenderer","holdToDisplay","collect","isRowLoaded","loadMoreRows","totalRows","onRowsRendered","registerChild","ref","gridStyle","direction","table","rowClassName","cellWidth","headerProps","tableFooter","footerlabel","items","PureComponent","defaultProps","flip","cursor","grey","MuiVirtualizedTable","DEVICE_KEYS_ENUM","CURRENT_VERSION","UPDATE_VERSION","UPDATE_REQUEST_DATE_VERSION","DEVICE_ID","SERIAL_NUMBER","FIRMWARE_DOWNLOAD_ATEMPTS","FIRMWARE_ID","DEVICE_VERSION_VALUES_ENUM","V1","V2","V3","V4","SETTINGS_TYPE_ENUM","APN","NTP","maxWidth","option","updateAnchorEl","renderFilter","renderSelectFilter","renderTextFilter","renderDateFilter","options","multiple","Autocomplete","getOptionLabel","getOptionSelected","find","newValue","handleValueChange","renderInput","freeSolo","onInputChange","maxValueKey","minValueKey","is12Hour","maxDate","minDate","utils","MomentUtils","noValidate","DateTimePicker","ampm","showTodayButton","toDate","labelFunc","getDateTimeStringFormat","strictCompareDates","InputProps","endAdornment","InputAdornment","newFilters","Popover","loadingSpinner","optionsToGet","getOptions","promisses","responses","i","LinearProgress","xsSize","mdSize","Filters","md","header","leftCell","rightCell","tableTitle","setFilters","showFilters","selectedDevices","filteredAvailableVersions","handleAllSelections","currentVersions","updateVersions","handleFilters","pageHeight","versionsSort","setVersionsSort","devicesSort","setDevicesSort","setAllSelected","some","device_id","getTableItems","sort","SortDirection","ASC","handleSelectDevice","serial_number","tableItems","onRowClick","renderDevicesTable","handleAvailableVersions","renderVersionsTable","closePanel","fullDevices","disableNext","disableBack","devicesIsLoading","updateRequestVersion","filterCurrentVersion","filterUpdateVersion","version_choose","review_and_confirmation","closeWithError","useCallback","prepareFirmwareVersions","rawVersions","versions","curVersion","getLocalDateTimeString","filename","versionName","substr","indexOf","toUpperCase","parseInt","ex","invalid_fw_version","fwFilenameToVersion","no_versions","prepareDevices","rawDevices","curDevice","curFirmware","device_firmware","curMicrocontroller","update_firmware_version","update_request_date","firmware_download_atempts","no_devices","getCurrentVersions","f","findIndex","getUpdateVersions","getAllData","load","handleNext","updateDeviceFirmware","update_with_success","handleBack","setUploadRequestVersion","requestVersion","checkAvailableVersionsForDevice","canClickNextButton","actualVersions","maxVersion","reduce","getHigherFirmwareVersionsToUpdate","isChecked","setDeviceSelected","renderBody","UpdateReview","minHeight","right","firmware_panel","isDisableUpdateFirmwarePanel","setDisableUpdateFirmwarePanel","closeUpdateFirmware","successFromPanel","messageFromPanel","renderUpdateFirmwareButton","MuiPaginatedVirtualizedTable","pagination","onGoToPage","pageError","labelPage","caption","input","TablePagination","fontFamily","ExcelIcon","SvgIcon","d","blueButton","ButtonBlue","paper","headerTitle","tableContainer","selected","deviceItems","setPageError","pageSize","setPageSize","setTotalRows","currentPage","setCurrentPage","useDebounce","debouncedCurrentPage","firmwareIds","setFirmwareIds","setCurrentVersions","selectedFirmware","setSelectedFirmware","selectedVersion","setSelectedVersion","selectedSerial","setSelectedSerial","debouncedselectedSerial","setIsLoading","setSort","allEqual","string","character","every","char","stringArraySort","array","setFirmwareData","deviceItem","firmware","formattedMSP","formattedPIC","formattedMEA","formattedCOM","formatVersion","setFamilyVersion","typeDescription","device_type_description","family_version","not_applicable","isPoleMountedOrDtvi4G","translatePoleMountVersion","translateDTVIVersion","translateVersion","interface_gprs","iccid","current_ip","orderBy","firmware_versions","total_devices","firmware_ids","ids","object","uniqueAdd","setFirmwareOptionIds","finally","addEventListener","removeEventListener","addFilter","setCurrentVersionOptions","removeFilter","serialNumber","firmwareId","firmwareVersion","toSkip","renderExportButton","URL","createObjectURL","href","download","exportCSVFile","renderFilterButton","filterValues","j","getFilterValuesArray","results","hasFilters","TOP_OFFSET","overflowX","overflowY","onDelete","targetKey","renderFilters","last_communication","onChangePage","page","onRowsPerPageChange","count","rowsPerPage","onChangeRowsPerPage","rowsPerPageOptions","getPagination","iconsMap","totalPages","ceil","includes","renderTable","passwordToogle","InputPassword","feedbackText","others","visible","setVisiblity","visiblity","usePasswordToggle","PasswordInputType","ToggleIcon","InputGroup","InputGroupAddon","addonType","InputGroupText","FormFeedback","extendedIcon","submitButton","cancelButton","OvalButtonPrimary","CircularButtonTransparent","DialogTitle","closeButton","closeLabel","disableTypography","DialogContent","MuiDialogContent","DialogActions","MuiDialogActions","Dialog","disableBackdropClick","disableEscapeKeyDown","titleRenderer","actionsRenderer","dividers","NTPSettings","settings","DEVICE_SETTINGS_KEYS","translatedSettings","cloneDeep","settingsToUpdate","timeserver_type","ntp","timeserver_url","timeserver_port","timeserver_protocol","renderSettingsTable","APNSettings","translateSettingsToTableRender","apn_auth_type","PAP","PAP_OR_CHAP","translateApnAuthType","apn_pwd","password_chars","translatePwd","User","settingsType","selectAllDevices","clearAllSelectedDevices","serialNumberFilter","setSerialNumberFilter","alignSelf","justify","maxHeight","UpdateNTPSettings","dataToBeUpdated","NTP_SETTINGS_INDEX","renderNTPSettings","UpdateAPNSettings","APN_SETTINGS_INDEX","renderApnSettings","DeviceSettingsDialog","deviceItemId","description","selectedSds","select_devices","prepareItemsToUpdateOnServer","dataToUpdate","deviceIds","update_devices_with_success","updateAPNSettingsIntoServer","updateNTPSettingsIntoServer","UpdateAPNSettingsReview","UpdateNTPSettingsReview","ntp_settings","unknowm","label_title","interfaceGPRS","ovalButtonsStyle","ovalByttonsStyleBase","editMode","setEditMode","openApplyToDialog","setApplyToDialog","setData","handleEditClick","renderAuthInput","AUTH_OPTIONS","NONE","renderPasswordField","Password_Chars","enableDialogApplyTo","faSignal","placement","FormGroup","apn_name","apn_user","UpdateData","renderDialogApplyTo","interfaceNTP","renderTimeServerType","TIMESERVER_OPTIONS","getInterfaceGprs","interfaceItem","getInterfaceNTP","interface_ntp","renderPageHeader","ownProps","path","exact","DashboardPage","EnvironmentPage","UploadFirmwarePage","UpdateFirmwarePage","DevicePage","EditDevicePage","pathname","toLowerCase","createBrowserHistory","Routes","persistConfig","storage","persistedReducer","persistReducer","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","createStore","applyMiddleware","thunk","AppProvider","handleInteraction","lastInteraction","getTime","rehydrated","persistStore","locale","MuiTheme","createMuiTheme","secondary","App","ThemeProvider","ReactDOM"],"mappings":"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","file":"static/js/main.2f023481.chunk.js","sourcesContent":["import {Component} from 'react';\r\n\r\nconst semverGreaterThan = (versionA, versionB) => {\r\n const versionsA = versionA.split(/\\./g);\r\n \r\n const versionsB = versionB.split(/\\./g);\r\n while (versionsA.length || versionsB.length) {\r\n const a = Number(versionsA.shift());\r\n \r\n const b = Number(versionsB.shift());\r\n // eslint-disable-next-line no-continue\r\n if (a === b) continue;\r\n // eslint-disable-next-line no-restricted-globals\r\n return a > b || isNaN(b);\r\n }\r\n return false;\r\n };\r\n\r\n\r\nclass CacheBuster extends Component{\r\n constructor(props){\r\n super(props);\r\n this.state = {\r\n loading: true,\r\n isLatestVersion: false,\r\n refreshCacheAndReload: () => {\r\n console.log('Clearing cache and hard reloading...')\r\n if (caches) {\r\n // Service worker cache should be cleared with caches.delete()\r\n caches.keys().then(function(names) {\r\n for (let name of names) caches.delete(name);\r\n });\r\n }\r\n // delete browser cache and hard reload\r\n window.location.reload();\r\n }\r\n };\r\n }\r\n\r\n async componentDidMount() {\r\n fetch('/meta.json', {\r\n headers : { \r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json'\r\n }\r\n })\r\n .then((response) => response.json())\r\n .then((meta) => {\r\n const latestVersion = meta.version;\r\n const currentVersion =process.env.REACT_APP_VERSION;\r\n console.log(latestVersion);\r\n console.log(currentVersion);\r\n const shouldForceRefresh = semverGreaterThan(latestVersion, currentVersion);\r\n if (shouldForceRefresh) {\r\n console.log(`We have a new version - ${latestVersion}. Should force refresh`);\r\n this.setState({ loading: false, isLatestVersion: false });\r\n } else {\r\n console.log(`You already have the latest version - ${latestVersion}. No cache refresh needed.`);\r\n this.setState({ loading: false, isLatestVersion: true });\r\n }\r\n }); \r\n }\r\n \r\n render() {\r\n const { loading, isLatestVersion, refreshCacheAndReload } = this.state;\r\n return this.props.children({ loading, isLatestVersion, refreshCacheAndReload });\r\n }\r\n}\r\n\r\nexport default CacheBuster;","import { combineReducers } from 'redux';\r\nimport { userStatus, userData} from './UserReducers';\r\n\r\nvar rootReducer = combineReducers({\r\n userStatus,\r\n userData,\r\n});\r\n\r\nexport default rootReducer;","export function userStatus(state = false, action) {\r\n\r\n switch (action.type) {\r\n case 'CHANGE_USER_STATUS':\r\n return action.isLoggedIn;\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\n\r\nexport function userData(state = [], action) {\r\n\r\n switch (action.type) {\r\n case 'USER_DATA':\r\n return action.user;\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\n","export default __webpack_public_path__ + \"static/media/backoffice_icon.4f865980.png\";","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { CircularProgress } from '@material-ui/core';\r\n\r\n\r\nconst styles = theme => ({\r\n progress: {\r\n zIndex:\"50\",\r\n position:'absolute',\r\n top: \"50%\",\r\n left: \"50%\",\r\n },\r\n});\r\n\r\n\r\nconst CircularLoading = ({classes}) => {\r\n return \r\n}\r\n\r\n\r\nCircularLoading.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(CircularLoading);","export function setLoggedUser(isLoggedIn) {\r\n return {\r\n type: 'CHANGE_USER_STATUS',\r\n isLoggedIn\r\n };\r\n}\r\n\r\nexport function SetUserData(user){\r\n return {\r\n type: 'USER_DATA',\r\n user\r\n };\r\n}","import jwt from 'jwt-decode';\r\n\r\nconst AUTH_TOKEN = \"authorizationToken\";\r\nconst IS_AUTH = \"isAuth\";\r\nconst KEEP_LOGGED = \"keepLogged\";\r\nconst AUTH_USERNAME = \"authorizationUsername\";\r\nconst REDIRECT_TO = \"redirectTo\";\r\n\r\nconst SessionServices = {\r\n getAuthToken: () => {\r\n return localStorage.getItem(AUTH_TOKEN);\r\n },\r\n getKeepLogged: () => {\r\n const value = localStorage.getItem(KEEP_LOGGED);\r\n return (value ? (value === 'true' || value === true) : false);\r\n },\r\n getUsername: () => {\r\n return sessionStorage.getItem(AUTH_USERNAME);\r\n },\r\n isAuth: () => {\r\n const value = sessionStorage.getItem(IS_AUTH);\r\n return (value ? (value === 'true' || value === true) : false);\r\n },\r\n\r\n setAuthContext: (authToken, username, keepLogged = false) => {\r\n localStorage.setItem(AUTH_TOKEN, authToken);\r\n localStorage.setItem(KEEP_LOGGED, keepLogged);\r\n sessionStorage.setItem(AUTH_USERNAME, username);\r\n sessionStorage.setItem(IS_AUTH, true);\r\n },\r\n cleanAuthContext: () => {\r\n localStorage.clear();\r\n sessionStorage.clear();\r\n },\r\n\r\n getSessionData(){\r\n const token = this.getAuthToken();\r\n\r\n if(token) {\r\n try {\r\n const decoded = jwt(token);\r\n if (decoded) {\r\n decoded.isExpired = () => (this.exp < Date.now() / 1000);\r\n }\r\n\r\n return decoded;\r\n }\r\n catch(error){ console.log(error); }\r\n }\r\n\r\n return undefined;\r\n },\r\n\r\n saveRedirectTo: (value) => {\r\n sessionStorage.setItem(REDIRECT_TO, value);\r\n },\r\n getRedirectTo: () => {\r\n return sessionStorage.getItem(REDIRECT_TO) || '';\r\n },\r\n cleanRedirectTo: () => {\r\n sessionStorage.removeItem(REDIRECT_TO);\r\n }\r\n}\r\n\r\nexport default Object.freeze(SessionServices);","import axios from 'axios'\r\nimport { setLoggedUser, SetUserData } from '../redux/actions/UserActions'\r\nimport { store } from '../redux/store/AppProvider'\r\nimport SessionServices from './SessionServices'\r\n\r\nconst api = axios.create({\r\n baseURL: process.env.REACT_APP_API_URL,\r\n})\r\n\r\nconst sendAuthRequest = (config) => {\r\n config.withCredentials = true\r\n config.headers = {\r\n 'Content-type': 'application/json',\r\n Authorization: 'Bearer ' + SessionServices.getAuthToken(),\r\n }\r\n\r\n return sendRequest(config)\r\n}\r\n\r\nconst sendRequest = (config) => {\r\n return api(config)\r\n .then((response) => handleThen(response))\r\n .catch((error) => handleCatch(error))\r\n}\r\n\r\nconst handleThen = (response) => {\r\n const success = response.status >= 200 && response.status <= 299\r\n return success ? response.data : undefined\r\n}\r\n\r\nconst handleCatch = (error) => {\r\n console.error(error)\r\n if (!error.response) return Promise.reject(error)\r\n\r\n const response = error.response\r\n const result = { status: response.status, message: '' }\r\n\r\n if (response.status === 503) {\r\n result.message = 'SERVICE UNAVAILABLE'\r\n } else if (response.status === 403) {\r\n result.message = 'PERMISSION DENIED'\r\n } else if (response.status === 401) {\r\n result.message = 'USER NOT AUTHENTICATED'\r\n store.dispatch(setLoggedUser(false))\r\n store.dispatch(SetUserData({}))\r\n } else {\r\n result.message = 'UNEXPECTED ERROR'\r\n result.data = response.data\r\n }\r\n\r\n console.error(result.message)\r\n return Promise.reject(result)\r\n}\r\n\r\nexport const requestLogin = (username, password) => {\r\n const data = new URLSearchParams()\r\n data.append('username', username)\r\n data.append('password', password)\r\n data.append('grant_type', 'password')\r\n data.append('client_id', 'backoffice.webapp')\r\n\r\n return sendRequest({\r\n method: 'POST',\r\n url: '/api/account/login/token',\r\n data: data,\r\n headers: { 'Content-type': 'application/x-www-form-urlencoded' },\r\n })\r\n}\r\n\r\nexport const requestLogout = () => {\r\n return sendAuthRequest({ method: 'POST', url: '/api/account/logout' })\r\n}\r\n\r\nexport const EnvironmentAPI = {\r\n getAll: () => {\r\n return sendAuthRequest({ method: 'GET', url: 'api/v1/environment/all' })\r\n },\r\n\r\n getOne: (envId) => {\r\n return sendAuthRequest({\r\n method: 'GET',\r\n url: `api/v1/environment/${envId}`,\r\n })\r\n },\r\n\r\n create: (data) => {\r\n return sendAuthRequest({\r\n method: 'POST',\r\n url: 'api/v1/environment',\r\n data: data,\r\n })\r\n },\r\n\r\n update: (envId, data) => {\r\n return sendAuthRequest({\r\n method: 'PUT',\r\n url: `api/v1/environment/${envId}`,\r\n data: data,\r\n })\r\n },\r\n\r\n delete: (envId) => {\r\n return sendAuthRequest({\r\n method: 'DELETE',\r\n url: `api/v1/environment/${envId}`,\r\n })\r\n },\r\n}\r\n\r\nexport const FirmwareAPI = {\r\n getStructure: (envId) => {\r\n return sendAuthRequest({\r\n method: 'GET',\r\n url: `api/v1/firmware/structure/${envId}`,\r\n })\r\n },\r\n getAllVersions: (envId, deviceTypeName, deviceVersion, microController) => {\r\n return sendAuthRequest({\r\n method: 'GET',\r\n url: `api/v1/firmware/files/${envId}/${deviceTypeName}/${deviceVersion}/${microController}`,\r\n })\r\n },\r\n getGPRSSettingsByDevice: (envId, deviceId) => {\r\n return sendAuthRequest({\r\n method: 'GET',\r\n url: `api/v1/firmware/devices/${envId}/gprs/${deviceId}`,\r\n })\r\n },\r\n getDevicesByFamily: (\r\n envId,\r\n deviceTypeName,\r\n deviceVersion,\r\n microController\r\n ) => {\r\n return sendAuthRequest({\r\n method: 'GET',\r\n url: `api/v1/firmware/devices/${envId}/${deviceTypeName}/${deviceVersion}/${microController}`,\r\n })\r\n },\r\n getDevicesFamilyByDeviceId: (envId, deviceId) => {\r\n return sendAuthRequest({\r\n method: 'GET',\r\n url: `api/v1/firmware/devices/${envId}/${deviceId}/family`,\r\n })\r\n },\r\n uploadFileToServer: (\r\n envId,\r\n deviceTypeName,\r\n deviceVersion,\r\n microController,\r\n formData\r\n ) => {\r\n return sendAuthRequest({\r\n method: 'POST',\r\n url: `api/v1/firmware/upload/${envId}/${deviceTypeName}/${deviceVersion}/${microController}`,\r\n data: formData,\r\n })\r\n },\r\n getAllDevices: (envId, data) => {\r\n return sendAuthRequest({\r\n method: 'POST',\r\n url: `api/v1/firmware/devices/${envId}`,\r\n data: data,\r\n })\r\n },\r\n getCSVExportFile: (formData) => {\r\n return sendAuthRequest({\r\n method: 'POST',\r\n url: `api/v1/firmware/devices/export`,\r\n data: formData,\r\n })\r\n },\r\n putGPRSSettingsByDevice: (envId, deviceId, formData) => {\r\n return sendAuthRequest({\r\n method: 'PUT',\r\n url: `api/v1/firmware/devices/${envId}/gprs/${deviceId}`,\r\n data: formData,\r\n })\r\n },\r\n putNTPSettingsByDevice: (envId, deviceId, formData) => {\r\n return sendAuthRequest({\r\n method: 'PUT',\r\n url: `api/v1/firmware/devices/${envId}/ntp/${deviceId}`,\r\n data: formData,\r\n })\r\n },\r\n putGPRSSettingsInBatchByDevice: (envId, formData) => {\r\n return sendAuthRequest({\r\n method: 'PUT',\r\n url: `api/v1/firmware/devices/${envId}/gprs/batch`,\r\n data: formData,\r\n })\r\n },\r\n putNTPSettingsInBatchByDevice: (envId, formData) => {\r\n return sendAuthRequest({\r\n method: 'PUT',\r\n url: `api/v1/firmware/devices/${envId}/ntp/batch`,\r\n data: formData,\r\n })\r\n },\r\n updateDeviceFirmware: (envId, formData) => {\r\n return sendAuthRequest({\r\n method: 'PUT',\r\n url: `api/v1/firmware/devices/${envId}`,\r\n data: formData,\r\n })\r\n },\r\n}\r\n","export const ResourceLang = {\r\n device_firmware_table: 'Devices found',\r\n available_versions_table: 'Available versions and creation date',\r\n add: 'Add',\r\n address: 'Address',\r\n all: 'ALL',\r\n Apn_Settings: 'APN Settings',\r\n apply_to: 'Apply To...',\r\n api_key: 'Api-Key',\r\n Auth: 'Auth',\r\n available_versions: 'Available Versions',\r\n back: 'back',\r\n cancel: 'Cancel',\r\n changes_saved: 'Changes saved.',\r\n CHAP: 'CHAP',\r\n clean: 'Clean',\r\n close: 'Close',\r\n confirm: 'Confirm',\r\n confirmation_required: 'Confirmation Required',\r\n cuh_label: 'Current Harmonics',\r\n cnt_label: 'Connection Test',\r\n creation_date: 'Creation Date',\r\n CurrentIP: 'Current IP',\r\n update_version: 'Update Version',\r\n dashboard: 'Dashboard',\r\n data_update_apn: 'Update APN Settings',\r\n data_update_ntp: 'Update NTP Settings',\r\n deepgrid: 'DEEPGRID',\r\n delete: 'Delete',\r\n delete_environment_msg: 'Delete this environment?',\r\n device: 'Device',\r\n device_settings_update: 'Device Settings Update',\r\n device_to_be_upgraded: 'Devices to be upgraded',\r\n device_to_be_updated: 'Devices to be updated',\r\n device_updated_with_success: 'Device updated with success.',\r\n devices: 'Devices',\r\n earth_label: 'Earthing',\r\n edit: 'Edit',\r\n email: 'Email',\r\n empty_result: 'There are no items.',\r\n enb_label: 'Energy Balance',\r\n eneida_backoffice: 'eneida BackOffice',\r\n environment: 'Environment',\r\n export: 'EXPORT',\r\n filters: 'Filters',\r\n get_devices: 'Get Devices',\r\n generic_error:\r\n 'Something went wrong. Please try again, if persists contact the administrator.',\r\n htp: 'HTP',\r\n keep_me_logged: 'Remember Me',\r\n hardware_version: 'Hardware Version',\r\n ICCID: 'ICCID',\r\n MSP: 'MSP',\r\n PIC: 'PIC',\r\n MEA: 'MEA',\r\n COM: 'COM',\r\n firmware_id: 'Firmware Id',\r\n current_version: 'Current Version',\r\n update_version: 'Update Version',\r\n items: 'Items',\r\n last_communication: 'Last Communication',\r\n list_device: 'List Device',\r\n loading: 'Loading...',\r\n logout: 'Logout',\r\n login: 'Login',\r\n micro_controller: 'Micro Controller:',\r\n micro_controller_info: 'Please select in your left menu a micro controller',\r\n missing_password: 'Enter password',\r\n missing_username: 'Enter email',\r\n name: 'Name',\r\n next_version: 'Next Version to Update: ',\r\n ntp: 'NTP',\r\n NONE: 'None',\r\n no_versions: 'No available versions were found.',\r\n no_devices: 'No available devices were found.',\r\n not_applicable: 'N/A',\r\n npq_label: 'Network Power Quality',\r\n ntp_settings: 'NTP Settings',\r\n normal: 'Normal',\r\n non_unique_error: \"It's already in use\",\r\n PAP: 'PAP',\r\n PAP_OR_CHAP: 'PAP or CHAP',\r\n password: 'Password',\r\n review_and_confirmation: 'Review and confirmation',\r\n select_devices: 'Select Devices',\r\n serial_number: 'Serial Number',\r\n submit: 'Submit',\r\n timeserver_type: 'Timeserver type',\r\n timeserver_type_deepgrid: 'Deepgrid',\r\n timeserver_type_htp: 'HTP',\r\n timeserver_type_ntp: 'NTP',\r\n timeserver_protocol: 'Timeserver protocol',\r\n timeserver_url: 'Timeserver url',\r\n timeserver_port: 'Timeserver port',\r\n total_devices: 'Total Devices',\r\n type: 'Type',\r\n unknowm: 'Unknowm',\r\n update_firmware: 'Update Firmware',\r\n update_version_choose: 'Choose your upgrade version: ',\r\n update_request_date: 'Update Request Date',\r\n upload: 'Upload',\r\n update_devices_with_success: 'Devices updated with success!',\r\n upload_dropzone_area_firmware_message:\r\n 'Drag and drop your Firmware file here or click',\r\n upload_firmware: 'Upload Firmware',\r\n upload_error_file_size_message:\r\n 'The file can not be empty or have more than 4 MB.',\r\n upload_error_no_file: 'You have to select one file.',\r\n upload_success_message: 'The file was successfully uploaded.',\r\n update_with_success: 'Device updated with success!',\r\n User: 'User',\r\n username_password_incorrect: 'The email or password is incorrect.',\r\n version: 'Version',\r\n version_choose: 'Version Choose',\r\n waitting_for_devices:\r\n 'Please wait until the operation be completed. Waitting for devices.',\r\n invalid_fw_version: 'Invalid version',\r\n}\r\n\r\nexport default ResourceLang\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Snackbar } from '@material-ui/core';\r\nimport MuiAlert from '@material-ui/lab/Alert';\r\n\r\n\r\nconst Alert = (props) => {\r\n return ;\r\n}\r\n\r\n\r\nconst MessageSnackbar = ({\r\n open = false, message = '', variant = 'error', autoHideDuration, onClose\r\n}) => {\r\n const handleClose = (event, reason) => {\r\n if (reason === 'clickaway') {\r\n return;\r\n }\r\n \r\n onClose();\r\n };\r\n\r\n return (\r\n \r\n {message}\r\n \r\n );\r\n}\r\n\r\n\r\nMessageSnackbar.propTypes = {\r\n open: PropTypes.bool,\r\n message: PropTypes.string.isRequired,\r\n variant: PropTypes.oneOf(['success', 'warning', 'error', 'info']).isRequired,\r\n autoHideDuration: PropTypes.number,\r\n onClose: PropTypes.func\r\n};\r\n\r\nexport default MessageSnackbar;","import React, { Component } from 'react';\r\n//import backgroundImg from '../../../styles/img/deepgrid_one.jpg';\r\nimport './css/main.css';\r\nimport './css/util.css';\r\nimport LogoBackOffice from '../../../resources/img/backoffice_icon.png';\r\nimport 'material-design-iconic-font/dist/css/material-design-iconic-font.css';\r\nimport CircularLoading from '../../../components/loadings/CircularLoading';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { requestLogin } from '../../../utils/APIRequester';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport MessageSnackbar from '../../../components/notifications/MessageSnackbar';\r\n\r\n\r\nconst styles = theme => ({\r\n progress: {\r\n zIndex:\"50\",\r\n position:'relative' ,\r\n color:'#F1c419',\r\n width: '50px',\r\n height: '50px',\r\n },\r\n});\r\n\r\n\r\nclass LoginForm extends Component{ \r\n constructor(props){\r\n super(props);\r\n this.state = {\r\n username: {\r\n value: '',\r\n isValid:true,\r\n },\r\n password: {\r\n value: '',\r\n isValid: true,\r\n },\r\n requestFail: false,\r\n isLoading: false,\r\n keepLogged: false,\r\n requestFailMessage: ''\r\n }\r\n }\r\n\r\n onChangeUsername = (event) => {\r\n let username = {\r\n value: event.target.value,\r\n isValid:true,\r\n }\r\n\r\n this.setState({\r\n username: username,\r\n })\r\n }\r\n\r\n onChangePassword = (event) => {\r\n let password = {\r\n value: event.target.value,\r\n isValid: true\r\n }\r\n this.setState({\r\n password: password,\r\n })\r\n }\r\n\r\n onClickEnter = (event) =>{\r\n if(event.charCode === 13){\r\n this.onClicklogin(event);\r\n } \r\n }\r\n\r\n\r\n validateForm = (event) =>{\r\n if(this.state.username.value !== '' && this.state.password.value !== '')\r\n this.submit();\r\n else{\r\n \r\n let username = this.state.username;\r\n let password = this.state.password;\r\n\r\n if(username.value === ''){\r\n username.isValid = false;\r\n }\r\n\r\n if(password.value === ''){\r\n password.isValid = false;\r\n }\r\n\r\n this.setState({\r\n username: username,\r\n password: password,\r\n });\r\n }\r\n }\r\n\r\n \r\n validateEmail(){\r\n return /^(([^<>()\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@(([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(this.state.username.value);\r\n }\r\n\r\n\r\n submit = () =>{\r\n const username = this.state.username.value;\r\n const password = this.state.password.value;\r\n \r\n let promise = requestLogin(username, password);\r\n \r\n this.setState({\r\n isLoading: true,\r\n });\r\n\r\n promise.then(response =>{\r\n if(response !== undefined) { \r\n let user = {\r\n name: username,\r\n token: response.access_token,\r\n token_type: response.token_type\r\n };\r\n \r\n const result = this.props.login(true, user, this.state.keepLogged);\r\n \r\n if (result && result.success) {\r\n this.setState({ isLoading:false });\r\n }\r\n else {\r\n this.loginFailed(\r\n result.error || ResourceLang.username_password_incorrect\r\n );\r\n }\r\n }\r\n else {\r\n this.loginFailed(ResourceLang.username_password_incorrect);\r\n }\r\n })\r\n .catch((error) => {\r\n this.loginFailed(error.message || ResourceLang.username_password_incorrect);\r\n });\r\n }\r\n\r\n loginFailed = (failMessage) => {\r\n this.setState({\r\n isLoading:false,\r\n requestFailMessage: failMessage,\r\n requestFail: true,\r\n });\r\n }\r\n\r\n submitForm = (event) =>{\r\n event.preventDefault();\r\n }\r\n\r\n getClassNameInput(field){\r\n if(field.isValid) {\r\n return \"wrap-input100 validate-input\";\r\n }\r\n else{\r\n return \"wrap-input100 validate-input alert-validate\";\r\n }\r\n }\r\n\r\n\r\n renderSubmit(){\r\n if(this.state.isLoading){\r\n return();\r\n }\r\n else{\r\n return(\r\n \r\n );\r\n }\r\n }\r\n\r\n onChangeKeepLogged = () =>{\r\n this.setState({ keepLogged: !this.state.keepLogged });\r\n }\r\n\r\n onEnterPressed = (event) =>{\r\n if(event.key === 'Enter'){\r\n this.validateForm();\r\n }\r\n }\r\n\r\n\r\n renderSnackbar = () => {\r\n return ();\r\n }\r\n\r\n handleSnackbarClose = () => {\r\n this.setState({ requestFail: false });\r\n }\r\n\r\n\r\n render(){\r\n \r\n let disabled = (this.state.isLoading) ? 'disabled' : '';\r\n let readOnly = (this.state.isLoading) ? 'readOnly' : '';\r\n\r\n return (\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n \"eneida\"\r\n \r\n\r\n \r\n {ResourceLang.eneida_backoffice}\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {this.renderSubmit()}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {this.renderSnackbar()}\r\n
\r\n );\r\n }\r\n}\r\nexport default (withStyles(styles)(LoginForm));\r\n","import React from 'react';\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router\";\r\nimport LoginForm from '../components/forms/loginform/LoginForm';\r\nimport SessionServices from '../utils/SessionServices';\r\nimport { connect } from 'react-redux';\r\nimport { setLoggedUser, SetUserData} from '../redux/actions/UserActions';\r\n\r\nconst LoginPage = ({setUserData, setUserinStore, history}) => {\r\n const login = (result, user, keepLogged) => { \r\n if(result === true){\r\n SessionServices.setAuthContext(user.token, user.name, keepLogged);\r\n setUserinStore();\r\n setUserData(user);\r\n\r\n redirectUser();\r\n }\r\n\r\n return { success: result };\r\n }\r\n \r\n const redirectUser = () => {\r\n //because firefox save the variable in local storage to fast... \r\n setTimeout(() => redirectUserTo(), 100);\r\n }\r\n\r\n const redirectUserTo = () => {\r\n const redirectTo = SessionServices.getRedirectTo();\r\n SessionServices.cleanRedirectTo();\r\n\r\n if (!redirectTo) {\r\n history.replace(\"/dashboard\")\r\n\r\n }\r\n else {\r\n history.replace(redirectTo.substring(1))\r\n } \r\n }\r\n\r\n const renderLogin = () => {\r\n return( login(result,value)}/>)\r\n }\r\n\r\n return(\r\n renderLogin()\r\n );\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n\treturn {\r\n userStatus: state.userStatus,\r\n };\r\n};\r\n\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n\treturn {\r\n setUserinStore: () => dispatch(setLoggedUser(true)),\r\n removeUserFromStore: () => dispatch(setLoggedUser(false)),\r\n\t\tsetUserData:(user) => dispatch(SetUserData(user)),\r\n };\r\n};\r\n\r\nLoginPage.propTypes = {\r\n match: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n history: PropTypes.object.isRequired\r\n}\r\n \r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(withRouter(LoginPage));\r\n","import { Component } from 'react';\r\nimport { withRouter } from 'react-router';\r\n\r\nclass ScrollToTop extends Component {\r\n componentDidUpdate(prevProps) {\r\n if (this.props.location !== prevProps.location) {\r\n window.scrollTo(0, 0);\r\n }\r\n }\r\n\r\n render() {\r\n return this.props.children\r\n }\r\n}\r\n\r\nexport default withRouter(ScrollToTop);\r\n","export default __webpack_public_path__ + \"static/media/logo_eneida_blue.7f0f3ae9.svg\";","import React from 'react';\r\nimport ResourceLang from '../../resources/Language';\r\nimport { Drawer, List, ListSubheader, ListItem, ListItemIcon, ListItemText,\r\n Typography, Divider } from '@material-ui/core';\r\nimport DashboardIcon from '@material-ui/icons/Dashboard';\r\nimport LogoEneida from '../../resources/img/logo_eneida_blue.svg';\r\nimport ApartmentIcon from '@material-ui/icons/Apartment';\r\n\r\n\r\n//TODO: use side menu like this https://material-ui.com/store/previews/devias-kit/\r\nconst SideMenu = ({open, envID, toggleMenu, history}) => {\r\n const handleSelectMenuItem = (newRoute) => {\r\n history.push(newRoute);\r\n }\r\n\r\n const renderCurrentEnvironment = () => {\r\n if(envID !== undefined)\r\n {\r\n return(\r\n handleSelectMenuItem('/dashboard/environment/'+envID) }>\r\n \r\n \r\n \r\n )\r\n }\r\n else\r\n {\r\n return (\r\n <>\r\n )\r\n }\r\n }\r\n \r\n const renderSideMenuItems = () => {\r\n return (
\r\n \r\n \r\n \"logoeneida\"\r\n \r\n {ResourceLang.eneida_backoffice}\r\n \r\n {`v${process.env.REACT_APP_VERSION}`}\r\n \r\n \r\n }\r\n >\r\n \r\n handleSelectMenuItem('/dashboard') }>\r\n \r\n \r\n \r\n \r\n {renderCurrentEnvironment()}\r\n \r\n
);\r\n }\r\n\r\n\r\n return (\r\n {renderSideMenuItems()}\r\n );\r\n}\r\n\r\n\r\nexport default SideMenu;","import React from 'react';\r\nimport { withRouter } from \"react-router\";\r\nimport { connect } from 'react-redux';\r\nimport { setLoggedUser, SetUserData } from '../../redux/actions/UserActions';\r\nimport ResourceLang from '../../resources/Language';\r\nimport SessionServices from '../../utils/SessionServices';\r\nimport { requestLogout } from '../../utils/APIRequester';\r\nimport SideMenu from './SideMenu';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { AppBar, Toolbar, Typography, IconButton, Menu, MenuItem } from '@material-ui/core';\r\nimport AccountCircle from '@material-ui/icons/AccountCircle';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport ApartmentIcon from '@material-ui/icons/Apartment';\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n menuButton: {\r\n marginRight: theme.spacing(2),\r\n },\r\n title: {\r\n flexGrow: 1,\r\n },\r\n}));\r\n\r\n\r\nconst NavBar = ({match, location, history, ...props}) => {\r\n const classes = useStyles();\r\n const [sideMenu, setSideMenu] = React.useState(false);\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const open = Boolean(anchorEl);\r\n const envName = location.state ? location.state.context : \"\";\r\n\r\n const renderUserMenu = () => {\r\n return (
\r\n \r\n \r\n \r\n \r\n {ResourceLang.logout}\r\n \r\n
);\r\n }\r\n\r\n const handleMenu = (event) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleLogout = async () => {\r\n try{\r\n await requestLogout();\r\n }\r\n catch {}\r\n\r\n SessionServices.cleanAuthContext();\r\n props.logout();\r\n props.clearUserData();\r\n }\r\n\r\n\r\n const renderAppMenu = () => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n const toggleSideMenu = (isOpen) => (event) => {\r\n setSideMenu(isOpen);\r\n };\r\n\r\n\r\n return (
\r\n \r\n \r\n {renderAppMenu()}\r\n \r\n {ResourceLang.eneida_backoffice}\r\n \r\n {envName ? <> {envName}   : <>}\r\n {renderUserMenu()}\r\n \r\n \r\n \r\n
);\r\n}\r\n\r\n\r\nNavBar.propTypes = {\r\n match: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n history: PropTypes.object.isRequired\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n\treturn {\r\n userStatus: state.userStatus,\r\n userData: state.userData\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n\treturn {\r\n logout: () => dispatch(setLoggedUser(false)),\r\n clearUserData:() => dispatch(SetUserData({})),\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(withRouter(NavBar));","import React from 'react'\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Toolbar, Typography } from '@material-ui/core';\r\n\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n leftIcon: {\r\n margin: theme.spacing(1),\r\n float: 'left'\r\n },\r\n toolbar: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n display: 'flex',\r\n alignItems: 'center',\r\n boxSizing: 'border-box',\r\n flexDirection: 'row',\r\n },\r\n divider: {\r\n marginTop: theme.spacing(2),\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n },\r\n title: {\r\n flex: 1,\r\n }\r\n}));\r\n\r\n\r\nconst PageHeader = ({title, icon, ...props}) => {\r\n const classes = useStyles();\r\n\r\n return (<>\r\n \r\n
\r\n {icon}\r\n
\r\n \r\n {title}\r\n \r\n {props.children}\r\n
\r\n );\r\n}\r\n\r\nPageHeader.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired\r\n };\r\n\r\nexport default PageHeader;","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {ResourceLang} from '../../resources/Language';\r\nimport {Row, Col, Modal, ModalHeader, ModalBody, ModalFooter, Input, Label} from 'reactstrap'; \r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Button } from '@material-ui/core';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport WarningIcon from '@material-ui/icons/Warning';\r\n\r\nconst styles = makeStyles(theme => ({\r\n warningClass: {\r\n color: 'orange'\r\n },\r\n buttonConfirm: {\r\n color: '#2C4153'\r\n },\r\n buttonCancel: {\r\n marginLeft: theme.spacing(1)\r\n }\r\n}));\r\n\r\n\r\nconst ConfirmationModal = props => {\r\n const classes = styles();\r\n const state = {\r\n message: props.message || \"\",\r\n warning: props.warning || undefined,\r\n critialToken: (props.critialToken || \"\").replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n };\r\n const [isValid, setValid] = useState(() => (state.critialToken === \"\"));\r\n\r\n \r\n const onTokenInputChange = (event) => {\r\n const isTokenValid = (state.critialToken === event.target.value);\r\n \r\n if(isValid !== isTokenValid)\r\n setValid(isTokenValid);\r\n }\r\n\r\n const onConfirmClick = () => {\r\n props.confirmAction();\r\n }\r\n\r\n const handleToggle = () => {\r\n props.closeModal();\r\n }\r\n\r\n\r\n const renderWarning = () => {\r\n if (state.warning !== undefined) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n const renderCriticalToken = () => {\r\n if (state.critialToken !== \"\") {\r\n return (<>\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n\r\n return (\r\n \r\n {ResourceLang.confirmation_required}\r\n \r\n \r\n \r\n {renderWarning()}\r\n {renderCriticalToken()}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nConfirmationModal.propTypes = {\r\n isOpen: PropTypes.bool.isRequired,\r\n message: PropTypes.string,\r\n warning: PropTypes.string,\r\n critialToken: PropTypes.string,\r\n confirmAction: PropTypes.func.isRequired,\r\n closeModal: PropTypes.func.isRequired\r\n}\r\n\r\nexport default ConfirmationModal;","import React, { useState } from 'react';\r\nimport PropTypes from \"prop-types\";\r\nimport { TextField } from '@material-ui/core';\r\n\r\n\r\nconst MuiInputText = ({\r\n name, value = \"\", label, required = false, minLength = 1, maxLength = 4294967295, \r\n error = false, validate = undefined, onChange = undefined, ...props\r\n}) => {\r\n const [inputValue, setInputValue] = useState(value);\r\n\r\n const handleOnChange = (event) => {\r\n setInputValue(event.target.value);\r\n };\r\n\r\n const handleOnBlur = (event) => {\r\n if (onChange && inputValue !== value)\r\n onChange(name, inputValue, isError(inputValue));\r\n }\r\n\r\n\r\n const isError = (value) => {\r\n if (validate) {\r\n return !validate(value);\r\n }\r\n else if (required) {\r\n return !value || !validateRange(value);\r\n }\r\n else {\r\n return value && !validateRange(value);\r\n }\r\n }\r\n\r\n const validateRange = (value) => {\r\n return value.length >= minLength && value.length <= maxLength;\r\n }\r\n\r\n \r\n return \r\n}\r\n\r\n\r\nMuiInputText.propTypes = {\r\n name: PropTypes.string.isRequired,\r\n value: PropTypes.string,\r\n label: PropTypes.string.isRequired,\r\n required: PropTypes.bool,\r\n minLength: PropTypes.number,\r\n maxLength: PropTypes.number,\r\n error: PropTypes.bool,\r\n validate: PropTypes.func,\r\n onChange: PropTypes.func\r\n}\r\n\r\nexport default MuiInputText;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ResourceLang } from '../../resources/Language';\r\nimport { EnvironmentAPI } from '../../utils/APIRequester';\r\nimport { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\r\nimport { Grid, Button } from '@material-ui/core';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport MuiInputText from '../inputs/MuiInputText';\r\n\r\n\r\nconst DEFAULT_STATE = {\r\n isLoading: false,\r\n environment: {},\r\n errors: {}\r\n};\r\n\r\n\r\nconst EnvironmentModal = ({open, onClose, environment, onChange}) => {\r\n const [state, setState] = React.useState({...DEFAULT_STATE});\r\n const env = state.environment;\r\n\r\n\r\n React.useEffect(() => {\r\n setState({...DEFAULT_STATE, environment: {...environment}});\r\n }, [environment]);\r\n\r\n\r\n const renderBody = () => {\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 const onPropertyChange = (name, value, error) => {\r\n setState((prevState) => {\r\n const newState = {...prevState}\r\n newState.environment[name] = value;\r\n return newState;\r\n });\r\n };\r\n\r\n const handleClose = () => {\r\n onClose();\r\n }\r\n\r\n const handleSubmit = async () => {\r\n setState((prevState) => ({...prevState, isLoading: true}));\r\n \r\n const isCreate = (!env.Id || env.Id <= 0);\r\n const promise = (isCreate ?\r\n EnvironmentAPI.create(env) : EnvironmentAPI.update(env.Id, env));\r\n\r\n promise.then(response => {\r\n onChange(true);\r\n })\r\n .catch(handleError);\r\n \r\n await promise;\r\n }\r\n\r\n const handleError = (error) => {\r\n if (error.data) {\r\n const {Error} = error.data;\r\n const errors = {};\r\n\r\n switch(Error) {\r\n case 'name_is_not_unique':\r\n errors['Name'] = ResourceLang.non_unique_error;\r\n break;\r\n\r\n default: break;\r\n }\r\n\r\n if (Object.keys(errors).length > 0){\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n errors: errors\r\n }));\r\n return;\r\n }\r\n }\r\n\r\n onChange(false);\r\n }\r\n\r\n\r\n return (\r\n \r\n {ResourceLang.environment}\r\n \r\n \r\n {renderBody()}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nEnvironmentModal.propTypes = {\r\n open: PropTypes.bool,\r\n onClose: PropTypes.func,\r\n environment: PropTypes.shape({\r\n Id: PropTypes.number,\r\n Name: PropTypes.string,\r\n Address: PropTypes.string,\r\n ApiKey: PropTypes.string\r\n }).isRequired,\r\n onChange: PropTypes.func\r\n}\r\n\r\nexport default EnvironmentModal;","import React from 'react'\r\nimport ResourceLang from '../../resources/Language';\r\nimport PropTypes from 'prop-types';\r\nimport { Card, CardActionArea, CardActions, CardContent, IconButton, Tooltip } from '@material-ui/core';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles({\r\n cardRoot: {\r\n backgroundColor: '#f5f5f5'\r\n },\r\n});\r\n\r\nconst GenericCard = ({element, hasActions, children, handleClick, ...props}) => {\r\n\r\n const classes = useStyles();\r\n\r\n const renderActions = () => {\r\n\r\n if (!hasActions)\r\n return;\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 return (<>\r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n {renderActions()}\r\n \r\n \r\n )\r\n}\r\n\r\nGenericCard.propTypes = {\r\n element: PropTypes.object,\r\n hasActions: PropTypes.bool.isRequired,\r\n handleClick: PropTypes.func.isRequired,\r\n handleEdit: PropTypes.func,\r\n handleDelete: PropTypes.func\r\n};\r\n\r\nexport default GenericCard;","import React from 'react'\r\nimport { withRouter } from \"react-router\";\r\nimport ResourceLang from '../resources/Language';\r\nimport { EnvironmentAPI } from '../utils/APIRequester';\r\nimport PageHeader from '../components/headers/PageHeader';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Grid, Typography, Tooltip, Fab } from '@material-ui/core';\r\nimport DashboardIcon from '@material-ui/icons/Dashboard';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport ConfirmationModal from '../components/modals/ConfirmationModal';\r\nimport EnvironmentModal from '../components/modals/EnvironmentModal';\r\nimport CircularLoading from '../components/loadings/CircularLoading';\r\nimport MessageSnackbar from '../components/notifications/MessageSnackbar';\r\nimport GenericCard from '../components/cards/GenericCard';\r\nimport ApartmentIcon from '@material-ui/icons/Apartment';\r\n\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n padding: theme.spacing(1)\r\n },\r\n contentRoot: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1)\r\n },\r\n toolbar: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n },\r\n title: {\r\n flex: 1,\r\n },\r\n grid: {\r\n padding: theme.spacing(2)\r\n },\r\n cardRoot: {\r\n backgroundColor: '#f5f5f5'\r\n },\r\n}));\r\n\r\n\r\nconst DashboardPage = ({match, location, history, ...props}) => {\r\n const classes = useStyles();\r\n const [state, setState] = React.useState({\r\n isLoading: false,\r\n environments: undefined,\r\n selectedItem: {},\r\n envModalOpen: undefined,\r\n deleteModalOpen: undefined,\r\n snakcbarOpen: false,\r\n snakcbarMsg: '',\r\n snakcbarVariant: 'success'\r\n });\r\n\r\n React.useEffect(() => {\r\n \r\n if (!state.environments){\r\n setState((prevState) => ({...prevState, isLoading: true}));\r\n\r\n EnvironmentAPI.getAll()\r\n .then(response => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n environments: response\r\n }));\r\n })\r\n .catch(error => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n environments: [],\r\n snakcbarOpen: true,\r\n snakcbarMsg: error.message || ResourceLang.generic_error,\r\n snakcbarVariant: 'error'\r\n }));\r\n });\r\n }\r\n }, [state.environments]);\r\n\r\n\r\n const renderHeader = () => {\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 const handleAddEnvironment = () => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n envModalOpen: true,\r\n selectedItem: {}\r\n }));\r\n }\r\n\r\n\r\n const renderContent = () => {\r\n const {environments = []} = state;\r\n\r\n return (\r\n {\r\n environments.length === 0 ? renderEmptyContent()\r\n : environments.map((curEnv) => {\r\n return(\r\n {renderEnvironmentCard(curEnv)}\r\n );\r\n })\r\n }\r\n );\r\n }\r\n\r\n const renderEmptyContent = () => {\r\n return (\r\n \r\n {ResourceLang.empty_result}\r\n \r\n );\r\n }\r\n\r\n const renderEnvironmentCard = (env) => {\r\n return (\r\n \r\n \r\n {env.Name}\r\n \r\n \r\n {env.Address}\r\n \r\n \r\n )\r\n }\r\n\r\n const handleEnvironmentClick = (env) => event => {\r\n\r\n if (!env){\r\n setState((prevState) => ({\r\n ...prevState,\r\n snakcbarOpen: true,\r\n snakcbarMsg: ResourceLang.generic_error,\r\n snakcbarVariant: 'error'\r\n }));\r\n return;\r\n }\r\n \r\n\r\n history.push(`dashboard/environment/${env.Id}`);\r\n }\r\n\r\n const handleEnvironmentEdit = (env) => event => {\r\n\r\n if (!env){\r\n setState((prevState) => ({\r\n ...prevState,\r\n snakcbarOpen: true,\r\n snakcbarMsg: ResourceLang.generic_error,\r\n snakcbarVariant: 'error'\r\n }));\r\n return;\r\n }\r\n\r\n setState((prevState) => ({\r\n ...prevState,\r\n envModalOpen: true,\r\n selectedItem: env\r\n }));\r\n }\r\n\r\n const handleEnvironmentDelete = (env) => event => {\r\n\r\n if (!env){\r\n setState((prevState) => ({\r\n ...prevState,\r\n snakcbarOpen: true,\r\n snakcbarMsg: ResourceLang.generic_error,\r\n snakcbarVariant: 'error'\r\n }));\r\n return;\r\n }\r\n\r\n setState((prevState) => ({\r\n ...prevState,\r\n deleteModalOpen: true,\r\n selectedItem: env\r\n }));\r\n }\r\n\r\n\r\n\r\n const renderEnvironmentModal = () => {\r\n if (state.envModalOpen === undefined)\r\n return null;\r\n\r\n return ();\r\n }\r\n\r\n const handleModalClose = () => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n envModalOpen: false,\r\n selectedItem: {}\r\n }));\r\n }\r\n\r\n const handleModalChange = (success) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n envModalOpen: false,\r\n selectedItem: {},\r\n environments: undefined,\r\n snakcbarOpen: true,\r\n snakcbarMsg: success ? ResourceLang.changes_saved : ResourceLang.generic_error,\r\n snakcbarVariant: success ? 'success' : 'error'\r\n }));\r\n }\r\n\r\n\r\n const renderConfirmationModal = () => {\r\n if (state.deleteModalOpen === undefined)\r\n return null;\r\n\r\n return ();\r\n }\r\n\r\n const handleDeleteConfirm = async () => {\r\n const envId = state.selectedItem.Id;\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: true,\r\n deleteModalOpen: false,\r\n selectedItem: {}\r\n }));\r\n\r\n const promise = EnvironmentAPI.delete(envId);\r\n promise.then(response => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n environments: undefined,\r\n snakcbarOpen: true,\r\n snakcbarMsg: ResourceLang.changes_saved,\r\n snakcbarVariant: 'success'\r\n }));\r\n })\r\n .catch(error => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n snakcbarOpen: true,\r\n snakcbarMsg: ResourceLang.generic_error,\r\n snakcbarVariant: 'error'\r\n }));\r\n });\r\n\r\n await promise;\r\n }\r\n\r\n const handleCloseDeleteModal = () => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n deleteModalOpen: false,\r\n selectedItem: {}\r\n }));\r\n }\r\n\r\n\r\n const renderSnackbar = () => {\r\n return ();\r\n }\r\n\r\n const handleSnackbarClose = () => {\r\n setState((prevState) => ({...prevState, snakcbarOpen: false}));\r\n }\r\n\r\n\r\n return (
\r\n \r\n \r\n {renderHeader()}\r\n \r\n \r\n {state.isLoading ? : renderContent()}\r\n \r\n \r\n\r\n {renderEnvironmentModal()}\r\n {renderConfirmationModal()}\r\n {renderSnackbar()}\r\n
);\r\n}\r\n\r\nexport default withRouter(DashboardPage);","import React from 'react'\r\nimport { withRouter } from \"react-router\";\r\nimport ResourceLang from '../resources/Language';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport PageHeader from '../components/headers/PageHeader';\r\nimport ApartmentIcon from '@material-ui/icons/Apartment';\r\nimport { EnvironmentAPI } from '../utils/APIRequester';\r\nimport { Grid, Typography } from '@material-ui/core';\r\nimport CircularLoading from '../components/loadings/CircularLoading';\r\nimport GenericCard from '../components/cards/GenericCard';\r\nimport MemoryIcon from '@material-ui/icons/Memory';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n padding: theme.spacing(1)\r\n },\r\n contentRoot: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1)\r\n },\r\n grid: {\r\n padding: theme.spacing(2)\r\n },\r\n cardRoot: {\r\n backgroundColor: '#f5f5f5'\r\n },\r\n}));\r\n\r\n\r\nconst EnvironmentPage = ({ match, location, history, ...props }) => {\r\n const classes = useStyles();\r\n const [state, setState] = React.useState({\r\n isLoading: false,\r\n environment: undefined\r\n\r\n });\r\n\r\n React.useEffect(() => {\r\n if (!state.environment) {\r\n setState((prevState) => ({ ...prevState, isLoading: true }));\r\n\r\n EnvironmentAPI.getOne(match.params.envId)\r\n .then(response => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n environment: response\r\n }));\r\n })\r\n .catch(error => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n environment: undefined,\r\n }));\r\n });\r\n }\r\n }, [state.environment, match.params.envId]);\r\n\r\n const handleUploadFirmwareClick = () => event => {\r\n history.push(`/environment/${match.params.envId}/uploadfirmware`,\r\n { context: state.environment.Name });\r\n }\r\n\r\n const handleUpdateFirmwareClick = () => event => {\r\n history.push(`/environment/${match.params.envId}/updatefirmware`,\r\n { context: state.environment.Name });\r\n }\r\n\r\n const handleListDeviceClick = () => event => {\r\n history.push(`/environment/${match.params.envId}/device`,\r\n { context: state.environment.Name });\r\n }\r\n\r\n\r\n const renderUploadFirmwareCard = () => {\r\n return (\r\n \r\n \r\n {ResourceLang.upload_firmware}\r\n \r\n \r\n )\r\n }\r\n\r\n const renderUpdateFirmwareCard = () => {\r\n return (\r\n \r\n \r\n {ResourceLang.update_firmware}\r\n \r\n \r\n )\r\n }\r\n\r\n const renderListDeviceCard = () => {\r\n return (\r\n \r\n \r\n {ResourceLang.list_device}\r\n \r\n \r\n )\r\n }\r\n\r\n const renderHeader = () => {\r\n\r\n if (!state.environment)\r\n return;\r\n\r\n return (\r\n }>\r\n )\r\n }\r\n\r\n const renderContent = () => {\r\n return (\r\n \r\n \r\n {renderUploadFirmwareCard()}\r\n \r\n \r\n {renderUpdateFirmwareCard()}\r\n \r\n \r\n {renderListDeviceCard()}\r\n \r\n \r\n );\r\n }\r\n\r\n\r\n return (
\r\n \r\n \r\n {renderHeader()}\r\n \r\n \r\n {state.isLoading ? : renderContent()}\r\n \r\n \r\n
);\r\n}\r\n\r\nexport default withRouter(EnvironmentPage);","import React from 'react'\r\nimport { Typography } from '@material-ui/core'\r\nimport ResourceLang from '../../resources/Language'\r\nimport PropTypes from 'prop-types'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport TreeView from '@material-ui/lab/TreeView'\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore'\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight'\r\nimport TreeItem from '@material-ui/lab/TreeItem'\r\nimport { colors } from '@material-ui/core'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n justifyContent: 'left',\r\n paddingTop: '20px',\r\n overflow: 'auto',\r\n },\r\n item: {\r\n display: 'flex',\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n },\r\n\r\n button: {\r\n color: colors.yellow[700],\r\n padding: '10px 8px',\r\n justifyContent: 'flex-start',\r\n letterSpacing: 0,\r\n '&:hover': {\r\n color: '#efefef',\r\n },\r\n },\r\n}))\r\n\r\nconst handleSelection = (nodeId, children, ItemSelected) => {\r\n if (children === undefined) {\r\n //this means that the user was clicked in the lowest level\r\n ItemSelected(nodeId)\r\n }\r\n}\r\n\r\nconst DeviceMenuItems = ({ menuItems, ItemSelected }) => {\r\n const classes = useStyles()\r\n const renderTree = (nodes) => {\r\n return (\r\n handleSelection(nodes.id, nodes.children, ItemSelected)}\r\n key={nodes.id}\r\n nodeId={nodes.id.toString()}\r\n label={nodes.name}\r\n className={classes.button}\r\n >\r\n {Array.isArray(nodes.children)\r\n ? nodes.children.map((node) => renderTree(node))\r\n : null}\r\n \r\n )\r\n }\r\n\r\n const renderTreeView = () => {\r\n if (menuItems !== undefined) {\r\n return (\r\n <>\r\n }\r\n defaultExpandIcon={}\r\n >\r\n {menuItems.map((obj, index) => {\r\n return renderTree(menuItems[index])\r\n })}\r\n \r\n \r\n )\r\n } else {\r\n return (\r\n <>\r\n {ResourceLang.loading}\r\n \r\n )\r\n }\r\n }\r\n\r\n return renderTreeView()\r\n}\r\n\r\nDeviceMenuItems.propTypes = {\r\n props: PropTypes.object.isRequired,\r\n menuItems: PropTypes.array,\r\n ItemSelected: PropTypes.func.isRequired,\r\n}\r\n\r\nexport default DeviceMenuItems\r\n","import React, {useState} from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport './PageLoading.css';\r\n\r\n\r\nconst Modal = ({children, classes, ...other}) =>{\r\n const modalRoot = document.createElement('div');\r\n const [div] = useState(modalRoot);\r\n\r\n React.useLayoutEffect(() => {\r\n document.body.appendChild(div);\r\n return () => { document.body.removeChild(div); }\r\n });\r\n\r\n return(\r\n createPortal(children, div, 'loading')\r\n );\r\n}\r\n\r\nconst PageLoading = (props) =>{\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\nexport default PageLoading;","\r\nexport function translateObjectToMenu(jsonObjectResponse) {\r\n var deviceOptionIdentifier = 1;\r\n jsonObjectResponse.forEach(function(subMenuItem){\r\n subMenuItem[\"name\"]= subMenuItem.device_type_name\r\n subMenuItem[\"children\"] = subMenuItem.hw_versions\r\n delete subMenuItem[\"device_type_name\"]\r\n delete subMenuItem[\"hw_versions\"]\r\n subMenuItem[\"id\"] = deviceOptionIdentifier\r\n deviceOptionIdentifier++\r\n subMenuItem.children.forEach(function(version){\r\n version[\"name\"]= version.version\r\n version[\"children\"] = version.micro_controllers\r\n delete version[\"version\"]\r\n delete version[\"micro_controllers\"]\r\n version[\"id\"] = deviceOptionIdentifier\r\n deviceOptionIdentifier++\r\n const MicroControllers = []\r\n version.children.forEach(function(micro){\r\n deviceOptionIdentifier++\r\n MicroControllers.push({ name: micro, id: deviceOptionIdentifier })\r\n version[\"children\"] = MicroControllers\r\n })\r\n })\r\n});\r\n}\r\n\r\nexport function findElementById(menuItems, nodeId) {\r\n var elementFound = {}\r\n menuItems.forEach(function(subMenuItem){\r\n subMenuItem.children.forEach(function(version){\r\n version.children.forEach(function(micro){\r\n if (micro.id === nodeId) {\r\n elementFound.deviceType = subMenuItem.name\r\n elementFound.version = version.name\r\n elementFound.micro = micro.name\r\n }\r\n })\r\n })\r\n });\r\n\r\n return elementFound;\r\n}","export const isMobile = () => {\r\n try { return ('ontouchstart' in document.documentElement); }\r\n catch { return false; }\r\n}\r\n\r\nexport const bytesToSize = (bytes, decimals = 2) => {\r\n if (!bytes || bytes < 0)\r\n return '';\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\r\n}\r\n\r\n\r\nlet size;\r\nexport const scrollbarSize = (recalc) => {\r\n if ((!size && size !== 0) || recalc) {\r\n const canUseDOM = !!(\r\n typeof window !== 'undefined' &&\r\n window.document &&\r\n window.document.createElement\r\n );\r\n\r\n if (canUseDOM) {\r\n const scrollDiv = document.createElement('div');\r\n\r\n scrollDiv.style.position = 'absolute';\r\n scrollDiv.style.top = '-9999px';\r\n scrollDiv.style.width = '50px';\r\n scrollDiv.style.height = '50px';\r\n scrollDiv.style.overflow = 'scroll';\r\n\r\n document.body.appendChild(scrollDiv);\r\n size = scrollDiv.offsetWidth - scrollDiv.clientWidth;\r\n document.body.removeChild(scrollDiv);\r\n }\r\n else {\r\n size = 14;\r\n }\r\n }\r\n\r\n return size;\r\n}\r\n\r\n\r\nexport const compareValues = (x, y) => {\r\n if (typeof(x) === 'string')\r\n return x.localeCompare(y);\r\n else\r\n return (x === y ? 0 : (x < y ? -1 : 1));\r\n}\r\n\r\n\r\nexport const handleBodyResize = () => {\r\n const navbar = document.getElementById('app-navbar');\r\n const navbarHeight = (navbar ? (navbar.clientHeight + 1) : 52);\r\n\r\n const height = (window.innerHeight - navbarHeight) + \"px\";\r\n const element = document.getElementById(\"root\");\r\n element.style.height = height;\r\n}","import React , {useState, useEffect} from 'react'\r\nimport { withRouter } from \"react-router\";\r\nimport PageHeader from '../components/headers/PageHeader';\r\nimport {Button, Typography, Divider, Chip } from '@material-ui/core'\r\nimport DeviceMenuItems from '../components/MenuItems/MenuItems'\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport ResourceLang from '../resources/Language';\r\nimport CloudUploadIcon from '@material-ui/icons/CloudUpload';\r\nimport {DropzoneArea} from 'material-ui-dropzone'\r\nimport {FirmwareAPI} from '../utils/APIRequester';\r\nimport MessageSnackbar from '../components/notifications/MessageSnackbar';\r\nimport ExtensionIcon from '@material-ui/icons/Extension';\r\nimport MemoryIcon from '@material-ui/icons/Memory';\r\nimport DevicesOtherIcon from '@material-ui/icons/DevicesOther';\r\nimport PageLoading from '../components/loadings/PageLoading';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport {translateObjectToMenu, findElementById} from '../utils/FirmwareServices';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n height: '100vh',\r\n marginTop: 1\r\n },\r\n body_info:{\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(2)\r\n },\r\n body_dropzone:{\r\n marginTop: theme.spacing(3),\r\n marginBottom: theme.spacing(2)\r\n },\r\n treeView: {\r\n backgroundColor: '#2C4153',\r\n overflow: 'auto'\r\n },\r\n content: {\r\n flexGrow: 1,\r\n padding: theme.spacing(2),\r\n },\r\n chip: {\r\n marginRight: 5\r\n }\r\n}));\r\n\r\n\r\nconst UploadFirmwarePage = ({match, location, history, ...props}) => {\r\n const classes = useStyles();\r\n const [ DropZoneAreakey, setDropZoneAreaKey] = useState(0);\r\n const [ fileToUpload, setFile ] = useState(undefined);\r\n const [ MenuItems, setMenuItems ] = useState(undefined);\r\n const [ snackbar, setSnackbar] = useState({ open: false, variant: 'error', message: ''});\r\n const [ micro_controller, setMicro ] = useState(undefined);\r\n const [ device_type_name, setDevice ] = useState(undefined);\r\n const [ device_version, setVersion ] = useState(undefined);\r\n \r\n const envId = match.params.envId;\r\n\r\n useEffect(() => {\r\n if (!MenuItems)\r\n {\r\n FirmwareAPI.getStructure(envId).then(response => {\r\n translateObjectToMenu(response)\r\n setMenuItems(response);\r\n });\r\n }\r\n }, [envId, MenuItems]);\r\n\r\n \r\n const renderDeviceTypeIcon = () => {\r\n if (device_type_name) {\r\n return (}\r\n label={device_type_name} />);\r\n }\r\n \r\n return null;\r\n }\r\n\r\n const renderExtensionIcon = () => {\r\n if(device_version) {\r\n return (}\r\n label={device_version} />);\r\n }\r\n \r\n return null;\r\n }\r\n\r\n const renderMemoryIcon = () => {\r\n if(micro_controller) {\r\n return (}\r\n label={micro_controller} />);\r\n }\r\n \r\n return null;\r\n }\r\n \r\n\r\n const handleChange = (fileToUpload) => {\r\n if(Object.keys(fileToUpload).length > 0) {\r\n setFile(fileToUpload);\r\n }\r\n else {\r\n setFile(undefined);\r\n } \r\n }\r\n\r\n const renderUploadButton= () => {\r\n if (!micro_controller || !device_type_name || !device_version) {\r\n return null;\r\n }\r\n \r\n return(
\r\n \r\n
);\r\n }\r\n\r\n const renderDropZoneArea = () => {\r\n if (!micro_controller || !device_type_name || !device_version ) {\r\n return null;\r\n }\r\n \r\n return();\r\n }\r\n\r\n const uploadToServer = () => {\r\n const formData = new FormData(); \r\n formData.append(fileToUpload[0].name, new Blob( fileToUpload)); \r\n \r\n if(fileToUpload && fileToUpload[0]!==undefined) {\r\n formData.append('name', fileToUpload[0].name); \r\n }\r\n\r\n FirmwareAPI.uploadFileToServer(\r\n envId,\r\n device_type_name,\r\n device_version.substring(1),\r\n micro_controller,formData\r\n )\r\n .then(response => {\r\n setSnackbar((prevState) => ({\r\n ...prevState,\r\n open: true,\r\n message: ResourceLang.upload_success_message,\r\n variant: 'success'\r\n }));\r\n setDropZoneAreaKey(DropZoneAreakey +1)\r\n setFile(undefined)\r\n })\r\n .catch((status, message, data) => {\r\n if(status.data.Error === \"invalid_file_size\") {\r\n message = ResourceLang.upload_error_file_size_message;\r\n }\r\n else if(status.data.Error === \"invalid_file\") {\r\n message = ResourceLang.upload_error_no_file;\r\n }\r\n else {\r\n message = ResourceLang.generic_error;\r\n }\r\n \r\n setSnackbar((prevState) => ({\r\n ...prevState,\r\n open: true,\r\n message: message,\r\n variant: 'error'\r\n }));\r\n });\r\n }\r\n\r\n const setDeviceChoosen = (ItemSelected) => {\r\n if(ItemSelected) {\r\n const deviceSelected = findElementById(MenuItems, ItemSelected)\r\n if(deviceSelected) {\r\n setDevice(deviceSelected.deviceType)\r\n setVersion(deviceSelected.version)\r\n setMicro(deviceSelected.micro)\r\n }\r\n }\r\n }\r\n\r\n const renderHeader = () => {\r\n return (}>\r\n )\r\n }\r\n\r\n const handleSnackbarClose = () => {\r\n setSnackbar((prevState) => ({...prevState, open: false}));\r\n }\r\n\r\n const renderSnackbar = () => {\r\n return ();\r\n }\r\n\r\n return (
\r\n \r\n \r\n \r\n \r\n \r\n {renderHeader()}\r\n
\r\n
\r\n {ResourceLang.micro_controller_info}\r\n {ResourceLang.micro_controller}  \r\n {renderDeviceTypeIcon()}\r\n {renderExtensionIcon()}\r\n {renderMemoryIcon()}\r\n
\r\n {renderDropZoneArea()}\r\n
\r\n {renderUploadButton()}\r\n {renderSnackbar()}\r\n
\r\n
\r\n {!MenuItems ? : null}\r\n
);\r\n}\r\n\r\n\r\nexport default withRouter(UploadFirmwarePage);","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Stepper, Step, StepLabel } from '@material-ui/core';\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n button: {\r\n marginRight: theme.spacing(1),\r\n },\r\n instructions: {\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n },\r\n}));\r\n\r\n\r\nconst DialogStepper = ({\r\n activeStep, steps, stepProps = {}, labelProps = {}, ...other\r\n}) => {\r\n const classes = useStyles();\r\n return (\r\n
\r\n \r\n {steps.map((label) => {\r\n return (\r\n {label}\r\n );\r\n })}\r\n \r\n
\r\n );\r\n}\r\n\r\nDialogStepper.propTypes = {\r\n activeStep: PropTypes.number.isRequired,\r\n steps: PropTypes.array.isRequired\r\n};\r\n\r\nexport default DialogStepper;\r\n","import PropTypes from 'prop-types';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport React from 'react';\r\nimport {makeStyles } from '@material-ui/core/styles';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport Select from '@material-ui/core/Select';\r\nimport ResourceLang from '../../resources/Language';\r\nimport { Typography } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n button: {\r\n display: 'block',\r\n marginTop: theme.spacing(2),\r\n },\r\n formControl: {\r\n margin: theme.spacing(1),\r\n minWidth: 120,\r\n },\r\n body_content:{\r\n marginTop: 30,\r\n textAlign: 'center'\r\n }\r\n}));\r\n\r\n\r\nconst SelectVersions = ({availableVersions, versionSelected}) => {\r\n const classes = useStyles();\r\n const [versionChoosen, setVersionChoosen] = React.useState('');\r\n const [open, setOpen] = React.useState(false);\r\n\r\n const renderContent = () => {\r\n const handleChange = (event) => {\r\n setVersionChoosen(event.target.value)\r\n versionSelected(availableVersions[event.target.value].current_firmware_version)\r\n };\r\n \r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n \r\n const handleOpen = () => {\r\n setOpen(true);\r\n };\r\n\r\n const renderVersionChoosenOnDropDown = () =>{\r\n return(\r\n {ResourceLang.version}\r\n )\r\n }\r\n\r\n return(
\r\n \r\n {renderVersionChoosenOnDropDown}\r\n \r\n \r\n
\r\n )\r\n }\r\n\r\n return(\r\n \r\n \r\n
\r\n \r\n {ResourceLang.update_version_choose} \r\n \r\n {renderContent()}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nSelectVersions.propTypes = {\r\n availableVersions: PropTypes.object.isRequired,\r\n versionSelected: PropTypes.func.isRequired\r\n};\r\n\r\nexport default SelectVersions;","import React from 'react'\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, ScrollSync , AutoSizer } from 'react-virtualized';\r\nimport { scrollbarSize } from '../../utils/BrowserServices';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport TableCell from '@material-ui/core/TableCell';\r\n\r\n\r\nconst styles = (theme) => ({\r\n gridColumn: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: '1 1 auto',\r\n height: '100%'\r\n },\r\n headerContainer: {\r\n backgroundColor: theme.palette.primary.main,\r\n borderRadius: '4px 4px 0 0',\r\n },\r\n headerGrid: {\r\n width: '100%',\r\n overflow: 'hidden !important',\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n borderRadius: '4px 4px 0 0',\r\n },\r\n bodyGrid: {\r\n width: '100%',\r\n },\r\n headerCell: {\r\n border: 'none',\r\n fontSize: '0.8rem',\r\n padding: theme.spacing(1),\r\n color: 'white',\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n bodyCell: {\r\n borderBottom: '1px solid rgba(224, 224, 224, 1)',\r\n borderLeft: '1px solid rgba(224, 224, 224, 1)',\r\n fontSize: '0.75rem',\r\n padding: theme.spacing(1),\r\n },\r\n truncateText: {\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n evenRow: {\r\n backgroundColor: '#ffffff',\r\n },\r\n oddRow: {\r\n backgroundColor: '#eeeeee',\r\n },\r\n flexContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n boxSizing: 'border-box',\r\n },\r\n});\r\n\r\n\r\nconst RawVirtualizedGrid = ({\r\n rowCount, columns, columnWidth = 200, rowHeight = 40, overscanRowCount = 10, rowGetter, classes\r\n}) => {\r\n const headerCellRenderer = ({columnIndex, key, rowIndex, style, ...ohter}) => {\r\n const column = columns[columnIndex];\r\n const label = column.label || column.dataKey;\r\n \r\n return (\r\n {label}\r\n );\r\n }\r\n\r\n const bodyCellRenderer = ({columnIndex, key, rowIndex, style, ...ohter}) => {\r\n const rowData = rowGetter(rowIndex);\r\n const column = columns[columnIndex];\r\n\r\n let cellData = rowData[column.dataKey] || \"-\";\r\n if(column.dataKey ===\"#\"){\r\n cellData = (<>{rowIndex + 1});\r\n }\r\n else if (column.render) {\r\n cellData = column.render(rowData);\r\n }\r\n else if(cellData instanceof Date){\r\n cellData = `${cellData.toLocaleDateString()} ${cellData.toLocaleTimeString()}`\r\n }\r\n else if(typeof(cellData) === 'number') {\r\n if (cellData && !isNaN(cellData)) {\r\n cellData = Number(Math.round(cellData))\r\n }\r\n else\r\n cellData = \"-\";\r\n }\r\n else if (typeof(cellData) === 'object') {\r\n cellData = JSON.stringify(cellData);\r\n }\r\n\r\n return (\r\n {cellData}\r\n );\r\n }\r\n\r\n\r\n const renderGrid = ({clientHeight, clientWidth,\r\n onScroll, scrollHeight, scrollLeft, scrollTop, scrollWidth,\r\n }) => {\r\n return (
\r\n \r\n {({width, height}) => {\r\n const scrollBarSize = scrollbarSize();\r\n const headerRowHeight = rowHeight;\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 return (\r\n {(scrollProps) => renderGrid(scrollProps)}\r\n );\r\n}\r\n\r\n\r\nRawVirtualizedGrid.propTypes = {\r\n rowCount: PropTypes.number.isRequired,\r\n columns: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n dataKey: PropTypes.string.isRequired,\r\n label: PropTypes.string,\r\n render: PropTypes.func,\r\n decimalPlaces: PropTypes.number, //if typeof(value) number\r\n }),\r\n ).isRequired,\r\n columnWidth: PropTypes.number,\r\n rowHeight: PropTypes.number,\r\n overscanRowCount: PropTypes.number,\r\n rowGetter: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(RawVirtualizedGrid);","import React from 'react';\r\nimport ResourceLang from '../../resources/Language';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, InputLabel } from '@material-ui/core';\r\nimport RawVirtualizedGrid from '../tables/RawVirtualizedGrid'\r\n\r\nconst UploadReview = ({devices, next_version}) => {\r\n\r\n const DeviceKeysEnum = {\r\n UPDATE_VERSION: 'update_firmware_version',\r\n UPDATE_REQUEST_DATE_VERSION: 'update_request_date'\r\n }\r\n \r\n const renderContent = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n {ResourceLang.next_version} {next_version}\r\n {ResourceLang.devices}\r\n {renderDeviceItems()}\r\n \r\n \r\n );\r\n }\r\n\r\n const renderDeviceItems = () => {\r\n const gridRowGetter = (index) => { return devices[index]; }\r\n const keys = Object.keys(devices[0]);\r\n var columns = keys.map(key => ({label: ResourceLang[key], dataKey:key}))\r\n .filter(x => x.dataKey !== DeviceKeysEnum.UPDATE_VERSION \r\n && x.dataKey !== DeviceKeysEnum.UPDATE_REQUEST_DATE_VERSION);\r\n \r\n return (
\r\n \r\n
);\r\n }\r\n return (<>{renderContent()})\r\n}\r\n\r\nUploadReview.propTypes = {\r\n devices: PropTypes.object.isRequired,\r\n next_version: PropTypes.string.isRequired\r\n};\r\n\r\nexport default UploadReview;","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport ResourceLang from '../../resources/Language'\r\nimport {\r\n AutoSizer,\r\n Column,\r\n Table,\r\n InfiniteLoader,\r\n SortIndicator,\r\n defaultTableRowRenderer,\r\n} from 'react-virtualized'\r\nimport { Link } from 'react-router-dom'\r\nimport {\r\n ContextMenu,\r\n ContextMenuTrigger,\r\n connectMenu,\r\n hideMenu,\r\n} from 'react-contextmenu'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport clsx from 'clsx'\r\nimport {\r\n TableRow,\r\n TableCell,\r\n Tooltip,\r\n Typography,\r\n IconButton,\r\n Paper,\r\n MenuList,\r\n MenuItem,\r\n Checkbox,\r\n} from '@material-ui/core'\r\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess'\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore'\r\n\r\nconst styles = (theme) => ({\r\n flexContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n boxSizing: 'border-box',\r\n },\r\n table: {\r\n // temporary right-to-left patch, waiting for\r\n // https://github.com/bvaughn/react-virtualized/issues/454\r\n '& .ReactVirtualized__Table__headerRow': {\r\n flip: false,\r\n paddingRight: theme.direction === 'rtl' ? '0px !important' : undefined,\r\n },\r\n },\r\n tableRow: {\r\n cursor: 'pointer',\r\n },\r\n tableRowHover: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[200],\r\n },\r\n },\r\n tableCell: {\r\n flex: 1,\r\n },\r\n tableFooter: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n footerlabel: {\r\n marginLeft: theme.spacing(3),\r\n },\r\n firstCell: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n noClick: {\r\n cursor: 'initial',\r\n },\r\n})\r\n\r\nconst MENU_TYPE = 'DYNAMIC'\r\nconst collectTriggerProps = (props) => props\r\n\r\nconst DynamicMenu = ({ id, contextMenuOptions, trigger }) => {\r\n const { data } = trigger || {}\r\n\r\n return (\r\n \r\n \r\n \r\n {!trigger\r\n ? null\r\n : contextMenuOptions.map(({ label, onClick }, index) => {\r\n const onMenuItemClick = (e) => {\r\n hideMenu()\r\n onClick(e, data)\r\n }\r\n\r\n return (\r\n \r\n {label}\r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nDynamicMenu.propTypes = {\r\n id: PropTypes.string.isRequired,\r\n contextMenuOptions: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n label: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n })\r\n ).isRequired,\r\n trigger: PropTypes.shape({\r\n data: PropTypes.object.isRequired,\r\n }),\r\n}\r\n\r\nconst ConnectedMenu = connectMenu(MENU_TYPE)(DynamicMenu)\r\n\r\nclass MuiFiltersSelectAllVirtualizedTable extends React.PureComponent {\r\n static defaultProps = {\r\n disableHeader: false,\r\n headerHeight: 48,\r\n rowHeight: 48,\r\n detailRowHeight: 48 * 2,\r\n }\r\n\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n selectedIndex: -1,\r\n }\r\n this.tableRef = React.createRef()\r\n this._isRowLoaded = this._isRowLoaded.bind(this)\r\n this._loadMoreRows = this._loadMoreRows.bind(this)\r\n this._handleExpandClick = this._handleExpandClick.bind(this)\r\n }\r\n\r\n cellRenderer = ({ cellData, columnIndex, rowIndex, rowData }) => {\r\n const { columns, rowHeight, classes } = this.props\r\n const column = columns[columnIndex]\r\n let value = cellData\r\n\r\n if (column.dataKey === '#') {\r\n value =
{rowIndex + 1}
\r\n } else if (column.render) {\r\n value = column.render(rowData)\r\n } else if (column.date === true) {\r\n const date = new Date(cellData)\r\n value = `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`\r\n } else if (column.numeric === true) {\r\n const decimalPlaces = column.decimalPlaces || 2\r\n if (cellData && !isNaN(cellData)) {\r\n value = Number(\r\n Math.round(value + ('e' + decimalPlaces)) + ('e-' + decimalPlaces)\r\n ).toFixed(decimalPlaces)\r\n } else value = '-'\r\n }\r\n\r\n if (column.link) {\r\n value = (\r\n event.stopPropagation()}\r\n to={column.link(rowData)}\r\n >\r\n {value}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {value}\r\n \r\n )\r\n }\r\n\r\n headerRenderer = ({\r\n label,\r\n columnIndex,\r\n dataKey,\r\n sortBy,\r\n sortDirection,\r\n selectAll,\r\n allSelected,\r\n }) => {\r\n const { headerHeight, columns, classes } = this.props\r\n const column = columns[columnIndex]\r\n\r\n let content = ''\r\n if (columnIndex === 0) {\r\n content = (\r\n
\r\n \r\n {\r\n selectAll(e)\r\n }}\r\n color='primary'\r\n checked={allSelected}\r\n />\r\n \r\n {sortBy === dataKey && (\r\n \r\n )}\r\n
\r\n )\r\n } else {\r\n content = (\r\n <>\r\n {label}\r\n {sortBy === dataKey && (\r\n \r\n )}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {content}\r\n \r\n )\r\n }\r\n\r\n rowRendererDetailed = (params) => {\r\n const { classes, rowHeight, detailRowHeight, detailRowRenderer } =\r\n this.props\r\n const { index, style, className, key } = params\r\n\r\n if (index === this.state.selectedIndex) {\r\n return (\r\n \r\n {defaultTableRowRenderer({\r\n ...params,\r\n style: { width: '100%', height: rowHeight },\r\n })}\r\n {\r\n let target = event.target\r\n\r\n while (target.getAttribute('role') !== 'row') {\r\n target = target.parentNode\r\n }\r\n\r\n target.previousElementSibling.click()\r\n }}\r\n >\r\n {detailRowRenderer(params, detailRowHeight)}\r\n \r\n
\r\n )\r\n } else return defaultTableRowRenderer(params)\r\n }\r\n\r\n renderDetailButton = (width) => {\r\n const { classes, headerHeight, rowHeight } = this.props\r\n const key = 'detailButton'\r\n const disableSort = true\r\n\r\n return (\r\n {\r\n return (\r\n \r\n )\r\n }}\r\n cellRenderer={({ cellData, columnIndex, rowIndex, rowData }) => {\r\n const isSelected = this.state.selectedIndex === rowIndex\r\n const expandIcon = isSelected ? (\r\n \r\n ) : (\r\n \r\n )\r\n const label = isSelected\r\n ? ResourceLang.HideDetails\r\n : ResourceLang.ShowDetails\r\n\r\n return (\r\n \r\n \r\n {\r\n event.stopPropagation()\r\n this._handleExpandClick(rowIndex)\r\n }}\r\n >\r\n {expandIcon}\r\n \r\n \r\n \r\n )\r\n }}\r\n />\r\n )\r\n }\r\n\r\n getRowClassName = ({ index }) => {\r\n const { classes } = this.props\r\n return index !== -1\r\n ? clsx(classes.tableRow, classes.flexContainer, classes.tableRowHover)\r\n : clsx(classes.tableRow, classes.flexContainer)\r\n }\r\n\r\n getHeaderRowClassName = (disableSort) => {\r\n const { classes } = this.props\r\n return clsx([\r\n classes.tableCell,\r\n classes.flexContainer,\r\n disableSort === true ? classes.noClick : classes.tableRow,\r\n ])\r\n }\r\n\r\n getRowHeight = ({ index }) => {\r\n return index === this.state.selectedIndex\r\n ? this.props.detailRowHeight + this.props.rowHeight\r\n : this.props.rowHeight\r\n }\r\n\r\n getColumnAlign = (column) => {\r\n if (column.align) return column.align\r\n\r\n return column.numeric ? 'right' : 'left'\r\n }\r\n\r\n _isRowLoaded(args) {\r\n const obj = this.props.rowGetter(args)\r\n return obj !== undefined\r\n }\r\n\r\n _loadMoreRows(args) {\r\n this.props.onLoadMore(args)\r\n }\r\n\r\n _handleExpandClick(rowIndex) {\r\n const newIndex = this.state.selectedIndex === rowIndex ? -1 : rowIndex\r\n this.setState({ ...this.state, selectedIndex: newIndex })\r\n\r\n if (this.tableRef) {\r\n this.tableRef.recomputeRowHeights()\r\n }\r\n }\r\n\r\n render() {\r\n const {\r\n classes,\r\n columns,\r\n rowHeight,\r\n headerHeight,\r\n disableHeader,\r\n detailRowRenderer,\r\n contextMenuOptions,\r\n selectAll,\r\n allSelected,\r\n ...tableProps\r\n } = this.props\r\n const footerHeight = headerHeight\r\n\r\n const rowContentRenderer = detailRowRenderer\r\n ? this.rowRendererDetailed\r\n : defaultTableRowRenderer\r\n const rowRenderer = !contextMenuOptions\r\n ? rowContentRenderer\r\n : (params) => {\r\n const { style, key, rowData } = params\r\n\r\n return (\r\n \r\n {rowContentRenderer(params)}\r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {({ onRowsRendered, registerChild }) => (\r\n \r\n {({ height, width }) => (\r\n <>\r\n {\r\n this.tableRef = ref\r\n registerChild(ref)\r\n }}\r\n onRowsRendered={onRowsRendered}\r\n height={height - footerHeight}\r\n width={width}\r\n rowHeight={\r\n detailRowRenderer ? this.getRowHeight : rowHeight\r\n }\r\n gridStyle={{ direction: 'inherit' }}\r\n disableHeader={disableHeader}\r\n headerHeight={headerHeight}\r\n className={classes.table}\r\n {...tableProps}\r\n rowRenderer={rowRenderer}\r\n rowClassName={this.getRowClassName}\r\n >\r\n {columns.map(\r\n ({ dataKey, columnWidth, ...other }, index) => {\r\n const cellWidth = columnWidth * width\r\n return (\r\n \r\n this.headerRenderer({\r\n ...headerProps,\r\n columnIndex: index,\r\n selectAll: selectAll,\r\n allSelected: allSelected,\r\n })\r\n }\r\n className={classes.flexContainer}\r\n cellRenderer={this.cellRenderer}\r\n dataKey={dataKey}\r\n width={cellWidth}\r\n {...other}\r\n />\r\n )\r\n }\r\n )}\r\n {detailRowRenderer ? this.renderDetailButton(width) : null}\r\n \r\n \r\n \r\n {this.props.totalRows} {ResourceLang.items}\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n {contextMenuOptions ? (\r\n \r\n ) : null}\r\n \r\n )\r\n }\r\n}\r\n\r\nMuiFiltersSelectAllVirtualizedTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n columns: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n dataKey: PropTypes.string.isRequired,\r\n label: PropTypes.string,\r\n numeric: PropTypes.bool,\r\n date: PropTypes.bool,\r\n align: PropTypes.oneOf(['left', 'center', 'right']),\r\n columnWidth: PropTypes.number.isRequired,\r\n render: PropTypes.func,\r\n link: PropTypes.func,\r\n })\r\n ).isRequired,\r\n disableHeader: PropTypes.bool,\r\n headerHeight: PropTypes.number,\r\n onRowClick: PropTypes.func,\r\n rowHeight: PropTypes.number,\r\n detailRowRenderer: PropTypes.func,\r\n detailRowHeight: PropTypes.number,\r\n selectAll: PropTypes.func,\r\n allSelected: PropTypes.bool,\r\n contextMenuOptions: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n label: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n })\r\n ),\r\n}\r\n\r\nexport default withStyles(styles)(MuiFiltersSelectAllVirtualizedTable)\r\n","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport ResourceLang from '../../resources/Language'\r\nimport {\r\n AutoSizer,\r\n Column,\r\n Table,\r\n InfiniteLoader,\r\n SortIndicator,\r\n defaultTableRowRenderer,\r\n} from 'react-virtualized'\r\nimport { Link } from 'react-router-dom'\r\nimport {\r\n ContextMenu,\r\n ContextMenuTrigger,\r\n connectMenu,\r\n hideMenu,\r\n} from 'react-contextmenu'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport clsx from 'clsx'\r\nimport {\r\n TableRow,\r\n TableCell,\r\n Tooltip,\r\n Typography,\r\n IconButton,\r\n Paper,\r\n MenuList,\r\n MenuItem,\r\n} from '@material-ui/core'\r\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess'\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore'\r\n\r\nconst styles = (theme) => ({\r\n flexContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n boxSizing: 'border-box',\r\n },\r\n table: {\r\n // temporary right-to-left patch, waiting for\r\n // https://github.com/bvaughn/react-virtualized/issues/454\r\n '& .ReactVirtualized__Table__headerRow': {\r\n flip: false,\r\n paddingRight: theme.direction === 'rtl' ? '0px !important' : undefined,\r\n },\r\n },\r\n tableRow: {\r\n cursor: 'pointer',\r\n },\r\n tableRowHover: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[200],\r\n },\r\n },\r\n tableCell: {\r\n flex: 1,\r\n },\r\n tableFooter: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n footerlabel: {\r\n marginLeft: theme.spacing(3),\r\n },\r\n firstCell: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n noClick: {\r\n cursor: 'initial',\r\n },\r\n})\r\n\r\nconst MENU_TYPE = 'DYNAMIC'\r\nconst collectTriggerProps = (props) => props\r\n\r\nconst DynamicMenu = ({ id, contextMenuOptions, trigger }) => {\r\n const { data } = trigger || {}\r\n\r\n return (\r\n \r\n \r\n \r\n {!trigger\r\n ? null\r\n : contextMenuOptions.map(({ label, onClick }, index) => {\r\n const onMenuItemClick = (e) => {\r\n hideMenu()\r\n onClick(e, data)\r\n }\r\n\r\n return (\r\n \r\n {label}\r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nDynamicMenu.propTypes = {\r\n id: PropTypes.string.isRequired,\r\n contextMenuOptions: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n label: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n })\r\n ).isRequired,\r\n trigger: PropTypes.shape({\r\n data: PropTypes.object.isRequired,\r\n }),\r\n}\r\n\r\nconst ConnectedMenu = connectMenu(MENU_TYPE)(DynamicMenu)\r\n\r\nclass MuiVirtualizedTable extends React.PureComponent {\r\n static defaultProps = {\r\n disableHeader: false,\r\n headerHeight: 48,\r\n rowHeight: 48,\r\n detailRowHeight: 48 * 2,\r\n }\r\n\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n selectedIndex: -1,\r\n }\r\n this.tableRef = React.createRef()\r\n this._isRowLoaded = this._isRowLoaded.bind(this)\r\n this._loadMoreRows = this._loadMoreRows.bind(this)\r\n this._handleExpandClick = this._handleExpandClick.bind(this)\r\n }\r\n\r\n cellRenderer = ({ cellData, columnIndex, rowIndex, rowData }) => {\r\n const { columns, rowHeight, classes } = this.props\r\n const column = columns[columnIndex]\r\n let value = cellData\r\n\r\n if (column.dataKey === '#') {\r\n value =
{rowIndex + 1}
\r\n } else if (column.render) {\r\n value = column.render(rowData)\r\n } else if (column.date === true) {\r\n const date = new Date(cellData)\r\n value = `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`\r\n } else if (column.numeric === true) {\r\n const decimalPlaces = column.decimalPlaces || 2\r\n if (cellData && !isNaN(cellData)) {\r\n value = Number(\r\n Math.round(value + ('e' + decimalPlaces)) + ('e-' + decimalPlaces)\r\n ).toFixed(decimalPlaces)\r\n } else value = '-'\r\n }\r\n\r\n if (column.link) {\r\n value = (\r\n event.stopPropagation()}\r\n to={column.link(rowData)}\r\n >\r\n {value}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {value}\r\n \r\n )\r\n }\r\n\r\n headerRenderer = ({ label, columnIndex, dataKey, sortBy, sortDirection }) => {\r\n const { headerHeight, columns, classes } = this.props\r\n const column = columns[columnIndex]\r\n\r\n let content = ''\r\n if (columnIndex === 0) {\r\n content = (\r\n
\r\n {label}\r\n {sortBy === dataKey && (\r\n \r\n )}\r\n
\r\n )\r\n } else {\r\n content = (\r\n <>\r\n {label}\r\n {sortBy === dataKey && (\r\n \r\n )}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {content}\r\n \r\n )\r\n }\r\n\r\n rowRendererDetailed = (params) => {\r\n const { classes, rowHeight, detailRowHeight, detailRowRenderer } =\r\n this.props\r\n const { index, style, className, key } = params\r\n\r\n if (index === this.state.selectedIndex) {\r\n return (\r\n \r\n {defaultTableRowRenderer({\r\n ...params,\r\n style: { width: '100%', height: rowHeight },\r\n })}\r\n {\r\n let target = event.target\r\n\r\n while (target.getAttribute('role') !== 'row') {\r\n target = target.parentNode\r\n }\r\n\r\n target.previousElementSibling.click()\r\n }}\r\n >\r\n {detailRowRenderer(params, detailRowHeight)}\r\n \r\n \r\n )\r\n } else return defaultTableRowRenderer(params)\r\n }\r\n\r\n renderDetailButton = (width) => {\r\n const { classes, headerHeight, rowHeight } = this.props\r\n const key = 'detailButton'\r\n const disableSort = true\r\n\r\n return (\r\n {\r\n return (\r\n \r\n )\r\n }}\r\n cellRenderer={({ cellData, columnIndex, rowIndex, rowData }) => {\r\n const isSelected = this.state.selectedIndex === rowIndex\r\n const expandIcon = isSelected ? (\r\n \r\n ) : (\r\n \r\n )\r\n const label = isSelected\r\n ? ResourceLang.HideDetails\r\n : ResourceLang.ShowDetails\r\n\r\n return (\r\n \r\n \r\n {\r\n event.stopPropagation()\r\n this._handleExpandClick(rowIndex)\r\n }}\r\n >\r\n {expandIcon}\r\n \r\n \r\n \r\n )\r\n }}\r\n />\r\n )\r\n }\r\n\r\n getRowClassName = ({ index }) => {\r\n const { classes } = this.props\r\n return index !== -1\r\n ? clsx(classes.tableRow, classes.flexContainer, classes.tableRowHover)\r\n : clsx(classes.tableRow, classes.flexContainer)\r\n }\r\n\r\n getHeaderRowClassName = (disableSort) => {\r\n const { classes } = this.props\r\n return clsx([\r\n classes.tableCell,\r\n classes.flexContainer,\r\n disableSort === true ? classes.noClick : classes.tableRow,\r\n ])\r\n }\r\n\r\n getRowHeight = ({ index }) => {\r\n return index === this.state.selectedIndex\r\n ? this.props.detailRowHeight + this.props.rowHeight\r\n : this.props.rowHeight\r\n }\r\n\r\n getColumnAlign = (column) => {\r\n if (column.align) return column.align\r\n\r\n return column.numeric ? 'right' : 'left'\r\n }\r\n\r\n _isRowLoaded(args) {\r\n const obj = this.props.rowGetter(args)\r\n return obj !== undefined\r\n }\r\n\r\n _loadMoreRows(args) {\r\n this.props.onLoadMore(args)\r\n }\r\n\r\n _handleExpandClick(rowIndex) {\r\n const newIndex = this.state.selectedIndex === rowIndex ? -1 : rowIndex\r\n this.setState({ ...this.state, selectedIndex: newIndex })\r\n\r\n if (this.tableRef) {\r\n this.tableRef.recomputeRowHeights()\r\n }\r\n }\r\n\r\n render() {\r\n const {\r\n classes,\r\n columns,\r\n rowHeight,\r\n headerHeight,\r\n disableHeader,\r\n detailRowRenderer,\r\n contextMenuOptions,\r\n ...tableProps\r\n } = this.props\r\n const footerHeight = headerHeight\r\n\r\n const rowContentRenderer = detailRowRenderer\r\n ? this.rowRendererDetailed\r\n : defaultTableRowRenderer\r\n const rowRenderer = !contextMenuOptions\r\n ? rowContentRenderer\r\n : (params) => {\r\n const { style, key, rowData } = params\r\n\r\n return (\r\n \r\n {rowContentRenderer(params)}\r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {({ onRowsRendered, registerChild }) => (\r\n \r\n {({ height, width }) => (\r\n <>\r\n {\r\n this.tableRef = ref\r\n registerChild(ref)\r\n }}\r\n onRowsRendered={onRowsRendered}\r\n height={height - footerHeight}\r\n width={width}\r\n rowHeight={\r\n detailRowRenderer ? this.getRowHeight : rowHeight\r\n }\r\n gridStyle={{ direction: 'inherit' }}\r\n disableHeader={disableHeader}\r\n headerHeight={headerHeight}\r\n className={classes.table}\r\n {...tableProps}\r\n rowRenderer={rowRenderer}\r\n rowClassName={this.getRowClassName}\r\n >\r\n {columns.map(\r\n ({ dataKey, columnWidth, ...other }, index) => {\r\n const cellWidth = columnWidth * width\r\n return (\r\n \r\n this.headerRenderer({\r\n ...headerProps,\r\n columnIndex: index,\r\n })\r\n }\r\n className={classes.flexContainer}\r\n cellRenderer={this.cellRenderer}\r\n dataKey={dataKey}\r\n width={cellWidth}\r\n {...other}\r\n />\r\n )\r\n }\r\n )}\r\n {detailRowRenderer ? this.renderDetailButton(width) : null}\r\n \r\n \r\n \r\n {this.props.totalRows} {ResourceLang.items}\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n {contextMenuOptions ? (\r\n \r\n ) : null}\r\n \r\n )\r\n }\r\n}\r\n\r\nMuiVirtualizedTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n columns: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n dataKey: PropTypes.string.isRequired,\r\n label: PropTypes.string,\r\n numeric: PropTypes.bool,\r\n date: PropTypes.bool,\r\n align: PropTypes.oneOf(['left', 'center', 'right']),\r\n columnWidth: PropTypes.number.isRequired,\r\n render: PropTypes.func,\r\n link: PropTypes.func,\r\n })\r\n ).isRequired,\r\n disableHeader: PropTypes.bool,\r\n headerHeight: PropTypes.number,\r\n onRowClick: PropTypes.func,\r\n rowHeight: PropTypes.number,\r\n detailRowRenderer: PropTypes.func,\r\n detailRowHeight: PropTypes.number,\r\n contextMenuOptions: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n label: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n })\r\n ),\r\n}\r\n\r\nexport default withStyles(styles)(MuiVirtualizedTable)\r\n","const DEVICE_KEYS = {\r\n CURRENT_VERSION: 'current_firmware_version',\r\n UPDATE_VERSION: 'update_firmware_version',\r\n UPDATE_REQUEST_DATE_VERSION: 'update_request_date',\r\n DEVICE_ID: 'device_id',\r\n SERIAL_NUMBER: 'serial_number',\r\n FIRMWARE_DOWNLOAD_ATEMPTS: 'firmware_download_atempts',\r\n FIRMWARE_ID: 'firmware_id'\r\n}\r\n\r\nconst SETTINGS_TYPE = {\r\n APN: 1,\r\n NTP: 2\r\n}\r\n\r\nconst DEVICE_VERSION_VALUES = {\r\n V1:\"V1\",\r\n V2:\"V2\",\r\n V3:\"V3\",\r\n V4: \"V4\"\r\n};\r\n\r\nexport const DEVICE_KEYS_ENUM = Object.freeze(DEVICE_KEYS);\r\nexport const DEVICE_VERSION_VALUES_ENUM = Object.freeze(DEVICE_VERSION_VALUES);\r\nexport const SETTINGS_TYPE_ENUM = Object.freeze(SETTINGS_TYPE);","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport ResourceLang from '../../resources/Language'\r\nimport { getDateTimeStringFormat, is12Hours } from '../../utils/DateServices'\r\nimport {\r\n Grid,\r\n Popover,\r\n Typography,\r\n TextField,\r\n LinearProgress,\r\n FormControl,\r\n IconButton,\r\n InputAdornment,\r\n} from '@material-ui/core'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport { Autocomplete } from '@material-ui/lab'\r\nimport { DateTimePicker, MuiPickersUtilsProvider } from '@material-ui/pickers'\r\nimport MomentUtils from '@date-io/moment'\r\nimport EventIcon from '@material-ui/icons/Event'\r\n//TODO: update @date-io/moment to lastest version after @material-ui/pickers 4 has been released.\r\n\r\nconst styles = (theme) => ({\r\n container: {\r\n padding: theme.spacing(2),\r\n maxWidth: 1000,\r\n minWidth: 400,\r\n marginBottom: 20,\r\n },\r\n formControl: {\r\n width: '100%',\r\n minWidth: 200,\r\n },\r\n option: {\r\n fontSize: 15,\r\n '& > span': {\r\n marginRight: 10,\r\n fontSize: 18,\r\n },\r\n },\r\n})\r\n\r\nconst FilterPopover = ({\r\n filters,\r\n classes,\r\n anchorEl,\r\n updateAnchorEl,\r\n onChange,\r\n}) => {\r\n const renderFilter = (filter, isLoading) => {\r\n switch (filter.type) {\r\n case 'select':\r\n return renderSelectFilter(filter, isLoading)\r\n default:\r\n case 'text':\r\n return renderTextFilter(filter, isLoading)\r\n case 'date':\r\n return renderDateFilter(filter, isLoading)\r\n }\r\n }\r\n\r\n const renderSelectFilter = (filter, isLoading) => {\r\n const { key, label, options, value = [], multiple } = filter\r\n\r\n return (\r\n option.name}\r\n getOptionSelected={(option) => {\r\n const target = value.find((x) => x.value === option.value)\r\n return target != null ? true : false\r\n }}\r\n disabled={isLoading}\r\n value={value}\r\n onChange={(event, newValue) => {\r\n const result =\r\n !multiple && newValue.length === 2 ? [newValue[1]] : newValue\r\n handleValueChange(result, key)\r\n }}\r\n renderInput={(params) => (\r\n \r\n )}\r\n />\r\n )\r\n }\r\n\r\n const renderTextFilter = (filter, isLoading) => {\r\n const { key, label, value, options } = filter\r\n\r\n return (\r\n {\r\n return option && typeof option === 'object' ? option.name : option\r\n }}\r\n disabled={isLoading}\r\n value={value == null ? '' : value}\r\n onInputChange={(event, newValue) =>\r\n handleValueChange(\r\n newValue && typeof newValue === 'object' ? newValue.name : newValue,\r\n key\r\n )\r\n }\r\n renderInput={(params) => (\r\n \r\n )}\r\n />\r\n )\r\n }\r\n\r\n const renderDateFilter = (filter, isLoading) => {\r\n const { key, label, value, maxValueKey, minValueKey } = filter\r\n const is12Hour = is12Hours(value || new Date())\r\n let maxDate = undefined\r\n let minDate = undefined\r\n\r\n if (maxValueKey) {\r\n const target = filters.find((x) => x.key === maxValueKey)\r\n maxDate = target && target.value ? target.value : undefined\r\n }\r\n\r\n if (minValueKey) {\r\n const target = filters.find((x) => x.key === minValueKey)\r\n minDate = target && target.value ? target.value : undefined\r\n }\r\n\r\n return (\r\n \r\n \r\n handleValueChange(date.toDate(), key)}\r\n labelFunc={(date) => {\r\n return date ? getDateTimeStringFormat(date.toDate()) : ''\r\n }}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n strictCompareDates={true}\r\n InputProps={{\r\n endAdornment: (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n }}\r\n />\r\n \r\n \r\n )\r\n }\r\n\r\n const handleValueChange = (newValue, key) => {\r\n const newFilters = [...filters]\r\n const target = newFilters.find((x) => x.key === key)\r\n\r\n if (target) {\r\n target.value = newValue\r\n }\r\n\r\n onChange(newFilters)\r\n }\r\n\r\n const renderContent = () => {\r\n let loadingSpinner = null\r\n let isLoading = false\r\n\r\n if (anchorEl) {\r\n //gather data if necessary\r\n const optionsToGet = filters.filter((x) => x.getOptions && !x.options)\r\n\r\n if (optionsToGet.length > 0) {\r\n const promisses = optionsToGet.map((x) => x.getOptions())\r\n Promise.all(promisses).then((responses) => {\r\n const newFilters = [...filters]\r\n\r\n for (let i = 0; i < optionsToGet.length; i++) {\r\n const target = newFilters.find((x) => x.key === optionsToGet[i].key)\r\n if (target) {\r\n target.options = responses[i] || []\r\n }\r\n }\r\n\r\n onChange(newFilters)\r\n })\r\n\r\n isLoading = true\r\n loadingSpinner = \r\n }\r\n }\r\n\r\n const xsSize = filters.length >= 2 ? 6 : 12\r\n const mdSize = filters.length >= 3 ? 6 : xsSize\r\n\r\n return (\r\n \r\n \r\n {ResourceLang.Filters}\r\n {loadingSpinner}\r\n \r\n {filters.map((item) => {\r\n return (\r\n \r\n {renderFilter(item, isLoading)}\r\n \r\n )\r\n })}\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n updateAnchorEl(null)\r\n }}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'center',\r\n }}\r\n transformOrigin={{\r\n vertical: 'top',\r\n horizontal: 'center',\r\n }}\r\n >\r\n
{renderContent()}
\r\n \r\n )\r\n}\r\n\r\nFilterPopover.propTypes = {\r\n filters: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n label: PropTypes.string.isRequired,\r\n type: PropTypes.oneOf(['date', 'text', 'select']),\r\n options: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\r\n .isRequired,\r\n })\r\n ),\r\n getOptions: PropTypes.func,\r\n value: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.number,\r\n PropTypes.instanceOf(Date),\r\n PropTypes.arrayOf(\r\n PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\r\n .isRequired,\r\n })\r\n ),\r\n ]),\r\n multiple: PropTypes.bool,\r\n maxValueKey: PropTypes.string,\r\n minValueKey: PropTypes.string,\r\n })\r\n ).isRequired,\r\n anchorEl: PropTypes.oneOfType([\r\n PropTypes.instanceOf(Element),\r\n PropTypes.func,\r\n ]),\r\n updateAnchorEl: PropTypes.func.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n}\r\n\r\nexport default withStyles(styles)(FilterPopover)\r\n","export function getLocalDateTimeString(value){\r\n if(!value || value === '')\r\n return '';\r\n\r\n const date = (typeof(value) === 'string' || typeof(value) === 'number' ?\r\n new Date(value) : value);\r\n\r\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\r\n}\r\n\r\nexport function getDateTimeStringFormat(date){\r\n if(date === null || date === undefined || date === '')\r\n return '';\r\n \r\n return date.toLocaleDateString() + \" \" + date.toLocaleTimeString();\r\n}\r\n\r\nexport function is12Hours(date) {\r\n return date.toLocaleTimeString().match(/am|pm/i);\r\n}\r\n\r\nexport function addDays (date, days) {\r\n const newDate = new Date(date);\r\n newDate.setDate(date.getDate() + days);\r\n return newDate;\r\n}\r\n\r\nexport function addMonths (date, moths) {\r\n const newDate = new Date(date);\r\n newDate.setMonth(date.getMonth() + moths);\r\n return newDate;\r\n}\r\n\r\n\r\n","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport FilterListIcon from '@material-ui/icons/FilterList'\r\nimport FilterPopover from '../filters/FilterPopover'\r\nimport Tooltip from '@material-ui/core/Tooltip'\r\nimport { IconButton } from '@material-ui/core'\r\nimport ResourceLang from '../../resources/Language'\r\n\r\nconst styles = () => ({\r\n header: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n height: '2rem',\r\n alignItems: 'center',\r\n backgroundColor: 'rgba(0, 0, 0, 0.05)',\r\n border: '1px solid rgba(0, 0, 0, 0.15)',\r\n borderRadius: '0.5vh',\r\n },\r\n title: {\r\n fontWeight: 'bold',\r\n fontSize: '14px',\r\n },\r\n leftCell: {\r\n marginLeft: '1.5rem',\r\n marginRight: 'auto',\r\n },\r\n rightCell: {\r\n marginRight: '1.5rem',\r\n marginLeft: 'auto',\r\n },\r\n})\r\n\r\nconst TableHeader = ({\r\n tableTitle,\r\n filters,\r\n anchorEl,\r\n updateAnchorEl,\r\n setFilters,\r\n classes,\r\n showFilters,\r\n}) => {\r\n return (\r\n <>\r\n
\r\n
\r\n {tableTitle}\r\n
\r\n {showFilters === false ? (\r\n <>\r\n ) : (\r\n <>\r\n
\r\n \r\n updateAnchorEl(event.currentTarget)}\r\n >\r\n \r\n \r\n \r\n \r\n
\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n\r\nTableHeader.propTypes = {\r\n tableTitle: PropTypes.string,\r\n filters: PropTypes.array.isRequired,\r\n anchorEl: PropTypes.oneOfType([\r\n PropTypes.instanceOf(Element),\r\n PropTypes.func,\r\n ]),\r\n updateAnchorEl: PropTypes.func.isRequired,\r\n setFilters: PropTypes.func.isRequired,\r\n showFilters: PropTypes.bool,\r\n}\r\n\r\nexport default withStyles(styles)(TableHeader)\r\n","import React, { useEffect, useState } from 'react'\r\nimport ResourceLang from '../../resources/Language'\r\nimport { withRouter } from 'react-router'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport Checkbox from '@material-ui/core/Checkbox'\r\nimport { compareValues } from '../../utils/BrowserServices'\r\nimport MuiFiltersSelectAllVirtualizedTable from '../tables/MuiFiltersSelectAllVirtualizedTable'\r\nimport MuiVirtualizedTable from '../tables/MuiVirtualizedTable'\r\nimport CircularLoading from '../loadings/CircularLoading'\r\nimport { SortDirection } from 'react-virtualized'\r\nimport PropTypes from 'prop-types'\r\nimport { DEVICE_KEYS_ENUM } from '../../utils/Enums'\r\nimport TableHeader from '../tables/TableHeader'\r\n\r\nconst SelectDevices = ({\r\n devices,\r\n selectedDevices,\r\n availableVersions,\r\n filteredAvailableVersions,\r\n handleSelection,\r\n handleAllSelections,\r\n isLoading,\r\n currentVersions,\r\n updateVersions,\r\n handleFilters,\r\n}) => {\r\n const pageHeight = window.innerHeight\r\n const percentageOffSet = 0.45\r\n const [versionsSort, setVersionsSort] = useState({\r\n sortBy: DEVICE_KEYS_ENUM.CURRENT_VERSION,\r\n sortDirection: 'DESC',\r\n })\r\n const [devicesSort, setDevicesSort] = useState({\r\n sortBy: DEVICE_KEYS_ENUM.SERIAL_NUMBER,\r\n sortDirection: 'DESC',\r\n })\r\n const [allSelected, setAllSelected] = useState(false)\r\n\r\n const [anchorEl, updateAnchorEl] = useState(null)\r\n const [filters, setFilters] = useState([\r\n {\r\n key: 'current_version',\r\n label: ResourceLang.current_version,\r\n type: 'select',\r\n options: currentVersions,\r\n },\r\n {\r\n key: 'update_version',\r\n label: ResourceLang.update_version,\r\n type: 'select',\r\n options: updateVersions,\r\n },\r\n ])\r\n\r\n useEffect(() => {\r\n filters.forEach((filter) => {\r\n if (filter.key === 'current_version') {\r\n filter.options = currentVersions\r\n }\r\n\r\n if (filter.key === 'update_version') {\r\n filter.options = updateVersions\r\n }\r\n })\r\n }, [currentVersions, updateVersions, filters])\r\n\r\n useEffect(() => {\r\n handleFilters(filters)\r\n }, [filters, handleFilters])\r\n\r\n const handleSelectDevice = (rowData, event) => {\r\n handleSelection(rowData, event.target.checked)\r\n }\r\n\r\n const isSelected = (rowData) => {\r\n const isChecked = selectedDevices.some(function (device) {\r\n return device.device_id === rowData.device_id\r\n })\r\n\r\n return isChecked\r\n }\r\n\r\n const getTableItems = (items, sort) => {\r\n if (sort.sortDirection === SortDirection.ASC) {\r\n items.sort((a, b) => compareValues(b[sort.sortBy], a[sort.sortBy]))\r\n } else {\r\n items.sort((a, b) => compareValues(a[sort.sortBy], b[sort.sortBy]))\r\n }\r\n return items\r\n }\r\n\r\n const selectAll = (event) => {\r\n handleAllSelections(devices, event.target.checked)\r\n setAllSelected(event.target.checked)\r\n }\r\n\r\n const renderDevicesTable = () => {\r\n if (devices !== undefined && devices.length > 0) {\r\n const columns = [\r\n {\r\n columnWidth: 35,\r\n label: '#',\r\n dataKey: DEVICE_KEYS_ENUM.DEVICE_ID,\r\n disableSort: true,\r\n render: (rowData) => {\r\n return (\r\n {\r\n handleSelectDevice(rowData, e)\r\n }}\r\n color='primary'\r\n checked={isSelected(rowData)}\r\n />\r\n )\r\n },\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.serial_number,\r\n dataKey: DEVICE_KEYS_ENUM.SERIAL_NUMBER,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 60,\r\n label: ResourceLang.current_version,\r\n dataKey: DEVICE_KEYS_ENUM.CURRENT_VERSION,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 60,\r\n label: ResourceLang.update_version,\r\n dataKey: DEVICE_KEYS_ENUM.UPDATE_VERSION,\r\n disableSort: false,\r\n },\r\n ]\r\n\r\n const handleSort = (event) => {\r\n setDevicesSort({\r\n sortBy: event.sortBy,\r\n sortDirection: event.sortDirection,\r\n })\r\n }\r\n\r\n const tableItems = getTableItems(devices, devicesSort)\r\n\r\n return (\r\n <>\r\n \r\n tableItems[index]}\r\n sort={handleSort}\r\n sortBy={devicesSort.sortBy}\r\n sortDirection={devicesSort.sortDirection}\r\n onRowClick={() => {}}\r\n onLoadMore={() => {}}\r\n columns={columns}\r\n selectAll={selectAll}\r\n allSelected={allSelected}\r\n />\r\n \r\n )\r\n } else {\r\n return <>\r\n }\r\n }\r\n\r\n const handleAvailableVersions = (index) => {\r\n return filteredAvailableVersions[index]\r\n }\r\n\r\n const renderVersionsTable = () => {\r\n if (!availableVersions !== undefined && availableVersions.length > 0) {\r\n const columns = [\r\n {\r\n columnWidth: 50,\r\n label: ResourceLang.available_versions,\r\n dataKey: DEVICE_KEYS_ENUM.CURRENT_VERSION,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.creation_date,\r\n dataKey: DEVICE_KEYS_ENUM.UPDATE_REQUEST_DATE_VERSION,\r\n disableSort: false,\r\n },\r\n ]\r\n\r\n const handleSort = (event) => {\r\n setVersionsSort({\r\n sortBy: event.sortBy,\r\n sortDirection: event.sortDirection,\r\n })\r\n }\r\n\r\n const tableItems = getTableItems(filteredAvailableVersions, versionsSort)\r\n\r\n return (\r\n <>\r\n \r\n handleAvailableVersions(index)}\r\n sort={handleSort}\r\n sortBy={versionsSort.sortBy}\r\n sortDirection={versionsSort.sortDirection}\r\n columns={columns}\r\n />\r\n \r\n )\r\n } else {\r\n return <>\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {isLoading === false ? renderDevicesTable() : }\r\n \r\n \r\n {isLoading === false ? renderVersionsTable() : }\r\n \r\n \r\n )\r\n}\r\n\r\nSelectDevices.propTypes = {\r\n devices: PropTypes.array.isRequired,\r\n selectedDevices: PropTypes.array.isRequired,\r\n availableVersions: PropTypes.array.isRequired,\r\n filteredAvailableVersions: PropTypes.array.isRequired,\r\n handleSelection: PropTypes.func.isRequired,\r\n isLoading: PropTypes.bool,\r\n currentVersions: PropTypes.array,\r\n updateVersions: PropTypes.array,\r\n handleFilters: PropTypes.func,\r\n}\r\n\r\nexport default withRouter(SelectDevices)\r\n","import React, { useEffect } from 'react'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport { withRouter } from 'react-router'\r\nimport Button from '@material-ui/core/Button'\r\nimport ResourceLang from '../../resources/Language'\r\nimport DialogStepper from '../stepper/DialogStepper'\r\nimport { FirmwareAPI } from '../../utils/APIRequester'\r\nimport CircularLoading from '../loadings/CircularLoading'\r\nimport SelectVersions from './SelectVersions'\r\nimport UpdateReview from './UpdateReview'\r\nimport SelectDevices from './SelectDevices'\r\nimport PropTypes from 'prop-types'\r\nimport { DEVICE_KEYS_ENUM } from '../../utils/Enums'\r\nimport { getLocalDateTimeString } from '../../utils/DateServices'\r\n\r\nconst SELECT_DEVICES_STEP = 0\r\nconst SELECT_VERSION_STEP = 1\r\nconst REVIEW_STEP = 2\r\n\r\nfunction getSteps() {\r\n return [\r\n ResourceLang.device_to_be_upgraded,\r\n ResourceLang.version_choose,\r\n ResourceLang.review_and_confirmation,\r\n ]\r\n}\r\n\r\nconst fwFilenameToVersion = (microController, filename) => {\r\n let versionName = filename.substr(0, filename.indexOf('.'))\r\n\r\n try {\r\n if (microController.toUpperCase() === 'COM' && versionName.length >= 3) {\r\n versionName = parseInt(versionName.substr(0, 3))\r\n } else if (\r\n microController.toUpperCase() === 'MEA' &&\r\n versionName.length >= 6\r\n ) {\r\n versionName = parseInt(versionName.substr(3, 3))\r\n }\r\n } catch (ex) {\r\n console.error(ex.message)\r\n return ResourceLang.invalid_fw_version\r\n }\r\n\r\n if (Number.isNaN(versionName)) {\r\n return ResourceLang.invalid_fw_version\r\n }\r\n\r\n return versionName\r\n}\r\n\r\nconst UpdateFirmwarePanel = ({\r\n match,\r\n deviceTypeName,\r\n deviceVersion,\r\n microController,\r\n closePanel,\r\n}) => {\r\n const [state, setState] = React.useState({\r\n devices: [],\r\n fullDevices: [],\r\n activeStep: 0,\r\n disableNext: true,\r\n disableBack: true,\r\n error: false,\r\n isLoading: true,\r\n devicesIsLoading: true,\r\n updateRequestVersion: undefined,\r\n selectedDevices: [],\r\n availableVersions: [],\r\n filteredAvailableVersions: [],\r\n filterCurrentVersion: null,\r\n filterUpdateVersion: null,\r\n currentVersions: [],\r\n updateVersions: [],\r\n })\r\n\r\n const envID = match.params.envId\r\n const steps = getSteps()\r\n\r\n const closeWithError = React.useCallback(\r\n (message) => {\r\n closePanel('error', message)\r\n },\r\n [closePanel]\r\n )\r\n\r\n const prepareFirmwareVersions = React.useCallback(\r\n (rawVersions) => {\r\n const versions = rawVersions.map(function (curVersion) {\r\n var version = {}\r\n\r\n version[DEVICE_KEYS_ENUM.UPDATE_REQUEST_DATE_VERSION] =\r\n getLocalDateTimeString(curVersion.creation_date)\r\n version[DEVICE_KEYS_ENUM.CURRENT_VERSION] = fwFilenameToVersion(\r\n microController,\r\n curVersion.filename\r\n )\r\n\r\n return version\r\n })\r\n\r\n if (versions.length === 0) {\r\n closeWithError(ResourceLang.no_versions)\r\n return undefined\r\n }\r\n\r\n return versions\r\n },\r\n [closeWithError, microController]\r\n )\r\n\r\n const prepareDevices = React.useCallback(\r\n (rawDevices) => {\r\n const devices = rawDevices.map(function (curDevice) {\r\n var device = {}\r\n device[DEVICE_KEYS_ENUM.DEVICE_ID] = curDevice.device_id\r\n device[DEVICE_KEYS_ENUM.SERIAL_NUMBER] = curDevice.serial_number\r\n\r\n var curFirmware = curDevice.device_firmware.filter(function (\r\n curMicrocontroller\r\n ) {\r\n return curMicrocontroller.firmware_id === microController\r\n })\r\n\r\n device[DEVICE_KEYS_ENUM.CURRENT_VERSION] =\r\n curFirmware[0].current_firmware_version\r\n device[DEVICE_KEYS_ENUM.UPDATE_VERSION] =\r\n curFirmware[0].update_firmware_version\r\n device[DEVICE_KEYS_ENUM.UPDATE_REQUEST_DATE_VERSION] =\r\n curFirmware[0].update_request_date\r\n device[DEVICE_KEYS_ENUM.FIRMWARE_DOWNLOAD_ATEMPTS] =\r\n curFirmware[0].firmware_download_atempts\r\n device[DEVICE_KEYS_ENUM.FIRMWARE_ID] = curFirmware[0].firmware_id\r\n\r\n return device\r\n })\r\n\r\n if (devices.length === 0) {\r\n closeWithError(ResourceLang.no_devices)\r\n return undefined\r\n }\r\n\r\n return devices\r\n },\r\n [closeWithError, microController]\r\n )\r\n\r\n const getCurrentVersions = () => {\r\n var currentVersions = []\r\n var devices = state.fullDevices\r\n\r\n if (\r\n state.filterUpdateVersion &&\r\n state.filterUpdateVersion !== null &&\r\n state.filterUpdateVersion.length > 0 &&\r\n state.filterUpdateVersion[0].value\r\n ) {\r\n devices = devices.filter(function (f) {\r\n return f.update_firmware_version === state.filterUpdateVersion[0].value\r\n })\r\n }\r\n\r\n devices.forEach(function (device) {\r\n var curr = currentVersions.findIndex(\r\n (x) => x.name == device.current_firmware_version\r\n )\r\n if (curr <= -1) {\r\n currentVersions.push({\r\n name: device.current_firmware_version,\r\n value: device.current_firmware_version,\r\n })\r\n }\r\n })\r\n return versionsSort(currentVersions)\r\n }\r\n\r\n const getUpdateVersions = () => {\r\n var updateVersions = []\r\n var devices = state.fullDevices\r\n\r\n if (\r\n state.filterCurrentVersion &&\r\n state.filterCurrentVersion !== null &&\r\n state.filterCurrentVersion.length > 0 &&\r\n state.filterCurrentVersion[0].value\r\n ) {\r\n devices = devices.filter(function (f) {\r\n return (\r\n f.current_firmware_version === state.filterCurrentVersion[0].value\r\n )\r\n })\r\n }\r\n\r\n devices.forEach(function (device) {\r\n var curr = updateVersions.findIndex(\r\n (x) => x.name == device.update_firmware_version\r\n )\r\n if (curr <= -1) {\r\n updateVersions.push({\r\n name: device.update_firmware_version,\r\n value: device.update_firmware_version,\r\n })\r\n }\r\n })\r\n return versionsSort(updateVersions)\r\n }\r\n\r\n const versionsSort = (versions) => {\r\n return versions.sort(function (a, b) {\r\n if (a.name < b.name) {\r\n return -1\r\n }\r\n if (a.name > b.name) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n }\r\n\r\n const handleFilters = (filters) => {\r\n filters.forEach((filter) => {\r\n if (\r\n filter.key === 'current_version' &&\r\n filter.value !== state.filterCurrentVersion\r\n ) {\r\n setState((prevState) => ({\r\n ...prevState,\r\n filterCurrentVersion: filter.value,\r\n }))\r\n }\r\n\r\n if (\r\n filter.key === 'update_version' &&\r\n filter.value !== state.filterUpdateVersion\r\n ) {\r\n setState((prevState) => ({\r\n ...prevState,\r\n filterUpdateVersion: filter.value,\r\n }))\r\n }\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n if (\r\n state.filterCurrentVersion &&\r\n state.filterCurrentVersion !== null &&\r\n state.filterCurrentVersion.length > 0 &&\r\n state.filterCurrentVersion[0].value\r\n ) {\r\n var devices = state.devices.filter(function (f) {\r\n return (\r\n f.current_firmware_version === state.filterCurrentVersion[0].value\r\n )\r\n })\r\n setState((prevState) => ({ ...prevState, devices: devices }))\r\n } else if (\r\n state.filterCurrentVersion &&\r\n state.filterCurrentVersion !== null &&\r\n state.filterCurrentVersion.length === 0\r\n ) {\r\n if (\r\n state.filterUpdateVersion &&\r\n state.filterUpdateVersion !== null &&\r\n state.filterUpdateVersion.length > 0 &&\r\n state.filterUpdateVersion[0].value\r\n ) {\r\n var devices = state.fullDevices.filter(function (f) {\r\n return (\r\n f.update_firmware_version === state.filterUpdateVersion[0].value\r\n )\r\n })\r\n setState((prevState) => ({ ...prevState, devices: devices }))\r\n } else {\r\n setState((prevState) => ({ ...prevState, devices: state.fullDevices }))\r\n }\r\n }\r\n }, [state.filterCurrentVersion])\r\n\r\n useEffect(() => {\r\n if (\r\n state.filterUpdateVersion &&\r\n state.filterUpdateVersion !== null &&\r\n state.filterUpdateVersion.length > 0 &&\r\n state.filterUpdateVersion[0].value\r\n ) {\r\n var devices = state.devices.filter(function (f) {\r\n return f.update_firmware_version === state.filterUpdateVersion[0].value\r\n })\r\n setState((prevState) => ({ ...prevState, devices: devices }))\r\n } else if (\r\n state.filterUpdateVersion &&\r\n state.filterUpdateVersion !== null &&\r\n state.filterUpdateVersion.length === 0\r\n ) {\r\n if (\r\n state.filterCurrentVersion &&\r\n state.filterCurrentVersion !== null &&\r\n state.filterCurrentVersion.length > 0 &&\r\n state.filterCurrentVersion[0].value\r\n ) {\r\n var devices = state.fullDevices.filter(function (f) {\r\n return (\r\n f.current_firmware_version === state.filterCurrentVersion[0].value\r\n )\r\n })\r\n setState((prevState) => ({ ...prevState, devices: devices }))\r\n } else {\r\n setState((prevState) => ({\r\n ...prevState,\r\n devices: state.fullDevices,\r\n }))\r\n }\r\n }\r\n }, [state.filterUpdateVersion])\r\n\r\n const getAllData = React.useCallback(() => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n devicesIsLoading: true,\r\n }))\r\n\r\n Promise.all([\r\n FirmwareAPI.getDevicesByFamily(\r\n envID,\r\n deviceTypeName,\r\n deviceVersion,\r\n microController\r\n ),\r\n FirmwareAPI.getAllVersions(\r\n envID,\r\n deviceTypeName,\r\n deviceVersion,\r\n microController\r\n ),\r\n ])\r\n .then((responses) => {\r\n var devices = []\r\n var versions = []\r\n if (responses[0] && Array.isArray(responses[0])) {\r\n devices = prepareDevices(responses[0])\r\n }\r\n if (responses[1] && Array.isArray(responses[1])) {\r\n versions = prepareFirmwareVersions(responses[1])\r\n }\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n devicesIsLoading: false,\r\n devices: devices,\r\n fullDevices: devices,\r\n availableVersions: versions,\r\n filteredAvailableVersions: versions,\r\n }))\r\n })\r\n .catch((error) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n devicesIsLoading: false,\r\n }))\r\n closeWithError(ResourceLang.generic_error)\r\n })\r\n }, [\r\n prepareDevices,\r\n closeWithError,\r\n prepareFirmwareVersions,\r\n envID,\r\n deviceTypeName,\r\n deviceVersion,\r\n microController,\r\n ])\r\n\r\n useEffect(() => {\r\n const load = async () => {\r\n getAllData()\r\n }\r\n\r\n load()\r\n }, [getAllData])\r\n\r\n const updateDeviceFirmware = (selectedDevices) => {\r\n const devices = selectedDevices.map(function (curDevice) {\r\n curDevice[DEVICE_KEYS_ENUM.UPDATE_VERSION] = state.updateRequestVersion\r\n return curDevice\r\n })\r\n\r\n const formData = new FormData()\r\n formData.append('devices', JSON.stringify(devices))\r\n FirmwareAPI.updateDeviceFirmware(envID, formData)\r\n .then((response) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n selectedDevices: devices,\r\n }))\r\n })\r\n .catch((error) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n }))\r\n closePanel('error', error)\r\n })\r\n }\r\n\r\n const handleNext = () => {\r\n if (state.activeStep === REVIEW_STEP) {\r\n updateDeviceFirmware(state.selectedDevices)\r\n setState((prevState) => ({\r\n ...prevState,\r\n activeStep: 0,\r\n }))\r\n\r\n closePanel('success', ResourceLang.update_with_success)\r\n } else if (state.activeStep === SELECT_VERSION_STEP) {\r\n setState((prevState) => ({\r\n ...prevState,\r\n activeStep: state.activeStep + 1,\r\n disableNext: false,\r\n }))\r\n } else {\r\n setState((prevState) => ({\r\n ...prevState,\r\n activeStep: state.activeStep + 1,\r\n disableBack: false,\r\n disableNext: true,\r\n }))\r\n }\r\n }\r\n\r\n const handleBack = () => {\r\n if (state.activeStep === SELECT_VERSION_STEP) {\r\n setState((prevState) => ({\r\n ...prevState,\r\n selectedDevices: [],\r\n filteredAvailableVersions: state.availableVersions,\r\n disableBack: true,\r\n disableNext: true,\r\n }))\r\n } else if (state.activeStep === REVIEW_STEP) {\r\n setState((prevState) => ({\r\n ...prevState,\r\n updateRequestVersion: undefined,\r\n disableNext: true,\r\n }))\r\n }\r\n setState((prevState) => ({\r\n ...prevState,\r\n activeStep: state.activeStep - 1,\r\n }))\r\n }\r\n\r\n const setUploadRequestVersion = (requestVersion) => {\r\n if (requestVersion !== undefined) {\r\n setState((prevState) => ({\r\n ...prevState,\r\n updateRequestVersion: requestVersion,\r\n disableNext: false,\r\n }))\r\n }\r\n }\r\n\r\n const getHigherFirmwareVersionsToUpdate = (devices) => {\r\n return devices.reduce(\r\n (maxVersion, curDevice) =>\r\n curDevice[DEVICE_KEYS_ENUM.CURRENT_VERSION] > maxVersion\r\n ? curDevice[DEVICE_KEYS_ENUM.CURRENT_VERSION]\r\n : maxVersion,\r\n devices[0][DEVICE_KEYS_ENUM.CURRENT_VERSION]\r\n )\r\n }\r\n\r\n const checkAvailableVersionsForDevice = (devices) => {\r\n var canClickNextButton = false\r\n var actualVersions = state.availableVersions\r\n var maxVersion = undefined\r\n if (devices.length > 0) {\r\n maxVersion = getHigherFirmwareVersionsToUpdate(devices)\r\n actualVersions = actualVersions.filter(\r\n (item) => Number(item.current_firmware_version) > Number(maxVersion)\r\n )\r\n\r\n if (actualVersions.length > 0) {\r\n canClickNextButton = true\r\n }\r\n setState((prevState) => ({\r\n ...prevState,\r\n selectedDevices: devices,\r\n filteredAvailableVersions: actualVersions,\r\n disableNext: !canClickNextButton,\r\n }))\r\n } else {\r\n setState((prevState) => ({\r\n ...prevState,\r\n selectedDevices: devices,\r\n filteredAvailableVersions: actualVersions,\r\n disableNext: true,\r\n }))\r\n }\r\n return canClickNextButton\r\n }\r\n\r\n const setDeviceSelected = (rowData, isChecked) => {\r\n var devices = state.selectedDevices\r\n\r\n if (isChecked === true) {\r\n devices.push(rowData)\r\n } else {\r\n devices = state.selectedDevices.filter(function (device) {\r\n return device.device_id !== rowData.device_id\r\n })\r\n }\r\n\r\n return devices\r\n }\r\n\r\n const handleSelection = (rowData, isChecked) => {\r\n if (rowData !== undefined) {\r\n const devices = setDeviceSelected(rowData, isChecked)\r\n checkAvailableVersionsForDevice(devices)\r\n }\r\n }\r\n\r\n const handleAllSelections = (rowData, isChecked) => {\r\n var devices = []\r\n\r\n if (isChecked === true) {\r\n devices = rowData\r\n }\r\n\r\n checkAvailableVersionsForDevice(devices)\r\n }\r\n\r\n const renderBody = () => {\r\n switch (state.activeStep) {\r\n case SELECT_DEVICES_STEP:\r\n return (\r\n \r\n )\r\n case SELECT_VERSION_STEP:\r\n return (\r\n \r\n )\r\n case REVIEW_STEP:\r\n return (\r\n \r\n )\r\n default:\r\n return <>\r\n }\r\n }\r\n\r\n const renderContent = () => {\r\n return (\r\n
\r\n \r\n {renderBody()}\r\n {state.isLoading === false ? <> : }\r\n
\r\n )\r\n }\r\n\r\n const renderFooter = () => {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n <>{ResourceLang.back}\r\n \r\n \r\n {state.activeStep === steps.length - 1 ? 'submit' : 'next'}\r\n \r\n
\r\n
\r\n
\r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n {renderContent()}\r\n {renderFooter()}\r\n \r\n \r\n )\r\n}\r\n\r\nUpdateFirmwarePanel.propTypes = {\r\n match: PropTypes.object.isRequired,\r\n deviceTypeName: PropTypes.string.isRequired,\r\n deviceVersion: PropTypes.string.isRequired,\r\n microController: PropTypes.string.isRequired,\r\n closePanel: PropTypes.func.isRequired,\r\n}\r\n\r\nexport default withRouter(UpdateFirmwarePanel)\r\n","import React, { useState, useEffect } from 'react'\r\nimport { withRouter } from 'react-router'\r\nimport PageHeader from '../components/headers/PageHeader'\r\nimport { Typography, Divider, Chip } from '@material-ui/core'\r\nimport DeviceMenuItems from '../components/MenuItems/MenuItems'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport ResourceLang from '../resources/Language'\r\nimport { FirmwareAPI } from '../utils/APIRequester'\r\nimport MessageSnackbar from '../components/notifications/MessageSnackbar'\r\nimport ExtensionIcon from '@material-ui/icons/Extension'\r\nimport MemoryIcon from '@material-ui/icons/Memory'\r\nimport DevicesOtherIcon from '@material-ui/icons/DevicesOther'\r\nimport PageLoading from '../components/loadings/PageLoading'\r\nimport UpdateFirmwarePanel from '../components/panels/UpdateFirmwarePanel'\r\nimport Grid from '@material-ui/core/Grid'\r\n// import FilterListIcon from '@material-ui/icons/FilterList'\r\n// import FilterPopover from '../components/filters/FilterPopover'\r\n// import Tooltip from '@material-ui/core/Tooltip'\r\n// import { IconButton } from '@material-ui/core'\r\nimport {\r\n translateObjectToMenu,\r\n findElementById,\r\n} from '../utils/FirmwareServices'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n marginTop: 1,\r\n height: '100vh',\r\n },\r\n body_info: {\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(2),\r\n },\r\n treeView: {\r\n backgroundColor: '#2C4153',\r\n height: '100vh',\r\n overflow: 'auto',\r\n },\r\n header: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n filters: {\r\n right: 0,\r\n },\r\n firmware_panel: {\r\n height: 400,\r\n paddingLeft: theme.spacing(4),\r\n paddingRight: theme.spacing(2),\r\n marginTop: theme.spacing(2),\r\n },\r\n content: {\r\n flexGrow: 1,\r\n padding: theme.spacing(2),\r\n },\r\n chip: {\r\n marginRight: 5,\r\n },\r\n}))\r\n\r\nconst UpdateFirmwarePage = ({ match, location, history, ...props }) => {\r\n const classes = useStyles()\r\n const [MenuItems, setMenuItems] = useState(undefined)\r\n const [isDisableUpdateFirmwarePanel, setDisableUpdateFirmwarePanel] =\r\n useState(true)\r\n const [snackbar, setSnackbar] = useState({\r\n open: false,\r\n variant: 'error',\r\n message: '',\r\n })\r\n const [micro_controller, setMicro] = useState(undefined)\r\n const [device_type_name, setDevice] = useState(undefined)\r\n const [device_version, setVersion] = useState(undefined)\r\n // const [currentVersions, setCurrentVersions] = useState(null)\r\n // const [updateVersions, setUpdateVersions] = useState(null)\r\n\r\n // const [anchorEl, updateAnchorEl] = useState(null)\r\n // const [filters, setFilters] = useState([\r\n // {\r\n // key: 'current_version',\r\n // label: ResourceLang.current_version,\r\n // type: 'select',\r\n // options: currentVersions,\r\n // },\r\n // {\r\n // key: 'update_version',\r\n // label: ResourceLang.update_version,\r\n // type: 'select',\r\n // options: updateVersions,\r\n // },\r\n // ])\r\n\r\n const envId = match.params.envId\r\n\r\n useEffect(() => {\r\n if (!MenuItems) {\r\n FirmwareAPI.getStructure(envId).then((response) => {\r\n translateObjectToMenu(response)\r\n setMenuItems(response)\r\n })\r\n }\r\n }, [envId, MenuItems])\r\n\r\n // const renderFilterButton = () => {\r\n // return (\r\n // <>\r\n // \r\n // updateAnchorEl(event.currentTarget)}\r\n // >\r\n // \r\n // \r\n // \r\n // \r\n // \r\n // )\r\n // }\r\n\r\n const renderDeviceTypeIcon = () => {\r\n if (device_type_name) {\r\n return (\r\n }\r\n label={device_type_name}\r\n />\r\n )\r\n }\r\n\r\n return null\r\n }\r\n\r\n const renderExtensionIcon = () => {\r\n if (device_version) {\r\n return (\r\n }\r\n label={device_version}\r\n />\r\n )\r\n }\r\n\r\n return null\r\n }\r\n\r\n const renderMemoryIcon = () => {\r\n if (micro_controller) {\r\n return (\r\n }\r\n label={micro_controller}\r\n />\r\n )\r\n }\r\n\r\n return null\r\n }\r\n\r\n const renderUpdateFirmwareButton = () => {\r\n if (!micro_controller || !device_type_name || !device_version) {\r\n return null\r\n }\r\n }\r\n\r\n const closeUpdateFirmware = (successFromPanel, messageFromPanel) => {\r\n setDisableUpdateFirmwarePanel(true)\r\n setSnackbar((prevState) => ({\r\n ...prevState,\r\n open: true,\r\n message: messageFromPanel,\r\n variant: successFromPanel,\r\n }))\r\n }\r\n\r\n const renderFirmwarePanel = () => {\r\n return (\r\n <>\r\n {!isDisableUpdateFirmwarePanel ? (\r\n \r\n ) : null}\r\n \r\n )\r\n }\r\n\r\n const setDeviceChoosen = (ItemSelected) => {\r\n if (ItemSelected) {\r\n const deviceSelected = findElementById(MenuItems, ItemSelected)\r\n if (deviceSelected) {\r\n setDisableUpdateFirmwarePanel(false)\r\n setDevice(deviceSelected.deviceType)\r\n setVersion(deviceSelected.version)\r\n setMicro(deviceSelected.micro)\r\n }\r\n }\r\n }\r\n\r\n const renderHeader = () => {\r\n return (\r\n }\r\n >\r\n )\r\n }\r\n\r\n const handleSnackbarClose = () => {\r\n setSnackbar((prevState) => ({ ...prevState, open: false }))\r\n }\r\n\r\n const renderSnackbar = () => {\r\n return (\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 {renderHeader()}\r\n
\r\n
\r\n \r\n {ResourceLang.micro_controller_info}\r\n \r\n {/* TODO: Do not have inline styles */}\r\n {/* */}\r\n {ResourceLang.micro_controller}  \r\n {renderDeviceTypeIcon()}\r\n {renderExtensionIcon()}\r\n {renderMemoryIcon()}\r\n {renderUpdateFirmwareButton()}\r\n {/*
\r\n {renderFilterButton()}\r\n
\r\n
*/}\r\n
\r\n
{renderFirmwarePanel()}
\r\n {renderSnackbar()}\r\n \r\n {!MenuItems ? : null}\r\n \r\n )\r\n}\r\n\r\nexport default withRouter(UpdateFirmwarePage)\r\n","import React from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport ResourceLang from '../../resources/Language'\r\nimport {\r\n AutoSizer,\r\n Column,\r\n Table,\r\n SortIndicator,\r\n defaultTableRowRenderer,\r\n} from 'react-virtualized'\r\nimport { Link } from 'react-router-dom'\r\nimport {\r\n ContextMenu,\r\n ContextMenuTrigger,\r\n connectMenu,\r\n hideMenu,\r\n} from 'react-contextmenu'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport clsx from 'clsx'\r\nimport {\r\n TableRow,\r\n TableCell,\r\n Tooltip,\r\n Typography,\r\n IconButton,\r\n Paper,\r\n MenuList,\r\n MenuItem,\r\n TablePagination,\r\n Input,\r\n} from '@material-ui/core'\r\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess'\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore'\r\n\r\nconst styles = (theme) => ({\r\n flexContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n boxSizing: 'border-box',\r\n },\r\n table: {\r\n // temporary right-to-left patch, waiting for\r\n // https://github.com/bvaughn/react-virtualized/issues/454\r\n '& .ReactVirtualized__Table__headerRow': {\r\n flip: false,\r\n paddingRight: theme.direction === 'rtl' ? '0px !important' : undefined,\r\n },\r\n },\r\n tableRow: {\r\n cursor: 'pointer',\r\n },\r\n input: {\r\n width: '2rem',\r\n },\r\n caption: {\r\n fontSize: '0.875rem',\r\n fontFamily: 'Roboto',\r\n },\r\n tableRowHover: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[200],\r\n },\r\n },\r\n tableCell: {\r\n flex: 1,\r\n },\r\n tableFooter: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n footerlabel: {\r\n marginLeft: theme.spacing(3),\r\n },\r\n firstCell: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n noClick: {\r\n cursor: 'initial',\r\n },\r\n})\r\n\r\nconst MENU_TYPE = 'DYNAMIC'\r\nconst collectTriggerProps = (props) => props\r\n\r\nconst DynamicMenu = ({ id, contextMenuOptions, trigger }) => {\r\n const { data } = trigger || {}\r\n\r\n return (\r\n \r\n \r\n \r\n {!trigger\r\n ? null\r\n : contextMenuOptions.map(({ label, onClick }, index) => {\r\n const onMenuItemClick = (e) => {\r\n hideMenu()\r\n onClick(e, data)\r\n }\r\n\r\n return (\r\n \r\n {label}\r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nDynamicMenu.propTypes = {\r\n id: PropTypes.string.isRequired,\r\n contextMenuOptions: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n label: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n })\r\n ).isRequired,\r\n trigger: PropTypes.shape({\r\n data: PropTypes.object.isRequired,\r\n }),\r\n}\r\n\r\nconst ConnectedMenu = connectMenu(MENU_TYPE)(DynamicMenu)\r\n\r\nclass MuiPaginatedVirtualizedTable extends React.PureComponent {\r\n static defaultProps = {\r\n disableHeader: false,\r\n headerHeight: 48 * 2,\r\n rowHeight: 48,\r\n detailRowHeight: 48 * 2,\r\n }\r\n\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n selectedIndex: -1,\r\n }\r\n this.tableRef = React.createRef()\r\n this._handleExpandClick = this._handleExpandClick.bind(this)\r\n }\r\n\r\n cellRenderer = ({ cellData, columnIndex, rowIndex, rowData }) => {\r\n const { columns, rowHeight, classes } = this.props\r\n const column = columns[columnIndex]\r\n let value = cellData\r\n\r\n if (column.dataKey === '#') {\r\n value =
{rowIndex + 1}
\r\n } else if (column.render) {\r\n value = column.render(rowData)\r\n } else if (column.date === true) {\r\n const date = new Date(cellData)\r\n value = `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`\r\n } else if (column.numeric === true) {\r\n const decimalPlaces = column.decimalPlaces || 2\r\n if (cellData && !isNaN(cellData)) {\r\n value = Number(\r\n Math.round(value + ('e' + decimalPlaces)) + ('e-' + decimalPlaces)\r\n ).toFixed(decimalPlaces)\r\n } else value = '-'\r\n }\r\n\r\n if (column.link) {\r\n value = (\r\n event.stopPropagation()}\r\n to={column.link(rowData)}\r\n >\r\n {value}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {value}\r\n \r\n )\r\n }\r\n\r\n headerRenderer = ({ label, columnIndex, dataKey, sortBy, sortDirection }) => {\r\n const { headerHeight, columns, classes } = this.props\r\n const column = columns[columnIndex]\r\n\r\n let content = ''\r\n if (columnIndex === 0) {\r\n content = (\r\n
\r\n {label}\r\n {sortBy === dataKey && (\r\n \r\n )}\r\n
\r\n )\r\n } else {\r\n content = (\r\n <>\r\n {label}\r\n {sortBy === dataKey && (\r\n \r\n )}\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {content}\r\n \r\n )\r\n }\r\n\r\n rowRendererDetailed = (params) => {\r\n const { classes, rowHeight, detailRowHeight, detailRowRenderer } =\r\n this.props\r\n const { index, style, className, key } = params\r\n\r\n if (index === this.state.selectedIndex) {\r\n return (\r\n \r\n {defaultTableRowRenderer({\r\n ...params,\r\n style: { width: '100%', height: rowHeight },\r\n })}\r\n {\r\n let target = event.target\r\n\r\n while (target.getAttribute('role') !== 'row') {\r\n target = target.parentNode\r\n }\r\n\r\n target.previousElementSibling.click()\r\n }}\r\n >\r\n {detailRowRenderer(params, detailRowHeight)}\r\n \r\n \r\n )\r\n } else return defaultTableRowRenderer(params)\r\n }\r\n\r\n renderDetailButton = (width) => {\r\n const { classes, headerHeight, rowHeight } = this.props\r\n const key = 'detailButton'\r\n const disableSort = true\r\n\r\n return (\r\n {\r\n return (\r\n \r\n )\r\n }}\r\n cellRenderer={({ cellData, columnIndex, rowIndex, rowData }) => {\r\n const isSelected = this.state.selectedIndex === rowIndex\r\n const expandIcon = isSelected ? (\r\n \r\n ) : (\r\n \r\n )\r\n const label = isSelected\r\n ? ResourceLang.HideDetails\r\n : ResourceLang.ShowDetails\r\n\r\n return (\r\n \r\n \r\n {\r\n event.stopPropagation()\r\n this._handleExpandClick(rowIndex)\r\n }}\r\n >\r\n {expandIcon}\r\n \r\n \r\n \r\n )\r\n }}\r\n />\r\n )\r\n }\r\n\r\n getRowClassName = ({ index }) => {\r\n const { classes } = this.props\r\n return index !== -1\r\n ? clsx(classes.tableRow, classes.flexContainer, classes.tableRowHover)\r\n : clsx(classes.tableRow, classes.flexContainer)\r\n }\r\n\r\n getHeaderRowClassName = (disableSort) => {\r\n const { classes } = this.props\r\n return clsx([\r\n classes.tableCell,\r\n classes.flexContainer,\r\n disableSort === true ? classes.noClick : classes.tableRow,\r\n ])\r\n }\r\n\r\n getRowHeight = ({ index }) => {\r\n return index === this.state.selectedIndex\r\n ? this.props.detailRowHeight + this.props.rowHeight\r\n : this.props.rowHeight\r\n }\r\n\r\n getColumnAlign = (column) => {\r\n if (column.align) return column.align\r\n\r\n return column.numeric ? 'right' : 'left'\r\n }\r\n\r\n _handleExpandClick(rowIndex) {\r\n const newIndex = this.state.selectedIndex === rowIndex ? -1 : rowIndex\r\n this.setState({ ...this.state, selectedIndex: newIndex })\r\n\r\n if (this.tableRef) {\r\n this.tableRef.recomputeRowHeights()\r\n }\r\n }\r\n\r\n render() {\r\n const {\r\n pagination,\r\n classes,\r\n columns,\r\n rowHeight,\r\n headerHeight,\r\n disableHeader,\r\n detailRowRenderer,\r\n contextMenuOptions,\r\n onGoToPage,\r\n pageError,\r\n labelPage,\r\n ...tableProps\r\n } = this.props\r\n const footerHeight = headerHeight\r\n\r\n const rowContentRenderer = detailRowRenderer\r\n ? this.rowRendererDetailed\r\n : defaultTableRowRenderer\r\n const rowRenderer = !contextMenuOptions\r\n ? rowContentRenderer\r\n : (params) => {\r\n const { style, key, rowData } = params\r\n\r\n return (\r\n \r\n {rowContentRenderer(params)}\r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {({ height, width }) => (\r\n <>\r\n \r\n {columns.map(({ dataKey, columnWidth, ...other }, index) => {\r\n const cellWidth = columnWidth * width\r\n return (\r\n \r\n this.headerRenderer({\r\n ...headerProps,\r\n columnIndex: index,\r\n })\r\n }\r\n className={classes.flexContainer}\r\n cellRenderer={this.cellRenderer}\r\n dataKey={dataKey}\r\n width={cellWidth}\r\n {...other}\r\n />\r\n )\r\n })}\r\n {detailRowRenderer ? this.renderDetailButton(width) : null}\r\n \r\n \r\n \r\n Page:\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {contextMenuOptions ? (\r\n \r\n ) : null}\r\n \r\n )\r\n }\r\n}\r\n\r\nMuiPaginatedVirtualizedTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n columns: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n dataKey: PropTypes.string.isRequired,\r\n label: PropTypes.string,\r\n numeric: PropTypes.bool,\r\n date: PropTypes.bool,\r\n align: PropTypes.oneOf(['left', 'center', 'right']),\r\n columnWidth: PropTypes.number.isRequired,\r\n render: PropTypes.func,\r\n link: PropTypes.func,\r\n })\r\n ).isRequired,\r\n pagination: PropTypes.object,\r\n disableHeader: PropTypes.bool,\r\n headerHeight: PropTypes.number,\r\n onRowClick: PropTypes.func,\r\n rowHeight: PropTypes.number,\r\n detailRowRenderer: PropTypes.func,\r\n detailRowHeight: PropTypes.number,\r\n contextMenuOptions: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n label: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n })\r\n ),\r\n onGoToPage: PropTypes.func,\r\n pageError: PropTypes.bool,\r\n labelPage: PropTypes.string,\r\n}\r\n\r\nexport default withStyles(styles)(MuiPaginatedVirtualizedTable)\r\n","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\n\r\nconst ExcelIcon = props => {\r\n\r\n return(\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default ExcelIcon;","import React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\n\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n blueButton: {\r\n margin: theme.spacing(1),\r\n backgroundColor: '#2C4153',\r\n border: 'solid 1px #F1C419',\r\n color: 'rgb(241,198,25)',\r\n fontSize: 12,\r\n fontWeight: 'bold',\r\n '&:hover':{\r\n backgroundColor: 'rgb(241,198,25)',\r\n color: '#2C4153',\r\n }\r\n },\r\n}));\r\n\r\nexport const ButtonBlue = props =>{\r\n const {size} = props || 'medium';\r\n const classes = useStyles();\r\n\r\n return(\r\n \r\n )\r\n}","import React, { useState, useEffect } from 'react'\r\nimport { withRouter } from 'react-router'\r\nimport Toolbar from '@material-ui/core/Toolbar'\r\nimport { makeStyles } from '@material-ui/core/styles'\r\nimport ResourceLang from '../../resources/Language'\r\nimport MemoryIcon from '@material-ui/icons/Memory'\r\nimport { FirmwareAPI } from '../../utils/APIRequester'\r\nimport Tooltip from '@material-ui/core/Tooltip'\r\nimport PageLoading from '../../components/loadings/PageLoading'\r\nimport { handleBodyResize, compareValues } from '../../utils/BrowserServices'\r\nimport { SortDirection } from 'react-virtualized'\r\nimport { Paper, Grid, IconButton, Chip, Typography } from '@material-ui/core'\r\nimport MuiPaginatedVirtualizedTable from '../../components/tables/MuiPaginatedVirtualizedTable'\r\nimport FilterListIcon from '@material-ui/icons/FilterList'\r\nimport FilterPopover from '../../components/filters/FilterPopover'\r\nimport { DEVICE_VERSION_VALUES_ENUM } from '../../utils/Enums'\r\nimport ExcelIcon from '../../components/icons/ExcelIcon'\r\nimport { ButtonBlue } from '../../components/buttons/RectanguleButton'\r\nimport { useDebounce } from 'use-debounce'\r\nimport { isPoleMountedOrDtvi4G } from '../../utils/DeviceServices';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'auto',\r\n },\r\n headerTitle: {\r\n flexGrow: 1,\r\n marginLeft: theme.spacing(2),\r\n },\r\n tableContainer: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n },\r\n toolbar: {\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(1),\r\n },\r\n chip: {\r\n margin: theme.spacing(0.5),\r\n },\r\n}))\r\n\r\nconst ListDevicePage = ({ match, location, history, ...props }) => {\r\n const classes = useStyles()\r\n const DEVICE_VERSION_POSITION = 11\r\n const [anchorEl, updateAnchorEl] = useState(null)\r\n const [state, setState] = useState({\r\n selected: undefined,\r\n deviceItems: undefined,\r\n currentVersions: undefined,\r\n })\r\n\r\n const [pageError, setPageError] = useState(false)\r\n const [pageSize, setPageSize] = useState(50)\r\n const [totalRows, setTotalRows] = useState(0)\r\n const [currentPage, setCurrentPage] = useState(0)\r\n const [debouncedCurrentPage] = useDebounce(currentPage, 500)\r\n const [firmwareIds, setFirmwareIds] = useState(null)\r\n const [currentVersions, setCurrentVersions] = useState(null)\r\n const [selectedFirmware, setSelectedFirmware] = useState(null)\r\n const [selectedVersion, setSelectedVersion] = useState(null)\r\n const [selectedSerial, setSelectedSerial] = useState(null)\r\n const [debouncedselectedSerial] = useDebounce(selectedSerial, 500)\r\n const [isLoading, setIsLoading] = useState(true)\r\n\r\n const [filters, setFilters] = useState([\r\n {\r\n key: 'serial_number',\r\n label: ResourceLang.serial_number,\r\n type: 'text',\r\n },\r\n ])\r\n\r\n const [sort, setSort] = useState({\r\n sortBy: 'created',\r\n sortDirection: SortDirection.ASC,\r\n })\r\n\r\n const envId = match.params.envId\r\n\r\n useEffect(() => {\r\n function formatVersion(deviceItem) {\r\n deviceItem.formattedMSP = allEqual(deviceItem.MSP, '0')\r\n ? '0'\r\n : deviceItem.MSP.replace(/\\b0+/g, '')\r\n\r\n deviceItem.formattedPIC = allEqual(deviceItem.PIC, '0')\r\n ? '0'\r\n : deviceItem.PIC.replace(/\\b0+/g, '')\r\n\r\n deviceItem.formattedMEA = allEqual(deviceItem.MEA, '0')\r\n ? '0'\r\n : deviceItem.MEA.replace(/\\b0+/g, '')\r\n\r\n deviceItem.formattedCOM = allEqual(deviceItem.COM, '0')\r\n ? '0'\r\n : deviceItem.COM.replace(/\\b0+/g, '')\r\n }\r\n\r\n function setFirmwareData(deviceItem) {\r\n deviceItem.MSP = 'N/A'\r\n deviceItem.PIC = 'N/A'\r\n deviceItem.MEA = 'N/A'\r\n deviceItem.COM = 'N/A'\r\n\r\n if (deviceItem.device_firmware != null) {\r\n deviceItem.device_firmware.forEach((firmware) => {\r\n switch (firmware.firmware_id) {\r\n case 'MSP':\r\n deviceItem.MSP = firmware.current_firmware_version\r\n break\r\n case 'PIC':\r\n deviceItem.PIC = firmware.current_firmware_version\r\n break\r\n case 'DTE':\r\n deviceItem.PIC = firmware.current_firmware_version\r\n break\r\n case 'MEA':\r\n deviceItem.MEA = firmware.current_firmware_version\r\n break\r\n case 'COM':\r\n deviceItem.COM = firmware.current_firmware_version\r\n break\r\n default:\r\n break\r\n }\r\n })\r\n }\r\n\r\n formatVersion(deviceItem)\r\n }\r\n\r\n function setFamilyVersion(deviceItem) {\r\n if (deviceItem.serial_number.length > DEVICE_VERSION_POSITION) {\r\n let version = parseInt(\r\n deviceItem.serial_number[DEVICE_VERSION_POSITION]\r\n )\r\n let typeDescription = deviceItem.device_type_description;\r\n\r\n if (isNaN(version)) {\r\n deviceItem.family_version = ResourceLang.not_applicable\r\n } else {\r\n deviceItem.family_version = translateVersion(typeDescription, version)\r\n }\r\n } else {\r\n deviceItem.family_version = ResourceLang.not_applicable\r\n }\r\n }\r\n\r\n function setSIMCardData(deviceItem) {\r\n if (deviceItem.interface_gprs.iccid == null) {\r\n deviceItem.iccid = ''\r\n } else {\r\n deviceItem.iccid = deviceItem.interface_gprs.iccid\r\n }\r\n\r\n if (deviceItem.interface_gprs.current_ip == null) {\r\n deviceItem.current_ip = ''\r\n } else {\r\n deviceItem.current_ip = deviceItem.interface_gprs.current_ip\r\n }\r\n }\r\n\r\n if (state.deviceItems) {\r\n state.deviceItems.forEach((device) => {\r\n setSIMCardData(device)\r\n setFamilyVersion(device)\r\n setFirmwareData(device)\r\n })\r\n }\r\n }, [state.deviceItems])\r\n\r\n useEffect(() => {\r\n function setFirmwareOptionIds(firmware_ids) {\r\n let ids = []\r\n firmware_ids.forEach((firmware_id) => {\r\n let id = {\r\n name: firmware_id,\r\n value: firmware_id,\r\n }\r\n if (uniqueAdd(ids, id)) ids.push(id)\r\n })\r\n\r\n setFirmwareIds(stringArraySort(ids))\r\n }\r\n\r\n if (!state.deviceItems) {\r\n let data = {}\r\n data.pageSize = pageSize\r\n data.orderBy = null\r\n\r\n setIsLoading(true)\r\n\r\n FirmwareAPI.getAllDevices(envId, data)\r\n .then((response) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n deviceItems: response.devices,\r\n currentVersions: response.firmware_versions,\r\n }))\r\n setTotalRows(response.total_devices)\r\n setFirmwareOptionIds(response.firmware_ids)\r\n })\r\n .catch((error) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n deviceItems: [],\r\n }))\r\n })\r\n .finally(() => {\r\n setIsLoading(false)\r\n })\r\n }\r\n\r\n window.addEventListener('resize', handleBodyResize, true)\r\n return () => {\r\n window.removeEventListener('resize', handleBodyResize, true)\r\n }\r\n }, [state.deviceItems, envId, pageSize])\r\n\r\n useEffect(() => {\r\n let addFilter = true\r\n\r\n filters.forEach((filter) => {\r\n if (filter.key === 'firmware_id' || firmwareIds == null) {\r\n addFilter = false\r\n }\r\n })\r\n\r\n if (addFilter === true) {\r\n let filter = {\r\n key: 'firmware_id',\r\n label: ResourceLang.firmware_id,\r\n type: 'select',\r\n options: firmwareIds,\r\n }\r\n setFilters([...filters, filter])\r\n }\r\n }, [firmwareIds, filters])\r\n\r\n useEffect(() => {\r\n function getFormatedVersion(version) {\r\n return allEqual(version, '0') ? '0' : version.replace(/\\b0+/g, '')\r\n }\r\n\r\n function uniqueAdd(array, object) {\r\n for (const index in array) {\r\n if (array[index].name === object.name) return false\r\n }\r\n return true\r\n }\r\n\r\n function setCurrentVersionOptions() {\r\n let ids = []\r\n\r\n if (state.currentVersions) {\r\n state.currentVersions.forEach((firmware_id) => {\r\n let id = {\r\n name: getFormatedVersion(firmware_id),\r\n value: firmware_id,\r\n }\r\n if (uniqueAdd(ids, id)) ids.push(id)\r\n })\r\n\r\n setCurrentVersions(stringArraySort(ids))\r\n }\r\n }\r\n\r\n setCurrentVersionOptions()\r\n }, [selectedFirmware, state.deviceItems, state.currentVersions])\r\n\r\n useEffect(() => {\r\n let addFilter = true\r\n let removeFilter = false\r\n\r\n if (\r\n selectedFirmware == null &&\r\n filters.find((filter) => filter.key === 'current_firmware_version')\r\n ) {\r\n removeFilter = true\r\n }\r\n\r\n let serialFilter = filters.find((filter) => filter.key === 'serial_number')\r\n if (serialFilter.value === '') {\r\n setCurrentPage(0)\r\n setPageSize(50)\r\n setSelectedSerial(null)\r\n }\r\n\r\n if (\r\n filters.find((filter) => filter.key === 'current_firmware_version') ||\r\n currentVersions == null ||\r\n currentVersions.length === 0 ||\r\n removeFilter === true ||\r\n selectedFirmware == null\r\n ) {\r\n addFilter = false\r\n }\r\n\r\n let filter = {\r\n key: 'current_firmware_version',\r\n label: ResourceLang.current_version,\r\n type: 'select',\r\n options: currentVersions,\r\n }\r\n\r\n if (addFilter === true && removeFilter === false) {\r\n setFilters([...filters, filter])\r\n }\r\n\r\n if (removeFilter === true) {\r\n setFilters(\r\n filters.filter(function (x) {\r\n return x.key !== 'current_firmware_version'\r\n })\r\n )\r\n }\r\n }, [currentVersions, selectedFirmware, filters])\r\n\r\n useEffect(() => {\r\n let data = {}\r\n data.serialNumber = debouncedselectedSerial\r\n data.firmwareId = selectedFirmware\r\n data.firmwareVersion = selectedVersion\r\n data.pageSize = pageSize\r\n data.toSkip = debouncedCurrentPage * pageSize\r\n data.orderBy = null\r\n\r\n setIsLoading(true)\r\n\r\n FirmwareAPI.getAllDevices(envId, data)\r\n .then((response) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n deviceItems: response.devices,\r\n currentVersions: response.firmware_versions,\r\n }))\r\n setTotalRows(response.total_devices)\r\n })\r\n .catch((error) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n deviceItems: [],\r\n }))\r\n })\r\n .finally(() => {\r\n setIsLoading(false)\r\n })\r\n }, [\r\n selectedFirmware,\r\n debouncedselectedSerial,\r\n selectedVersion,\r\n pageSize,\r\n envId,\r\n debouncedCurrentPage,\r\n ])\r\n\r\n function translateVersion(typeDescription, version) {\r\n if (isPoleMountedOrDtvi4G(typeDescription) === true) {\r\n return translatePoleMountVersion(version);\r\n } else {\r\n return translateDTVIVersion(version);\r\n }\r\n }\r\n\r\n function translatePoleMountVersion(version) {\r\n if (version === 1 || version === 2) {\r\n return DEVICE_VERSION_VALUES_ENUM.V1\r\n }\r\n else {\r\n return ResourceLang.not_applicable;\r\n }\r\n }\r\n\r\n function translateDTVIVersion(version) {\r\n\r\n if (version === 1) {\r\n return DEVICE_VERSION_VALUES_ENUM.V1\r\n }\r\n else if (version === 2) {\r\n return DEVICE_VERSION_VALUES_ENUM.V2\r\n }\r\n else if (version === 3 || version === 4) {\r\n return DEVICE_VERSION_VALUES_ENUM.V3\r\n }\r\n else if (version === 5 || version === 6) {\r\n return DEVICE_VERSION_VALUES_ENUM.V4\r\n }\r\n else {\r\n return ResourceLang.not_applicable\r\n }\r\n }\r\n\r\n function uniqueAdd(array, object) {\r\n for (const index in array) {\r\n if (\r\n array[index].value === object.value &&\r\n array[index].name === object.name\r\n )\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n function allEqual(string, character) {\r\n return string.split('').every((char) => char === character)\r\n }\r\n\r\n function stringArraySort(array) {\r\n return array.sort(function (a, b) {\r\n return a.name.localeCompare(b.name)\r\n })\r\n }\r\n\r\n function exportCSVFile(deviceItems) {\r\n if (deviceItems !== null) {\r\n const formData = new FormData()\r\n formData.append('devices', JSON.stringify(deviceItems))\r\n FirmwareAPI.getCSVExportFile(formData)\r\n .then((response) => {\r\n const url = window.URL.createObjectURL(new Blob([response]), {\r\n type: 'text/csv',\r\n })\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.target = '_blank'\r\n link.download = 'export_devices.csv'\r\n document.body.appendChild(link)\r\n link.click()\r\n })\r\n .catch((error) => {\r\n console.log(error)\r\n })\r\n }\r\n }\r\n\r\n const renderPageHeader = () => {\r\n return (\r\n \r\n \r\n \r\n {ResourceLang.list_device}\r\n \r\n {renderFilterButton()}\r\n {renderExportButton()}\r\n \r\n )\r\n }\r\n\r\n handleBodyResize()\r\n\r\n const renderExportButton = () => {\r\n return (\r\n <>\r\n {\r\n exportCSVFile(getTableItems())\r\n }}\r\n >\r\n \r\n {ResourceLang.export}\r\n \r\n \r\n )\r\n }\r\n\r\n const renderFilterButton = () => {\r\n return (\r\n <>\r\n \r\n updateAnchorEl(event.currentTarget)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const renderFilters = (filterValues) => {\r\n return (\r\n \r\n \r\n {filterValues.map((item, index) => {\r\n return (\r\n {\r\n const newFilters = [...filters]\r\n const targetKey = newFilters.find((x) => x.key === item.key)\r\n if (targetKey.value instanceof Array) {\r\n targetKey.value = targetKey.value.filter(\r\n (x) => x.value !== item.value\r\n )\r\n } else {\r\n targetKey.value = null\r\n }\r\n setFilters(newFilters)\r\n }}\r\n className={classes.chip}\r\n />\r\n )\r\n })}\r\n \r\n \r\n )\r\n }\r\n\r\n const getFilterValuesArray = () => {\r\n const filterValues = []\r\n for (let i = 0; i < filters.length; i++) {\r\n if (filters[i].value instanceof Array) {\r\n if (filters[i].value.length > 0) {\r\n for (let j = 0; j < filters[i].value.length; j++) {\r\n if (\r\n filters[i].key === 'firmware_id' &&\r\n selectedFirmware !== filters[i].value[j].value\r\n ) {\r\n setCurrentPage(0)\r\n setPageSize(50)\r\n setSelectedFirmware(filters[i].value[j].value)\r\n } else if (\r\n filters[i].key === 'current_firmware_version' &&\r\n selectedVersion !== filters[i].value[j].value &&\r\n selectedFirmware !== null\r\n ) {\r\n setCurrentPage(0)\r\n setPageSize(50)\r\n setSelectedVersion(filters[i].value[j].value)\r\n }\r\n\r\n filterValues.push({\r\n ...filters[i].value[j],\r\n key: filters[i].key,\r\n type: filters[i].type,\r\n })\r\n }\r\n } else {\r\n if (filters[i].key === 'firmware_id' && selectedFirmware !== null) {\r\n setCurrentPage(0)\r\n setPageSize(50)\r\n setSelectedVersion(null)\r\n setSelectedFirmware(null)\r\n } else if (\r\n filters[i].key === 'current_firmware_version' &&\r\n selectedVersion !== null\r\n ) {\r\n setCurrentPage(0)\r\n setPageSize(50)\r\n setSelectedVersion(null)\r\n }\r\n }\r\n } else if (filters[i].value) {\r\n let name = filters[i].value\r\n\r\n if (filters[i].value instanceof Date)\r\n name = `${filters[i].label}: ${name.toLocaleDateString()}`\r\n\r\n if (\r\n filters[i].key === 'serial_number' &&\r\n selectedSerial !== filters[i].value\r\n ) {\r\n setCurrentPage(0)\r\n setPageSize(50)\r\n setSelectedSerial(filters[i].value)\r\n }\r\n\r\n filterValues.push({\r\n name: name,\r\n value: filters[i].value,\r\n key: filters[i].key,\r\n type: filters[i].type,\r\n })\r\n }\r\n }\r\n return filterValues\r\n }\r\n\r\n const renderTable = () => {\r\n const { deviceItems } = state\r\n if (!deviceItems) {\r\n return null\r\n }\r\n\r\n const columns = [\r\n {\r\n columnWidth: 50,\r\n label: '#',\r\n dataKey: 'device_id',\r\n align: 'left',\r\n disableSort: true,\r\n },\r\n {\r\n columnWidth: 150,\r\n label: ResourceLang.type,\r\n dataKey: 'device_type_description',\r\n },\r\n {\r\n columnWidth: 200,\r\n label: ResourceLang.hardware_version,\r\n dataKey: 'family_version',\r\n },\r\n {\r\n columnWidth: 225,\r\n label: ResourceLang.serial_number,\r\n dataKey: 'serial_number',\r\n },\r\n {\r\n columnWidth: 150,\r\n label: ResourceLang.ICCID,\r\n dataKey: 'iccid',\r\n },\r\n {\r\n columnWidth: 150,\r\n label: ResourceLang.CurrentIP,\r\n dataKey: 'current_ip',\r\n },\r\n {\r\n columnWidth: 125,\r\n label: ResourceLang.MSP,\r\n dataKey: 'formattedMSP',\r\n },\r\n {\r\n columnWidth: 125,\r\n label: ResourceLang.PIC,\r\n dataKey: 'formattedPIC',\r\n },\r\n {\r\n columnWidth: 125,\r\n label: ResourceLang.MEA,\r\n dataKey: 'formattedMEA',\r\n },\r\n {\r\n columnWidth: 125,\r\n label: ResourceLang.COM,\r\n dataKey: 'formattedCOM',\r\n },\r\n {\r\n columnWidth: 150,\r\n label: ResourceLang.last_communication,\r\n dataKey: 'last_contact',\r\n date: true,\r\n },\r\n ]\r\n\r\n const tableItems = getTableItems()\r\n\r\n const rowGetter = ({ index }) => {\r\n return tableItems[index]\r\n }\r\n\r\n const handleSort = (event) => {\r\n setSort({\r\n sortBy: event.sortBy,\r\n sortDirection: event.sortDirection,\r\n })\r\n }\r\n\r\n const onGoToPage = (event) => {\r\n let totalPages = Math.ceil(totalRows / pageSize)\r\n\r\n if (\r\n !event.target.value.includes('NaN') &&\r\n totalPages >= event.target.value\r\n ) {\r\n setPageError(false)\r\n setCurrentPage(event.target.value)\r\n } else {\r\n setPageError(true)\r\n setCurrentPage(null)\r\n }\r\n }\r\n\r\n function onChangePage(event, page) {\r\n setCurrentPage(page)\r\n }\r\n\r\n function onRowsPerPageChange(object) {\r\n setCurrentPage(0)\r\n setPageSize(object.target.value)\r\n }\r\n\r\n function getPagination() {\r\n let pagination = {}\r\n pagination.count = totalRows\r\n pagination.onChangePage = onChangePage\r\n pagination.page =\r\n debouncedCurrentPage == null ? 0 : parseInt(debouncedCurrentPage)\r\n pagination.rowsPerPage = pageSize\r\n pagination.onChangeRowsPerPage = onRowsPerPageChange\r\n pagination.rowsPerPageOptions = [10, 25, 50, 100, totalRows]\r\n return pagination\r\n }\r\n\r\n return (\r\n {\r\n setState((prevState) => ({ ...prevState, selected: rowData }))\r\n history.push(\r\n '/environment/' +\r\n envId +\r\n '/device/' +\r\n rowData.device_id +\r\n '/summary',\r\n { context: location.state.context }\r\n )\r\n }}\r\n />\r\n )\r\n }\r\n\r\n const filterValues = getFilterValuesArray()\r\n\r\n const getTableItems = () => {\r\n let results = [...state.deviceItems]\r\n\r\n if (sort.sortDirection === SortDirection.ASC) {\r\n results.sort((a, b) => compareValues(b[sort.sortBy], a[sort.sortBy]))\r\n } else {\r\n results.sort((a, b) => compareValues(a[sort.sortBy], b[sort.sortBy]))\r\n }\r\n\r\n return results\r\n }\r\n\r\n const hasFilters = filterValues.length > 0\r\n const HEADER_HEIGHT = 64\r\n const FILTERS_HEIGHT = 40\r\n const TOP_OFFSET = HEADER_HEIGHT + (hasFilters ? FILTERS_HEIGHT : 0)\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {renderPageHeader()}\r\n \r\n {hasFilters ? (\r\n \r\n {renderFilters(filterValues)}\r\n \r\n ) : null}\r\n \r\n \r\n \r\n {renderTable()}\r\n \r\n \r\n \r\n {isLoading ? : null}\r\n
\r\n )\r\n}\r\n\r\nexport default withRouter(ListDevicePage)","export function isDTVI(typeDescription){\r\n \r\n return (typeDescription === \"DTVIg\"\r\n || typeDescription === \"DTVIm\"\r\n || typeDescription === \"DTVI4g\"\r\n || typeDescription === \"DTVI-g PMT2\"\r\n || typeDescription === \"DTVI4-g PMT2\"\r\n || typeDescription === \"Pole Mount DTVIg\"\r\n || typeDescription === \"Pole Mount DTVI4-g\");\r\n}\r\n\r\nexport function isPoleMountedOrDtvi4G(typeDescription){\r\n return (typeDescription === \"DTVI-g PMT2\"\r\n || typeDescription === \"DTVI4-g PMT2\"\r\n || typeDescription === \"Pole Mount DTVIg\"\r\n || typeDescription === \"Pole Mount DTVI4-g\"\r\n || typeDescription === \"DTVI4-g\");\r\n}\r\n\r\nexport function isDTE(typeDescription){\r\n return (typeDescription === \"DTE\");\r\n}","import React, { useState } from 'react';\r\nimport {InputGroup, InputGroupAddon, InputGroupText, Input, FormFeedback } from 'reactstrap';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport VisibilityIcon from '@material-ui/icons/Visibility';\r\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n passwordToogle: {\r\n cursor: 'pointer'\r\n }\r\n}));\r\n\r\n\r\nconst usePasswordToggle = () => {\r\n const [visible, setVisiblity] = useState(false);\r\n\r\n const Icon = (\r\n visible === true ?\r\n setVisiblity(visiblity => !visiblity)} />\r\n : setVisiblity(visiblity => !visiblity)} />\r\n );\r\n\r\n const InputType = visible ? \"text\" : \"password\";\r\n\r\n return [InputType, Icon];\r\n};\r\n\r\n\r\nconst InputPassword = ({\r\n value = \"\", readOnly = false, onChange = undefined, feedbackText = undefined, ...others\r\n}) => {\r\n const classes = useStyles();\r\n const [PasswordInputType, ToggleIcon] = usePasswordToggle();\r\n\r\n return (<>\r\n \r\n \r\n \r\n {readOnly ? null : {ToggleIcon}}\r\n \r\n {feedbackText ? {feedbackText} : null}\r\n \r\n );\r\n}\r\n\r\n\r\nexport default InputPassword;","import React from 'react';\r\nimport Fab from '@material-ui/core/Fab';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nexport const useStyles = makeStyles(theme => ({\r\n margin: {\r\n margin: theme.spacing(1),\r\n display: 'inline', float: 'right',\r\n backgroundColor: '#f3f3f4',\r\n border: 'solid 1px #F1C419',\r\n color: '#2C4153',\r\n fontSize: 12,\r\n fontWeight: 'bold',\r\n '&:hover':{\r\n backgroundColor: '#F1C419',\r\n color: 'white'\r\n }\r\n },\r\n extendedIcon: {\r\n fontSize:16,\r\n marginRight: theme.spacing(1),\r\n },\r\n submitButton: {\r\n margin: theme.spacing(1),\r\n backgroundColor: '#2C4153',\r\n border: 'solid 1px #F1C419',\r\n color: '#white',\r\n fontSize: 12,\r\n fontWeight: 'bold',\r\n '&:hover':{\r\n backgroundColor: '#F1C419',\r\n color: 'white'\r\n }\r\n },\r\n cancelButton: {\r\n margin: theme.spacing(1),\r\n backgroundColor: '#f3f3f4',\r\n border: 'solid 1px #F1C419',\r\n color: '#2C4153',\r\n fontSize: 12,\r\n fontWeight: 'bold',\r\n '&:hover':{\r\n backgroundColor: '#F1C419',\r\n color: 'white'\r\n }\r\n },\r\n }));\r\n\r\n\r\n export const OvalButtonPrimary = props =>{\r\n return(\r\n \r\n\r\n {props.children}\r\n \r\n )\r\n }\r\n","import Fab from '@material-ui/core/Fab';\r\nimport { withStyles } from '@material-ui/core/styles';\r\n\r\nexport const CircularButtonTransparent = withStyles(theme => ({\r\n root: {\r\n color: '#233442',\r\n backgroundColor: 'white',\r\n '&:hover': {\r\n backgroundColor: 'rgba(0, 0, 0, 0.08)',\r\n },\r\n },\r\n}))(Fab);\r\n\r\n\r\n","import React from 'react'\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { DialogTitle as MuiDialogTitle , DialogContent as MuiDialogContent,\r\n DialogActions as MuiDialogActions, IconButton, Typography, Tooltip,\r\n Dialog as MuiDialog} from '@material-ui/core';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\n\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n});\r\n \r\n\r\nconst DialogTitle = withStyles(styles)(({children, classes, onClose, closeLabel = 'Close', ...other}) => {\r\n return (\r\n {children}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\n\r\nconst DialogContent = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst DialogActions = withStyles((theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiDialogActions);\r\n\r\n\r\nconst Dialog = ({fullWidth = true, disableBackdropClick = true, disableEscapeKeyDown = true,\r\n onClose, closeLabel, titleRenderer, actionsRenderer, children, ...other\r\n}) => {\r\n return (
\r\n \r\n \r\n {titleRenderer()}\r\n \r\n \r\n {children}\r\n \r\n {actionsRenderer ?(\r\n \r\n {actionsRenderer()}\r\n ) : null\r\n }\r\n \r\n
);\r\n}\r\n\r\n\r\nDialog.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n fullWidth: PropTypes.bool,\r\n disableBackdropClick: PropTypes.bool,\r\n disableEscapeKeyDown: PropTypes.bool,\r\n onClose: PropTypes.func.isRequired,\r\n closeLabel: PropTypes.string,\r\n titleRenderer: PropTypes.func.isRequired,\r\n actionsRenderer: PropTypes.func\r\n};\r\n\r\nexport default Dialog;","\r\nimport MuiVirtualizedTable from '../../../components/tables/MuiVirtualizedTable';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport PropTypes from 'prop-types';\r\nimport cloneDeep from 'lodash/cloneDeep';\r\n\r\nconst NTPSettings = ({settings}) => {\r\n\r\n const DEVICE_SETTINGS_KEYS = {\r\n TIMESERVER_URL: 'timeserver_url',\r\n TIMESERVER_PORT:'timeserver_port',\r\n TIMESERVER_PROTOCOL: 'timeserver_protocol',\r\n TIMESERVER_TYPE: 'timeserver_type' \r\n }\r\n const translatedSettings = cloneDeep(settings);\r\n\r\n function translateSettingsToTableRender(settingsToUpdate) {\r\n if(settingsToUpdate.timeserver_type !== undefined){\r\n if(settingsToUpdate.timeserver_type === 0){\r\n settingsToUpdate.timeserver_type = ResourceLang.ntp\r\n }\r\n else if (settingsToUpdate.timeserver_type === 1)\r\n {\r\n settingsToUpdate.timeserver_type = ResourceLang.htp\r\n }\r\n else if (settingsToUpdate.timeserver_type === 2)\r\n {\r\n settingsToUpdate.timeserver_type = ResourceLang.deepgrid\r\n }\r\n }\r\n }\r\n\r\n\r\n const renderSettingsTable = () => {\r\n if (translatedSettings !== undefined ) {\r\n translateSettingsToTableRender(translatedSettings[0])\r\n const columns = [\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.timeserver_url,\r\n dataKey: DEVICE_SETTINGS_KEYS.TIMESERVER_URL,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.timeserver_port,\r\n dataKey: DEVICE_SETTINGS_KEYS.TIMESERVER_PORT,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.timeserver_protocol,\r\n dataKey: DEVICE_SETTINGS_KEYS.TIMESERVER_PROTOCOL,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.timeserver_type,\r\n dataKey: DEVICE_SETTINGS_KEYS.TIMESERVER_TYPE,\r\n disableSort: false,\r\n }\r\n ];\r\n \r\n return ( translatedSettings[index]}\r\n sortBy={DEVICE_SETTINGS_KEYS.TIMESERVER_URL}\r\n sortDirection={'ASC'}\r\n columns={columns}\r\n />);\r\n }\r\n else {\r\n return (<>)\r\n }\r\n \r\n }\r\n\r\n return(<>{renderSettingsTable()})\r\n\r\n}\r\n\r\n\r\nNTPSettings.propTypes = {\r\n settings: PropTypes.array.isRequired\r\n};\r\n\r\nexport default NTPSettings; ","\r\nimport MuiVirtualizedTable from '../../../components/tables/MuiVirtualizedTable';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport PropTypes from 'prop-types';\r\nimport cloneDeep from 'lodash/cloneDeep';\r\n\r\nconst APNSettings = ({settings}) => {\r\n\r\n const DEVICE_SETTINGS_KEYS = {\r\n APN_NAME: 'apn_name',\r\n APN_USER:'apn_user',\r\n APN_PWD: 'apn_pwd',\r\n APN_AUTH_TYPE: 'apn_auth_type' \r\n }\r\n\r\n const translatedSettings = cloneDeep(settings);\r\n\r\n function translateApnAuthType(translatedSettings){\r\n if(translatedSettings.apn_auth_type === 1){\r\n translatedSettings.apn_auth_type = ResourceLang.PAP\r\n }\r\n else if (translatedSettings.apn_auth_type === 2)\r\n {\r\n translatedSettings.apn_auth_type = ResourceLang.CHAP\r\n }\r\n else if (translatedSettings.apn_auth_type === 3)\r\n {\r\n translatedSettings.apn_auth_type = ResourceLang.PAP_OR_CHAP\r\n }\r\n }\r\n\r\n function translatePwd(translatedSettings){\r\n let password_chars=\"\";\r\n for(let index = 0;index {\r\n if (translatedSettings !== undefined) {\r\n translateSettingsToTableRender(translatedSettings[0])\r\n const columns = [\r\n {\r\n columnWidth: 150,\r\n label: ResourceLang.name,\r\n dataKey: DEVICE_SETTINGS_KEYS.APN_NAME,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.User,\r\n dataKey: DEVICE_SETTINGS_KEYS.APN_USER,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.password,\r\n dataKey: DEVICE_SETTINGS_KEYS.APN_PWD,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 100,\r\n label: ResourceLang.Auth,\r\n dataKey: DEVICE_SETTINGS_KEYS.APN_AUTH_TYPE,\r\n disableSort: false\r\n }\r\n ];\r\n \r\n return ( translatedSettings[index]}\r\n sortBy={DEVICE_SETTINGS_KEYS.APN_NAME}\r\n sortDirection={'ASC'}\r\n columns={columns}\r\n />);\r\n }\r\n else {\r\n return (<>)\r\n }\r\n \r\n }\r\n\r\n return(<>{renderSettingsTable()})\r\n\r\n}\r\n\r\nAPNSettings.propTypes = {\r\n settings: PropTypes.array.isRequired\r\n};\r\n\r\nexport default APNSettings; ","import React from 'react';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport { withRouter } from \"react-router\";\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport MuiVirtualizedTable from '../../tables/MuiVirtualizedTable';\r\nimport PropTypes from 'prop-types';\r\nimport { DEVICE_KEYS_ENUM, SETTINGS_TYPE_ENUM } from '../../../utils/Enums';\r\nimport NTPSettings from './NTPSettings';\r\nimport APNSetting from './APNSettings';\r\nimport { Autocomplete } from '@material-ui/lab';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport ClearIcon from '@material-ui/icons/Clear';\r\nimport {Typography, TextField} from '@material-ui/core';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nconst SelectDeviceSettings = ({ devices, selectedDevices, settingsToUpdate,\r\n settingsType , handleSelection, selectAllDevices, clearAllSelectedDevices }) => {\r\n\r\n const [serialNumberFilter, setSerialNumberFilter] = React.useState();\r\n\r\n const handleSelectDevice = (rowData, event) => {\r\n handleSelection(rowData, event.target.checked)\r\n }\r\n\r\n const isSelected = (rowData) => {\r\n const isChecked = selectedDevices.some(function (device) {\r\n return device.device_id === rowData.device_id;\r\n });\r\n\r\n return isChecked\r\n }\r\n\r\n\r\n const renderDevicesTable = () => {\r\n if (devices !== undefined && devices.length > 0) {\r\n const columns = [\r\n {\r\n columnWidth: 35,\r\n label: '#',\r\n dataKey: DEVICE_KEYS_ENUM.DEVICE_ID,\r\n disableSort: true,\r\n render: (rowData) => {\r\n return ( { handleSelectDevice(rowData, e) }}\r\n color='primary'\r\n checked={isSelected(rowData)} />)\r\n }\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.serial_number,\r\n dataKey: DEVICE_KEYS_ENUM.SERIAL_NUMBER,\r\n disableSort: false,\r\n }\r\n ];\r\n if(!serialNumberFilter){\r\n return ( devices[index]}\r\n sortBy={DEVICE_KEYS_ENUM.SERIAL_NUMBER}\r\n sortDirection={'ASC'}\r\n onRowClick={() => { }}\r\n onLoadMore={() => { }}\r\n columns={columns}\r\n />);\r\n }\r\n else{\r\n return ( obj.serial_number === serialNumberFilter).length}\r\n rowCount={devices.filter(obj => obj.serial_number === serialNumberFilter).length}\r\n rowGetter={({ index }) => devices[index]}\r\n sortBy={DEVICE_KEYS_ENUM.SERIAL_NUMBER}\r\n sortDirection={'ASC'}\r\n onRowClick={() => { }}\r\n onLoadMore={() => { }}\r\n columns={columns}\r\n />);\r\n }\r\n \r\n }\r\n else {\r\n return (<>)\r\n }\r\n\r\n }\r\n\r\n const renderSettingsTable = () => {\r\n if(settingsType === SETTINGS_TYPE_ENUM.APN) {\r\n return(\r\n \r\n )\r\n }\r\n else if (settingsType === SETTINGS_TYPE_ENUM.NTP) {\r\n return(\r\n \r\n )\r\n }\r\n else{\r\n return (<>)\r\n }\r\n }\r\n\r\n const renderSelectButton = () => {\r\n if (!selectedDevices.length) {\r\n return ();\r\n }\r\n else {\r\n return ();\r\n }\r\n}\r\n\r\n\r\n const renderDeviceSearch = () => {\r\n if(selectedDevices !== undefined){\r\n return ( obj.serial_number)}\r\n onInputChange={(event, newValue, reason) => {\r\n console.log(newValue)\r\n if (reason === 'clear'){\r\n setSerialNumberFilter(newValue);\r\n }\r\n else{\r\n setSerialNumberFilter(newValue);\r\n }\r\n }}\r\n renderInput={(params) => (\r\n \r\n )}\r\n />);\r\n }\r\n else{\r\n return (<>)\r\n }\r\n}\r\n\r\n\r\n const renderHeader = () => {\r\n return (\r\n \r\n \r\n {ResourceLang.total_devices} ({selectedDevices ? selectedDevices.length : 0})\r\n \r\n \r\n \r\n \r\n {renderDeviceSearch()}\r\n {renderSelectButton()}\r\n \r\n \r\n );\r\n}\r\n\r\n return (\r\n \r\n \r\n {renderHeader()}\r\n \r\n \r\n {renderDevicesTable()}\r\n \r\n \r\n {renderSettingsTable()}\r\n \r\n \r\n );\r\n}\r\n\r\nSelectDeviceSettings.propTypes = {\r\n devices: PropTypes.array.isRequired,\r\n selectedDevices: PropTypes.array.isRequired,\r\n settingsToUpdate: PropTypes.array.isRequired,\r\n settingsType: PropTypes.number.isRequired,\r\n handleSelection: PropTypes.func.isRequired,\r\n selectAllDevices: PropTypes.func.isRequired,\r\n clearAllSelectedDevices: PropTypes.func.isRequired\r\n};\r\n\r\nexport default withRouter(SelectDeviceSettings);","import React from 'react';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, InputLabel } from '@material-ui/core';\r\nimport RawVirtualizedGrid from '../../tables/RawVirtualizedGrid';\r\nimport cloneDeep from 'lodash/cloneDeep';\r\n\r\nconst UpdateNTPSettings = ({devices, dataToBeUpdated}) => {\r\n\r\n const DeviceKeysEnum = {\r\n SERIAL_NUMBER: 'serial_number'\r\n }\r\n\r\n const DEVICE_SETTINGS_KEYS = {\r\n TIMESERVER_URL: 'timeserver_url',\r\n TIMESERVER_PORT:'timeserver_port',\r\n TIMESERVER_PROTOCOL: 'timeserver_protocol',\r\n TIMESERVER_TYPE: 'timeserver_type' \r\n }\r\n\r\n const NTP_SETTINGS_INDEX = {\r\n NTP: 0,\r\n HTP: 1,\r\n DEEPGRID: 2\r\n }\r\n\r\n function translateSettingsToTableRender(settingsToUpdate) {\r\n if(settingsToUpdate.timeserver_type !== undefined){\r\n if(settingsToUpdate.timeserver_type === NTP_SETTINGS_INDEX.NTP){\r\n settingsToUpdate.timeserver_type = ResourceLang.ntp\r\n }\r\n else if (settingsToUpdate.timeserver_type === NTP_SETTINGS_INDEX.HTP)\r\n {\r\n settingsToUpdate.timeserver_type = ResourceLang.htp\r\n }\r\n else if (settingsToUpdate.timeserver_type === NTP_SETTINGS_INDEX.DEEPGRID)\r\n {\r\n settingsToUpdate.timeserver_type = ResourceLang.deepgrid\r\n }\r\n }\r\n }\r\n\r\n const translatedSettings = cloneDeep(dataToBeUpdated);\r\n \r\n const renderContent = () => {\r\n return (\r\n \r\n {ResourceLang.devices}\r\n {renderDeviceItems()}\r\n {ResourceLang.data_update_apn}\r\n {renderNTPSettings()}\r\n \r\n \r\n );\r\n }\r\n\r\n const renderDeviceItems = () => {\r\n const gridRowGetter = (index) => { return devices[index]; }\r\n const keys = Object.keys(devices[0]);\r\n var columns = keys.map(key => ({label: ResourceLang[key], dataKey:key}))\r\n .filter(x => x.dataKey === DeviceKeysEnum.SERIAL_NUMBER );\r\n \r\n return (
\r\n \r\n
);\r\n }\r\n\r\n const renderNTPSettings = () => {\r\n translateSettingsToTableRender(translatedSettings[0])\r\n const gridRowGetter = (index) => { return translatedSettings[index]; }\r\n const columns = [\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.timeserver_url,\r\n dataKey: DEVICE_SETTINGS_KEYS.TIMESERVER_URL,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.timeserver_port,\r\n dataKey: DEVICE_SETTINGS_KEYS.TIMESERVER_PORT,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.timeserver_protocol,\r\n dataKey: DEVICE_SETTINGS_KEYS.TIMESERVER_PROTOCOL,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.timeserver_type,\r\n dataKey: DEVICE_SETTINGS_KEYS.TIMESERVER_TYPE,\r\n disableSort: false,\r\n }\r\n ];\r\n \r\n return (
\r\n \r\n
);\r\n }\r\n\r\n\r\n return (<>{renderContent()})\r\n}\r\n\r\nUpdateNTPSettings.propTypes = {\r\n devices: PropTypes.array.isRequired,\r\n dataToBeUpdated: PropTypes.array.isRequired\r\n};\r\n\r\nexport default UpdateNTPSettings;","import React from 'react';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, InputLabel } from '@material-ui/core';\r\nimport RawVirtualizedGrid from '../../tables/RawVirtualizedGrid';\r\nimport cloneDeep from 'lodash/cloneDeep';\r\n\r\nconst UpdateAPNSettings = ({devices, dataToBeUpdated}) => {\r\n\r\n const DeviceKeysEnum = {\r\n SERIAL_NUMBER: 'serial_number'\r\n }\r\n\r\n const DEVICE_SETTINGS_KEYS = {\r\n APN_NAME: 'apn_name',\r\n APN_USER:'apn_user',\r\n APN_PWD: 'apn_pwd',\r\n APN_AUTH_TYPE: 'apn_auth_type' \r\n }\r\n\r\n const APN_SETTINGS_INDEX = {\r\n PAP: 1,\r\n CHAP: 2,\r\n PAP_OR_CHAP: 3\r\n }\r\n\r\n function translateApnAuthType(translatedSettings){\r\n if(translatedSettings.apn_auth_type === APN_SETTINGS_INDEX.PAP){\r\n translatedSettings.apn_auth_type = ResourceLang.PAP\r\n }\r\n else if (translatedSettings.apn_auth_type === APN_SETTINGS_INDEX.CHAP)\r\n {\r\n translatedSettings.apn_auth_type = ResourceLang.CHAP\r\n }\r\n else if (translatedSettings.apn_auth_type === APN_SETTINGS_INDEX.PAP_OR_CHAP)\r\n {\r\n translatedSettings.apn_auth_type = ResourceLang.PAP_OR_CHAP\r\n }\r\n }\r\n \r\n function translatePwd(translatedSettings){\r\n let password_chars=\"\";\r\n for(let index = 0;index {\r\n return (\r\n \r\n {ResourceLang.devices}\r\n {renderDeviceItems()}\r\n {ResourceLang.data_update_apn}\r\n {renderApnSettings()}\r\n \r\n \r\n );\r\n }\r\n\r\n const renderDeviceItems = () => {\r\n const gridRowGetter = (index) => { return devices[index]; }\r\n const keys = Object.keys(devices[0]);\r\n var columns = keys.map(key => ({label: ResourceLang[key], dataKey:key}))\r\n .filter(x => x.dataKey === DeviceKeysEnum.SERIAL_NUMBER );\r\n \r\n return (
\r\n \r\n
);\r\n }\r\n\r\n const renderApnSettings = () => {\r\n translateSettingsToTableRender(translatedSettings[0])\r\n const gridRowGetter = (index) => { return translatedSettings[index]; }\r\n const columns = [\r\n {\r\n columnWidth: 150,\r\n label: ResourceLang.name,\r\n dataKey: DEVICE_SETTINGS_KEYS.APN_NAME,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.User,\r\n dataKey: DEVICE_SETTINGS_KEYS.APN_USER,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 75,\r\n label: ResourceLang.password,\r\n dataKey: DEVICE_SETTINGS_KEYS.APN_PWD,\r\n disableSort: false,\r\n },\r\n {\r\n columnWidth: 100,\r\n label: ResourceLang.Auth,\r\n dataKey: DEVICE_SETTINGS_KEYS.APN_AUTH_TYPE,\r\n disableSort: false\r\n }\r\n ];\r\n return (
\r\n \r\n
);\r\n }\r\n\r\n\r\n return (<>{renderContent()})\r\n}\r\n\r\nUpdateAPNSettings.propTypes = {\r\n devices: PropTypes.array.isRequired,\r\n dataToBeUpdated: PropTypes.array.isRequired\r\n};\r\n\r\nexport default UpdateAPNSettings;","import React, { useEffect } from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport PropTypes from 'prop-types';\r\nimport DialogStepper from '../../stepper/DialogStepper'\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Dialog from '../Dialog';\r\nimport SelectDeviceSettings from \"../../panels/settings/SelectDeviceSettings\";\r\nimport UpdateNTPSettingsReview from '../../panels/settings/UpdateNTPSettingsReview';\r\nimport UpdateAPNSettingsReview from '../../panels/settings/UpdateAPNSettingsReview';\r\nimport MessageSnackbar from '../../notifications/MessageSnackbar';\r\nimport { FirmwareAPI } from \"../../../utils/APIRequester\";\r\nimport {SETTINGS_TYPE_ENUM } from '../../../utils/Enums';\r\n\r\n\r\nfunction getSteps() {\r\n return [ResourceLang.select_devices,\r\n ResourceLang.review_and_confirmation];\r\n}\r\n\r\nconst SELECT_DEVICES_STEP = 0;\r\nconst REVIEW_STEP = 1;\r\n\r\nconst DeviceSettingsDialog = ({ isOpen, closeModal, settingsType, envId,\r\n deviceItemId, dataToBeUpdated }) => {\r\n const [ snackbar, setSnackbar] = React.useState({ open: false, variant: 'error', message: ''});\r\n const [ state, setState] = React.useState({\r\n devices: [],\r\n selectedDevices: [],\r\n activeStep: 0,\r\n name: undefined,\r\n description: undefined,\r\n disableNext: true,\r\n error: false,\r\n isLoading: true,\r\n selectedSds: []\r\n });\r\n const steps = getSteps();\r\n\r\n const getAllData = React.useCallback(() => {\r\n Promise.all([\r\n FirmwareAPI.getDevicesFamilyByDeviceId(envId, deviceItemId)\r\n ])\r\n .then(responses => {\r\n if (responses[0] && Array.isArray(responses[0])) {\r\n setState(prevState => ({\r\n ...prevState,\r\n isLoading: false,\r\n devices: responses[0]\r\n }));\r\n }\r\n }).catch(error => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n isLoading: false,\r\n }));\r\n })\r\n },[envId, deviceItemId]);\r\n\r\n\r\n useEffect(() => {\r\n const load = async () => {\r\n getAllData()\r\n }\r\n if(isOpen){\r\n load();\r\n setState(prevState => ({\r\n ...prevState,\r\n isLoading: false\r\n }));\r\n }\r\n\r\n }, [isOpen, getAllData]);\r\n\r\n\r\n const handleClose = () => {\r\n setState((prevState) => ({\r\n ...prevState, \r\n activeStep: SELECT_DEVICES_STEP,\r\n devices: [],\r\n selectedDevices: [],\r\n disableNext: true\r\n }));\r\n closeModal()\r\n };\r\n\r\n function updateAPNSettingsIntoServer(deviceIds, dataToUpdate){\r\n const formData = new FormData();\r\n formData.append('gprs', JSON.stringify(dataToUpdate));\r\n formData.append('ids', JSON.stringify(deviceIds));\r\n FirmwareAPI.putGPRSSettingsInBatchByDevice(envId, formData)\r\n .then(response => {\r\n setSnackbar((prevState) => ({...prevState, \r\n open: true,\r\n variant: \"success\",\r\n message: ResourceLang.update_devices_with_success\r\n }));\r\n }).catch(error => {\r\n setSnackbar((prevState) => ({...prevState, \r\n open: true,\r\n variant: \"error\",\r\n message: ResourceLang.generic_error\r\n }));\r\n })\r\n }\r\n\r\n function updateNTPSettingsIntoServer(deviceIds,dataToUpdate ){\r\n const formData = new FormData();\r\n formData.append('ntp', JSON.stringify(dataToUpdate));\r\n formData.append('ids', JSON.stringify(deviceIds));\r\n FirmwareAPI.putNTPSettingsInBatchByDevice(envId, formData)\r\n .then(response => {\r\n setSnackbar((prevState) => ({...prevState, \r\n open: true,\r\n variant: \"success\",\r\n message: ResourceLang.update_devices_with_success\r\n }));\r\n }).catch(error => {\r\n setSnackbar((prevState) => ({...prevState, \r\n open: true,\r\n variant: \"error\",\r\n message: ResourceLang.generic_error\r\n }));\r\n })\r\n }\r\n\r\n function prepareItemsToUpdateOnServer(devices, dataToUpdate) {\r\n var deviceIds = []\r\n if(devices && dataToUpdate){\r\n devices.forEach(item => {\r\n deviceIds.push(item.device_id)\r\n });\r\n if(settingsType === SETTINGS_TYPE_ENUM.APN){\r\n updateAPNSettingsIntoServer(deviceIds, dataToUpdate)\r\n }\r\n else if (settingsType === SETTINGS_TYPE_ENUM.NTP){\r\n updateNTPSettingsIntoServer(deviceIds, dataToUpdate)\r\n }\r\n }\r\n }\r\n\r\n const submitUpdate = () => {\r\n prepareItemsToUpdateOnServer(state.selectedDevices, dataToBeUpdated[0])\r\n setState((prevState) => ({\r\n ...prevState, \r\n activeStep: SELECT_DEVICES_STEP,\r\n devices: [],\r\n selectedDevices: [],\r\n disableNext: true\r\n }));\r\n closeModal();\r\n }\r\n\r\n const handleNext = () => {\r\n if(state.activeStep === REVIEW_STEP){\r\n submitUpdate()\r\n }\r\n else{\r\n setState((prevState) => ({\r\n ...prevState, \r\n activeStep: state.activeStep + 1\r\n }));\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n if(state.activeStep === SELECT_DEVICES_STEP){\r\n setState((prevState) => ({\r\n ...prevState, \r\n activeStep: SELECT_DEVICES_STEP,\r\n devices: [],\r\n selectedDevices: [],\r\n disableNext: true\r\n }));\r\n closeModal();\r\n }\r\n else{\r\n setState((prevState) => ({\r\n ...prevState, \r\n activeStep: state.activeStep - 1\r\n }));\r\n }\r\n };\r\n\r\n const setDeviceSelected = (rowData, isChecked) => {\r\n var devices = state.selectedDevices;\r\n\r\n if (isChecked === true) {\r\n devices.push(rowData);\r\n } else {\r\n devices = state.selectedDevices.filter(function (device) {\r\n return device.device_id !== rowData.device_id;\r\n });\r\n }\r\n\r\n return devices;\r\n }\r\n\r\n\r\n const handleSelection = (rowData, isChecked) => {\r\n if (rowData !== undefined) {\r\n const devices = setDeviceSelected(rowData, isChecked)\r\n if(devices.length){\r\n setState((prevState) => ({\r\n ...prevState, \r\n selectedDevices: devices,\r\n disableNext: false\r\n }));\r\n }\r\n else{\r\n setState((prevState) => ({\r\n ...prevState, \r\n selectedDevices: devices,\r\n disableNext: true\r\n }));\r\n }\r\n }\r\n }\r\n\r\n const selectAllDevices = () =>{\r\n setState((prevState) => ({\r\n ...prevState, \r\n selectedDevices: state.devices,\r\n disableNext: false\r\n }));\r\n }\r\n\r\n const clearAllSelectedDevices = () =>{\r\n setState((prevState) => ({\r\n ...prevState, \r\n selectedDevices: [],\r\n disableNext:true\r\n }));\r\n }\r\n\r\n const renderBody = () => {\r\n if(state.devices !== undefined)\r\n {\r\n switch (state.activeStep) {\r\n case 0:\r\n return();\r\n case 1:\r\n if(settingsType === SETTINGS_TYPE_ENUM.APN){\r\n return(\r\n )\r\n }\r\n else if(settingsType === SETTINGS_TYPE_ENUM.NTP){\r\n return(\r\n )\r\n }\r\n break;\r\n \r\n default:\r\n return (<>);\r\n }\r\n }\r\n }\r\n\r\n const renderTitle = () => {\r\n if(settingsType === SETTINGS_TYPE_ENUM.APN){\r\n return (\r\n <>{ResourceLang.device_settings_update} -\r\n {ResourceLang.Apn_Settings}\r\n )\r\n }\r\n else if (settingsType === SETTINGS_TYPE_ENUM.NTP){\r\n return (\r\n <>{ResourceLang.device_settings_update} - \r\n {ResourceLang.ntp_settings}\r\n )\r\n }\r\n else{\r\n return (\r\n <>{ResourceLang.device_settings_update} -\r\n {ResourceLang.unknowm}\r\n )\r\n }\r\n }\r\n\r\n const renderContent = () => {\r\n return (\r\n
\r\n \r\n {renderBody()}\r\n
\r\n )\r\n }\r\n\r\n const renderFooter = () => {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n \r\n {state.activeStep === steps.length - 1 ? 'submit' : 'next'}\r\n \r\n
\r\n
\r\n
\r\n )\r\n }\r\n\r\n const handleSnackbarClose = () =>{\r\n setSnackbar((prevState) => ({...prevState, \r\n open: false, \r\n }));\r\n }\r\n\r\n const renderSnackbar = () => {\r\n return ();\r\n }\r\n\r\n\r\n return (\r\n
\r\n \r\n \r\n {renderContent()}\r\n {renderFooter()}\r\n \r\n \r\n {renderSnackbar()}\r\n
\r\n );\r\n}\r\n\r\nDeviceSettingsDialog.propTypes = {\r\n isOpen: PropTypes.bool.isRequired,\r\n closeModal: PropTypes.func.isRequired,\r\n settingsType: PropTypes.number.isRequired,\r\n envId: PropTypes.string.isRequired,\r\n deviceItemId: PropTypes.string.isRequired,\r\n dataToBeUpdated: PropTypes.array.isRequired\r\n};\r\n\r\nexport default DeviceSettingsDialog;","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport InputPassword from '../../../components/inputs/InputPassword';\r\nimport {FirmwareAPI} from '../../../utils/APIRequester';\r\nimport { OvalButtonPrimary, useStyles as ovalByttonsStyleBase } from '../../../components/buttons/OvalButtons';\r\nimport { CircularButtonTransparent } from '../../../components/buttons/CircularButtons';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Row, Col, FormGroup, Label, Input } from 'reactstrap';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faSignal } from '@fortawesome/free-solid-svg-icons';\r\nimport {SETTINGS_TYPE_ENUM } from '../../../utils/Enums';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport DeviceSettingsDialog from '../../../components/dialogs/add/DeviceSettingsDialog';\r\nimport MessageSnackbar from '../../../components/notifications/MessageSnackbar';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport CancelIcon from '@material-ui/icons/NotInterested';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Button from '@material-ui/core/Button';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n padding: theme.spacing(3),\r\n margin: theme.spacing(1),\r\n },\r\n button: {\r\n margin: theme.spacing(1),\r\n float:'right'\r\n },\r\n label_title: {\r\n color: \"#94A3A7\",\r\n fontWeight: 'bold',\r\n marginBottom: theme.spacing(0)\r\n },\r\n divider:{\r\n marginTop: theme.spacing(2),\r\n marginBottom: theme.spacing(1),\r\n }\r\n}));\r\n\r\n\r\nconst APNSettings = ({\r\n envId, interfaceGPRS, deviceItemId\r\n}) => {\r\n const classes = useStyles();\r\n const ovalButtonsStyle = ovalByttonsStyleBase();\r\n const [editMode, setEditMode] = useState(false);\r\n const [openApplyToDialog, setApplyToDialog] = useState(false);\r\n const [ snackbar, setSnackbar] = useState({ open: false, variant: 'error', message: ''});\r\n const [data, setData] = useState(interfaceGPRS);\r\n \r\n const readOnly = editMode ? '' : 'readonly';\r\n\r\n\r\n const handleEditClick = () => {\r\n setEditMode(!editMode);\r\n }\r\n\r\n const renderPanelHeader = () => {\r\n return (\r\n \r\n \r\n {ResourceLang.Apn_Settings} \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n const renderAuthInput = () => {\r\n const AUTH_OPTIONS = [\r\n {label: ResourceLang.NONE, value: 0},\r\n {label: ResourceLang.PAP, value: 1},\r\n {label: ResourceLang.CHAP, value: 2},\r\n {label: ResourceLang.PAP_OR_CHAP, value: 3},\r\n ]\r\n\r\n if(editMode) {\r\n return({\r\n const value = parseInt(event.target.value, 10);\r\n setData({...data, apn_auth_type: value});\r\n }}>\r\n {\r\n AUTH_OPTIONS.map(({value, label}) => \r\n \r\n )\r\n }\r\n );\r\n }\r\n else{\r\n let value = ResourceLang.NONE;\r\n\r\n if (data.apn_auth_type) {\r\n const target = AUTH_OPTIONS.find(x => x.value === data.apn_auth_type);\r\n if (target)\r\n value = target.label;\r\n }\r\n\r\n return(\r\n \r\n {value}\r\n \r\n );\r\n }\r\n }\r\n\r\n const renderNameField = () => {\r\n if (editMode === true)\r\n return (\r\n {\r\n setData({...data, apn_name: event.target.value});\r\n }}/>\r\n )\r\n else\r\n return (\r\n \r\n {data.apn_name}\r\n \r\n )\r\n\r\n }\r\n\r\n const renderUserField = () => {\r\n if (editMode === true)\r\n return (\r\n {\r\n setData({...data, apn_user: event.target.value});\r\n }}/>\r\n )\r\n else\r\n return(\r\n \r\n {data.apn_user}\r\n \r\n )\r\n }\r\n\r\n const renderPasswordField = () =>{\r\n let Password_Chars = \"\";\r\n if (editMode === true)\r\n return (\r\n {\r\n setData({...data, apn_pwd: event.target.value});\r\n }}/>\r\n )\r\n else\r\n Password_Chars=\"\";\r\n for(let index = 0;index\r\n {Password_Chars}\r\n \r\n )\r\n }\r\n\r\n const renderICCIDField = () => {\r\n return(\r\n \r\n {data.iccid ? data.iccid : ResourceLang.not_applicable}\r\n \r\n )\r\n }\r\n\r\n const renderCurrentIPField = () => {\r\n return(\r\n \r\n {data.current_ip ? data.current_ip : ResourceLang.not_applicable}\r\n \r\n )\r\n }\r\n\r\n const renderDialogApplyTo = () =>{\r\n var UpdateData = []\r\n UpdateData.push(data)\r\n return( setApplyToDialog(false)}\r\n settingsType={SETTINGS_TYPE_ENUM.APN}\r\n envId={envId}\r\n deviceItemId={deviceItemId}\r\n dataToBeUpdated={UpdateData}/>\r\n )\r\n }\r\n\r\n const enableDialogApplyTo = () =>{\r\n setApplyToDialog(true)\r\n }\r\n\r\n const renderPanelFields = () => {\r\n return (<>\r\n \r\n \r\n \r\n \r\n {renderNameField()}\r\n \r\n \r\n \r\n \r\n \r\n {renderAuthInput()}\r\n \r\n \r\n \r\n \r\n \r\n {renderICCIDField()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {renderUserField()}\r\n \r\n \r\n \r\n \r\n \r\n {renderPasswordField()}\r\n \r\n \r\n \r\n \r\n \r\n {renderCurrentIPField()}\r\n \r\n \r\n {!editMode ? \r\n \r\n \r\n : null}\r\n \r\n \r\n )\r\n }\r\n\r\n const handleSnackbarClose = () =>{\r\n setSnackbar((prevState) => ({...prevState, \r\n open: false, \r\n }));\r\n }\r\n\r\n const renderSnackbar = () => {\r\n return ();\r\n }\r\n\r\n const renderButtons = () => {\r\n if(editMode === false)\r\n return null;\r\n \r\n return(\r\n \r\n {\r\n const formData = new FormData();\r\n formData.append('gprs', JSON.stringify(data));\r\n FirmwareAPI.putGPRSSettingsByDevice(envId, deviceItemId, formData)\r\n .then(response => {\r\n setEditMode(false);\r\n setSnackbar((prevState) => ({...prevState, \r\n open: true,\r\n variant: \"success\",\r\n message: ResourceLang.update_with_success\r\n }));\r\n }).catch(error => {\r\n setEditMode(true);\r\n setSnackbar((prevState) => ({...prevState, \r\n open: true,\r\n variant: \"success\",\r\n message: ResourceLang.update_with_success\r\n }));\r\n })\r\n }}>\r\n \r\n {ResourceLang.submit}\r\n \r\n {\r\n setData({...interfaceGPRS});\r\n setEditMode(false);\r\n }}>\r\n \r\n {ResourceLang.cancel}\r\n \r\n \r\n );\r\n }\r\n \r\n return(\r\n {renderPanelHeader()}\r\n \r\n {renderPanelFields()}\r\n {renderButtons()}\r\n {renderDialogApplyTo()}\r\n {renderSnackbar()}\r\n );\r\n}\r\n\r\n\r\nAPNSettings.propTypes = {\r\n interfaceGPRS: PropTypes.shape({\r\n apn_name: PropTypes.string.isRequired,\r\n apn_auth_type: PropTypes.number.isRequired,\r\n apn_user: PropTypes.string.isRequired,\r\n apn_pwd: PropTypes.string.isRequired,\r\n iccid: PropTypes.string,\r\n current_ip: PropTypes.string\r\n }).isRequired\r\n}\r\n\r\nexport default APNSettings","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ResourceLang from '../../../resources/Language';\r\nimport {FirmwareAPI} from '../../../utils/APIRequester';\r\nimport { OvalButtonPrimary, useStyles as ovalByttonsStyleBase } from '../../../components/buttons/OvalButtons';\r\nimport { CircularButtonTransparent } from '../../../components/buttons/CircularButtons';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Row, Col, FormGroup, Label, Input } from 'reactstrap';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faSignal } from '@fortawesome/free-solid-svg-icons';\r\nimport {SETTINGS_TYPE_ENUM } from '../../../utils/Enums';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport CancelIcon from '@material-ui/icons/NotInterested';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Button from '@material-ui/core/Button';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport DeviceSettingsDialog from '../../../components/dialogs/add/DeviceSettingsDialog';\r\nimport MessageSnackbar from '../../../components/notifications/MessageSnackbar';\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n padding: theme.spacing(3),\r\n margin: theme.spacing(1),\r\n },\r\n button: {\r\n margin: theme.spacing(1),\r\n float:'right'\r\n },\r\n label_title: {\r\n color: \"#94A3A7\",\r\n fontWeight: 'bold',\r\n marginBottom: theme.spacing(0)\r\n },\r\n divider:{\r\n marginTop: theme.spacing(2),\r\n marginBottom: theme.spacing(1),\r\n }\r\n}));\r\n\r\n\r\nconst NTPSettings = ({\r\n envId, interfaceNTP, deviceItemId\r\n}) => {\r\n const classes = useStyles();\r\n const ovalButtonsStyle = ovalByttonsStyleBase();\r\n const [editMode, setEditMode] = useState(false);\r\n const [openApplyToDialog, setApplyToDialog] = useState(false);\r\n const [data, setData] = useState(interfaceNTP);\r\n const [ snackbar, setSnackbar] = useState({ open: false, variant: 'error', message: ''});\r\n \r\n const readOnly = editMode ? '' : 'readonly';\r\n \r\n const handleEditClick = () => {\r\n setEditMode(!editMode);\r\n }\r\n\r\n const renderPanelHeader = () => {\r\n return (\r\n \r\n \r\n {ResourceLang.ntp_settings} \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n const renderTimeServerType = () => {\r\n const TIMESERVER_OPTIONS = [\r\n {label: ResourceLang.ntp, value: 0},\r\n {label: ResourceLang.htp, value: 1},\r\n {label: ResourceLang.deepgrid, value: 2}\r\n ]\r\n\r\n if(editMode) {\r\n return({\r\n const value = parseInt(event.target.value, 10);\r\n setData({...data, timeserver_type: value});\r\n }}>\r\n {\r\n TIMESERVER_OPTIONS.map(({value, label}) => \r\n \r\n )\r\n }\r\n );\r\n }\r\n else{\r\n let value = ResourceLang.NONE;\r\n if (data.timeserver_type !== undefined) {\r\n const target = TIMESERVER_OPTIONS.find(x => x.value === data.timeserver_type);\r\n if (target)\r\n value = target.label;\r\n }\r\n return(\r\n \r\n {value}\r\n \r\n );\r\n }\r\n }\r\n\r\n const renderTimeServerURL = () => {\r\n if (editMode === true)\r\n return (\r\n {\r\n setData({...data, timeserver_url: event.target.value});\r\n }}/>\r\n )\r\n else{\r\n if(data.timeserver_url){\r\n return (\r\n \r\n {data.timeserver_url}\r\n \r\n )\r\n }\r\n else{\r\n \r\n {ResourceLang.not_applicable}\r\n \r\n }\r\n \r\n }\r\n }\r\n\r\n const renderTimeServerPort = () => {\r\n if (editMode === true)\r\n return (\r\n {\r\n setData({...data, timeserver_port: event.target.value});\r\n }}/>\r\n )\r\n else {\r\n if(data.timeserver_port){\r\n return(\r\n \r\n {data.timeserver_port}\r\n \r\n )\r\n }\r\n else{\r\n return(\r\n \r\n {ResourceLang.not_applicable}\r\n \r\n )\r\n }\r\n }\r\n }\r\n\r\n const renderTimeServerProtocol = () =>{\r\n if (editMode === true)\r\n return (\r\n {\r\n setData({...data, timeserver_protocol: event.target.value});\r\n }}/>\r\n )\r\n else{\r\n if(data.timeserver_protocol){\r\n return(\r\n \r\n {data.timeserver_protocol}\r\n \r\n )\r\n }\r\n else{\r\n return(\r\n \r\n {ResourceLang.not_applicable}\r\n \r\n )\r\n }\r\n } \r\n }\r\n\r\n const renderDialogApplyTo = () =>{\r\n var UpdateData = []\r\n UpdateData.push(data)\r\n return( setApplyToDialog(false)}\r\n settingsType={SETTINGS_TYPE_ENUM.NTP}\r\n envId={envId}\r\n deviceItemId={deviceItemId}\r\n dataToBeUpdated={UpdateData}/>\r\n )\r\n }\r\n\r\n const enableDialogApplyTo = () =>{\r\n setApplyToDialog(true)\r\n }\r\n\r\n const renderPanelFields = () => {\r\n return (<>\r\n \r\n \r\n \r\n \r\n {renderTimeServerURL()}\r\n \r\n \r\n \r\n \r\n \r\n {renderTimeServerPort()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {renderTimeServerType()}\r\n \r\n \r\n \r\n \r\n \r\n {renderTimeServerProtocol()}\r\n \r\n \r\n {!editMode ? \r\n \r\n \r\n : null}\r\n \r\n \r\n )\r\n }\r\n\r\n const handleSnackbarClose = () =>{\r\n setSnackbar((prevState) => ({...prevState, \r\n open: false, \r\n }));\r\n }\r\n\r\n const renderSnackbar = () => {\r\n return ();\r\n }\r\n\r\n const renderButtons = () => {\r\n if(editMode === false)\r\n return null;\r\n \r\n return(\r\n \r\n {\r\n const formData = new FormData();\r\n formData.append('ntp', JSON.stringify(data));\r\n FirmwareAPI.putNTPSettingsByDevice(envId, deviceItemId ,formData)\r\n .then(response => {\r\n setEditMode(false);\r\n setSnackbar((prevState) => ({...prevState, \r\n open: true,\r\n variant: \"success\",\r\n message: ResourceLang.update_with_success\r\n }));\r\n }).catch(error => {\r\n setEditMode(true);\r\n setSnackbar((prevState) => ({...prevState, \r\n open: true, \r\n variant: \"error\",\r\n message: ResourceLang.generic_error\r\n }));\r\n })\r\n }}>\r\n \r\n {ResourceLang.submit}\r\n \r\n {\r\n setData({...interfaceNTP});\r\n setEditMode(false);\r\n }}>\r\n \r\n {ResourceLang.cancel}\r\n \r\n \r\n );\r\n }\r\n\r\n\r\n return(\r\n {renderPanelHeader()}\r\n \r\n {renderPanelFields()}\r\n {renderButtons()}\r\n {renderDialogApplyTo()}\r\n {renderSnackbar()}\r\n );\r\n}\r\n\r\n\r\nNTPSettings.propTypes = {\r\n interfaceNTP: PropTypes.shape({\r\n timeserver_url: PropTypes.string.isRequired,\r\n timeserver_port: PropTypes.number.isRequired,\r\n timeserver_protocol: PropTypes.string.isRequired,\r\n timeserver_type: PropTypes.number.isRequired\r\n }).isRequired\r\n}\r\n\r\nexport default NTPSettings;","import React , {useState, useEffect} from 'react'\r\nimport { withRouter } from \"react-router\";\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport ResourceLang from '../../resources/Language';\r\nimport MemoryIcon from '@material-ui/icons/Memory';\r\nimport {FirmwareAPI} from '../../utils/APIRequester';\r\nimport PageLoading from '../../components/loadings/PageLoading';\r\nimport { handleBodyResize } from '../../utils/BrowserServices';\r\nimport { Paper, Grid, Typography } from '@material-ui/core';\r\nimport APNSettings from './settings/APNSettingsPage';\r\nimport NTPSettings from './settings/NTPSettingsPage'; \r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'auto'\r\n },\r\n button: {\r\n margin: theme.spacing(1),\r\n float:'right'\r\n },\r\n headerTitle: {\r\n flexGrow: 1,\r\n marginLeft: theme.spacing(2)\r\n },\r\n tableContainer: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n },\r\n toolbar: {\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(1),\r\n },\r\n chip: {\r\n margin: theme.spacing(0.5),\r\n },\r\n}));\r\n\r\n\r\nconst EditDevicePage = ({match, location, history, ...props}) => {\r\n const classes = useStyles();\r\n const [state, setState] = useState({\r\n selected: undefined,\r\n deviceItem: undefined\r\n })\r\n\r\n const envId = match.params.envId;\r\n console.log(match.params)\r\n const deviceId = match.params.deviceId;\r\n \r\n useEffect(() => {\r\n if(!state.deviceItem)\r\n {\r\n FirmwareAPI.getGPRSSettingsByDevice(envId, deviceId).then(response => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n deviceItem: response\r\n }));\r\n }).catch(error => {\r\n setState((prevState) => ({\r\n ...prevState, deviceItem: []\r\n }));\r\n })\r\n }\r\n\r\n window.addEventListener('resize', handleBodyResize, true);\r\n return () => {\r\n window.removeEventListener('resize', handleBodyResize, true);\r\n }\r\n }, [state.deviceItem, deviceId, envId]);\r\n\r\n handleBodyResize();\r\n const HEADER_HEIGHT = 64;\r\n const TOP_OFFSET = HEADER_HEIGHT;\r\n const renderPageHeader = () => {\r\n if(state.deviceItem !== undefined && state.deviceItem.devices)\r\n return(\r\n \r\n \r\n \r\n {ResourceLang.device} - {state.deviceItem.devices[0].serial_number}\r\n \r\n \r\n );\r\n }\r\n\r\n function getInterfaceGprs(interfaceItem){\r\n var interface_gprs={}\r\n interface_gprs.apn_name = interfaceItem.apn_name\r\n interface_gprs.apn_auth_type = interfaceItem.apn_auth_type\r\n interface_gprs.apn_user = interfaceItem.apn_user\r\n interface_gprs.apn_pwd = interfaceItem.apn_pwd\r\n interface_gprs.iccid = interfaceItem.iccid\r\n interface_gprs.current_ip = interfaceItem.current_ip\r\n return interface_gprs\r\n }\r\n\r\n function getInterfaceNTP(interfaceItem){\r\n var interface_ntp = {}\r\n interface_ntp.timeserver_url = interfaceItem.timeserver_url\r\n interface_ntp.timeserver_port = interfaceItem.timeserver_port\r\n interface_ntp.timeserver_protocol = interfaceItem.timeserver_protocol\r\n interface_ntp.timeserver_type = interfaceItem.timeserver_type\r\n return interface_ntp\r\n }\r\n\r\n const renderSettings = () =>{\r\n if(state.deviceItem !== undefined) {\r\n return(\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n else{\r\n return<>\r\n }\r\n }\r\n\r\n return(
\r\n \r\n \r\n \r\n {renderPageHeader()}\r\n \r\n \r\n \r\n {renderSettings()}\r\n \r\n \r\n {!state.deviceItem ? : null}\r\n
);\r\n\r\n}\r\n\r\nexport default withRouter(EditDevicePage);\r\n","import React from 'react';\r\nimport { Route, Redirect } from \"react-router\";\r\nimport { connect } from 'react-redux';\r\nimport { setLoggedUser, SetUserData} from '../redux/actions/UserActions';\r\nimport SessionServices from '../utils/SessionServices';\r\nimport NavBar from '../components/navigation/NavBar';\r\nimport DashboardPage from '../pages/DashboardPage';\r\nimport EnvironmentPage from '../pages/EnvironmentPage';\r\nimport UploadFirmwarePage from '../pages/UploadFirmwarePage';\r\nimport UpdateFirmwarePage from '../pages/UpdateFirmwarePage';\r\nimport DevicePage from '../pages/devices/ListDevicePage';\r\nimport EditDevicePage from '../pages/devices/EditDevicePage';\r\n\r\nconst ProtectedRoutes = (props) => {\r\n const {isLoggedIn} = props;\r\n const {location} = props;\r\n\r\n const renderRoutes = () => {\r\n if (isLoggedIn) {\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 {\r\n\r\n if (location && location.pathname) {\r\n const isLoginRoute = (location.pathname.toLowerCase().indexOf('login') >= 0);\r\n\r\n if (!isLoginRoute)\r\n SessionServices.saveRedirectTo(location.pathname);\r\n }\r\n\r\n return ;\r\n }\r\n };\r\n\r\n return(\r\n renderRoutes()\r\n )\r\n}\r\n\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n return {\r\n isLoggedIn: state.userStatus,\r\n userData: state.userData\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n setUserinStore: (user) => dispatch(setLoggedUser(user)),\r\n setUserData:(user) => dispatch(SetUserData(user)),\r\n };\r\n};\r\n\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ProtectedRoutes);\r\n","import React from 'react';\r\nimport { Router, Switch, Route } from \"react-router\";\r\nimport LoginPage from '../pages/LoginPage';\r\nimport { createBrowserHistory } from 'history';\r\nimport ScrollToTop from './ScrollToTop';\r\nimport ProtectedRoutes from './ProtectedRoutes';\r\n\r\nconst history = createBrowserHistory();\r\n\r\nconst Routes = () => {\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 Routes","import React, {Component} from 'react';\r\nimport { Provider } from 'react-redux';\r\nimport { IntlProvider } from 'react-intl';\r\nimport storage from 'redux-persist/lib/storage';\r\nimport { createStore, applyMiddleware, compose } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { persistStore, persistReducer } from 'redux-persist';\r\nimport rootReducer from '../reducers/index';\r\nimport Routes from '../../routes/Routes';\r\n\r\nconst language=\"pt-PT\";\r\n\r\nconst persistConfig = {\r\n key: 'root',\r\n storage: storage,\r\n};\r\n\r\nconst persistedReducer = persistReducer(persistConfig, rootReducer);\r\nconst composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\r\nexport const store = createStore(persistedReducer, {}, composeEnhancers(applyMiddleware(thunk)));\r\n\r\nexport var persistor;\r\nexport default class AppProvider extends Component {\r\n\r\n constructor() {\r\n super()\r\n this.state = { rehydrated: false }\r\n }\r\n\r\n componentDidMount(){\r\n\r\n window.addEventListener(\"click\", this.handleInteraction)\r\n window.addEventListener(\"mousemove\", this.handleInteraction)\r\n window.addEventListener(\"keypress\", this.handleInteraction)\r\n\r\n persistor = persistStore(store, {}, () => {\r\n this.setState({ rehydrated: true });\r\n });\r\n\r\n }\r\n\r\n handleInteraction = () =>{\r\n localStorage.lastInteraction = new Date().getTime();\r\n }\r\n\r\n componentWillUnmount(){\r\n window.removeEventListener(\"click\", this.handleInteraction)\r\n window.removeEventListener(\"mousemove\", this.handleInteraction)\r\n window.removeEventListener(\"keypress\", this.handleInteraction)\r\n }\r\n\r\n\r\n render() {\r\n if(!this.state.rehydrated){\r\n return (
Loading...
);\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\r\n","import { createMuiTheme } from '@material-ui/core/styles';\r\n\r\n//see https://github.com/mui-org/material-ui/tree/master/packages/material-ui/src/styles\r\nexport const MuiTheme = createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: '#2C4153',\r\n },\r\n secondary: {\r\n main: '#F1C419',\r\n },\r\n },\r\n});","import React from 'react';\r\nimport CacheBuster from './utils/CacheBuster';\r\nimport AppProvider from './redux/store/AppProvider';\r\nimport { ThemeProvider } from '@material-ui/core/styles';\r\nimport { MuiTheme } from './components/themes/MuiTheme';\r\n\r\n\r\nfunction App() {\r\n return(\r\n {({ loading, isLatestVersion, refreshCacheAndReload }) => {\r\n if (loading)\r\n return null;\r\n\r\n if (!loading && !isLatestVersion) {\r\n // You can decide how and when you want to force reload\r\n refreshCacheAndReload();\r\n }\r\n\r\n return (\r\n \r\n \r\n );\r\n }}\r\n );\r\n}\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './resources/css/index.css';\r\nimport 'bootstrap/dist/css/bootstrap.min.css';\r\nimport App from './App';\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n"],"sourceRoot":""}