1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-06-09 01:17:06 +02:00

Fix eslint complaining

This commit is contained in:
Ivar 2016-07-02 11:54:50 +02:00 committed by Ivar Conradi Østhus
parent 1e6c6104d7
commit 5c13ea5d7b
51 changed files with 239 additions and 239 deletions

View File

@ -9,7 +9,7 @@ const logger = require('./lib/logger');
const routes = require('./lib/routes'); const routes = require('./lib/routes');
const path = require('path'); const path = require('path');
module.exports = function(config) { module.exports = function (config) {
const app = express(); const app = express();
const router = express.Router(); // eslint-disable-line new-cap const router = express.Router(); // eslint-disable-line new-cap
const baseUriPath = config.baseUriPath || ''; const baseUriPath = config.baseUriPath || '';

View File

@ -1,7 +1,7 @@
'use strict'; 'use strict';
const knex = require('knex'); const knex = require('knex');
module.exports = function(databaseConnection) { module.exports = function (databaseConnection) {
return knex({ return knex({
client: 'pg', client: 'pg',
connection: databaseConnection, connection: databaseConnection,

View File

@ -1,8 +1,8 @@
'use strict'; 'use strict';
const EVENT_COLUMNS = ['id', 'type', 'created_by', 'created_at', 'data']; const EVENT_COLUMNS = ['id', 'type', 'created_by', 'created_at', 'data'];
module.exports = function(db) { module.exports = function (db) {
function storeEvent(event) { function storeEvent (event) {
return db('events').insert({ return db('events').insert({
type: event.type, type: event.type,
created_by: event.createdBy, // eslint-disable-line created_by: event.createdBy, // eslint-disable-line
@ -10,7 +10,7 @@ module.exports = function(db) {
}); });
} }
function getEvents() { function getEvents () {
return db return db
.select(EVENT_COLUMNS) .select(EVENT_COLUMNS)
.from('events') .from('events')
@ -18,7 +18,7 @@ module.exports = function(db) {
.map(rowToEvent); .map(rowToEvent);
} }
function getEventsFilterByName(name) { function getEventsFilterByName (name) {
return db return db
.select(EVENT_COLUMNS) .select(EVENT_COLUMNS)
.from('events') .from('events')
@ -27,7 +27,7 @@ module.exports = function(db) {
.map(rowToEvent); .map(rowToEvent);
} }
function rowToEvent(row) { function rowToEvent (row) {
return { return {
id: row.id, id: row.id,
type: row.type, type: row.type,

View File

@ -4,7 +4,7 @@ const logger = require('../logger');
const NotFoundError = require('../error/NotFoundError'); const NotFoundError = require('../error/NotFoundError');
const FEATURE_COLUMNS = ['name', 'description', 'enabled', 'strategy_name', 'parameters']; 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.featureCreated, event => createFeature(event.data));
eventStore.on(eventType.featureUpdated, event => updateFeature(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)); eventStore.on(eventType.featureRevived, event => reviveFeature(event.data));
function getFeatures() { function getFeatures () {
return db return db
.select(FEATURE_COLUMNS) .select(FEATURE_COLUMNS)
.from('features') .from('features')
@ -22,7 +22,7 @@ module.exports = function(db, eventStore) {
.map(rowToFeature); .map(rowToFeature);
} }
function getFeature(name) { function getFeature (name) {
return db return db
.first(FEATURE_COLUMNS) .first(FEATURE_COLUMNS)
.from('features') .from('features')
@ -30,7 +30,7 @@ module.exports = function(db, eventStore) {
.then(rowToFeature); .then(rowToFeature);
} }
function getArchivedFeatures() { function getArchivedFeatures () {
return db return db
.select(FEATURE_COLUMNS) .select(FEATURE_COLUMNS)
.from('features') .from('features')
@ -40,7 +40,7 @@ module.exports = function(db, eventStore) {
} }
function rowToFeature(row) { function rowToFeature (row) {
if (!row) { if (!row) {
throw new NotFoundError('No feature toggle found'); throw new NotFoundError('No feature toggle found');
} }
@ -54,18 +54,18 @@ module.exports = function(db, eventStore) {
}; };
} }
function eventDataToRow(data) { function eventDataToRow (data) {
return { return {
name: data.name, name: data.name,
description: data.description, description: data.description,
enabled: data.enabled ? 1 : 0, enabled: data.enabled ? 1 : 0,
archived: data.archived ? 1 :0, archived: data.archived ? 1 : 0,
strategy_name: data.strategy, // eslint-disable-line strategy_name: data.strategy, // eslint-disable-line
parameters: data.parameters, parameters: data.parameters,
}; };
} }
function createFeature(data) { function createFeature (data) {
return db('features') return db('features')
.insert(eventDataToRow(data)) .insert(eventDataToRow(data))
.catch(err => { .catch(err => {
@ -73,7 +73,7 @@ module.exports = function(db, eventStore) {
}); });
} }
function updateFeature(data) { function updateFeature (data) {
return db('features') return db('features')
.where({ name: data.name }) .where({ name: data.name })
.update(eventDataToRow(data)) .update(eventDataToRow(data))
@ -82,7 +82,7 @@ module.exports = function(db, eventStore) {
}); });
} }
function archiveFeature(data) { function archiveFeature (data) {
return db('features') return db('features')
.where({ name: data.name }) .where({ name: data.name })
.update({ archived: 1 }) .update({ archived: 1 })
@ -91,7 +91,7 @@ module.exports = function(db, eventStore) {
}); });
} }
function reviveFeature(data) { function reviveFeature (data) {
return db('features') return db('features')
.where({ name: data.name }) .where({ name: data.name })
.update({ archived: 0, enabled: 0 }) .update({ archived: 0, enabled: 0 })

View File

@ -4,7 +4,7 @@ const logger = require('../logger');
const NotFoundError = require('../error/NotFoundError'); const NotFoundError = require('../error/NotFoundError');
const STRATEGY_COLUMNS = ['name', 'description', 'parameters_template']; 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.strategyCreated, event => createStrategy(event.data));
eventStore.on(eventType.strategyDeleted, event => { eventStore.on(eventType.strategyDeleted, event => {
@ -16,7 +16,7 @@ module.exports = function(db, eventStore) {
}); });
}); });
function getStrategies() { function getStrategies () {
return db return db
.select(STRATEGY_COLUMNS) .select(STRATEGY_COLUMNS)
.from('strategies') .from('strategies')
@ -24,7 +24,7 @@ module.exports = function(db, eventStore) {
.map(rowToStrategy); .map(rowToStrategy);
} }
function getStrategy(name) { function getStrategy (name) {
return db return db
.first(STRATEGY_COLUMNS) .first(STRATEGY_COLUMNS)
.from('strategies') .from('strategies')
@ -32,7 +32,7 @@ module.exports = function(db, eventStore) {
.then(rowToStrategy); .then(rowToStrategy);
} }
function rowToStrategy(row) { function rowToStrategy (row) {
if (!row) { if (!row) {
throw new NotFoundError('No strategy found'); throw new NotFoundError('No strategy found');
} }
@ -44,7 +44,7 @@ module.exports = function(db, eventStore) {
}; };
} }
function eventDataToRow(data) { function eventDataToRow (data) {
return { return {
name: data.name, name: data.name,
description: data.description, description: data.description,
@ -52,7 +52,7 @@ module.exports = function(db, eventStore) {
}; };
} }
function createStrategy(data) { function createStrategy (data) {
db('strategies') db('strategies')
.insert(eventDataToRow(data)) .insert(eventDataToRow(data))
.catch(err => { .catch(err => {

View File

@ -1,7 +1,7 @@
'use strict'; 'use strict';
const util = require('util'); const util = require('util');
function NameExistsError(message) { function NameExistsError (message) {
Error.call(this); Error.call(this);
Error.captureStackTrace(this, this.constructor); Error.captureStackTrace(this, this.constructor);

View File

@ -1,7 +1,7 @@
'use strict'; 'use strict';
const util = require('util'); const util = require('util');
function NotFoundError(message) { function NotFoundError (message) {
Error.call(this); Error.call(this);
Error.captureStackTrace(this, this.constructor); Error.captureStackTrace(this, this.constructor);

View File

@ -1,7 +1,7 @@
'use strict'; 'use strict';
const util = require('util'); const util = require('util');
function ValidationError(message) { function ValidationError (message) {
Error.call(this); Error.call(this);
Error.captureStackTrace(this, this.constructor); Error.captureStackTrace(this, this.constructor);

View File

@ -2,7 +2,7 @@
const Promise = require('bluebird'); const Promise = require('bluebird');
const ValidationError = require('./ValidationError'); const ValidationError = require('./ValidationError');
function validateRequest(req) { function validateRequest (req) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (req.validationErrors()) { if (req.validationErrors()) {
reject(new ValidationError('Invalid syntax')); reject(new ValidationError('Invalid syntax'));

View File

@ -14,7 +14,7 @@ const featureTypes = [
eventType.featureRevived, eventType.featureRevived,
]; ];
function baseTypeFor(event) { function baseTypeFor (event) {
if (featureTypes.indexOf(event.type) !== -1) { if (featureTypes.indexOf(event.type) !== -1) {
return 'features'; return 'features';
} else if (strategyTypes.indexOf(event.type) !== -1) { } else if (strategyTypes.indexOf(event.type) !== -1) {
@ -23,7 +23,7 @@ function baseTypeFor(event) {
throw new Error(`unknown event type: ${JSON.stringify(event)}`); throw new Error(`unknown event type: ${JSON.stringify(event)}`);
} }
function groupByBaseTypeAndName(events) { function groupByBaseTypeAndName (events) {
const groups = {}; const groups = {};
events.forEach(event => { events.forEach(event => {
@ -38,7 +38,7 @@ function groupByBaseTypeAndName(events) {
return groups; return groups;
} }
function eachConsecutiveEvent(events, callback) { function eachConsecutiveEvent (events, callback) {
const groups = groupByBaseTypeAndName(events); const groups = groupByBaseTypeAndName(events);
Object.keys(groups).forEach(baseType => { Object.keys(groups).forEach(baseType => {
@ -60,7 +60,7 @@ function eachConsecutiveEvent(events, callback) {
}); });
} }
function addDiffs(events) { function addDiffs (events) {
eachConsecutiveEvent(events, (left, right) => { eachConsecutiveEvent(events, (left, right) => {
if (right) { if (right) {
left.diffs = diff(right.data, left.data); left.diffs = diff(right.data, left.data);

View File

@ -2,7 +2,7 @@
const util = require('util'); const util = require('util');
const EventEmitter = require('events').EventEmitter; const EventEmitter = require('events').EventEmitter;
function EventStore(eventDb) { function EventStore (eventDb) {
this.eventDb = eventDb; this.eventDb = eventDb;
EventEmitter.call(this); EventEmitter.call(this);
} }

View File

@ -1,5 +1,5 @@
'use strict'; 'use strict';
function extractUsername(req) { function extractUsername (req) {
return req.cookies.username || 'unknown'; return req.cookies.username || 'unknown';
} }
module.exports = extractUsername; module.exports = extractUsername;

View File

@ -22,11 +22,9 @@ module.exports = function (app, config) {
type: eventType.featureRevived, type: eventType.featureRevived,
createdBy: req.connection.remoteAddress, createdBy: req.connection.remoteAddress,
data: req.body, data: req.body,
})).then(() => { }))
res.status(200).end(); .then(() => res.status(200).end())
}).catch(ValidationError, () => { .catch(ValidationError, () => res.status(400).json(req.validationErrors()))
res.status(400).json(req.validationErrors());
})
.catch(err => { .catch(err => {
logger.error('Could not revive feature toggle', err); logger.error('Could not revive feature toggle', err);
res.status(500).end(); res.status(500).end();

View File

@ -45,7 +45,8 @@ module.exports = function (app, config) {
.catch(NameExistsError, () => { .catch(NameExistsError, () => {
res.status(403).json([{ res.status(403).json([{
msg: `A feature named '${req.body.name}' already exists. It could be archived.`, msg: `A feature named '${req.body.name}' already exists. It could be archived.`,
}]).end(); }])
.end();
}) })
.catch(ValidationError, () => { .catch(ValidationError, () => {
res.status(400).json(req.validationErrors()); 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) => { return new Promise((resolve, reject) => {
featureDb.getFeature(req.body.name) featureDb.getFeature(req.body.name)
.then(() => { .then(() => {

View File

@ -64,22 +64,20 @@ module.exports = function (app, config) {
createdBy: extractUser(req), createdBy: extractUser(req),
data: newStrategy, data: newStrategy,
})) }))
.then(() => { .then(() => res.status(201).end())
res.status(201).end();
})
.catch(NameExistsError, () => { .catch(NameExistsError, () => {
res.status(403).json([{ msg: `A strategy named '${req.body.name}' already exists.` }]).end(); res.status(403)
}) .json([{ msg: `A strategy named '${req.body.name}' already exists.` }])
.catch(ValidationError, () => { .end();
res.status(400).json(req.validationErrors());
}) })
.catch(ValidationError, () => res.status(400).json(req.validationErrors()))
.catch(err => { .catch(err => {
logger.error('Could not create strategy', err); logger.error('Could not create strategy', err);
res.status(500).end(); res.status(500).end();
}); });
}); });
function validateStrategyName(req) { function validateStrategyName (req) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
strategyDb.getStrategy(req.body.name) strategyDb.getStrategy(req.body.name)
.then(() => { .then(() => {

View File

@ -3,12 +3,12 @@ const fs = require('fs');
const util = require('util'); const util = require('util');
const path = require('path'); const path = require('path');
const runMigration = function(migrationPath, db, callback) { const runMigration = function (migrationPath, db, callback) {
db.runSql(fs.readFileSync(migrationPath, { encoding: 'utf8' }), callback); db.runSql(fs.readFileSync(migrationPath, { encoding: 'utf8' }), callback);
}; };
module.exports = { module.exports = {
create(name) { create (name) {
const format = path.resolve(__dirname, '../migrations/sql/%s.%s.sql'); const format = path.resolve(__dirname, '../migrations/sql/%s.%s.sql');
return { return {

View File

@ -2,7 +2,7 @@
const logger = require('./lib/logger'); const logger = require('./lib/logger');
const defaultDatabaseUri = process.env.DATABASE_URL; const defaultDatabaseUri = process.env.DATABASE_URL;
function start(options) { function start (options) {
options = options || {}; options = options || {};
const db = require('./lib/db/dbPool')(options.databaseUri || defaultDatabaseUri); const db = require('./lib/db/dbPool')(options.databaseUri || defaultDatabaseUri);

View File

@ -1,11 +1,12 @@
'use strict'; 'use strict';
function getDatabaseUri() { function getDatabaseUri () {
if (!process.env.TEST_DATABASE_URL) { if (!process.env.TEST_DATABASE_URL) {
throw new Error('please set 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 = { module.exports = {
getDatabaseUri, getDatabaseUri,
}; };

View File

@ -23,7 +23,7 @@ const app = require('../app')({
Promise.promisifyAll(request); Promise.promisifyAll(request);
request = request(app); request = request(app);
function createStrategies() { function createStrategies () {
return Promise.map([ return Promise.map([
{ {
name: 'default', name: 'default',
@ -40,7 +40,7 @@ function createStrategies() {
], strategy => strategyDb._createStrategy(strategy)); ], strategy => strategyDb._createStrategy(strategy));
} }
function createFeatures() { function createFeatures () {
return Promise.map([ return Promise.map([
{ {
name: 'featureX', name: 'featureX',
@ -96,19 +96,19 @@ function createFeatures() {
], feature => featureDb._createFeature(feature)); ], feature => featureDb._createFeature(feature));
} }
function destroyStrategies() { function destroyStrategies () {
return knex('strategies').del(); return knex('strategies').del();
} }
function destroyFeatures() { function destroyFeatures () {
return knex('features').del(); return knex('features').del();
} }
function resetDatabase() { function resetDatabase () {
return Promise.all([destroyStrategies(), destroyFeatures()]); return Promise.all([destroyStrategies(), destroyFeatures()]);
} }
function setupDatabase() { function setupDatabase () {
return Promise.all([createStrategies(), createFeatures()]); return Promise.all([createStrategies(), createFeatures()]);
} }
@ -117,7 +117,7 @@ module.exports = {
db: { db: {
reset: resetDatabase, reset: resetDatabase,
setup: setupDatabase, setup: setupDatabase,
resetAndSetup() { resetAndSetup () {
return resetDatabase().then(setupDatabase); return resetDatabase().then(setupDatabase);
}, },
}, },

View File

@ -3,7 +3,7 @@
const ReactTools = require('react-tools'); const ReactTools = require('react-tools');
module.exports = { module.exports = {
process(src) { process (src) {
return ReactTools.transform(src); return ReactTools.transform(src);
}, },
}; };

View File

@ -15,7 +15,7 @@ const UnleashApp = React.createClass({
router: React.PropTypes.func, router: React.PropTypes.func,
}, },
getInitialState() { getInitialState () {
return { return {
features: FeatureToggleStore.getFeatureToggles(), features: FeatureToggleStore.getFeatureToggles(),
strategies: StrategyStore.getStrategies(), strategies: StrategyStore.getStrategies(),
@ -23,40 +23,40 @@ const UnleashApp = React.createClass({
}; };
}, },
onFeatureToggleChange() { onFeatureToggleChange () {
this.setState({ this.setState({
features: FeatureToggleStore.getFeatureToggles(), features: FeatureToggleStore.getFeatureToggles(),
}); });
}, },
onStrategiesChange() { onStrategiesChange () {
this.setState({ this.setState({
strategies: StrategyStore.getStrategies(), strategies: StrategyStore.getStrategies(),
}); });
}, },
onArchiveChange() { onArchiveChange () {
this.setState({ this.setState({
archivedFeatures: ArchiveStore.getArchivedToggles(), archivedFeatures: ArchiveStore.getArchivedToggles(),
}); });
}, },
componentDidMount() { componentDidMount () {
this.unsubscribeFS = FeatureToggleStore.listen(this.onFeatureToggleChange); this.unsubscribeFS = FeatureToggleStore.listen(this.onFeatureToggleChange);
this.unsubscribeSS = StrategyStore.listen(this.onStrategiesChange); this.unsubscribeSS = StrategyStore.listen(this.onStrategiesChange);
this.unsubscribeAS = ArchiveStore.listen(this.onArchiveChange); this.unsubscribeAS = ArchiveStore.listen(this.onArchiveChange);
}, },
componentWillUnmount() { componentWillUnmount () {
this.unsubscribeFS(); this.unsubscribeFS();
this.unsubscribeSS(); this.unsubscribeSS();
this.unsubscribeAS(); this.unsubscribeAS();
}, },
componentWillMount() { componentWillMount () {
initalizer(30); initalizer(30);
}, },
renderLink(id, label) { renderLink (id, label) {
return ( return (
<Link to={id} className="nav-element centerify" activeClassName="nav-active"> <Link to={id} className="nav-element centerify" activeClassName="nav-active">
<span className="topbar-nav-svg-caption caption showbydefault no-break">{label}</span> <span className="topbar-nav-svg-caption caption showbydefault no-break">{label}</span>
@ -64,7 +64,7 @@ const UnleashApp = React.createClass({
); );
}, },
render() { render () {
return ( return (
<div> <div>
<Menu> <Menu>

View File

@ -14,7 +14,7 @@ describe('FeatureList', () => {
{ name: 'featureX', strategy: 'other' }, { name: 'featureX', strategy: 'other' },
{ name: 'group.featureY', strategy: 'default' }, { name: 'group.featureY', strategy: 'default' },
]; ];
const strategies=[ const strategies = [
{ name: 'default' }, { name: 'default' },
]; ];
Component = TestUtils .renderIntoDocument(<FeatureList features={features} strategies={strategies} />); Component = TestUtils .renderIntoDocument(<FeatureList features={features} strategies={strategies} />);

View File

@ -5,31 +5,31 @@ const ErrorStore = require('../stores/ErrorStore');
const ErrorActions = require('../stores/ErrorActions'); const ErrorActions = require('../stores/ErrorActions');
const ErrorMessages = React.createClass({ const ErrorMessages = React.createClass({
getInitialState() { getInitialState () {
return { return {
errors: ErrorStore.getErrors(), errors: ErrorStore.getErrors(),
}; };
}, },
onStoreChange() { onStoreChange () {
this.setState({ this.setState({
errors: ErrorStore.getErrors(), errors: ErrorStore.getErrors(),
}); });
}, },
componentDidMount() { componentDidMount () {
this.unsubscribe = ErrorStore.listen(this.onStoreChange); this.unsubscribe = ErrorStore.listen(this.onStoreChange);
}, },
componentWillUnmount() { componentWillUnmount () {
this.unsubscribe(); this.unsubscribe();
}, },
onClearErrors() { onClearErrors () {
ErrorActions.clear(); ErrorActions.clear();
}, },
render() { render () {
return ( return (
<Ui errors={this.state.errors} onClearErrors={this.onClearErrors} /> <Ui errors={this.state.errors} onClearErrors={this.onClearErrors} />
); );

View File

@ -2,7 +2,7 @@
const React = require('react'); const React = require('react');
const ErrorMessages = React.createClass({ const ErrorMessages = React.createClass({
render() { render () {
if (!this.props.errors.length) { if (!this.props.errors.length) {
return <div/>; return <div/>;
} }

View File

@ -3,7 +3,7 @@ const React = require('react');
const User = require('./User'); const User = require('./User');
const Menu = React.createClass({ const Menu = React.createClass({
render() { render () {
return ( return (
<div className="topbar mbl"> <div className="topbar mbl">
<div className="container"> <div className="container">

View File

@ -4,12 +4,12 @@ const UserStore = require('../stores/UserStore');
const User = React.createClass({ const User = React.createClass({
onSave() { onSave () {
const value = this.refs.username.getDOMNode().value.trim(); const value = this.refs.username.getDOMNode().value.trim();
UserStore.set(value); UserStore.set(value);
}, },
render() { render () {
return ( return (
<div className="r-pvm"> <div className="r-pvm">
<input type="text" placeholder="username" <input type="text" placeholder="username"

View File

@ -4,11 +4,11 @@ const FeatureActions = require('../../stores/FeatureToggleActions');
const ArchiveFeatureComponent = React.createClass({ const ArchiveFeatureComponent = React.createClass({
onRevive(item) { onRevive (item) {
FeatureActions.revive.triggerPromise(item); FeatureActions.revive.triggerPromise(item);
}, },
render() { render () {
return ( return (
<div> <div>
<h1>Archived Feature Toggles</h1> <h1>Archived Feature Toggles</h1>
@ -28,7 +28,7 @@ const ArchiveFeatureComponent = React.createClass({
); );
}, },
renderArchivedItem(f) { renderArchivedItem (f) {
return ( return (
<tr key={f.name}> <tr key={f.name}>
<td> <td>

View File

@ -5,7 +5,7 @@ const LogEntryList = require('../log/LogEntryList');
const eventStore = require('../../stores/EventStore'); const eventStore = require('../../stores/EventStore');
const Feature = React.createClass({ const Feature = React.createClass({
getInitialState() { getInitialState () {
return { return {
editMode: false, editMode: false,
showHistory: false, showHistory: false,
@ -13,33 +13,33 @@ const Feature = React.createClass({
}; };
}, },
handleEventsResponse(response) { handleEventsResponse (response) {
this.setState({ events: response }); this.setState({ events: response });
}, },
toggleHistory() { toggleHistory () {
eventStore.getEventsByName(this.props.feature.name).then(this.handleEventsResponse); eventStore.getEventsByName(this.props.feature.name).then(this.handleEventsResponse);
this.setState({ showHistory: !this.state.showHistory }); this.setState({ showHistory: !this.state.showHistory });
}, },
toggleEditMode() { toggleEditMode () {
this.setState({ editMode: !this.state.editMode }); this.setState({ editMode: !this.state.editMode });
}, },
saveFeature(feature) { saveFeature (feature) {
this.props.onChange(feature); this.props.onChange(feature);
this.toggleEditMode(); this.toggleEditMode();
}, },
archiveFeature() { archiveFeature () {
if (window.confirm(`Are you sure you want to delete ${this.props.feature.name}?`)) { // eslint-disable-line no-alert 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); this.props.onArchive(this.props.feature);
} }
}, },
renderEditMode() { renderEditMode () {
return ( return (
<tr> <tr>
<td colSpan="4" className="pan man no-border"> <td colSpan="4" className="pan man no-border">
@ -53,7 +53,7 @@ const Feature = React.createClass({
); );
}, },
render() { render () {
return ( return (
<tbody className="feature"> <tbody className="feature">
<tr className={this.state.editMode ? 'edit bg-lilac-xlt' : ''}> <tr className={this.state.editMode ? 'edit bg-lilac-xlt' : ''}>
@ -107,11 +107,11 @@ const Feature = React.createClass({
); );
}, },
renderEmptyRow() { renderEmptyRow () {
return (<tr />); return (<tr />);
}, },
renderHistory() { renderHistory () {
return (<tr> return (<tr>
<td colSpan="4" className="no-border"> <td colSpan="4" className="no-border">
<LogEntryList events={this.state.events} /> <LogEntryList events={this.state.events} />

View File

@ -3,7 +3,7 @@ const React = require('react');
const TextInput = require('../form/TextInput'); const TextInput = require('../form/TextInput');
const FeatureForm = React.createClass({ const FeatureForm = React.createClass({
getInitialState() { getInitialState () {
return { return {
strategyOptions: this.props.strategies, strategyOptions: this.props.strategies,
requiredParams: [], requiredParams: [],
@ -11,25 +11,25 @@ const FeatureForm = React.createClass({
}; };
}, },
componentWillMount() { componentWillMount () {
if (this.props.feature) { if (this.props.feature) {
this.setSelectedStrategy(this.props.feature.strategy); this.setSelectedStrategy(this.props.feature.strategy);
} }
}, },
onStrategyChange(e) { onStrategyChange (e) {
this.setSelectedStrategy(e.target.value); this.setSelectedStrategy(e.target.value);
this.setState({ currentStrategy: e.target.value }); this.setState({ currentStrategy: e.target.value });
}, },
getParameterValue(name) { getParameterValue (name) {
if (this.props.feature && this.props.feature.parameters) { if (this.props.feature && this.props.feature.parameters) {
return this.props.feature.parameters[name]; return this.props.feature.parameters[name];
} }
return ''; return '';
}, },
setSelectedStrategy(name) { setSelectedStrategy (name) {
const selectedStrategy = this.props.strategies.filter(strategy => strategy.name === name)[0]; const selectedStrategy = this.props.strategies.filter(strategy => strategy.name === name)[0];
if (selectedStrategy) { if (selectedStrategy) {
@ -42,7 +42,7 @@ const FeatureForm = React.createClass({
} }
}, },
setStrategyParams(strategy) { setStrategyParams (strategy) {
const requiredParams = []; const requiredParams = [];
let key; let key;
for (key in strategy.parametersTemplate) { for (key in strategy.parametersTemplate) {
@ -53,7 +53,7 @@ const FeatureForm = React.createClass({
this.setState({ requiredParams }); this.setState({ requiredParams });
}, },
render() { render () {
const feature = this.props.feature || { const feature = this.props.feature || {
name: '', name: '',
strategy: 'default', 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}> return this.props.strategies.map(strategy => <option key={strategy.name} value={strategy.name}>
{strategy.name} {strategy.name}
</option>); </option>);
}, },
renderStrategyProperties() { renderStrategyProperties () {
return this.state.requiredParams.map(param => <TextInput return this.state.requiredParams.map(param => <TextInput
id={`param-${param.name}`} id={`param-${param.name}`}
key={`param-${param.name}`} key={`param-${param.name}`}
@ -143,7 +143,7 @@ const FeatureForm = React.createClass({
value={param.value} />); value={param.value} />);
}, },
saveFeature(e) { saveFeature (e) {
e.preventDefault(); e.preventDefault();
const feature = { const feature = {
@ -157,12 +157,12 @@ const FeatureForm = React.createClass({
this.props.onSubmit(feature); this.props.onSubmit(feature);
}, },
cancelFeature(e) { cancelFeature (e) {
e.preventDefault(); e.preventDefault();
this.props.onCancel(); this.props.onCancel();
}, },
getParameters() { getParameters () {
const parameters = {}; const parameters = {};
this.state.requiredParams.forEach(param => { this.state.requiredParams.forEach(param => {
parameters[param.name] = this.refs[param.name].getValue(); parameters[param.name] = this.refs[param.name].getValue();

View File

@ -2,7 +2,7 @@
const React = require('react'); const React = require('react');
const Feature = require('./Feature'); const Feature = require('./Feature');
const noop = function() {}; const noop = function () {};
const FeatureList = React.createClass({ const FeatureList = React.createClass({
propTypes: { propTypes: {
@ -10,25 +10,25 @@ const FeatureList = React.createClass({
strategies: React.PropTypes.array.isRequired, strategies: React.PropTypes.array.isRequired,
}, },
getDefaultProps() { getDefaultProps () {
return { return {
onFeatureChanged: noop, onFeatureChanged: noop,
onFeatureArchive: noop, onFeatureArchive: noop,
}; };
}, },
getInitialState() { getInitialState () {
return { return {
filter: undefined, filter: undefined,
}; };
}, },
onFilterChange(e) { onFilterChange (e) {
e.preventDefault(); e.preventDefault();
this.setState({ filter: e.target.value.trim() }); this.setState({ filter: e.target.value.trim() });
}, },
filteredFeatures() { filteredFeatures () {
if (this.state.filter) { if (this.state.filter) {
const regex = new RegExp(this.state.filter, 'i'); const regex = new RegExp(this.state.filter, 'i');
@ -37,7 +37,7 @@ const FeatureList = React.createClass({
return this.props.features; return this.props.features;
}, },
render() { render () {
const featureNodes = this.filteredFeatures().map(feature => <Feature const featureNodes = this.filteredFeatures().map(feature => <Feature
key={feature.name} key={feature.name}
feature={feature} feature={feature}

View File

@ -6,35 +6,35 @@ const FeatureActions = require('../../stores/FeatureToggleActions');
const ErrorActions = require('../../stores/ErrorActions'); const ErrorActions = require('../../stores/ErrorActions');
const FeatureTogglesComponent = React.createClass({ const FeatureTogglesComponent = React.createClass({
getInitialState() { getInitialState () {
return { return {
createView: false, createView: false,
}; };
}, },
updateFeature(feature) { updateFeature (feature) {
FeatureActions.update.triggerPromise(feature); FeatureActions.update.triggerPromise(feature);
}, },
archiveFeature(feature) { archiveFeature (feature) {
FeatureActions.archive.triggerPromise(feature); FeatureActions.archive.triggerPromise(feature);
}, },
createFeature(feature) { createFeature (feature) {
FeatureActions.create.triggerPromise(feature) FeatureActions.create.triggerPromise(feature)
.then(this.cancelNewFeature); .then(this.cancelNewFeature);
}, },
newFeature() { newFeature () {
this.setState({ createView: true }); this.setState({ createView: true });
}, },
cancelNewFeature() { cancelNewFeature () {
this.setState({ createView: false }); this.setState({ createView: false });
ErrorActions.clear(); ErrorActions.clear();
}, },
render() { render () {
return ( return (
<div> <div>
@ -54,14 +54,14 @@ const FeatureTogglesComponent = React.createClass({
); );
}, },
renderCreateView() { renderCreateView () {
return (<FeatureForm return (<FeatureForm
onCancel={this.cancelNewFeature} onCancel={this.cancelNewFeature}
onSubmit={this.createFeature} onSubmit={this.createFeature}
strategies={this.props.strategies} />); strategies={this.props.strategies} />);
}, },
renderCreateButton() { renderCreateButton () {
return <button className="mal" onClick={this.newFeature}>Create feature toggle</button>; return <button className="mal" onClick={this.newFeature}>Create feature toggle</button>;
}, },
}); });

View File

@ -11,22 +11,22 @@ const TextInput = React.createClass({
required: React.PropTypes.bool, required: React.PropTypes.bool,
}, },
getDefaultProps() { getDefaultProps () {
return { return {
required: false, required: false,
}; };
}, },
getInitialState() { getInitialState () {
return {}; return {};
}, },
getValue() { getValue () {
return this.refs.input.getDOMNode().value.trim(); return this.refs.input.getDOMNode().value.trim();
}, },
render() { render () {
return ( return (
<div className="formelement required"> <div className="formelement required">
<label htmlFor={this.props.id} className="t4">{this.props.label}</label> <label htmlFor={this.props.id} className="t4">{this.props.label}</label>

View File

@ -5,24 +5,24 @@ const eventStore = require('../../stores/EventStore');
const ErrorActions = require('../../stores/ErrorActions'); const ErrorActions = require('../../stores/ErrorActions');
const LogEntriesComponent = React.createClass({ const LogEntriesComponent = React.createClass({
getInitialState() { getInitialState () {
return { return {
createView: false, createView: false,
events: [], events: [],
}; };
}, },
componentDidMount() { componentDidMount () {
eventStore.getEvents().then(res => { eventStore.getEvents().then(res => {
this.setState({ events: res.events }); this.setState({ events: res.events });
}, this.initError); }, this.initError);
}, },
initError() { initError () {
ErrorActions.error('Could not load events from server'); ErrorActions.error('Could not load events from server');
}, },
render() { render () {
return ( return (
<div> <div>
<h1>Log</h1> <h1>Log</h1>

View File

@ -21,7 +21,7 @@ const LogEntry = React.createClass({
event: React.PropTypes.object.isRequired, event: React.PropTypes.object.isRequired,
}, },
render() { render () {
const date = moment(this.props.event.createdAt); const date = moment(this.props.event.createdAt);
return ( return (
@ -41,7 +41,7 @@ const LogEntry = React.createClass({
); );
}, },
renderFullEventData() { renderFullEventData () {
const localEventData = JSON.parse(JSON.stringify(this.props.event.data)); const localEventData = JSON.parse(JSON.stringify(this.props.event.data));
delete localEventData.description; delete localEventData.description;
delete localEventData.name; delete localEventData.name;
@ -51,7 +51,7 @@ const LogEntry = React.createClass({
return (<code className="JSON smalltext man">{prettyPrinted}</code>); return (<code className="JSON smalltext man">{prettyPrinted}</code>);
}, },
renderEventDiff() { renderEventDiff () {
if (!this.props.showFullEvents && this.props.event.diffs) { if (!this.props.showFullEvents && this.props.event.diffs) {
const changes = this.props.event.diffs.map(this.buildDiff); const changes = this.props.event.diffs.map(this.buildDiff);
return ( return (
@ -61,7 +61,7 @@ const LogEntry = React.createClass({
return this.renderFullEventData(); return this.renderFullEventData();
}, },
buildDiff(diff, idx) { buildDiff (diff, idx) {
let change; let change;
const key = diff.path.join('.'); const key = diff.path.join('.');

View File

@ -7,14 +7,15 @@ const LogEntryList = React.createClass({
events: React.PropTypes.array.isRequired, events: React.PropTypes.array.isRequired,
}, },
getInitialState() { getInitialState () {
return { return {
showFullEvents: false, showFullEvents: false,
}; };
}, },
render() { render () {
const logEntryNodes = this.props.events.map(event => <LogEntry event={event} key={event.id} showFullEvents={this.state.showFullEvents} />); const logEntryNodes = this.props.events.map(event =>
<LogEntry event={event} key={event.id} showFullEvents={this.state.showFullEvents} />);
return ( return (
<div> <div>
@ -47,7 +48,7 @@ const LogEntryList = React.createClass({
); );
}, },
toggleFullEvents() { toggleFullEvents () {
this.setState({ showFullEvents: !this.state.showFullEvents }); this.setState({ showFullEvents: !this.state.showFullEvents });
}, },

View File

@ -5,30 +5,30 @@ const StrategyForm = require('./StrategyForm');
const StrategyActions = require('../../stores/StrategyActions'); const StrategyActions = require('../../stores/StrategyActions');
const StrategiesComponent = React.createClass({ const StrategiesComponent = React.createClass({
getInitialState() { getInitialState () {
return { return {
createView: false, createView: false,
}; };
}, },
onNewStrategy() { onNewStrategy () {
this.setState({ createView: true }); this.setState({ createView: true });
}, },
onCancelNewStrategy() { onCancelNewStrategy () {
this.setState({ createView: false }); this.setState({ createView: false });
}, },
onSave(strategy) { onSave (strategy) {
StrategyActions.create.triggerPromise(strategy) StrategyActions.create.triggerPromise(strategy)
.then(this.onCancelNewStrategy); .then(this.onCancelNewStrategy);
}, },
onRemove(strategy) { onRemove (strategy) {
StrategyActions.remove.triggerPromise(strategy); StrategyActions.remove.triggerPromise(strategy);
}, },
render() { render () {
return ( return (
<div> <div>
<h1>Activation Strategies</h1> <h1>Activation Strategies</h1>
@ -42,7 +42,7 @@ const StrategiesComponent = React.createClass({
); );
}, },
renderCreateView() { renderCreateView () {
return ( return (
<StrategyForm <StrategyForm
onCancelNewStrategy={this.onCancelNewStrategy} onCancelNewStrategy={this.onCancelNewStrategy}
@ -50,7 +50,7 @@ const StrategiesComponent = React.createClass({
/>); />);
}, },
renderCreateButton() { renderCreateButton () {
return ( return (
<button className="mal" onClick={this.onNewStrategy}> <button className="mal" onClick={this.onNewStrategy}>
Create strategy Create strategy

View File

@ -6,14 +6,14 @@ const Strategy = React.createClass({
strategy: React.PropTypes.object.isRequired, strategy: React.PropTypes.object.isRequired,
}, },
onRemove(event) { onRemove (event) {
event.preventDefault(); event.preventDefault();
if (window.confirm(`Are you sure you want to delete strategy '${this.props.strategy.name}'?`)) { // eslint-disable-line no-alert 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); this.props.onRemove(this.props.strategy);
} }
}, },
render() { render () {
return ( return (
<div className="line mal"> <div className="line mal">
<div className="unit"> <div className="unit">

View File

@ -4,19 +4,19 @@ const TextInput = require('../form/TextInput');
const StrategyForm = React.createClass({ const StrategyForm = React.createClass({
getDefaultProps() { getDefaultProps () {
return { return {
maxParams: 4, maxParams: 4,
}; };
}, },
getInitialState() { getInitialState () {
return { return {
parameters: [], parameters: [],
}; };
}, },
onSubmit(event) { onSubmit (event) {
event.preventDefault(); event.preventDefault();
const strategy = {}; const strategy = {};
@ -34,27 +34,27 @@ const StrategyForm = React.createClass({
this.props.onSave(strategy); this.props.onSave(strategy);
}, },
onCancel(event) { onCancel (event) {
event.preventDefault(); event.preventDefault();
this.props.onCancelNewStrategy(); this.props.onCancelNewStrategy();
}, },
onAddParam(event) { onAddParam (event) {
event.preventDefault(); event.preventDefault();
const id = this.state.parameters.length + 1; const id = this.state.parameters.length + 1;
const params = this.state.parameters.concat([{ id, name: `param_${id}`, label: `Parameter ${id}` }]); const params = this.state.parameters.concat([{ id, name: `param_${id}`, label: `Parameter ${id}` }]);
this.setState({ parameters: params }); this.setState({ parameters: params });
}, },
onRemoveParam(event) { onRemoveParam (event) {
event.preventDefault(); event.preventDefault();
const params = this.state.parameters.slice(0, -1); const params = this.state.parameters.slice(0, -1);
this.setState({ parameters: params }); this.setState({ parameters: params });
}, },
render() { render () {
return ( return (
<div className="line r-pam bg-lilac-xlt"> <div className="line r-pam bg-lilac-xlt">
<div className="unit r-size1of2"> <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}> return this.state.parameters.map(param => <div className="formelement" key={param.name}>
<label className="t4">{param.label}</label> <label className="t4">{param.label}</label>
<div className="input"> <div className="input">
@ -116,12 +116,12 @@ const StrategyForm = React.createClass({
</div>); </div>);
}, },
renderAddLink() { renderAddLink () {
if (this.state.parameters.length < this.props.maxParams) { if (this.state.parameters.length < this.props.maxParams) {
return <a href="#add" onClick={this.onAddParam}>+ Add required parameter</a>; return <a href="#add" onClick={this.onAddParam}>+ Add required parameter</a>;
} }
}, },
renderRemoveLink() { renderRemoveLink () {
if (this.state.parameters.length > 0) { if (this.state.parameters.length > 0) {
return ( return (
<div className="formelement mtn"> <div className="formelement mtn">

View File

@ -7,8 +7,9 @@ const StrategyList = React.createClass({
strategies: React.PropTypes.array.isRequired, strategies: React.PropTypes.array.isRequired,
}, },
render() { render () {
const strategyNodes = this.props.strategies.map(strategy => <Strategy strategy={strategy} key={strategy.name} onRemove={this.props.onRemove} />); const strategyNodes = this.props.strategies.map(strategy =>
<Strategy strategy={strategy} key={strategy.name} onRemove={this.props.onRemove} />);
return ( return (
<div>{strategyNodes}</div> <div>{strategyNodes}</div>
); );

View File

@ -10,35 +10,35 @@ let _archivedToggles = [];
const FeatureStore = Reflux.createStore({ const FeatureStore = Reflux.createStore({
// Initial setup // Initial setup
init() { init () {
this.listenTo(FeatureActions.initArchive.completed, this.onInit); this.listenTo(FeatureActions.initArchive.completed, this.onInit);
this.listenTo(FeatureActions.archive.completed, this.onArchive); this.listenTo(FeatureActions.archive.completed, this.onArchive);
this.listenTo(FeatureActions.revive.completed, this.onRevive); this.listenTo(FeatureActions.revive.completed, this.onRevive);
}, },
onInit(toggles) { onInit (toggles) {
_archivedToggles = toggles; _archivedToggles = toggles;
this.trigger(); this.trigger();
}, },
onArchive(feature) { onArchive (feature) {
const toggles = _archivedToggles.concat([feature]); const toggles = _archivedToggles.concat([feature]);
_archivedToggles = sortBy(toggles, 'name'); _archivedToggles = sortBy(toggles, 'name');
this.trigger(); this.trigger();
}, },
onRevive(item) { onRevive (item) {
const newStore = filter(_archivedToggles, f => f.name !== item.name); const newStore = filter(_archivedToggles, f => f.name !== item.name);
_archivedToggles = sortBy(newStore, 'name'); _archivedToggles = sortBy(newStore, 'name');
this.trigger(); this.trigger();
}, },
getArchivedToggles() { getArchivedToggles () {
return _archivedToggles; return _archivedToggles;
}, },
initStore(archivedToggles) { initStore (archivedToggles) {
_archivedToggles = archivedToggles; _archivedToggles = archivedToggles;
}, },
}); });

View File

@ -6,7 +6,7 @@ const ErrorActions = require('./ErrorActions');
// Creates a DataStore // Creates a DataStore
const FeatureStore = Reflux.createStore({ const FeatureStore = Reflux.createStore({
// Initial setup // Initial setup
init() { init () {
this.listenTo(FeatureActions.create.failed, this.onError); this.listenTo(FeatureActions.create.failed, this.onError);
this.listenTo(FeatureActions.init.failed, this.onError); this.listenTo(FeatureActions.init.failed, this.onError);
this.listenTo(FeatureActions.update.failed, this.onError); this.listenTo(FeatureActions.update.failed, this.onError);
@ -17,7 +17,7 @@ const FeatureStore = Reflux.createStore({
this.errors = []; this.errors = [];
}, },
onError(error) { onError (error) {
if (this.isClientError(error)) { if (this.isClientError(error)) {
const errors = JSON.parse(error.responseText); const errors = JSON.parse(error.responseText);
errors.forEach(e => { errors.forEach(e => {
@ -30,12 +30,12 @@ const FeatureStore = Reflux.createStore({
} }
}, },
onClear() { onClear () {
this.errors = []; this.errors = [];
this.trigger([]); this.trigger([]);
}, },
addError(msg) { addError (msg) {
const errors = this.errors; const errors = this.errors;
if (errors[errors.length - 1] !== msg) { if (errors[errors.length - 1] !== msg) {
errors.push(msg); errors.push(msg);
@ -44,7 +44,7 @@ const FeatureStore = Reflux.createStore({
} }
}, },
isClientError(error) { isClientError (error) {
try { try {
return error.status >= 400 && return error.status >= 400 &&
error.status < 500 && error.status < 500 &&
@ -61,7 +61,7 @@ const FeatureStore = Reflux.createStore({
return false; return false;
}, },
getErrors() { getErrors () {
return this.errors; return this.errors;
}, },
}); });

View File

@ -4,7 +4,7 @@ const reqwest = require('reqwest');
const TYPE = 'json'; const TYPE = 'json';
const EventStore = { const EventStore = {
getEvents() { getEvents () {
return reqwest({ return reqwest({
url: 'events', url: 'events',
method: 'get', method: 'get',
@ -12,7 +12,7 @@ const EventStore = {
}); });
}, },
getEventsByName(name) { getEventsByName (name) {
return reqwest({ return reqwest({
url: `events/${name}`, url: `events/${name}`,
method: 'get', method: 'get',

View File

@ -11,7 +11,7 @@ const FeatureToggleActions = Reflux.createActions({
revive: { asyncResult: true }, revive: { asyncResult: true },
}); });
FeatureToggleActions.init.listen(function() { FeatureToggleActions.init.listen(function () {
Server.getFeatures((error, features) => { Server.getFeatures((error, features) => {
if (error) { if (error) {
this.failed(error); this.failed(error);
@ -21,7 +21,7 @@ FeatureToggleActions.init.listen(function() {
}); });
}); });
FeatureToggleActions.initArchive.listen(function() { FeatureToggleActions.initArchive.listen(function () {
Server.getArchivedFeatures((error, archivedToggles) => { Server.getArchivedFeatures((error, archivedToggles) => {
if (error) { if (error) {
this.failed(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 => { Server.createFeature(feature, error => {
if (error) { if (error) {
this.failed(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 => { Server.updateFeature(feature, error => {
if (error) { if (error) {
this.failed(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 => { Server.archiveFeature(feature, error => {
if (error) { if (error) {
this.failed(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 => { Server.reviveFeature(feature, error => {
if (error) { if (error) {
this.failed(error); this.failed(error);

View File

@ -5,91 +5,91 @@ const TYPE = 'json';
const CONTENT_TYPE = 'application/json'; const CONTENT_TYPE = 'application/json';
const FeatureToggleServerFacade = { const FeatureToggleServerFacade = {
updateFeature(feature, cb) { updateFeature (feature, cb) {
reqwest({ reqwest({
url: `features/${feature.name}`, url: `features/${feature.name}`,
method: 'put', method: 'put',
type: TYPE, type: TYPE,
contentType: CONTENT_TYPE, contentType: CONTENT_TYPE,
data: JSON.stringify(feature), data: JSON.stringify(feature),
error(error) { error (error) {
cb(error); cb(error);
}, },
success() { success () {
cb(); cb();
}, },
}); });
}, },
createFeature(feature, cb) { createFeature (feature, cb) {
reqwest({ reqwest({
url: 'features', url: 'features',
method: 'post', method: 'post',
type: TYPE, type: TYPE,
contentType: CONTENT_TYPE, contentType: CONTENT_TYPE,
data: JSON.stringify(feature), data: JSON.stringify(feature),
error(error) { error (error) {
cb(error); cb(error);
}, },
success() { success () {
cb(); cb();
}, },
}); });
}, },
archiveFeature(feature, cb) { archiveFeature (feature, cb) {
reqwest({ reqwest({
url: `features/${feature.name}`, url: `features/${feature.name}`,
method: 'delete', method: 'delete',
type: TYPE, type: TYPE,
error(error) { error (error) {
cb(error); cb(error);
}, },
success() { success () {
cb(); cb();
}, },
}); });
}, },
getFeatures(cb) { getFeatures (cb) {
reqwest({ reqwest({
url: 'features', url: 'features',
method: 'get', method: 'get',
type: TYPE, type: TYPE,
error(error) { error (error) {
cb(error); cb(error);
}, },
success(data) { success (data) {
cb(null, data.features); cb(null, data.features);
}, },
}); });
}, },
getArchivedFeatures(cb) { getArchivedFeatures (cb) {
reqwest({ reqwest({
url: 'archive/features', url: 'archive/features',
method: 'get', method: 'get',
type: TYPE, type: TYPE,
error(error) { error (error) {
cb(error); cb(error);
}, },
success(data) { success (data) {
cb(null, data.features); cb(null, data.features);
}, },
}); });
}, },
reviveFeature(feature, cb) { reviveFeature (feature, cb) {
reqwest({ reqwest({
url: 'archive/revive', url: 'archive/revive',
method: 'post', method: 'post',
type: TYPE, type: TYPE,
contentType: CONTENT_TYPE, contentType: CONTENT_TYPE,
data: JSON.stringify(feature), data: JSON.stringify(feature),
error(error) { error (error) {
cb(error); cb(error);
}, },
success() { success () {
cb(); cb();
}, },
}); });

View File

@ -10,7 +10,7 @@ let _featureToggles = [];
const FeatureStore = Reflux.createStore({ const FeatureStore = Reflux.createStore({
// Initial setup // Initial setup
init() { init () {
this.listenTo(FeatureActions.init.completed, this.setToggles); this.listenTo(FeatureActions.init.completed, this.setToggles);
this.listenTo(FeatureActions.create.completed, this.onCreate); this.listenTo(FeatureActions.create.completed, this.onCreate);
this.listenTo(FeatureActions.update.completed, this.onUpdate); this.listenTo(FeatureActions.update.completed, this.onUpdate);
@ -18,37 +18,37 @@ const FeatureStore = Reflux.createStore({
this.listenTo(FeatureActions.revive.completed, this.onRevive); this.listenTo(FeatureActions.revive.completed, this.onRevive);
}, },
onCreate(feature) { onCreate (feature) {
this.setToggles([feature].concat(_featureToggles)); this.setToggles([feature].concat(_featureToggles));
}, },
setToggles(toggles) { setToggles (toggles) {
_featureToggles = sortBy(toggles, 'name'); _featureToggles = sortBy(toggles, 'name');
this.trigger(); this.trigger();
}, },
onUpdate(feature) { onUpdate (feature) {
const idx = findIndex(_featureToggles, 'name', feature.name); const idx = findIndex(_featureToggles, 'name', feature.name);
_featureToggles[idx] = feature; _featureToggles[idx] = feature;
this.trigger(); this.trigger();
}, },
onArchive(feature) { onArchive (feature) {
const featureToggles = filter(_featureToggles, item => item.name !== feature.name); const featureToggles = filter(_featureToggles, item => item.name !== feature.name);
this.setToggles(featureToggles); this.setToggles(featureToggles);
this.trigger(); this.trigger();
}, },
onRevive(item) { onRevive (item) {
this.setToggles(_featureToggles.concat([item])); this.setToggles(_featureToggles.concat([item]));
this.trigger(); this.trigger();
}, },
getFeatureToggles() { getFeatureToggles () {
return _featureToggles; return _featureToggles;
}, },
initStore(toggles) { initStore (toggles) {
_featureToggles = toggles; _featureToggles = toggles;
}, },
}); });

View File

@ -5,45 +5,45 @@ const TYPE = 'json';
const CONTENT_TYPE = 'application/json'; const CONTENT_TYPE = 'application/json';
const StrategyAPI = { const StrategyAPI = {
createStrategy(strategy, cb) { createStrategy (strategy, cb) {
reqwest({ reqwest({
url: 'strategies', url: 'strategies',
method: 'post', method: 'post',
type: TYPE, type: TYPE,
contentType: CONTENT_TYPE, contentType: CONTENT_TYPE,
data: JSON.stringify(strategy), data: JSON.stringify(strategy),
error(error) { error (error) {
cb(error); cb(error);
}, },
success() { success () {
cb(null, strategy); cb(null, strategy);
}, },
}); });
}, },
removeStrategy(strategy, cb) { removeStrategy (strategy, cb) {
reqwest({ reqwest({
url: `strategies/${strategy.name}`, url: `strategies/${strategy.name}`,
method: 'delete', method: 'delete',
type: TYPE, type: TYPE,
error(error) { error (error) {
cb(error); cb(error);
}, },
success() { success () {
cb(null, strategy); cb(null, strategy);
}, },
}); });
}, },
getStrategies(cb) { getStrategies (cb) {
reqwest({ reqwest({
url: 'strategies', url: 'strategies',
method: 'get', method: 'get',
type: TYPE, type: TYPE,
error(error) { error (error) {
cb(error); cb(error);
}, },
success(data) { success (data) {
cb(null, data.strategies); cb(null, data.strategies);
}, },
}); });

View File

@ -8,7 +8,7 @@ const StrategyActions = Reflux.createActions({
remove: { asyncResult: true }, remove: { asyncResult: true },
}); });
StrategyActions.init.listen(function() { StrategyActions.init.listen(function () {
StrategyAPI.getStrategies((err, strategies) => { StrategyAPI.getStrategies((err, strategies) => {
if (err) { if (err) {
this.failed(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 => { StrategyAPI.createStrategy(feature, err => {
if (err) { if (err) {
this.failed(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 => { StrategyAPI.removeStrategy(feature, err => {
if (err) { if (err) {
this.failed(err); this.failed(err);

View File

@ -9,31 +9,31 @@ let _strategies = [];
const StrategyStore = Reflux.createStore({ const StrategyStore = Reflux.createStore({
// Initial setup // Initial setup
init() { init () {
this.listenTo(StrategyActions.init.completed, this.setStrategies); this.listenTo(StrategyActions.init.completed, this.setStrategies);
this.listenTo(StrategyActions.create.completed, this.onCreate); this.listenTo(StrategyActions.create.completed, this.onCreate);
this.listenTo(StrategyActions.remove.completed, this.onRemove); this.listenTo(StrategyActions.remove.completed, this.onRemove);
}, },
onCreate(strategy) { onCreate (strategy) {
this.setStrategies(_strategies.concat([strategy])); this.setStrategies(_strategies.concat([strategy]));
}, },
onRemove(strategy) { onRemove (strategy) {
const strategies = filter(_strategies, item => item.name !== strategy.name); const strategies = filter(_strategies, item => item.name !== strategy.name);
this.setStrategies(strategies); this.setStrategies(strategies);
}, },
setStrategies(strategies) { setStrategies (strategies) {
_strategies = strategies; _strategies = strategies;
this.trigger(_strategies); this.trigger(_strategies);
}, },
getStrategies() { getStrategies () {
return _strategies; return _strategies;
}, },
initStore(strategies) { initStore (strategies) {
_strategies = strategies; _strategies = strategies;
}, },
}); });

View File

@ -2,12 +2,12 @@
let _username; let _username;
// Ref: http://stackoverflow.com/questions/10730362/get-cookie-by-name // Ref: http://stackoverflow.com/questions/10730362/get-cookie-by-name
function readCookie(name) { function readCookie (name) {
const nameEQ = `${name}=`; const nameEQ = `${name}=`;
const ca = document.cookie.split(';'); 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]; 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); c = c.substring(1, c.length);
} }
if (c.indexOf(nameEQ) === 0) { if (c.indexOf(nameEQ) === 0) {
@ -18,16 +18,16 @@ function readCookie(name) {
} }
const UserStore = { const UserStore = {
init() { init () {
_username = readCookie('username'); _username = readCookie('username');
}, },
set(username) { set (username) {
_username=username; _username = username;
document.cookie=`username=${_username}; expires=Thu, 18 Dec 2099 12:00:00 UTC`; document.cookie = `username=${_username}; expires=Thu, 18 Dec 2099 12:00:00 UTC`;
}, },
get() { get () {
return _username; return _username;
}, },
}; };

View File

@ -5,14 +5,14 @@ const Timer = require('../utils/Timer');
let _timer; let _timer;
function load() { function load () {
FeatureToggleActions.init.triggerPromise(); FeatureToggleActions.init.triggerPromise();
StrategyActions.init.triggerPromise(); StrategyActions.init.triggerPromise();
FeatureToggleActions.initArchive.triggerPromise(); FeatureToggleActions.initArchive.triggerPromise();
} }
module.exports = function(pollInterval) { module.exports = function (pollInterval) {
const intervall = pollInterval || 30; const intervall = pollInterval || 30;
_timer = new Timer(load, intervall*1000); _timer = new Timer(load, intervall * 1000);
_timer.start(); _timer.start();
}; };

View File

@ -1,11 +1,11 @@
'use strict'; 'use strict';
const Timer = function(cb, interval) { const Timer = function (cb, interval) {
this.cb = cb; this.cb = cb;
this.interval = interval; this.interval = interval;
this.timerId = null; this.timerId = null;
}; };
Timer.prototype.start = function() { Timer.prototype.start = function () {
if (this.timerId != null) { if (this.timerId != null) {
console.warn('timer already started'); // eslint-disable-line no-console console.warn('timer already started'); // eslint-disable-line no-console
} }
@ -15,7 +15,7 @@ Timer.prototype.start = function() {
this.cb(); this.cb();
}; };
Timer.prototype.stop = function() { Timer.prototype.stop = function () {
if (this.timerId == null) { if (this.timerId == null) {
console.warn('no timer running'); // eslint-disable-line no-console console.warn('no timer running'); // eslint-disable-line no-console
} else { } else {