);
- }
+ },
+
+ selectTheFirst() {
+ // TODO: This ties into the DOM, which is not really best practice. Think about a way to solve this without having to do other hacky magic.
+ React.findDOMNode(this).querySelector('a').click();
+ },
});
export default SideBar;
diff --git a/src/SideBar/SideBarContainer.component.js b/src/SideBar/SideBarContainer.component.js
index 3990b7a28..66971a376 100644
--- a/src/SideBar/SideBarContainer.component.js
+++ b/src/SideBar/SideBarContainer.component.js
@@ -1,16 +1,21 @@
import React from 'react';
-import {State, Link} from 'react-router';
-
+import {State, Navigation} from 'react-router';
import sideBarItemsStore from './sideBarItems.store';
-
import SideBar from './SideBar.component';
+import {config} from 'd2';
+import Translate from 'd2-ui/i18n/Translate.mixin';
+import {camelCaseToUnderscores} from 'd2-utils';
+
+config.i18n.strings.add('maintenance');
+config.i18n.strings.add('filter_menu_items_by_name');
+config.i18n.strings.add('enter_to_go_to_first');
-let SideBarContainer = React.createClass({
- mixins: [State],
+const SideBarContainer = React.createClass({
+ mixins: [State, Navigation, Translate],
getInitialState() {
return {
- sideBarItems: []
+ sideBarItems: [],
};
},
@@ -22,20 +27,34 @@ let SideBarContainer = React.createClass({
});
},
- filterChildren(searchString, child) {
- //Both values are transformed to lowercase so we can do case insensitive search
- return child.props.params.modelType.toLowerCase().indexOf(searchString.toLowerCase()) >= 0;
- },
-
render() {
+ const items = this.state.sideBarItems
+ .map(listItem => {
+ return {
+ primaryText: this.getTranslation(camelCaseToUnderscores(listItem)),
+ secondaryText: this.getTranslation(`intro_${camelCaseToUnderscores(listItem)}`),
+ secondaryTextLines: 2,
+ modelType: listItem,
+ isActive: this.isActive('list', {modelType: listItem}),
+ onClick: function onClick() {
+ this.transitionTo('list', {modelType: listItem});
+ }.bind(this),
+ };
+ });
+
return (
-
- {this.state.sideBarItems.map(modelType => {
- return ({modelType});
- })}
-
+
);
- }
+ },
+
+ filterChildren(searchString, child) {
+ // Both values are transformed to lowercase so we can do case insensitive search
+ return child.toLowerCase().indexOf(searchString.toLowerCase()) >= 0;
+ },
});
export default SideBarContainer;
diff --git a/src/SideBar/sideBarItems.store.js b/src/SideBar/sideBarItems.store.js
index dfa91d7b0..60ac0fa3e 100644
--- a/src/SideBar/sideBarItems.store.js
+++ b/src/SideBar/sideBarItems.store.js
@@ -1,12 +1,30 @@
import Store from 'd2-flux/store/Store';
-import d2 from '../utils/d2';
+import {getInstance as getD2} from 'd2';
const sideBarItemsStore = Store.create();
+const isInPredefinedList = (name) => {
+ return [
+ 'dataElement',
+ 'dataElementGroup',
+ 'dataElementGroupSet',
+ 'categoryOptionCombo',
+ 'categoryOption',
+ 'category',
+ 'categoryCombo',
+ 'categoryOptionGroup',
+ 'categoryOptionGroupSet',
+ 'indicator',
+ 'indicatorType',
+ 'indicatorGroup',
+ 'indicatorGroupSet',
+ ].indexOf(name) >= 0;
+};
-d2.then((d2) => {
- const sideBarItems = d2.models.mapThroughDefinitions(definition => {
- return definition.name;
- }).sort();
+getD2().then((d2) => {
+ const sideBarItems = d2.models
+ .mapThroughDefinitions(definition => definition.name)
+ .sort()
+ .filter(isInPredefinedList);
sideBarItemsStore.setState(sideBarItems);
});
diff --git a/src/Snackbar/SnackbarContainer.component.js b/src/Snackbar/SnackbarContainer.component.js
new file mode 100644
index 000000000..31fa56fac
--- /dev/null
+++ b/src/Snackbar/SnackbarContainer.component.js
@@ -0,0 +1,50 @@
+import React from 'react';
+import Snackbar from 'material-ui/lib/snackbar';
+import snackStore from './snack.store';
+import ObserverRegistry from '../utils/ObserverRegistry.mixin';
+
+const SnackBarContainer = React.createClass({
+ mixins: [ObserverRegistry],
+
+ getInitialState() {
+ return {};
+ },
+
+ componentWillMount() {
+ const snackStoreDisposable = snackStore.subscribe(snack => {
+ console.log('Show!');
+
+ if (snack) {
+ this.setState({
+ snack: snack,
+ }, () => {
+ this.refs.snackbar.show();
+ });
+ } else {
+ this.refs.snackbar.dismiss();
+ }
+ }, console.log.bind(console));
+
+ this.registerDisposable(snackStoreDisposable);
+ },
+
+ render() {
+ console.log(this.state.snack);
+ if (!this.state.snack) {
+ return null;
+ }
+
+ return (
+
+ );
+ },
+});
+
+export default SnackBarContainer;
diff --git a/src/Snackbar/snack.actions.js b/src/Snackbar/snack.actions.js
new file mode 100644
index 000000000..dc58ea36a
--- /dev/null
+++ b/src/Snackbar/snack.actions.js
@@ -0,0 +1,23 @@
+import Action from 'd2-flux/action/Action';
+import snackStore from './snack.store';
+
+const snackActions = Action.createActionsFromNames(['show', 'hide']);
+
+snackActions.show.subscribe(actionConfig => {
+ const {message, action, autoHideDuration, onActionTouchTap} = actionConfig.data;
+
+ snackStore.setState({
+ message,
+ action: action || 'dismiss',
+ autoHideDuration,
+ onActionTouchTap: onActionTouchTap || (() => {
+ snackActions.hide();
+ }),
+ });
+});
+
+snackActions.hide.subscribe(() => {
+ snackStore.setState(null);
+});
+
+export default snackActions;
diff --git a/src/Snackbar/snack.store.js b/src/Snackbar/snack.store.js
new file mode 100644
index 000000000..9923850d2
--- /dev/null
+++ b/src/Snackbar/snack.store.js
@@ -0,0 +1,3 @@
+import Store from 'd2-flux/store/Store';
+
+export default Store.create();
diff --git a/src/config/field-config/field-order.js b/src/config/field-config/field-order.js
index 308bed6a2..d6da365f1 100644
--- a/src/config/field-config/field-order.js
+++ b/src/config/field-config/field-order.js
@@ -1,4 +1,4 @@
-let fieldOrderByName = new Map([
+const fieldOrderByName = new Map([
['dataElement', [
'name', 'code', 'shortName', 'description', 'formName', 'domainType', 'type', 'numberType', 'textType', 'aggregationOperator',
'zeroIsSignificant', 'url', 'categoryCombo', 'optionSet', 'commentOptionSet', 'legendSet', 'aggregationLevels', 'data']],
@@ -9,7 +9,7 @@ let fieldOrderByName = new Map([
['indicator', ['name', 'shortName', 'code', 'description', 'annualized', 'decimals', 'indicatorType', 'legendSet', 'url']],
['indicatorGroup', ['name', 'indicators']],
['indicatorType', ['name', 'factor', 'number']],
- ['indicatorGroupSet', ['name', 'description', 'compulsory', 'indicatorGroups']]
+ ['indicatorGroupSet', ['name', 'description', 'compulsory', 'indicatorGroups']],
]);
export default {
@@ -32,5 +32,5 @@ export default {
return fieldOrderByName.get(schemaName);
}
return ['name', 'shortName', 'code'];
- }
+ },
};
diff --git a/src/config/field-config/header-fields.js b/src/config/field-config/header-fields.js
index 65667ec10..dea6f7afa 100644
--- a/src/config/field-config/header-fields.js
+++ b/src/config/field-config/header-fields.js
@@ -1,8 +1,8 @@
-let headerFieldsMap = new Map([
+const headerFieldsMap = new Map([
['dataElementGroupSet', ['name', 'code']],
['categoryOptionCombo', ['name', 'code']],
['category', ['name', 'code']],
- ['categoryCombo', ['name', 'code']]
+ ['categoryCombo', ['name', 'code']],
]);
export default {
@@ -18,5 +18,5 @@ export default {
return headerFieldsMap.get(schemaName);
}
return ['name', 'shortName'];
- }
+ },
};
diff --git a/src/config/field-overrides/dataElement.js b/src/config/field-overrides/dataElement.js
index 5419586fa..27e5efc69 100644
--- a/src/config/field-overrides/dataElement.js
+++ b/src/config/field-overrides/dataElement.js
@@ -1,20 +1,19 @@
import {SELECT, MULTISELECT} from 'd2-ui-basicfields/fields';
-import d2 from '../../utils/d2';
+import {getInstance as getD2} from 'd2';
+
+const organisationUnitLevelsPromise = getD2()
+ .then(d2 => d2.models.organisationUnitLevel.list());
+
+const organisationUnitLevelsMapPromise = organisationUnitLevelsPromise
+ .then(collection => {
+ return new Map(collection
+ .toArray()
+ .map(value => {
+ return [value.level, value.name];
+ }));
+ });
export default new Map([
- ['type', {
- type: SELECT,
- templateOptions: {
- options: [
- 'int',
- 'string',
- 'bool',
- 'trueOnly',
- 'date',
- 'username'
- ]
- }
- }],
['aggregationOperator', {
type: SELECT,
templateOptions: {
@@ -26,57 +25,34 @@ export default new Map([
'stddev',
'variance',
'min',
- 'max'
- ]
- },
- hide: model => (['bool', 'trueOnly', 'int'].indexOf(model.type)) === -1
- }],
- ['numberType', {
- type: SELECT,
- templateOptions: {
- options: [
- 'number',
- 'int',
- 'posInt',
- 'negInt',
- 'zeroPositiveInt',
- 'unitInterval',
- 'percentage'
- ]
- },
- hide: (model) => model.type !== 'int'
- }],
- ['textType', {
- type: SELECT,
- templateOptions: {
- options: [
- 'text',
- 'longText'
- ]
+ 'max',
+ ],
},
- hide: (model) => model.type !== 'string'
}],
['aggregationLevels', {
type: MULTISELECT,
source() {
- return d2.then(d2 => {
- return d2.models.organisationUnitLevel.list()
- .then(collection => {
- return collection.toArray()
- .map(item => {
- return {
- name: item.name,
- id: item.level
- };
- });
- });
- });
+ return organisationUnitLevelsPromise
+ .then(collection => {
+ return collection.toArray()
+ .map(item => {
+ return {
+ name: item.name,
+ id: item.level,
+ };
+ });
+ });
},
fromModelTransformer(modelValue) {
- console.log(modelValue);
- return {
- id: modelValue
- };
+ return organisationUnitLevelsMapPromise
+ .then(organisationUnitLevelsMap => {
+ if (organisationUnitLevelsMap.has(modelValue)) {
+ return {
+ name: organisationUnitLevelsMap.get(modelValue),
+ id: modelValue,
+ };
+ }
+ });
},
toModelTransformer(object) {
return parseInt(object.id, 10);
diff --git a/src/config/field-overrides/index.js b/src/config/field-overrides/index.js
index e574d0370..ab9af80cc 100644
--- a/src/config/field-overrides/index.js
+++ b/src/config/field-overrides/index.js
@@ -1,7 +1,9 @@
import dataElement from './dataElement';
+import indicator from './indicator';
-let overridesByType = {
- dataElement
+const overridesByType = {
+ dataElement,
+ indicator,
};
export default {
@@ -21,8 +23,8 @@ export default {
*/
for(schemaName) {
if (schemaName && overridesByType[schemaName]) {
- return overridesByType[schemaName]
+ return overridesByType[schemaName];
}
return new Map();
- }
+ },
};
diff --git a/src/config/field-overrides/indicator.js b/src/config/field-overrides/indicator.js
new file mode 100644
index 000000000..622921ef0
--- /dev/null
+++ b/src/config/field-overrides/indicator.js
@@ -0,0 +1,14 @@
+export default new Map([
+ ['numerator', {
+ hide: () => true,
+ }],
+ ['numeratorDescription', {
+ hide: () => true,
+ }],
+ ['denominator', {
+ hide: () => true,
+ }],
+ ['denominatorDescription', {
+ hide: () => true,
+ }],
+]);
diff --git a/src/i18n/i18n_global.properties b/src/i18n/i18n_global.properties
new file mode 100644
index 000000000..bbd0e6cff
--- /dev/null
+++ b/src/i18n/i18n_global.properties
@@ -0,0 +1,231 @@
+indicator_type=Indicator Type
+aggregate=Aggregate
+tracker=Tracker
+no_option_assigned=Use of category with an empty option is not allowed!
+number_of_category_options=Number of category options
+number_of_categories=Number of categories
+sort=Sort
+create_new_data_element_category=Create new data element category
+selected_categories=Selected categories
+available_categories=Available categories
+category=Category
+category_option=Category Option
+data_element_category_management=Data element category management
+data_element_category_combo_management=Data element category combination management
+create_new_data_element_category_combo=Create new data element category combination
+confirm_delete_data_element_category_option=Are you sure you want to delete this data element category option?
+confirm_delete_data_element_category=Are you sure you want to delete this data element category?
+confirm_delete_data_element_category_combo=Are you sure you want to delete this data element category combo?
+edit_data_element_category=Edit data element category
+edit_data_element_category_combo=Edit data element category combination
+category_combination=Category Combination
+data_element_category_combo_details=Data element category combo details
+category_combo=Combination of categories
+data_element_category=Data Element Category
+data_element_category_combo=Data Element Category Combination
+select=Select
+data_element=Data Element
+data_element_group=Data Element Group
+data_element_groups=Data Element Groups
+data_elements=Data elements
+indicator=Indicator
+indicator_group=Indicator Group
+indicator_groups=Indicator Groups
+create_new_data_element=Create new data element
+domain_type=Domain Type
+create_new_data_element_group=Create new data element group
+group_members=Group members
+available_data_elements=Available data elements
+create_new_indicator=Create new indicator
+create_new_indicator_group=Create new indicator group
+available_indicators=Available indicators
+create_new_indicator_type=Create new indicator type
+factor=Factor
+data_element_management=Data element management
+data_element_group_management=Data element group management
+number_of_members=Number of members
+export=Export
+import=Import
+indicator_management=Indicator management
+indicator_group_management=Indicator group management
+indicator_type_management=Indicator type management
+edit_data_element=Edit data element
+edit_data_element_group=Edit data element group
+edit_indicator=Edit indicator
+edit_indicator_group=Edit indicator group
+edit_indicator_type=Edit indicator type
+edit_numerator=Edit numerator
+edit_denominator=Edit denominator
+confirm_delete_data_element=Are you sure you want to delete this data element?
+confirm_delete_data_element_group=Are you sure you want to delete this data element group?
+confirm_delete_indicator=Are you sure you want to delete this indicator?
+confirm_delete_indicator_group=Are you sure you want to delete this indicator group?
+confirm_delete_indicator_type=Are you sure you want to delete this indicator type?
+confirm_delete_data_dictionary=Are you sure you want to delete this data dictionary?
+everything_is_ok=Everything is OK
+adding_data_element_group_failed=Adding the data element group failed with the following message
+saving_data_element_group_failed=Saving the data element group failed with the following message
+adding_indicator_failed=Adding the indicator failed with the following message
+saving_indicator_failed=Saving the indicator failed with the following message
+adding_indicator_group_failed=Adding the indicator group failed with the following message
+saving_indicator_group_failed=Saving the indicator group failed with the following message
+adding_indicator_type_failed=Adding the indicator type failed with the following message
+saving_indicator_type_failed=Saving the indicator type failed with the following message
+calculated=Calculated
+available_dataelements=Available Data Elements
+selected_dataelements=Selected Data Elements
+add_selected=Add selected
+remove_all=Remove all
+create_new_data_dictionary=Create new data dictionary
+region=Region
+select_domain_type=Select domain type
+current=Current
+date=Date
+selected_data_elements=Selected data elements
+selected_indicators=Selected indicators
+available_indicators=Available indicators
+item_deleted_successfully=Item deleted successfully
+value=Value
+confirm_delete_indicator=Do you want to delete indicator?
+adding_indicator_failed=Adding indicator failed
+saving_indicator_failed=Saving indicator failed
+translation_translate=Translate
+select_indicator=Please select indicator
+object_not_deleted_associated_by_objects=Object not deleted because it is associated by objects of type
+hide_warning=Hide warning
+update_dataelement_group_members=Update Data Element Group Member
+update_success=Update was successful
+member_of=Member of
+data_element_group_editor=Data Element Group Editor
+move_up=Move up
+move_down=Move down
+move_to_top=Move to top
+move_to_bottom=Move to bottom
+indicator_sort_order=Indicator sort order
+data_element_sort_order=Data element sort order
+indicator_group_editor=Indicator Group Editor
+update_indicator_group_member=Update Indicator Member
+factor_cannot_be_zero=Factor cannot be zero
+url=URL
+aggregation_levels=Aggregation levels
+available_aggregation_levels=Available aggregation levels
+selected_aggregation_levels=Selected aggregation levels
+remove_selected=Remove selected
+category_options=Category options
+add_category_option=Add category option
+must_include_category_option=Please include one or more category options
+specify_category_option_name=Please specify a category option name
+category_option_name_already_exists=The category option name already exists
+data_element_group_set=Data Element Group Set
+indicator_group_set=Indicator Group Set
+name_aldready_exists=Name already exists !
+available_dataelementgroup=Available Data Element Groups
+selected_dataelementgroup=Selected Data Element Groups
+add_dataelementgroupset=Add Data Element Group Set
+update_dataelementgroupset=Update Data Element Group Set
+add_indicatorgroupset=Add Indicator Group Set
+update_indicatorgroupset=Update Indicator Group Set
+available_indicatorgroup=Available Indicator Groups
+selected_indicatorgroup=Selected Indicator Groups
+last_updated=Last updated
+dataelement_id_not_numeric=Data element identifier must be a number
+category_option_combo_id_not_numeric=Category option combo identifier must be a number
+data_element_does_not_exist=Identifier does not reference a data element
+category_option_combo_does_not_exist=Identifier does not reference a category option combo
+expression_not_well_formed=Expression is not well formed
+intro_data_element=Create, modify, view and delete data elements. Data elements are phenomena for which will be captured and analyzed.
+intro_data_element_group=Create, modify, view and delete data element groups. Groups are used for improved analysis.
+intro_data_element_group_editor=Easily add or remove data elements to and from data element groups, as well as deleted data elements.
+intro_data_element_group_set=Create, modify, view and delete data element group sets. Group sets are used for improved analysis.
+intro_category_option=Create, modify, view and delete data element category options. Category options are options with in category.
+intro_category=Create, modify, view and delete data element categories. Categories are used for disaggregation of data elements.
+intro_category_combo=Create, modify, view and delete data element category combinations.
+intro_category_option_group=Create, modify, view and delete category option groups, which can be used to classify category options.
+intro_category_option_group_set=Create, modify, view and delete category option group sets, which can be used for improved data analysis.
+intro_indicator=Create, modify, view and delete indicators. An indicator is a formula consisting of data elements and numbers.
+intro_indicator_type=Create, modify, view and delete indicator types. An indicator type is a factor for an indicator, like percentage.
+intro_indicator_group=Create, modify, view and delete indicator groups. Groups are used for improved analysis.
+intro_indicator_group_editor=Easily add or remove indicators to and from indicator groups, as well as delete indicators.
+intro_indicator_group_set=Create, modify, view and delete indicator group sets. Group sets are used for improved analysis.
+intro_data_dictionary=Create, modify, view and delete data dictionaries. A data dictionary is a set of meta-data.
+intro_concept=Create, modify, view and delete concepts. A concept can be used by a category.
+available_data_element_group_sets=Available data element group sets
+selected_data_element_group_sets=Selected data element group sets
+concept_name=Concept name
+available_groups=Available Groups
+selected_groups=Selected Groups
+assign_groups_for_dataelement=Assign Groups for Data Element
+select_dataelement=Please select data element
+option_rename_successfully=Category option renamed successfully
+create_new_concept=Create new concept
+edit_concept=Edit concept
+concept_name=Concept name
+confirm_delete_concept=Are you sure you want to delete this concept?
+adding_concept_failed=Adding concept failed
+saving_concept_failed=Saving concept failed
+regex_add_edit_concept=Enter alphabet (a-z A-Z), number (0-9) and underscore (_) characters only.
+concept_management=Concept management
+concept=Concept
+selected_name=Selected name
+update_category_option=Update category option
+move_selected=Move selected
+number_value_type=Number type
+number=Number
+int=Integer
+view_1=View 1
+view_2=View 2
+store_zero_data_values=Store zero data values
+form_name=Form name
+compulsory=Compulsory
+data_dimension=Data Dimension
+select_group=Select group
+option_set=Option set
+please_select=Please select
+formula=Formula
+legend_set=Legend set
+skip_total_in_reports=Skip category total in reports
+data_element_category_option = Data Element Category Option
+data_element_category_option_management = Data element category option management
+data_element_category_option_combination_management = Data element category option combination management
+create_new_data_element_category_option=Create new data element category option
+edit_data_element_category_option=Edit data element category option
+available_category_options=Available category options
+selected_category_options=Selected category options
+use_as_data_dimension=Use as data dimension
+tip=Tip
+use=use
+dimension_type=Dimension type
+disaggregation=Disaggregation
+attribute=Attribute
+option_set_for_data_values=Option set for data values
+option_set_for_comments=Option set for comments
+organisation_unit_counts=Organisation unit counts
+category_option=Category Option
+category=Category
+category_combo=Category Combination
+category_option_group = Category Option Group
+category_option_group_management = Category option group management
+create_new_category_option_group = Create new category option group
+edit_category_option_group = Edit category option group
+confirm_delete_category_option_group = Are you sure you want to delete this category option group?
+category_option_group_set = Category Option Group Set
+category_option_group_set_management = Category option group set management
+create_new_category_option_group_set = Create new category option group set
+edit_category_option_group_set = Edit category option group set
+available_category_option_groups = Available category option groups
+selected_category_option_groups = Selected category option groups
+confirm_delete_category_option_group_set = Are you sure you want to delete this category option group set?
+show_more_options=Show more options
+show_fewer_options=Show fewer options
+id=Id
+min=Min
+max=Max
+category_option_combo = Category Option Combination
+intro_category_option_combo = View and edit data element category option combinations. Category option combinations are break-downs of category.
+edit_data_element_category_option_combo = Edit data element category option combo
+average_sum_in_org_unit_hierarchy=Average (sum in org unit hierarchy)
+approve_data=Approve data
+decimals_in_data_output=Decimals in data output
+categories = Categories
+ignore_data_approval=Ignore data approval
+data_dimension_type=Data dimension type
diff --git a/src/index.html b/src/index.html
index 92e81ceab..96a5bbd12 100644
--- a/src/index.html
+++ b/src/index.html
@@ -6,7 +6,6 @@
-
@@ -27,14 +26,14 @@
-
+
diff --git a/src/maintenance.js b/src/maintenance.js
index ec18ef125..1982e4014 100644
--- a/src/maintenance.js
+++ b/src/maintenance.js
@@ -1,22 +1,11 @@
import React from 'react';
import Router from 'react-router';
-import {Route, RouteHandler, DefaultRoute, Navigation} from 'react-router';
-import App from './App/App.component';
-import List from './List/List.component';
-import EditModelForm from './EditModel/EditModel.component';
import Action from 'd2-flux/action/Action';
+import router from './router';
const routeActions = Action.createActionsFromNames(['transition']);
-// declare our routes and their hierarchy
-const routes = (
-
-
-
-
-);
-
-Router.run(routes, Router.HashLocation, (Root) => {
+router.run((Root) => {
React.render(, document.getElementById('app'));
routeActions.transition(Router.HashLocation.getCurrentPath());
});
diff --git a/src/maintenance.scss b/src/maintenance.scss
deleted file mode 100644
index 70fbe83f9..000000000
--- a/src/maintenance.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import 'normalize';
-@import 'susy';
diff --git a/src/router.js b/src/router.js
new file mode 100644
index 000000000..2f59f15c9
--- /dev/null
+++ b/src/router.js
@@ -0,0 +1,23 @@
+import React from 'react';
+import Router from 'react-router';
+import {Route} from 'react-router';
+import App from './App/App.component';
+import List from './List/List.component';
+import EditModelContainer from './EditModel/EditModelContainer.component';
+import CloneModelContainer from './EditModel/CloneModelContainer.component';
+
+const routes = (
+
+
+
+
+
+);
+
+// we can create a router instance before "running" it
+const router = Router.create({
+ routes: routes,
+ location: Router.HashLocation,
+});
+
+module.exports = router;
diff --git a/src/utils/ObservedEvents.mixin.js b/src/utils/ObservedEvents.mixin.js
index 84e0e54ea..1d3f8078f 100644
--- a/src/utils/ObservedEvents.mixin.js
+++ b/src/utils/ObservedEvents.mixin.js
@@ -1,11 +1,7 @@
-'use strict';
-
-import React from 'react';
-import {Subject, Observable} from 'rx/dist/rx.all';
-
+import {Subject} from 'rx/dist/rx.all';
import log from 'loglevel';
-let ObservedEvents = {
+const ObservedEvents = {
getInitialState() {
this.events = {};
this.eventSubjects = {};
@@ -13,10 +9,10 @@ let ObservedEvents = {
return {};
},
- createEventObserver: function () {
- let subjectMap = new Map();
+ createEventObserver: (function createEventObserver() {
+ const subjectMap = new Map();
- return function (referenceName) {
+ return function ObservedEventHandler(referenceName) {
let subject;
if (!subjectMap.has(referenceName)) {
@@ -27,23 +23,23 @@ let ObservedEvents = {
}
if (!this.events[referenceName]) {
- //Run a map that keeps a copy of the event
+ // Run a map that keeps a copy of the event
this.events[referenceName] = subject.map(event => { return Object.assign({}, event); });
}
return (event) => {
subject.onNext(event);
- }
+ };
};
- }(),
+ })(),
componentWillUnmount() {
- //Complete any eventsSubjects
+ // Complete any eventsSubjects
Object.keys(this.eventSubjects).forEach(eventSubjectKey => {
log.info('Completing: ' + this.constructor.name + '.' + eventSubjectKey);
this.eventSubjects[eventSubjectKey].onCompleted();
});
- }
+ },
};
export default ObservedEvents;
diff --git a/src/utils/ObserverRegistry.mixin.js b/src/utils/ObserverRegistry.mixin.js
index e75f860b2..025dca87e 100644
--- a/src/utils/ObserverRegistry.mixin.js
+++ b/src/utils/ObserverRegistry.mixin.js
@@ -1,12 +1,9 @@
-'use strict';
-
-import React from 'react';
-import {Subject, Observable} from 'rx/dist/rx.all';
-
import log from 'loglevel';
const ObserverRegistry = {
- observerDisposables: [],
+ componentWillMount() {
+ this.observerDisposables = [];
+ },
componentWillUnmount() {
log.info('Disposing: ', this.observerDisposables);
@@ -16,7 +13,7 @@ const ObserverRegistry = {
registerDisposable(disposable) {
log.info('Registered: ', disposable);
this.observerDisposables.push(disposable);
- }
+ },
};
export default ObserverRegistry;
diff --git a/src/utils/d2.js b/src/utils/d2.js
deleted file mode 100644
index 3d87dd61e..000000000
--- a/src/utils/d2.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import d2Init from 'd2';
-
-export default d2Init({baseUrl: 'http://localhost:8080/dhis/api'});
diff --git a/test/List/list.store.test.js b/test/List/list.store.test.js
index 6f28b9d15..d8c266d04 100644
--- a/test/List/list.store.test.js
+++ b/test/List/list.store.test.js
@@ -1,5 +1,3 @@
-import listStore from '../../src/List/listStore';
-
describe('Store: listStore', () => {
});
diff --git a/test/SideBar/sideBarItems.store.test.js b/test/SideBar/sideBarItems.store.test.js
index 38a991889..a1c462b4a 100644
--- a/test/SideBar/sideBarItems.store.test.js
+++ b/test/SideBar/sideBarItems.store.test.js
@@ -1,5 +1,7 @@
import sideBarItemsStore from '../../src/SideBar/sideBarItems.store';
describe('Store: sideBarItemsStore', () => {
-
+ it('should be defined', () => {
+ expect(sideBarItemsStore).to.not.be.undefined;
+ });
});
diff --git a/test/config/karma.config.js b/test/config/karma.config.js
index bdfac7956..f88d646f3 100644
--- a/test/config/karma.config.js
+++ b/test/config/karma.config.js
@@ -56,12 +56,6 @@ module.exports = function karmaConfig( config ) {
'src/**/*.js',
],
-
- // list of preprocessors
- preprocessors: {
- 'test/*': ['webpack']
- },
-
logLevel: config.LOG_INFO,
browsers: ['PhantomJS'],
diff --git a/test/index.js b/test/index.js
index 0928acc83..ac90c7c14 100644
--- a/test/index.js
+++ b/test/index.js
@@ -1,2 +1,2 @@
-var testsContext = require.context(".", true, /\.test$/);
+const testsContext = require.context('.', true, /\.test$/);
testsContext.keys().forEach(testsContext);
diff --git a/webpack.config.js b/webpack.config.js
index de1f24212..b90d18953 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -15,7 +15,7 @@ module.exports = {
exclude: [/(node_modules)/, /d2\-ui/],
loader: 'babel',
query: {
- stage: 2,
+ stage: 0,
},
},
{