diff --git a/packages/unleash-frontend/.babelrc b/packages/unleash-frontend/.babelrc deleted file mode 100644 index e68d2fea11..0000000000 --- a/packages/unleash-frontend/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["es2015", "stage-2", "react"] -} diff --git a/packages/unleash-frontend/.eslintrc b/packages/unleash-frontend/.eslintrc deleted file mode 100644 index 8f68bb4a87..0000000000 --- a/packages/unleash-frontend/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": [ - "finn", - "finn/node" - ] -} diff --git a/packages/unleash-frontend/jest-preprocessor.js b/packages/unleash-frontend/jest-preprocessor.js deleted file mode 100644 index 66c8d10d00..0000000000 --- a/packages/unleash-frontend/jest-preprocessor.js +++ /dev/null @@ -1,9 +0,0 @@ -// preprocessor.js -'use strict'; - -const ReactTools = require('react-tools'); -module.exports = { - process (src) { - return ReactTools.transform(src); - }, -}; diff --git a/packages/unleash-frontend/lib/index.js b/packages/unleash-frontend/lib/index.js deleted file mode 100644 index f4e28aabcd..0000000000 --- a/packages/unleash-frontend/lib/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -const path = require('path'); - -module.exports = { - publicFolder: path.join(__dirname, '..', 'public'), -}; diff --git a/packages/unleash-frontend/lib/server-dev.js b/packages/unleash-frontend/lib/server-dev.js deleted file mode 100644 index fb6b6a5a0d..0000000000 --- a/packages/unleash-frontend/lib/server-dev.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -const server = require('unleash-api'); - -const unleash = server.start({}); -const app = unleash.app; -const config = unleash.config; - -const webpack = require('webpack'); -const webpackDevMiddleware = require('webpack-dev-middleware'); -const webpackConfig = require('./webpack.config'); -const compiler = webpack(webpackConfig); - -app.use(config.baseUriPath, webpackDevMiddleware(compiler, { - publicPath: '/js', - noInfo: true, -})); diff --git a/packages/unleash-frontend/package.json b/packages/unleash-frontend/package.json deleted file mode 100644 index 17119f297c..0000000000 --- a/packages/unleash-frontend/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "unleash-frontend", - "description": "unleash your features", - "version": "1.0.0-alpha.2", - "keywords": [ - "unleash", - "feature toggle", - "feature", - "toggle" - ], - "files": [ - "public", - "README.md", - "LICENSE" - ], - "repository": { - "type": "git", - "url": "ssh://git@github.com:finn-no/unleash.git" - }, - "bugs": { - "url": "https://github.com/finn-no/unleash/issues" - }, - "engines": { - "node": "6" - }, - "scripts": { - "build": "webpack -p", - "start": "NODE_ENV=development supervisor --ignore ./node_modules/,./public/js lib/server-dev.js", - "test": "jest", - "test:ci": "npm run test", - "prepublish": "npm run build" - }, - "main": "./lib/index.js", - "dependencies": { - "lodash": "^3.5.0", - "moment": "^2.13.0", - "react": "^0.13.1", - "react-router": "^0.13.2", - "reflux": "^0.2.10", - "reqwest": "^2.0.5" - }, - "devDependencies": { - "babel-core": "^6.9.1", - "babel-loader": "^6.2.4", - "babel-preset-es2015": "^6.9.0", - "babel-preset-react": "^6.5.0", - "babel-preset-stage-2": "^6.5.0", - "chai": "3.5.0", - "coveralls": "^2.11.9", - "istanbul": "^0.4.3", - "jest-cli": "0.5.8", - "mocha": "^2.4.5", - "mocha-lcov-reporter": "1.2.0", - "nsp": "^2.3.2", - "react-tools": "^0.13.1", - "supertest": "^1.2.0", - "supervisor": "^0.10.0", - "unleash-api": "1.0.0-alpha.2", - "webpack": "^1.13.2", - "webpack-dev-middleware": "^1.6.1" - }, - "jest": { - "scriptPreprocessor": "/jest-preprocessor.js", - "modulePathIgnorePatterns": [ - "/node_modules/npm" - ], - "unmockedModulePathPatterns": [ - "/node_modules/react", - "/node_modules/reflux" - ], - "moduleFileExtensions": [ - "jsx", - "js" - ] - }, - "pre-commit": [ - "lint" - ] -} diff --git a/packages/unleash-frontend/public/.eslintrc b/packages/unleash-frontend/public/.eslintrc deleted file mode 100644 index bbd3b438ca..0000000000 --- a/packages/unleash-frontend/public/.eslintrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": [ - "finn", - "finn-react" - ], - "env": { - "browser": true, - "commonjs": true - }, - "rules": { - "react/sort-comp": "off" - } -} diff --git a/packages/unleash-frontend/public/favicon.ico b/packages/unleash-frontend/public/favicon.ico deleted file mode 100644 index a2bc43c660..0000000000 Binary files a/packages/unleash-frontend/public/favicon.ico and /dev/null differ diff --git a/packages/unleash-frontend/public/index.html b/packages/unleash-frontend/public/index.html deleted file mode 100644 index 5ba4ffe381..0000000000 --- a/packages/unleash-frontend/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - unleash admin - - - - - - -
- - - diff --git a/packages/unleash-frontend/public/js/UnleashApp.jsx b/packages/unleash-frontend/public/js/UnleashApp.jsx deleted file mode 100644 index 4532c563d0..0000000000 --- a/packages/unleash-frontend/public/js/UnleashApp.jsx +++ /dev/null @@ -1,99 +0,0 @@ -'use strict'; - -const React = require('react'); -const Router = require('react-router'); -const Menu = require('./components/Menu'); -const ErrorMessages = require('./components/ErrorMessages'); -const initalizer = require('./stores/initalizer'); -const FeatureToggleStore = require('./stores/FeatureToggleStore'); -const StrategyStore = require('./stores/StrategyStore'); -const ArchiveStore = require('./stores/ArchivedToggleStore'); -const Link = Router.Link; -const RouteHandler = Router.RouteHandler; - -const UnleashApp = React.createClass({ - contextTypes: { - router: React.PropTypes.func, - }, - - getInitialState () { - return { - features: FeatureToggleStore.getFeatureToggles(), - strategies: StrategyStore.getStrategies(), - archivedFeatures: ArchiveStore.getArchivedToggles(), - }; - }, - - onFeatureToggleChange () { - this.setState({ - features: FeatureToggleStore.getFeatureToggles(), - }); - }, - - onStrategiesChange () { - this.setState({ - strategies: StrategyStore.getStrategies(), - }); - }, - - onArchiveChange () { - this.setState({ - archivedFeatures: ArchiveStore.getArchivedToggles(), - }); - }, - - componentDidMount () { - this.unsubscribeFS = FeatureToggleStore.listen(this.onFeatureToggleChange); - this.unsubscribeSS = StrategyStore.listen(this.onStrategiesChange); - this.unsubscribeAS = ArchiveStore.listen(this.onArchiveChange); - }, - componentWillUnmount () { - this.unsubscribeFS(); - this.unsubscribeSS(); - this.unsubscribeAS(); - }, - - componentWillMount () { - initalizer(30); - }, - - renderLink (id, label) { - return ( - - {label} - - ); - }, - - render () { - return ( -
- - {this.renderLink('features', 'Toggles')} - {this.renderLink('strategies', 'Strategies')} - {this.renderLink('log', 'Log')} - {this.renderLink('archive', 'Archive')} - -
-
- -
-
-
- -
-
-
-
-
-
- ); - }, -}); - - -module.exports = UnleashApp; diff --git a/packages/unleash-frontend/public/js/__tests__/.eslintrc b/packages/unleash-frontend/public/js/__tests__/.eslintrc deleted file mode 100644 index 5a70beecec..0000000000 --- a/packages/unleash-frontend/public/js/__tests__/.eslintrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": [ - "finn", - "finn/node" - ], - "env": { - "browser": true, - "mocha": true - }, - "globals": { - "it": false, - "jest": false, - "beforeEach": false, - "expect": false, - "describe": false, - "afterEach": false - } -} diff --git a/packages/unleash-frontend/public/js/__tests__/components/Menu-test.js b/packages/unleash-frontend/public/js/__tests__/components/Menu-test.js deleted file mode 100644 index fa525c5ad8..0000000000 --- a/packages/unleash-frontend/public/js/__tests__/components/Menu-test.js +++ /dev/null @@ -1,15 +0,0 @@ -/** @jsx React.DOM */ -'use strict'; - -jest.dontMock('../../components/Menu'); - -const Menu = require('../../components/Menu'); -const React = require('react/addons'); -const TestUtils = React.addons.TestUtils; - -describe('Menu test', () => { - it('should include unleash in menu', () => { - const Compononent = TestUtils .renderIntoDocument(); - expect(Compononent.getDOMNode().textContent).toMatch('unleash'); - }); -}); diff --git a/packages/unleash-frontend/public/js/__tests__/components/feature/ArchiveFeatureComponent-test.js b/packages/unleash-frontend/public/js/__tests__/components/feature/ArchiveFeatureComponent-test.js deleted file mode 100644 index 2052b866c5..0000000000 --- a/packages/unleash-frontend/public/js/__tests__/components/feature/ArchiveFeatureComponent-test.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -jest.dontMock('../../../components/feature/ArchiveFeatureComponent'); -jest.mock('../../../stores/FeatureToggleActions'); -jest.autoMockOff(); - -const React = require('react/addons'); -const TestUtils = React.addons.TestUtils; -const FeatureArchive = require('../../../components/feature/ArchiveFeatureComponent'); -const FeatureActions = require('../../../stores/FeatureToggleActions'); - -describe('FeatureForm', () => { - let Component; - beforeEach(() => { - const archivedToggles = [ - { name: 'featureX' }, - { name: 'featureY' }, - ]; - - Component = TestUtils.renderIntoDocument( - ); - }); - - afterEach(() => { - React.unmountComponentAtNode(document.body); - }); - - it('should render two archived features', () => { - const rows = Component.getDOMNode().querySelectorAll('tbody tr'); - - expect(rows.length).toEqual(2); - }); - - it('should revive archived feature toggle', () => { - const button = Component.getDOMNode().querySelector('tbody button'); - TestUtils.Simulate.click(button); - - jest.runAllTimers(); - expect(FeatureActions.revive.triggerPromise).toBeCalled(); - }); -}); diff --git a/packages/unleash-frontend/public/js/__tests__/components/feature/FeatureForm-test.js b/packages/unleash-frontend/public/js/__tests__/components/feature/FeatureForm-test.js deleted file mode 100644 index adc310e2be..0000000000 --- a/packages/unleash-frontend/public/js/__tests__/components/feature/FeatureForm-test.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict'; - -jest.dontMock('../../../components/feature/FeatureForm'); - -const React = require('react/addons'); -const TestUtils = React.addons.TestUtils; -const FeatureForm = require('../../../components/feature/FeatureForm'); - -describe('FeatureForm', () => { - let Component; - const strategies = [ - { name: 'default' }, - ]; - afterEach(() => { - React.unmountComponentAtNode(document.body); - }); - - describe('new', () => { - it('should render empty form', () => { - Component = TestUtils .renderIntoDocument(); - const value = Component.getDOMNode().querySelectorAll('input'); - expect(value[0].value).toEqual(''); - }); - }); - - describe('edit', () => { - const feature = { name: 'Test', strategy: 'unknown' }; - - it('should show unknown strategy as default', () => { - Component = TestUtils .renderIntoDocument(); - - const strategySelect = Component.getDOMNode().querySelector('select'); - expect(strategySelect.value).toEqual('default'); - }); - }); -}); diff --git a/packages/unleash-frontend/public/js/__tests__/components/feature/FeatureList-test.js b/packages/unleash-frontend/public/js/__tests__/components/feature/FeatureList-test.js deleted file mode 100644 index 9e08e517c7..0000000000 --- a/packages/unleash-frontend/public/js/__tests__/components/feature/FeatureList-test.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -jest.dontMock('../../../components/feature/FeatureList'); -jest.dontMock('../../../components/feature/Feature'); - -const React = require('react/addons'); -const TestUtils = React.addons.TestUtils; -const FeatureList = require('../../../components/feature/FeatureList'); - -describe('FeatureList', () => { - let Component; - - beforeEach(() => { - const features = [ - { name: 'featureX', strategy: 'other' }, - { name: 'group.featureY', strategy: 'default' }, - ]; - const strategies = [ - { name: 'default' }, - ]; - Component = TestUtils .renderIntoDocument(); - }); - - afterEach(() => { - React.unmountComponentAtNode(document.body); - }); - - it('should render all features', () => { - const featuresElement = Component.getDOMNode().querySelectorAll('.feature'); - expect(featuresElement.length).toEqual(2); - }); - - it('should filter list of features', () => { - const filterNode = Component.refs.filter.getDOMNode(); - TestUtils.Simulate.change(filterNode, { target: { value: 'group' } }); - - const featuresElement = Component.getDOMNode().querySelectorAll('.feature'); - expect(featuresElement.length).toEqual(1); - }); - - it('should filter list of features ignoring case', () => { - const filterNode = Component.refs.filter.getDOMNode(); - TestUtils.Simulate.change(filterNode, { target: { value: 'GROUP' } }); - - const featuresElement = Component.getDOMNode().querySelectorAll('.feature'); - expect(featuresElement.length).toEqual(1); - expect(featuresElement[0].textContent).toMatch('group'); - }); - - it('should filter list of features by strategy name', () => { - const searchString = 'other'; - const filterNode = Component.refs.filter.getDOMNode(); - TestUtils.Simulate.change(filterNode, { target: { value: searchString } }); - - const featuresElement = Component.getDOMNode().querySelectorAll('.feature'); - expect(featuresElement.length).toEqual(1); - expect(featuresElement[0].textContent).toMatch(searchString); - }); -}); diff --git a/packages/unleash-frontend/public/js/__tests__/stores/FeatureToggleStore-test.js b/packages/unleash-frontend/public/js/__tests__/stores/FeatureToggleStore-test.js deleted file mode 100644 index 7a06d38a4c..0000000000 --- a/packages/unleash-frontend/public/js/__tests__/stores/FeatureToggleStore-test.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -jest.autoMockOff(); -jest.dontMock('../../stores/FeatureToggleActions'); -jest.dontMock('../../stores/FeatureToggleStore'); - -describe('FeatureToggleStore', () => { - let Actions; - let Store; - let toggles; - - beforeEach(() => { - Actions = require('../../stores/FeatureToggleActions'); - Store = require('../../stores/FeatureToggleStore'); - toggles = [ - { name: 'app.feature', enabled: true, strategy: 'default' }, - ]; - }); - - it('should be an empty store', () => { - expect(Store.getFeatureToggles().length).toBe(0); - }); - - it('should inititialize the store', () => { - Actions.init.completed(toggles); - - jest.runAllTimers(); - expect(Store.getFeatureToggles().length).toBe(1); - expect(Store.getFeatureToggles()[0].name).toEqual('app.feature'); - }); - - it('should add a another toggle', () => { - Actions.init.completed(toggles); - - const newToggle = { name: 'app.featureB', enabled: true, strategy: 'default' }; - - Actions.create.completed(newToggle); - - jest.runAllTimers(); - expect(Store.getFeatureToggles().length).toBe(2); - expect(Store.getFeatureToggles()[1].name).toEqual('app.featureB'); - }); - - it('should archive toggle', () => { - Actions.init.completed(toggles); - - Actions.archive.completed(toggles[0]); - - jest.runAllTimers(); - expect(Store.getFeatureToggles().length).toBe(0); - }); - - it('should keep toggles in sorted order', () => { - Actions.init.completed([ - { name: 'A' }, - { name: 'B' }, - { name: 'C' }, - ]); - - Actions.create.completed({ name: 'AA' }); - - jest.runAllTimers(); - expect(Store.getFeatureToggles()[0].name).toEqual('A'); - expect(Store.getFeatureToggles()[1].name).toEqual('AA'); - expect(Store.getFeatureToggles()[3].name).toEqual('C'); - }); - - it('should update toggle', () => { - Actions.init.completed(toggles); - const toggle = toggles[0]; - - toggle.enabled = false; - Actions.update.completed(toggle); - - - jest.runAllTimers(); - expect(Store.getFeatureToggles()[0].enabled).toEqual(false); - }); -}); diff --git a/packages/unleash-frontend/public/js/app.jsx b/packages/unleash-frontend/public/js/app.jsx deleted file mode 100644 index c79926c75b..0000000000 --- a/packages/unleash-frontend/public/js/app.jsx +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -const React = require('react'); -const Router = require('react-router'); -const UserStore = require('./stores/UserStore'); -const routes = require('./routes'); - -UserStore.init(); - -Router.run(routes, Handler => { - React.render(, document.getElementById('content')); -}); diff --git a/packages/unleash-frontend/public/js/components/ErrorMessages.jsx b/packages/unleash-frontend/public/js/components/ErrorMessages.jsx deleted file mode 100644 index 1468019f7d..0000000000 --- a/packages/unleash-frontend/public/js/components/ErrorMessages.jsx +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -const React = require('react'); -const Ui = require('./ErrorMessages.ui'); -const ErrorStore = require('../stores/ErrorStore'); -const ErrorActions = require('../stores/ErrorActions'); - -const ErrorMessages = React.createClass({ - getInitialState () { - return { - errors: ErrorStore.getErrors(), - }; - }, - - onStoreChange () { - this.setState({ - errors: ErrorStore.getErrors(), - }); - }, - - componentDidMount () { - this.unsubscribe = ErrorStore.listen(this.onStoreChange); - }, - - componentWillUnmount () { - this.unsubscribe(); - }, - - onClearErrors () { - ErrorActions.clear(); - }, - - render () { - return ( - - ); - }, -}); - -module.exports = ErrorMessages; diff --git a/packages/unleash-frontend/public/js/components/ErrorMessages.ui.jsx b/packages/unleash-frontend/public/js/components/ErrorMessages.ui.jsx deleted file mode 100644 index 09770ad38a..0000000000 --- a/packages/unleash-frontend/public/js/components/ErrorMessages.ui.jsx +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -const React = require('react'); - -const ErrorMessages = React.createClass({ - render () { - if (!this.props.errors.length) { - return
; - } - - const errorNodes = this.props.errors.map((e, i) =>
  • {e}
  • ); - - return ( - - ); - }, -}); - -module.exports = ErrorMessages; diff --git a/packages/unleash-frontend/public/js/components/Menu.jsx b/packages/unleash-frontend/public/js/components/Menu.jsx deleted file mode 100644 index a9171d3231..0000000000 --- a/packages/unleash-frontend/public/js/components/Menu.jsx +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -const React = require('react'); -const User = require('./User'); - -const Menu = React.createClass({ - render () { - return ( - - ); - }, -}); - -module.exports = Menu; diff --git a/packages/unleash-frontend/public/js/components/User.jsx b/packages/unleash-frontend/public/js/components/User.jsx deleted file mode 100644 index 2fd480cd02..0000000000 --- a/packages/unleash-frontend/public/js/components/User.jsx +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -const React = require('react'); -const UserStore = require('../stores/UserStore'); - -const User = React.createClass({ - - onSave () { - const value = this.refs.username.getDOMNode().value.trim(); - UserStore.set(value); - }, - - render () { - return ( -
    - -
    - ); - }, -}); - -module.exports = User; diff --git a/packages/unleash-frontend/public/js/components/feature/ArchiveFeatureComponent.jsx b/packages/unleash-frontend/public/js/components/feature/ArchiveFeatureComponent.jsx deleted file mode 100644 index 53ba94dc9a..0000000000 --- a/packages/unleash-frontend/public/js/components/feature/ArchiveFeatureComponent.jsx +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -const React = require('react'); -const FeatureActions = require('../../stores/FeatureToggleActions'); - -const ArchiveFeatureComponent = React.createClass({ - - onRevive (item) { - FeatureActions.revive.triggerPromise(item); - }, - - render () { - return ( -
    -

    Archived Feature Toggles

    -
    - - - - - - - - {this.props.archivedFeatures.map(this.renderArchivedItem)} - -
    Name -
    -
    - ); - }, - - renderArchivedItem (f) { - return ( - - - {f.name}
    - {f.description} - - - - - ); - }, -}); - -module.exports = ArchiveFeatureComponent; diff --git a/packages/unleash-frontend/public/js/components/feature/Feature.jsx b/packages/unleash-frontend/public/js/components/feature/Feature.jsx deleted file mode 100644 index 32ac9c2233..0000000000 --- a/packages/unleash-frontend/public/js/components/feature/Feature.jsx +++ /dev/null @@ -1,124 +0,0 @@ -'use strict'; - -const React = require('react'); -const FeatureForm = require('./FeatureForm'); -const LogEntryList = require('../log/LogEntryList'); -const eventStore = require('../../stores/EventStore'); - -const Feature = React.createClass({ - getInitialState () { - return { - editMode: false, - showHistory: false, - events: [], - }; - }, - - handleEventsResponse (response) { - this.setState({ events: response }); - }, - - toggleHistory () { - eventStore.getEventsByName(this.props.feature.name).then(this.handleEventsResponse); - this.setState({ showHistory: !this.state.showHistory }); - }, - - - toggleEditMode () { - this.setState({ editMode: !this.state.editMode }); - }, - - saveFeature (feature) { - this.props.onChange(feature); - this.toggleEditMode(); - }, - - archiveFeature () { - if (window.confirm(`Are you sure you want to delete ${this.props.feature.name}?`)) { // eslint-disable-line no-alert - this.props.onArchive(this.props.feature); - } - }, - - - renderEditMode () { - return ( - - - - - - ); - }, - - render () { - return ( - - - - - - - {this.props.feature.name}
    - - {this.props.feature.description || '\u00a0'} - - - - - {this.props.feature.strategy} - - - -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - {this.state.editMode ? this.renderEditMode() : this.renderEmptyRow()} - {this.state.showHistory ? this.renderHistory() : this.renderEmptyRow()} - - ); - }, - - renderEmptyRow () { - return (); - }, - - renderHistory () { - return ( - - - - ); - }, - -}); - -module.exports = Feature; diff --git a/packages/unleash-frontend/public/js/components/feature/FeatureForm.jsx b/packages/unleash-frontend/public/js/components/feature/FeatureForm.jsx deleted file mode 100644 index 0b46c1fab5..0000000000 --- a/packages/unleash-frontend/public/js/components/feature/FeatureForm.jsx +++ /dev/null @@ -1,175 +0,0 @@ -'use strict'; - -const React = require('react'); -const TextInput = require('../form/TextInput'); - -const FeatureForm = React.createClass({ - getInitialState () { - return { - strategyOptions: this.props.strategies, - requiredParams: [], - currentStrategy: this.props.feature ? this.props.feature.strategy : 'default', - }; - }, - - componentWillMount () { - if (this.props.feature) { - this.setSelectedStrategy(this.props.feature.strategy); - } - }, - - onStrategyChange (e) { - this.setSelectedStrategy(e.target.value); - this.setState({ currentStrategy: e.target.value }); - }, - - getParameterValue (feature) { - if (this.props.feature && this.props.feature.parameters) { - return this.props.feature.parameters[feature]; - } - return ''; - }, - - setSelectedStrategy (strategyName) { - const selectedStrategy = this.props.strategies.filter(strategy => strategy.name === strategyName)[0]; - - if (selectedStrategy) { - this.setStrategyParams(selectedStrategy); - } else { - this.setState({ - currentStrategy: 'default', - requiredParams: [], - }); - } - }, - - setStrategyParams (strategy) { - const requiredParams = []; - let key; - for (key in strategy.parametersTemplate) { - if (Object.hasOwnProperty.call(strategy.parametersTemplate, key)) { - requiredParams.push({ name: key, value: this.getParameterValue(key) }); - } - } - this.setState({ requiredParams }); - }, - - render () { - const feature = this.props.feature || { - name: '', - strategy: 'default', - enabled: false, - }; - - const idPrefix = this.props.feature ? this.props.feature.name : 'new'; - - return ( -
    -
    - -
    - {this.props.feature ? '' : Create new toggle} - - - - - -
    - -
    - -
    -
    - -
    -
    -
      -
    • - - -
    • -
    -
    -
    - - {this.renderStrategyProperties()} - -
    - -
    - - -
    -
    -
    - ); - }, - - renderStrategyOptions () { - return this.props.strategies.map(strategy => ); - }, - - renderStrategyProperties () { - return this.state.requiredParams.map(param => ); - }, - - saveFeature (e) { - e.preventDefault(); - - const feature = { - name: this.refs.name.getValue(), - description: this.refs.description.getValue(), - strategy: this.state.currentStrategy, - enabled: this.refs.enabled.getDOMNode().checked, - parameters: this.getParameters(), - }; - - this.props.onSubmit(feature); - }, - - cancelFeature (e) { - e.preventDefault(); - this.props.onCancel(); - }, - - getParameters () { - const parameters = {}; - this.state.requiredParams.forEach(param => { - parameters[param.name] = this.refs[param.name].getValue(); - }); - return parameters; - }, -}); - -module.exports = FeatureForm; diff --git a/packages/unleash-frontend/public/js/components/feature/FeatureList.jsx b/packages/unleash-frontend/public/js/components/feature/FeatureList.jsx deleted file mode 100644 index 788e7cf46f..0000000000 --- a/packages/unleash-frontend/public/js/components/feature/FeatureList.jsx +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; - -const React = require('react'); -const Feature = require('./Feature'); - -const noop = function () {}; - -const FeatureList = React.createClass({ - propTypes: { - features: React.PropTypes.array.isRequired, - strategies: React.PropTypes.array.isRequired, - }, - - getDefaultProps () { - return { - onFeatureChanged: noop, - onFeatureArchive: noop, - }; - }, - - getInitialState () { - return { - filter: undefined, - }; - }, - - onFilterChange (e) { - e.preventDefault(); - this.setState({ filter: e.target.value.trim() }); - }, - - filteredFeatures () { - if (this.state.filter) { - const regex = new RegExp(this.state.filter, 'i'); - - return this.props.features.filter(item => regex.test(item.name) || regex.test(item.strategy)); - } - return this.props.features; - }, - - render () { - const featureNodes = this.filteredFeatures().map(feature => ); - - return ( -
    - - - - - - - - - - - - - {featureNodes} -
    - NameStrategy -
    - -
    -
    - ); - }, -}); - -module.exports = FeatureList; diff --git a/packages/unleash-frontend/public/js/components/feature/FeatureTogglesComponent.jsx b/packages/unleash-frontend/public/js/components/feature/FeatureTogglesComponent.jsx deleted file mode 100644 index 1aab7a4a96..0000000000 --- a/packages/unleash-frontend/public/js/components/feature/FeatureTogglesComponent.jsx +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -const React = require('react'); -const FeatureList = require('./FeatureList'); -const FeatureForm = require('./FeatureForm'); -const FeatureActions = require('../../stores/FeatureToggleActions'); -const ErrorActions = require('../../stores/ErrorActions'); - -const FeatureTogglesComponent = React.createClass({ - getInitialState () { - return { - createView: false, - }; - }, - - updateFeature (feature) { - FeatureActions.update.triggerPromise(feature); - }, - - archiveFeature (feature) { - FeatureActions.archive.triggerPromise(feature); - }, - - createFeature (feature) { - FeatureActions.create.triggerPromise(feature) - .then(this.cancelNewFeature); - }, - - newFeature () { - this.setState({ createView: true }); - }, - - cancelNewFeature () { - this.setState({ createView: false }); - ErrorActions.clear(); - }, - - render () { - return ( -
    - -

    Feature Toggles

    - - {this.state.createView ? this.renderCreateView() : this.renderCreateButton()} - - -
    - ); - }, - - renderCreateView () { - return (); - }, - - renderCreateButton () { - return ; - }, -}); - -module.exports = FeatureTogglesComponent; diff --git a/packages/unleash-frontend/public/js/components/form/TextInput.jsx b/packages/unleash-frontend/public/js/components/form/TextInput.jsx deleted file mode 100644 index 056cb15563..0000000000 --- a/packages/unleash-frontend/public/js/components/form/TextInput.jsx +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -const React = require('react'); - -const TextInput = React.createClass({ - propTypes: { - name: React.PropTypes.string.isRequired, - label: React.PropTypes.string.isRequired, - id: React.PropTypes.string.isRequired, - placeholder: React.PropTypes.string, - value: React.PropTypes.string, - required: React.PropTypes.bool, - }, - - getDefaultProps () { - return { - required: false, - }; - }, - - getInitialState () { - return {}; - }, - - getValue () { - return this.refs.input.getDOMNode().value.trim(); - }, - - - render () { - return ( -
    - -
    - -
    -
    - ); - }, -}); - -module.exports = TextInput; diff --git a/packages/unleash-frontend/public/js/components/log/LogEntriesComponent.jsx b/packages/unleash-frontend/public/js/components/log/LogEntriesComponent.jsx deleted file mode 100644 index 61ba0d764f..0000000000 --- a/packages/unleash-frontend/public/js/components/log/LogEntriesComponent.jsx +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -const React = require('react'); -const LogEntryList = require('./LogEntryList'); -const eventStore = require('../../stores/EventStore'); -const ErrorActions = require('../../stores/ErrorActions'); - -const LogEntriesComponent = React.createClass({ - getInitialState () { - return { - createView: false, - events: [], - }; - }, - - componentDidMount () { - eventStore.getEvents().then(res => { - this.setState({ events: res.events }); - }, this.initError); - }, - - initError () { - ErrorActions.error('Could not load events from server'); - }, - - render () { - return ( -
    -

    Log

    -
    - -
    - ); - }, -}); - -module.exports = LogEntriesComponent; diff --git a/packages/unleash-frontend/public/js/components/log/LogEntry.jsx b/packages/unleash-frontend/public/js/components/log/LogEntry.jsx deleted file mode 100644 index 39cdc91340..0000000000 --- a/packages/unleash-frontend/public/js/components/log/LogEntry.jsx +++ /dev/null @@ -1,88 +0,0 @@ -'use strict'; - -const React = require('react'); -const moment = require('moment'); - -const DIFF_PREFIXES = { - A: ' ', - E: ' ', - D: '-', - N: '+', -}; - -const SPADEN_CLASS = { - A: 'blue', // array edited - E: 'blue', // edited - D: 'negative', // deleted - N: 'positive', // added -}; - -const LogEntry = React.createClass({ - propTypes: { - event: React.PropTypes.object.isRequired, - }, - - render () { - const date = moment(this.props.event.createdAt); - - return ( - - - {date.format('ll')}
    - {date.format('HH:mm')} - - - {this.props.event.data.name}[{this.props.event.type}] - - - {this.renderEventDiff()} - - {this.props.event.createdBy} - - ); - }, - - renderFullEventData () { - const localEventData = JSON.parse(JSON.stringify(this.props.event.data)); - delete localEventData.description; - delete localEventData.name; - - const prettyPrinted = JSON.stringify(localEventData, null, 2); - - return ({prettyPrinted}); - }, - - renderEventDiff () { - if (!this.props.showFullEvents && this.props.event.diffs) { - const changes = this.props.event.diffs.map(this.buildDiff); - return ( - {changes.length === 0 ? '(no changes)' : changes} - ); - } - return this.renderFullEventData(); - }, - - buildDiff (diff, idx) { - let change; - const key = diff.path.join('.'); - - if (diff.lhs !== undefined && diff.rhs !== undefined) { - change = ( -
    -
    - {key}: {JSON.stringify(diff.lhs)}
    -
    + {key}: {JSON.stringify(diff.rhs)}
    -
    - ); - } else { - const spadenClass = SPADEN_CLASS[diff.kind]; - const prefix = DIFF_PREFIXES[diff.kind]; - - change = (
    {prefix} {key}: {JSON.stringify(diff.rhs)}
    ); - } - - return (
    {change}
    ); - }, - -}); - -module.exports = LogEntry; diff --git a/packages/unleash-frontend/public/js/components/log/LogEntryList.jsx b/packages/unleash-frontend/public/js/components/log/LogEntryList.jsx deleted file mode 100644 index 0c3d5cc0c5..0000000000 --- a/packages/unleash-frontend/public/js/components/log/LogEntryList.jsx +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -const React = require('react'); -const LogEntry = require('./LogEntry'); - -const LogEntryList = React.createClass({ - propTypes: { - events: React.PropTypes.array.isRequired, - }, - - getInitialState () { - return { - showFullEvents: false, - }; - }, - - render () { - const logEntryNodes = this.props.events.map(evt => - ); - - return ( -
    - - - - - - - - - - - - - {logEntryNodes} - -
    WhenAction - Data - Author
    -
    - ); - }, - - toggleFullEvents () { - this.setState({ showFullEvents: !this.state.showFullEvents }); - }, - -}); - -module.exports = LogEntryList; diff --git a/packages/unleash-frontend/public/js/components/strategy/StrategiesComponent.jsx b/packages/unleash-frontend/public/js/components/strategy/StrategiesComponent.jsx deleted file mode 100644 index 7e406b4a9f..0000000000 --- a/packages/unleash-frontend/public/js/components/strategy/StrategiesComponent.jsx +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -const React = require('react'); -const StrategyList = require('./StrategyList'); -const StrategyForm = require('./StrategyForm'); -const StrategyActions = require('../../stores/StrategyActions'); - -const StrategiesComponent = React.createClass({ - getInitialState () { - return { - createView: false, - }; - }, - - onNewStrategy () { - this.setState({ createView: true }); - }, - - onCancelNewStrategy () { - this.setState({ createView: false }); - }, - - onSave (strategy) { - StrategyActions.create.triggerPromise(strategy) - .then(this.onCancelNewStrategy); - }, - - onRemove (strategy) { - StrategyActions.remove.triggerPromise(strategy); - }, - - render () { - return ( -
    -

    Activation Strategies

    - {this.state.createView ? - this.renderCreateView() : this.renderCreateButton()} -
    - -
    - ); - }, - - renderCreateView () { - return ( - ); - }, - - renderCreateButton () { - return ( - - ); - }, -}); - -module.exports = StrategiesComponent; diff --git a/packages/unleash-frontend/public/js/components/strategy/Strategy.jsx b/packages/unleash-frontend/public/js/components/strategy/Strategy.jsx deleted file mode 100644 index a7c13d73e9..0000000000 --- a/packages/unleash-frontend/public/js/components/strategy/Strategy.jsx +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -const React = require('react'); - -const Strategy = React.createClass({ - propTypes: { - strategy: React.PropTypes.object.isRequired, - }, - - onRemove (evt) { - evt.preventDefault(); - if (window.confirm(`Are you sure you want to delete strategy '${this.props.strategy.name}'?`)) { // eslint-disable-line no-alert - this.props.onRemove(this.props.strategy); - } - }, - - render () { - return ( -
    -
    - {this.props.strategy.name} - (remove)
    - {this.props.strategy.description}
    -
    -
    - ); - }, -}); - -module.exports = Strategy; diff --git a/packages/unleash-frontend/public/js/components/strategy/StrategyForm.jsx b/packages/unleash-frontend/public/js/components/strategy/StrategyForm.jsx deleted file mode 100644 index 01c95a5794..0000000000 --- a/packages/unleash-frontend/public/js/components/strategy/StrategyForm.jsx +++ /dev/null @@ -1,140 +0,0 @@ -'use strict'; - -const React = require('react'); -const TextInput = require('../form/TextInput'); - -const StrategyForm = React.createClass({ - - getDefaultProps () { - return { - maxParams: 4, - }; - }, - - getInitialState () { - return { - parameters: [], - }; - }, - - onSubmit (evt) { - evt.preventDefault(); - - const strategy = {}; - strategy.name = this.refs.name.getValue(); - strategy.description = this.refs.description.getValue(); - strategy.parametersTemplate = {}; - - this.state.parameters.forEach(parameter => { - const value = this.refs[parameter.name].getDOMNode().value.trim(); - if (value) { - strategy.parametersTemplate[value] = 'string'; - } - }); - - this.props.onSave(strategy); - }, - - onCancel (evt) { - evt.preventDefault(); - - this.props.onCancelNewStrategy(); - }, - - onAddParam (evt) { - evt.preventDefault(); - const id = this.state.parameters.length + 1; - const params = this.state.parameters.concat([{ id, name: `param_${id}`, label: `Parameter ${id}` }]); - this.setState({ parameters: params }); - }, - - onRemoveParam (evt) { - evt.preventDefault(); - const params = this.state.parameters.slice(0, -1); - - this.setState({ parameters: params }); - }, - - render () { - return ( -
    -
    -
    -
    - Create strategy - - - - - - {this.renderParameters()} - {this.renderRemoveLink()} - -
    - - - {this.renderAddLink()} -
    -
    -
    -
    -
    - ); - }, - - renderParameters () { - return this.state.parameters.map(param =>
    - -
    -
    - -
    - -
    - -
    - -
    -
    -
    -
    ); - }, - - renderAddLink () { - if (this.state.parameters.length < this.props.maxParams) { - return + Add required parameter; - } - }, - renderRemoveLink () { - if (this.state.parameters.length > 0) { - return ( - - ); - } - }, -}); - -module.exports = StrategyForm; diff --git a/packages/unleash-frontend/public/js/components/strategy/StrategyList.jsx b/packages/unleash-frontend/public/js/components/strategy/StrategyList.jsx deleted file mode 100644 index 4a4f0d080c..0000000000 --- a/packages/unleash-frontend/public/js/components/strategy/StrategyList.jsx +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -const React = require('react'); -const Strategy = require('./Strategy'); - -const StrategyList = React.createClass({ - propTypes: { - strategies: React.PropTypes.array.isRequired, - }, - - render () { - const strategyNodes = this.props.strategies.map(strategy => - ); - return ( -
    {strategyNodes}
    - ); - }, -}); - -module.exports = StrategyList; diff --git a/packages/unleash-frontend/public/js/routes.jsx b/packages/unleash-frontend/public/js/routes.jsx deleted file mode 100644 index 7ec83a4e06..0000000000 --- a/packages/unleash-frontend/public/js/routes.jsx +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -const React = require('react'); -const Router = require('react-router'); -const UnleashApp = require('./UnleashApp'); -const LogEntriesComponent = require('./components/log/LogEntriesComponent'); -const FeatureTogglesComponent = require('./components/feature/FeatureTogglesComponent'); -const StrategiesComponent = require('./components/strategy/StrategiesComponent'); -const ArchiveFeatureComponent = require('./components/feature/ArchiveFeatureComponent'); -const DefaultRoute = Router.DefaultRoute; -const Route = Router.Route; - -const routes = ( - - - - - - -); - -module.exports = routes; diff --git a/packages/unleash-frontend/public/js/stores/ArchivedToggleStore.js b/packages/unleash-frontend/public/js/stores/ArchivedToggleStore.js deleted file mode 100644 index 17fd6e255b..0000000000 --- a/packages/unleash-frontend/public/js/stores/ArchivedToggleStore.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -const Reflux = require('reflux'); -const FeatureActions = require('./FeatureToggleActions'); -const filter = require('lodash/collection/filter'); -const sortBy = require('lodash/collection/sortBy'); - -let _archivedToggles = []; - -// Creates a DataStore -const FeatureStore = Reflux.createStore({ - - // Initial setup - init () { - this.listenTo(FeatureActions.initArchive.completed, this.onInit); - this.listenTo(FeatureActions.archive.completed, this.onArchive); - this.listenTo(FeatureActions.revive.completed, this.onRevive); - }, - - onInit (toggles) { - _archivedToggles = toggles; - this.trigger(); - }, - - onArchive (feature) { - const toggles = _archivedToggles.concat([feature]); - _archivedToggles = sortBy(toggles, 'name'); - this.trigger(); - }, - - onRevive (item) { - const newStore = filter(_archivedToggles, f => f.name !== item.name); - - _archivedToggles = sortBy(newStore, 'name'); - this.trigger(); - }, - - getArchivedToggles () { - return _archivedToggles; - }, - - initStore (archivedToggles) { - _archivedToggles = archivedToggles; - }, -}); - -module.exports = FeatureStore; diff --git a/packages/unleash-frontend/public/js/stores/ErrorActions.js b/packages/unleash-frontend/public/js/stores/ErrorActions.js deleted file mode 100644 index a8403d96a8..0000000000 --- a/packages/unleash-frontend/public/js/stores/ErrorActions.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -const Reflux = require('reflux'); - -const ErrorActions = Reflux.createActions([ - 'clear', - 'error', -]); - -module.exports = ErrorActions; diff --git a/packages/unleash-frontend/public/js/stores/ErrorStore.js b/packages/unleash-frontend/public/js/stores/ErrorStore.js deleted file mode 100644 index d785006ab3..0000000000 --- a/packages/unleash-frontend/public/js/stores/ErrorStore.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -const Reflux = require('reflux'); -const FeatureActions = require('./FeatureToggleActions'); -const ErrorActions = require('./ErrorActions'); - -// Creates a DataStore -const FeatureStore = Reflux.createStore({ - // Initial setup - init () { - this.listenTo(FeatureActions.create.failed, this.onError); - this.listenTo(FeatureActions.init.failed, this.onError); - this.listenTo(FeatureActions.update.failed, this.onError); - this.listenTo(FeatureActions.archive.failed, this.onError); - this.listenTo(FeatureActions.revive.failed, this.onError); - this.listenTo(ErrorActions.error, this.onError); - this.listenTo(ErrorActions.clear, this.onClear); - this.errors = []; - }, - - onError (error) { - if (this.isClientError(error)) { - const errors = JSON.parse(error.responseText); - errors.forEach(e => { - this.addError(e.msg); - }); - } else if (error.status === 0) { - this.addError('server unreachable'); - } else { - this.addError(error); - } - }, - - onClear () { - this.errors = []; - this.trigger([]); - }, - - addError (msg) { - const errors = this.errors; - if (errors[errors.length - 1] !== msg) { - errors.push(msg); - this.errors = errors; - this.trigger(errors); - } - }, - - isClientError (error) { - try { - return error.status >= 400 && - error.status < 500 && - JSON.parse(error.responseText); - } catch (e) { - if (e instanceof SyntaxError) { - // fall through; - console.log('Syntax error!'); // eslint-disable-line no-console - } else { - throw e; - } - } - - return false; - }, - - getErrors () { - return this.errors; - }, -}); - -module.exports = FeatureStore; diff --git a/packages/unleash-frontend/public/js/stores/EventStore.js b/packages/unleash-frontend/public/js/stores/EventStore.js deleted file mode 100644 index 7b4c390d36..0000000000 --- a/packages/unleash-frontend/public/js/stores/EventStore.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -const reqwest = require('reqwest'); - -const TYPE = 'json'; - -const EventStore = { - getEvents () { - return reqwest({ - url: 'events', - method: 'get', - type: TYPE, - }); - }, - - getEventsByName (eventName) { - return reqwest({ - url: `events/${eventName}`, - method: 'get', - type: TYPE, - }); - }, - -}; - -module.exports = EventStore; diff --git a/packages/unleash-frontend/public/js/stores/FeatureToggleActions.js b/packages/unleash-frontend/public/js/stores/FeatureToggleActions.js deleted file mode 100644 index c6c58bfb9f..0000000000 --- a/packages/unleash-frontend/public/js/stores/FeatureToggleActions.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; - -const Reflux = require('reflux'); -const Server = require('./FeatureToggleServerFacade'); - -const FeatureToggleActions = Reflux.createActions({ - init: { asyncResult: true }, - initArchive: { asyncResult: true }, - create: { asyncResult: true }, - update: { asyncResult: true }, - archive: { asyncResult: true }, - revive: { asyncResult: true }, -}); - -FeatureToggleActions.init.listen(function () { - Server.getFeatures((error, features) => { - if (error) { - this.failed(error); - } else { - this.completed(features); - } - }); -}); - -FeatureToggleActions.initArchive.listen(function () { - Server.getArchivedFeatures((error, archivedToggles) => { - if (error) { - this.failed(error); - } else { - this.completed(archivedToggles); - } - }); -}); - -FeatureToggleActions.create.listen(function (feature) { - Server.createFeature(feature, error => { - if (error) { - this.failed(error); - } else { - this.completed(feature); - } - }); -}); - -FeatureToggleActions.update.listen(function (feature) { - Server.updateFeature(feature, error => { - if (error) { - this.failed(error); - } else { - this.completed(feature); - } - }); -}); - -FeatureToggleActions.archive.listen(function (feature) { - Server.archiveFeature(feature, error => { - if (error) { - this.failed(error); - } else { - this.completed(feature); - } - }); -}); - -FeatureToggleActions.revive.listen(function (feature) { - Server.reviveFeature(feature, error => { - if (error) { - this.failed(error); - } else { - this.completed(feature); - } - }); -}); - -module.exports = FeatureToggleActions; diff --git a/packages/unleash-frontend/public/js/stores/FeatureToggleServerFacade.js b/packages/unleash-frontend/public/js/stores/FeatureToggleServerFacade.js deleted file mode 100644 index 4f0f250b3b..0000000000 --- a/packages/unleash-frontend/public/js/stores/FeatureToggleServerFacade.js +++ /dev/null @@ -1,100 +0,0 @@ -'use strict'; - -const reqwest = require('reqwest'); - -const TYPE = 'json'; -const CONTENT_TYPE = 'application/json'; - -const FeatureToggleServerFacade = { - updateFeature (feature, cb) { - reqwest({ - url: `features/${feature.name}`, - method: 'put', - type: TYPE, - contentType: CONTENT_TYPE, - data: JSON.stringify(feature), - error (error) { - cb(error); - }, - success () { - cb(); - }, - }); - }, - - createFeature (feature, cb) { - reqwest({ - url: 'features', - method: 'post', - type: TYPE, - contentType: CONTENT_TYPE, - data: JSON.stringify(feature), - error (error) { - cb(error); - }, - success () { - cb(); - }, - }); - }, - - archiveFeature (feature, cb) { - reqwest({ - url: `features/${feature.name}`, - method: 'delete', - type: TYPE, - error (error) { - cb(error); - }, - success () { - cb(); - }, - }); - }, - - getFeatures (cb) { - reqwest({ - url: 'features', - method: 'get', - type: TYPE, - error (error) { - cb(error); - }, - success (data) { - cb(null, data.features); - }, - }); - }, - - getArchivedFeatures (cb) { - reqwest({ - url: 'archive/features', - method: 'get', - type: TYPE, - error (error) { - cb(error); - }, - success (data) { - cb(null, data.features); - }, - }); - }, - - reviveFeature (feature, cb) { - reqwest({ - url: 'archive/revive', - method: 'post', - type: TYPE, - contentType: CONTENT_TYPE, - data: JSON.stringify(feature), - error (error) { - cb(error); - }, - success () { - cb(); - }, - }); - }, -}; - -module.exports = FeatureToggleServerFacade; diff --git a/packages/unleash-frontend/public/js/stores/FeatureToggleStore.js b/packages/unleash-frontend/public/js/stores/FeatureToggleStore.js deleted file mode 100644 index 3c0eb5a0ca..0000000000 --- a/packages/unleash-frontend/public/js/stores/FeatureToggleStore.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -const Reflux = require('reflux'); -const FeatureActions = require('./FeatureToggleActions'); -const filter = require('lodash/collection/filter'); -const sortBy = require('lodash/collection/sortBy'); -const findIndex = require('lodash/array/findIndex'); - -let _featureToggles = []; - -const FeatureStore = Reflux.createStore({ - - // Initial setup - init () { - this.listenTo(FeatureActions.init.completed, this.setToggles); - this.listenTo(FeatureActions.create.completed, this.onCreate); - this.listenTo(FeatureActions.update.completed, this.onUpdate); - this.listenTo(FeatureActions.archive.completed, this.onArchive); - this.listenTo(FeatureActions.revive.completed, this.onRevive); - }, - - onCreate (feature) { - this.setToggles([feature].concat(_featureToggles)); - }, - - setToggles (toggles) { - _featureToggles = sortBy(toggles, 'name'); - this.trigger(); - }, - - onUpdate (feature) { - const idx = findIndex(_featureToggles, 'name', feature.name); - _featureToggles[idx] = feature; - this.trigger(); - }, - - onArchive (feature) { - const featureToggles = filter(_featureToggles, item => item.name !== feature.name); - this.setToggles(featureToggles); - this.trigger(); - }, - - onRevive (item) { - this.setToggles(_featureToggles.concat([item])); - this.trigger(); - }, - - getFeatureToggles () { - return _featureToggles; - }, - - initStore (toggles) { - _featureToggles = toggles; - }, -}); - -module.exports = FeatureStore; diff --git a/packages/unleash-frontend/public/js/stores/StrategyAPI.js b/packages/unleash-frontend/public/js/stores/StrategyAPI.js deleted file mode 100644 index 5e1e8f3a22..0000000000 --- a/packages/unleash-frontend/public/js/stores/StrategyAPI.js +++ /dev/null @@ -1,54 +0,0 @@ -'use strict'; - -const reqwest = require('reqwest'); - -const TYPE = 'json'; -const CONTENT_TYPE = 'application/json'; - -const StrategyAPI = { - createStrategy (strategy, cb) { - reqwest({ - url: 'strategies', - method: 'post', - type: TYPE, - contentType: CONTENT_TYPE, - data: JSON.stringify(strategy), - error (error) { - cb(error); - }, - success () { - cb(null, strategy); - }, - }); - }, - - removeStrategy (strategy, cb) { - reqwest({ - url: `strategies/${strategy.name}`, - method: 'delete', - type: TYPE, - error (error) { - cb(error); - }, - success () { - cb(null, strategy); - }, - }); - }, - - getStrategies (cb) { - reqwest({ - url: 'strategies', - method: 'get', - type: TYPE, - error (error) { - cb(error); - }, - success (data) { - cb(null, data.strategies); - }, - }); - }, -}; - -module.exports = StrategyAPI; diff --git a/packages/unleash-frontend/public/js/stores/StrategyActions.js b/packages/unleash-frontend/public/js/stores/StrategyActions.js deleted file mode 100644 index 50c4befaf7..0000000000 --- a/packages/unleash-frontend/public/js/stores/StrategyActions.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -const Reflux = require('reflux'); -const StrategyAPI = require('./StrategyAPI'); - -const StrategyActions = Reflux.createActions({ - init: { asyncResult: true }, - create: { asyncResult: true }, - remove: { asyncResult: true }, -}); - -StrategyActions.init.listen(function () { - StrategyAPI.getStrategies((err, strategies) => { - if (err) { - this.failed(err); - } else { - this.completed(strategies); - } - }); -}); - -StrategyActions.create.listen(function (feature) { - StrategyAPI.createStrategy(feature, err => { - if (err) { - this.failed(err); - } else { - this.completed(feature); - } - }); -}); - -StrategyActions.remove.listen(function (feature) { - StrategyAPI.removeStrategy(feature, err => { - if (err) { - this.failed(err); - } else { - this.completed(feature); - } - }); -}); - -module.exports = StrategyActions; diff --git a/packages/unleash-frontend/public/js/stores/StrategyStore.js b/packages/unleash-frontend/public/js/stores/StrategyStore.js deleted file mode 100644 index 02546becc2..0000000000 --- a/packages/unleash-frontend/public/js/stores/StrategyStore.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -const Reflux = require('reflux'); -const StrategyActions = require('./StrategyActions'); -const filter = require('lodash/collection/filter'); - -let _strategies = []; - -// Creates a DataStore -const StrategyStore = Reflux.createStore({ - - // Initial setup - init () { - this.listenTo(StrategyActions.init.completed, this.setStrategies); - this.listenTo(StrategyActions.create.completed, this.onCreate); - this.listenTo(StrategyActions.remove.completed, this.onRemove); - }, - - onCreate (strategy) { - this.setStrategies(_strategies.concat([strategy])); - }, - - onRemove (strategy) { - const strategies = filter(_strategies, item => item.name !== strategy.name); - this.setStrategies(strategies); - }, - - setStrategies (strategies) { - _strategies = strategies; - this.trigger(_strategies); - }, - - getStrategies () { - return _strategies; - }, - - initStore (strategies) { - _strategies = strategies; - }, -}); - -module.exports = StrategyStore; diff --git a/packages/unleash-frontend/public/js/stores/UserStore.js b/packages/unleash-frontend/public/js/stores/UserStore.js deleted file mode 100644 index 43fc016507..0000000000 --- a/packages/unleash-frontend/public/js/stores/UserStore.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict'; - -let _username; - -// Ref: http://stackoverflow.com/questions/10730362/get-cookie-by-name -function readCookie (cookieName) { - const nameEQ = `${cookieName}=`; - const ca = document.cookie.split(';'); - for (let i = 0;i < ca.length;i++) { - let c = ca[i]; - while (c.charAt(0) == ' ') { // eslint-disable-line eqeqeq - c = c.substring(1, c.length); - } - if (c.indexOf(nameEQ) === 0) { - return c.substring(nameEQ.length, c.length); - } - } - return null; -} - -const UserStore = { - init () { - _username = readCookie('username'); - }, - - set (username) { - _username = username; - document.cookie = `username=${_username}; expires=Thu, 18 Dec 2099 12:00:00 UTC`; - }, - - get () { - return _username; - }, -}; - -module.exports = UserStore; diff --git a/packages/unleash-frontend/public/js/stores/initalizer.js b/packages/unleash-frontend/public/js/stores/initalizer.js deleted file mode 100644 index e1fdaaaca1..0000000000 --- a/packages/unleash-frontend/public/js/stores/initalizer.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -const FeatureToggleActions = require('./FeatureToggleActions'); -const StrategyActions = require('./StrategyActions'); -const Timer = require('../utils/Timer'); - -let _timer; - -function load () { - FeatureToggleActions.init.triggerPromise(); - StrategyActions.init.triggerPromise(); - FeatureToggleActions.initArchive.triggerPromise(); -} - -module.exports = function (pollInterval) { - const intervall = pollInterval || 30; - _timer = new Timer(load, intervall * 1000); - _timer.start(); -}; diff --git a/packages/unleash-frontend/public/js/utils/Timer.js b/packages/unleash-frontend/public/js/utils/Timer.js deleted file mode 100644 index fb97baa085..0000000000 --- a/packages/unleash-frontend/public/js/utils/Timer.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -const Timer = function (cb, interval) { - this.cb = cb; - this.interval = interval; - this.timerId = null; -}; - -Timer.prototype.start = function () { - if (this.timerId != null) { - console.warn('timer already started'); // eslint-disable-line no-console - } - - console.log('starting timer'); // eslint-disable-line no-console - this.timerId = setInterval(this.cb, this.interval); - this.cb(); -}; - -Timer.prototype.stop = function () { - if (this.timerId == null) { - console.warn('no timer running'); // eslint-disable-line no-console - } else { - console.log('stopping timer'); // eslint-disable-line no-console - clearInterval(this.timerId); - this.timerId = null; - } -}; - -module.exports = Timer; diff --git a/packages/unleash-frontend/public/unleash.css b/packages/unleash-frontend/public/unleash.css deleted file mode 100644 index 87e3bc926e..0000000000 --- a/packages/unleash-frontend/public/unleash.css +++ /dev/null @@ -1,37 +0,0 @@ -.toggle-active { - border: 1px solid black; - display: inline-block; - background-color: lawngreen; - border-radius: 50%; - width: 20px; - height: 20px; -} -.toggle-inactive { - border: 1px solid black; - display: inline-block; - background-color: red; - border-radius: 50%; - width: 20px; - height: 20px; -} - -.no-border { - border: none; -} - -code { - word-wrap: break-word; - white-space: pre; -} - -code > .diff-N { - color: green; -} - -code > .diff-D { - color: red; -} - -code > .diff-A, .diff-E { - color: black; -} \ No newline at end of file diff --git a/packages/unleash-frontend/webpack.config.js b/packages/unleash-frontend/webpack.config.js deleted file mode 100644 index be0254ede8..0000000000 --- a/packages/unleash-frontend/webpack.config.js +++ /dev/null @@ -1,41 +0,0 @@ -// docs: http://webpack.github.io/docs/configuration.html -'use strict'; - -const path = require('path'); -const publicRoot = path.join(__dirname, 'public'); -const jsroot = path.join(publicRoot, 'js'); - -module.exports = { - - context: jsroot, - entry: './app.jsx', - - output: { - path: publicRoot, - filename: 'bundle.js', - publicPath: '/js/', - }, - - resolve: { - root: [jsroot], - extensions: ['', '.js', '.jsx'], - modulesDirectories: ['web_modules', 'node_modules'], - }, - - module: { - loaders: [ - { - test: /\.jsx?$/, - exclude: /node_modules/, - loader: 'babel', - }, - ], - }, - - devtool: 'source-map', - - externals: { - // stuff not in node_modules can be resolved here. - }, - -};