Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Add redux #1130

Merged
merged 26 commits into from
May 15, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
4e3f154
skeleton on redux together, but its not working yet.
crcommons May 4, 2018
52f9c83
apparently import breaks everything. using require instead. now to fi…
crcommons May 4, 2018
9e9a4f2
redux works when I remove thunk middlewear, but now can't get store i…
crcommons May 4, 2018
c693962
fix: Add custom connectFromStore() to connect components to ngRedux s…
rjmackay May 7, 2018
9db1db1
fix: Fix up ngRedux state setup to avoid 'RootReducer' wrapper
rjmackay May 7, 2018
db8ea73
fix: Copy propTypes to connected component so react2angular can detec…
rjmackay May 7, 2018
fc5c6c3
Remove unneeded manual store binding
rjmackay May 8, 2018
5323950
feat: Add routing using a wrapper controller
crcommons May 8, 2018
d9044a1
style(New react components and settings.module): cleaning up spacing …
crcommons May 9, 2018
0a447fa
Merge pull request #1134 from ushahidi/react-routing-wrapper
crcommons May 9, 2018
6ebf554
created Link API which will allow us to easily switch out react-route…
crcommons May 10, 2018
cb3a79e
style updates
crcommons May 10, 2018
96f5e61
test(ush-logo test files): got tests working with store data
crcommons May 10, 2018
92ac2e8
fix(connect, mycomponent): removed check and reassign of props
crcommons May 10, 2018
9dbc129
ci: Update travis to run node 6+
rjmackay May 10, 2018
41e5a4b
Merge pull request #1138 from ushahidi/redux-fix-tests
crcommons May 10, 2018
ffdebd0
Merge branch 'add-redux' into migration/Link-API
crcommons May 10, 2018
2f89854
feat(Routing): Link router is complete; tests don't work because of a…
crcommons May 10, 2018
7cc6522
test: bootstrap angular before Link tests
rjmackay May 11, 2018
953d26b
fix: Don't try to stop Link event propagation
rjmackay May 11, 2018
4cd6d09
text: Check Link component calls state.go
rjmackay May 11, 2018
3284850
test(Link snapshot): pushing snapshot for travis tests
crcommons May 11, 2018
a000bdb
Merge pull request #1139 from ushahidi/migration/Link-API
crcommons May 11, 2018
7f7eaa6
resolving merge conflicts
crcommons May 11, 2018
68babc1
chore(Prettier config): changed spacing from 2 to 4
crcommons May 11, 2018
ab1bd75
adding thunk middlewear correctly and fixing gitignore; ignoring lint…
crcommons May 15, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
"rules": {
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
"prettier/prettier": ["error"],
"import/no-extraneous-dependencies": ["error", {"devDependencies": true}]
"import/no-extraneous-dependencies": ["error", {"devDependencies": true}],
"jsx-a11y/anchor-is-valid": [ "error", { "components": [ "Link" ], "specialLink": [ "to" ], "aspects": [ "noHref", "invalidHref", "preferButton" ] } ]

}
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@ server/www/img/icons/
server/www/
app/locales/
package-lock.json
app/stats.html
8 changes: 3 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,14 @@ notifications:
# sauce_connect: true
language: node_js
matrix:
allow_failures:
- node_js: stable
include:
# Run everything with v5 (match production)
- node_js: 5
- node_js: stable
env: TEST_SUITE=lint
- node_js: 5
env: TEST_SUITE=unit
- node_js: 6
env: TEST_SUITE=unit
- node_js: 8
env: TEST_SUITE=unit
- node_js: stable
env: TEST_SUITE=unit
fast_finish: true
Expand Down
321 changes: 178 additions & 143 deletions app/app.js
Original file line number Diff line number Diff line change
@@ -1,176 +1,211 @@
require('angular');
require('@uirouter/angularjs');
require('angular-resource');
require('angular-translate');
require('angular-translate-loader-static-files');
require('angular-ui-bootstrap');
require('angular-datepicker/build/angular-datepicker');
require('angular-sanitize');
require('angular-elastic');
require('angular-filter');
require('angular-local-storage');
require('checklist-model');
require('ngGeolocation/ngGeolocation');
require('ng-showdown');
window.d3 = require('d3'); // Required for nvd3
require('./common/wrapper/nvd3-wrapper');
require('angular-nvd3/src/angular-nvd3');
require('angular-cache');
require('angular-linkify');
// Migration React / Redux imports
import thunk from "redux-thunk";
import RootReducer from "./rootReducer";

