diff --git a/.babelrc b/.babelrc index a8211d329f6..f2764599e3d 100644 --- a/.babelrc +++ b/.babelrc @@ -1,5 +1,6 @@ { "presets": [ - ["env", { "modules": false } ] + ["env", { "modules": false } ], + "es2015", ] } diff --git a/.eslintrc.json b/.eslintrc.json index 899d223592e..f17f5030ddb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,5 @@ { "root": true, - "installedESLint": true, "env": { "browser": true, "jquery": true @@ -8,7 +7,7 @@ "parser": "babel-eslint", "parserOptions": { "ecmaVersion": 5, - "sourceType": "script", + "sourceType": "module", "ecmaFeatures": { "globalReturn": false, "impliedStrict": false diff --git a/app/javascript/demo/actions/counter/index.js b/app/javascript/demo/actions/counter/index.js new file mode 100644 index 00000000000..da0973bff36 --- /dev/null +++ b/app/javascript/demo/actions/counter/index.js @@ -0,0 +1,7 @@ +export const increment = () => ( + { type: 'INCREMENT' } +); + +export const decrement = () => ( + { type: 'DECREMENT' } +); diff --git a/app/javascript/demo/index.js b/app/javascript/demo/index.js new file mode 100644 index 00000000000..8dc9bf32faa --- /dev/null +++ b/app/javascript/demo/index.js @@ -0,0 +1,21 @@ +import store from './store'; +import * as counterAction from './actions/counter'; + +ManageIQ.redux = {}; +ManageIQ.redux.store = store; + +// render the current state to the screen. +const valueEl = document.getElementById('reduxDemo'); + +const render = () => { + valueEl.innerHTML = store.getState().counter.toString(); +}; + +render(); + +// re-render on any store change +store.subscribe(render); + +store.dispatch(counterAction.increment()); +store.dispatch(counterAction.increment()); +store.dispatch(counterAction.decrement()); diff --git a/app/javascript/demo/reducers/counter/index.js b/app/javascript/demo/reducers/counter/index.js new file mode 100644 index 00000000000..410cfb915ab --- /dev/null +++ b/app/javascript/demo/reducers/counter/index.js @@ -0,0 +1,10 @@ +export default (state = 0, action) => { + switch (action.type) { + case 'INCREMENT': + return state + 1; + case 'DECREMENT': + return state - 1; + default: + return state; + } +}; diff --git a/app/javascript/demo/reducers/index.js b/app/javascript/demo/reducers/index.js new file mode 100644 index 00000000000..7222cb8f2e0 --- /dev/null +++ b/app/javascript/demo/reducers/index.js @@ -0,0 +1,6 @@ +import { combineReducers } from 'redux'; +import counter from './counter'; + +export default combineReducers({ + counter, +}); diff --git a/app/javascript/demo/store/index.js b/app/javascript/demo/store/index.js new file mode 100644 index 00000000000..c85033bb720 --- /dev/null +++ b/app/javascript/demo/store/index.js @@ -0,0 +1,9 @@ +import { createStore } from 'redux'; +import reducers from '../reducers'; + +let store = createStore( + reducers, + window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() +); + +export default store; diff --git a/app/javascript/packs/redux.js b/app/javascript/packs/redux.js new file mode 100644 index 00000000000..8379758e4d9 --- /dev/null +++ b/app/javascript/packs/redux.js @@ -0,0 +1 @@ +require('../demo'); diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml index 34d82a1af33..4de0156c68e 100644 --- a/app/views/layouts/_header.html.haml +++ b/app/views/layouts/_header.html.haml @@ -1,4 +1,5 @@ = render :partial => 'layouts/about_modal' +#reduxDemo{style: "float: right; background-color:#3f9c35; font-size:22px;", class: 'card-pf'} %nav.navbar.navbar-pf-vertical#notification-app{'ng-controller' => "headerController as vm"} .navbar-header %button{:type => "button", :class => "navbar-toggle"} @@ -40,6 +41,7 @@ = render :partial => "layouts/notifications_drawer" = render :partial => "layouts/toast_list" + = javascript_pack_tag 'manageiq-ui-classic/redux' :javascript miq_bootstrap('#notification-app', 'miq.notifications'); diff --git a/package.json b/package.json index f8d0c76dfd8..f022650990f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,9 @@ "@angular/core": "~4.0.3", "@angular/platform-browser": "~4.0.3", "@angular/platform-browser-dynamic": "~4.0.3", + "babel-preset-es2015": "^6.24.1", "core-js": "~2.4.1", + "redux": "^3.7.2", "rxjs": "~5.3.0", "ui-select": "0.19.8", "zone.js": "~0.8.5"