From 2d27362dc8d27768789c757ad9ac244a9e308fea Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Tue, 5 Dec 2017 11:31:05 -0500 Subject: [PATCH 01/32] Add index.js to utils for easier import --- src/utils/index.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/utils/index.js diff --git a/src/utils/index.js b/src/utils/index.js new file mode 100644 index 00000000..9ed882c6 --- /dev/null +++ b/src/utils/index.js @@ -0,0 +1,11 @@ +import { makeActionCreator } from './reduxHelpers'; +import SagaRequests from './sagaRequests'; +import request from './request'; +import { getHeaders } from './restServices'; + +export { + makeActionCreator, + SagaRequests, + request, + getHeaders, +}; -- GitLab From 228253446e701481431829626239ed7df7ced1d9 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Tue, 5 Dec 2017 11:31:31 -0500 Subject: [PATCH 02/32] Add line breaks between urls --- src/utils/restServices.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/utils/restServices.js b/src/utils/restServices.js index 4ea618c2..c7255f81 100644 --- a/src/utils/restServices.js +++ b/src/utils/restServices.js @@ -14,6 +14,7 @@ const iotService = process.env.REACT_APP_IOT_SERVICE; const userService = process.env.REACT_APP_USER_SERVICE; export const buildingsURL = `${buildingService}/building/`; + export const turkURL = `${buildingService}/turkhit/`; export const documentURL = `${documentService}/document/`; export const folderURL = `${documentService}/folder/`; @@ -22,17 +23,22 @@ export const projectFolderURL = `${documentService}/projectfolder/`; export const noteURL = `${documentService}/note/`; export const structureURL = `${documentService}/structure/`; export const boxAccessTokenURL = `${documentService}/boxusertoken/`; + export const accountURL = `${utilityService}/account/`; export const scrapeURL = `${utilityService}/scrape/`; export const disaggregateURL = `${utilityService}/disaggregate/`; + export const projectURL = `${projectService}/project/`; export const contactsURL = `${projectService}/contact/`; + export const projectDocumentURL = `${projectService}/project/document/`; export const lightingReportURL = `${reportService}/kissflowlighting/`; + export const gatewayURL = `${iotService}/gateway/`; export const boilerNodeURL = `${iotService}/boilernode/`; export const apartmentNodeURL = `${iotService}/apartmentnode/`; export const repeaterNodeURL = `${iotService}/repeaternode/`; export const sensorImageURL = `${iotService}/sensorimage/`; + export const userURL = `${userService}/user/`; export const userGroupsURL = `${userService}/usergroup/`; -- GitLab From 45805acea8da8d41f6cb3a2f7a709776b8018dad Mon Sep 17 00:00:00 2001 From: Conrad Date: Tue, 5 Dec 2017 11:45:34 -0500 Subject: [PATCH 03/32] Consolidate nodes into one senseware node --- src/components/SensorInstall/Gateway.js | 270 ++--------- src/components/SensorInstall/Nodes/Node.js | 34 +- .../SensorInstall/Nodes/SensewareNode.js | 433 ++++++++++++++++++ src/components/SensorInstall/SensorInstall.js | 10 +- src/components/SensorInstall/constants.js | 4 +- src/utils/restServices.js | 4 +- 6 files changed, 507 insertions(+), 248 deletions(-) create mode 100644 src/components/SensorInstall/Nodes/SensewareNode.js diff --git a/src/components/SensorInstall/Gateway.js b/src/components/SensorInstall/Gateway.js index 995dfa95..50a6140c 100644 --- a/src/components/SensorInstall/Gateway.js +++ b/src/components/SensorInstall/Gateway.js @@ -9,10 +9,8 @@ import CopyToClipboard from 'react-copy-to-clipboard'; import { ContentPreview } from 'box-ui-elements'; import 'box-ui-elements/dist/preview.css'; -import { boilerNodeURL, apartmentNodeURL, repeaterNodeURL } from '../../utils/restServices'; -import SensorBoilerNode from './Nodes/BoilerNode'; -import SensorApartmentNode from './Nodes/ApartmentNode'; -import SensorRepeaterNode from './Nodes/RepeaterNode'; +import { sensewareNodeURL } from '../../utils/restServices'; +import SensewareNode from './Nodes/SensewareNode'; import SensorImageUpload from './SensorImageUpload'; import { ENTITY_TYPES } from './constants'; import documentsPropType from '../../containers/Documents/propTypes'; @@ -75,14 +73,8 @@ class Gateway extends Component { offlineSaving: false, offlineDeleted: false, - boilerNodes: [], - boilerNodeCounter: 0, - - apartmentNodes: [], - apartmentNodeCounter: 0, - - repeaterNodes: [], - repeaterNodeCounter: 0, + sensewareNodes: [], + sensewareNodeCounter: 0, collapse: !this.props.gatewayCreated, lastEdited: Date.now(), @@ -94,9 +86,8 @@ class Gateway extends Component { loadingUploadedImages: false, displayImages: false, - loadingBoiler: false, - loadingApartment: false, - loadingRepeater: false, + loadingSenseware: false, + deleteLoading: false, }; } @@ -104,21 +95,9 @@ class Gateway extends Component { if (this.state.gateway_id) { this.props.getNodes( this.state.gateway_id, - this.addBoilerNodes, - boilerNodeURL, - this.setLoadingBoiler, - ); - this.props.getNodes( - this.state.gateway_id, - this.addApartmentNodes, - apartmentNodeURL, - this.setLoadingApartment, - ); - this.props.getNodes( - this.state.gateway_id, - this.addRepeaterNodes, - repeaterNodeURL, - this.setLoadingRepeater, + this.addSensewareNodes, + sensewareNodeURL, + this.setLoadingSenseware, ); this.props.getSensorImages( this.state.gateway_id, @@ -136,100 +115,34 @@ class Gateway extends Component { clearTimeout(this.saveSoon); } - addBoilerNodes = (data) => { + addSensewareNodes = (data) => { const allNodes = data.map(node => ( - this.createBoilerNodeComponent( + this.createSensewareNodeComponent( node, node.id, ) )); this.setState({ - boilerNodes: allNodes.concat(this.state.boilerNodes), + sensewareNodes: allNodes.concat(this.state.sensewareNodes), }); } - createBoilerNodeComponent = ( + createSensewareNodeComponent = ( form = null, nodeId = null, ) => { - let boilerNodeProps = {}; + let sensewareNodeProps = {}; if (form) { - boilerNodeProps = { + sensewareNodeProps = { form, }; } - const newCounter = this.state.boilerNodeCounter + 1; + const newCounter = this.state.sensewareNodeCounter + 1; this.setState({ - boilerNodeCounter: newCounter, + sensewareNodeCounter: newCounter, }); return { - boilerNodeProps, - nodeId, - key: newCounter, - }; - } - - addApartmentNodes = (data) => { - const allNodes = data.map(node => ( - this.createApartmentNodeComponent( - node, - node.id, - ) - )); - this.setState({ - apartmentNodes: allNodes.concat(this.state.apartmentNodes), - }); - } - - createApartmentNodeComponent = ( - form = null, - nodeId = null, - ) => { - let apartmentNodeProps = {}; - if (form) { - apartmentNodeProps = { - form, - }; - } - const newCounter = this.state.apartmentNodeCounter + 1; - this.setState({ - apartmentNodeCounter: newCounter, - }); - return { - apartmentNodeProps, - nodeId, - key: newCounter, - }; - } - - addRepeaterNodes = (data) => { - const allNodes = data.map(node => ( - this.createRepeaterNodeComponent( - node, - node.id, - ) - )); - this.setState({ - repeaterNodes: allNodes.concat(this.state.repeaterNodes), - }); - } - - createRepeaterNodeComponent = ( - form = null, - nodeId = null, - ) => { - let repeaterNodeProps = {}; - if (form) { - repeaterNodeProps = { - form, - }; - } - const newCounter = this.state.repeaterNodeCounter + 1; - this.setState({ - repeaterNodeCounter: newCounter, - }); - return { - repeaterNodeProps, + sensewareNodeProps, nodeId, key: newCounter, }; @@ -256,16 +169,8 @@ class Gateway extends Component { this.setState({ loadingUploadedImages }); } - setLoadingBoiler = (loadingBoiler) => { - this.setState({ loadingBoiler }); - } - - setLoadingApartment = (loadingApartment) => { - this.setState({ loadingApartment }); - } - - setLoadingRepeater = (loadingRepeater) => { - this.setState({ loadingRepeater }); + setLoadingSenseware = (loadingSenseware) => { + this.setState({ loadingSenseware }); } toggleDisplayImages = (event) => { @@ -273,24 +178,10 @@ class Gateway extends Component { this.setState({ displayImages: !this.state.displayImages }); } - handleAddBoilerNode = () => { - const node = this.createBoilerNodeComponent(); - this.setState({ - boilerNodes: this.state.boilerNodes.concat([node]), - }); - } - - handleAddApartmentNode = () => { - const node = this.createApartmentNodeComponent(); - this.setState({ - apartmentNodes: this.state.apartmentNodes.concat([node]), - }); - } - - handleAddRepeaterNode = () => { - const node = this.createRepeaterNodeComponent(); + handleAddSensewareNode = () => { + const node = this.createSensewareNodeComponent(); this.setState({ - repeaterNodes: this.state.repeaterNodes.concat([node]), + sensewareNodes: this.state.sensewareNodes.concat([node]), }); } @@ -390,6 +281,7 @@ class Gateway extends Component { } handleDeletingError = () => { + this.setState({ deleteLoading: false }); if (this.state.offlineDeleted) { this.setState({ offlineDeleted: false }); clearInterval(this.tryDelete); @@ -426,6 +318,7 @@ class Gateway extends Component { } handleDeleteGateway = () => { + this.setState({ deleteLoading: true }); if (this.state.offlineCreated) { this.setState({ offlineDeleted: true }); // Clear interval that is trying to create this gateway @@ -437,6 +330,7 @@ class Gateway extends Component { this.handleDeletingOnline, this.handleDeletingOffline, this.handleDeletingError, + this.handleDeletingSuccess, ); } @@ -496,6 +390,9 @@ class Gateway extends Component { ) renderDeleteGatewayBtn = () => { + if (this.state.deleteLoading) { + return ; + } const disabled = !this.props.user.permissions['delete::Gateway']; return ( - ); - } - - renderAddApartmentNodeBtn = () => { - const disabled = !this.props.user.permissions['create::ApartmentNode']; - return ( - - ); - } - - renderAddRepeaterNodeBtn = () => { - const disabled = !this.props.user.permissions['create::RepeaterNode']; - return ( - ); @@ -748,51 +605,13 @@ class Gateway extends Component { ); } - const boilerNodes = this.state.boilerNodes.map(val => ( - - )); - const apartmentNodes = this.state.apartmentNodes.map(val => ( - - )); - const repeaterNodes = this.state.repeaterNodes.map(val => ( - ( + - {this.state.loadingBoiler ? loadingSymbol : null} - {boilerNodes} - {this.renderAddBoilerNodeBtn()} -
- {this.state.loadingApartment ? loadingSymbol : null} - {apartmentNodes} - {this.renderAddApartmentNodeBtn()} + {this.state.loadingSenseware ? loadingSymbol : null} + {sensewareNodes} + {this.renderAddSensewareNodeBtn()}
- {this.state.loadingRepeater ? loadingSymbol : null} - {repeaterNodes} - {this.renderAddRepeaterNodeBtn()} ) : null}
diff --git a/src/components/SensorInstall/Nodes/Node.js b/src/components/SensorInstall/Nodes/Node.js index a523353b..74bcea5e 100644 --- a/src/components/SensorInstall/Nodes/Node.js +++ b/src/components/SensorInstall/Nodes/Node.js @@ -25,6 +25,7 @@ class Node extends Component { uploadedImages: [], loadingUploadedImages: false, displayImages: false, + deleteLoading: false, }; this.handleCreateNode = this.handleCreateNode.bind(this); this.handleDeleteNode = this.handleDeleteNode.bind(this); @@ -64,7 +65,7 @@ class Node extends Component { saved: false, }); if ( - this.props.parent_id && + this.props.gateway_id && !this.state.offlineCreated && !this.state.offlineSaving ) { @@ -122,7 +123,7 @@ class Node extends Component { handleDeletingOffline = () => { if (!this.state.offlineDeleted) { - this.setState({ offlineDeleted: true }); + this.setState({ offlineDeleted: true, deleted: true }); this.tryDelete = setInterval(this.handleDeleteNode, 1000); } } @@ -134,21 +135,25 @@ class Node extends Component { } handleDeletingError = () => { - this.setState({ deleted: false }); + this.setState({ deleted: false, deleteLoading: false }); if (this.state.offlineDeleted) { clearInterval(this.tryDelete); } } + handleDeletingSuccess = () => { + this.setState({ deleted: true, deleteLoading: false }); + } + handleCreateNode( - parentId = this.props.parent_id, + gatewayId = this.props.gateway_id, form = {}, url = '', type = '', ) { this.props.createNode( url, - { ...form, parent_id: parentId }, + { ...form, gateway_id: gatewayId }, this.setNodeId, this.handleCreatingOffline, this.handleCreatingOnline, @@ -158,14 +163,17 @@ class Node extends Component { handleDeleteSubmit(event) { event.preventDefault(); + event.stopPropagation(); + if (confirm('Are you sure you want to delete this node?')) { this.handleDeleteNode(); } } handleDeleteNode(url = '') { - this.setState({ deleted: true }); + this.setState({ deleteLoading: true }); if (this.state.offlineCreated) { + this.setState({ deleted: true }); // Clear interval that is trying to create this sensor clearInterval(this.tryCreate); return; @@ -176,6 +184,7 @@ class Node extends Component { this.handleDeletingOnline, this.handleDeletingOffline, this.handleDeletingError, + this.handleDeletingSuccess, ); } @@ -184,7 +193,7 @@ class Node extends Component { url, form, this.state.node_db_id, - this.props.parent_id, + this.props.gateway_id, this.handleSavingOnline, this.handleSavingOffline, this.handleSavingSuccess, @@ -215,6 +224,13 @@ class Node extends Component { } renderDeleteNodeBtn() { + // Don't render the delete button if we don't have a node_db_id + if (!this.state.node_db_id && !this.state.offlineCreated) { + return null; + } + if (this.state.deleteLoading) { + return ; + } const disabled = !this.props.user.permissions[`delete::${this.state.type}Node`]; return ( + + + + ); + } + + renderThermalBridge = () => { + const temperatureProbes = [1, 2, 3, 4].map((val) => { + /* eslint-disable dot-notation */ + return ( +
+ +
+

+ +

+
+
+ ); + }); + return temperatureProbes; + } + + render() { + /* eslint-disable no-underscore-dangle */ + let offlineText = null; + if (this.state.offlineCreated || !this.props.gateway_id) { + offlineText = ( +
+
+ senseware node not created +
+
+ ); + } + /* eslint-disable arrow-body-style */ + const middleSection = this.renderNodeInformation(); + let backgroundColor = ''; + if (this.state.error) { + backgroundColor = '#f2dede'; + } else if (!this.state.saved) { + backgroundColor = '#faf2cc'; + } + return ( +
+ { this.setState({ collapse: !this.state.collapse }); }} + style={{ + cursor: 'pointer', + backgroundColor, + }} + > + {' '} + {this.state.display_name} +
+ {this.renderDeleteNodeBtn()} +
+ {offlineText} +
+ +
+
+
+
Senseware Node Details
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ Node ID should be 6 digits +
+
+ {this.state.node_db_id ? + (val.imageType))} + callBack={this.handleImageUpload} + loading={this.state.loadingUploadedImages} + user={this.props.user} + /> + : null} + {this.renderDisplayImagesButton()} + +
+
+ {middleSection} +
+
Senseware Node Notes
+ +
+