mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	Renamed FeatureToggleStore and simplified action names.
This commit is contained in:
		
							parent
							
								
									ff579303fd
								
							
						
					
					
						commit
						827faba438
					
				| @ -1,32 +1,28 @@ | |||||||
| jest.dontMock("../../../components/feature/ArchiveFeatureComponent"); | jest.dontMock("../../../components/feature/ArchiveFeatureComponent"); | ||||||
|  | jest.mock("../../../stores/FeatureToggleServerFacade"); | ||||||
|  | jest.autoMockOff(); | ||||||
| 
 | 
 | ||||||
| var React = require("react/addons"); | var React = require("react/addons"); | ||||||
| var TestUtils = React.addons.TestUtils; | var TestUtils = React.addons.TestUtils; | ||||||
| var FeatureArchive = require("../../../components/feature/ArchiveFeatureComponent"); | var FeatureArchive      = require("../../../components/feature/ArchiveFeatureComponent"); | ||||||
| var FeatureStore = require("../../../stores/FeatureStore"); | var Server  = require("../../../stores/FeatureToggleServerFacade"); | ||||||
|  | var FeatureToggleStore  = require("../../../stores/FeatureToggleStore"); | ||||||
| 
 | 
 | ||||||
| describe("FeatureForm", function () { | describe("FeatureForm", function () { | ||||||
|     var Component; |     var Component; | ||||||
|     beforeEach(function() { |     beforeEach(function() { | ||||||
|         FeatureStore.getArchivedFeatures.mockImplementation(function() { |         var archivedToggles = [ | ||||||
|             return { |             { name: "featureX" }, | ||||||
|                 then: function (callback) { |             { name: "featureY" } | ||||||
|                     return callback({ |         ]; | ||||||
|                         features: [ | 
 | ||||||
|                             { name: "featureX" }, |         Server.getArchivedFeatures.mockImplementation(function(cb) { | ||||||
|                             { name: "featureY" } |           cb(archivedToggles); | ||||||
|                         ] |  | ||||||
|                     }); |  | ||||||
|                 } |  | ||||||
|             }; |  | ||||||
|         }); |  | ||||||
|         FeatureStore.reviveFeature.mockImplementation(function() { |  | ||||||
|             return { |  | ||||||
|                 then: function (callback) {return callback();} |  | ||||||
|             }; |  | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         Component = TestUtils .renderIntoDocument(<FeatureArchive />); |         FeatureToggleStore.initStore([], archivedToggles); | ||||||
|  | 
 | ||||||
|  |         Component = TestUtils.renderIntoDocument(<FeatureArchive />); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     afterEach(function() { |     afterEach(function() { | ||||||
| @ -35,17 +31,15 @@ describe("FeatureForm", function () { | |||||||
| 
 | 
 | ||||||
|     it("should render two archived features", function() { |     it("should render two archived features", function() { | ||||||
|         var rows = Component.getDOMNode().querySelectorAll("tbody tr"); |         var rows = Component.getDOMNode().querySelectorAll("tbody tr"); | ||||||
|  | 
 | ||||||
|         expect(rows.length).toEqual(2); |         expect(rows.length).toEqual(2); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it("should revive archived feature toggle", function() { |     it("should revive archived feature toggle", function() { | ||||||
|         var button = Component.getDOMNode().querySelector("tbody button"); |       var button = Component.getDOMNode().querySelector("tbody button"); | ||||||
|         TestUtils.Simulate.click(button); |       TestUtils.Simulate.click(button); | ||||||
|         var rows = Component.getDOMNode().querySelectorAll("tbody tr"); |  | ||||||
| 
 | 
 | ||||||
|         expect(rows.length).toEqual(1); |       jest.runAllTimers(); | ||||||
|         expect(FeatureStore.reviveFeature).toBeCalledWith({ |       expect(Server.reviveFeature).toBeCalled(); | ||||||
|             name: "featureX" |  | ||||||
|         }); |  | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
|  | |||||||
| @ -1,64 +1,65 @@ | |||||||
| var React = require("react"); | var React               = require("react"); | ||||||
| var FeatureStore  = require('../../stores/FeatureStore'); | var FeatureActions      = require('../../stores/FeatureToggleActions'); | ||||||
|  | var FeatureToggleStore  = require('../../stores/FeatureToggleStore'); | ||||||
| 
 | 
 | ||||||
| var ArchiveFeatureComponent = React.createClass({ | var ArchiveFeatureComponent = React.createClass({ | ||||||
|     getInitialState: function() { |   getInitialState: function() { | ||||||
|         return { |     return { | ||||||
|             archivedFeatures: [] |       archivedFeatures: FeatureToggleStore.getArchivedToggles() | ||||||
|         }; |     }; | ||||||
|     }, |   }, | ||||||
| 
 | 
 | ||||||
|     removeToggleFromState: function(item) { |   onStoreChange: function() { | ||||||
|         var updatedArchive = this.state.archivedFeatures.filter(function(f) { |     this.setState({ | ||||||
|             return f.name !== item.name; |       archivedFeatures: FeatureToggleStore.getArchivedToggles() | ||||||
|         }); |     }); | ||||||
|         this.setState({archivedFeatures: updatedArchive}); |   }, | ||||||
|     }, |  | ||||||
| 
 | 
 | ||||||
|     onRevive: function( item) { |   componentDidMount: function() { | ||||||
|         FeatureStore.reviveFeature(item).then(this.removeToggleFromState.bind(this, item)); |     this.unsubscribe = FeatureToggleStore.listen(this.onStoreChange); | ||||||
|     }, |   }, | ||||||
| 
 | 
 | ||||||
|     componentDidMount: function () { |   componentWillUnmount: function() { | ||||||
|         FeatureStore.getArchivedFeatures().then(function(data) { |     this.unsubscribe(); | ||||||
|             this.setState({archivedFeatures: data.features}); |   }, | ||||||
|         }.bind(this)) |  | ||||||
|     }, |  | ||||||
| 
 | 
 | ||||||
|     render: function () { |   onRevive: function(item) { | ||||||
|         return ( |     FeatureActions.revive(item); | ||||||
|             <div> |   }, | ||||||
|                 <h1>Archived feature toggles</h1> |  | ||||||
|                 <table className="outerborder man"> |  | ||||||
|                     <thead> |  | ||||||
|                         <tr> |  | ||||||
|                             <th>Name</th> |  | ||||||
|                             <th></th> |  | ||||||
|                         </tr> |  | ||||||
|                     </thead> |  | ||||||
|                     <tbody> |  | ||||||
|                         {this.state.archivedFeatures.map(this.renderArchivedItem)} |  | ||||||
|                     </tbody> |  | ||||||
|                 </table> |  | ||||||
|             </div> |  | ||||||
|             ); |  | ||||||
|     }, |  | ||||||
| 
 | 
 | ||||||
|     renderArchivedItem: function(f) { |   render: function () { | ||||||
|         return ( |     return ( | ||||||
|             <tr key={f.name}> |       <div> | ||||||
|                 <td> |         <h1>Archived feature toggles</h1> | ||||||
|                     {f.name}<br /> |         <table className="outerborder man"> | ||||||
|                     <span className="opaque smalltext word-break">{f.description}</span> |           <thead> | ||||||
|  |             <tr> | ||||||
|  |               <th>Name</th> | ||||||
|  |               <th></th> | ||||||
|  |             </tr> | ||||||
|  |           </thead> | ||||||
|  |           <tbody> | ||||||
|  |             {this.state.archivedFeatures.map(this.renderArchivedItem)} | ||||||
|  |           </tbody> | ||||||
|  |         </table> | ||||||
|  |       </div> | ||||||
|  |       ); | ||||||
|  |   }, | ||||||
| 
 | 
 | ||||||
|                 </td> |   renderArchivedItem: function(f) { | ||||||
|                 <td className="rightify" width="150"> |     return ( | ||||||
|                     <button onClick={this.onRevive.bind(this, f)} title="Revive feature toggle"> |       <tr key={f.name}> | ||||||
|                         <span className="icon-svar"></span> |         <td> | ||||||
|                     </button> |           {f.name}<br /> | ||||||
|                 </td> |           <span className="opaque smalltext word-break">{f.description}</span> | ||||||
|             </tr>); |         </td> | ||||||
|     } |         <td className="rightify" width="150"> | ||||||
|  |           <button onClick={this.onRevive.bind(this, f)} title="Revive feature toggle"> | ||||||
|  |             <span className="icon-svar"></span> | ||||||
|  |           </button> | ||||||
|  |         </td> | ||||||
|  |       </tr>); | ||||||
|  |   } | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| module.exports = ArchiveFeatureComponent; | module.exports = ArchiveFeatureComponent; | ||||||
|  | |||||||
| @ -1,25 +1,33 @@ | |||||||
| var React         = require('react'); | var React               = require('react'); | ||||||
| var Timer         = require('../../utils/Timer'); | var ErrorMessages       = require('../ErrorMessages'); | ||||||
| var ErrorMessages = require('../ErrorMessages'); | var FeatureList         = require('./FeatureList'); | ||||||
| var FeatureList   = require('./FeatureList'); | var FeatureForm         = require('./FeatureForm'); | ||||||
| var FeatureForm   = require('./FeatureForm'); | var FeatureActions      = require('../../stores/FeatureToggleActions'); | ||||||
| var FeatureStore  = require('../../stores/FeatureStore'); | var FeatureToggleStore  = require('../../stores/FeatureToggleStore'); | ||||||
| var FeatureStore2 = require('../../stores/FeatureStore2'); |  | ||||||
| var FeatureActions = require('../../stores/FeatureActions'); |  | ||||||
| var Reflux        = require('reflux'); |  | ||||||
| 
 | 
 | ||||||
| var FeatureTogglesComponent = React.createClass({ | var FeatureTogglesComponent = React.createClass({ | ||||||
|     getInitialState: function() { |     getInitialState: function() { | ||||||
|         return { |         return { | ||||||
|  |             features: FeatureToggleStore.getFeatureToggles(), | ||||||
|             errors: [], |             errors: [], | ||||||
|             createView: false, |             createView: false | ||||||
|             featurePoller: new Timer(this.loadFeaturesFromServer, this.props.pollInterval) |  | ||||||
|         }; |         }; | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     mixins: [Reflux.connect(FeatureStore2,"features")], |     onFeatureToggleChange: function() { | ||||||
|  |         this.setState({ | ||||||
|  |             features: FeatureToggleStore.getFeatureToggles() | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  |     componentDidMount: function() { | ||||||
|  |         this.unsubscribe = FeatureToggleStore.listen(this.onFeatureToggleChange); | ||||||
|  |     }, | ||||||
|  |     componentWillUnmount: function() { | ||||||
|  |         this.unsubscribe(); | ||||||
|  |     }, | ||||||
| 
 | 
 | ||||||
|     handleError: function (error) { |     handleError: function (error) { | ||||||
|  |       console.log(error); | ||||||
|         if (this.isClientError(error)) { |         if (this.isClientError(error)) { | ||||||
|             var errors = JSON.parse(error.responseText) |             var errors = JSON.parse(error.responseText) | ||||||
|             errors.forEach(function(e) { this.addError(e.msg); }.bind(this)) |             errors.forEach(function(e) { this.addError(e.msg); }.bind(this)) | ||||||
| @ -28,57 +36,22 @@ var FeatureTogglesComponent = React.createClass({ | |||||||
|         } else { |         } else { | ||||||
|             this.addError(error); |             this.addError(error); | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         this.forceUpdate(); |  | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     updateFeature: function (feature) { |     updateFeature: function (feature) { | ||||||
|         this.stopFeaturePoller(); |       FeatureActions.update.triggerPromise(feature) | ||||||
| 
 |  | ||||||
|         FeatureStore |  | ||||||
|           .updateFeature(feature) |  | ||||||
|           .then(this.startFeaturePoller) |  | ||||||
|           .catch(this.handleError); |           .catch(this.handleError); | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     archiveFeature: function (feature) { |     archiveFeature: function (feature) { | ||||||
|         var updatedFeatures = this.state.features.filter(function(item) { |         FeatureActions.archive.triggerPromise(feature) | ||||||
|             return item.name !== feature.name; |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         FeatureStore |  | ||||||
|             .archiveFeature(feature) |  | ||||||
|             .then(function() { |  | ||||||
|                 this.setState({features: updatedFeatures}) |  | ||||||
|             }.bind(this)) |  | ||||||
|             .catch(this.handleError); |             .catch(this.handleError); | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     startFeaturePoller: function () { |  | ||||||
|         this.state.featurePoller.start(); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     stopFeaturePoller: function () { |  | ||||||
|         if (this.state.featurePoller != null) { |  | ||||||
|             this.state.featurePoller.stop(); |  | ||||||
|         } |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     createFeature: function (feature) { |     createFeature: function (feature) { | ||||||
|         //this.stopFeaturePoller(); |         FeatureActions.create.triggerPromise(feature) | ||||||
| 
 |  | ||||||
|         FeatureActions.addToggle.triggerPromise(feature) |  | ||||||
|           .then(this.cancelNewFeature) |           .then(this.cancelNewFeature) | ||||||
|           .catch(this.handleError); |           .catch(this.handleError); | ||||||
| 
 |  | ||||||
| /* |  | ||||||
| 
 |  | ||||||
|         FeatureStore |  | ||||||
|           .createFeature(feature) |  | ||||||
|           .then(this.cancelNewFeature) |  | ||||||
|           .then(this.startFeaturePoller) |  | ||||||
|           .catch(this.handleError); |  | ||||||
| */ |  | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     newFeature: function() { |     newFeature: function() { | ||||||
| @ -94,8 +67,10 @@ var FeatureTogglesComponent = React.createClass({ | |||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     addError: function(msg) { |     addError: function(msg) { | ||||||
|         if (this.state.errors[this.state.errors.length - 1] !== msg) { |       var errors = this.state.errors; | ||||||
|             this.state.errors.push(msg); |         if (errors[errors.length - 1] !== msg) { | ||||||
|  |             errors.push(msg); | ||||||
|  |             this.setState(errors); | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,4 +0,0 @@ | |||||||
| var Reflux = require("reflux"); |  | ||||||
| module.exports = { |  | ||||||
|   addToggle: Reflux.createAction({ asyncResult: true }) |  | ||||||
| }; |  | ||||||
| @ -1,62 +0,0 @@ | |||||||
| var reqwest = require('reqwest'); |  | ||||||
| 
 |  | ||||||
| var TYPE         = 'json'; |  | ||||||
| var CONTENT_TYPE = 'application/json'; |  | ||||||
| 
 |  | ||||||
| FeatureStore = { |  | ||||||
|     updateFeature: function (feature) { |  | ||||||
|         return reqwest({ |  | ||||||
|             url: 'features/' + feature.name, |  | ||||||
|             method: 'put', |  | ||||||
|             type: TYPE, |  | ||||||
|             contentType: CONTENT_TYPE, |  | ||||||
|             data: JSON.stringify(feature) |  | ||||||
|         }); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     createFeature: function (feature) { |  | ||||||
|         return reqwest({ |  | ||||||
|             url: 'features', |  | ||||||
|             method: 'post', |  | ||||||
|             type: TYPE, |  | ||||||
|             contentType: CONTENT_TYPE, |  | ||||||
|             data: JSON.stringify(feature) |  | ||||||
|         }); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     archiveFeature: function (feature) { |  | ||||||
|         return reqwest({ |  | ||||||
|             url: 'features/' + feature.name, |  | ||||||
|             method: 'delete', |  | ||||||
|             type: TYPE |  | ||||||
|         }); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     getFeatures: function () { |  | ||||||
|         return reqwest({ |  | ||||||
|             url: 'features', |  | ||||||
|             method: 'get', |  | ||||||
|             type: TYPE |  | ||||||
|         }); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     getArchivedFeatures: function () { |  | ||||||
|         return reqwest({ |  | ||||||
|             url: 'archive/features', |  | ||||||
|             method: 'get', |  | ||||||
|             type: TYPE |  | ||||||
|         }); |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     reviveFeature: function (feature) { |  | ||||||
|         return reqwest({ |  | ||||||
|             url: 'archive/revive', |  | ||||||
|             method: 'post', |  | ||||||
|             type: TYPE, |  | ||||||
|             contentType: CONTENT_TYPE, |  | ||||||
|             data: JSON.stringify(feature) |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| module.exports = FeatureStore; |  | ||||||
| @ -1,69 +0,0 @@ | |||||||
| var reqwest = require('reqwest'); |  | ||||||
| var Reflux = require('reflux'); |  | ||||||
| var FeatureActions = require('./FeatureActions'); |  | ||||||
| 
 |  | ||||||
| var TYPE         = 'json'; |  | ||||||
| var CONTENT_TYPE = 'application/json'; |  | ||||||
| 
 |  | ||||||
| function getFeatures() { |  | ||||||
|   return reqwest({ |  | ||||||
|       url: 'features', |  | ||||||
|       method: 'get', |  | ||||||
|       type: CONTENT_TYPE |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| var _toggles = []; |  | ||||||
| 
 |  | ||||||
| // Creates a DataStore
 |  | ||||||
| var FeatureStore = Reflux.createStore({ |  | ||||||
|   // Initial setup
 |  | ||||||
|   init: function() { |  | ||||||
|     this.listenTo(FeatureActions.addToggle, this.onAddToggle); |  | ||||||
| 
 |  | ||||||
|     getFeatures() |  | ||||||
|       .then(function(data) { |  | ||||||
|         this.setToggles(JSON.parse(data.response).features); |  | ||||||
|       }.bind(this)) |  | ||||||
|       .catch(this.handleError); |  | ||||||
|   }, |  | ||||||
| 
 |  | ||||||
|   onAddToggle: function(feature) { |  | ||||||
|     reqwest({ |  | ||||||
|         url: 'features', |  | ||||||
|         method: 'post', |  | ||||||
|         type: TYPE, |  | ||||||
|         contentType: CONTENT_TYPE, |  | ||||||
|         data: JSON.stringify(feature), |  | ||||||
|         error: function (error) { |  | ||||||
|           FeatureActions.addToggle.failed(error); |  | ||||||
|         }, |  | ||||||
|         success: function () { |  | ||||||
|           this.setToggles(_toggles.concat([feature])); |  | ||||||
|           FeatureActions.addToggle.completed(); |  | ||||||
|         }.bind(this) |  | ||||||
|     }); |  | ||||||
|   }, |  | ||||||
| 
 |  | ||||||
|   setToggles: function(toggles) { |  | ||||||
|     _toggles = toggles; |  | ||||||
|     this.trigger(_toggles); |  | ||||||
|   }, |  | ||||||
| 
 |  | ||||||
|   handleError: function(er) { |  | ||||||
|     console.log("error: "+ er); |  | ||||||
|   }, |  | ||||||
| 
 |  | ||||||
|   //getter for notes
 |  | ||||||
|   getToggles: function() { |  | ||||||
|     return _toggles; |  | ||||||
|   }, |  | ||||||
| 
 |  | ||||||
|   getInitialState: function() { |  | ||||||
|     return _toggles; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| module.exports = FeatureStore; |  | ||||||
							
								
								
									
										7
									
								
								public/js/stores/FeatureToggleActions.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								public/js/stores/FeatureToggleActions.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | var Reflux = require("reflux"); | ||||||
|  | module.exports = { | ||||||
|  |   create:  Reflux.createAction({ asyncResult: true }), | ||||||
|  |   update:  Reflux.createAction({ asyncResult: true }), | ||||||
|  |   archive: Reflux.createAction({ asyncResult: true }), | ||||||
|  |   revive:  Reflux.createAction({ asyncResult: true }) | ||||||
|  | }; | ||||||
							
								
								
									
										98
									
								
								public/js/stores/FeatureToggleServerFacade.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								public/js/stores/FeatureToggleServerFacade.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,98 @@ | |||||||
|  | var reqwest = require('reqwest'); | ||||||
|  | 
 | ||||||
|  | var TYPE         = 'json'; | ||||||
|  | var CONTENT_TYPE = 'application/json'; | ||||||
|  | 
 | ||||||
|  | var FeatureToggleServerFacade = { | ||||||
|  |     updateFeature: function (feature, cb) { | ||||||
|  |         reqwest({ | ||||||
|  |             url: 'features/' + feature.name, | ||||||
|  |             method: 'put', | ||||||
|  |             type: TYPE, | ||||||
|  |             contentType: CONTENT_TYPE, | ||||||
|  |             data: JSON.stringify(feature), | ||||||
|  |             error: function(error) { | ||||||
|  |               cb(error); | ||||||
|  |             }, | ||||||
|  |             success: function() { | ||||||
|  |               cb(); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     createFeature: function (feature, cb) { | ||||||
|  |         reqwest({ | ||||||
|  |             url: 'features', | ||||||
|  |             method: 'post', | ||||||
|  |             type: TYPE, | ||||||
|  |             contentType: CONTENT_TYPE, | ||||||
|  |             data: JSON.stringify(feature), | ||||||
|  |             error: function(error) { | ||||||
|  |               cb(error); | ||||||
|  |             }, | ||||||
|  |             success: function() { | ||||||
|  |               cb(); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     archiveFeature: function(feature, cb) { | ||||||
|  |         reqwest({ | ||||||
|  |             url: 'features/' + feature.name, | ||||||
|  |             method: 'delete', | ||||||
|  |             type: TYPE, | ||||||
|  |             error: function(error) { | ||||||
|  |               cb(error); | ||||||
|  |             }, | ||||||
|  |             success: function() { | ||||||
|  |               cb(); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     getFeatures: function(cb) { | ||||||
|  |         reqwest({ | ||||||
|  |             url: 'features', | ||||||
|  |             method: 'get', | ||||||
|  |             type: TYPE, | ||||||
|  |             error: function(error) { | ||||||
|  |               cb(error); | ||||||
|  |             }, | ||||||
|  |             success: function(data) { | ||||||
|  |               cb(null, data.features); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     getArchivedFeatures: function(cb) { | ||||||
|  |         reqwest({ | ||||||
|  |             url: 'archive/features', | ||||||
|  |             method: 'get', | ||||||
|  |             type: TYPE, | ||||||
|  |             error: function(error) { | ||||||
|  |               cb(error); | ||||||
|  |             }, | ||||||
|  |             success: function(data) { | ||||||
|  |               cb(null, data.features); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     reviveFeature: function (feature, cb) { | ||||||
|  |         reqwest({ | ||||||
|  |             url: 'archive/revive', | ||||||
|  |             method: 'post', | ||||||
|  |             type: TYPE, | ||||||
|  |             contentType: CONTENT_TYPE, | ||||||
|  |             data: JSON.stringify(feature), | ||||||
|  |             error: function(error) { | ||||||
|  |               cb(error); | ||||||
|  |             }, | ||||||
|  |             success: function() { | ||||||
|  |               cb(); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | module.exports = FeatureToggleServerFacade; | ||||||
							
								
								
									
										122
									
								
								public/js/stores/FeatureToggleStore.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								public/js/stores/FeatureToggleStore.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | |||||||
|  | var Reflux          = require('reflux'); | ||||||
|  | var FeatureActions  = require('./FeatureToggleActions'); | ||||||
|  | var Server          = require('./FeatureToggleServerFacade'); | ||||||
|  | 
 | ||||||
|  | var _featureToggles = []; | ||||||
|  | var _archivedToggles = []; | ||||||
|  | 
 | ||||||
|  | // Creates a DataStore
 | ||||||
|  | var FeatureStore = Reflux.createStore({ | ||||||
|  |   // Initial setup
 | ||||||
|  |   init: function() { | ||||||
|  |     this.listenTo(FeatureActions.create,  this.onCreate); | ||||||
|  |     this.listenTo(FeatureActions.update,  this.onUpdate); | ||||||
|  |     this.listenTo(FeatureActions.archive, this.onArchive); | ||||||
|  |     this.listenTo(FeatureActions.revive,  this.onRevive); | ||||||
|  | 
 | ||||||
|  |     Server.getFeatures(function(err, featureToggles) { | ||||||
|  |       this.setToggles(featureToggles); | ||||||
|  |     }.bind(this)); | ||||||
|  | 
 | ||||||
|  |     Server.getArchivedFeatures(function(err, archivedToggles) { | ||||||
|  |       _archivedToggles = archivedToggles; | ||||||
|  |       this.trigger(); | ||||||
|  |     }.bind(this)); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   onCreate: function(feature) { | ||||||
|  |     Server.createFeature(feature, function(error) { | ||||||
|  |       if(error) { | ||||||
|  |         FeatureActions.create.failed(error); | ||||||
|  |       } else { | ||||||
|  |         this.setToggles([feature].concat(_featureToggles)); | ||||||
|  |         FeatureActions.create.completed(); | ||||||
|  |       } | ||||||
|  |     }.bind(this)); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   onArchive: function(feature) { | ||||||
|  |     Server.archiveFeature(feature, function(error) { | ||||||
|  |       if(error) { | ||||||
|  |         FeatureActions.archive.failed(error); | ||||||
|  |       } else { | ||||||
|  |         this.archiveToggle(feature); | ||||||
|  |         FeatureActions.archive.completed(); | ||||||
|  |       } | ||||||
|  |     }.bind(this)); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   onUpdate: function(feature) { | ||||||
|  |     Server.updateFeature(feature, function(error) { | ||||||
|  |       if(error) { | ||||||
|  |         FeatureActions.update.failed(error); | ||||||
|  |       } else { | ||||||
|  |         this.updateToggle(feature); | ||||||
|  |         FeatureActions.update.completed(); | ||||||
|  |       } | ||||||
|  |     }.bind(this)); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   onRevive: function(feature) { | ||||||
|  |     Server.reviveFeature(feature, function(error) { | ||||||
|  |       if(error) { | ||||||
|  |         FeatureActions.revive.failed(error); | ||||||
|  |       } else { | ||||||
|  |         this.revive(feature); | ||||||
|  |         FeatureActions.revive.completed(); | ||||||
|  |       } | ||||||
|  |     }.bind(this)); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   setToggles: function(toggles) { | ||||||
|  |     _featureToggles = toggles; | ||||||
|  |     this.trigger(); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   updateToggle: function(feature) { | ||||||
|  |     var idx; | ||||||
|  |     _featureToggles.forEach(function(item, i) { | ||||||
|  |       if(item.name === feature.name) { | ||||||
|  |         idx = i; | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |     _featureToggles[idx] = feature; | ||||||
|  |     this.trigger(); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   archiveToggle: function(feature) { | ||||||
|  |     var idx; | ||||||
|  |     _featureToggles.forEach(function(item, i) { | ||||||
|  |       if(item.name === feature.name) { | ||||||
|  |         idx = i; | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |     _featureToggles.splice(idx, 1); | ||||||
|  |     _archivedToggles.unshift(feature); | ||||||
|  |     this.trigger(); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   revive: function(item) { | ||||||
|  |     var newStore = _archivedToggles.filter(function(f) { | ||||||
|  |         return f.name !== item.name; | ||||||
|  |     }); | ||||||
|  |     _archivedToggles = newStore; | ||||||
|  |     _featureToggles.push(item); | ||||||
|  |     this.trigger(); | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   getFeatureToggles: function() { | ||||||
|  |     return _featureToggles; | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   getArchivedToggles: function() { | ||||||
|  |     return _archivedToggles; | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   initStore: function(toggles, archivedToggles) { | ||||||
|  |     _featureToggles = toggles; | ||||||
|  |     _archivedToggles = archivedToggles; | ||||||
|  |   } | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | module.exports = FeatureStore; | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user