Skip to content

Commit

Permalink
chore: rebase
Browse files Browse the repository at this point in the history
  • Loading branch information
katrinan029 committed Sep 17, 2024
2 parents 0cde4e7 + 9d06fe6 commit 50ced6a
Show file tree
Hide file tree
Showing 14 changed files with 201 additions and 92 deletions.
2 changes: 2 additions & 0 deletions .env.development
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ ENTERPRISE_ACCESS_BASE_URL='http://localhost:18270'
LANGUAGE_PREFERENCE_COOKIE_NAME='openedx-language-preference'
LMS_BASE_URL='http://localhost:18000'
LICENSE_MANAGER_URL='http://localhost:18170'
LICENSE_MANAGER_DJANGO_URL='http://localhost:18170'
SUPPORT_CONFLUENCE='localhost:18450'
SUPPORT_CUSTOMER_REQUEST='localhost:18450'
DISCOVERY_API_BASE_URL='http://localhost:18381'
Expand All @@ -30,6 +31,7 @@ REFRESH_ACCESS_TOKEN_ENDPOINT='http://localhost:18000/login_refresh'
SEGMENT_KEY=null
SITE_NAME='edX'
SUBSIDY_BASE_URL='http://localhost:18280'
SUBSIDY_BASE_DJANGO_URL='http://localhost:18280'
USER_INFO_COOKIE_NAME='edx-user-info'
PUBLISHER_BASE_URL='http://localhost:18400'
APP_ID='support-tools'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ const CustomerIntegrations = ({
integrationCount++;
}

if (!integrationCount) {
return null;
}

return (
<div>
{(integrationCount > 0) && (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
import { useState } from 'react';
import { useParams } from 'react-router-dom';
import { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import { Form, Skeleton } from '@openedx/paragon';
import useAllAssociatedPlans from '../data/hooks/useAllAssociatedPlans';
import LearnerCreditPlanCard from './LearnerCreditPlanCard';
import SubscriptionPlanCard from './SubscriptionPlanCard';

const CustomerPlanContainer = ({ slug }) => {
const { id } = useParams();
const {
activeSubsidies,
activeSubscriptions,
countOfActivePlans,
countOfAllPlans,
inactiveSubsidies,
inactiveSubscriptions,
isLoading,
} = useAllAssociatedPlans(id);
const CustomerPlanContainer = ({
slug,
activeSubsidies,
activeSubscriptions,
countOfActivePlans,
countOfAllPlans,
inactiveSubsidies,
inactiveSubscriptions,
isLoading,
}) => {
const [showInactive, setShowInactive] = useState(false);
useEffect(() => {
if (!countOfActivePlans && countOfAllPlans) {
setShowInactive(true);
}
}, []);
const renderActiveSubsidiesCard = activeSubsidies.map(subsidy => (
<LearnerCreditPlanCard key={subsidy.uuid} isActive slug={slug} subsidy={subsidy} />
));
Expand All @@ -30,23 +32,25 @@ const CustomerPlanContainer = ({ slug }) => {
const renderInActiveSubscriptions = inactiveSubscriptions.map(subscription => (
<SubscriptionPlanCard key={subscription.uuid} isActive={false} slug={slug} subscription={subscription} />
));

return (
<div>
{!isLoading ? (
<div>
<div className="d-flex justify-content-between">
<h2>Associated subsidy plans ({showInactive ? countOfAllPlans : countOfActivePlans})</h2>
<Form.Switch
className="ml-2.5 mt-2.5"
checked={showInactive}
disabled={countOfAllPlans === countOfActivePlans}
onChange={() => {
setShowInactive(prevState => !prevState);
}}
data-testid="show-removed-toggle"
>
Show inactive
</Form.Switch>
{(countOfAllPlans > countOfActivePlans && countOfActivePlans) ? (
<Form.Switch
className="ml-2.5 mt-2.5"
checked={showInactive}
onChange={() => {
setShowInactive(prevState => !prevState);
}}
data-testid="show-removed-toggle"
>
Show inactive
</Form.Switch>
) : null}
</div>
<hr />
{renderActiveSubsidiesCard}
Expand All @@ -65,6 +69,33 @@ const CustomerPlanContainer = ({ slug }) => {

CustomerPlanContainer.propTypes = {
slug: PropTypes.string.isRequired,
activeSubsidies: PropTypes.arrayOf(PropTypes.shape({
uuid: PropTypes.string.isRequired,
activeDatetime: PropTypes.string.isRequired,
expirationDatetime: PropTypes.string.isRequired,
created: PropTypes.string.isRequired,
})).isRequired,
activeSubscriptions: PropTypes.arrayOf(PropTypes.shape({
uuid: PropTypes.string.isRequired,
startDate: PropTypes.string.isRequired,
expirationDate: PropTypes.string.isRequired,
created: PropTypes.string.isRequired,
})).isRequired,
countOfActivePlans: PropTypes.number.isRequired,
countOfAllPlans: PropTypes.number.isRequired,
inactiveSubsidies: PropTypes.arrayOf(PropTypes.shape({
uuid: PropTypes.string.isRequired,
activeDatetime: PropTypes.string.isRequired,
expirationDatetime: PropTypes.string.isRequired,
created: PropTypes.string.isRequired,
})).isRequired,
inactiveSubscriptions: PropTypes.arrayOf(PropTypes.shape({
uuid: PropTypes.string.isRequired,
startDate: PropTypes.string.isRequired,
expirationDate: PropTypes.string.isRequired,
created: PropTypes.string.isRequired,
})).isRequired,
isLoading: PropTypes.bool.isRequired,
};

export default CustomerPlanContainer;
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ import { getEnterpriseCustomer } from '../data/utils';
import CustomerIntegrations from './CustomerIntegrations';
import EnterpriseCustomerUsersTable from './EnterpriseCustomerUsersTable';
import CustomerPlanContainer from './CustomerPlanContainer';
import useAllAssociatedPlans from '../data/hooks/useAllAssociatedPlans';

const CustomerViewContainer = () => {
const { id } = useParams();
const [enterpriseCustomer, setEnterpriseCustomer] = useState({});
const [isLoading, setIsLoading] = useState(true);
const intl = useIntl();
const associatedPlans = useAllAssociatedPlans(id);

const fetchData = useCallback(
async () => {
Expand All @@ -38,6 +40,23 @@ const CustomerViewContainer = () => {
fetchData();
}, []);

const renderPlanContainer = () => {
if (!isLoading && !associatedPlans.isLoading && associatedPlans.countOfAllPlans) {
return (
<Stack gap={2}>
<CustomerPlanContainer slug={enterpriseCustomer.slug} {...associatedPlans} />
</Stack>
);
}
if (!associatedPlans.isLoading && !associatedPlans.countOfAllPlans) {
return false;
}
if (associatedPlans.isLoading) {
return <Skeleton height={230} />;
}
return null;
};

return (
<div>
{!isLoading ? (
Expand All @@ -64,11 +83,9 @@ const CustomerViewContainer = () => {
</Stack>
</Container>
<Container className="mt-4">
<Stack gap={2}>
{!isLoading ? <CustomerPlanContainer slug={enterpriseCustomer.slug} /> : <Skeleton height={230} />}
</Stack>
{renderPlanContainer()}
</Container>
<Container className="mt-4">
<Container className="mt-4 mb-4">
<Stack gap={2}>
<CustomerIntegrations
slug={enterpriseCustomer.slug}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,52 +9,60 @@ const EnterpriseCustomerUsersTable = () => {
isLoading,
enterpriseUsersTableData,
fetchEnterpriseUsersData,
showTable,
} = useCustomerUsersTableData(id);

return (
<div>
<h2>Associated users ({enterpriseUsersTableData.itemCount})</h2>
<hr />
<DataTable
isLoading={isLoading}
isExpandable
isPaginated
manualPagination
isFilterable
manualFilters
initialState={{
pageSize: 8,
pageIndex: 0,
sortBy: [],
filters: [],
}}
defaultColumnValues={{ Filter: TextFilter }}
fetchData={fetchEnterpriseUsersData}
data={enterpriseUsersTableData.results}
itemCount={enterpriseUsersTableData.itemCount}
pageCount={enterpriseUsersTableData.pageCount}
columns={[
{
id: 'details',
Header: 'User details',
accessor: 'details',
Cell: EnterpriseCustomerUserDetail,
},
{
id: 'administrator',
Header: 'Administrator',
accessor: 'administrator',
disableFilters: true,
Cell: AdministratorCell,
},
{
id: 'learner',
Header: 'Learner',
accessor: 'learner',
disableFilters: true,
Cell: LearnerCell,
},
]}
/>
{showTable ? (
<div>
<h2>Associated users {enterpriseUsersTableData.itemCount > 0
&& <span>({enterpriseUsersTableData.itemCount})</span>}
</h2>
<hr />
<DataTable
isLoading={isLoading}
isExpandable
isPaginated
manualPagination
isFilterable
manualFilters
initialState={{
pageSize: 8,
pageIndex: 0,
sortBy: [],
filters: [],
}}
defaultColumnValues={{ Filter: TextFilter }}
fetchData={fetchEnterpriseUsersData}
data={enterpriseUsersTableData.results}
itemCount={enterpriseUsersTableData.itemCount}
pageCount={enterpriseUsersTableData.pageCount}
columns={[
{
id: 'details',
Header: 'User details',
accessor: 'details',
Cell: EnterpriseCustomerUserDetail,
},
{
id: 'administrator',
Header: 'Administrator',
accessor: 'administrator',
disableFilters: true,
Cell: AdministratorCell,
},
{
id: 'learner',
Header: 'Learner',
accessor: 'learner',
disableFilters: true,
Cell: LearnerCell,
},
]}
/>
</div>
) : null}
</div>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { getConfig } from '@edx/frontend-platform';
import { formatDate } from '../data/utils';

const LearnerCreditPlanCard = ({ isActive, subsidy, slug }) => {
const { ADMIN_PORTAL_BASE_URL, SUBSIDY_BASE_URL } = getConfig();
const { ADMIN_PORTAL_BASE_URL, SUBSIDY_BASE_DJANGO_URL } = getConfig();
const startDate = formatDate(subsidy.activeDatetime);
const endDate = formatDate(subsidy.expirationDatetime);
const createdDate = formatDate(subsidy.created);
Expand All @@ -34,7 +34,7 @@ const LearnerCreditPlanCard = ({ isActive, subsidy, slug }) => {
<Button
data-testid="django-button"
as="a"
href={`${SUBSIDY_BASE_URL}/admin/subsidy/subsidy/${subsidy.uuid}/change/`}
href={`${SUBSIDY_BASE_DJANGO_URL}/admin/subsidy/subsidy/${subsidy.uuid}/change/`}
variant="primary"
target="_blank"
rel="noopener noreferrer"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { getConfig } from '@edx/frontend-platform';
import { formatDate } from '../data/utils';

const SubscriptionPlanCard = ({ isActive, subscription, slug }) => {
const { ADMIN_PORTAL_BASE_URL, LICENSE_MANAGER_URL } = getConfig();
const { ADMIN_PORTAL_BASE_URL, LICENSE_MANAGER_DJANGO_URL } = getConfig();
const startDate = formatDate(subscription.startDate);
const endDate = formatDate(subscription.expirationDate);
const createdDate = formatDate(subscription.created);
Expand All @@ -31,7 +31,7 @@ const SubscriptionPlanCard = ({ isActive, subscription, slug }) => {
</Button>
<Button
as="a"
href={`${LICENSE_MANAGER_URL}/admin/subscriptions/subscriptionplan/${subscription.uuid}/change`}
href={`${LICENSE_MANAGER_DJANGO_URL}/admin/subscriptions/subscriptionplan/${subscription.uuid}/change`}
variant="primary"
target="_blank"
rel="noopener noreferrer"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import userEvent from '@testing-library/user-event';
import { getConfig } from '@edx/frontend-platform';
import { IntlProvider } from '@edx/frontend-platform/i18n';

import useAllAssociatedPlans from '../../data/hooks/useAllAssociatedPlans';
import { formatDate } from '../../data/utils';
import CustomerPlanContainer from '../CustomerPlanContainer';

Expand All @@ -19,11 +18,6 @@ jest.mock('@edx/frontend-platform', () => ({
getConfig: jest.fn(),
}));

jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useParams: () => ({ id: 'test-uuid' }),
}));

const CUSTOMER_SLUG = 'test-slug';

describe('CustomerPlanContainer', () => {
Expand All @@ -41,10 +35,10 @@ describe('CustomerPlanContainer', () => {

getConfig.mockImplementation(() => ({
ADMIN_PORTAL_BASE_URL: 'http://www.testportal.com',
SUBSIDY_BASE_URL: 'http:www.enterprise-subsidy.com',
LICENSE_MANAGER_URL: 'http:www.license-manager.com',
SUBSIDY_BASE_DJANGO_URL: 'http:www.enterprise-subsidy.com',
LICENSE_MANAGER_DJANGO_URL: 'http:www.license-manager.com',
}));
useAllAssociatedPlans.mockReturnValue({
const mockProps = {
isLoading: false,
activeSubsidies: [{
activeDatetime: '2024-08-23T20:02:57.651943Z',
Expand All @@ -69,10 +63,10 @@ describe('CustomerPlanContainer', () => {
uuid: 'test-uuid',
isActive: false,
}],
});
};
render(
<IntlProvider locale="en">
<CustomerPlanContainer slug={CUSTOMER_SLUG} />
<CustomerPlanContainer slug={CUSTOMER_SLUG} {...mockProps} />
</IntlProvider>,
);
const djangoLinks = screen.getAllByRole('link', { name: 'Open in Django' });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,20 @@ describe('CustomerViewIntegrations', () => {
expect(screen.getByText('API')).toBeInTheDocument();
});
});
it('does not render cards', async () => {
formatDate.mockReturnValue('September 15, 2024');
render(
<IntlProvider locale="en">
<CustomerIntegrations
slug="marcel-the-shell"
activeIntegrations={mockIntegratedChannelData}
activeSSO={[]}
apiCredentialsEnabled={false}
/>
</IntlProvider>,
);
await waitFor(() => {
expect(screen.queryByText('Associated integrations (0)')).not.toBeInTheDocument();
});
});
});
Loading

0 comments on commit 50ced6a

Please sign in to comment.