require("angular");
require("@uirouter/angularjs");
require("angular-resource");
require("angular-translate");
require("angular-translate-loader-static-files");
require("angular-ui-bootstrap");
require("angular-datepicker/build/angular-datepicker");
require("angular-sanitize");
require("angular-elastic");
require("angular-filter");
require("angular-local-storage");
require("checklist-model");
require("ngGeolocation/ngGeolocation");
require("ng-showdown");
window.d3 = require("d3"); // Required for nvd3
require("./common/wrapper/nvd3-wrapper");
require("angular-nvd3/src/angular-nvd3");
require("angular-cache");
require("angular-linkify");
require("ng-redux");

// Load ushahidi modules
require('./common/common-module.js');
require('./main/main-module.js');
require('./settings/settings.module.js');
require("./common/common-module.js");
require("./main/main-module.js");
require("./settings/settings.module.js");

// Load platform-pattern-library CSS
require('ushahidi-platform-pattern-library/assets/fonts/Lato/css/fonts.css');
require('ushahidi-platform-pattern-library/assets/css/style.min.css');
require('../sass/vendor.scss');
require("ushahidi-platform-pattern-library/assets/fonts/Lato/css/fonts.css");
require("ushahidi-platform-pattern-library/assets/css/style.min.css");
require("../sass/vendor.scss");

// Stub ngRaven module incase its not configured
angular.module('ngRaven', []);
angular.module("ngRaven", []);

// Make sure we have a window.ushahidi object
window.ushahidi = window.ushahidi || {};

// this 'environment variable' will be set within the gulpfile
var backendUrl = window.ushahidi.backendUrl = (window.ushahidi.backendUrl || BACKEND_URL).replace(/\/$/, ''),
intercomAppId = window.ushahidi.intercomAppId = window.ushahidi.intercomAppId || '',
appStoreId = window.ushahidi.appStoreId = window.ushahidi.appStoreId || '',
apiUrl = window.ushahidi.apiUrl = backendUrl + '/api/v3',
platform_websocket_redis_adapter_url = window.ushahidi.platform_websocket_redis_adapter_url || '',
let backendUrl = (window.ushahidi.backendUrl = (
window.ushahidi.backendUrl || BACKEND_URL
).replace(/\/$/, "")),
intercomAppId = (window.ushahidi.intercomAppId =
window.ushahidi.intercomAppId || ""),
appStoreId = (window.ushahidi.appStoreId =
window.ushahidi.appStoreId || ""),
apiUrl = (window.ushahidi.apiUrl = `${backendUrl}/api/v3`),
platform_websocket_redis_adapter_url =
window.ushahidi.platform_websocket_redis_adapter_url || "",
claimedAnonymousScopes = [
'apikeys',
'posts',
'country_codes',
'media',
'forms',
'api',
'tags',
'savedsearches',
'sets',
'users',
'stats',
'layers',
'config',
'messages',
'notifications',
'webhooks',
'contacts',
'roles',
'permissions',
'csv',
'tos'
"apikeys",
"posts",
"country_codes",
"media",
"forms",
"api",
"tags",
"savedsearches",
"sets",
"users",
"stats",
"layers",
"config",
"messages",
"notifications",
"webhooks",
"contacts",
"roles",
"permissions",
"csv",
"tos"
];

