mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	Fix eslint complaining
This commit is contained in:
		
							parent
							
								
									5338b429e5
								
							
						
					
					
						commit
						ad3df75348
					
				@ -9,7 +9,7 @@ const logger = require('./lib/logger');
 | 
			
		||||
const routes = require('./lib/routes');
 | 
			
		||||
const path = require('path');
 | 
			
		||||
 | 
			
		||||
module.exports = function(config) {
 | 
			
		||||
module.exports = function (config) {
 | 
			
		||||
    const app = express();
 | 
			
		||||
    const router = express.Router(); // eslint-disable-line new-cap
 | 
			
		||||
    const baseUriPath  = config.baseUriPath || '';
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
const knex   = require('knex');
 | 
			
		||||
 | 
			
		||||
module.exports = function(databaseConnection) {
 | 
			
		||||
module.exports = function (databaseConnection) {
 | 
			
		||||
    return knex({
 | 
			
		||||
        client: 'pg',
 | 
			
		||||
        connection: databaseConnection,
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
const EVENT_COLUMNS = ['id', 'type', 'created_by', 'created_at', 'data'];
 | 
			
		||||
 | 
			
		||||
module.exports = function(db) {
 | 
			
		||||
    function storeEvent(event) {
 | 
			
		||||
module.exports = function (db) {
 | 
			
		||||
    function storeEvent (event) {
 | 
			
		||||
        return db('events').insert({
 | 
			
		||||
            type: event.type,
 | 
			
		||||
            created_by: event.createdBy, // eslint-disable-line
 | 
			
		||||
@ -10,7 +10,7 @@ module.exports = function(db) {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getEvents() {
 | 
			
		||||
    function getEvents () {
 | 
			
		||||
        return db
 | 
			
		||||
            .select(EVENT_COLUMNS)
 | 
			
		||||
            .from('events')
 | 
			
		||||
@ -18,7 +18,7 @@ module.exports = function(db) {
 | 
			
		||||
            .map(rowToEvent);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getEventsFilterByName(name) {
 | 
			
		||||
    function getEventsFilterByName (name) {
 | 
			
		||||
        return db
 | 
			
		||||
        .select(EVENT_COLUMNS)
 | 
			
		||||
        .from('events')
 | 
			
		||||
@ -27,7 +27,7 @@ module.exports = function(db) {
 | 
			
		||||
        .map(rowToEvent);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function rowToEvent(row) {
 | 
			
		||||
    function rowToEvent (row) {
 | 
			
		||||
        return {
 | 
			
		||||
            id: row.id,
 | 
			
		||||
            type: row.type,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ const logger = require('../logger');
 | 
			
		||||
const NotFoundError = require('../error/NotFoundError');
 | 
			
		||||
const FEATURE_COLUMNS = ['name', 'description', 'enabled', 'strategy_name', 'parameters'];
 | 
			
		||||
 | 
			
		||||
module.exports = function(db, eventStore) {
 | 
			
		||||
module.exports = function (db, eventStore) {
 | 
			
		||||
    eventStore.on(eventType.featureCreated, event => createFeature(event.data));
 | 
			
		||||
 | 
			
		||||
    eventStore.on(eventType.featureUpdated, event => updateFeature(event.data));
 | 
			
		||||
@ -13,7 +13,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
 | 
			
		||||
    eventStore.on(eventType.featureRevived, event => reviveFeature(event.data));
 | 
			
		||||
 | 
			
		||||
    function getFeatures() {
 | 
			
		||||
    function getFeatures () {
 | 
			
		||||
        return db
 | 
			
		||||
            .select(FEATURE_COLUMNS)
 | 
			
		||||
            .from('features')
 | 
			
		||||
@ -22,7 +22,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
            .map(rowToFeature);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getFeature(name) {
 | 
			
		||||
    function getFeature (name) {
 | 
			
		||||
        return db
 | 
			
		||||
            .first(FEATURE_COLUMNS)
 | 
			
		||||
            .from('features')
 | 
			
		||||
@ -30,7 +30,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
            .then(rowToFeature);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getArchivedFeatures() {
 | 
			
		||||
    function getArchivedFeatures () {
 | 
			
		||||
        return db
 | 
			
		||||
            .select(FEATURE_COLUMNS)
 | 
			
		||||
            .from('features')
 | 
			
		||||
@ -40,7 +40,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    function rowToFeature(row) {
 | 
			
		||||
    function rowToFeature (row) {
 | 
			
		||||
        if (!row) {
 | 
			
		||||
            throw new NotFoundError('No feature toggle found');
 | 
			
		||||
        }
 | 
			
		||||
@ -54,18 +54,18 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function eventDataToRow(data) {
 | 
			
		||||
    function eventDataToRow (data) {
 | 
			
		||||
        return {
 | 
			
		||||
            name: data.name,
 | 
			
		||||
            description: data.description,
 | 
			
		||||
            enabled: data.enabled ? 1 : 0,
 | 
			
		||||
            archived: data.archived ? 1 :0,
 | 
			
		||||
            archived: data.archived ? 1 : 0,
 | 
			
		||||
            strategy_name: data.strategy, // eslint-disable-line
 | 
			
		||||
            parameters: data.parameters,
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function createFeature(data) {
 | 
			
		||||
    function createFeature (data) {
 | 
			
		||||
        return db('features')
 | 
			
		||||
            .insert(eventDataToRow(data))
 | 
			
		||||
            .catch(err => {
 | 
			
		||||
@ -73,7 +73,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function updateFeature(data) {
 | 
			
		||||
    function updateFeature (data) {
 | 
			
		||||
        return db('features')
 | 
			
		||||
            .where({ name: data.name })
 | 
			
		||||
            .update(eventDataToRow(data))
 | 
			
		||||
@ -82,7 +82,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function archiveFeature(data) {
 | 
			
		||||
    function archiveFeature (data) {
 | 
			
		||||
        return db('features')
 | 
			
		||||
            .where({ name: data.name })
 | 
			
		||||
            .update({ archived: 1 })
 | 
			
		||||
@ -91,7 +91,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function reviveFeature(data) {
 | 
			
		||||
    function reviveFeature (data) {
 | 
			
		||||
        return db('features')
 | 
			
		||||
            .where({ name: data.name })
 | 
			
		||||
            .update({ archived: 0, enabled: 0 })
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ const logger = require('../logger');
 | 
			
		||||
const NotFoundError = require('../error/NotFoundError');
 | 
			
		||||
const STRATEGY_COLUMNS = ['name', 'description', 'parameters_template'];
 | 
			
		||||
 | 
			
		||||
module.exports = function(db, eventStore) {
 | 
			
		||||
module.exports = function (db, eventStore) {
 | 
			
		||||
    eventStore.on(eventType.strategyCreated, event => createStrategy(event.data));
 | 
			
		||||
 | 
			
		||||
    eventStore.on(eventType.strategyDeleted, event => {
 | 
			
		||||
@ -16,7 +16,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
            });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function getStrategies() {
 | 
			
		||||
    function getStrategies () {
 | 
			
		||||
        return db
 | 
			
		||||
            .select(STRATEGY_COLUMNS)
 | 
			
		||||
            .from('strategies')
 | 
			
		||||
@ -24,7 +24,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
            .map(rowToStrategy);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getStrategy(name) {
 | 
			
		||||
    function getStrategy (name) {
 | 
			
		||||
        return db
 | 
			
		||||
            .first(STRATEGY_COLUMNS)
 | 
			
		||||
            .from('strategies')
 | 
			
		||||
@ -32,7 +32,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
            .then(rowToStrategy);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function rowToStrategy(row) {
 | 
			
		||||
    function rowToStrategy (row) {
 | 
			
		||||
        if (!row) {
 | 
			
		||||
            throw new NotFoundError('No strategy found');
 | 
			
		||||
        }
 | 
			
		||||
@ -44,7 +44,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function eventDataToRow(data) {
 | 
			
		||||
    function eventDataToRow (data) {
 | 
			
		||||
        return {
 | 
			
		||||
            name: data.name,
 | 
			
		||||
            description: data.description,
 | 
			
		||||
@ -52,7 +52,7 @@ module.exports = function(db, eventStore) {
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function createStrategy(data) {
 | 
			
		||||
    function createStrategy (data) {
 | 
			
		||||
        db('strategies')
 | 
			
		||||
            .insert(eventDataToRow(data))
 | 
			
		||||
            .catch(err => {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
const util = require('util');
 | 
			
		||||
 | 
			
		||||
function NameExistsError(message) {
 | 
			
		||||
function NameExistsError (message) {
 | 
			
		||||
    Error.call(this);
 | 
			
		||||
    Error.captureStackTrace(this, this.constructor);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
const util = require('util');
 | 
			
		||||
 | 
			
		||||
function NotFoundError(message) {
 | 
			
		||||
function NotFoundError (message) {
 | 
			
		||||
    Error.call(this);
 | 
			
		||||
    Error.captureStackTrace(this, this.constructor);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
const util = require('util');
 | 
			
		||||
 | 
			
		||||
function ValidationError(message) {
 | 
			
		||||
function ValidationError (message) {
 | 
			
		||||
    Error.call(this);
 | 
			
		||||
    Error.captureStackTrace(this, this.constructor);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
const Promise = require('bluebird');
 | 
			
		||||
const ValidationError = require('./ValidationError');
 | 
			
		||||
 | 
			
		||||
function validateRequest(req) {
 | 
			
		||||
function validateRequest (req) {
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        if (req.validationErrors()) {
 | 
			
		||||
            reject(new ValidationError('Invalid syntax'));
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ const featureTypes  = [
 | 
			
		||||
    eventType.featureRevived,
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
function baseTypeFor(event) {
 | 
			
		||||
function baseTypeFor (event) {
 | 
			
		||||
    if (featureTypes.indexOf(event.type) !== -1) {
 | 
			
		||||
        return 'features';
 | 
			
		||||
    } else if (strategyTypes.indexOf(event.type) !== -1) {
 | 
			
		||||
@ -23,7 +23,7 @@ function baseTypeFor(event) {
 | 
			
		||||
    throw new Error(`unknown event type: ${JSON.stringify(event)}`);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function groupByBaseTypeAndName(events) {
 | 
			
		||||
function groupByBaseTypeAndName (events) {
 | 
			
		||||
    const groups = {};
 | 
			
		||||
 | 
			
		||||
    events.forEach(event => {
 | 
			
		||||
@ -38,7 +38,7 @@ function groupByBaseTypeAndName(events) {
 | 
			
		||||
    return groups;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function eachConsecutiveEvent(events, callback) {
 | 
			
		||||
function eachConsecutiveEvent (events, callback) {
 | 
			
		||||
    const groups = groupByBaseTypeAndName(events);
 | 
			
		||||
 | 
			
		||||
    Object.keys(groups).forEach(baseType => {
 | 
			
		||||
@ -60,7 +60,7 @@ function eachConsecutiveEvent(events, callback) {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function addDiffs(events) {
 | 
			
		||||
function addDiffs (events) {
 | 
			
		||||
    eachConsecutiveEvent(events, (left, right) => {
 | 
			
		||||
        if (right) {
 | 
			
		||||
            left.diffs = diff(right.data, left.data);
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
const util = require('util');
 | 
			
		||||
const EventEmitter = require('events').EventEmitter;
 | 
			
		||||
 | 
			
		||||
function EventStore(eventDb) {
 | 
			
		||||
function EventStore (eventDb) {
 | 
			
		||||
    this.eventDb = eventDb;
 | 
			
		||||
    EventEmitter.call(this);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
function extractUsername(req) {
 | 
			
		||||
function extractUsername (req) {
 | 
			
		||||
    return req.cookies.username || 'unknown';
 | 
			
		||||
}
 | 
			
		||||
module.exports = extractUsername;
 | 
			
		||||
 | 
			
		||||
@ -22,11 +22,9 @@ module.exports = function (app, config) {
 | 
			
		||||
                type: eventType.featureRevived,
 | 
			
		||||
                createdBy: req.connection.remoteAddress,
 | 
			
		||||
                data: req.body,
 | 
			
		||||
            })).then(() => {
 | 
			
		||||
                res.status(200).end();
 | 
			
		||||
            }).catch(ValidationError, () => {
 | 
			
		||||
                res.status(400).json(req.validationErrors());
 | 
			
		||||
            })
 | 
			
		||||
            }))
 | 
			
		||||
            .then(() => res.status(200).end())
 | 
			
		||||
            .catch(ValidationError, () => res.status(400).json(req.validationErrors()))
 | 
			
		||||
            .catch(err => {
 | 
			
		||||
                logger.error('Could not revive feature toggle', err);
 | 
			
		||||
                res.status(500).end();
 | 
			
		||||
 | 
			
		||||
@ -45,7 +45,8 @@ module.exports = function (app, config) {
 | 
			
		||||
            .catch(NameExistsError, () => {
 | 
			
		||||
                res.status(403).json([{
 | 
			
		||||
                    msg: `A feature named '${req.body.name}' already exists. It could be archived.`,
 | 
			
		||||
                }]).end();
 | 
			
		||||
                }])
 | 
			
		||||
                .end();
 | 
			
		||||
            })
 | 
			
		||||
            .catch(ValidationError, () => {
 | 
			
		||||
                res.status(400).json(req.validationErrors());
 | 
			
		||||
@ -105,7 +106,7 @@ module.exports = function (app, config) {
 | 
			
		||||
            });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function validateUniqueName(req) {
 | 
			
		||||
    function validateUniqueName (req) {
 | 
			
		||||
        return new Promise((resolve, reject) => {
 | 
			
		||||
            featureDb.getFeature(req.body.name)
 | 
			
		||||
                .then(() => {
 | 
			
		||||
 | 
			
		||||
@ -64,22 +64,20 @@ module.exports = function (app, config) {
 | 
			
		||||
                createdBy: extractUser(req),
 | 
			
		||||
                data: newStrategy,
 | 
			
		||||
            }))
 | 
			
		||||
            .then(() => {
 | 
			
		||||
                res.status(201).end();
 | 
			
		||||
            })
 | 
			
		||||
            .then(() => res.status(201).end())
 | 
			
		||||
            .catch(NameExistsError, () => {
 | 
			
		||||
                res.status(403).json([{ msg: `A strategy named '${req.body.name}' already exists.` }]).end();
 | 
			
		||||
            })
 | 
			
		||||
            .catch(ValidationError, () => {
 | 
			
		||||
                res.status(400).json(req.validationErrors());
 | 
			
		||||
                res.status(403)
 | 
			
		||||
                    .json([{ msg: `A strategy named '${req.body.name}' already exists.` }])
 | 
			
		||||
                    .end();
 | 
			
		||||
            })
 | 
			
		||||
            .catch(ValidationError, () => res.status(400).json(req.validationErrors()))
 | 
			
		||||
            .catch(err => {
 | 
			
		||||
                logger.error('Could not create strategy', err);
 | 
			
		||||
                res.status(500).end();
 | 
			
		||||
            });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function validateStrategyName(req) {
 | 
			
		||||
    function validateStrategyName (req) {
 | 
			
		||||
        return new Promise((resolve, reject) => {
 | 
			
		||||
            strategyDb.getStrategy(req.body.name)
 | 
			
		||||
                .then(() => {
 | 
			
		||||
 | 
			
		||||
@ -3,12 +3,12 @@ const fs   = require('fs');
 | 
			
		||||
const util = require('util');
 | 
			
		||||
const path = require('path');
 | 
			
		||||
 | 
			
		||||
const runMigration = function(migrationPath, db, callback) {
 | 
			
		||||
const runMigration = function (migrationPath, db, callback) {
 | 
			
		||||
    db.runSql(fs.readFileSync(migrationPath, { encoding: 'utf8' }), callback);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    create(name) {
 | 
			
		||||
    create (name) {
 | 
			
		||||
        const format = path.resolve(__dirname, '../migrations/sql/%s.%s.sql');
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
const logger = require('./lib/logger');
 | 
			
		||||
const defaultDatabaseUri = process.env.DATABASE_URL;
 | 
			
		||||
 | 
			
		||||
function start(options) {
 | 
			
		||||
function start (options) {
 | 
			
		||||
    options = options || {};
 | 
			
		||||
 | 
			
		||||
    const db = require('./lib/db/dbPool')(options.databaseUri || defaultDatabaseUri);
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,12 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
function getDatabaseUri() {
 | 
			
		||||
function getDatabaseUri () {
 | 
			
		||||
    if (!process.env.TEST_DATABASE_URL) {
 | 
			
		||||
        throw new Error('please set TEST_DATABASE_URL');
 | 
			
		||||
    } else {
 | 
			
		||||
        return process.env.TEST_DATABASE_URL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return process.env.TEST_DATABASE_URL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    getDatabaseUri,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,7 @@ const app = require('../app')({
 | 
			
		||||
Promise.promisifyAll(request);
 | 
			
		||||
request = request(app);
 | 
			
		||||
 | 
			
		||||
function createStrategies() {
 | 
			
		||||
function createStrategies () {
 | 
			
		||||
    return Promise.map([
 | 
			
		||||
        {
 | 
			
		||||
            name: 'default',
 | 
			
		||||
@ -40,7 +40,7 @@ function createStrategies() {
 | 
			
		||||
    ], strategy => strategyDb._createStrategy(strategy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function createFeatures() {
 | 
			
		||||
function createFeatures () {
 | 
			
		||||
    return Promise.map([
 | 
			
		||||
        {
 | 
			
		||||
            name: 'featureX',
 | 
			
		||||
@ -96,19 +96,19 @@ function createFeatures() {
 | 
			
		||||
    ], feature => featureDb._createFeature(feature));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function destroyStrategies() {
 | 
			
		||||
function destroyStrategies () {
 | 
			
		||||
    return knex('strategies').del();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function destroyFeatures() {
 | 
			
		||||
function destroyFeatures () {
 | 
			
		||||
    return knex('features').del();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function resetDatabase() {
 | 
			
		||||
function resetDatabase () {
 | 
			
		||||
    return Promise.all([destroyStrategies(), destroyFeatures()]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function setupDatabase() {
 | 
			
		||||
function setupDatabase () {
 | 
			
		||||
    return Promise.all([createStrategies(), createFeatures()]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -117,7 +117,7 @@ module.exports = {
 | 
			
		||||
    db: {
 | 
			
		||||
        reset: resetDatabase,
 | 
			
		||||
        setup: setupDatabase,
 | 
			
		||||
        resetAndSetup() {
 | 
			
		||||
        resetAndSetup () {
 | 
			
		||||
            return resetDatabase().then(setupDatabase);
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
 | 
			
		||||
const ReactTools = require('react-tools');
 | 
			
		||||
module.exports = {
 | 
			
		||||
    process(src) {
 | 
			
		||||
    process (src) {
 | 
			
		||||
        return ReactTools.transform(src);
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ const UnleashApp = React.createClass({
 | 
			
		||||
        router: React.PropTypes.func,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            features: FeatureToggleStore.getFeatureToggles(),
 | 
			
		||||
            strategies: StrategyStore.getStrategies(),
 | 
			
		||||
@ -23,40 +23,40 @@ const UnleashApp = React.createClass({
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onFeatureToggleChange() {
 | 
			
		||||
    onFeatureToggleChange () {
 | 
			
		||||
        this.setState({
 | 
			
		||||
            features: FeatureToggleStore.getFeatureToggles(),
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onStrategiesChange() {
 | 
			
		||||
    onStrategiesChange () {
 | 
			
		||||
        this.setState({
 | 
			
		||||
            strategies: StrategyStore.getStrategies(),
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onArchiveChange() {
 | 
			
		||||
    onArchiveChange () {
 | 
			
		||||
        this.setState({
 | 
			
		||||
            archivedFeatures: ArchiveStore.getArchivedToggles(),
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    componentDidMount() {
 | 
			
		||||
    componentDidMount () {
 | 
			
		||||
        this.unsubscribeFS = FeatureToggleStore.listen(this.onFeatureToggleChange);
 | 
			
		||||
        this.unsubscribeSS = StrategyStore.listen(this.onStrategiesChange);
 | 
			
		||||
        this.unsubscribeAS = ArchiveStore.listen(this.onArchiveChange);
 | 
			
		||||
    },
 | 
			
		||||
    componentWillUnmount() {
 | 
			
		||||
    componentWillUnmount () {
 | 
			
		||||
        this.unsubscribeFS();
 | 
			
		||||
        this.unsubscribeSS();
 | 
			
		||||
        this.unsubscribeAS();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    componentWillMount() {
 | 
			
		||||
    componentWillMount () {
 | 
			
		||||
        initalizer(30);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderLink(id, label) {
 | 
			
		||||
    renderLink (id, label) {
 | 
			
		||||
        return    (
 | 
			
		||||
            <Link to={id} className="nav-element centerify" activeClassName="nav-active">
 | 
			
		||||
                <span className="topbar-nav-svg-caption caption showbydefault no-break">{label}</span>
 | 
			
		||||
@ -64,7 +64,7 @@ const UnleashApp = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div>
 | 
			
		||||
                <Menu>
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ describe('FeatureList', () => {
 | 
			
		||||
            { name: 'featureX', strategy: 'other' },
 | 
			
		||||
            { name: 'group.featureY', strategy: 'default' },
 | 
			
		||||
        ];
 | 
			
		||||
        const strategies=[
 | 
			
		||||
        const strategies = [
 | 
			
		||||
            { name: 'default' },
 | 
			
		||||
        ];
 | 
			
		||||
        Component = TestUtils .renderIntoDocument(<FeatureList features={features} strategies={strategies} />);
 | 
			
		||||
 | 
			
		||||
@ -5,31 +5,31 @@ const ErrorStore  = require('../stores/ErrorStore');
 | 
			
		||||
const ErrorActions  = require('../stores/ErrorActions');
 | 
			
		||||
 | 
			
		||||
const ErrorMessages = React.createClass({
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            errors: ErrorStore.getErrors(),
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onStoreChange() {
 | 
			
		||||
    onStoreChange () {
 | 
			
		||||
        this.setState({
 | 
			
		||||
            errors: ErrorStore.getErrors(),
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    componentDidMount() {
 | 
			
		||||
    componentDidMount () {
 | 
			
		||||
        this.unsubscribe = ErrorStore.listen(this.onStoreChange);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    componentWillUnmount() {
 | 
			
		||||
    componentWillUnmount () {
 | 
			
		||||
        this.unsubscribe();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onClearErrors() {
 | 
			
		||||
    onClearErrors () {
 | 
			
		||||
        ErrorActions.clear();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
        <Ui errors={this.state.errors} onClearErrors={this.onClearErrors} />
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
const React = require('react');
 | 
			
		||||
 | 
			
		||||
const ErrorMessages = React.createClass({
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        if (!this.props.errors.length) {
 | 
			
		||||
            return <div/>;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ const React = require('react');
 | 
			
		||||
const User = require('./User');
 | 
			
		||||
 | 
			
		||||
const Menu = React.createClass({
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div className="topbar mbl">
 | 
			
		||||
            <div className="container">
 | 
			
		||||
 | 
			
		||||
@ -4,12 +4,12 @@ const UserStore = require('../stores/UserStore');
 | 
			
		||||
 | 
			
		||||
const User = React.createClass({
 | 
			
		||||
 | 
			
		||||
    onSave() {
 | 
			
		||||
    onSave () {
 | 
			
		||||
        const value = this.refs.username.getDOMNode().value.trim();
 | 
			
		||||
        UserStore.set(value);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
      <div className="r-pvm">
 | 
			
		||||
        <input type="text" placeholder="username"
 | 
			
		||||
 | 
			
		||||
@ -4,11 +4,11 @@ const FeatureActions      = require('../../stores/FeatureToggleActions');
 | 
			
		||||
 | 
			
		||||
const ArchiveFeatureComponent = React.createClass({
 | 
			
		||||
 | 
			
		||||
    onRevive(item) {
 | 
			
		||||
    onRevive (item) {
 | 
			
		||||
        FeatureActions.revive.triggerPromise(item);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div>
 | 
			
		||||
                <h1>Archived Feature Toggles</h1>
 | 
			
		||||
@ -28,7 +28,7 @@ const ArchiveFeatureComponent = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderArchivedItem(f) {
 | 
			
		||||
    renderArchivedItem (f) {
 | 
			
		||||
        return (
 | 
			
		||||
            <tr key={f.name}>
 | 
			
		||||
                <td>
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ const LogEntryList = require('../log/LogEntryList');
 | 
			
		||||
const eventStore = require('../../stores/EventStore');
 | 
			
		||||
 | 
			
		||||
const Feature = React.createClass({
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            editMode: false,
 | 
			
		||||
            showHistory: false,
 | 
			
		||||
@ -13,33 +13,33 @@ const Feature = React.createClass({
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    handleEventsResponse(response) {
 | 
			
		||||
    handleEventsResponse (response) {
 | 
			
		||||
        this.setState({ events: response });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    toggleHistory() {
 | 
			
		||||
    toggleHistory () {
 | 
			
		||||
        eventStore.getEventsByName(this.props.feature.name).then(this.handleEventsResponse);
 | 
			
		||||
        this.setState({ showHistory: !this.state.showHistory });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    toggleEditMode() {
 | 
			
		||||
    toggleEditMode () {
 | 
			
		||||
        this.setState({ editMode: !this.state.editMode });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    saveFeature(feature) {
 | 
			
		||||
    saveFeature (feature) {
 | 
			
		||||
        this.props.onChange(feature);
 | 
			
		||||
        this.toggleEditMode();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    archiveFeature() {
 | 
			
		||||
    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() {
 | 
			
		||||
    renderEditMode () {
 | 
			
		||||
        return (
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td colSpan="4" className="pan man no-border">
 | 
			
		||||
@ -53,7 +53,7 @@ const Feature = React.createClass({
 | 
			
		||||
            );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <tbody className="feature">
 | 
			
		||||
                <tr className={this.state.editMode ? 'edit bg-lilac-xlt' : ''}>
 | 
			
		||||
@ -107,11 +107,11 @@ const Feature = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderEmptyRow() {
 | 
			
		||||
    renderEmptyRow () {
 | 
			
		||||
        return (<tr />);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderHistory() {
 | 
			
		||||
    renderHistory () {
 | 
			
		||||
        return (<tr>
 | 
			
		||||
                    <td colSpan="4" className="no-border">
 | 
			
		||||
                        <LogEntryList events={this.state.events} />
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ const React = require('react');
 | 
			
		||||
const TextInput = require('../form/TextInput');
 | 
			
		||||
 | 
			
		||||
const FeatureForm = React.createClass({
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            strategyOptions: this.props.strategies,
 | 
			
		||||
            requiredParams: [],
 | 
			
		||||
@ -11,25 +11,25 @@ const FeatureForm = React.createClass({
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    componentWillMount() {
 | 
			
		||||
    componentWillMount () {
 | 
			
		||||
        if (this.props.feature) {
 | 
			
		||||
            this.setSelectedStrategy(this.props.feature.strategy);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onStrategyChange(e) {
 | 
			
		||||
    onStrategyChange (e) {
 | 
			
		||||
        this.setSelectedStrategy(e.target.value);
 | 
			
		||||
        this.setState({ currentStrategy: e.target.value });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getParameterValue(name) {
 | 
			
		||||
    getParameterValue (name) {
 | 
			
		||||
        if (this.props.feature && this.props.feature.parameters) {
 | 
			
		||||
            return this.props.feature.parameters[name];
 | 
			
		||||
        }
 | 
			
		||||
        return '';
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setSelectedStrategy(name) {
 | 
			
		||||
    setSelectedStrategy (name) {
 | 
			
		||||
        const selectedStrategy = this.props.strategies.filter(strategy => strategy.name ===  name)[0];
 | 
			
		||||
 | 
			
		||||
        if (selectedStrategy) {
 | 
			
		||||
@ -42,7 +42,7 @@ const FeatureForm = React.createClass({
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setStrategyParams(strategy) {
 | 
			
		||||
    setStrategyParams (strategy) {
 | 
			
		||||
        const requiredParams = [];
 | 
			
		||||
        let key;
 | 
			
		||||
        for (key in strategy.parametersTemplate) {
 | 
			
		||||
@ -53,7 +53,7 @@ const FeatureForm = React.createClass({
 | 
			
		||||
        this.setState({ requiredParams });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        const feature = this.props.feature || {
 | 
			
		||||
            name: '',
 | 
			
		||||
            strategy: 'default',
 | 
			
		||||
@ -127,13 +127,13 @@ const FeatureForm = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderStrategyOptions() {
 | 
			
		||||
    renderStrategyOptions () {
 | 
			
		||||
        return this.props.strategies.map(strategy => <option key={strategy.name} value={strategy.name}>
 | 
			
		||||
            {strategy.name}
 | 
			
		||||
        </option>);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderStrategyProperties() {
 | 
			
		||||
    renderStrategyProperties () {
 | 
			
		||||
        return this.state.requiredParams.map(param => <TextInput
 | 
			
		||||
            id={`param-${param.name}`}
 | 
			
		||||
            key={`param-${param.name}`}
 | 
			
		||||
@ -143,7 +143,7 @@ const FeatureForm = React.createClass({
 | 
			
		||||
            value={param.value} />);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    saveFeature(e) {
 | 
			
		||||
    saveFeature (e) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
 | 
			
		||||
        const feature = {
 | 
			
		||||
@ -157,12 +157,12 @@ const FeatureForm = React.createClass({
 | 
			
		||||
        this.props.onSubmit(feature);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    cancelFeature(e) {
 | 
			
		||||
    cancelFeature (e) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        this.props.onCancel();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getParameters() {
 | 
			
		||||
    getParameters () {
 | 
			
		||||
        const parameters = {};
 | 
			
		||||
        this.state.requiredParams.forEach(param => {
 | 
			
		||||
            parameters[param.name] = this.refs[param.name].getValue();
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
const React   = require('react');
 | 
			
		||||
const Feature = require('./Feature');
 | 
			
		||||
 | 
			
		||||
const noop = function() {};
 | 
			
		||||
const noop = function () {};
 | 
			
		||||
 | 
			
		||||
const FeatureList = React.createClass({
 | 
			
		||||
    propTypes: {
 | 
			
		||||
@ -10,25 +10,25 @@ const FeatureList = React.createClass({
 | 
			
		||||
        strategies: React.PropTypes.array.isRequired,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getDefaultProps() {
 | 
			
		||||
    getDefaultProps () {
 | 
			
		||||
        return {
 | 
			
		||||
            onFeatureChanged: noop,
 | 
			
		||||
            onFeatureArchive: noop,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            filter: undefined,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onFilterChange(e) {
 | 
			
		||||
    onFilterChange (e) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        this.setState({ filter: e.target.value.trim() });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    filteredFeatures() {
 | 
			
		||||
    filteredFeatures () {
 | 
			
		||||
        if (this.state.filter) {
 | 
			
		||||
            const regex = new RegExp(this.state.filter, 'i');
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@ const FeatureList = React.createClass({
 | 
			
		||||
        return this.props.features;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        const featureNodes = this.filteredFeatures().map(feature => <Feature
 | 
			
		||||
          key={feature.name}
 | 
			
		||||
          feature={feature}
 | 
			
		||||
 | 
			
		||||
@ -6,35 +6,35 @@ const FeatureActions      = require('../../stores/FeatureToggleActions');
 | 
			
		||||
const ErrorActions        = require('../../stores/ErrorActions');
 | 
			
		||||
 | 
			
		||||
const FeatureTogglesComponent = React.createClass({
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            createView: false,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    updateFeature(feature) {
 | 
			
		||||
    updateFeature (feature) {
 | 
			
		||||
        FeatureActions.update.triggerPromise(feature);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    archiveFeature(feature) {
 | 
			
		||||
    archiveFeature (feature) {
 | 
			
		||||
        FeatureActions.archive.triggerPromise(feature);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    createFeature(feature) {
 | 
			
		||||
    createFeature (feature) {
 | 
			
		||||
        FeatureActions.create.triggerPromise(feature)
 | 
			
		||||
          .then(this.cancelNewFeature);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    newFeature() {
 | 
			
		||||
    newFeature () {
 | 
			
		||||
        this.setState({ createView: true });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    cancelNewFeature() {
 | 
			
		||||
    cancelNewFeature () {
 | 
			
		||||
        this.setState({ createView: false });
 | 
			
		||||
        ErrorActions.clear();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div>
 | 
			
		||||
 | 
			
		||||
@ -54,14 +54,14 @@ const FeatureTogglesComponent = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderCreateView() {
 | 
			
		||||
    renderCreateView () {
 | 
			
		||||
        return (<FeatureForm
 | 
			
		||||
            onCancel={this.cancelNewFeature}
 | 
			
		||||
            onSubmit={this.createFeature}
 | 
			
		||||
            strategies={this.props.strategies} />);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderCreateButton() {
 | 
			
		||||
    renderCreateButton () {
 | 
			
		||||
        return <button className="mal" onClick={this.newFeature}>Create feature toggle</button>;
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -11,22 +11,22 @@ const TextInput = React.createClass({
 | 
			
		||||
        required: React.PropTypes.bool,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getDefaultProps() {
 | 
			
		||||
    getDefaultProps () {
 | 
			
		||||
        return {
 | 
			
		||||
            required: false,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {};
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getValue() {
 | 
			
		||||
    getValue () {
 | 
			
		||||
        return this.refs.input.getDOMNode().value.trim();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div className="formelement required">
 | 
			
		||||
                <label htmlFor={this.props.id} className="t4">{this.props.label}</label>
 | 
			
		||||
 | 
			
		||||
@ -5,24 +5,24 @@ const eventStore     = require('../../stores/EventStore');
 | 
			
		||||
const ErrorActions   = require('../../stores/ErrorActions');
 | 
			
		||||
 | 
			
		||||
const LogEntriesComponent = React.createClass({
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            createView: false,
 | 
			
		||||
            events: [],
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    componentDidMount() {
 | 
			
		||||
    componentDidMount () {
 | 
			
		||||
        eventStore.getEvents().then(res => {
 | 
			
		||||
            this.setState({ events: res.events });
 | 
			
		||||
        }, this.initError);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    initError() {
 | 
			
		||||
    initError () {
 | 
			
		||||
        ErrorActions.error('Could not load events from server');
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div>
 | 
			
		||||
                <h1>Log</h1>
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ const LogEntry = React.createClass({
 | 
			
		||||
        event: React.PropTypes.object.isRequired,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        const date = moment(this.props.event.createdAt);
 | 
			
		||||
 | 
			
		||||
        return (
 | 
			
		||||
@ -41,7 +41,7 @@ const LogEntry = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderFullEventData() {
 | 
			
		||||
    renderFullEventData () {
 | 
			
		||||
        const localEventData = JSON.parse(JSON.stringify(this.props.event.data));
 | 
			
		||||
        delete localEventData.description;
 | 
			
		||||
        delete localEventData.name;
 | 
			
		||||
@ -51,7 +51,7 @@ const LogEntry = React.createClass({
 | 
			
		||||
        return (<code className="JSON smalltext man">{prettyPrinted}</code>);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderEventDiff() {
 | 
			
		||||
    renderEventDiff () {
 | 
			
		||||
        if (!this.props.showFullEvents && this.props.event.diffs) {
 | 
			
		||||
            const changes = this.props.event.diffs.map(this.buildDiff);
 | 
			
		||||
            return (
 | 
			
		||||
@ -61,7 +61,7 @@ const LogEntry = React.createClass({
 | 
			
		||||
        return this.renderFullEventData();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    buildDiff(diff, idx) {
 | 
			
		||||
    buildDiff (diff, idx) {
 | 
			
		||||
        let change;
 | 
			
		||||
        const key = diff.path.join('.');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,15 @@ const LogEntryList = React.createClass({
 | 
			
		||||
        events: React.PropTypes.array.isRequired,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            showFullEvents: false,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
        const logEntryNodes = this.props.events.map(event => <LogEntry event={event} key={event.id} showFullEvents={this.state.showFullEvents} />);
 | 
			
		||||
    render () {
 | 
			
		||||
        const logEntryNodes = this.props.events.map(event =>
 | 
			
		||||
            <LogEntry event={event} key={event.id} showFullEvents={this.state.showFullEvents} />);
 | 
			
		||||
 | 
			
		||||
        return (
 | 
			
		||||
            <div>
 | 
			
		||||
@ -47,7 +48,7 @@ const LogEntryList = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    toggleFullEvents() {
 | 
			
		||||
    toggleFullEvents () {
 | 
			
		||||
        this.setState({ showFullEvents: !this.state.showFullEvents });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,30 +5,30 @@ const StrategyForm      = require('./StrategyForm');
 | 
			
		||||
const StrategyActions   = require('../../stores/StrategyActions');
 | 
			
		||||
 | 
			
		||||
const StrategiesComponent = React.createClass({
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            createView: false,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onNewStrategy() {
 | 
			
		||||
    onNewStrategy () {
 | 
			
		||||
        this.setState({ createView: true });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onCancelNewStrategy() {
 | 
			
		||||
    onCancelNewStrategy () {
 | 
			
		||||
        this.setState({ createView: false });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onSave(strategy) {
 | 
			
		||||
    onSave (strategy) {
 | 
			
		||||
        StrategyActions.create.triggerPromise(strategy)
 | 
			
		||||
        .then(this.onCancelNewStrategy);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onRemove(strategy) {
 | 
			
		||||
    onRemove (strategy) {
 | 
			
		||||
        StrategyActions.remove.triggerPromise(strategy);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div>
 | 
			
		||||
                <h1>Activation Strategies</h1>
 | 
			
		||||
@ -42,7 +42,7 @@ const StrategiesComponent = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderCreateView() {
 | 
			
		||||
    renderCreateView () {
 | 
			
		||||
        return (
 | 
			
		||||
            <StrategyForm
 | 
			
		||||
                onCancelNewStrategy={this.onCancelNewStrategy}
 | 
			
		||||
@ -50,7 +50,7 @@ const StrategiesComponent = React.createClass({
 | 
			
		||||
                />);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderCreateButton() {
 | 
			
		||||
    renderCreateButton () {
 | 
			
		||||
        return (
 | 
			
		||||
                    <button className="mal" onClick={this.onNewStrategy}>
 | 
			
		||||
                        Create strategy
 | 
			
		||||
 | 
			
		||||
@ -6,14 +6,14 @@ const Strategy = React.createClass({
 | 
			
		||||
        strategy: React.PropTypes.object.isRequired,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onRemove(event) {
 | 
			
		||||
    onRemove (event) {
 | 
			
		||||
        event.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() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div className="line mal">
 | 
			
		||||
                <div className="unit">
 | 
			
		||||
 | 
			
		||||
@ -4,19 +4,19 @@ const TextInput      = require('../form/TextInput');
 | 
			
		||||
 | 
			
		||||
const StrategyForm = React.createClass({
 | 
			
		||||
 | 
			
		||||
    getDefaultProps() {
 | 
			
		||||
    getDefaultProps () {
 | 
			
		||||
        return {
 | 
			
		||||
            maxParams: 4,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getInitialState() {
 | 
			
		||||
    getInitialState () {
 | 
			
		||||
        return {
 | 
			
		||||
            parameters: [],
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onSubmit(event) {
 | 
			
		||||
    onSubmit (event) {
 | 
			
		||||
        event.preventDefault();
 | 
			
		||||
 | 
			
		||||
        const strategy = {};
 | 
			
		||||
@ -34,27 +34,27 @@ const StrategyForm = React.createClass({
 | 
			
		||||
        this.props.onSave(strategy);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onCancel(event) {
 | 
			
		||||
    onCancel (event) {
 | 
			
		||||
        event.preventDefault();
 | 
			
		||||
 | 
			
		||||
        this.props.onCancelNewStrategy();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onAddParam(event) {
 | 
			
		||||
    onAddParam (event) {
 | 
			
		||||
        event.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(event) {
 | 
			
		||||
    onRemoveParam (event) {
 | 
			
		||||
        event.preventDefault();
 | 
			
		||||
        const params = this.state.parameters.slice(0, -1);
 | 
			
		||||
 | 
			
		||||
        this.setState({ parameters: params });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
    render () {
 | 
			
		||||
        return (
 | 
			
		||||
            <div className="line r-pam bg-lilac-xlt">
 | 
			
		||||
                <div className="unit r-size1of2">
 | 
			
		||||
@ -91,7 +91,7 @@ const StrategyForm = React.createClass({
 | 
			
		||||
        );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderParameters() {
 | 
			
		||||
    renderParameters () {
 | 
			
		||||
        return this.state.parameters.map(param => <div className="formelement" key={param.name}>
 | 
			
		||||
            <label className="t4">{param.label}</label>
 | 
			
		||||
            <div className="input">
 | 
			
		||||
@ -116,12 +116,12 @@ const StrategyForm = React.createClass({
 | 
			
		||||
        </div>);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderAddLink() {
 | 
			
		||||
    renderAddLink () {
 | 
			
		||||
        if (this.state.parameters.length < this.props.maxParams) {
 | 
			
		||||
            return <a href="#add" onClick={this.onAddParam}>+ Add required parameter</a>;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    renderRemoveLink() {
 | 
			
		||||
    renderRemoveLink () {
 | 
			
		||||
        if (this.state.parameters.length > 0) {
 | 
			
		||||
            return (
 | 
			
		||||
                <div className="formelement mtn">
 | 
			
		||||
 | 
			
		||||
@ -7,8 +7,9 @@ const StrategyList = React.createClass({
 | 
			
		||||
        strategies: React.PropTypes.array.isRequired,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
        const strategyNodes = this.props.strategies.map(strategy => <Strategy strategy={strategy} key={strategy.name} onRemove={this.props.onRemove} />);
 | 
			
		||||
    render () {
 | 
			
		||||
        const strategyNodes = this.props.strategies.map(strategy =>
 | 
			
		||||
            <Strategy strategy={strategy} key={strategy.name} onRemove={this.props.onRemove} />);
 | 
			
		||||
        return (
 | 
			
		||||
            <div>{strategyNodes}</div>
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
@ -10,35 +10,35 @@ let _archivedToggles = [];
 | 
			
		||||
const FeatureStore = Reflux.createStore({
 | 
			
		||||
 | 
			
		||||
    // Initial setup
 | 
			
		||||
    init() {
 | 
			
		||||
    init () {
 | 
			
		||||
        this.listenTo(FeatureActions.initArchive.completed, this.onInit);
 | 
			
		||||
        this.listenTo(FeatureActions.archive.completed, this.onArchive);
 | 
			
		||||
        this.listenTo(FeatureActions.revive.completed,  this.onRevive);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onInit(toggles) {
 | 
			
		||||
    onInit (toggles) {
 | 
			
		||||
        _archivedToggles = toggles;
 | 
			
		||||
        this.trigger();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onArchive(feature) {
 | 
			
		||||
    onArchive (feature) {
 | 
			
		||||
        const toggles = _archivedToggles.concat([feature]);
 | 
			
		||||
        _archivedToggles = sortBy(toggles, 'name');
 | 
			
		||||
        this.trigger();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onRevive(item) {
 | 
			
		||||
    onRevive (item) {
 | 
			
		||||
        const newStore = filter(_archivedToggles, f => f.name !== item.name);
 | 
			
		||||
 | 
			
		||||
        _archivedToggles = sortBy(newStore, 'name');
 | 
			
		||||
        this.trigger();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getArchivedToggles() {
 | 
			
		||||
    getArchivedToggles () {
 | 
			
		||||
        return _archivedToggles;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    initStore(archivedToggles) {
 | 
			
		||||
    initStore (archivedToggles) {
 | 
			
		||||
        _archivedToggles = archivedToggles;
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ const ErrorActions    = require('./ErrorActions');
 | 
			
		||||
// Creates a DataStore
 | 
			
		||||
const FeatureStore = Reflux.createStore({
 | 
			
		||||
    // Initial setup
 | 
			
		||||
    init() {
 | 
			
		||||
    init () {
 | 
			
		||||
        this.listenTo(FeatureActions.create.failed, this.onError);
 | 
			
		||||
        this.listenTo(FeatureActions.init.failed, this.onError);
 | 
			
		||||
        this.listenTo(FeatureActions.update.failed, this.onError);
 | 
			
		||||
@ -17,7 +17,7 @@ const FeatureStore = Reflux.createStore({
 | 
			
		||||
        this.errors = [];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onError(error) {
 | 
			
		||||
    onError (error) {
 | 
			
		||||
        if (this.isClientError(error)) {
 | 
			
		||||
            const errors = JSON.parse(error.responseText);
 | 
			
		||||
            errors.forEach(e => {
 | 
			
		||||
@ -30,12 +30,12 @@ const FeatureStore = Reflux.createStore({
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onClear() {
 | 
			
		||||
    onClear () {
 | 
			
		||||
        this.errors = [];
 | 
			
		||||
        this.trigger([]);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    addError(msg) {
 | 
			
		||||
    addError (msg) {
 | 
			
		||||
        const errors = this.errors;
 | 
			
		||||
        if (errors[errors.length - 1] !== msg) {
 | 
			
		||||
            errors.push(msg);
 | 
			
		||||
@ -44,7 +44,7 @@ const FeatureStore = Reflux.createStore({
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    isClientError(error) {
 | 
			
		||||
    isClientError (error) {
 | 
			
		||||
        try {
 | 
			
		||||
            return error.status >= 400 &&
 | 
			
		||||
            error.status <  500 &&
 | 
			
		||||
@ -61,7 +61,7 @@ const FeatureStore = Reflux.createStore({
 | 
			
		||||
        return false;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getErrors() {
 | 
			
		||||
    getErrors () {
 | 
			
		||||
        return this.errors;
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ const reqwest = require('reqwest');
 | 
			
		||||
const TYPE         = 'json';
 | 
			
		||||
 | 
			
		||||
const EventStore = {
 | 
			
		||||
    getEvents() {
 | 
			
		||||
    getEvents () {
 | 
			
		||||
        return reqwest({
 | 
			
		||||
            url: 'events',
 | 
			
		||||
            method: 'get',
 | 
			
		||||
@ -12,7 +12,7 @@ const EventStore = {
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getEventsByName(name) {
 | 
			
		||||
    getEventsByName (name) {
 | 
			
		||||
        return reqwest({
 | 
			
		||||
            url: `events/${name}`,
 | 
			
		||||
            method: 'get',
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ const FeatureToggleActions = Reflux.createActions({
 | 
			
		||||
    revive: { asyncResult: true },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
FeatureToggleActions.init.listen(function() {
 | 
			
		||||
FeatureToggleActions.init.listen(function () {
 | 
			
		||||
    Server.getFeatures((error, features) => {
 | 
			
		||||
        if (error) {
 | 
			
		||||
            this.failed(error);
 | 
			
		||||
@ -21,7 +21,7 @@ FeatureToggleActions.init.listen(function() {
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
FeatureToggleActions.initArchive.listen(function() {
 | 
			
		||||
FeatureToggleActions.initArchive.listen(function () {
 | 
			
		||||
    Server.getArchivedFeatures((error, archivedToggles) => {
 | 
			
		||||
        if (error) {
 | 
			
		||||
            this.failed(error);
 | 
			
		||||
@ -31,7 +31,7 @@ FeatureToggleActions.initArchive.listen(function() {
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
FeatureToggleActions.create.listen(function(feature) {
 | 
			
		||||
FeatureToggleActions.create.listen(function (feature) {
 | 
			
		||||
    Server.createFeature(feature, error => {
 | 
			
		||||
        if (error) {
 | 
			
		||||
            this.failed(error);
 | 
			
		||||
@ -41,7 +41,7 @@ FeatureToggleActions.create.listen(function(feature) {
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
FeatureToggleActions.update.listen(function(feature) {
 | 
			
		||||
FeatureToggleActions.update.listen(function (feature) {
 | 
			
		||||
    Server.updateFeature(feature, error => {
 | 
			
		||||
        if (error) {
 | 
			
		||||
            this.failed(error);
 | 
			
		||||
@ -51,7 +51,7 @@ FeatureToggleActions.update.listen(function(feature) {
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
FeatureToggleActions.archive.listen(function(feature) {
 | 
			
		||||
FeatureToggleActions.archive.listen(function (feature) {
 | 
			
		||||
    Server.archiveFeature(feature, error => {
 | 
			
		||||
        if (error) {
 | 
			
		||||
            this.failed(error);
 | 
			
		||||
@ -61,7 +61,7 @@ FeatureToggleActions.archive.listen(function(feature) {
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
FeatureToggleActions.revive.listen(function(feature) {
 | 
			
		||||
FeatureToggleActions.revive.listen(function (feature) {
 | 
			
		||||
    Server.reviveFeature(feature, error => {
 | 
			
		||||
        if (error) {
 | 
			
		||||
            this.failed(error);
 | 
			
		||||
 | 
			
		||||
@ -5,91 +5,91 @@ const TYPE         = 'json';
 | 
			
		||||
const CONTENT_TYPE = 'application/json';
 | 
			
		||||
 | 
			
		||||
const FeatureToggleServerFacade = {
 | 
			
		||||
    updateFeature(feature, cb) {
 | 
			
		||||
    updateFeature (feature, cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: `features/${feature.name}`,
 | 
			
		||||
            method: 'put',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            contentType: CONTENT_TYPE,
 | 
			
		||||
            data: JSON.stringify(feature),
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success() {
 | 
			
		||||
            success () {
 | 
			
		||||
                cb();
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    createFeature(feature, cb) {
 | 
			
		||||
    createFeature (feature, cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: 'features',
 | 
			
		||||
            method: 'post',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            contentType: CONTENT_TYPE,
 | 
			
		||||
            data: JSON.stringify(feature),
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success() {
 | 
			
		||||
            success () {
 | 
			
		||||
                cb();
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    archiveFeature(feature, cb) {
 | 
			
		||||
    archiveFeature (feature, cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: `features/${feature.name}`,
 | 
			
		||||
            method: 'delete',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success() {
 | 
			
		||||
            success () {
 | 
			
		||||
                cb();
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getFeatures(cb) {
 | 
			
		||||
    getFeatures (cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: 'features',
 | 
			
		||||
            method: 'get',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success(data) {
 | 
			
		||||
            success (data) {
 | 
			
		||||
                cb(null, data.features);
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getArchivedFeatures(cb) {
 | 
			
		||||
    getArchivedFeatures (cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: 'archive/features',
 | 
			
		||||
            method: 'get',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success(data) {
 | 
			
		||||
            success (data) {
 | 
			
		||||
                cb(null, data.features);
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    reviveFeature(feature, cb) {
 | 
			
		||||
    reviveFeature (feature, cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: 'archive/revive',
 | 
			
		||||
            method: 'post',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            contentType: CONTENT_TYPE,
 | 
			
		||||
            data: JSON.stringify(feature),
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success() {
 | 
			
		||||
            success () {
 | 
			
		||||
                cb();
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@ let _featureToggles = [];
 | 
			
		||||
const FeatureStore = Reflux.createStore({
 | 
			
		||||
 | 
			
		||||
  // Initial setup
 | 
			
		||||
    init() {
 | 
			
		||||
    init () {
 | 
			
		||||
        this.listenTo(FeatureActions.init.completed,    this.setToggles);
 | 
			
		||||
        this.listenTo(FeatureActions.create.completed,  this.onCreate);
 | 
			
		||||
        this.listenTo(FeatureActions.update.completed,  this.onUpdate);
 | 
			
		||||
@ -18,37 +18,37 @@ const FeatureStore = Reflux.createStore({
 | 
			
		||||
        this.listenTo(FeatureActions.revive.completed,  this.onRevive);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onCreate(feature) {
 | 
			
		||||
    onCreate (feature) {
 | 
			
		||||
        this.setToggles([feature].concat(_featureToggles));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setToggles(toggles) {
 | 
			
		||||
    setToggles (toggles) {
 | 
			
		||||
        _featureToggles = sortBy(toggles, 'name');
 | 
			
		||||
        this.trigger();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onUpdate(feature) {
 | 
			
		||||
    onUpdate (feature) {
 | 
			
		||||
        const idx = findIndex(_featureToggles, 'name', feature.name);
 | 
			
		||||
        _featureToggles[idx] = feature;
 | 
			
		||||
        this.trigger();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onArchive(feature) {
 | 
			
		||||
    onArchive (feature) {
 | 
			
		||||
        const featureToggles = filter(_featureToggles, item => item.name !== feature.name);
 | 
			
		||||
        this.setToggles(featureToggles);
 | 
			
		||||
        this.trigger();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onRevive(item) {
 | 
			
		||||
    onRevive (item) {
 | 
			
		||||
        this.setToggles(_featureToggles.concat([item]));
 | 
			
		||||
        this.trigger();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getFeatureToggles() {
 | 
			
		||||
    getFeatureToggles () {
 | 
			
		||||
        return _featureToggles;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    initStore(toggles) {
 | 
			
		||||
    initStore (toggles) {
 | 
			
		||||
        _featureToggles = toggles;
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -5,45 +5,45 @@ const TYPE         = 'json';
 | 
			
		||||
const CONTENT_TYPE = 'application/json';
 | 
			
		||||
 | 
			
		||||
const StrategyAPI = {
 | 
			
		||||
    createStrategy(strategy, cb) {
 | 
			
		||||
    createStrategy (strategy, cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: 'strategies',
 | 
			
		||||
            method: 'post',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            contentType: CONTENT_TYPE,
 | 
			
		||||
            data: JSON.stringify(strategy),
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success() {
 | 
			
		||||
            success () {
 | 
			
		||||
                cb(null, strategy);
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    removeStrategy(strategy, cb) {
 | 
			
		||||
    removeStrategy (strategy, cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: `strategies/${strategy.name}`,
 | 
			
		||||
            method: 'delete',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success() {
 | 
			
		||||
            success () {
 | 
			
		||||
                cb(null, strategy);
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getStrategies(cb) {
 | 
			
		||||
    getStrategies (cb) {
 | 
			
		||||
        reqwest({
 | 
			
		||||
            url: 'strategies',
 | 
			
		||||
            method: 'get',
 | 
			
		||||
            type: TYPE,
 | 
			
		||||
            error(error) {
 | 
			
		||||
            error (error) {
 | 
			
		||||
                cb(error);
 | 
			
		||||
            },
 | 
			
		||||
            success(data) {
 | 
			
		||||
            success (data) {
 | 
			
		||||
                cb(null, data.strategies);
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ const StrategyActions = Reflux.createActions({
 | 
			
		||||
    remove: { asyncResult: true },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
StrategyActions.init.listen(function() {
 | 
			
		||||
StrategyActions.init.listen(function () {
 | 
			
		||||
    StrategyAPI.getStrategies((err, strategies) => {
 | 
			
		||||
        if (err) {
 | 
			
		||||
            this.failed(err);
 | 
			
		||||
@ -18,7 +18,7 @@ StrategyActions.init.listen(function() {
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
StrategyActions.create.listen(function(feature) {
 | 
			
		||||
StrategyActions.create.listen(function (feature) {
 | 
			
		||||
    StrategyAPI.createStrategy(feature, err => {
 | 
			
		||||
        if (err) {
 | 
			
		||||
            this.failed(err);
 | 
			
		||||
@ -28,7 +28,7 @@ StrategyActions.create.listen(function(feature) {
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
StrategyActions.remove.listen(function(feature) {
 | 
			
		||||
StrategyActions.remove.listen(function (feature) {
 | 
			
		||||
    StrategyAPI.removeStrategy(feature, err => {
 | 
			
		||||
        if (err) {
 | 
			
		||||
            this.failed(err);
 | 
			
		||||
 | 
			
		||||
@ -9,31 +9,31 @@ let _strategies = [];
 | 
			
		||||
const StrategyStore = Reflux.createStore({
 | 
			
		||||
 | 
			
		||||
    // Initial setup
 | 
			
		||||
    init() {
 | 
			
		||||
    init () {
 | 
			
		||||
        this.listenTo(StrategyActions.init.completed, this.setStrategies);
 | 
			
		||||
        this.listenTo(StrategyActions.create.completed, this.onCreate);
 | 
			
		||||
        this.listenTo(StrategyActions.remove.completed,  this.onRemove);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onCreate(strategy) {
 | 
			
		||||
    onCreate (strategy) {
 | 
			
		||||
        this.setStrategies(_strategies.concat([strategy]));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onRemove(strategy) {
 | 
			
		||||
    onRemove (strategy) {
 | 
			
		||||
        const strategies = filter(_strategies, item => item.name !== strategy.name);
 | 
			
		||||
        this.setStrategies(strategies);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setStrategies(strategies) {
 | 
			
		||||
    setStrategies (strategies) {
 | 
			
		||||
        _strategies = strategies;
 | 
			
		||||
        this.trigger(_strategies);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getStrategies() {
 | 
			
		||||
    getStrategies () {
 | 
			
		||||
        return _strategies;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    initStore(strategies) {
 | 
			
		||||
    initStore (strategies) {
 | 
			
		||||
        _strategies = strategies;
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -2,12 +2,12 @@
 | 
			
		||||
let _username;
 | 
			
		||||
 | 
			
		||||
// Ref: http://stackoverflow.com/questions/10730362/get-cookie-by-name
 | 
			
		||||
function readCookie(name) {
 | 
			
		||||
function readCookie (name) {
 | 
			
		||||
    const nameEQ = `${name}=`;
 | 
			
		||||
    const ca = document.cookie.split(';');
 | 
			
		||||
    for (let i=0;i < ca.length;i++) {
 | 
			
		||||
    for (let i = 0;i < ca.length;i++) {
 | 
			
		||||
        let c = ca[i];
 | 
			
		||||
        while (c.charAt(0)==' ') { // eslint-disable-line eqeqeq
 | 
			
		||||
        while (c.charAt(0) == ' ') { // eslint-disable-line eqeqeq
 | 
			
		||||
            c = c.substring(1, c.length);
 | 
			
		||||
        }
 | 
			
		||||
        if (c.indexOf(nameEQ) === 0) {
 | 
			
		||||
@ -18,16 +18,16 @@ function readCookie(name) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const UserStore = {
 | 
			
		||||
    init() {
 | 
			
		||||
    init () {
 | 
			
		||||
        _username = readCookie('username');
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    set(username) {
 | 
			
		||||
        _username=username;
 | 
			
		||||
        document.cookie=`username=${_username}; expires=Thu, 18 Dec 2099 12:00:00 UTC`;
 | 
			
		||||
    set (username) {
 | 
			
		||||
        _username = username;
 | 
			
		||||
        document.cookie = `username=${_username}; expires=Thu, 18 Dec 2099 12:00:00 UTC`;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get() {
 | 
			
		||||
    get () {
 | 
			
		||||
        return _username;
 | 
			
		||||
    },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -5,14 +5,14 @@ const Timer = require('../utils/Timer');
 | 
			
		||||
 | 
			
		||||
let _timer;
 | 
			
		||||
 | 
			
		||||
function load() {
 | 
			
		||||
function load () {
 | 
			
		||||
    FeatureToggleActions.init.triggerPromise();
 | 
			
		||||
    StrategyActions.init.triggerPromise();
 | 
			
		||||
    FeatureToggleActions.initArchive.triggerPromise();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = function(pollInterval) {
 | 
			
		||||
module.exports = function (pollInterval) {
 | 
			
		||||
    const intervall = pollInterval || 30;
 | 
			
		||||
    _timer = new Timer(load, intervall*1000);
 | 
			
		||||
    _timer = new Timer(load, intervall * 1000);
 | 
			
		||||
    _timer.start();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,11 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
const Timer = function(cb, interval) {
 | 
			
		||||
const Timer = function (cb, interval) {
 | 
			
		||||
    this.cb = cb;
 | 
			
		||||
    this.interval = interval;
 | 
			
		||||
    this.timerId = null;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Timer.prototype.start = function() {
 | 
			
		||||
Timer.prototype.start = function () {
 | 
			
		||||
    if (this.timerId != null) {
 | 
			
		||||
        console.warn('timer already started'); // eslint-disable-line no-console
 | 
			
		||||
    }
 | 
			
		||||
@ -15,7 +15,7 @@ Timer.prototype.start = function() {
 | 
			
		||||
    this.cb();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Timer.prototype.stop  = function() {
 | 
			
		||||
Timer.prototype.stop  = function () {
 | 
			
		||||
    if (this.timerId == null) {
 | 
			
		||||
        console.warn('no timer running'); // eslint-disable-line no-console
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user