diff --git a/lms/djangoapps/support/static/support/jsx/entitlements/components/Main/Main.jsx b/lms/djangoapps/support/static/support/jsx/entitlements/components/Main/Main.jsx
index 3c09151fd2..214870151f 100644
--- a/lms/djangoapps/support/static/support/jsx/entitlements/components/Main/Main.jsx
+++ b/lms/djangoapps/support/static/support/jsx/entitlements/components/Main/Main.jsx
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
import { StatusAlert } from '@edx/paragon';
import SearchContainer from '../Search/SearchContainer.jsx';
+import EntitlementSupportTableContainer from '../Table/EntitlementSupportTableContainer.jsx';
const Main = props => (
@@ -16,12 +17,14 @@ const Main = props => (
Entitlement Support Page
+
);
Main.propTypes = {
errorMessage: PropTypes.string.isRequired,
dismissErrorMessage: PropTypes.func.isRequired,
+ ecommerceUrl: PropTypes.string.isRequired,
};
export default Main;
diff --git a/lms/djangoapps/support/static/support/jsx/entitlements/components/Search/SearchContainer.jsx b/lms/djangoapps/support/static/support/jsx/entitlements/components/Search/SearchContainer.jsx
index 80bdd3b240..883fc8a9cd 100644
--- a/lms/djangoapps/support/static/support/jsx/entitlements/components/Search/SearchContainer.jsx
+++ b/lms/djangoapps/support/static/support/jsx/entitlements/components/Search/SearchContainer.jsx
@@ -7,7 +7,6 @@ const mapStateToProps = state => ({
entitlements: state.entitlements,
});
-
const mapDispatchToProps = dispatch => ({
fetchEntitlements: username => dispatch(fetchEntitlements(username)),
});
diff --git a/lms/djangoapps/support/static/support/jsx/entitlements/components/Table/EntitlementSupportTable.jsx b/lms/djangoapps/support/static/support/jsx/entitlements/components/Table/EntitlementSupportTable.jsx
new file mode 100644
index 0000000000..ff9023fec4
--- /dev/null
+++ b/lms/djangoapps/support/static/support/jsx/entitlements/components/Table/EntitlementSupportTable.jsx
@@ -0,0 +1,91 @@
+import React from 'react';
+import moment from 'moment';
+import PropTypes from 'prop-types';
+
+import { Hyperlink, Table } from '@edx/paragon';
+
+const entitlementColumns = [
+ {
+ label: 'User',
+ key: 'user',
+ },
+ {
+ label: 'Course UUID',
+ key: 'courseUuid',
+ },
+ {
+ label: 'Enrollment',
+ key: 'enrollmentCourseRun',
+ },
+ {
+ label: 'Mode',
+ key: 'mode',
+ },
+ {
+ label: 'Expired At',
+ key: 'expiredAt',
+ },
+ {
+ label: 'Created',
+ key: 'createdAt',
+ },
+ {
+ label: 'Modified',
+ key: 'modifiedAt',
+ },
+ {
+ label: 'Order',
+ key: 'orderNumber',
+ },
+ {
+ label: 'Actions',
+ key: 'button',
+ columnSortable: false,
+ hideHeader: false,
+ },
+];
+
+const parseEntitlementData = (entitlements, ecommerceUrl) =>
+ entitlements.map((entitlement) => {
+ const { expiredAt, created, modified, orderNumber } = entitlement;
+ return Object.assign({}, entitlement, {
+ expiredAt: expiredAt ? moment(expiredAt).format('lll') : '',
+ createdAt: moment(created).format('lll'),
+ modifiedAt: moment(modified).format('lll'),
+ orderNumber: ,
+ button: No Actions Currently Available
,
+ });
+ });
+
+const EntitlementSupportTable = props => (
+
+);
+
+EntitlementSupportTable.propTypes = {
+ entitlements: PropTypes.arrayOf(PropTypes.shape({
+ uuid: PropTypes.string.isRequired,
+ courseUuid: PropTypes.string.isRequired,
+ enrollmentCourseRun: PropTypes.string,
+ created: PropTypes.string.isRequired,
+ modified: PropTypes.string.isRequired,
+ expiredAt: PropTypes.string,
+ mode: PropTypes.string.isRequired,
+ orderNumber: PropTypes.string,
+ supportDetails: PropTypes.arrayOf(PropTypes.shape({
+ supportUser: PropTypes.string,
+ action: PropTypes.string,
+ comments: PropTypes.string,
+ unenrolledRun: PropTypes.string,
+ })),
+ user: PropTypes.string.isRequired,
+ })).isRequired,
+ ecommerceUrl: PropTypes.string.isRequired,
+};
+
+export default EntitlementSupportTable;
diff --git a/lms/djangoapps/support/static/support/jsx/entitlements/components/Table/EntitlementSupportTableContainer.jsx b/lms/djangoapps/support/static/support/jsx/entitlements/components/Table/EntitlementSupportTableContainer.jsx
new file mode 100644
index 0000000000..c4cf0cb024
--- /dev/null
+++ b/lms/djangoapps/support/static/support/jsx/entitlements/components/Table/EntitlementSupportTableContainer.jsx
@@ -0,0 +1,13 @@
+import { connect } from 'react-redux';
+
+import EntitlementSupportTable from './EntitlementSupportTable.jsx';
+
+const mapStateToProps = state => ({
+ entitlements: state.entitlements,
+});
+
+const EntitlementSupportTableContainer = connect(
+ mapStateToProps,
+)(EntitlementSupportTable);
+
+export default EntitlementSupportTableContainer;
diff --git a/lms/djangoapps/support/static/support/jsx/entitlements/data/actions/entitlement.js b/lms/djangoapps/support/static/support/jsx/entitlements/data/actions/entitlement.js
index e87397beac..c13856c9fe 100644
--- a/lms/djangoapps/support/static/support/jsx/entitlements/data/actions/entitlement.js
+++ b/lms/djangoapps/support/static/support/jsx/entitlements/data/actions/entitlement.js
@@ -1,5 +1,6 @@
-import { getEntitlements } from '../api/client';
+import camelize from 'camelize';
+import { getEntitlements } from '../api/client';
import { entitlementActions } from './constants';
import { displayError } from './error';
@@ -22,12 +23,11 @@ const fetchEntitlements = username =>
throw new Error(response);
})
.then(
- json => dispatch(fetchEntitlementsSuccess(json.results)),
+ json => dispatch(fetchEntitlementsSuccess(camelize(json.results))),
error => dispatch(fetchEntitlementsFailure(error)),
);
};
-
export {
fetchEntitlements,
fetchEntitlementsSuccess,
diff --git a/lms/djangoapps/support/static/support/jsx/entitlements/data/api/client.js b/lms/djangoapps/support/static/support/jsx/entitlements/data/api/client.js
index 807edec4e9..f7d2375e82 100644
--- a/lms/djangoapps/support/static/support/jsx/entitlements/data/api/client.js
+++ b/lms/djangoapps/support/static/support/jsx/entitlements/data/api/client.js
@@ -16,8 +16,7 @@ const getEntitlements = username => fetch(
},
);
-
-const createEntitlement = ({ username, courseUuid, mode, action, comments }) => fetch(
+const createEntitlement = ({ username, courseUuid, mode, action, comments = null }) => fetch(
`${entitlementApi}`, {
credentials: 'same-origin',
method: 'post',
@@ -34,9 +33,8 @@ const createEntitlement = ({ username, courseUuid, mode, action, comments }) =>
},
);
-
-const updateEntitlement = ({ entitlementUuid, unenrolledRun, action, comments }) => fetch(
- `${entitlementApi}/${entitlementUuid}`, {
+const updateEntitlement = ({ uuid, action, unenrolledRun = null, comments = null }) => fetch(
+ `${entitlementApi}/${uuid}`, {
credentials: 'same-origin',
method: 'patch',
headers: HEADERS,
@@ -52,7 +50,6 @@ const updateEntitlement = ({ entitlementUuid, unenrolledRun, action, comments })
},
);
-
export {
getEntitlements,
createEntitlement,
diff --git a/package-lock.json b/package-lock.json
index 816f6118a4..ef8236115f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1624,6 +1624,11 @@
"map-obj": "1.0.1"
}
},
+ "camelize": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
+ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
+ },
"can-use-dom": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz",
diff --git a/package.json b/package.json
index 0a628261f2..865dd400ae 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,7 @@
"backbone-associations": "0.6.2",
"backbone.paginator": "2.0.6",
"bootstrap": "4.0.0-beta.2",
+ "camelize": "1.0.0",
"classnames": "2.2.5",
"coffee-loader": "0.7.3",
"coffee-script": "1.6.1",