Skip to content

Commit

Permalink
Merge branch 'master' into zwidekalanga/retired-budgets-policy-list
Browse files Browse the repository at this point in the history
  • Loading branch information
zwidekalanga authored May 21, 2024
2 parents e07d2ab + 093c977 commit 1984865
Show file tree
Hide file tree
Showing 9 changed files with 38 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const BudgetStatusSubtitle = ({
enrollmentType:
intl.formatMessage({
id: 'lcm.budget.detail.page.overview.enroll.assignable',
defaultMessage: 'Assignable',
defaultMessage: 'Assignment',
description: 'Enrollment type for budgets that are assignable',
}),
popoverText:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ export const isInviteEmailAddressesInputValueValid = ({ learnerEmails }) => {
ensureValidationErrorObjectExists();
if (learnerEmailsCount > MAX_EMAIL_ENTRY_LIMIT) {
validationError.reason = 'over_email_max';
validationError.message = `${learnerEmailsCount} emails entered (${MAX_EMAIL_ENTRY_LIMIT}} maximum).`
validationError.message = `${learnerEmailsCount} emails entered (${MAX_EMAIL_ENTRY_LIMIT} maximum). `

Check warning on line 159 in src/components/learner-credit-management/cards/data/utils.js

View check run for this annotation

Codecov / codecov/patch

src/components/learner-credit-management/cards/data/utils.js#L159

Added line #L159 was not covered by tests
+ `Delete ${learnerEmailsCount - MAX_EMAIL_ENTRY_LIMIT} emails to proceed.`;
}
if (invalidEmails.length > 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ const FileUpload = ({ memberInviteMetadata, setEmailAddressesInputValue }) => {
multipleDragged: 'Cannot upload more than one file.',
}}
/>
<InviteModalInputFeedback memberInviteMetadata={memberInviteMetadata} />
<InviteModalInputFeedback memberInviteMetadata={memberInviteMetadata} isCsvUpload />
</Form.Group>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ const InviteModalContent = ({ onEmailAddressesChange, subsidyAccessPolicy }) =>
rows={10}
data-hj-suppress
/>
<InviteModalInputFeedback memberInviteMetadata={memberInviteMetadata} />
<InviteModalInputFeedback memberInviteMetadata={memberInviteMetadata} isCsvUpload={false} />
</Form.Group>
)}
{inputType === INPUT_TYPE.CSV && (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import { Form } from '@edx/paragon';
import PropTypes from 'prop-types';
import { MAX_EMAIL_ENTRY_LIMIT } from '../cards/data';

const InviteModalInputFeedback = (metadata) => {
const { memberInviteMetadata } = metadata;
const InviteModalInputFeedback = ({ memberInviteMetadata, isCsvUpload }) => {
if (memberInviteMetadata.validationError) {
if (!memberInviteMetadata.isValidInput) {
return (
Expand All @@ -18,6 +17,18 @@ const InviteModalInputFeedback = (metadata) => {
</Form.Control.Feedback>
);
}
if (isCsvUpload) {
return (
<div>
{!memberInviteMetadata.lowerCasedEmails.length > 0 ? (
<Form.Control.Feedback>
<p className="mb-0">Maximum invite at a time: {MAX_EMAIL_ENTRY_LIMIT} emails</p>
</Form.Control.Feedback>
) : null}
</div>
);
}

return (
<Form.Control.Feedback>
<p className="mb-0">Maximum invite at a time: {MAX_EMAIL_ENTRY_LIMIT} emails</p>
Expand All @@ -27,14 +38,16 @@ const InviteModalInputFeedback = (metadata) => {
};

InviteModalInputFeedback.propTypes = {
metadata: PropTypes.shape({
memberInviteMetadata: PropTypes.shape({
isValidInput: PropTypes.bool,
validationError: PropTypes.shape({
message: PropTypes.number,
}),
memberInviteMetadata: PropTypes.shape({
isValidInput: PropTypes.bool,
validationError: PropTypes.shape({
message: PropTypes.number,
}),
lowerCasedEmails: PropTypes.arrayOf(
PropTypes.shape({}),
),
}),
isCsvUpload: PropTypes.bool,
};

export default InviteModalInputFeedback;
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import {
useBudgetId, useEnterpriseGroupLearners, useSubsidyAccessPolicy, useContentMetadata,
} from '../../data';
import { EMAIL_ADDRESSES_INPUT_VALUE_DEBOUNCE_DELAY } from '../../cards/data';

import { queryClient } from '../../../test/testUtils';

import InviteMembersModalWrapper from '../InviteMembersModalWrapper';
Expand Down Expand Up @@ -163,6 +162,8 @@ describe('<InviteMemberModal />', () => {
expect(screen.getByText('emails.csv')).toBeInTheDocument();
expect(screen.getByText('Summary (1)')).toBeInTheDocument();
expect(screen.getByText('[email protected]')).toBeInTheDocument();
const formFeedbackText = 'Maximum invite at a time: 1000';
expect(screen.queryByText(formFeedbackText)).not.toBeInTheDocument();
}, { timeout: EMAIL_ADDRESSES_INPUT_VALUE_DEBOUNCE_DELAY + 1000 });
});
it('does not allow non-csv files', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ const KabobMenu = ({
removeAllUsers={removeModal.allUsersSelected}
totalToRemove={totalToRemove}
groupUuid={groupUuid}
isRemoveIndividualUser
/>
</>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ import { useBudgetId, useSubsidyAccessPolicy } from '../../data';
* @param {number} totalToRemove
* @returns {Object}
*/
const generateRemoveModalSubmitLabel = (totalToRemove) => {
const generateRemoveModalSubmitLabel = (totalToRemove, isRemoveIndividualUser) => {
let buttonNumberLabel = 'all';

if (Number.isFinite(totalToRemove)) {
if (isRemoveIndividualUser) {
buttonNumberLabel = 'member';
} else if (Number.isFinite(totalToRemove)) {
buttonNumberLabel = `(${totalToRemove})`;
}

Expand All @@ -41,9 +43,10 @@ const MemberRemoveModal = ({
removeAllUsers,
totalToRemove,
groupUuid,
isRemoveIndividualUser,
}) => {
const [requestState, setRequestState, initialRequestState] = useRequestState(isOpen);
const buttonLabels = generateRemoveModalSubmitLabel(totalToRemove);
const buttonLabels = generateRemoveModalSubmitLabel(totalToRemove, isRemoveIndividualUser);

const title = `Remove member${removeAllUsers || totalToRemove > 1 ? 's' : ''}?`;
const { subsidyAccessPolicyId } = useBudgetId();
Expand Down Expand Up @@ -155,6 +158,7 @@ const MemberRemoveModal = ({
MemberRemoveModal.defaultProps = {
removeAllUsers: false,
totalToRemove: -1,
isRemoveIndividualUser: false,
};

MemberRemoveModal.propTypes = {
Expand All @@ -170,6 +174,7 @@ MemberRemoveModal.propTypes = {
removeAllUsers: PropTypes.bool,
totalToRemove: PropTypes.number,
groupUuid: PropTypes.string.isRequired,
isRemoveIndividualUser: PropTypes.bool,
};

export default MemberRemoveModal;
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,7 @@ describe('<BudgetDetailPage />', () => {

expect(screen.queryByText('Remove members?')).toBeInTheDocument();
const modalRemoveButton = screen.getByTestId('modal-remove-button');
expect(modalRemoveButton).toHaveTextContent('Remove (2)');
userEvent.click(modalRemoveButton);
expect(mockRemoveSpy).toHaveBeenCalled();
await waitForElementToBeRemoved(() => screen.queryByText('Removing (2)'));
Expand Down Expand Up @@ -578,6 +579,7 @@ describe('<BudgetDetailPage />', () => {

await waitFor(() => expect(screen.queryByText('Remove member?')).toBeInTheDocument());
const modalRemoveButton = screen.getByTestId('modal-remove-button');
expect(modalRemoveButton).toHaveTextContent('Remove member');
userEvent.click(modalRemoveButton);
expect(mockRemoveSpy).toHaveBeenCalled();
await waitFor(() => expect(screen.queryByText('1 member successfully removed')).toBeInTheDocument());
Expand Down

0 comments on commit 1984865

Please sign in to comment.