diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json
index ba015d08d1..2abcaecd71 100644
--- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json
@@ -13,6 +13,7 @@
"acorn": "^6.1.1",
"antd": "^3.15.0",
"axios": "^0.18.0",
+ "keymirror": "^0.1.1",
"react": "^16.8.4",
"react-dom": "^16.8.4",
"react-highlight-words": "^0.16.0",
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/AppCard.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/AppCard.js
similarity index 64%
rename from components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/AppCard.js
rename to components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/AppCard.js
index d965e05d7f..2d78b65697 100644
--- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/AppCard.js
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/AppCard.js
@@ -2,15 +2,26 @@ import {
Skeleton, Switch, Card, Icon, Avatar, Typography
} from 'antd';
import React from "react";
-import config from "../../public/conf/config.json";
+import config from "../../../public/conf/config.json";
+import {openReleasesModal} from "../../js/actions";
+import {connect} from "react-redux";
const { Meta } = Card;
const { Text } = Typography;
-class AppCard extends React.Component {
+const mapDispatchToProps = dispatch => ({
+ openReleasesModal: (app) => dispatch(openReleasesModal(app))
+});
+
+class ConnectedAppCard extends React.Component {
constructor(props){
super(props);
+ this.handleReleasesClick = this.handleReleasesClick.bind(this);
+ }
+
+ handleReleasesClick(){
+ this.props.openReleasesModal(this.props.app);
}
@@ -33,7 +44,7 @@ class AppCard extends React.Component {
);
return (
- , , ]}>
+ , , ]}>
}
title={this.props.name}
@@ -44,4 +55,6 @@ class AppCard extends React.Component {
}
}
+const AppCard = connect(null,mapDispatchToProps)(ConnectedAppCard);
+
export default AppCard;
\ No newline at end of file
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/AppList.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/AppList.js
similarity index 86%
rename from components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/AppList.js
rename to components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/AppList.js
index d6c54f4039..00f715825f 100644
--- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/AppList.js
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/AppList.js
@@ -2,9 +2,9 @@ import React from "react";
import AppCard from "./AppCard";
import {Col, Row} from "antd";
import {connect} from "react-redux";
-import {getApps} from "../js/actions";
+import {getApps} from "../../js/actions";
-// connecting state.articles with the component
+// connecting state.apps with the component
const mapStateToProps= state => {
return {apps : state.apps}
};
@@ -24,6 +24,7 @@ class ConnectedAppList extends React.Component {
{this.props.apps.map(app => (
{
+ return {releaseView: state.releaseView}
+};
+
+const Text = Typography;
+
+class ConnectedReleaseModal extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ visible: false,
+ app: null
+ };
+ }
+
+ componentWillReceiveProps(nextProps) {
+ if (nextProps !== this.props) {
+ this.setState({
+ visible: nextProps.releaseView.visible,
+ app: nextProps.releaseView.app
+ })
+ }
+ }
+
+ showModal = () => {
+ this.setState({
+ visible: true,
+ });
+ };
+
+ handleOk = (e) => {
+ this.setState({
+ visible: false,
+ });
+ };
+
+ handleCancel = (e) => {
+ this.setState({
+ visible: false,
+ });
+ };
+
+ render() {
+ if (this.props.releaseView.app != null) {
+ const app = this.props.releaseView.app;
+ return (
+
+
+ Some contents...
+ (
+
+ }
+ title={{release.version}}
+ description={release.description}
+ />
+
+ )}
+ />
+
+
+ );
+ } else {
+ return null;
+ }
+ }
+}
+
+const ReleaseModal = connect(mapStateToProps, null)(ConnectedReleaseModal);
+
+export default ReleaseModal;
\ No newline at end of file
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/release/ReleaseView.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/release/ReleaseView.js
new file mode 100644
index 0000000000..8e0953c9c3
--- /dev/null
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/apps/release/ReleaseView.js
@@ -0,0 +1,33 @@
+import React from "react";
+import {Avatar, Row, Col, Typography} from "antd";
+
+const {Title, Text} = Typography;
+
+class ReleaseView extends React.Component {
+ render() {
+ const release = this.props.release;
+ return (
+
+
+
+
+
+
+ App Name
+ {release.version}
+ {release.description}
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default ReleaseView;
\ No newline at end of file
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/index.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/index.js
index 829941613a..623840107a 100644
--- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/index.js
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/index.js
@@ -5,6 +5,7 @@ import App from "./App";
import Login from "./pages/Login";
import Dashboard from "./pages/dashboard/Dashboard";
import Apps from "./pages/dashboard/apps/Apps";
+import Release from "./pages/dashboard/apps/release/Release";
import AddNewApp from "./pages/dashboard/add-new-app/AddNewApp";
import './index.css';
import store from "./js/store/index";
@@ -31,6 +32,11 @@ const routes = [
path: '/publisher/apps/new-app',
component: AddNewApp,
exact: true
+ },
+ {
+ path: '/publisher/apps/releases/:uuid',
+ exact: true,
+ component: Release
}
]
}
@@ -39,7 +45,7 @@ const routes = [
ReactDOM.render(
-
+
,
document.getElementById('root'));
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/actions/index.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/actions/index.js
index 05da75eb70..de94675a26 100644
--- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/actions/index.js
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/actions/index.js
@@ -1,31 +1,61 @@
import axios from "axios";
-import {GET_APPS} from "../constants/action-types";
+import ActionTypes from "../constants/ActionTypes";
import config from "../../../public/conf/config.json";
-export function getApps() {
+export const getApps = () => dispatch => {
- return (dispatch) => {
- const request = "method=post&content-type=application/json&payload={}&api-endpoint=/application-mgt-publisher/v1.0/applications";
+ const request = "method=post&content-type=application/json&payload={}&api-endpoint=/application-mgt-publisher/v1.0/applications";
- return axios.post('https://'+config.serverConfig.hostname+':'+config.serverConfig.httpsPort+config.serverConfig.invokerUri, request
- ).then(res => {
- if (res.status === 200) {
- let apps = [];
+ return axios.post('https://' + config.serverConfig.hostname + ':' + config.serverConfig.httpsPort + config.serverConfig.invokerUri, request
+ ).then(res => {
+ if (res.status === 200) {
+ let apps = [];
- if(res.data.data.hasOwnProperty("applications")){
- apps = res.data.data.applications;
- }
- console.log(res.data);
- dispatch({type: GET_APPS, payload: apps});
+ if (res.data.data.hasOwnProperty("applications")) {
+ apps = res.data.data.applications;
}
+ console.log(res.data);
+ dispatch({type: ActionTypes.GET_APPS, payload: apps});
+ }
+
+ }).catch(function (error) {
+ if (error.response.status === 401) {
+ window.location.href = 'https://localhost:9443/publisher/login';
+ }
+ });
+
+
+};
+
+export const getRelease = (uuid) => dispatch => {
+
+ const request = "method=get&content-type=application/json&payload={}&api-endpoint=/application-mgt-publisher/v1.0/applications/release/"+uuid;
+
+ return axios.post('https://' + config.serverConfig.hostname + ':' + config.serverConfig.httpsPort + config.serverConfig.invokerUri, request
+ ).then(res => {
+ if (res.status === 200) {
+ let release = res.data.data;
+
+ console.log(res.data);
+ dispatch({type: ActionTypes.GET_RELEASE, payload: release});
+ }
+
+ }).catch(function (error) {
+ if (error.response.status === 401) {
+ window.location.href = 'https://localhost:9443/publisher/login';
+ }
+ });
- }).catch(function (error) {
- if (error.response.status === 401) {
- window.location.href = 'https://localhost:9443/publisher/login';
- }
- });
- };
+};
+export const openReleasesModal = (app) => dispatch => {
+ console.log(app);
+ dispatch({
+ type: ActionTypes.OPEN_RELEASES_MODAL,
+ payload: {
+ app:app
+ }
+ });
+};
-}
\ No newline at end of file
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/constants/ActionTypes.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/constants/ActionTypes.js
new file mode 100644
index 0000000000..211bd739a4
--- /dev/null
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/constants/ActionTypes.js
@@ -0,0 +1,17 @@
+import keyMirror from 'keymirror';
+
+// export const LOGIN = "LOGIN";
+// export const GET_APPS = "GET_APPS";
+// export const OPEN_RELEASES_MODAL = "OPEN_RELEASES_MODAL";
+// export const CLOSE_RELEASES_MODAL = "CLOSE_RELEASES_MODAL";
+
+const ActionTypes = keyMirror({
+ LOGIN: null,
+ GET_APPS: null,
+ OPEN_RELEASES_MODAL: null,
+ CLOSE_RELEASES_MODAL: null,
+ GET_RELEASE: null
+
+});
+
+export default ActionTypes;
\ No newline at end of file
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/constants/action-types.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/constants/action-types.js
deleted file mode 100644
index e270ea0c6a..0000000000
--- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/constants/action-types.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export const LOGIN = "LOGIN";
-export const GET_APPS = "GET_APPS";
-
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/reducers/index.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/reducers/index.js
index 3093402642..5a9b379657 100644
--- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/reducers/index.js
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/js/reducers/index.js
@@ -1,17 +1,34 @@
-import {GET_APPS} from "../constants/action-types";
+import ActionTypes from "../constants/ActionTypes";
const initialState = {
- apps: []
+ apps: [],
+ releaseView: {
+ visible: false,
+ app: null
+ },
+ release: null
};
function rootReducer(state = initialState, action) {
- if (action.type === GET_APPS) {
- console.log(11);
+ if (action.type === ActionTypes.GET_APPS) {
return Object.assign({}, state, {
apps: action.payload
});
+ } else if (action.type === ActionTypes.OPEN_RELEASES_MODAL) {
+ return Object.assign({}, state, {
+ releaseView: {
+ visible: true,
+ app: action.payload.app
+ }
+ });
+ }else if(action.type === ActionTypes.GET_RELEASE){
+ return Object.assign({}, state, {
+ release: action.payload
+ });
+
}
return state;
}
+
export default rootReducer;
\ No newline at end of file
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/pages/dashboard/apps/Apps.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/pages/dashboard/apps/Apps.js
index 92d366a3ae..e24f40a6ea 100644
--- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/pages/dashboard/apps/Apps.js
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/pages/dashboard/apps/Apps.js
@@ -1,7 +1,8 @@
import React from "react";
import "antd/dist/antd.css";
import {PageHeader, Typography,Input, Button, Row, Col} from "antd";
-import AppList from "../../../components/AppList";
+import AppList from "../../../components/apps/AppList";
+import ReleaseModal from "../../../components/apps/ReleaseModal";
const Search = Input.Search;
@@ -46,6 +47,7 @@ class Apps extends React.Component {
+
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/pages/dashboard/apps/release/Release.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/pages/dashboard/apps/release/Release.js
new file mode 100644
index 0000000000..aad15ec595
--- /dev/null
+++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/pages/dashboard/apps/release/Release.js
@@ -0,0 +1,80 @@
+import React from "react";
+import {PageHeader, Typography, Input, Button, Row, Col, Avatar, Card} from "antd";
+import {connect} from "react-redux";
+import ReleaseView from "../../../../components/apps/release/ReleaseView";
+import {getRelease} from "../../../../js/actions";
+
+const Search = Input.Search;
+const {Title} = Typography;
+
+const routes = [
+ {
+ path: 'index',
+ breadcrumbName: 'Publisher',
+ },
+ {
+ path: 'first',
+ breadcrumbName: 'Dashboard',
+ },
+ {
+ path: 'second',
+ breadcrumbName: 'Apps',
+ },
+];
+
+const mapStateToProps = state => {
+ return {release: state.release}
+};
+
+const mapDispatchToProps = dispatch => ({
+ getRelease: (uuid) => dispatch(getRelease(uuid))
+});
+
+class ConnectedRelease extends React.Component {
+ routes;
+
+ constructor(props) {
+ super(props);
+ this.routes = props.routes;
+
+ }
+
+ componentDidMount() {
+ const {uuid} = this.props.match.params;
+ this.props.getRelease(uuid);
+ }
+
+ render() {
+
+ const release = this.props.release;
+ if (release == null) {
+ return (
+
+
No Releases Found
+
+ );
+ }
+ return (
+
+
+ );
+ }
+}
+
+const Release = connect(mapStateToProps,mapDispatchToProps)(ConnectedRelease);
+
+export default Release;