mirror of
https://github.com/Unleash/unleash.git
synced 2025-05-31 01:16:01 +02:00
Fix eslint complaining
This commit is contained in:
parent
1e6c6104d7
commit
5c13ea5d7b
@ -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