angular.module('app',
[
'checklist-model',
'monospaced.elastic',
'ui.router',
'ngResource',
'LocalStorageModule',
'pascalprecht.translate',
'ui.bootstrap.pagination',
'angular-datepicker',
'angular.filter',
'ng-showdown',
'ngGeolocation',
'nvd3',
'angular-cache',
'linkify',
'ngRaven',
'ushahidi.common',
'ushahidi.main',
'ushahidi.settings',
'ui.bootstrap.dropdown'
angular
.module("app", [
"checklist-model",
"monospaced.elastic",
"ui.router",
"ngResource",
"LocalStorageModule",
"pascalprecht.translate",
"ui.bootstrap.pagination",
"angular-datepicker",
"angular.filter",
"ng-showdown",
"ngGeolocation",
"nvd3",
"angular-cache",
"linkify",
"ngRaven",
"ushahidi.common",
"ushahidi.main",
"ushahidi.settings",
"ui.bootstrap.dropdown",
"ngRedux"
])

.constant('CONST', {
BACKEND_URL : backendUrl,
API_URL : apiUrl,
INTERCOM_APP_ID : intercomAppId,
APP_STORE_ID : appStoreId,
DEFAULT_LOCALE : 'en_US',
OAUTH_CLIENT_ID : 'ushahidiui',
OAUTH_CLIENT_SECRET : '35e7f0bca957836d05ca0492211b0ac707671261',
CLAIMED_ANONYMOUS_SCOPES : claimedAnonymousScopes,
CLAIMED_USER_SCOPES : claimedAnonymousScopes.concat('dataproviders'),
MAPBOX_API_KEY : window.ushahidi.mapboxApiKey || 'pk.eyJ1IjoidXNoYWhpZGkiLCJhIjoiY2lxaXUzeHBvMDdndmZ0bmVmOWoyMzN6NiJ9.CX56ZmZJv0aUsxvH5huJBw', // Default OSS mapbox api key
TOS_RELEASE_DATE : new Date(window.ushahidi.tosReleaseDate).toJSON() ? new Date(window.ushahidi.tosReleaseDate) : false, // Date in UTC
PLATFORM_WEBSOCKET_REDIS_ADAPTER_URL : platform_websocket_redis_adapter_url,
EXPORT_POLLING_INTERVAL : window.ushahidi.export_polling_interval || 30000
.constant("CONST", {
BACKEND_URL: backendUrl,
API_URL: apiUrl,
INTERCOM_APP_ID: intercomAppId,
APP_STORE_ID: appStoreId,
DEFAULT_LOCALE: "en_US",
OAUTH_CLIENT_ID: "ushahidiui",
OAUTH_CLIENT_SECRET: "35e7f0bca957836d05ca0492211b0ac707671261",
CLAIMED_ANONYMOUS_SCOPES: claimedAnonymousScopes,
CLAIMED_USER_SCOPES: claimedAnonymousScopes.concat("dataproviders"),
MAPBOX_API_KEY:
window.ushahidi.mapboxApiKey ||
"pk.eyJ1IjoidXNoYWhpZGkiLCJhIjoiY2lxaXUzeHBvMDdndmZ0bmVmOWoyMzN6NiJ9.CX56ZmZJv0aUsxvH5huJBw", // Default OSS mapbox api key
TOS_RELEASE_DATE: new Date(window.ushahidi.tosReleaseDate).toJSON()
? new Date(window.ushahidi.tosReleaseDate)
: false, // Date in UTC
PLATFORM_WEBSOCKET_REDIS_ADAPTER_URL: platform_websocket_redis_adapter_url,
EXPORT_POLLING_INTERVAL:
window.ushahidi.export_polling_interval || 30000
})
.config(['$compileProvider', function ($compileProvider) {
$compileProvider.debugInfoEnabled(false);
}])
.config(['$locationProvider', function ($locationProvider) {
$locationProvider.html5Mode(true).hashPrefix('!');
}])
.config(function ($urlRouterProvider, $urlMatcherFactoryProvider) {
$urlRouterProvider.when('', '/views/map');
$urlRouterProvider.when('/', '/views/map');
.config([
"$compileProvider",
function($compileProvider) {
$compileProvider.debugInfoEnabled(false);
}
])
.config([
"$locationProvider",
function($locationProvider) {
$locationProvider.html5Mode(true).hashPrefix("!");
}
])
.config(($urlRouterProvider, $urlMatcherFactoryProvider) => {
$urlRouterProvider.when("", "/views/map");
$urlRouterProvider.when("/", "/views/map");
// if the path doesn't match any of the urls you configured
// otherwise will take care of routing the user to the specified url
$urlRouterProvider.otherwise('/404');
$urlRouterProvider.otherwise("/404");
$urlMatcherFactoryProvider.strictMode(false);
})
.config(['$showdownProvider', function ($showdownProvider) {
$showdownProvider.setOption('simplifiedAutoLink', true);
$showdownProvider.setOption('excludeTrailingPunctuationFromURLs', true);
$showdownProvider.setOption('openLinksInNewWindow', true);
$showdownProvider.setOption('tasklists', true);
$showdownProvider.setOption('sanitize', true);
}])
.config([
"$showdownProvider",
function($showdownProvider) {
$showdownProvider.setOption("simplifiedAutoLink", true);
$showdownProvider.setOption(
"excludeTrailingPunctuationFromURLs",
true
);
$showdownProvider.setOption("openLinksInNewWindow", true);
$showdownProvider.setOption("tasklists", true);
$showdownProvider.setOption("sanitize", true);
}
])

.factory('_', function () {
return require('underscore/underscore');
})
.factory('d3', function () {
return window.d3;
})
.factory('URI', function () {
return require('URIjs/src/URI.js');
})
.factory('Leaflet', function () {
var L = require('leaflet');
.factory("_", () => require("underscore/underscore"))
.factory("d3", () => window.d3)
.factory("URI", () => require("URIjs/src/URI.js"))
.factory("Leaflet", () => {
const L = require("leaflet");
// Load leaflet plugins here too
require('imports-loader?L=leaflet!leaflet.markercluster');
require('imports-loader?L=leaflet!leaflet.locatecontrol/src/L.Control.Locate');
require("imports-loader?L=leaflet!leaflet.markercluster");
require("imports-loader?L=leaflet!leaflet.locatecontrol/src/L.Control.Locate");
return L;
})
.factory('moment', function () {
return require('moment');
})
.factory('io', function () {
return require('socket.io-client');
})
.factory('BootstrapConfig', ['_', function (_) {
return window.ushahidi.bootstrapConfig ?
_.indexBy(window.ushahidi.bootstrapConfig, 'id') :
{ map: {}, site: {}, features: {} };
}])
.factory('Sortable', function () {
return require('sortablejs');
})
.factory("moment", () => require("moment"))
.factory("io", () => require("socket.io-client"))
.factory("BootstrapConfig", [
"_",
function(_) {
return window.ushahidi.bootstrapConfig
? _.indexBy(window.ushahidi.bootstrapConfig, "id")
: { map: {}, site: {}, features: {} };
}
])
.factory("Sortable", () => require("sortablejs"))
// inject the router instance into a `run` block by name
//.run(['$uiRouter', '$trace', '$location', function ($uiRouter, $trace, $location) {
// .run(['$uiRouter', '$trace', '$location', function ($uiRouter, $trace, $location) {
// // * uncomment this to enable the visualizer *
// let Visualizer = require('@uirouter/visualizer').Visualizer;
// let pluginInstance = $uiRouter.plugin(Visualizer);
// $trace.enable('TRANSITION');
// }])
.run(['$rootScope', 'LoadingProgress', '$transitions', function ($rootScope, LoadingProgress, $transitions) {
// this handles the loading-state app-wide
LoadingProgress.watchTransitions();
if (window.ushahidi.gaEnabled) {
$transitions.onSuccess({}, function (transition) {
window.ga('send', 'pageview', transition.to().url);
});
.run([
"$rootScope",
"LoadingProgress",
"$transitions",
function($rootScope, LoadingProgress, $transitions) {
// this handles the loading-state app-wide
LoadingProgress.watchTransitions();
if (window.ushahidi.gaEnabled) {
$transitions.onSuccess({}, transition => {
window.ga("send", "pageview", transition.to().url);
});
}
}
}])
.run(function () {
angular.element(document.getElementById('bootstrap-app')).removeClass('hidden');
angular.element(document.getElementById('bootstrap-loading')).addClass('hidden');
])
.run(() => {
angular
.element(document.getElementById("bootstrap-app"))
.removeClass("hidden");
angular
.element(document.getElementById("bootstrap-loading"))
.addClass("hidden");
})
.config($ngReduxProvider => {
$ngReduxProvider.createStoreWith(
RootReducer,
[thunk],
[window.__REDUX_DEVTOOLS_EXTENSION__()]
);
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

exports[`foo and bar match the props 1`] = `
<div>
junk
<p
className="foo"
>
Expand Down
Loading