mirror of
				https://github.com/Telecominfraproject/wlan-cloud-ui.git
				synced 2025-10-31 18:57:59 +00:00 
			
		
		
		
	Compare commits
	
		
			5 Commits
		
	
	
		
			v1.0.0-rc1
			...
			feature/NE
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0439b052ca | ||
|   | 448a198c23 | ||
|   | f989132de6 | ||
|   | a6406e2be3 | ||
|   | 0748ddbed1 | 
							
								
								
									
										11
									
								
								.github/workflows/dockerpublish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/dockerpublish.yml
									
									
									
									
										vendored
									
									
								
							| @@ -5,7 +5,6 @@ on: | ||||
|     # Publish `master` as Docker `latest` image. | ||||
|     branches: | ||||
|       - master | ||||
|       - 'release/**' | ||||
|  | ||||
|     # Publish `v1.2.3` tags as releases. | ||||
|     tags: | ||||
| @@ -57,11 +56,8 @@ jobs: | ||||
|           # Strip "v" prefix from tag name | ||||
|           [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') | ||||
|  | ||||
|           # Create a release snapshot if we are on release branch | ||||
|           [[ "${{ github.ref }}" == "refs/heads/release/"* ]] && VERSION=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\/release\/[v]//' | awk '{print $1"-SNAPSHOT"}') | ||||
|  | ||||
|           # Use Docker `latest` tag convention | ||||
|           [ "$VERSION" == "master" ] && VERSION=1.0.0-SNAPSHOT | ||||
|           [ "$VERSION" == "master" ] && VERSION=latest | ||||
|  | ||||
|           TIMESTAMP=$(date +'%Y-%m-%d') | ||||
|  | ||||
| @@ -92,11 +88,8 @@ jobs: | ||||
|           # Strip "v" prefix from tag name | ||||
|           [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') | ||||
|  | ||||
|           # Create a release snapshot if we are on release branch | ||||
|           [[ "${{ github.ref }}" == "refs/heads/release/"* ]] && VERSION=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\/release\/[v]//' | awk '{print $1"-SNAPSHOT"}') | ||||
|  | ||||
|           # Use Docker `latest` tag convention | ||||
|           [ "$VERSION" == "master" ] && VERSION=1.0.0-SNAPSHOT | ||||
|           [ "$VERSION" == "master" ] && VERSION=latest | ||||
|  | ||||
|           echo IMAGE_ID=$IMAGE_ID | ||||
|           echo VERSION=$VERSION | ||||
|   | ||||
							
								
								
									
										58
									
								
								app/components/UsersDropdown/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								app/components/UsersDropdown/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| import React, { useState } from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import { Popover, Row } from 'antd'; | ||||
| import { UserOutlined } from '@ant-design/icons'; | ||||
|  | ||||
| import styles from './index.module.scss'; | ||||
|  | ||||
| const UsersDropdown = ({ onLogout }) => { | ||||
|   const [popoverVisible, setPopoverVisible] = useState(false); | ||||
|  | ||||
|   const hidePopover = () => { | ||||
|     setPopoverVisible(false); | ||||
|   }; | ||||
|  | ||||
|   const handleVisibleChange = visible => { | ||||
|     setPopoverVisible(visible); | ||||
|   }; | ||||
|  | ||||
|   const userOptions = ( | ||||
|     <> | ||||
|       <Row> | ||||
|         <Link onClick={hidePopover} to="/account"> | ||||
|           Account | ||||
|         </Link> | ||||
|       </Row> | ||||
|       <Row> | ||||
|         <Link onClick={onLogout} to="/"> | ||||
|           Log Out | ||||
|         </Link> | ||||
|       </Row> | ||||
|     </> | ||||
|   ); | ||||
|  | ||||
|   return ( | ||||
|     <Popover | ||||
|       content={userOptions} | ||||
|       trigger="click" | ||||
|       getPopupContainer={e => e.parentElement} | ||||
|       visible={popoverVisible} | ||||
|       onVisibleChange={handleVisibleChange} | ||||
|       placement="bottomRight" | ||||
|       arrowPointAtCenter | ||||
|     > | ||||
|       <UserOutlined className={styles.MenuIcon} /> | ||||
|     </Popover> | ||||
|   ); | ||||
| }; | ||||
|  | ||||
| UsersDropdown.propTypes = { | ||||
|   onLogout: PropTypes.func, | ||||
| }; | ||||
|  | ||||
| UsersDropdown.defaultProps = { | ||||
|   onLogout: () => {}, | ||||
| }; | ||||
|  | ||||
| export default UsersDropdown; | ||||
							
								
								
									
										7
									
								
								app/components/UsersDropdown/index.module.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/components/UsersDropdown/index.module.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| .MenuIcon { | ||||
|     cursor: pointer; | ||||
|     font-size: 18px; | ||||
|     line-height: 64px; | ||||
|     padding: 0 24px; | ||||
|   } | ||||
|    | ||||
| @@ -7,7 +7,7 @@ import { useHistory } from 'react-router-dom'; | ||||
| import { ROUTES } from 'constants/index'; | ||||
| import UserContext from 'contexts/UserContext'; | ||||
| import { GET_ALL_PROFILES } from 'graphql/queries'; | ||||
| import { fetchMoreProfiles } from 'graphql/functions'; | ||||
| import { updateQueryGetAllProfiles } from 'graphql/functions'; | ||||
|  | ||||
| const CREATE_PROFILE = gql` | ||||
|   mutation CreateProfile( | ||||
| @@ -37,43 +37,24 @@ const AddProfile = () => { | ||||
|   const { customerId } = useContext(UserContext); | ||||
|   const { data: ssidProfiles, fetchMore } = useQuery(GET_ALL_PROFILES(), { | ||||
|     variables: { customerId, type: 'ssid' }, | ||||
|     fetchPolicy: 'network-only', | ||||
|   }); | ||||
|   const { data: radiusProfiles, fetchMore: fetchMoreRadiusProfiles } = useQuery( | ||||
|     GET_ALL_PROFILES(), | ||||
|     { | ||||
|       variables: { customerId, type: 'radius' }, | ||||
|       fetchPolicy: 'network-only', | ||||
|     } | ||||
|   ); | ||||
|   const { data: captiveProfiles, fetchMore: fetchMoreCaptiveProfiles } = useQuery( | ||||
|     GET_ALL_PROFILES(), | ||||
|     { | ||||
|       variables: { customerId, type: 'captive_portal' }, | ||||
|       fetchPolicy: 'network-only', | ||||
|     } | ||||
|   ); | ||||
|   const { data: venueProfiles, fetchMore: fetchMoreVenueProfiles } = useQuery(GET_ALL_PROFILES(), { | ||||
|     variables: { customerId, type: 'passpoint_venue' }, | ||||
|     fetchPolicy: 'network-only', | ||||
|   }); | ||||
|   const { data: operatorProfiles, fetchMore: fetchMoreOperatorProfiles } = useQuery( | ||||
|     GET_ALL_PROFILES(), | ||||
|     { | ||||
|       variables: { customerId, type: 'passpoint_operator' }, | ||||
|       fetchPolicy: 'network-only', | ||||
|     } | ||||
|   ); | ||||
|   const { data: idProviderProfiles, fetchMore: fetchMoreIdProviderProfiles } = useQuery( | ||||
|     GET_ALL_PROFILES(), | ||||
|     { | ||||
|       variables: { customerId, type: 'passpoint_osu_id_provider' }, | ||||
|       fetchPolicy: 'network-only', | ||||
|     } | ||||
|   ); | ||||
|   const { data: rfProfiles, fetchMore: fetchMoreRfProfiles } = useQuery(GET_ALL_PROFILES(), { | ||||
|     variables: { customerId, type: 'rf' }, | ||||
|     fetchPolicy: 'network-only', | ||||
|   }); | ||||
|   const [createProfile] = useMutation(CREATE_PROFILE); | ||||
|   const history = useHistory(); | ||||
| @@ -103,30 +84,111 @@ const AddProfile = () => { | ||||
|       ); | ||||
|   }; | ||||
|  | ||||
|   const handleFetchMoreProfiles = (e, key) => { | ||||
|     if (key === 'radius') fetchMoreProfiles(e, radiusProfiles, fetchMoreRadiusProfiles); | ||||
|     else if (key === 'captive_portal') | ||||
|       fetchMoreProfiles(e, captiveProfiles, fetchMoreCaptiveProfiles); | ||||
|     else if (key === 'rf') fetchMoreProfiles(e, rfProfiles, fetchMoreRfProfiles); | ||||
|     else if (key === 'passpoint_venue') fetchMoreProfiles(e, venueProfiles, fetchMoreVenueProfiles); | ||||
|     else if (key === 'passpoint_operator') | ||||
|       fetchMoreProfiles(e, operatorProfiles, fetchMoreOperatorProfiles); | ||||
|     else if (key === 'passpoint_osu_id_provider') | ||||
|       fetchMoreProfiles(e, idProviderProfiles, fetchMoreIdProviderProfiles); | ||||
|     else fetchMoreProfiles(e, ssidProfiles, fetchMore); | ||||
|   const handleFetchProfiles = e => { | ||||
|     if (ssidProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMore({ | ||||
|         variables: { context: { ...ssidProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchVenueProfiles = e => { | ||||
|     if (venueProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreVenueProfiles({ | ||||
|         variables: { context: { ...venueProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchRfProfiles = e => { | ||||
|     if (rfProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreRfProfiles({ | ||||
|         variables: { context: { ...rfProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchOperatorProfiles = e => { | ||||
|     if (operatorProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreOperatorProfiles({ | ||||
|         variables: { context: { ...operatorProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchIdProviderProfiles = e => { | ||||
|     if (idProviderProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreIdProviderProfiles({ | ||||
|         variables: { context: { ...idProviderProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   return ( | ||||
|     <AddProfilePage | ||||
|       onCreateProfile={handleAddProfile} | ||||
|       ssidProfiles={ssidProfiles?.getAllProfiles?.items} | ||||
|       radiusProfiles={radiusProfiles?.getAllProfiles?.items} | ||||
|       captiveProfiles={captiveProfiles?.getAllProfiles?.items} | ||||
|       ssidProfiles={ | ||||
|         (ssidProfiles && ssidProfiles.getAllProfiles && ssidProfiles.getAllProfiles.items) || [] | ||||
|       } | ||||
|       venueProfiles={venueProfiles?.getAllProfiles?.items} | ||||
|       operatorProfiles={operatorProfiles?.getAllProfiles?.items} | ||||
|       idProviderProfiles={idProviderProfiles?.getAllProfiles?.items} | ||||
|       rfProfiles={rfProfiles?.getAllProfiles?.items} | ||||
|       onFetchMoreProfiles={handleFetchMoreProfiles} | ||||
|       onFetchMoreProfiles={handleFetchProfiles} | ||||
|       onFetchMoreVenueProfiles={handleFetchVenueProfiles} | ||||
|       onFetchMoreOperatorProfiles={handleFetchOperatorProfiles} | ||||
|       onFetchMoreIdProviderProfiles={handleFetchIdProviderProfiles} | ||||
|       onFetchMoreRfProfiles={handleFetchRfProfiles} | ||||
|     /> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| @@ -129,17 +129,11 @@ const Dashboard = () => { | ||||
|             clientDevices2dot4GHz.push([eventTimestamp, radios.is2dot4GHz || 0]); | ||||
|             clientDevices5GHz.push([eventTimestamp, total5GHz || 0]); | ||||
|  | ||||
|             trafficBytesDownstreamData.push([ | ||||
|               eventTimestamp, | ||||
|               (trafficBytesDownstream > 0 && trafficBytesDownstream) || 0, | ||||
|             ]); | ||||
|             trafficBytesUpstreamData.push([ | ||||
|               eventTimestamp, | ||||
|               (trafficBytesUpstream > 0 && trafficBytesUpstream) || 0, | ||||
|             ]); | ||||
|             trafficBytesDownstreamData.push([eventTimestamp, trafficBytesDownstream || 0]); | ||||
|             trafficBytesUpstreamData.push([eventTimestamp, trafficBytesUpstream || 0]); | ||||
|  | ||||
|             totalDown += (trafficBytesDownstream > 0 && trafficBytesDownstream) || 0; | ||||
|             totalUp += (trafficBytesUpstream > 0 && trafficBytesUpstream) || 0; | ||||
|             totalDown += trafficBytesDownstream || 0; | ||||
|             totalUp += trafficBytesUpstream || 0; | ||||
|           } | ||||
|         ); | ||||
|  | ||||
|   | ||||
| @@ -12,8 +12,10 @@ import { removeItem } from 'utils/localStorage'; | ||||
|  | ||||
| import UserContext from 'contexts/UserContext'; | ||||
|  | ||||
| import UsersDropdown from 'components/UsersDropdown'; | ||||
|  | ||||
| const MasterLayout = ({ children }) => { | ||||
|   const { roles, customerId } = useContext(UserContext); | ||||
|   const { roles, customerId, email } = useContext(UserContext); | ||||
|  | ||||
|   const client = useApolloClient(); | ||||
|   const location = useLocation(); | ||||
| @@ -59,7 +61,7 @@ const MasterLayout = ({ children }) => { | ||||
|         { | ||||
|           key: 'editAccount', | ||||
|           path: ROUTES.account, | ||||
|           text: 'Edit Account', | ||||
|           text: 'Account', | ||||
|         }, | ||||
|         { | ||||
|           key: 'logout', | ||||
| @@ -90,6 +92,8 @@ const MasterLayout = ({ children }) => { | ||||
|       menuItems={menuItems} | ||||
|       mobileMenuItems={mobileMenuItems} | ||||
|       totalAlarms={data && data.getAlarmCount} | ||||
|       currentUserEmail={email} | ||||
|       usersDropdown={<UsersDropdown onLogout={handleLogout} />} | ||||
|     > | ||||
|       {children} | ||||
|     </Layout> | ||||
|   | ||||
| @@ -15,7 +15,7 @@ import { | ||||
|   REQUEST_EQUIPMENT_SWITCH_BANK, | ||||
|   REQUEST_EQUIPMENT_REBOOT, | ||||
| } from 'graphql/mutations'; | ||||
| import { fetchMoreProfiles } from 'graphql/functions'; | ||||
| import { updateQueryGetAllProfiles } from 'graphql/functions'; | ||||
| import UserContext from 'contexts/UserContext'; | ||||
|  | ||||
| const GET_EQUIPMENT = gql` | ||||
| @@ -85,7 +85,6 @@ const UPDATE_EQUIPMENT = gql` | ||||
|     $profileId: ID! | ||||
|     $locationId: ID! | ||||
|     $name: String! | ||||
|     $baseMacAddress: String | ||||
|     $latitude: String | ||||
|     $longitude: String | ||||
|     $serial: String | ||||
| @@ -100,7 +99,6 @@ const UPDATE_EQUIPMENT = gql` | ||||
|       profileId: $profileId | ||||
|       locationId: $locationId | ||||
|       name: $name | ||||
|       baseMacAddress: $baseMacAddress | ||||
|       latitude: $latitude | ||||
|       longitude: $longitude | ||||
|       serial: $serial | ||||
| @@ -114,7 +112,6 @@ const UPDATE_EQUIPMENT = gql` | ||||
|       profileId | ||||
|       locationId | ||||
|       name | ||||
|       baseMacAddress | ||||
|       latitude | ||||
|       longitude | ||||
|       serial | ||||
| @@ -145,7 +142,6 @@ const AccessPointDetails = ({ locations }) => { | ||||
|       id, | ||||
|     }, | ||||
|     fetchPolicy: 'network-only', | ||||
|     errorPolicy: 'all', | ||||
|   }); | ||||
|  | ||||
|   const { data: dataFirmware, error: errorFirmware, loading: loadingFirmware } = useQuery( | ||||
| @@ -153,9 +149,9 @@ const AccessPointDetails = ({ locations }) => { | ||||
|     { | ||||
|       skip: !data?.getEquipment?.model, | ||||
|       variables: { modelId: data?.getEquipment?.model }, | ||||
|       errorPolicy: 'all', | ||||
|     } | ||||
|   ); | ||||
|  | ||||
|   const { | ||||
|     data: dataProfiles, | ||||
|     error: errorProfiles, | ||||
| @@ -200,21 +196,20 @@ const AccessPointDetails = ({ locations }) => { | ||||
|     metricsRefetch(); | ||||
|   }; | ||||
|  | ||||
|   const handleUpdateEquipment = ({ | ||||
|     id: equipmentId, | ||||
|   const handleUpdateEquipment = ( | ||||
|     equipmentId, | ||||
|     equipmentType, | ||||
|     inventoryId, | ||||
|     customerId: custId, | ||||
|     custId, | ||||
|     profileId, | ||||
|     locationId, | ||||
|     name, | ||||
|     baseMacAddress, | ||||
|     latitude, | ||||
|     longitude, | ||||
|     serial, | ||||
|     lastModifiedTimestamp, | ||||
|     formattedData, | ||||
|   }) => { | ||||
|     details | ||||
|   ) => { | ||||
|     updateEquipment({ | ||||
|       variables: { | ||||
|         id: equipmentId, | ||||
| @@ -224,12 +219,11 @@ const AccessPointDetails = ({ locations }) => { | ||||
|         profileId, | ||||
|         locationId, | ||||
|         name, | ||||
|         baseMacAddress, | ||||
|         latitude, | ||||
|         longitude, | ||||
|         serial, | ||||
|         lastModifiedTimestamp, | ||||
|         details: formattedData, | ||||
|         details, | ||||
|       }, | ||||
|     }) | ||||
|       .then(() => { | ||||
| @@ -333,14 +327,28 @@ const AccessPointDetails = ({ locations }) => { | ||||
|       ); | ||||
|  | ||||
|   const handleFetchProfiles = e => { | ||||
|     fetchMoreProfiles(e, dataProfiles, fetchMore); | ||||
|     if (dataProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMore({ | ||||
|         variables: { context: { ...dataProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   if (loading) { | ||||
|     return <Loading />; | ||||
|   } | ||||
|  | ||||
|   if (error && !data?.getEquipment) { | ||||
|   if (error) { | ||||
|     return ( | ||||
|       <Alert | ||||
|         message="Error" | ||||
|   | ||||
| @@ -11,8 +11,6 @@ import { UPDATE_EQUIPMENT_BULK } from 'graphql/mutations'; | ||||
| import UserContext from 'contexts/UserContext'; | ||||
| import styles from './index.module.scss'; | ||||
|  | ||||
| const defaultAppliedRadios = { is5GHzL: 'is5GHzL', is2dot4GHz: 'is2dot4GHz', is5GHzU: 'is5GHzU' }; | ||||
|  | ||||
| const renderTableCell = tabCell => { | ||||
|   if (Array.isArray(tabCell)) { | ||||
|     return ( | ||||
| @@ -27,54 +25,47 @@ const renderTableCell = tabCell => { | ||||
|   return <span>{tabCell}</span>; | ||||
| }; | ||||
| const accessPointsChannelTableColumns = [ | ||||
|   { title: 'Name', dataIndex: 'name', key: 'name', width: 150, render: renderTableCell }, | ||||
|   { title: 'NAME', dataIndex: 'name', key: 'name', render: renderTableCell }, | ||||
|   { | ||||
|     title: 'Channel', | ||||
|     title: 'CHANNEL', | ||||
|     dataIndex: 'channel', | ||||
|     key: 'channel', | ||||
|     editable: true, | ||||
|     width: 150, | ||||
|     render: renderTableCell, | ||||
|   }, | ||||
|   { | ||||
|     title: 'Cell Size', | ||||
|     title: 'CELL SIZE', | ||||
|     dataIndex: 'cellSize', | ||||
|     key: 'cellSize', | ||||
|     editable: true, | ||||
|     width: 150, | ||||
|     render: renderTableCell, | ||||
|   }, | ||||
|   { | ||||
|     title: 'Probe Response Threshold', | ||||
|     title: 'PROB RESPONSE THRESHOLD', | ||||
|     dataIndex: 'probeResponseThreshold', | ||||
|     key: 'probeResponseThreshold', | ||||
|     editable: true, | ||||
|     width: 200, | ||||
|     render: renderTableCell, | ||||
|   }, | ||||
|   { | ||||
|     title: 'Client Disconnect Threshold', | ||||
|     title: 'CLIENT DISCONNECT THRESHOLD', | ||||
|     dataIndex: 'clientDisconnectThreshold', | ||||
|     key: 'clientDisconnectThreshold', | ||||
|     editable: true, | ||||
|     width: 200, | ||||
|  | ||||
|     render: renderTableCell, | ||||
|   }, | ||||
|   { | ||||
|     title: 'SNR (% Drop)', | ||||
|     title: 'SNR (% DROP)', | ||||
|     dataIndex: 'snrDrop', | ||||
|     key: 'snrDrop', | ||||
|     editable: true, | ||||
|     width: 175, | ||||
|     render: renderTableCell, | ||||
|   }, | ||||
|   { | ||||
|     title: 'Min Load', | ||||
|     title: 'MIN LOAD', | ||||
|     dataIndex: 'minLoad', | ||||
|     key: 'minLoad', | ||||
|     editable: true, | ||||
|     width: 150, | ||||
|     render: renderTableCell, | ||||
|   }, | ||||
| ]; | ||||
| @@ -171,44 +162,42 @@ const BulkEditAPs = ({ locations, checkedLocations }) => { | ||||
|   const getRadioDetails = (radioDetails, type) => { | ||||
|     if (type === 'cellSize') { | ||||
|       const cellSizeValues = []; | ||||
|       Object.keys(radioDetails?.radioMap || {}).map(i => { | ||||
|         return cellSizeValues.push(radioDetails.radioMap[i]?.rxCellSizeDb?.value); | ||||
|       Object.keys(radioDetails.radioMap).map(i => { | ||||
|         return cellSizeValues.push(radioDetails.radioMap[i].rxCellSizeDb.value); | ||||
|       }); | ||||
|       return cellSizeValues; | ||||
|     } | ||||
|     if (type === 'probeResponseThreshold') { | ||||
|       const probeResponseThresholdValues = []; | ||||
|       Object.keys(radioDetails?.radioMap || {}).map(i => { | ||||
|       Object.keys(radioDetails.radioMap).map(i => { | ||||
|         return probeResponseThresholdValues.push( | ||||
|           radioDetails.radioMap[i]?.probeResponseThresholdDb?.value | ||||
|           radioDetails.radioMap[i].probeResponseThresholdDb.value | ||||
|         ); | ||||
|       }); | ||||
|       return probeResponseThresholdValues; | ||||
|     } | ||||
|     if (type === 'clientDisconnectThreshold') { | ||||
|       const clientDisconnectThresholdValues = []; | ||||
|       Object.keys(radioDetails?.radioMap || {}).map(i => { | ||||
|       Object.keys(radioDetails.radioMap).map(i => { | ||||
|         return clientDisconnectThresholdValues.push( | ||||
|           radioDetails.radioMap[i]?.clientDisconnectThresholdDb?.value | ||||
|           radioDetails.radioMap[i].clientDisconnectThresholdDb.value | ||||
|         ); | ||||
|       }); | ||||
|       return clientDisconnectThresholdValues; | ||||
|     } | ||||
|     if (type === 'snrDrop') { | ||||
|       const snrDropValues = []; | ||||
|       Object.keys(radioDetails?.radioMap || {}).map(i => { | ||||
|       Object.keys(radioDetails.advancedRadioMap).map(i => { | ||||
|         return snrDropValues.push( | ||||
|           radioDetails.advancedRadioMap[i]?.bestApSettings?.value?.dropInSnrPercentage | ||||
|           radioDetails.advancedRadioMap[i].bestApSettings.dropInSnrPercentage | ||||
|         ); | ||||
|       }); | ||||
|       return snrDropValues; | ||||
|     } | ||||
|  | ||||
|     const minLoadValue = []; | ||||
|     Object.keys(radioDetails?.radioMap || {}).map(i => { | ||||
|       return minLoadValue.push( | ||||
|         radioDetails.advancedRadioMap[i]?.bestApSettings?.value?.minLoadFactor | ||||
|       ); | ||||
|     Object.keys(radioDetails.advancedRadioMap).map(i => { | ||||
|       return minLoadValue.push(radioDetails.advancedRadioMap[i].bestApSettings.minLoadFactor); | ||||
|     }); | ||||
|     return minLoadValue; | ||||
|   }; | ||||
| @@ -245,7 +234,7 @@ const BulkEditAPs = ({ locations, checkedLocations }) => { | ||||
|     let minLoadFactor; | ||||
|     dataSource.items.forEach(({ id: itemId, details }) => { | ||||
|       if (equipmentId === itemId) { | ||||
|         Object.keys(details?.radioMap || defaultAppliedRadios).forEach((i, dataIndex) => { | ||||
|         Object.keys(details.radioMap).forEach((i, dataIndex) => { | ||||
|           const frequencies = {}; | ||||
|           dropInSnrPercentage = snrDrop[dataIndex]; | ||||
|           minLoadFactor = minLoad[dataIndex]; | ||||
| @@ -297,39 +286,42 @@ const BulkEditAPs = ({ locations, checkedLocations }) => { | ||||
|  | ||||
|   const handleSaveChanges = updatedRows => { | ||||
|     const editedRowsArr = []; | ||||
|     Object.keys(updatedRows).forEach(key => { | ||||
|       const { | ||||
|         id: equipmentId, | ||||
|         channel, | ||||
|         cellSize, | ||||
|         probeResponseThreshold, | ||||
|         clientDisconnectThreshold, | ||||
|         snrDrop, | ||||
|         minLoad, | ||||
|       } = updatedRows[key]; | ||||
|       const updatedEuips = setUpdatedBulkEditTableData( | ||||
|         equipmentId, | ||||
|         channel, | ||||
|         cellSize, | ||||
|         probeResponseThreshold, | ||||
|         clientDisconnectThreshold, | ||||
|         snrDrop, | ||||
|         minLoad, | ||||
|         equipData && equipData.filterEquipment | ||||
|     if (updatedRows.length > 0) { | ||||
|       updatedRows.map( | ||||
|         ({ | ||||
|           id: equipmentId, | ||||
|           channel, | ||||
|           cellSize, | ||||
|           probeResponseThreshold, | ||||
|           clientDisconnectThreshold, | ||||
|           snrDrop, | ||||
|           minLoad, | ||||
|         }) => { | ||||
|           const updatedEuips = setUpdatedBulkEditTableData( | ||||
|             equipmentId, | ||||
|             channel, | ||||
|             cellSize, | ||||
|             probeResponseThreshold, | ||||
|             clientDisconnectThreshold, | ||||
|             snrDrop, | ||||
|             minLoad, | ||||
|             equipData && equipData.filterEquipment | ||||
|           ); | ||||
|           const tempObj = { | ||||
|             equipmentId, | ||||
|             perRadioDetails: {}, | ||||
|           }; | ||||
|           updatedEuips.map(item => { | ||||
|             Object.keys(item).forEach(i => { | ||||
|               tempObj.perRadioDetails[i] = item[i]; | ||||
|             }); | ||||
|             return tempObj; | ||||
|           }); | ||||
|           return editedRowsArr.push(tempObj); | ||||
|         } | ||||
|       ); | ||||
|       const tempObj = { | ||||
|         equipmentId, | ||||
|         perRadioDetails: {}, | ||||
|       }; | ||||
|       updatedEuips.map(item => { | ||||
|         Object.keys(item).forEach(i => { | ||||
|           tempObj.perRadioDetails[i] = item[i]; | ||||
|         }); | ||||
|         return tempObj; | ||||
|       }); | ||||
|       return editedRowsArr.push(tempObj); | ||||
|     }); | ||||
|     updateEquipments(editedRowsArr); | ||||
|       updateEquipments(editedRowsArr); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   const handleLoadMore = () => { | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| .tabColumn { | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   padding: 0 30px; | ||||
| } | ||||
|   | ||||
| @@ -8,7 +8,7 @@ import { ROUTES } from 'constants/index'; | ||||
| import UserContext from 'contexts/UserContext'; | ||||
| import { GET_ALL_PROFILES } from 'graphql/queries'; | ||||
| import { FILE_UPLOAD } from 'graphql/mutations'; | ||||
| import { fetchMoreProfiles } from 'graphql/functions'; | ||||
| import { updateQueryGetAllProfiles } from 'graphql/functions'; | ||||
|  | ||||
| const GET_PROFILE = gql` | ||||
|   query GetProfile($id: ID!) { | ||||
| @@ -82,14 +82,12 @@ const ProfileDetails = () => { | ||||
|  | ||||
|   const { data: ssidProfiles, fetchMore } = useQuery(GET_ALL_PROFILES(), { | ||||
|     variables: { customerId, type: 'ssid' }, | ||||
|     fetchPolicy: 'network-only', | ||||
|   }); | ||||
|  | ||||
|   const { data: radiusProfiles, fetchMore: fetchMoreRadiusProfiles } = useQuery( | ||||
|     GET_ALL_PROFILES(), | ||||
|     { | ||||
|       variables: { customerId, type: 'radius' }, | ||||
|       fetchPolicy: 'network-only', | ||||
|     } | ||||
|   ); | ||||
|  | ||||
| @@ -97,20 +95,17 @@ const ProfileDetails = () => { | ||||
|     GET_ALL_PROFILES(), | ||||
|     { | ||||
|       variables: { customerId, type: 'captive_portal' }, | ||||
|       fetchPolicy: 'network-only', | ||||
|     } | ||||
|   ); | ||||
|  | ||||
|   const { data: venueProfiles, fetchMore: fetchMoreVenueProfiles } = useQuery(GET_ALL_PROFILES(), { | ||||
|     variables: { customerId, type: 'passpoint_venue' }, | ||||
|     fetchPolicy: 'network-only', | ||||
|   }); | ||||
|  | ||||
|   const { data: operatorProfiles, fetchMore: fetchMoreOperatorProfiles } = useQuery( | ||||
|     GET_ALL_PROFILES(), | ||||
|     { | ||||
|       variables: { customerId, type: 'passpoint_operator' }, | ||||
|       fetchPolicy: 'network-only', | ||||
|     } | ||||
|   ); | ||||
|  | ||||
| @@ -118,13 +113,11 @@ const ProfileDetails = () => { | ||||
|     GET_ALL_PROFILES(), | ||||
|     { | ||||
|       variables: { customerId, type: 'passpoint_osu_id_provider' }, | ||||
|       fetchPolicy: 'network-only', | ||||
|     } | ||||
|   ); | ||||
|  | ||||
|   const { data: rfProfiles, fetchMore: fetchMoreRfProfiles } = useQuery(GET_ALL_PROFILES(), { | ||||
|     variables: { customerId, type: 'rf' }, | ||||
|     fetchPolicy: 'network-only', | ||||
|   }); | ||||
|  | ||||
|   const [updateProfile] = useMutation(UPDATE_PROFILE); | ||||
| @@ -192,17 +185,130 @@ const ProfileDetails = () => { | ||||
|         }) | ||||
|       ); | ||||
|  | ||||
|   const handleFetchMoreProfiles = (e, key) => { | ||||
|     if (key === 'radius') fetchMoreProfiles(e, radiusProfiles, fetchMoreRadiusProfiles); | ||||
|     else if (key === 'captive_portal') | ||||
|       fetchMoreProfiles(e, captiveProfiles, fetchMoreCaptiveProfiles); | ||||
|     else if (key === 'rf') fetchMoreProfiles(e, rfProfiles, fetchMoreRfProfiles); | ||||
|     else if (key === 'passpoint_venue') fetchMoreProfiles(e, venueProfiles, fetchMoreVenueProfiles); | ||||
|     else if (key === 'passpoint_operator') | ||||
|       fetchMoreProfiles(e, operatorProfiles, fetchMoreOperatorProfiles); | ||||
|     else if (key === 'passpoint_osu_id_provider') | ||||
|       fetchMoreProfiles(e, idProviderProfiles, fetchMoreIdProviderProfiles); | ||||
|     else fetchMoreProfiles(e, ssidProfiles, fetchMore); | ||||
|   const handleFetchProfiles = e => { | ||||
|     if (ssidProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMore({ | ||||
|         variables: { context: { ...ssidProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchRadiusProfiles = e => { | ||||
|     if (radiusProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreRadiusProfiles({ | ||||
|         variables: { context: { ...radiusProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchCaptiveProfiles = e => { | ||||
|     if (captiveProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreCaptiveProfiles({ | ||||
|         variables: { context: { ...captiveProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchVenueProfiles = e => { | ||||
|     if (venueProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreVenueProfiles({ | ||||
|         variables: { context: { ...venueProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchRfProfiles = e => { | ||||
|     if (rfProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreRfProfiles({ | ||||
|         variables: { context: { ...rfProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchOperatorProfiles = e => { | ||||
|     if (operatorProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreOperatorProfiles({ | ||||
|         variables: { context: { ...operatorProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   const handleFetchIdProviderProfiles = e => { | ||||
|     if (idProviderProfiles.getAllProfiles.context.lastPage) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     e.persist(); | ||||
|     const { target } = e; | ||||
|  | ||||
|     if (target.scrollTop + target.offsetHeight === target.scrollHeight) { | ||||
|       fetchMoreIdProviderProfiles({ | ||||
|         variables: { context: { ...idProviderProfiles.getAllProfiles.context } }, | ||||
|         updateQuery: updateQueryGetAllProfiles, | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   }; | ||||
|  | ||||
|   if (loading) { | ||||
| @@ -236,7 +342,13 @@ const ProfileDetails = () => { | ||||
|       operatorProfiles={operatorProfiles?.getAllProfiles?.items} | ||||
|       idProviderProfiles={idProviderProfiles?.getAllProfiles?.items} | ||||
|       fileUpload={handleFileUpload} | ||||
|       onFetchMoreProfiles={handleFetchMoreProfiles} | ||||
|       onFetchMoreProfiles={handleFetchProfiles} | ||||
|       onFetchMoreRfProfiles={handleFetchRfProfiles} | ||||
|       onFetchMoreRadiusProfiles={handleFetchRadiusProfiles} | ||||
|       onFetchMoreCaptiveProfiles={handleFetchCaptiveProfiles} | ||||
|       onFetchMoreVenueProfiles={handleFetchVenueProfiles} | ||||
|       onFetchMoreOperatorProfiles={handleFetchOperatorProfiles} | ||||
|       onFetchMoreIdProviderProfiles={handleFetchIdProviderProfiles} | ||||
|     /> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| @@ -10,21 +10,3 @@ export const updateQueryGetAllProfiles = (previousResult, { fetchMoreResult }) = | ||||
|     }, | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| export const fetchMoreProfiles = (e, profile, fetchMore) => { | ||||
|   if (profile.getAllProfiles.context.lastPage) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   e.persist(); | ||||
|   const { target } = e; | ||||
|  | ||||
|   if (target.scrollTop + target.offsetHeight + 10 >= target.scrollHeight) { | ||||
|     fetchMore({ | ||||
|       variables: { context: { ...profile.getAllProfiles.context } }, | ||||
|       updateQuery: updateQueryGetAllProfiles, | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   return true; | ||||
| }; | ||||
|   | ||||
							
								
								
									
										8
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "wlan-cloud-ui", | ||||
|   "version": "0.10.2", | ||||
|   "version": "0.7.5", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
| @@ -1845,9 +1845,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "@tip-wlan/wlan-cloud-ui-library": { | ||||
|       "version": "0.13.3", | ||||
|       "resolved": "https://tip.jfrog.io/artifactory/api/npm/tip-wlan-cloud-npm-repo/@tip-wlan/wlan-cloud-ui-library/-/@tip-wlan/wlan-cloud-ui-library-0.13.3.tgz", | ||||
|       "integrity": "sha1-iTZriIG3Yd9OdrSzBWz5JKO7Cyg=" | ||||
|       "version": "0.7.6", | ||||
|       "resolved": "https://tip.jfrog.io/artifactory/api/npm/tip-wlan-cloud-npm-repo/@tip-wlan/wlan-cloud-ui-library/-/@tip-wlan/wlan-cloud-ui-library-0.7.6.tgz", | ||||
|       "integrity": "sha1-GW0Wz1L8OnAwRqlyjUNZnGIuWQg=" | ||||
|     }, | ||||
|     "@types/anymatch": { | ||||
|       "version": "1.3.1", | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "wlan-cloud-ui", | ||||
|   "version": "0.10.2", | ||||
|   "version": "0.7.5", | ||||
|   "author": "ConnectUs", | ||||
|   "description": "React Portal", | ||||
|   "engines": { | ||||
| @@ -10,8 +10,8 @@ | ||||
|   "scripts": { | ||||
|     "test": "jest --passWithNoTests --coverage", | ||||
|     "start": "cross-env NODE_ENV=development webpack-dev-server", | ||||
|     "start:bare": "cross-env API=ttps://portal.rtl.lab.netexperience.com NODE_ENV=bare webpack-dev-server", | ||||
|     "start:dev": "cross-env API=https://portal.rtl.lab.netexperience.com NODE_ENV=development webpack-dev-server", | ||||
|     "start:bare": "cross-env API=https://wlan-graphql.qa.lab.wlan.tip.build NODE_ENV=bare webpack-dev-server", | ||||
|     "start:dev": "cross-env API=https://wlan-graphql.qa.lab.wlan.tip.build NODE_ENV=development webpack-dev-server", | ||||
|     "build": "webpack --mode=production", | ||||
|     "format": "prettier --write 'app/**/*{.js,.scss}'", | ||||
|     "eslint-fix": "eslint --fix 'app/**/*.js'", | ||||
| @@ -21,7 +21,7 @@ | ||||
|   "dependencies": { | ||||
|     "@ant-design/icons": "^4.2.1", | ||||
|     "@apollo/client": "^3.1.3", | ||||
|     "@tip-wlan/wlan-cloud-ui-library": "^0.13.3", | ||||
|     "@tip-wlan/wlan-cloud-ui-library": "^0.7.6", | ||||
|     "antd": "^4.5.2", | ||||
|     "apollo-upload-client": "^13.0.0", | ||||
|     "clean-webpack-plugin": "^3.0.0", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user