use fragments where possible, and drop keys.
This commit is contained in:
		| @@ -61,7 +61,6 @@ class SnackbarNotification extends React.Component { | ||||
|           message={<span id="message-id">{this.state.message}</span>} | ||||
|           action={ | ||||
|             <IconButton | ||||
|               key="close" | ||||
|               aria-label="Close" | ||||
|               color="inherit" | ||||
|               className={classes.close} | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import React, { Component } from 'react'; | ||||
| import React, { Component, Fragment } from 'react'; | ||||
|  | ||||
| import { withStyles } from 'material-ui/styles'; | ||||
| import Button from 'material-ui/Button'; | ||||
| @@ -48,53 +48,46 @@ class APStatus extends Component { | ||||
|     return data.active ? "Active" : "Inactive"; | ||||
|   } | ||||
|  | ||||
|   // active, ip_address, mac_address, station_num | ||||
|   createListItems(data, fullDetails, classes){ | ||||
|     return ( | ||||
|       <Fragment> | ||||
|         <ListItem> | ||||
|           <Avatar className={classes["apStatus_" + this.apStatusHighlight(data)]}> | ||||
|             <SettingsInputAntennaIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="Status" secondary={this.apStatus(data)} /> | ||||
|         </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|         <ListItem> | ||||
|           <Avatar>IP</Avatar> | ||||
|           <ListItemText primary="IP Address" secondary={data.ip_address} /> | ||||
|         </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|         <ListItem> | ||||
|           <Avatar> | ||||
|             <DeviceHubIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="MAC Address" secondary={data.mac_address} /> | ||||
|         </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|         <ListItem> | ||||
|           <Avatar> | ||||
|             <ComputerIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="AP Clients" secondary={data.station_num} /> | ||||
|         </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|       </Fragment> | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   renderAPStatus(data, fullDetails, classes){ | ||||
|     const listItems = []; | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="ap_status"> | ||||
|         <Avatar className={classes["apStatus_" + this.apStatusHighlight(data)]}> | ||||
|           <SettingsInputAntennaIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="Status" secondary={this.apStatus(data)} /> | ||||
|       </ListItem> | ||||
|     ); | ||||
|     listItems.push(<Divider key="ap_status_divider" inset component="li" />); | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="ip_address"> | ||||
|         <Avatar>IP</Avatar> | ||||
|         <ListItemText primary="IP Address" secondary={data.ip_address} /> | ||||
|       </ListItem> | ||||
|     ); | ||||
|     listItems.push(<Divider key="ip_address_divider" inset component="li" />); | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="mac_address"> | ||||
|         <Avatar> | ||||
|           <DeviceHubIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="MAC Address" secondary={data.mac_address} /> | ||||
|       </ListItem> | ||||
|     ); | ||||
|     listItems.push(<Divider key="mac_address_divider" inset component="li" />); | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="station_num"> | ||||
|         <Avatar> | ||||
|           <ComputerIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="AP Clients" secondary={data.station_num} /> | ||||
|       </ListItem> | ||||
|     ); | ||||
|     listItems.push(<Divider key="station_num_divider" inset component="li" />); | ||||
|  | ||||
|     return  ( | ||||
|       <div> | ||||
|         <List> | ||||
|           {listItems} | ||||
|           <Fragment> | ||||
|             {this.createListItems(data, fullDetails, classes)} | ||||
|           </Fragment> | ||||
|         </List> | ||||
|         <Button variant="raised" color="secondary" className={classes.button} onClick={this.props.loadData}> | ||||
|           Refresh | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import React, { Component } from 'react'; | ||||
| import React, { Component, Fragment } from 'react'; | ||||
|  | ||||
| import { withStyles } from 'material-ui/styles'; | ||||
| import Button from 'material-ui/Button'; | ||||
| @@ -50,74 +50,64 @@ class NTPStatus extends Component { | ||||
|     this.props.loadData(); | ||||
|   } | ||||
|  | ||||
|   renderNTPStatus(data, fullDetails, classes){ | ||||
|     const listItems = []; | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="ntp_status"> | ||||
|         <Avatar className={classes["ntpStatus_" + ntpStatusHighlight(data)]}> | ||||
|           <UpdateIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="Status" secondary={ntpStatus(data)} /> | ||||
|       </ListItem> | ||||
|     ); | ||||
|     listItems.push(<Divider key="ntp_status_divider" inset component="li" />); | ||||
|  | ||||
|     if (isSynchronized(data)) { | ||||
|       listItems.push( | ||||
|         <ListItem key="time_now"> | ||||
|           <Avatar> | ||||
|             <AccessTimeIcon /> | ||||
|   createListItems(data, fullDetails, classes){ | ||||
|     return ( | ||||
|       <Fragment> | ||||
|         <ListItem> | ||||
|           <Avatar className={classes["ntpStatus_" + ntpStatusHighlight(data)]}> | ||||
|             <UpdateIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="Time Now" secondary={unixTimeToTimeAndDate(data.now)} /> | ||||
|           <ListItemText primary="Status" secondary={ntpStatus(data)} /> | ||||
|         </ListItem> | ||||
|       ); | ||||
|       listItems.push(<Divider key="time_now_divider" inset component="li" />); | ||||
|     } | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="last_sync"> | ||||
|         <Avatar> | ||||
|           <SwapVerticalCircleIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="Last Sync" secondary={data.last_sync > 0 ? unixTimeToTimeAndDate(data.last_sync) : "never" } /> | ||||
|       </ListItem> | ||||
|     ); | ||||
|     listItems.push(<Divider key="last_sync_divider" inset component="li" />); | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="ntp_server"> | ||||
|         <Avatar> | ||||
|           <DNSIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="NTP Server" secondary={data.server} /> | ||||
|       </ListItem> | ||||
|     ); | ||||
|     listItems.push(<Divider key="ntp_server_divider" inset component="li" />); | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="sync_interval"> | ||||
|         <Avatar> | ||||
|           <TimerIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="Sync Interval" secondary={moment.duration(data.interval, 'seconds').humanize()} /> | ||||
|       </ListItem> | ||||
|     ); | ||||
|     listItems.push(<Divider key="sync_interval_divider" inset component="li" />); | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="uptime"> | ||||
|         <Avatar> | ||||
|           <AvTimerIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="Uptime" secondary={moment.duration(data.uptime, 'seconds').humanize()} /> | ||||
|       </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|         { isSynchronized(data) && | ||||
|           <Fragment> | ||||
|             <ListItem> | ||||
|               <Avatar> | ||||
|                 <AccessTimeIcon /> | ||||
|               </Avatar> | ||||
|               <ListItemText primary="Time Now" secondary={unixTimeToTimeAndDate(data.now)} /> | ||||
|             </ListItem> | ||||
|             <Divider inset component="li" /> | ||||
|             <ListItem> | ||||
|               <Avatar> | ||||
|                 <SwapVerticalCircleIcon /> | ||||
|               </Avatar> | ||||
|               <ListItemText primary="Last Sync" secondary={data.last_sync > 0 ? unixTimeToTimeAndDate(data.last_sync) : "never" } /> | ||||
|             </ListItem> | ||||
|             <Divider inset component="li" /> | ||||
|           </Fragment> | ||||
|         } | ||||
|         <ListItem> | ||||
|           <Avatar> | ||||
|             <DNSIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="NTP Server" secondary={data.server} /> | ||||
|         </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|         <ListItem> | ||||
|           <Avatar> | ||||
|             <TimerIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="Sync Interval" secondary={moment.duration(data.interval, 'seconds').humanize()} /> | ||||
|         </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|         <ListItem> | ||||
|           <Avatar> | ||||
|             <AvTimerIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="Uptime" secondary={moment.duration(data.uptime, 'seconds').humanize()} /> | ||||
|         </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|       </Fragment> | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   renderNTPStatus(data, fullDetails, classes){ | ||||
|     return  ( | ||||
|       <div> | ||||
|         <List> | ||||
|           {listItems} | ||||
|           {this.createListItems(data, fullDetails, classes)} | ||||
|         </List> | ||||
|         <Button variant="raised" color="secondary" className={classes.button} onClick={this.props.loadData}> | ||||
|           Refresh | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import React, { Component } from 'react'; | ||||
| import React, { Component, Fragment } from 'react'; | ||||
|  | ||||
| import { withStyles } from 'material-ui/styles'; | ||||
| import Button from 'material-ui/Button'; | ||||
| @@ -57,71 +57,61 @@ class WiFiStatus extends Component { | ||||
|     return status.dns_ip_1 + (status.dns_ip_2 ? ','+status.dns_ip_2 : ''); | ||||
|   } | ||||
|  | ||||
|   renderWiFiStatus(data, fullDetails, classes) { | ||||
|     const listItems = []; | ||||
|  | ||||
|     listItems.push( | ||||
|       <ListItem key="connection_status"> | ||||
|         <Avatar className={classes["wifiStatus_" + connectionStatusHighlight(data)]}> | ||||
|           <WifiIcon /> | ||||
|         </Avatar> | ||||
|         <ListItemText primary="Connection Status" secondary={connectionStatus(data)} /> | ||||
|       </ListItem> | ||||
|   createListItems(data, fullDetails, classes) { | ||||
|     return ( | ||||
|       <Fragment> | ||||
|         <ListItem> | ||||
|           <Avatar className={classes["wifiStatus_" + connectionStatusHighlight(data)]}> | ||||
|             <WifiIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="Connection Status" secondary={connectionStatus(data)} /> | ||||
|         </ListItem> | ||||
|         <Divider inset component="li" /> | ||||
|         { | ||||
|           (fullDetails && isConnected(data)) && | ||||
|           <Fragment> | ||||
|             <ListItem> | ||||
|               <Avatar> | ||||
|                 <SettingsInputAntennaIcon /> | ||||
|               </Avatar> | ||||
|               <ListItemText primary="SSID" secondary={data.ssid} /> | ||||
|             </ListItem> | ||||
|             <Divider inset component="li" /> | ||||
|             <ListItem> | ||||
|               <Avatar>IP</Avatar> | ||||
|               <ListItemText primary="IP Address" secondary={data.local_ip} /> | ||||
|             </ListItem> | ||||
|             <Divider inset component="li" /> | ||||
|             <ListItem> | ||||
|               <Avatar>#</Avatar> | ||||
|               <ListItemText primary="Subnet Mask" secondary={data.subnet_mask} /> | ||||
|             </ListItem> | ||||
|             <Divider inset component="li" /> | ||||
|             <ListItem> | ||||
|               <Avatar> | ||||
|                 <SettingsInputComponentIcon /> | ||||
|               </Avatar> | ||||
|               <ListItemText primary="Gateway IP" secondary={data.gateway_ip ? data.gateway_ip : "none"} /> | ||||
|             </ListItem> | ||||
|             <Divider inset component="li" /> | ||||
|             <ListItem> | ||||
|               <Avatar> | ||||
|                 <DNSIcon /> | ||||
|               </Avatar> | ||||
|               <ListItemText primary="DNS Server IP" secondary={this.dnsServers(data)} /> | ||||
|             </ListItem> | ||||
|             <Divider inset component="li" /> | ||||
|           </Fragment> | ||||
|         } | ||||
|       </Fragment> | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|     if (fullDetails && isConnected(data)) { | ||||
|       listItems.push(<Divider key="connection_status_divider" inset component="li" />); | ||||
|  | ||||
|       listItems.push( | ||||
|         <ListItem key="ssid"> | ||||
|           <Avatar> | ||||
|             <SettingsInputAntennaIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="SSID" secondary={data.ssid} /> | ||||
|         </ListItem> | ||||
|       ); | ||||
|       listItems.push(<Divider key="ssid_divider" inset component="li" />); | ||||
|  | ||||
|       listItems.push( | ||||
|         <ListItem key="ip_address"> | ||||
|           <Avatar>IP</Avatar> | ||||
|           <ListItemText primary="IP Address" secondary={data.local_ip} /> | ||||
|         </ListItem> | ||||
|       ); | ||||
|       listItems.push(<Divider key="ip_address_divider" inset component="li" />); | ||||
|  | ||||
|       listItems.push( | ||||
|         <ListItem key="subnet_mask"> | ||||
|           <Avatar>#</Avatar> | ||||
|           <ListItemText primary="Subnet Mask" secondary={data.subnet_mask} /> | ||||
|         </ListItem> | ||||
|       ); | ||||
|       listItems.push(<Divider key="subnet_mask_divider" inset component="li" />); | ||||
|  | ||||
|       listItems.push( | ||||
|         <ListItem key="gateway_ip"> | ||||
|           <Avatar> | ||||
|             <SettingsInputComponentIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="Gateway IP" secondary={data.gateway_ip ? data.gateway_ip : "none"} /> | ||||
|         </ListItem> | ||||
|       ); | ||||
|       listItems.push(<Divider key="gateway_ip_divider" inset component="li" />); | ||||
|  | ||||
|       listItems.push( | ||||
|         <ListItem key="dns_server_ip"> | ||||
|           <Avatar> | ||||
|             <DNSIcon /> | ||||
|           </Avatar> | ||||
|           <ListItemText primary="DNS Server IP" secondary={this.dnsServers(data)} /> | ||||
|         </ListItem> | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|   renderWiFiStatus(data, fullDetails, classes) { | ||||
|     return  ( | ||||
|       <div> | ||||
|         <List> | ||||
|         {listItems} | ||||
|         {this.createListItems(data, fullDetails, classes)} | ||||
|         </List> | ||||
|         <Button variant="raised" color="secondary" className={classes.button} onClick={this.props.loadData}> | ||||
|           Refresh | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import React from 'react'; | ||||
| import React, { Fragment } from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
|  | ||||
| import { withStyles } from 'material-ui/styles'; | ||||
| @@ -62,8 +62,8 @@ class APSettingsForm extends React.Component { | ||||
|  | ||||
|           { | ||||
|             isAPEnabled(apSettings.provision_mode) && | ||||
|             [ | ||||
|               <TextValidator key="ssid" | ||||
|             <Fragment> | ||||
|               <TextValidator | ||||
|                 validators={['required', 'matchRegexp:^.{0,32}$']} | ||||
|                 errorMessages={['Access Point SSID is required', 'Access Point SSID must be 32 characeters or less']} | ||||
|                 name="ssid" | ||||
| @@ -72,8 +72,8 @@ class APSettingsForm extends React.Component { | ||||
|                 value={apSettings.ssid} | ||||
|                 onChange={handleValueChange('ssid')} | ||||
|                 margin="normal" | ||||
|               />, | ||||
|               <TextValidator key="password" | ||||
|               /> | ||||
|               <TextValidator | ||||
|                     validators={['required', 'matchRegexp:^.{0,64}$']} | ||||
|                     errorMessages={['Access Point Password is required', 'Access Point Password must be 64 characters or less']} | ||||
|                     name="password" | ||||
| @@ -83,7 +83,7 @@ class APSettingsForm extends React.Component { | ||||
|                     onChange={handleValueChange('password')} | ||||
|                     margin="normal" | ||||
|               /> | ||||
|             ] | ||||
|             </Fragment> | ||||
|           } | ||||
|  | ||||
|           <Button variant="raised" color="primary" className={classes.button} type="submit"> | ||||
|   | ||||
| @@ -82,7 +82,7 @@ class OTASettingsForm extends React.Component { | ||||
|                margin="normal" | ||||
|              /> | ||||
|  | ||||
|              <TextValidator key="password" | ||||
|              <TextValidator | ||||
|                    validators={['required', 'matchRegexp:^.{0,64}$']} | ||||
|                    errorMessages={['OTA Password is required', 'OTA Point Password must be 64 characters or less']} | ||||
|                    name="password" | ||||
|   | ||||
| @@ -36,24 +36,23 @@ class WiFiNetworkSelector extends Component { | ||||
|   } | ||||
|  | ||||
|   renderNetwork(network) { | ||||
|     return ([ | ||||
|         <ListItem key={network.ssid} button onClick={() => this.props.selectNetwork(network)}> | ||||
|           <ListItemAvatar> | ||||
|             <Avatar> | ||||
|               {isNetworkOpen(network) ? <LockOpenIcon /> : <LockIcon />} | ||||
|             </Avatar> | ||||
|           </ListItemAvatar> | ||||
|           <ListItemText | ||||
|             primary={network.ssid} | ||||
|             secondary={"Security: "+ networkSecurityMode(network) + ", Ch: " + network.channel} | ||||
|           /> | ||||
|           <ListItemIcon> | ||||
|             <Badge badgeContent={network.rssi + "db"}> | ||||
|               <WifiIcon /> | ||||
|             </Badge> | ||||
|           </ListItemIcon> | ||||
|         </ListItem> | ||||
|       ] | ||||
|     return ( | ||||
|       <ListItem key={network.bssid} button onClick={() => this.props.selectNetwork(network)}> | ||||
|         <ListItemAvatar> | ||||
|           <Avatar> | ||||
|             {isNetworkOpen(network) ? <LockOpenIcon /> : <LockIcon />} | ||||
|           </Avatar> | ||||
|         </ListItemAvatar> | ||||
|         <ListItemText | ||||
|           primary={network.ssid} | ||||
|           secondary={"Security: "+ networkSecurityMode(network) + ", Ch: " + network.channel} | ||||
|         /> | ||||
|         <ListItemIcon> | ||||
|           <Badge badgeContent={network.rssi + "db"}> | ||||
|             <WifiIcon /> | ||||
|           </Badge> | ||||
|         </ListItemIcon> | ||||
|       </ListItem> | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -54,7 +54,7 @@ class WiFiSettingsForm extends React.Component { | ||||
|     const { selectedNetwork, deselectNetwork } = this.props; | ||||
|     return ( | ||||
|       <List> | ||||
|         <ListItem key={selectedNetwork.ssid}> | ||||
|         <ListItem> | ||||
|           <ListItemAvatar> | ||||
|             <Avatar> | ||||
|               {isNetworkOpen(selectedNetwork) ? <LockOpenIcon /> : <LockIcon />} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user