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 3c09151fd2476d387771e55e039ab57f66edd824..214870151fd25274b2188a6542897eb84ce5d5a2 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 => ( <div> @@ -16,12 +17,14 @@ const Main = props => ( Entitlement Support Page </h2> <SearchContainer /> + <EntitlementSupportTableContainer ecommerceUrl={props.ecommerceUrl} /> </div> ); 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 80bdd3b240c4e0d1f6b813afa6b99453ca02c9f2..883fc8a9cd8e51c5be029a901fbef113e7514dd5 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 0000000000000000000000000000000000000000..ff9023fec4b7f14aa0cea5c9854c76e5981cba17 --- /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: <Hyperlink + destination={`${ecommerceUrl}${orderNumber}/`} + content={orderNumber || ''} + />, + button: <div> No Actions Currently Available </div>, + }); + }); + +const EntitlementSupportTable = props => ( + <Table + data={parseEntitlementData(props.entitlements, props.ecommerceUrl)} + columns={entitlementColumns} + /> +); + +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 0000000000000000000000000000000000000000..c4cf0cb024072a322caff1414cffc8c4a57bab89 --- /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 e87397beac62ef66102a0f85fcd599ad05e0d4f5..c13856c9fe4de8a669263426961a4cc648ac461e 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 807edec4e9e3f3a82b4fe588f5c09f38806a4cb7..f7d2375e82c6927671c36051a54571722a2decf0 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 3d2cde5b870dbfe5de2af6e229933055ad7dbae4..5353648d22dbe4ee59ec81969a93e1b1c93dc56b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1634,6 +1634,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 3dcc15c0f9ba3f34ced2dab3923548c19b448995..1acf7f5125308826650a3d8609901b196b564e9f 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",