From f1731d0b94b24ab300789c9a7fa67a3f551ca874 Mon Sep 17 00:00:00 2001 From: Kira Miller Date: Thu, 21 Sep 2023 19:40:23 +0000 Subject: [PATCH 1/8] fix: draft PR --- src/components/Sidebar/index.jsx | 3 + .../BudgetCard-V3.jsx | 49 ++ .../MultipleBudgetsPicker.jsx | 2 +- .../learner-credit-management/algoliaUtils.js | 119 +++++ .../cards/CourseCard.jsx | 114 ++++ .../cards/CourseCard.messages.jsx | 27 + .../cards/CourseCard.test.jsx | 85 +++ .../learner-credit-management/index.js | 1 + .../learner-credit.scss | 29 ++ .../search/CatalogSearch.jsx | 239 +++++++++ .../search/CatalogSearchResults.jsx | 486 ++++++++++++++++++ .../search/CatalogSearchResults.messages.js | 70 +++ .../learner-credit-management/utils.jsx | 12 + src/data/constants/learnerCredit.js | 101 ++++ src/data/hooks.js | 19 +- src/static/default-card-header-dark.png | Bin 0 -> 76508 bytes src/static/default-card-header-light.png | Bin 0 -> 27327 bytes 17 files changed, 1354 insertions(+), 2 deletions(-) create mode 100644 src/components/learner-credit-management/BudgetCard-V3.jsx create mode 100644 src/components/learner-credit-management/algoliaUtils.js create mode 100644 src/components/learner-credit-management/cards/CourseCard.jsx create mode 100644 src/components/learner-credit-management/cards/CourseCard.messages.jsx create mode 100644 src/components/learner-credit-management/cards/CourseCard.test.jsx create mode 100644 src/components/learner-credit-management/learner-credit.scss create mode 100644 src/components/learner-credit-management/search/CatalogSearch.jsx create mode 100644 src/components/learner-credit-management/search/CatalogSearchResults.jsx create mode 100644 src/components/learner-credit-management/search/CatalogSearchResults.messages.js create mode 100644 src/components/learner-credit-management/utils.jsx create mode 100644 src/data/constants/learnerCredit.js create mode 100644 src/static/default-card-header-dark.png create mode 100644 src/static/default-card-header-light.png diff --git a/src/components/Sidebar/index.jsx b/src/components/Sidebar/index.jsx index 5a78bf11e8..6d70c19dbd 100644 --- a/src/components/Sidebar/index.jsx +++ b/src/components/Sidebar/index.jsx @@ -39,6 +39,9 @@ const Sidebar = ({ const { canManageLearnerCredit } = useContext(EnterpriseSubsidiesContext); const { FEATURE_CONTENT_HIGHLIGHTS } = getConfig(); + console.log(canManageLearnerCredit); + console.log('hi'); + const getSidebarWidth = useCallback(() => { if (navRef && navRef.current) { const { width } = navRef.current.getBoundingClientRect(); diff --git a/src/components/learner-credit-management/BudgetCard-V3.jsx b/src/components/learner-credit-management/BudgetCard-V3.jsx new file mode 100644 index 0000000000..cb6ed00227 --- /dev/null +++ b/src/components/learner-credit-management/BudgetCard-V3.jsx @@ -0,0 +1,49 @@ +import React, { useState } from 'react'; +import { + SearchData, + SEARCH_FACET_FILTERS, +} from '@edx/frontend-enterprise-catalog-search'; +import { + Tab, Tabs, +} from '@edx/paragon'; +import CatalogSearch from './search/CatalogSearch'; +import { QUERY_TITLE_REFINEMENT, TRACKING_APP_NAME } from '../../data/constants/learnerCredit'; + +const BudgetCard = () => { + const [key, setKey] = useState('activity'); + + return ( + setKey(k)} + className="budget-tabs" + > + + Hello I am the first panel. + + +

Executive Education catalog

+ + + +
+
+ ); +}; + +// BudgetCard.propTypes = { + +// }; + +export default BudgetCard; diff --git a/src/components/learner-credit-management/MultipleBudgetsPicker.jsx b/src/components/learner-credit-management/MultipleBudgetsPicker.jsx index 4c3da2d0ce..aa5b267a03 100644 --- a/src/components/learner-credit-management/MultipleBudgetsPicker.jsx +++ b/src/components/learner-credit-management/MultipleBudgetsPicker.jsx @@ -6,7 +6,7 @@ import { Col, } from '@edx/paragon'; -import BudgetCard from './BudgetCard-V2'; +import BudgetCard from './BudgetCard-V3'; const MultipleBudgetsPicker = ({ offers, diff --git a/src/components/learner-credit-management/algoliaUtils.js b/src/components/learner-credit-management/algoliaUtils.js new file mode 100644 index 0000000000..b8bdee16cf --- /dev/null +++ b/src/components/learner-credit-management/algoliaUtils.js @@ -0,0 +1,119 @@ +import { CONTENT_TYPE_COURSE, CONTENT_TYPE_PROGRAM } from '../../data/constants/learnerCredit'; + +const extractUuid = (aggregationKey) => aggregationKey.split(':')[1]; + +/** + * Converts and algolia course object, into a course representation usable in this UI + */ +function mapAlgoliaObjectToCourse(algoliaCourseObject, intl, messages) { + const { + title: courseTitle, + partners, + first_enrollable_paid_seat_price: coursePrice, // todo + enterprise_catalog_query_titles: courseAssociatedCatalogs, + full_description: courseDescription, + original_image_url: bannerImageUrl, + marketing_url: marketingUrl, + advertised_course_run: courseRun, + upcoming_course_runs: upcomingRuns, + skill_names: skillNames, + } = algoliaCourseObject; + const { start: startDate, end: endDate } = courseRun; + const priceText = coursePrice != null + ? `$${coursePrice.toString()}` + : intl.formatMessage( + messages['catalogSearchResult.table.priceNotAvailable'], + ); + return { + contentType: CONTENT_TYPE_COURSE, + courseTitle, + courseProvider: partners[0].name, + coursePrice: priceText, + courseAssociatedCatalogs, + courseDescription, + partnerLogoImageUrl: partners[0].logo_image_url, + bannerImageUrl, + marketingUrl, + startDate, + endDate, + upcomingRuns, + skillNames, + }; +} + +/** + * Converts an algolia exec ed course object, into a course representation usable in this UI + */ +function mapAlgoliaObjectToExecEd(algoliaCourseObject, intl, messages) { + const { + title: courseTitle, + partners, + entitlements: coursePrice, // todo + enterprise_catalog_query_titles: courseAssociatedCatalogs, + full_description: courseDescription, + original_image_url: bannerImageUrl, + marketing_url: marketingUrl, + upcoming_course_runs: upcomingRuns, + skill_names: skillNames, + additional_metadata: additionalMetadata, + } = algoliaCourseObject; + const { start_date: startDate, end_date: endDate } = additionalMetadata; + const priceText = coursePrice != null + ? `$${coursePrice[0].price.toString()}` + : intl.formatMessage( + messages['catalogSearchResult.table.priceNotAvailable'], + ); + return { + contentType: CONTENT_TYPE_COURSE, + courseTitle, + courseProvider: partners[0].name, + coursePrice: priceText, + courseAssociatedCatalogs, + courseDescription, + partnerLogoImageUrl: partners[0].logo_image_url, + bannerImageUrl, + marketingUrl, + startDate, + endDate, + upcomingRuns, + skillNames, + }; +} + +/** + * Converts an algolia course object, into a course representation usable in this UI + */ +function mapAlgoliaObjectToProgram(algoliaProgramObject) { + const { + title, + partners, + full_description: programDescription, + aggregation_key: aggregationKey, + card_image_url: cardImageUrl, + banner_image_url: bannerImageUrl, + enterprise_catalog_query_titles: programAssociatedCatalogs, + marketing_url: marketingUrl, + prices: programPrices, + learning_items: learningItems, + course_details: courseDetails, + } = algoliaProgramObject; + return { + contentType: CONTENT_TYPE_PROGRAM, + programUuid: extractUuid(aggregationKey), + programTitle: title, + programProvider: partners[0].name, + programDescription, + programAssociatedCatalogs, + partnerLogoImageUrl: partners[0].logo_image_url, + cardImageUrl, + marketingUrl, + programPrices, + learningItems, + bannerImageUrl, + programCourses: courseDetails, + }; +} + +export { + mapAlgoliaObjectToProgram, mapAlgoliaObjectToExecEd, mapAlgoliaObjectToCourse, extractUuid, +}; diff --git a/src/components/learner-credit-management/cards/CourseCard.jsx b/src/components/learner-credit-management/cards/CourseCard.jsx new file mode 100644 index 0000000000..6e7b5f5b93 --- /dev/null +++ b/src/components/learner-credit-management/cards/CourseCard.jsx @@ -0,0 +1,114 @@ +/* eslint-disable camelcase */ +// variables taken from algolia not in camelcase +import React from 'react'; +import PropTypes from 'prop-types'; + +import { Badge, Button, Card, Icon } from '@edx/paragon'; +import { Launch } from '@edx/paragon/icons'; +import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import messages from './CourseCard.messages'; +import { CONTENT_TYPE_COURSE, EXEC_COURSE_TYPE } from '../../../data/constants/learnerCredit'; +import defaultCardHeader from '../../../static/default-card-header-light.png'; +import { formatDate } from '../utils'; + +const CourseCard = ({ + intl, onClick, original, learningType, +}) => { + const { + title, + card_image_url, + partners, + first_enrollable_paid_seat_price, + enterprise_catalog_query_titles, + entitlements, + advertised_course_run, + course_type, + } = original; + + let rowPrice; + let priceText; + + console.log(original); + + if (learningType === CONTENT_TYPE_COURSE) { + rowPrice = first_enrollable_paid_seat_price; + priceText = rowPrice != null ? `$${rowPrice.toString()}` : 'N/A'; + } else { + [rowPrice] = entitlements || [null]; + priceText = rowPrice != null ? `$${Math.trunc(rowPrice.price)?.toString()}` : 'N/A'; + } + + const imageSrc = card_image_url || defaultCardHeader; + const altText = `${title} course image`; + + return ( + onClick(original)} + orientation="horizontal" + > + +
+
+

{title}

+

{partners[0].name}

+ {course_type === EXEC_COURSE_TYPE && ( + + Executive Education + + )} + {course_type !== EXEC_COURSE_TYPE && ( +

+ )} +

+ Starts {formatDate(original.normalized_metadata.start_date)} • + Learner must register by {formatDate(original.normalized_metadata.enroll_by_date)} +

+
+ +

{priceText}

+

Per learner price

+ + + + +
+
+
+ ); +}; + +CourseCard.defaultProps = { + onClick: () => {}, +}; + +CourseCard.propTypes = { + intl: intlShape.isRequired, + onClick: PropTypes.func, + learningType: PropTypes.string.isRequired, + original: PropTypes.shape({ + title: PropTypes.string, + card_image_url: PropTypes.string, + entitlements: PropTypes.arrayOf(PropTypes.shape()), + advertised_course_run: PropTypes.shape(), + partners: PropTypes.arrayOf( + PropTypes.shape({ + name: PropTypes.string, + logo_image_url: PropTypes.string, + }), + ), + normalized_metadata: PropTypes.shape(), + first_enrollable_paid_seat_price: PropTypes.number, + enterprise_catalog_query_titles: PropTypes.arrayOf(PropTypes.string), + original_image_url: PropTypes.string, + }).isRequired, +}; + +export default injectIntl(CourseCard); diff --git a/src/components/learner-credit-management/cards/CourseCard.messages.jsx b/src/components/learner-credit-management/cards/CourseCard.messages.jsx new file mode 100644 index 0000000000..01b82ab3ac --- /dev/null +++ b/src/components/learner-credit-management/cards/CourseCard.messages.jsx @@ -0,0 +1,27 @@ +import { defineMessages } from '@edx/frontend-platform/i18n'; + +const messages = defineMessages({ + 'courseCard.relatedSkillsHeading': { + id: 'courseCard.relatedSkillsHeading', + defaultMessage: 'Related skills', + description: 'Heading of related skills section', + }, + 'courseCard.aLaCarteBadge': { + id: 'courseCard.aLaCarteBadge', + defaultMessage: 'A la carte', + description: 'Badge text for the `A La Carte` catalog badge.', + }, + 'courseCard.businessBadge': { + id: 'courseCard.businessBadge', + defaultMessage: 'Business', + description: 'Badge text for the `Business` catalog badge.', + }, + 'courseCard.priceNotAvailable': { + id: 'courseCard.priceNotAvailable', + defaultMessage: ' Not Available', + description: + 'When a course price is not available, notify learners that there is no data available to display.', + }, +}); + +export default messages; diff --git a/src/components/learner-credit-management/cards/CourseCard.test.jsx b/src/components/learner-credit-management/cards/CourseCard.test.jsx new file mode 100644 index 0000000000..f9b1dabe97 --- /dev/null +++ b/src/components/learner-credit-management/cards/CourseCard.test.jsx @@ -0,0 +1,85 @@ +import React from 'react'; +import { fireEvent, render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; + +import { IntlProvider } from '@edx/frontend-platform/i18n'; +import CourseCard from './CourseCard'; +import { CONTENT_TYPE_COURSE, EXEC_ED_TITLE } from '../../constants'; + +jest.mock('@edx/frontend-platform', () => ({ + ...jest.requireActual('@edx/frontend-platform'), +})); + +const TEST_CATALOG = ['ayylmao']; + +const originalData = { + title: 'Course Title', + card_image_url: undefined, + partners: [{ logo_image_url: '', name: 'Course Provider' }], + first_enrollable_paid_seat_price: 100, + original_image_url: '', + enterprise_catalog_query_titles: TEST_CATALOG, + advertised_course_run: { pacing_type: 'self_paced' }, +}; + +const defaultProps = { + original: originalData, + learningType: CONTENT_TYPE_COURSE, +}; + +const execEdData = { + title: 'Course Title', + card_image_url: undefined, + partners: [{ logo_image_url: '', name: 'Course Provider' }], + first_enrollable_paid_seat_price: 100, + original_image_url: '', + enterprise_catalog_query_titles: TEST_CATALOG, + advertised_course_run: { pacing_type: 'instructor_paced' }, + entitlements: [{ price: '999.00' }], +}; + +const execEdProps = { + original: execEdData, + learningType: EXEC_ED_TITLE, +}; + +describe('Course card works as expected', () => { + test('card renders as expected', () => { + process.env.EDX_FOR_BUSINESS_TITLE = 'ayylmao'; + process.env.EDX_ENTERPRISE_ALACARTE_TITLE = 'baz'; + render( + + + , + ); + expect(screen.queryByText(defaultProps.original.title)).toBeInTheDocument(); + expect( + screen.queryByText(defaultProps.original.partners[0].name), + ).toBeInTheDocument(); + expect(screen.queryByText('$100 • Self paced')).toBeInTheDocument(); + expect(screen.queryByText('Business')).toBeInTheDocument(); + }); + test('test card renders default image', async () => { + render( + + + , + ); + const imageAltText = `${originalData.title} course image`; + fireEvent.error(screen.getByAltText(imageAltText)); + await expect(screen.getByAltText(imageAltText).src).not.toBeUndefined; + }); + test('exec ed card renders correct price from entitlement', async () => { + process.env.EDX_FOR_BUSINESS_TITLE = 'ayylmao'; + process.env.EDX_ENTERPRISE_ALACARTE_TITLE = 'baz'; + render( + + + , + ); + expect(screen.queryByText(execEdProps.original.title)).toBeInTheDocument(); + // price decimal should be truncated + expect(screen.queryByText('$999 • Instructor led')).toBeInTheDocument(); + expect(screen.queryByText('Business')).toBeInTheDocument(); + }); +}); diff --git a/src/components/learner-credit-management/index.js b/src/components/learner-credit-management/index.js index 271f4453ed..ff16dee97e 100644 --- a/src/components/learner-credit-management/index.js +++ b/src/components/learner-credit-management/index.js @@ -1,3 +1,4 @@ import MultipleBudgetsPage from './MultipleBudgetsPage'; +import './learner-credit.scss'; export default MultipleBudgetsPage; diff --git a/src/components/learner-credit-management/learner-credit.scss b/src/components/learner-credit-management/learner-credit.scss new file mode 100644 index 0000000000..b2e7abe096 --- /dev/null +++ b/src/components/learner-credit-management/learner-credit.scss @@ -0,0 +1,29 @@ +.budget-tabs { + width: 300px; +} + +.card-container { + display: flex; + padding: 1rem; + flex-grow: 1; + justify-content: space-between; + + .section-1 { + flex-direction: column; + } + .section-2 { + margin-left: 0; + text-align: end !important; + min-width: 400px; + padding-right: 0; + justify-content: space-between; + .footer { + justify-content: end; + padding: 0; + } + } +} + +.badge { + margin: 4px; +} diff --git a/src/components/learner-credit-management/search/CatalogSearch.jsx b/src/components/learner-credit-management/search/CatalogSearch.jsx new file mode 100644 index 0000000000..c3b995c770 --- /dev/null +++ b/src/components/learner-credit-management/search/CatalogSearch.jsx @@ -0,0 +1,239 @@ +import React, { + useContext, useState, useMemo, useEffect, +} from 'react'; +import { + FormattedMessage, + injectIntl, +} from '@edx/frontend-platform/i18n'; +import algoliasearch from 'algoliasearch/lite'; + +import { getConfig } from '@edx/frontend-platform/config'; +import { Configure, Index, InstantSearch } from 'react-instantsearch-dom'; +import { + SearchHeader, + SearchContext, +} from '@edx/frontend-enterprise-catalog-search'; +import { configuration } from '../../../config'; + +import { + CONTENT_TYPE_COURSE, + CONTENT_TYPE_PROGRAM, + EXEC_ED_TITLE, + LEARNING_TYPE_REFINEMENT, + NUM_RESULTS_COURSE, + NUM_RESULTS_PROGRAM, + NUM_RESULTS_PER_PAGE, +} from '../../../data/constants/learnerCredit'; +import CatalogSearchResults from './CatalogSearchResults'; + +const CatalogSearch = () => { + function convertLearningTypesToFilters(types) { + return types.reduce((learningFacets, type) => { + if (type === EXEC_ED_TITLE) { + learningFacets.push(`"${type}"`); + } else { + learningFacets.push(type); + } + return learningFacets; + }, []).join(' OR '); + } + console.log(`${LEARNING_TYPE_REFINEMENT}`); + console.log(useContext(SearchContext)); + const { + refinements: { + [LEARNING_TYPE_REFINEMENT]: learningType, + enterprise_catalog_query_titles: enterpriseCatalogQueryTitles, + }, + } = useContext(SearchContext); + const searchClient = algoliasearch(configuration.ALGOLIA.APP_ID, configuration.ALGOLIA.SEARCH_API_KEY); + const courseFilter = `${LEARNING_TYPE_REFINEMENT}:${CONTENT_TYPE_COURSE}`; + const execEdFilter = `${LEARNING_TYPE_REFINEMENT}:"${EXEC_ED_TITLE}"`; + const programFilter = `${LEARNING_TYPE_REFINEMENT}:${CONTENT_TYPE_PROGRAM}`; + const [noCourseResults, setNoCourseResults] = useState(false); + const [noProgramResults, setNoProgramResults] = useState(false); + const [noExecEdResults, setNoExecEdResults] = useState(false); + const [specifiedContentType, setSpecifiedContentType] = useState(); + const [ + suggestedSearchContentTypeFilter, + setSuggestedSearchContentTypeFilter, + ] = useState(''); + + const [contentWithResults, setContentWithResults] = useState([]); + const [contentWithoutResults, setContentWithoutResults] = useState([]); + + const contentData = useMemo( + () => ({ + [CONTENT_TYPE_COURSE]: { + filter: courseFilter, + noResults: noCourseResults, + setNoResults: setNoCourseResults, + numResults: NUM_RESULTS_COURSE, + }, + [EXEC_ED_TITLE]: { + filter: execEdFilter, + noResults: noExecEdResults, + setNoResults: setNoExecEdResults, + numResults: NUM_RESULTS_COURSE, + }, + [CONTENT_TYPE_PROGRAM]: { + filter: programFilter, + noResults: noProgramResults, + setNoResults: setNoProgramResults, + numResults: NUM_RESULTS_PROGRAM, + }, + }), + [ + courseFilter, + execEdFilter, + programFilter, + noCourseResults, + noExecEdResults, + noProgramResults, + ], + ); + + useEffect(() => { + contentData[CONTENT_TYPE_COURSE].noResults = noCourseResults; + contentData[CONTENT_TYPE_PROGRAM].noResults = noProgramResults; + contentData[EXEC_ED_TITLE].noResults = noExecEdResults; + }, [noCourseResults, noProgramResults, noExecEdResults, contentData]); + + // set specified content types & suggested search content types + useEffect(() => { + if (learningType) { + if (learningType.length === 1) { + setSpecifiedContentType(learningType); + } + setSuggestedSearchContentTypeFilter( + convertLearningTypesToFilters(learningType), + ); + } else { + setSpecifiedContentType(undefined); + setSuggestedSearchContentTypeFilter( + [ + CONTENT_TYPE_COURSE, + CONTENT_TYPE_PROGRAM, + `"${EXEC_ED_TITLE}"`, + ] + .map((item) => `${LEARNING_TYPE_REFINEMENT}:${item}`) + .join(' OR '), + ); + } + }, [learningType, setSpecifiedContentType]); + + const config = getConfig(); + const courseIndex = useMemo(() => { + const cIndex = searchClient.initIndex(config.ALGOLIA_INDEX_NAME); + return cIndex; + }, [config.ALGOLIA_INDEX_NAME, searchClient]); + + // Build out the list of content to display, ordering first by learning types that currently have results + // and then by `course` > `exec ed` > `program`. Make sure to remove exec ed if the feature flag is disabled + // or if the currently selected catalog isn't `a la carte`. + useEffect(() => { + const defaultTypes = [ + CONTENT_TYPE_COURSE, + EXEC_ED_TITLE, + CONTENT_TYPE_PROGRAM, + ]; + // Grab content type(s) to use + const contentToDisplay = learningType + ? defaultTypes.filter((value) => learningType.includes(value)) + : defaultTypes; + + // Determine if we need to remove exec ed + if ( + (enterpriseCatalogQueryTitles + && !enterpriseCatalogQueryTitles.includes( + config.EDX_ENTERPRISE_ALACARTE_TITLE, + )) + ) { + if (contentToDisplay.indexOf(EXEC_ED_TITLE) > 0) { + contentToDisplay.splice( + contentToDisplay.indexOf(EXEC_ED_TITLE), + 1, + ); + } + } + + // rendering in order of what content we have search results for + const resultList = contentToDisplay.filter( + (obj) => !contentData[obj].noResults, + ); + setContentWithResults(resultList); + + const noResultList = contentToDisplay.filter( + (obj) => contentData[obj].noResults, + ); + setContentWithoutResults(noResultList); + }, [ + enterpriseCatalogQueryTitles, + config, + specifiedContentType, + learningType, + contentData, + noCourseResults, + noProgramResults, + noExecEdResults, + ]); + + // Take a list of learning types and render a search results component for each item + const contentToRender = (items) => { + const itemsWithResultsList = items.map((item) => ( + + + + + )); + return itemsWithResultsList; + }; + + const defaultInstantSearchFilter = `${LEARNING_TYPE_REFINEMENT}:${CONTENT_TYPE_COURSE} OR ${LEARNING_TYPE_REFINEMENT}:${CONTENT_TYPE_PROGRAM} OR ${LEARNING_TYPE_REFINEMENT}:"${EXEC_ED_TITLE}"`; + + return ( +
+ + +
+ + +
+ <> + {contentToRender([...contentWithResults, ...contentWithoutResults])} + +
+
+ ); +}; + +export default injectIntl(CatalogSearch); diff --git a/src/components/learner-credit-management/search/CatalogSearchResults.jsx b/src/components/learner-credit-management/search/CatalogSearchResults.jsx new file mode 100644 index 0000000000..ca32e8c9e4 --- /dev/null +++ b/src/components/learner-credit-management/search/CatalogSearchResults.jsx @@ -0,0 +1,486 @@ +import algoliasearch from 'algoliasearch/lite'; +import { + SearchContext, + SearchPagination, + setRefinementAction, + useNbHitsFromSearchResults, +} from '@edx/frontend-enterprise-catalog-search'; +import { + FormattedMessage, + injectIntl, + intlShape, +} from '@edx/frontend-platform/i18n'; +import { + Alert, Badge, Button, CardView, DataTable, Skeleton, +} from '@edx/paragon'; +import PropTypes from 'prop-types'; +import React, { + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react'; +import { + Configure, + connectStateResults, + Index, + InstantSearch, +} from 'react-instantsearch-dom'; +import { + CONTENT_TYPE_COURSE, + CONTENT_TYPE_PROGRAM, + COURSE_TITLE, + EDX_COURSE_TITLE_DESC, + EXEC_ED_TITLE, + HIDE_PRICE_REFINEMENT, + LEARNING_TYPE_REFINEMENT, + NO_RESULTS_PAGE_SIZE, + PROGRAM_TITLE, + PROGRAM_TITLE_DESC, + QUERY_TITLE_REFINEMENT, + TWOU_EXEC_ED_TITLE_DESC, +} from '../../../data/constants/learnerCredit'; +import { mapAlgoliaObjectToCourse, mapAlgoliaObjectToExecEd, mapAlgoliaObjectToProgram } from '../algoliaUtils'; +import { useSelectedCourse } from '../../../data/hooks'; +import { configuration } from '../../../config'; +import CourseCard from '../cards/CourseCard'; + +import messages from './CatalogSearchResults.messages'; + +// import { formatDate, makePlural, getSelectedCatalogFromURL } from '../../utils/common'; + +export function getSelectedCatalogFromURL() { + const urlSearchParams = new URLSearchParams(window.location.search); + const params = Object.fromEntries(urlSearchParams.entries()); + return params.enterprise_catalog_query_titles; +} + +export const ERROR_MESSAGE = 'An error occurred while retrieving data'; + +export const SKELETON_DATA_TESTID = 'enterprise-catalog-skeleton'; + +/** + * The core search results rendering component. + * + * Wrapping this in `connectStateResults()` will inject the first few props. + * + * @param {object} args arguments + * @param {object} args.searchResults Results of search (see: `connectStateResults``) + * @param {Boolean} args.isSearchStalled Whether search is stalled (see: `connectStateResults`) + * @param {object} args.searchState contents of search state, like `page` (see: `connectStateResults``) + * @param {object} args.error Error with `message` field if available (see: `connectStateResults``) + * @param {object} args.paginationComponent Defaults to but can be injected + * @param {object} args.contentType Whether the search is for courses or programs + * @param {object} args.preview Whether we are on the split screen landing page or regular + */ + +export const BaseCatalogSearchResults = ({ + intl, + searchResults, + // algolia recommends this prop instead of searching + isSearchStalled, + searchState, + error, + paginationComponent: PaginationComponent, + contentType, + setNoContent, + preview, +}) => { + const searchClient = algoliasearch(configuration.ALGOLIA.APP_ID, configuration.ALGOLIA.SEARCH_API_KEY); + const [isProgramType, setIsProgramType] = useState(); + const [isCourseType, setIsCourseType] = useState(); + const [isExecEdType, setIsExecEdType] = useState(); + + useEffect(() => { + setIsProgramType(contentType === CONTENT_TYPE_PROGRAM); + setIsCourseType(contentType === CONTENT_TYPE_COURSE); + setIsExecEdType(contentType === EXEC_ED_TITLE); + }, [contentType]); + + const TABLE_HEADERS = useMemo( + () => ({ + courseName: intl.formatMessage( + messages['catalogSearchResults.table.courseName'], + ), + partner: intl.formatMessage( + messages['catalogSearchResults.table.partner'], + ), + price: intl.formatMessage(messages['catalogSearchResults.table.price']), + availability: intl.formatMessage( + messages['catalogSearchResults.table.availability'], + ), + catalogs: intl.formatMessage( + messages['catalogSearchResults.table.catalogs'], + ), + programName: intl.formatMessage( + messages['catalogSearchResults.table.programName'], + ), + numCourses: intl.formatMessage( + messages['catalogSearchResults.table.numCourses'], + ), + programType: intl.formatMessage( + messages['catalogSearchResults.table.programType'], + ), + }), + [intl], + ); + + const { refinements, dispatch } = useContext(SearchContext); + const nbHits = useNbHitsFromSearchResults(searchResults); + const linkText = `See all (${nbHits}) >`; + + const [selectedCourse, setSelectedCourse, isProgram, isCourse] = useSelectedCourse(); + + const [cardView, setCardView] = useState(true); + + const cardClicked = useCallback( + (card) => { + if (isProgramType) { + setSelectedCourse(mapAlgoliaObjectToProgram(card)); + } else if (isExecEdType) { + setSelectedCourse(mapAlgoliaObjectToExecEd(card, intl, messages)); + } else { + setSelectedCourse(mapAlgoliaObjectToCourse(card, intl, messages)); + } + }, + [intl, isProgramType, setSelectedCourse, isExecEdType], + ); + + const refinementClick = () => { + if (isCourseType) { + dispatch( + setRefinementAction(LEARNING_TYPE_REFINEMENT, [CONTENT_TYPE_COURSE]), + ); + } else if (isExecEdType) { + dispatch( + setRefinementAction(LEARNING_TYPE_REFINEMENT, [ + EXEC_ED_TITLE, + ]), + ); + } else { + dispatch( + setRefinementAction(LEARNING_TYPE_REFINEMENT, [CONTENT_TYPE_PROGRAM]), + ); + } + }; + + const renderCardComponent = (props) => { + if (contentType === CONTENT_TYPE_COURSE) { + return ; + } + if (contentType === EXEC_ED_TITLE) { + return ; + } + return null; + // return ; + }; + + const availabilityColumn = { + id: 'availability-column', + Header: TABLE_HEADERS.availability, + accessor: 'advertised_course_run', + // Cell: ({ row }) => formatDate(row.values.advertised_course_run), + Cell: ({ row }) => row.values.advertised_course_run, + + }; + + // NOTE: Cell is not explicity supported in DataTable, which leads to lint errors regarding {row}. However, we needed + // to use the accessor functionality instead of just adding in additionalColumns like the Paragon documentation. + const courseColumns = useMemo( + () => [ + { + Header: TABLE_HEADERS.partner, + accessor: 'partners[0].name', + }, + { + Header: TABLE_HEADERS.price, + accessor: 'first_enrollable_paid_seat_price', + Cell: ({ row }) => (row.values.first_enrollable_paid_seat_price + ? `$${row.values.first_enrollable_paid_seat_price}` + : null), + }, + ], + [TABLE_HEADERS], + ); + + const execEdColumns = useMemo( + () => [ + { + Header: TABLE_HEADERS.partner, + accessor: 'partners[0].name', + }, + { + Header: TABLE_HEADERS.price, + accessor: 'entitlements', + Cell: ({ row }) => (row.values.entitlements[0].price + ? `$${Math.trunc(row.values.entitlements[0].price)}` + : null), + }, + ], + [TABLE_HEADERS], + ); + + const programColumns = useMemo( + () => [ + { + Header: TABLE_HEADERS.partner, + accessor: 'authoring_organizations[0].name', + }, + { + Header: TABLE_HEADERS.numCourses, + accessor: 'course_keys', + Cell: ({ row }) => (row.values.course_keys.length > 0 + ? `${row.values.course_keys.length}` + : 'Available upon request'), + }, + { + Header: TABLE_HEADERS.programType, + accessor: 'program_type', + }, + ], + [TABLE_HEADERS], + ); + + const [chosenColumn, setChosenColumns] = useState(courseColumns); + + // Select which columns to use depending on the current content type + useEffect(() => { + if (isCourseType) { + setChosenColumns(courseColumns); + } else if (isProgramType) { + setChosenColumns(programColumns); + } else { + setChosenColumns(execEdColumns); + } + }, [ + setChosenColumns, + courseColumns, + programColumns, + execEdColumns, + isCourseType, + isProgramType, + chosenColumn, + ]); + + // substituting the price column with the availability dates per customer request ENT-5041 + const page = refinements.page || (searchState ? searchState.page : 0); + if (HIDE_PRICE_REFINEMENT in refinements) { + courseColumns[2] = availabilityColumn; + } + const tableData = useMemo( + () => searchResults?.hits || [], + [searchResults?.hits], + ); + // const query = new URLSearchParams(window.location.search.substring(1)); + const toggleOptions = preview + ? {} + : { + isDataViewToggleEnabled: true, + onDataViewToggle: (val) => setCardView(val === 'card'), + togglePlacement: 'left', + defaultActiveStateValue: 'card', + }; + + function contentTitle() { + let subTitle; + if (isExecEdType) { + subTitle = EXEC_ED_TITLE; + } else if (isCourseType) { + subTitle = COURSE_TITLE; + } else { + subTitle = PROGRAM_TITLE; + } + if (refinements.q && refinements.q !== '') { + subTitle = `"${refinements.q}" ${subTitle} "`; + // (${makePlural( + // nbHits, + // 'result', + // )})`; + } + return subTitle; + } + + function contentTitleDescription() { + let desc; + if (isExecEdType) { + desc = TWOU_EXEC_ED_TITLE_DESC; + } else if (isCourseType) { + desc = EDX_COURSE_TITLE_DESC; + } else { + desc = PROGRAM_TITLE_DESC; + } + return desc; + } + + useEffect(() => { + setNoContent(searchResults === null || searchResults?.nbHits === 0); + }, [searchResults, setNoContent]); + + // const inputQuery = query.get('q'); + + const dataTableActions = () => { + // if (preview || searchResults?.nbHits === 0) { + // return null; + // } + + // return ( + // + // ); + }; + + if (isSearchStalled) { + return ( +
+ +
+ ); + } + if (error) { + return ( + + + + ); + } + + const CustomRowStatus = () => null; + + return ( + <> +
+

+ {contentTitle()} + {isExecEdType && searchResults?.nbHits !== 0 && ( + + New + + )} +

+ {searchResults?.nbHits !== 0 && preview && ( +
+ +
+ )} +
+ {searchResults?.nbHits !== 0 && ( +

{contentTitleDescription()}

+ )} +
+ {searchResults?.nbHits === 0 && ( + + + + {/* */} + + + )} + {searchResults?.nbHits !== 0 && ( + + + {cardView && ( + renderCardComponent(props)} + /> + )} + {!cardView && } + + {!preview && ( + + + + )} + + )} +
+ + ); +}; + +BaseCatalogSearchResults.defaultProps = { + searchResults: { disjunctiveFacetsRefinements: [], nbHits: 0, hits: [] }, + error: null, + paginationComponent: SearchPagination, + row: null, + preview: false, + setNoContent: () => {}, + courseType: null, +}; + +BaseCatalogSearchResults.propTypes = { + intl: intlShape.isRequired, + // from Algolia + searchResults: PropTypes.shape({ + _state: PropTypes.shape({ + disjunctiveFacetsRefinements: PropTypes.shape({}), + }), + disjunctiveFacetsRefinements: PropTypes.arrayOf(PropTypes.shape({})), + nbHits: PropTypes.number, + hits: PropTypes.arrayOf(PropTypes.shape({})), + nbPages: PropTypes.number, + hitsPerPage: PropTypes.number, + page: PropTypes.number, + }), + isSearchStalled: PropTypes.bool.isRequired, + error: PropTypes.shape({ + message: PropTypes.string, + }), + + searchState: PropTypes.shape({ + page: PropTypes.number, + }).isRequired, + paginationComponent: PropTypes.func, + // eslint-disable-next-line react/no-unused-prop-types + row: PropTypes.string, + contentType: PropTypes.string.isRequired, + courseType: PropTypes.string, + preview: PropTypes.bool, + setNoContent: PropTypes.func, +}; + +export default connectStateResults(injectIntl(BaseCatalogSearchResults)); diff --git a/src/components/learner-credit-management/search/CatalogSearchResults.messages.js b/src/components/learner-credit-management/search/CatalogSearchResults.messages.js new file mode 100644 index 0000000000..009d3ea5ca --- /dev/null +++ b/src/components/learner-credit-management/search/CatalogSearchResults.messages.js @@ -0,0 +1,70 @@ +import { defineMessages } from '@edx/frontend-platform/i18n'; + +const messages = defineMessages({ + 'catalogSearchResults.table.courseName': { + id: 'catalogSearchResults.table.courseName', + defaultMessage: 'Course name', + description: 'Table column title for course names', + }, + 'catalogSearchResults.table.partner': { + id: 'catalogSearchResults.table.partner', + defaultMessage: 'Partner', + description: + 'The partner institution providing/authoring the course (ie Harvard, MIT, etc.)', + }, + 'catalogSearchResults.table.price': { + id: 'catalogSearchResults.table.price', + defaultMessage: 'A la carte course price', + description: + 'Table column A La Carte price for the course - optional column', + }, + 'catalogSearchResults.table.availability': { + id: 'catalogSearchResults.table.availability', + defaultMessage: 'Course Availability', + description: + 'Table column form course availability dates - optional column', + }, + 'catalogSearchResults.table.catalogs': { + id: 'catalogSearchResults.table.catalogs', + defaultMessage: 'Associated catalogs', + description: 'Table column title for associated subscription catalogs', + }, + 'catalogSearchResults.table.priceNotAvailable': { + id: 'catalogSearchResults.table.priceNotAvailable', + defaultMessage: 'Not Available', + description: + 'When a course price is not available, notify learners that there is no data available to display.', + }, + 'catalogSearchResults.table.programName': { + id: 'catalogSearchResults.table.programName', + defaultMessage: 'Program Name', + description: 'Table column title for course names', + }, + 'catalogSearchResults.table.numCourses': { + id: 'catalogSearchResults.table.numCourses', + defaultMessage: 'Number of Courses', + description: 'Table column for number of courses associated with program', + }, + 'catalogSearchResults.table.programType': { + id: 'catalogSearchResults.table.programType', + defaultMessage: 'Program Type', + description: 'Table column for the type of program.', + }, + 'catalogSearchResults.aLaCarteBadge': { + id: 'catalogSearchResults.aLaCarteBadge', + defaultMessage: 'A la carte', + description: 'Badge text for the `A La Carte` catalog badge.', + }, + 'catalogSearchResults.businessBadge': { + id: 'catalogSearchResults.businessBadge', + defaultMessage: 'Business', + description: 'Badge text for the `Business` catalog badge.', + }, + 'catalogSearchResults.popularCourses': { + id: 'catalogSearchResults.popularCourses', + defaultMessage: 'Popular Courses', + description: 'Popular Courses table header.', + }, +}); + +export default messages; diff --git a/src/components/learner-credit-management/utils.jsx b/src/components/learner-credit-management/utils.jsx new file mode 100644 index 0000000000..2fe5b328b6 --- /dev/null +++ b/src/components/learner-credit-management/utils.jsx @@ -0,0 +1,12 @@ +import dayjs from 'dayjs'; + +export function makePlural(num, string) { + if (num > 1 || num === 0) { + return `${num} ${string}s`; + } + return `${num} ${string}`; +} + +export function formatDate(date) { + return dayjs(date).format('MMM D, YYYY'); +} diff --git a/src/data/constants/learnerCredit.js b/src/data/constants/learnerCredit.js new file mode 100644 index 0000000000..8954e226ad --- /dev/null +++ b/src/data/constants/learnerCredit.js @@ -0,0 +1,101 @@ +/* eslint-disable import/prefer-default-export */ +import { hasFeatureFlagEnabled } from '@edx/frontend-enterprise-utils'; +import { SEARCH_FACET_FILTERS } from '@edx/frontend-enterprise-catalog-search'; + +export const FEATURE_ENABLE_PROGRAMS = 'ENABLE_PROGRAMS'; +export const FEATURE_PROGRAM_TYPE_FACET = 'ENABLE_PROGRAM_TYPE_FACET'; +export const FEATURE_EXEC_ED_INCLUSION = 'ENABLE_EXEC_ED_INCLUSION'; + +const features = { + ENABLE_PROGRAMS: + process.env.FEATURE_ENABLE_PROGRAMS === 'true' + || hasFeatureFlagEnabled(FEATURE_ENABLE_PROGRAMS), + PROGRAM_TYPE_FACET: + process.env.FEATURE_PROGRAM_TYPE_FACET === 'true' + || hasFeatureFlagEnabled(FEATURE_PROGRAM_TYPE_FACET), + EXEC_ED_INCLUSION: + process.env.EXEC_ED_INCLUSION === 'true' + || hasFeatureFlagEnabled(FEATURE_EXEC_ED_INCLUSION), +}; + +export const PAGE_TITLE = 'edX Enterprise Catalogs'; + +/** + * Event names to use for tracking + * Spec: https://openedx.atlassian.net/wiki/spaces/AN/pages/2624455676/Enterprise+public+catalog+Event+Design + */ +export const TRACKING_APP_NAME = 'admin-portal'; +// end: tracking related +export const QUERY_TITLE_REFINEMENT = 'enterprise_catalog_query_titles'; +export const AVAILABILITY_REFINEMENT = 'availability'; +export const AVAILABILITY_REFINEMENT_DEFAULTS = [ + 'Available Now', + 'Starting Soon', + 'Upcoming', +]; + +// Facet filters +export const CONTENT_TYPE_REFINEMENT = 'content_type'; +export const COURSE_TYPE_REFINEMENT = 'course_type'; +export const LEARNING_TYPE_REFINEMENT = 'learning_type'; + +// Page refinement settings +export const HIDE_CARDS_REFINEMENT = 'hide_cards'; +export const HIDE_PRICE_REFINEMENT = 'hide_price'; +export const NUM_RESULTS_PER_PAGE = 40; + +// Learning types +export const CONTENT_TYPE_COURSE = 'course'; +export const CONTENT_TYPE_PROGRAM = 'program'; +export const EXEC_ED_TITLE = 'Executive Education'; + +// Page metric settings +export const NUM_RESULTS_PROGRAM = 4; +export const NUM_RESULTS_COURSE = 8; + +export const COURSE_TITLE = 'Courses'; +export const PROGRAM_TITLE = 'Programs'; + +export const NO_RESULTS_DECK_ITEM_COUNT = 4; +export const NO_RESULTS_PAGE_ITEM_COUNT = 1; +export const NO_RESULTS_PAGE_SIZE = 4; + +// Descriptions +export const EDX_COURSE_TITLE_DESC = 'Self paced online learning from world-class academic institutions and corporate partners.'; +export const TWOU_EXEC_ED_TITLE_DESC = 'Immersive, instructor led online short courses designed to develop interpersonal, analytical, and critical thinking skills.'; +export const PROGRAM_TITLE_DESC = 'Multi-course bundled learning for skills mastery and to earn credentials such as Professional Certificates, MicroBachelors™, MicroMasters®, and Master’s Degrees.'; + +export const EXEC_COURSE_TYPE = 'executive-education-2u'; + +const OVERRIDE_FACET_FILTERS = []; +if (features.PROGRAM_TYPE_FACET) { + const PROGRAM_TYPE_FACET_OVERRIDE = { + overrideSearchKey: 'title', + overrideSearchValue: 'Program', + updatedFacetFilterValue: { + attribute: 'program_type', + title: 'Program', + isSortedAlphabetical: true, + typeaheadOptions: { + placeholder: 'Find a program...', + ariaLabel: 'Type to find a program', + minLength: 3, + }, + }, + }; + OVERRIDE_FACET_FILTERS.push(PROGRAM_TYPE_FACET_OVERRIDE); +} + +OVERRIDE_FACET_FILTERS.forEach( + ({ overrideSearchKey, overrideSearchValue, updatedFacetFilterValue }) => { + SEARCH_FACET_FILTERS.find((facetFilter, index) => { + if (facetFilter[overrideSearchKey] === overrideSearchValue) { + SEARCH_FACET_FILTERS[index] = updatedFacetFilterValue; + return true; + } + return false; + }); + }, +); + +export { SEARCH_FACET_FILTERS }; diff --git a/src/data/hooks.js b/src/data/hooks.js index 5f9e7df7b1..db094d1112 100644 --- a/src/data/hooks.js +++ b/src/data/hooks.js @@ -1,4 +1,8 @@ -import { useEffect, useRef } from 'react'; +import { + useEffect, useMemo, useState, useRef, +} from 'react'; + +import { CONTENT_TYPE_COURSE, CONTENT_TYPE_PROGRAM } from './constants/learnerCredit'; export function useInterval(callback, delay) { const savedCallback = useRef(); @@ -41,3 +45,16 @@ export function useTimeout(callback, delay) { timeoutIdRef.current = null; }, [callback, delay]); } + +export const useSelectedCourse = () => { + const [course, setCourse] = useState(null); + const isProgram = useMemo( + () => course && course.contentType === CONTENT_TYPE_PROGRAM, + [course], + ); + const isCourse = useMemo( + () => course && course.contentType === CONTENT_TYPE_COURSE, + [course], + ); + return [course, setCourse, isProgram, isCourse]; +}; diff --git a/src/static/default-card-header-dark.png b/src/static/default-card-header-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d692970952c1fdfdd6a9bae9885ecee639b9ffda GIT binary patch literal 76508 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 M;QyYc5dVe!f9`84GXMYp literal 0 HcmV?d00001 diff --git a/src/static/default-card-header-light.png b/src/static/default-card-header-light.png new file mode 100644 index 0000000000000000000000000000000000000000..9da8a136f2bf9edd9223ad1a944b24d006d21d2a GIT binary patch literal 27327 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 Ai~s-t literal 0 HcmV?d00001 From 4c98238bf0f465127b782240e27dff3acb50fb8c Mon Sep 17 00:00:00 2001 From: Kira Miller Date: Thu, 21 Sep 2023 20:22:55 +0000 Subject: [PATCH 2/8] Merge branch 'master' into kiram15/ENT-7339 --- .env.development | 6 +-- .gitignore | 1 + .../ContentHighlights/data/constants.js | 4 +- src/components/subsidy-requests/data/hooks.js | 29 ++++++------- .../subsidy-requests/data/tests/hooks.test.js | 4 +- src/data/actions/portalConfiguration.js | 9 ++-- src/data/actions/portalConfiguration.test.js | 42 +++++++++++++------ src/data/reducers/portalConfiguration.js | 4 ++ src/data/reducers/portalConfiguration.test.js | 5 ++- .../services/EnterpriseAccessApiService.js | 6 +-- src/data/services/LmsApiService.js | 6 ++- .../tests/EnterpriseAccessApiService.test.js | 1 - 12 files changed, 72 insertions(+), 45 deletions(-) diff --git a/.env.development b/.env.development index 03858d1ff4..737a3beeee 100644 --- a/.env.development +++ b/.env.development @@ -24,9 +24,9 @@ LOGO_URL='https://edx-cdn.org/v3/default/logo.svg' LOGO_TRADEMARK_URL='https://edx-cdn.org/v3/default/logo-trademark.svg' LOGO_WHITE_URL='https://edx-cdn.org/v3/default/logo-white.svg' FAVICON_URL='https://edx-cdn.org/v3/default/favicon.ico' -ALGOLIA_APP_ID='' -ALGOLIA_SEARCH_API_KEY='' -ALGOLIA_INDEX_NAME='' +ALGOLIA_APP_ID='IGSYV1Z1XI' +ALGOLIA_SEARCH_API_KEY='aa167c8903330e7a4768b484930a9991' +ALGOLIA_INDEX_NAME='enterprise_catalog_new' PORT='1991' FEATURE_CODE_MANAGEMENT='true' FEATURE_REPORTING_CONFIGURATIONS='true' diff --git a/.gitignore b/.gitignore index 2f81fc6ff0..32335845d2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ dist/ # emacs *~ +.projectile # edx .env.private diff --git a/src/components/ContentHighlights/data/constants.js b/src/components/ContentHighlights/data/constants.js index 978b549410..2695700817 100644 --- a/src/components/ContentHighlights/data/constants.js +++ b/src/components/ContentHighlights/data/constants.js @@ -43,10 +43,10 @@ export const TAB_TITLES = { export const MAX_HIGHLIGHT_TITLE_LENGTH = 60; // Max highlight sets per enteprise curation -export const MAX_HIGHLIGHT_SETS_PER_ENTERPRISE_CURATION = 8; +export const MAX_HIGHLIGHT_SETS_PER_ENTERPRISE_CURATION = 12; // Max number of content items per highlight set -export const MAX_CONTENT_ITEMS_PER_HIGHLIGHT_SET = 12; +export const MAX_CONTENT_ITEMS_PER_HIGHLIGHT_SET = 24; // Max number of content items displayed from search results export const MAX_PAGE_SIZE = 24; diff --git a/src/components/subsidy-requests/data/hooks.js b/src/components/subsidy-requests/data/hooks.js index d0391eb389..7eeab49392 100644 --- a/src/components/subsidy-requests/data/hooks.js +++ b/src/components/subsidy-requests/data/hooks.js @@ -57,21 +57,18 @@ export const useSubsidyRequestConfiguration = ({ } }, [enterpriseId]); - const loadSubsidyRequestConfiguration = useCallback( - async ({ clearCacheEntry = false } = { clearCacheEntry: false }) => { - try { - const response = await EnterpriseAccessApiService.getSubsidyRequestConfiguration( - { enterpriseId, clearCacheEntry }, - ); - const customerConfiguration = camelCaseObject(response.data); - setSubsidyRequestConfiguration(customerConfiguration); - } catch (error) { - logError(error); - throw error; - } - }, - [enterpriseId], - ); + const loadSubsidyRequestConfiguration = useCallback(async () => { + try { + const response = await EnterpriseAccessApiService.getSubsidyRequestConfiguration( + { enterpriseId }, + ); + const customerConfiguration = camelCaseObject(response.data); + setSubsidyRequestConfiguration(customerConfiguration); + } catch (error) { + logError(error); + throw error; + } + }, [enterpriseId]); useEffect(() => { if (!enterpriseId) { @@ -111,7 +108,7 @@ export const useSubsidyRequestConfiguration = ({ enterpriseId, options, ); - loadSubsidyRequestConfiguration({ clearCacheEntry: true }); + loadSubsidyRequestConfiguration(); } catch (err) { logError(err); throw err; diff --git a/src/components/subsidy-requests/data/tests/hooks.test.js b/src/components/subsidy-requests/data/tests/hooks.test.js index 435bb1e26b..448025e8e0 100644 --- a/src/components/subsidy-requests/data/tests/hooks.test.js +++ b/src/components/subsidy-requests/data/tests/hooks.test.js @@ -64,7 +64,7 @@ describe('useSubsidyRequestConfiguration', () => { await waitForNextUpdate(); expect(EnterpriseAccessApiService.getSubsidyRequestConfiguration).toHaveBeenCalledWith( - { clearCacheEntry: false, enterpriseId: TEST_ENTERPRISE_UUID }, + { enterpriseId: TEST_ENTERPRISE_UUID }, ); expect(result.current.subsidyRequestConfiguration).toEqual( camelCaseObject(TEST_CONFIGURATION_RESPONSE.data), @@ -230,7 +230,7 @@ describe('useSubsidyRequestConfiguration', () => { }); expect(EnterpriseAccessApiService.getSubsidyRequestConfiguration).toHaveBeenCalledWith( - { clearCacheEntry: true, enterpriseId: TEST_ENTERPRISE_UUID }, + { enterpriseId: TEST_ENTERPRISE_UUID }, ); }); diff --git a/src/data/actions/portalConfiguration.js b/src/data/actions/portalConfiguration.js index a578072bb1..ec342db0c4 100644 --- a/src/data/actions/portalConfiguration.js +++ b/src/data/actions/portalConfiguration.js @@ -12,9 +12,12 @@ const fetchPortalConfigurationRequest = () => ({ type: FETCH_PORTAL_CONFIGURATION_REQUEST, }); -const fetchPortalConfigurationSuccess = data => ({ +const fetchPortalConfigurationSuccess = response => ({ type: FETCH_PORTAL_CONFIGURATION_SUCCESS, - payload: { data }, + payload: { + data: response.data, + enterpriseFeatures: response.enterpriseFeatures, + }, }); const fetchPortalConfigurationFailure = error => ({ @@ -34,7 +37,7 @@ const fetchPortalConfiguration = slug => ( dispatch(fetchPortalConfigurationRequest()); return LmsApiService.fetchEnterpriseBySlug(slug) .then((response) => { - dispatch(fetchPortalConfigurationSuccess(response.data)); + dispatch(fetchPortalConfigurationSuccess(response)); }) .catch((error) => { logError(error); diff --git a/src/data/actions/portalConfiguration.test.js b/src/data/actions/portalConfiguration.test.js index 2cceed3020..06cf580c25 100644 --- a/src/data/actions/portalConfiguration.test.js +++ b/src/data/actions/portalConfiguration.test.js @@ -1,5 +1,6 @@ import configureMockStore from 'redux-mock-store'; import thunk from 'redux-thunk'; +import { camelCaseObject } from '@edx/frontend-platform/utils'; import { clearPortalConfiguration, fetchPortalConfiguration } from './portalConfiguration'; import { @@ -14,6 +15,18 @@ jest.mock('@edx/frontend-platform/logging'); const mockStore = configureMockStore([thunk]); +const mockEnterpriseCustomer = { + uuid: 'd749b244-dceb-47bb-951c-5184a6e6d36a', + name: 'Test Enterprise', + slug: 'test-enterprise', + branding_configuration: { + enterprise_customer: 'd749b244-dceb-47bb-951c-5184a6e6d36a', + enterprise_slug: 'test-enterprise', + logo: 'https://s3...', + }, +}; +const mockEnterpriseFeatures = { feature_a: true }; + describe('actions', () => { afterEach(() => { axiosMock.reset(); @@ -21,20 +34,19 @@ describe('actions', () => { it('dispatches success action after fetching portalConfiguration', () => { const slug = 'test-enterprise'; - const responseData = { - uuid: 'd749b244-dceb-47bb-951c-5184a6e6d36a', - name: 'Test Enterprise', - slug: 'test-enterprise', - branding_configuration: { - enterprise_customer: 'd749b244-dceb-47bb-951c-5184a6e6d36a', - enterprise_slug: 'test-enterprise', - logo: 'https://s3...', - }, + const mockResponseData = { + data: mockEnterpriseCustomer, + enterpriseFeatures: mockEnterpriseFeatures, }; const expectedActions = [ - { type: FETCH_PORTAL_CONFIGURATION_REQUEST }, - { type: FETCH_PORTAL_CONFIGURATION_SUCCESS, payload: { data: responseData } }, + { + type: FETCH_PORTAL_CONFIGURATION_REQUEST, + }, + { + type: FETCH_PORTAL_CONFIGURATION_SUCCESS, + payload: { data: mockResponseData.data, enterpriseFeatures: camelCaseObject(mockEnterpriseFeatures) }, + }, ]; const store = mockStore(); const queryParams = new URLSearchParams({ @@ -43,7 +55,13 @@ describe('actions', () => { enterprise_slug: slug, }); axiosMock.onGet(`http://localhost:18000/enterprise/api/v1/enterprise-customer/dashboard_list/?${queryParams.toString()}`) - .replyOnce(200, JSON.stringify({ results: [responseData] })); + .replyOnce( + 200, + JSON.stringify({ + results: [mockResponseData.data], + enterprise_features: mockResponseData.enterpriseFeatures, + }), + ); return store.dispatch(fetchPortalConfiguration(slug)).then(() => { expect(store.getActions()).toEqual(expectedActions); diff --git a/src/data/reducers/portalConfiguration.js b/src/data/reducers/portalConfiguration.js index e2f5fbc961..9527e495ef 100644 --- a/src/data/reducers/portalConfiguration.js +++ b/src/data/reducers/portalConfiguration.js @@ -26,6 +26,7 @@ const initialState = { enableUniversalLink: false, enablePortalLearnerCreditManagementScreen: false, enableApiCredentialGeneration: false, + enterpriseFeatures: {}, }; const portalConfiguration = (state = initialState, action) => { @@ -58,6 +59,7 @@ const portalConfiguration = (state = initialState, action) => { enableUniversalLink: action.payload.data.enable_universal_link, enablePortalLearnerCreditManagementScreen: action.payload.data.enable_portal_learner_credit_management_screen, enableApiCredentialGeneration: action.payload.data.enable_generation_of_api_credentials, + enterpriseFeatures: action.payload.enterpriseFeatures, }; case FETCH_PORTAL_CONFIGURATION_FAILURE: return { @@ -81,6 +83,7 @@ const portalConfiguration = (state = initialState, action) => { enableUniversalLink: false, enablePortalLearnerCreditManagementScreen: false, enableApiCredentialGeneration: false, + enterpriseFeatures: {}, }; case CLEAR_PORTAL_CONFIGURATION: return { @@ -102,6 +105,7 @@ const portalConfiguration = (state = initialState, action) => { enableUniversalLink: false, enablePortalLearnerCreditManagementScreen: false, enableApiCredentialGeneration: false, + enterpriseFeatures: {}, }; case UPDATE_PORTAL_CONFIGURATION: return { diff --git a/src/data/reducers/portalConfiguration.test.js b/src/data/reducers/portalConfiguration.test.js index f97e186346..f8d328f5ea 100644 --- a/src/data/reducers/portalConfiguration.test.js +++ b/src/data/reducers/portalConfiguration.test.js @@ -25,6 +25,7 @@ const initialState = { enableLmsConfigurationsScreen: false, enableUniversalLink: false, enablePortalLearnerCreditManagementScreen: false, + enterpriseFeatures: {}, }; const enterpriseData = { @@ -53,6 +54,7 @@ const enterpriseData = { enable_browse_and_request: true, enable_generation_of_api_credentials: true, }; +const mockEnterpriseFeatures = { featureA: true }; describe('portalConfiguration reducer', () => { it('has initial state', () => { @@ -81,10 +83,11 @@ describe('portalConfiguration reducer', () => { enableUniversalLink: enterpriseData.enable_universal_link, enablePortalLearnerCreditManagementScreen: enterpriseData.enable_portal_learner_credit_management_screen, enableApiCredentialGeneration: enterpriseData.enable_generation_of_api_credentials, + enterpriseFeatures: mockEnterpriseFeatures, }; expect(portalConfiguration(undefined, { type: FETCH_PORTAL_CONFIGURATION_SUCCESS, - payload: { data: enterpriseData }, + payload: { data: enterpriseData, enterpriseFeatures: mockEnterpriseFeatures }, })).toEqual(expected); }); diff --git a/src/data/services/EnterpriseAccessApiService.js b/src/data/services/EnterpriseAccessApiService.js index 98edbbbefd..380428686e 100644 --- a/src/data/services/EnterpriseAccessApiService.js +++ b/src/data/services/EnterpriseAccessApiService.js @@ -7,11 +7,9 @@ class EnterpriseAccessApiService { static apiClient = getAuthenticatedHttpClient; - static getSubsidyRequestConfiguration({ enterpriseId, clearCacheEntry = false }) { + static getSubsidyRequestConfiguration({ enterpriseId }) { const url = `${EnterpriseAccessApiService.baseUrl}/customer-configurations/${enterpriseId}/`; - return EnterpriseAccessApiService.apiClient({ - useCache: configuration.USE_API_CACHE, - }).get(url, { clearCacheEntry }); + return EnterpriseAccessApiService.apiClient().get(url); } static createSubsidyRequestConfiguration({ diff --git a/src/data/services/LmsApiService.js b/src/data/services/LmsApiService.js index eb4b3b67f2..4cff4834d1 100644 --- a/src/data/services/LmsApiService.js +++ b/src/data/services/LmsApiService.js @@ -1,4 +1,6 @@ import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; +import { camelCaseObject } from '@edx/frontend-platform/utils'; + import { configuration } from '../../config'; import generateFormattedStatusUrl from './apiServiceUtils'; @@ -53,8 +55,10 @@ class LmsApiService { .then((response) => { const { data } = response; const results = data?.results; + const enterpriseFeatures = camelCaseObject(data?.enterprise_features); return { - data: results?.length && results[0], + data: results?.[0], + enterpriseFeatures, }; }); } diff --git a/src/data/services/tests/EnterpriseAccessApiService.test.js b/src/data/services/tests/EnterpriseAccessApiService.test.js index e6e21b833c..485bf7db90 100644 --- a/src/data/services/tests/EnterpriseAccessApiService.test.js +++ b/src/data/services/tests/EnterpriseAccessApiService.test.js @@ -103,7 +103,6 @@ describe('EnterpriseAccessApiService', () => { EnterpriseAccessApiService.getSubsidyRequestConfiguration({ enterpriseId: mockEnterpriseUUID }); expect(axios.get).toBeCalledWith( `${enterpriseAccessBaseUrl}/api/v1/customer-configurations/${mockEnterpriseUUID}/`, - { clearCacheEntry: false }, ); }); From 3af6502e4dac93a09957324127f1514a09f3c477 Mon Sep 17 00:00:00 2001 From: Kira Miller Date: Mon, 25 Sep 2023 18:58:32 +0000 Subject: [PATCH 3/8] fix: adding search filters --- .../ContentHighlights/data/constants.js | 4 +- src/components/Sidebar/index.jsx | 3 - .../BudgetCard-V2.jsx | 120 +++++++++++------- .../BudgetCard-V3.jsx | 49 ------- .../MultipleBudgetsPicker.jsx | 2 +- .../learner-credit.scss | 4 - 6 files changed, 79 insertions(+), 103 deletions(-) delete mode 100644 src/components/learner-credit-management/BudgetCard-V3.jsx diff --git a/src/components/ContentHighlights/data/constants.js b/src/components/ContentHighlights/data/constants.js index 2695700817..f95a37a4fb 100644 --- a/src/components/ContentHighlights/data/constants.js +++ b/src/components/ContentHighlights/data/constants.js @@ -14,7 +14,7 @@ export const sanitizeAndParseHTML = (htmlString) => { // Set to false before pushing PR!! otherwise set to true to enable local testing of ContentHighlights components // Test will fail as additional check to ensure this is set to false before pushing PR export const TEST_FLAG = false; -// Test entepriseId for Content Highlights to display card selections and confirmation +// Test enterpriseId for Content Highlights to display card selections and confirmation export const testEnterpriseId = 'f23ccd7d-fbbb-411a-824e-c2861942aac0'; // function that passes through enterpriseId if TEST_FLAG is false, otherwise returns local testing enterpriseId export const ENABLE_TESTING = (enterpriseId, enableTest = TEST_FLAG) => { @@ -42,7 +42,7 @@ export const TAB_TITLES = { // Max length of highlight title in stepper export const MAX_HIGHLIGHT_TITLE_LENGTH = 60; -// Max highlight sets per enteprise curation +// Max highlight sets per enterprise curation export const MAX_HIGHLIGHT_SETS_PER_ENTERPRISE_CURATION = 12; // Max number of content items per highlight set diff --git a/src/components/Sidebar/index.jsx b/src/components/Sidebar/index.jsx index 6d70c19dbd..5a78bf11e8 100644 --- a/src/components/Sidebar/index.jsx +++ b/src/components/Sidebar/index.jsx @@ -39,9 +39,6 @@ const Sidebar = ({ const { canManageLearnerCredit } = useContext(EnterpriseSubsidiesContext); const { FEATURE_CONTENT_HIGHLIGHTS } = getConfig(); - console.log(canManageLearnerCredit); - console.log('hi'); - const getSidebarWidth = useCallback(() => { if (navRef && navRef.current) { const { width } = navRef.current.getBoundingClientRect(); diff --git a/src/components/learner-credit-management/BudgetCard-V2.jsx b/src/components/learner-credit-management/BudgetCard-V2.jsx index b39b9297d9..25f8cc4792 100644 --- a/src/components/learner-credit-management/BudgetCard-V2.jsx +++ b/src/components/learner-credit-management/BudgetCard-V2.jsx @@ -1,15 +1,15 @@ import React, { useState } from 'react'; +import { Configure, InstantSearch } from 'react-instantsearch-dom'; import PropTypes from 'prop-types'; +import algoliasearch from 'algoliasearch/lite'; import dayjs from 'dayjs'; import { - Card, - Button, - Stack, - Row, - Col, - Breadcrumb, + Breadcrumb, Button, Card, Col, Row, Stack, Tabs, Tab, } from '@edx/paragon'; +import { SearchData } from '@edx/frontend-enterprise-catalog-search'; +import CatalogSearch from './search/CatalogSearch'; +import { configuration } from '../../config'; import { useOfferRedemptions, useOfferSummary } from './data/hooks'; import LearnerCreditAggregateCards from './LearnerCreditAggregateCards'; import LearnerCreditAllocationTable from './LearnerCreditAllocationTable'; @@ -36,6 +36,7 @@ const BudgetCard = ({ offerRedemptions, fetchOfferRedemptions, } = useOfferRedemptions(enterpriseUUID, offer?.id); + const [tab, setTab] = useState('activity'); const [detailPage, setDetailPage] = useState(false); const [activeLabel, setActiveLabel] = useState(''); const links = [ @@ -48,6 +49,13 @@ const BudgetCard = ({ links.push({ label: budgetType, url: `/${enterpriseSlug}/admin/learner-credit` }); setActiveLabel(budgetType); }; + const searchFilters = `enterprise_catalog_query_uuids:${offer?.id}`; + // + `OR enterprise_catalog_query_uuids:${offerSummary?.budgets.the_catalog_uuid}`; + + const searchClient = algoliasearch( + configuration.ALGOLIA.APP_ID, + configuration.ALGOLIA.SEARCH_API_KEY, + ); const renderActions = (budgetType) => ( - - )} - - {searchResults?.nbHits !== 0 && ( -

{contentTitleDescription()}

- )} -
- {searchResults?.nbHits === 0 && ( - - - - {/* */} - - - )} - {searchResults?.nbHits !== 0 && ( - - - {cardView && ( - renderCardComponent(props)} - /> - )} - {!cardView && } - - {!preview && ( - - - - )} - - )} -
- +
+ + + renderCardComponent(props)} + /> + + + +
); }; @@ -453,7 +125,6 @@ BaseCatalogSearchResults.defaultProps = { }; BaseCatalogSearchResults.propTypes = { - intl: intlShape.isRequired, // from Algolia searchResults: PropTypes.shape({ _state: PropTypes.shape({ diff --git a/src/components/learner-credit-management/search/CatalogSearchResults.messages.js b/src/components/learner-credit-management/search/CatalogSearchResults.messages.js deleted file mode 100644 index 009d3ea5ca..0000000000 --- a/src/components/learner-credit-management/search/CatalogSearchResults.messages.js +++ /dev/null @@ -1,70 +0,0 @@ -import { defineMessages } from '@edx/frontend-platform/i18n'; - -const messages = defineMessages({ - 'catalogSearchResults.table.courseName': { - id: 'catalogSearchResults.table.courseName', - defaultMessage: 'Course name', - description: 'Table column title for course names', - }, - 'catalogSearchResults.table.partner': { - id: 'catalogSearchResults.table.partner', - defaultMessage: 'Partner', - description: - 'The partner institution providing/authoring the course (ie Harvard, MIT, etc.)', - }, - 'catalogSearchResults.table.price': { - id: 'catalogSearchResults.table.price', - defaultMessage: 'A la carte course price', - description: - 'Table column A La Carte price for the course - optional column', - }, - 'catalogSearchResults.table.availability': { - id: 'catalogSearchResults.table.availability', - defaultMessage: 'Course Availability', - description: - 'Table column form course availability dates - optional column', - }, - 'catalogSearchResults.table.catalogs': { - id: 'catalogSearchResults.table.catalogs', - defaultMessage: 'Associated catalogs', - description: 'Table column title for associated subscription catalogs', - }, - 'catalogSearchResults.table.priceNotAvailable': { - id: 'catalogSearchResults.table.priceNotAvailable', - defaultMessage: 'Not Available', - description: - 'When a course price is not available, notify learners that there is no data available to display.', - }, - 'catalogSearchResults.table.programName': { - id: 'catalogSearchResults.table.programName', - defaultMessage: 'Program Name', - description: 'Table column title for course names', - }, - 'catalogSearchResults.table.numCourses': { - id: 'catalogSearchResults.table.numCourses', - defaultMessage: 'Number of Courses', - description: 'Table column for number of courses associated with program', - }, - 'catalogSearchResults.table.programType': { - id: 'catalogSearchResults.table.programType', - defaultMessage: 'Program Type', - description: 'Table column for the type of program.', - }, - 'catalogSearchResults.aLaCarteBadge': { - id: 'catalogSearchResults.aLaCarteBadge', - defaultMessage: 'A la carte', - description: 'Badge text for the `A La Carte` catalog badge.', - }, - 'catalogSearchResults.businessBadge': { - id: 'catalogSearchResults.businessBadge', - defaultMessage: 'Business', - description: 'Badge text for the `Business` catalog badge.', - }, - 'catalogSearchResults.popularCourses': { - id: 'catalogSearchResults.popularCourses', - defaultMessage: 'Popular Courses', - description: 'Popular Courses table header.', - }, -}); - -export default messages; From f23330db121184441e3758b5a5e4f9bd52f3c6ab Mon Sep 17 00:00:00 2001 From: Kira Miller Date: Tue, 26 Sep 2023 21:50:43 +0000 Subject: [PATCH 5/8] fix: extra fixes --- .../BudgetCard-V2.jsx | 31 +++++--- .../search/CatalogSearch.jsx | 2 +- src/data/constants/learnerCredit.js | 73 +------------------ 3 files changed, 24 insertions(+), 82 deletions(-) diff --git a/src/components/learner-credit-management/BudgetCard-V2.jsx b/src/components/learner-credit-management/BudgetCard-V2.jsx index 5b262ec34b..f06d940127 100644 --- a/src/components/learner-credit-management/BudgetCard-V2.jsx +++ b/src/components/learner-credit-management/BudgetCard-V2.jsx @@ -6,7 +6,7 @@ import dayjs from 'dayjs'; import { Breadcrumb, Button, Card, Col, Row, Stack, Tabs, Tab, } from '@edx/paragon'; -import { SearchData } from '@edx/frontend-enterprise-catalog-search'; +import { SearchData, SEARCH_FACET_FILTERS } from '@edx/frontend-enterprise-catalog-search'; import CatalogSearch from './search/CatalogSearch'; import { configuration } from '../../config'; @@ -14,6 +14,23 @@ import { useOfferRedemptions, useOfferSummary } from './data/hooks'; import LearnerCreditAggregateCards from './LearnerCreditAggregateCards'; import LearnerCreditAllocationTable from './LearnerCreditAllocationTable'; import { ROUTE_NAMES } from '../EnterpriseApp/data/constants'; +import { LANGUAGE_REFINEMENT, LEARNING_TYPE_REFINEMENT } from '../../data/constants/learnerCredit'; + +const language = { + attribute: LANGUAGE_REFINEMENT, + title: 'Language', +}; +const learningType = { + attribute: LEARNING_TYPE_REFINEMENT, + title: 'Learning Type', +}; +// Add search facet filters if they don't exist in the list yet +if (!SEARCH_FACET_FILTERS.some((filter) => filter.attribute === LANGUAGE_REFINEMENT)) { + SEARCH_FACET_FILTERS.push(language); +} +if (!SEARCH_FACET_FILTERS.some((filter) => filter.attribute === LEARNING_TYPE_REFINEMENT)) { + SEARCH_FACET_FILTERS.push(learningType); +} const BudgetCard = ({ offer, @@ -77,11 +94,7 @@ const BudgetCard = ({ - {renderActions(budgetType)} - - )} + actions={(
{renderActions(budgetType)}
)} /> ); }; @@ -163,9 +176,9 @@ const BudgetCard = ({ -

Executive Education catalog

- - + {
diff --git a/src/data/constants/learnerCredit.js b/src/data/constants/learnerCredit.js index 8954e226ad..d8139101e3 100644 --- a/src/data/constants/learnerCredit.js +++ b/src/data/constants/learnerCredit.js @@ -1,23 +1,3 @@ -/* eslint-disable import/prefer-default-export */ -import { hasFeatureFlagEnabled } from '@edx/frontend-enterprise-utils'; -import { SEARCH_FACET_FILTERS } from '@edx/frontend-enterprise-catalog-search'; - -export const FEATURE_ENABLE_PROGRAMS = 'ENABLE_PROGRAMS'; -export const FEATURE_PROGRAM_TYPE_FACET = 'ENABLE_PROGRAM_TYPE_FACET'; -export const FEATURE_EXEC_ED_INCLUSION = 'ENABLE_EXEC_ED_INCLUSION'; - -const features = { - ENABLE_PROGRAMS: - process.env.FEATURE_ENABLE_PROGRAMS === 'true' - || hasFeatureFlagEnabled(FEATURE_ENABLE_PROGRAMS), - PROGRAM_TYPE_FACET: - process.env.FEATURE_PROGRAM_TYPE_FACET === 'true' - || hasFeatureFlagEnabled(FEATURE_PROGRAM_TYPE_FACET), - EXEC_ED_INCLUSION: - process.env.EXEC_ED_INCLUSION === 'true' - || hasFeatureFlagEnabled(FEATURE_EXEC_ED_INCLUSION), -}; - export const PAGE_TITLE = 'edX Enterprise Catalogs'; /** @@ -38,64 +18,13 @@ export const AVAILABILITY_REFINEMENT_DEFAULTS = [ export const CONTENT_TYPE_REFINEMENT = 'content_type'; export const COURSE_TYPE_REFINEMENT = 'course_type'; export const LEARNING_TYPE_REFINEMENT = 'learning_type'; +export const LANGUAGE_REFINEMENT = 'language'; -// Page refinement settings -export const HIDE_CARDS_REFINEMENT = 'hide_cards'; -export const HIDE_PRICE_REFINEMENT = 'hide_price'; -export const NUM_RESULTS_PER_PAGE = 40; // Learning types export const CONTENT_TYPE_COURSE = 'course'; export const CONTENT_TYPE_PROGRAM = 'program'; export const EXEC_ED_TITLE = 'Executive Education'; -// Page metric settings -export const NUM_RESULTS_PROGRAM = 4; -export const NUM_RESULTS_COURSE = 8; - -export const COURSE_TITLE = 'Courses'; -export const PROGRAM_TITLE = 'Programs'; - -export const NO_RESULTS_DECK_ITEM_COUNT = 4; -export const NO_RESULTS_PAGE_ITEM_COUNT = 1; -export const NO_RESULTS_PAGE_SIZE = 4; - -// Descriptions -export const EDX_COURSE_TITLE_DESC = 'Self paced online learning from world-class academic institutions and corporate partners.'; -export const TWOU_EXEC_ED_TITLE_DESC = 'Immersive, instructor led online short courses designed to develop interpersonal, analytical, and critical thinking skills.'; -export const PROGRAM_TITLE_DESC = 'Multi-course bundled learning for skills mastery and to earn credentials such as Professional Certificates, MicroBachelors™, MicroMasters®, and Master’s Degrees.'; export const EXEC_COURSE_TYPE = 'executive-education-2u'; - -const OVERRIDE_FACET_FILTERS = []; -if (features.PROGRAM_TYPE_FACET) { - const PROGRAM_TYPE_FACET_OVERRIDE = { - overrideSearchKey: 'title', - overrideSearchValue: 'Program', - updatedFacetFilterValue: { - attribute: 'program_type', - title: 'Program', - isSortedAlphabetical: true, - typeaheadOptions: { - placeholder: 'Find a program...', - ariaLabel: 'Type to find a program', - minLength: 3, - }, - }, - }; - OVERRIDE_FACET_FILTERS.push(PROGRAM_TYPE_FACET_OVERRIDE); -} - -OVERRIDE_FACET_FILTERS.forEach( - ({ overrideSearchKey, overrideSearchValue, updatedFacetFilterValue }) => { - SEARCH_FACET_FILTERS.find((facetFilter, index) => { - if (facetFilter[overrideSearchKey] === overrideSearchValue) { - SEARCH_FACET_FILTERS[index] = updatedFacetFilterValue; - return true; - } - return false; - }); - }, -); - -export { SEARCH_FACET_FILTERS }; From 22264582168f4923f95e4e05eefc84c9a4165090 Mon Sep 17 00:00:00 2001 From: Kira Miller Date: Mon, 2 Oct 2023 21:09:10 +0000 Subject: [PATCH 6/8] fix: adding tests and fixes --- .../BudgetCard-V2.jsx | 3 +- .../MultipleBudgetsPicker.jsx | 3 - .../cards/CourseCard.jsx | 20 +-- .../search/CatalogSearch.jsx | 5 +- .../search/CatalogSearchResults.jsx | 2 - .../tests/CatalogSearch.test.jsx | 43 +++++ .../tests/CatalogSearchResults.test.jsx | 156 ++++++++++++++++++ src/data/constants/learnerCredit.js | 2 - 8 files changed, 209 insertions(+), 25 deletions(-) create mode 100644 src/components/learner-credit-management/tests/CatalogSearch.test.jsx create mode 100644 src/components/learner-credit-management/tests/CatalogSearchResults.test.jsx diff --git a/src/components/learner-credit-management/BudgetCard-V2.jsx b/src/components/learner-credit-management/BudgetCard-V2.jsx index f217ef2efd..a1d5be2a3d 100644 --- a/src/components/learner-credit-management/BudgetCard-V2.jsx +++ b/src/components/learner-credit-management/BudgetCard-V2.jsx @@ -60,6 +60,7 @@ const BudgetCard = ({ onSelect={(k) => setTab(k)} > +

Budgets

{offerType === BUDGET_TYPES.ecommerce ? ( - +
diff --git a/src/components/learner-credit-management/MultipleBudgetsPicker.jsx b/src/components/learner-credit-management/MultipleBudgetsPicker.jsx index db6f178f2a..5910d6f2b5 100644 --- a/src/components/learner-credit-management/MultipleBudgetsPicker.jsx +++ b/src/components/learner-credit-management/MultipleBudgetsPicker.jsx @@ -15,9 +15,6 @@ const MultipleBudgetsPicker = ({ enableLearnerPortal, }) => ( - -

Budgets

-
diff --git a/src/components/learner-credit-management/cards/CourseCard.jsx b/src/components/learner-credit-management/cards/CourseCard.jsx index f5cbc95da0..70a037d18c 100644 --- a/src/components/learner-credit-management/cards/CourseCard.jsx +++ b/src/components/learner-credit-management/cards/CourseCard.jsx @@ -1,4 +1,4 @@ -/* eslint-disable camelcase */ +/* eslint-disable @typescript-eslint/naming-convention */ // variables taken from algolia not in camelcase import React from 'react'; import PropTypes from 'prop-types'; @@ -17,15 +17,11 @@ const CourseCard = ({ const { title, card_image_url, - partners, - first_enrollable_paid_seat_price, - enterprise_catalog_query_titles, - entitlements, - advertised_course_run, course_type, + normalized_metadata, + partners, } = original; - let rowPrice; let priceText; const imageSrc = card_image_url || defaultCardHeader; @@ -58,8 +54,8 @@ const CourseCard = ({

)}

- Starts {formatDate(original.normalized_metadata?.start_date)} • - Learner must register by {formatDate(original.normalized_metadata?.enroll_by_date)} + Starts {formatDate(normalized_metadata?.start_date)} • + Learner must register by {formatDate(normalized_metadata?.enroll_by_date)}

@@ -84,8 +80,6 @@ CourseCard.propTypes = { original: PropTypes.shape({ title: PropTypes.string, card_image_url: PropTypes.string, - entitlements: PropTypes.arrayOf(PropTypes.shape()), - advertised_course_run: PropTypes.shape(), partners: PropTypes.arrayOf( PropTypes.shape({ name: PropTypes.string, @@ -93,9 +87,7 @@ CourseCard.propTypes = { }), ), normalized_metadata: PropTypes.shape(), - first_enrollable_paid_seat_price: PropTypes.number, - enterprise_catalog_query_titles: PropTypes.arrayOf(PropTypes.string), - original_image_url: PropTypes.string, + course_type: PropTypes.string, }).isRequired, }; diff --git a/src/components/learner-credit-management/search/CatalogSearch.jsx b/src/components/learner-credit-management/search/CatalogSearch.jsx index f8a55600e0..fc3b2e58b9 100644 --- a/src/components/learner-credit-management/search/CatalogSearch.jsx +++ b/src/components/learner-credit-management/search/CatalogSearch.jsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import algoliasearch from 'algoliasearch/lite'; import { Configure, InstantSearch } from 'react-instantsearch-dom'; -import { FormattedMessage, injectIntl } from '@edx/frontend-platform/i18n'; +import { FormattedMessage } from '@edx/frontend-platform/i18n'; import { getConfig } from '@edx/frontend-platform/config'; import { SearchHeader } from '@edx/frontend-enterprise-catalog-search'; @@ -20,7 +20,6 @@ const CatalogSearch = ({ offerId }) => { }, [config.ALGOLIA_INDEX_NAME, searchClient]); const searchFilters = `enterprise_catalog_query_uuids:${offerId}`; - // + `OR enterprise_catalog_query_uuids:${offerSummary?.budgets.the_catalog_uuid}`; return (
@@ -57,4 +56,4 @@ CatalogSearch.propTypes = { offerId: PropTypes.string, }; -export default injectIntl(CatalogSearch); +export default CatalogSearch; diff --git a/src/components/learner-credit-management/search/CatalogSearchResults.jsx b/src/components/learner-credit-management/search/CatalogSearchResults.jsx index 26d60767a5..137b129845 100644 --- a/src/components/learner-credit-management/search/CatalogSearchResults.jsx +++ b/src/components/learner-credit-management/search/CatalogSearchResults.jsx @@ -121,7 +121,6 @@ BaseCatalogSearchResults.defaultProps = { row: null, preview: false, setNoContent: () => {}, - courseType: null, }; BaseCatalogSearchResults.propTypes = { @@ -149,7 +148,6 @@ BaseCatalogSearchResults.propTypes = { // eslint-disable-next-line react/no-unused-prop-types row: PropTypes.string, contentType: PropTypes.string.isRequired, - courseType: PropTypes.string, preview: PropTypes.bool, setNoContent: PropTypes.func, }; diff --git a/src/components/learner-credit-management/tests/CatalogSearch.test.jsx b/src/components/learner-credit-management/tests/CatalogSearch.test.jsx new file mode 100644 index 0000000000..72d1ab01e5 --- /dev/null +++ b/src/components/learner-credit-management/tests/CatalogSearch.test.jsx @@ -0,0 +1,43 @@ +import React from 'react'; +import '@testing-library/jest-dom/extend-expect'; +import { + SEARCH_FACET_FILTERS, + SearchContext, +} from '@edx/frontend-enterprise-catalog-search'; +import { IntlProvider } from '@edx/frontend-platform/i18n'; +import { screen } from '@testing-library/react'; +import { renderWithRouter } from '../../test/testUtils'; +import CatalogSearch from '../search/CatalogSearch'; + +jest.mock('react-instantsearch-dom', () => ({ + ...jest.requireActual('react-instantsearch-dom'), + InstantSearch: () =>
SEARCH
, + Index: () =>
SEARCH
, +})); + +const DEFAULT_SEARCH_CONTEXT_VALUE = { refinements: {} }; + +// eslint-disable-next-line react/prop-types +const SearchDataWrapper = ({ children, searchContextValue }) => ( + + + {children} + + +); + +describe('Catalog Search component', () => { + it('properly renders component', () => { + renderWithRouter( + + + , + ); + expect(screen.getByText('SEARCH')).toBeInTheDocument(); + }); +}); diff --git a/src/components/learner-credit-management/tests/CatalogSearchResults.test.jsx b/src/components/learner-credit-management/tests/CatalogSearchResults.test.jsx new file mode 100644 index 0000000000..bdb3bfa39c --- /dev/null +++ b/src/components/learner-credit-management/tests/CatalogSearchResults.test.jsx @@ -0,0 +1,156 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; + +import { SearchContext } from '@edx/frontend-enterprise-catalog-search'; +import { IntlProvider } from '@edx/frontend-platform/i18n'; + +import { BaseCatalogSearchResults, SKELETON_DATA_TESTID } from '../search/CatalogSearchResults'; + +import { renderWithRouter } from '../../test/testUtils'; + +import { CONTENT_TYPE_COURSE } from '../../../data/constants/learnerCredit'; + +// Mocking this connected component so as not to have to mock the algolia Api +const PAGINATE_ME = 'PAGINATE ME :)'; +const PaginationComponent = () =>
{PAGINATE_ME}
; + +// all we are testing is routes, we don't need InstantSearch to work here +jest.mock('react-instantsearch-dom', () => ({ + ...jest.requireActual('react-instantsearch-dom'), + InstantSearch: () =>
Popular Courses
, + Index: () =>
Popular Courses
, +})); + +const DEFAULT_SEARCH_CONTEXT_VALUE = { refinements: {} }; + +const SearchDataWrapper = ({ + // eslint-disable-next-line react/prop-types + children, + // eslint-disable-next-line react/prop-types + searchContextValue = DEFAULT_SEARCH_CONTEXT_VALUE, +}) => ( + + {children} + +); + +const mockConfig = () => ({ + EDX_FOR_BUSINESS_TITLE: 'ayylmao', + EDX_ENTERPRISE_ALACARTE_TITLE: 'baz', + FEATURE_CARD_VIEW_ENABLED: 'True', +}); + +jest.mock('@edx/frontend-platform', () => ({ + ...jest.requireActual('@edx/frontend-platform'), + getConfig: () => mockConfig(), +})); + +const TEST_COURSE_NAME = 'test course'; +const TEST_PARTNER = 'edx'; +const TEST_CATALOGS = ['baz']; + +const TEST_COURSE_NAME_2 = 'test course 2'; +const TEST_PARTNER_2 = 'edx 2'; +const TEST_CATALOGS_2 = ['baz', 'ayylmao']; + +const searchResults = { + nbHits: 2, + hitsPerPage: 10, + pageIndex: 10, + pageCount: 5, + nbPages: 6, + hits: [ + { + title: TEST_COURSE_NAME, + partners: [{ name: TEST_PARTNER, logo_image_url: '' }], + enterprise_catalog_query_titles: TEST_CATALOGS, + card_image_url: 'http://url.test.location', + first_enrollable_paid_seat_price: 100, + original_image_url: '', + availability: ['Available Now'], + content_type: CONTENT_TYPE_COURSE, + advertised_course_run: { + start: '2020-01-24T05:00:00Z', + end: '2080-01-01T17:00:00Z', + upgrade_deadline: 1892678399, + pacing_type: 'self_paced', + }, + }, + { + title: TEST_COURSE_NAME_2, + partners: [{ name: TEST_PARTNER_2, logo_image_url: '' }], + enterprise_catalog_query_titles: TEST_CATALOGS_2, + card_image_url: 'http://url.test2.location', + first_enrollable_paid_seat_price: 99, + original_image_url: '', + availability: ['Available Now'], + content_type: CONTENT_TYPE_COURSE, + advertised_course_run: { + start: '2020-01-24T05:00:00Z', + end: '2080-01-01T17:00:00Z', + upgrade_deadline: 1892678399, + pacing_type: 'self_paced', + }, + }, + ], + page: 1, + _state: { disjunctiveFacetsRefinements: { foo: 'bar' } }, +}; + +const defaultProps = { + paginationComponent: PaginationComponent, + searchResults, + isSearchStalled: false, + searchState: { page: 1 }, + error: null, + contentType: CONTENT_TYPE_COURSE, + // mock i18n requirements + intl: { + formatMessage: (header) => header.defaultMessage, + formatDate: () => {}, + formatTime: () => {}, + formatRelative: () => {}, + formatNumber: () => {}, + formatPlural: () => {}, + formatHTMLMessage: () => {}, + now: () => {}, + }, +}; + +describe('Main Catalogs view works as expected', () => { + const OLD_ENV = process.env; + beforeEach(() => { + jest.resetModules(); // Most important - it clears the cache + process.env = { ...OLD_ENV }; // Make a copy + }); + afterEach(() => { + process.env = OLD_ENV; // Restore old environment + }); + + test('all courses rendered when search results available', async () => { + render( + + + + + , + , + ); + screen.debug(); + + expect(screen.queryByText(TEST_COURSE_NAME)).toBeInTheDocument(); + expect(screen.queryByText(TEST_COURSE_NAME_2)).toBeInTheDocument(); + expect(screen.getAllByText('Showing 2 of 2.')[0]).toBeInTheDocument(); + }); + test('isSearchStalled leads to rendering skeleton and not content', () => { + renderWithRouter( + + + , + ); + expect(screen.queryByRole('alert')).not.toBeInTheDocument(); + expect(screen.queryByText(TEST_COURSE_NAME)).not.toBeInTheDocument(); + expect(screen.getByTestId(SKELETON_DATA_TESTID)).toBeInTheDocument(); + }); +}); diff --git a/src/data/constants/learnerCredit.js b/src/data/constants/learnerCredit.js index d8139101e3..1c41bd6bbc 100644 --- a/src/data/constants/learnerCredit.js +++ b/src/data/constants/learnerCredit.js @@ -20,11 +20,9 @@ export const COURSE_TYPE_REFINEMENT = 'course_type'; export const LEARNING_TYPE_REFINEMENT = 'learning_type'; export const LANGUAGE_REFINEMENT = 'language'; - // Learning types export const CONTENT_TYPE_COURSE = 'course'; export const CONTENT_TYPE_PROGRAM = 'program'; export const EXEC_ED_TITLE = 'Executive Education'; - export const EXEC_COURSE_TYPE = 'executive-education-2u'; From cbcf8687d87d7fa559efc6a04507711acb75fdf7 Mon Sep 17 00:00:00 2001 From: Kira Miller Date: Tue, 3 Oct 2023 18:08:59 +0000 Subject: [PATCH 7/8] fix: PR review --- __mocks__/react-instantsearch-dom.jsx | 4 +-- .../BudgetCard-V2.jsx | 11 +++--- .../cards/CourseCard.test.jsx | 35 +++++++++---------- .../tests/BudgetCard.test.jsx | 1 + .../learner-credit-management/utils.jsx | 8 +---- src/data/hooks.js | 2 +- 6 files changed, 27 insertions(+), 34 deletions(-) diff --git a/__mocks__/react-instantsearch-dom.jsx b/__mocks__/react-instantsearch-dom.jsx index f62f6554ca..4444b52c33 100644 --- a/__mocks__/react-instantsearch-dom.jsx +++ b/__mocks__/react-instantsearch-dom.jsx @@ -15,8 +15,8 @@ const advertised_course_run = { /* eslint-disable camelcase */ const fakeHits = [ - { objectID: '1', aggregation_key: 'course:Bees101', title: 'bla', advertised_course_run, key: 'Bees101' }, - { objectID: '2', aggregation_key: 'course:Wasps200', title: 'blp', advertised_course_run, key: 'Wasps200' }, + { objectID: '1', aggregation_key: 'course:Bees101', title: 'bla', partners: [{ name: 'edX' }, { name: 'another_unused' }], advertised_course_run, key: 'Bees101' }, + { objectID: '2', aggregation_key: 'course:Wasps200', title: 'blp', partners: [{ name: 'edX' }, { name: 'another_unused' }], advertised_course_run, key: 'Wasps200' }, ]; /* eslint-enable camelcase */ diff --git a/src/components/learner-credit-management/BudgetCard-V2.jsx b/src/components/learner-credit-management/BudgetCard-V2.jsx index a1d5be2a3d..02a5ba4b6c 100644 --- a/src/components/learner-credit-management/BudgetCard-V2.jsx +++ b/src/components/learner-credit-management/BudgetCard-V2.jsx @@ -23,12 +23,11 @@ const learningType = { title: 'Learning Type', }; // Add search facet filters if they don't exist in the list yet -if (!SEARCH_FACET_FILTERS.some((filter) => filter.attribute === LANGUAGE_REFINEMENT)) { - SEARCH_FACET_FILTERS.push(language); -} -if (!SEARCH_FACET_FILTERS.some((filter) => filter.attribute === LEARNING_TYPE_REFINEMENT)) { - SEARCH_FACET_FILTERS.push(learningType); -} +[language, learningType].forEach((refinement) => { + if (!SEARCH_FACET_FILTERS.some((filter) => filter.attribute === refinement.attribute)) { + SEARCH_FACET_FILTERS.push(refinement); + } +}); const BudgetCard = ({ offer, diff --git a/src/components/learner-credit-management/cards/CourseCard.test.jsx b/src/components/learner-credit-management/cards/CourseCard.test.jsx index b331feb6e1..f5ebd515b0 100644 --- a/src/components/learner-credit-management/cards/CourseCard.test.jsx +++ b/src/components/learner-credit-management/cards/CourseCard.test.jsx @@ -28,7 +28,7 @@ const defaultProps = { }; const execEdData = { - title: 'Course Title', + title: 'Exec Ed Course Title', card_image_url: undefined, partners: [{ logo_image_url: '', name: 'Course Provider' }], first_enrollable_paid_seat_price: 100, @@ -45,8 +45,6 @@ const execEdProps = { describe('Course card works as expected', () => { test('card renders as expected', () => { - process.env.EDX_FOR_BUSINESS_TITLE = 'ayylmao'; - process.env.EDX_ENTERPRISE_ALACARTE_TITLE = 'baz'; render( @@ -56,30 +54,31 @@ describe('Course card works as expected', () => { expect( screen.queryByText(defaultProps.original.partners[0].name), ).toBeInTheDocument(); - expect(screen.queryByText('$100 • Self paced')).toBeInTheDocument(); - expect(screen.queryByText('Business')).toBeInTheDocument(); + screen.debug(); + expect(screen.queryByText('Course Title')).toBeInTheDocument(); + expect(screen.queryByText('Per learner price')).toBeInTheDocument(); }); - test('test card renders default image', async () => { + test('exec ed card renders as expected', () => { render( - + , ); - const imageAltText = `${originalData.title} course image`; - fireEvent.error(screen.getByAltText(imageAltText)); - await expect(screen.getByAltText(imageAltText).src).not.toBeUndefined; + expect(screen.queryByText(execEdProps.original.title)).toBeInTheDocument(); + expect( + screen.queryByText(execEdProps.original.partners[0].name), + ).toBeInTheDocument(); + screen.debug(); + expect(screen.queryByText('Exec Ed Course Title')).toBeInTheDocument(); }); - test('exec ed card renders correct price from entitlement', async () => { - process.env.EDX_FOR_BUSINESS_TITLE = 'ayylmao'; - process.env.EDX_ENTERPRISE_ALACARTE_TITLE = 'baz'; + test('test card renders default image', async () => { render( - + , ); - expect(screen.queryByText(execEdProps.original.title)).toBeInTheDocument(); - // price decimal should be truncated - expect(screen.queryByText('$999 • Instructor led')).toBeInTheDocument(); - expect(screen.queryByText('Business')).toBeInTheDocument(); + const imageAltText = `${originalData.title} course image`; + fireEvent.error(screen.getByAltText(imageAltText)); + await expect(screen.getByAltText(imageAltText).src).not.toBeUndefined; }); }); diff --git a/src/components/learner-credit-management/tests/BudgetCard.test.jsx b/src/components/learner-credit-management/tests/BudgetCard.test.jsx index d8aa511a4a..d115330ac1 100644 --- a/src/components/learner-credit-management/tests/BudgetCard.test.jsx +++ b/src/components/learner-credit-management/tests/BudgetCard.test.jsx @@ -108,6 +108,7 @@ describe('', () => { enterpriseUUID={enterpriseUUID} enterpriseSlug={enterpriseId} />); + screen.debug(); expect(screen.getByText('Overview')); expect(screen.queryByText('Executive Education')).not.toBeInTheDocument(); const formattedString = `${dayjs(mockOffer.start).format('MMMM D, YYYY')} - ${dayjs(mockOffer.end).format('MMMM D, YYYY')}`; diff --git a/src/components/learner-credit-management/utils.jsx b/src/components/learner-credit-management/utils.jsx index 2fe5b328b6..dc32726943 100644 --- a/src/components/learner-credit-management/utils.jsx +++ b/src/components/learner-credit-management/utils.jsx @@ -1,12 +1,6 @@ import dayjs from 'dayjs'; -export function makePlural(num, string) { - if (num > 1 || num === 0) { - return `${num} ${string}s`; - } - return `${num} ${string}`; -} - +// eslint-disable-next-line import/prefer-default-export export function formatDate(date) { return dayjs(date).format('MMM D, YYYY'); } diff --git a/src/data/hooks.js b/src/data/hooks.js index db094d1112..51789d08fe 100644 --- a/src/data/hooks.js +++ b/src/data/hooks.js @@ -49,7 +49,7 @@ export function useTimeout(callback, delay) { export const useSelectedCourse = () => { const [course, setCourse] = useState(null); const isProgram = useMemo( - () => course && course.contentType === CONTENT_TYPE_PROGRAM, + () => course?.contentType === CONTENT_TYPE_PROGRAM, [course], ); const isCourse = useMemo( From 032da45c199291772ff6cc9173e4ea336e99aa10 Mon Sep 17 00:00:00 2001 From: Kira Miller Date: Tue, 10 Oct 2023 23:39:33 +0000 Subject: [PATCH 8/8] fix: PR reviews --- .../Admin/EmbeddedSubscription.test.jsx | 1 - .../Admin/SubscriptionDetailPage.test.jsx | 1 - .../licenses/LicenseAllocationHeader.test.jsx | 2 - .../CourseSearchResults.test.jsx | 1 - .../stepper/BulkEnrollmentSubmit.test.jsx | 1 - .../CodeAssignmentModal.test.jsx | 2 +- .../tests/ContentConfirmContentCard.test.jsx | 2 +- .../HighlightStepperConfirmContent.test.jsx | 1 - ...ghlightStepperSelectContentSearch.test.jsx | 1 - .../data/tests/constants.test.js | 2 +- .../EnterpriseApp/EnterpriseApp.test.jsx | 2 +- .../EnterpriseList/EnterpriseList.test.jsx | 1 - .../BudgetDetailCatalogTabContents.jsx | 2 +- .../learner-credit-management/algoliaUtils.js | 119 ------------------ .../cards/CourseCard.jsx | 51 ++++---- .../cards/CourseCard.messages.jsx | 27 ---- .../cards/CourseCard.test.jsx | 4 +- .../data/constants.js | 10 ++ .../data/hooks/hooks.js | 13 ++ .../learner-credit-management/data/utils.js | 6 + .../search/CatalogSearch.jsx | 12 +- .../search/CatalogSearchResults.jsx | 8 +- .../tests/BudgetCard.test.jsx | 1 - .../tests/CatalogSearch.test.jsx | 1 - .../tests/CatalogSearchResults.test.jsx | 8 +- .../learner-credit-management/utils.jsx | 6 - .../settings/tests/SettingsTabs.test.jsx | 1 - .../bulk-actions/EnrollBulkAction.test.jsx | 1 - .../bulk-actions/RemindBulkAction.test.jsx | 1 - .../bulk-actions/RevokeBulkAction.test.jsx | 1 - .../tests/index.test.jsx | 1 - .../tests/MultipleSubscriptionsPage.test.jsx | 1 - .../SubscriptionExpirationBanner.test.jsx | 2 +- .../SubscriptionExpirationModals.test.jsx | 2 +- src/components/test/testUtils.jsx | 1 - .../EnterpriseApp/EnterpriseApp.test.jsx | 5 +- src/data/constants/learnerCredit.js | 28 ----- src/data/hooks.js | 10 +- src/static/default-card-header-dark.png | Bin 76508 -> 0 bytes src/static/default-card-header-light.png | Bin 27327 -> 0 bytes 40 files changed, 75 insertions(+), 264 deletions(-) delete mode 100644 src/components/learner-credit-management/algoliaUtils.js delete mode 100644 src/components/learner-credit-management/cards/CourseCard.messages.jsx create mode 100644 src/components/learner-credit-management/data/hooks/hooks.js delete mode 100644 src/components/learner-credit-management/utils.jsx delete mode 100644 src/data/constants/learnerCredit.js delete mode 100644 src/static/default-card-header-dark.png delete mode 100644 src/static/default-card-header-light.png diff --git a/src/components/Admin/EmbeddedSubscription.test.jsx b/src/components/Admin/EmbeddedSubscription.test.jsx index 16e36f5f97..5c767330d3 100644 --- a/src/components/Admin/EmbeddedSubscription.test.jsx +++ b/src/components/Admin/EmbeddedSubscription.test.jsx @@ -36,7 +36,6 @@ const defaultAppContext = { }, }; -// eslint-disable-next-line react/prop-types const AppContextProvider = ({ children }) => ( {children} diff --git a/src/components/Admin/SubscriptionDetailPage.test.jsx b/src/components/Admin/SubscriptionDetailPage.test.jsx index 82d6b48369..7287107f1e 100644 --- a/src/components/Admin/SubscriptionDetailPage.test.jsx +++ b/src/components/Admin/SubscriptionDetailPage.test.jsx @@ -46,7 +46,6 @@ const initialSubsidyRequestContextValue = { }, }; -// eslint-disable-next-line react/prop-types const AppContextProvider = ({ children }) => ( {children} diff --git a/src/components/Admin/licenses/LicenseAllocationHeader.test.jsx b/src/components/Admin/licenses/LicenseAllocationHeader.test.jsx index bba9f04e4f..8179fad6d0 100644 --- a/src/components/Admin/licenses/LicenseAllocationHeader.test.jsx +++ b/src/components/Admin/licenses/LicenseAllocationHeader.test.jsx @@ -11,7 +11,6 @@ import { SubsidyRequestsContext } from '../../subsidy-requests'; describe('LicenseAllocationHeader', () => { const mockStore = configureMockStore(); - // eslint-disable-next-line react/prop-types const SubscriptionDetailContextWrapper = ({ children }) => ( // eslint-disable-next-line react/jsx-no-constructed-context-values { ); - // eslint-disable-next-line react/prop-types const SubsidyRequestsContextWrapper = ({ children }) => ( // eslint-disable-next-line react/jsx-no-constructed-context-values ( diff --git a/src/components/BulkEnrollmentPage/stepper/BulkEnrollmentSubmit.test.jsx b/src/components/BulkEnrollmentPage/stepper/BulkEnrollmentSubmit.test.jsx index 58a42934cf..b72e8e3dee 100644 --- a/src/components/BulkEnrollmentPage/stepper/BulkEnrollmentSubmit.test.jsx +++ b/src/components/BulkEnrollmentPage/stepper/BulkEnrollmentSubmit.test.jsx @@ -85,7 +85,6 @@ const bulkEnrollWithCoursesSelectedRows = { courses: [selectedCourses, coursesDispatch], }; -// eslint-disable-next-line react/prop-types const BulkEnrollmentSubmitWrapper = ({ bulkEnrollInfo = defaultBulkEnrollInfo, ...props }) => ( diff --git a/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx b/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx index a62e71dc20..b06b247812 100644 --- a/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx +++ b/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx @@ -20,7 +20,7 @@ import { jest.mock('redux-form', () => ({ ...jest.requireActual('redux-form'), - // eslint-disable-next-line react/prop-types + Field: ({ label, ...rest }) =>
{label}
, })); diff --git a/src/components/ContentHighlights/HighlightStepper/tests/ContentConfirmContentCard.test.jsx b/src/components/ContentHighlights/HighlightStepper/tests/ContentConfirmContentCard.test.jsx index 1f8f8f3a7a..b5b836dac8 100644 --- a/src/components/ContentHighlights/HighlightStepper/tests/ContentConfirmContentCard.test.jsx +++ b/src/components/ContentHighlights/HighlightStepper/tests/ContentConfirmContentCard.test.jsx @@ -45,7 +45,7 @@ const searchClient = algoliasearch( ); const ContentHighlightContentCardWrapper = ({ - // eslint-disable-next-line react/prop-types + store = mockStore(initialState), }) => { const contextValue = useState({ diff --git a/src/components/ContentHighlights/HighlightStepper/tests/HighlightStepperConfirmContent.test.jsx b/src/components/ContentHighlights/HighlightStepper/tests/HighlightStepperConfirmContent.test.jsx index 68022a1df8..34a9c64a67 100644 --- a/src/components/ContentHighlights/HighlightStepper/tests/HighlightStepperConfirmContent.test.jsx +++ b/src/components/ContentHighlights/HighlightStepper/tests/HighlightStepperConfirmContent.test.jsx @@ -30,7 +30,6 @@ const searchClient = algoliasearch( configuration.ALGOLIA.SEARCH_API_KEY, ); -// eslint-disable-next-line react/prop-types const HighlightStepperConfirmContentWrapper = ({ children, currentSelectedRowIds = [] }) => { const contextValue = useState({ stepperModal: { diff --git a/src/components/ContentHighlights/HighlightStepper/tests/HighlightStepperSelectContentSearch.test.jsx b/src/components/ContentHighlights/HighlightStepper/tests/HighlightStepperSelectContentSearch.test.jsx index c4f329b011..4d489c6d03 100644 --- a/src/components/ContentHighlights/HighlightStepper/tests/HighlightStepperSelectContentSearch.test.jsx +++ b/src/components/ContentHighlights/HighlightStepper/tests/HighlightStepperSelectContentSearch.test.jsx @@ -38,7 +38,6 @@ const searchClient = algoliasearch( configuration.ALGOLIA.SEARCH_API_KEY, ); -// eslint-disable-next-line react/prop-types const HighlightStepperSelectContentSearchWrapper = ({ children, currentSelectedRowIds = [] }) => { const contextValue = useState({ stepperModal: { diff --git a/src/components/ContentHighlights/data/tests/constants.test.js b/src/components/ContentHighlights/data/tests/constants.test.js index b12f3f1982..00125b4f57 100644 --- a/src/components/ContentHighlights/data/tests/constants.test.js +++ b/src/components/ContentHighlights/data/tests/constants.test.js @@ -33,7 +33,7 @@ describe('constants', () => { }); it('renders title name in string functions', () => { const highlightTitle = 'test-title'; - // eslint-disable-next-line react/prop-types + const TestComponent = ({ children }) => (

{children} diff --git a/src/components/EnterpriseApp/EnterpriseApp.test.jsx b/src/components/EnterpriseApp/EnterpriseApp.test.jsx index 2aeace95d8..04ea668d69 100644 --- a/src/components/EnterpriseApp/EnterpriseApp.test.jsx +++ b/src/components/EnterpriseApp/EnterpriseApp.test.jsx @@ -36,7 +36,7 @@ const EnterpriseAppContextProvider = ({ children }) => ( jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), __esModule: true, - // eslint-disable-next-line react/prop-types + Route: (props) => {props.path}, Switch: (props) => props.children, Redirect: () => 'Redirect', diff --git a/src/components/EnterpriseList/EnterpriseList.test.jsx b/src/components/EnterpriseList/EnterpriseList.test.jsx index 47b04098c0..d466f08366 100644 --- a/src/components/EnterpriseList/EnterpriseList.test.jsx +++ b/src/components/EnterpriseList/EnterpriseList.test.jsx @@ -35,7 +35,6 @@ const store = mockStore({ }, }); -// eslint-disable-next-line react/prop-types const EnterpriseListWrapper = ({ initialEntries, ...rest }) => ( diff --git a/src/components/learner-credit-management/BudgetDetailCatalogTabContents.jsx b/src/components/learner-credit-management/BudgetDetailCatalogTabContents.jsx index 8843966d84..a99f268db3 100644 --- a/src/components/learner-credit-management/BudgetDetailCatalogTabContents.jsx +++ b/src/components/learner-credit-management/BudgetDetailCatalogTabContents.jsx @@ -5,7 +5,7 @@ import { Row, Col } from '@edx/paragon'; import { SearchData, SEARCH_FACET_FILTERS } from '@edx/frontend-enterprise-catalog-search'; import CatalogSearch from './search/CatalogSearch'; -import { LANGUAGE_REFINEMENT, LEARNING_TYPE_REFINEMENT } from '../../data/constants/learnerCredit'; +import { LANGUAGE_REFINEMENT, LEARNING_TYPE_REFINEMENT } from './data'; import { configuration } from '../../config'; const BudgetDetailCatalogTabContents = () => { diff --git a/src/components/learner-credit-management/algoliaUtils.js b/src/components/learner-credit-management/algoliaUtils.js deleted file mode 100644 index b8bdee16cf..0000000000 --- a/src/components/learner-credit-management/algoliaUtils.js +++ /dev/null @@ -1,119 +0,0 @@ -import { CONTENT_TYPE_COURSE, CONTENT_TYPE_PROGRAM } from '../../data/constants/learnerCredit'; - -const extractUuid = (aggregationKey) => aggregationKey.split(':')[1]; - -/** - * Converts and algolia course object, into a course representation usable in this UI - */ -function mapAlgoliaObjectToCourse(algoliaCourseObject, intl, messages) { - const { - title: courseTitle, - partners, - first_enrollable_paid_seat_price: coursePrice, // todo - enterprise_catalog_query_titles: courseAssociatedCatalogs, - full_description: courseDescription, - original_image_url: bannerImageUrl, - marketing_url: marketingUrl, - advertised_course_run: courseRun, - upcoming_course_runs: upcomingRuns, - skill_names: skillNames, - } = algoliaCourseObject; - const { start: startDate, end: endDate } = courseRun; - const priceText = coursePrice != null - ? `$${coursePrice.toString()}` - : intl.formatMessage( - messages['catalogSearchResult.table.priceNotAvailable'], - ); - return { - contentType: CONTENT_TYPE_COURSE, - courseTitle, - courseProvider: partners[0].name, - coursePrice: priceText, - courseAssociatedCatalogs, - courseDescription, - partnerLogoImageUrl: partners[0].logo_image_url, - bannerImageUrl, - marketingUrl, - startDate, - endDate, - upcomingRuns, - skillNames, - }; -} - -/** - * Converts an algolia exec ed course object, into a course representation usable in this UI - */ -function mapAlgoliaObjectToExecEd(algoliaCourseObject, intl, messages) { - const { - title: courseTitle, - partners, - entitlements: coursePrice, // todo - enterprise_catalog_query_titles: courseAssociatedCatalogs, - full_description: courseDescription, - original_image_url: bannerImageUrl, - marketing_url: marketingUrl, - upcoming_course_runs: upcomingRuns, - skill_names: skillNames, - additional_metadata: additionalMetadata, - } = algoliaCourseObject; - const { start_date: startDate, end_date: endDate } = additionalMetadata; - const priceText = coursePrice != null - ? `$${coursePrice[0].price.toString()}` - : intl.formatMessage( - messages['catalogSearchResult.table.priceNotAvailable'], - ); - return { - contentType: CONTENT_TYPE_COURSE, - courseTitle, - courseProvider: partners[0].name, - coursePrice: priceText, - courseAssociatedCatalogs, - courseDescription, - partnerLogoImageUrl: partners[0].logo_image_url, - bannerImageUrl, - marketingUrl, - startDate, - endDate, - upcomingRuns, - skillNames, - }; -} - -/** - * Converts an algolia course object, into a course representation usable in this UI - */ -function mapAlgoliaObjectToProgram(algoliaProgramObject) { - const { - title, - partners, - full_description: programDescription, - aggregation_key: aggregationKey, - card_image_url: cardImageUrl, - banner_image_url: bannerImageUrl, - enterprise_catalog_query_titles: programAssociatedCatalogs, - marketing_url: marketingUrl, - prices: programPrices, - learning_items: learningItems, - course_details: courseDetails, - } = algoliaProgramObject; - return { - contentType: CONTENT_TYPE_PROGRAM, - programUuid: extractUuid(aggregationKey), - programTitle: title, - programProvider: partners[0].name, - programDescription, - programAssociatedCatalogs, - partnerLogoImageUrl: partners[0].logo_image_url, - cardImageUrl, - marketingUrl, - programPrices, - learningItems, - bannerImageUrl, - programCourses: courseDetails, - }; -} - -export { - mapAlgoliaObjectToProgram, mapAlgoliaObjectToExecEd, mapAlgoliaObjectToCourse, extractUuid, -}; diff --git a/src/components/learner-credit-management/cards/CourseCard.jsx b/src/components/learner-credit-management/cards/CourseCard.jsx index 093b3f8f0f..9284369239 100644 --- a/src/components/learner-credit-management/cards/CourseCard.jsx +++ b/src/components/learner-credit-management/cards/CourseCard.jsx @@ -3,40 +3,38 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { camelCaseObject } from '@edx/frontend-platform'; +import cardFallbackImg from '@edx/brand/paragon/images/card-imagecap-fallback.png'; import { - Badge, Button, Card, Icon, + Badge, Button, Card, Hyperlink, } from '@edx/paragon'; -import { Launch } from '@edx/paragon/icons'; -import { EXEC_COURSE_TYPE } from '../../../data/constants/learnerCredit'; -import defaultCardHeader from '../../../static/default-card-header-light.png'; -import { formatDate } from '../utils'; +import { EXEC_COURSE_TYPE } from '../data/constants'; +import { formatDate } from '../data/utils'; const CourseCard = ({ onClick, original, }) => { const { title, - card_image_url, - course_type, - normalized_metadata, + cardImageUrl, + courseType, + normalizedMetadata, partners, - } = original; + } = camelCaseObject(original); let priceText; - - const imageSrc = card_image_url || defaultCardHeader; const altText = `${title} course image`; return ( onClick(original)} orientation="horizontal" + tabIndex="0" >

{title}

{partners[0]?.name}

- {course_type === EXEC_COURSE_TYPE && ( + {courseType === EXEC_COURSE_TYPE && ( Executive Education )} - {course_type !== EXEC_COURSE_TYPE && ( + {courseType !== EXEC_COURSE_TYPE && (

)} -

- Starts {formatDate(normalized_metadata?.start_date)} • - Learner must register by {formatDate(normalized_metadata?.enroll_by_date)} +

+ Starts {formatDate(normalizedMetadata?.start_date)} • + Learner must register by {formatDate(normalizedMetadata?.enroll_by_date)}

{priceText}

-

Per learner price

+

Per learner price

- + +
@@ -79,15 +78,19 @@ CourseCard.propTypes = { onClick: PropTypes.func, original: PropTypes.shape({ title: PropTypes.string, - card_image_url: PropTypes.string, + cardImageUrl: PropTypes.string, partners: PropTypes.arrayOf( PropTypes.shape({ name: PropTypes.string, logo_image_url: PropTypes.string, }), ), - normalized_metadata: PropTypes.shape(), - course_type: PropTypes.string, + normalizedMetadata: PropTypes.shape({ + startDate: PropTypes.string, + endDate: PropTypes.string, + enrollByDate: PropTypes.string, + }), + courseType: PropTypes.string, }).isRequired, }; diff --git a/src/components/learner-credit-management/cards/CourseCard.messages.jsx b/src/components/learner-credit-management/cards/CourseCard.messages.jsx deleted file mode 100644 index 01b82ab3ac..0000000000 --- a/src/components/learner-credit-management/cards/CourseCard.messages.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import { defineMessages } from '@edx/frontend-platform/i18n'; - -const messages = defineMessages({ - 'courseCard.relatedSkillsHeading': { - id: 'courseCard.relatedSkillsHeading', - defaultMessage: 'Related skills', - description: 'Heading of related skills section', - }, - 'courseCard.aLaCarteBadge': { - id: 'courseCard.aLaCarteBadge', - defaultMessage: 'A la carte', - description: 'Badge text for the `A La Carte` catalog badge.', - }, - 'courseCard.businessBadge': { - id: 'courseCard.businessBadge', - defaultMessage: 'Business', - description: 'Badge text for the `Business` catalog badge.', - }, - 'courseCard.priceNotAvailable': { - id: 'courseCard.priceNotAvailable', - defaultMessage: ' Not Available', - description: - 'When a course price is not available, notify learners that there is no data available to display.', - }, -}); - -export default messages; diff --git a/src/components/learner-credit-management/cards/CourseCard.test.jsx b/src/components/learner-credit-management/cards/CourseCard.test.jsx index f5ebd515b0..963137e178 100644 --- a/src/components/learner-credit-management/cards/CourseCard.test.jsx +++ b/src/components/learner-credit-management/cards/CourseCard.test.jsx @@ -4,7 +4,7 @@ import '@testing-library/jest-dom/extend-expect'; import { IntlProvider } from '@edx/frontend-platform/i18n'; import CourseCard from './CourseCard'; -import { CONTENT_TYPE_COURSE, EXEC_ED_TITLE } from '../../../data/constants/learnerCredit'; +import { CONTENT_TYPE_COURSE, EXEC_ED_TITLE } from '../data/constants'; jest.mock('@edx/frontend-platform', () => ({ ...jest.requireActual('@edx/frontend-platform'), @@ -54,7 +54,6 @@ describe('Course card works as expected', () => { expect( screen.queryByText(defaultProps.original.partners[0].name), ).toBeInTheDocument(); - screen.debug(); expect(screen.queryByText('Course Title')).toBeInTheDocument(); expect(screen.queryByText('Per learner price')).toBeInTheDocument(); }); @@ -68,7 +67,6 @@ describe('Course card works as expected', () => { expect( screen.queryByText(execEdProps.original.partners[0].name), ).toBeInTheDocument(); - screen.debug(); expect(screen.queryByText('Exec Ed Course Title')).toBeInTheDocument(); }); test('test card renders default image', async () => { diff --git a/src/components/learner-credit-management/data/constants.js b/src/components/learner-credit-management/data/constants.js index defca8d674..37f453bd4a 100644 --- a/src/components/learner-credit-management/data/constants.js +++ b/src/components/learner-credit-management/data/constants.js @@ -24,3 +24,13 @@ export const BUDGET_DETAIL_TAB_LABELS = { [BUDGET_DETAIL_ACTIVITY_TAB]: 'Activity', [BUDGET_DETAIL_CATALOG_TAB]: 'Catalog', }; + +// Facet filters +export const LEARNING_TYPE_REFINEMENT = 'learning_type'; +export const LANGUAGE_REFINEMENT = 'language'; + +// Learning types +export const CONTENT_TYPE_COURSE = 'course'; +export const EXEC_ED_TITLE = 'Executive Education'; + +export const EXEC_COURSE_TYPE = 'executive-education-2u'; diff --git a/src/components/learner-credit-management/data/hooks/hooks.js b/src/components/learner-credit-management/data/hooks/hooks.js new file mode 100644 index 0000000000..306ad58fde --- /dev/null +++ b/src/components/learner-credit-management/data/hooks/hooks.js @@ -0,0 +1,13 @@ +import { useMemo, useState } from 'react'; + +import { CONTENT_TYPE_COURSE } from '../constants'; + +// eslint-disable-next-line import/prefer-default-export +export const useSelectedCourse = () => { + const [course, setCourse] = useState(null); + const isCourse = useMemo( + () => course?.contentType === CONTENT_TYPE_COURSE, + [course], + ); + return [course, setCourse, isCourse]; +}; diff --git a/src/components/learner-credit-management/data/utils.js b/src/components/learner-credit-management/data/utils.js index 376479f6a5..4705d62507 100644 --- a/src/components/learner-credit-management/data/utils.js +++ b/src/components/learner-credit-management/data/utils.js @@ -1,4 +1,6 @@ import { v4 as uuidv4 } from 'uuid'; +import dayjs from 'dayjs'; + import { LOW_REMAINING_BALANCE_PERCENT_THRESHOLD, NO_BALANCE_REMAINING_DOLLAR_THRESHOLD, @@ -181,3 +183,7 @@ export const orderOffers = (offers) => { return offers; }; + +export function formatDate(date) { + return dayjs(date).format('MMM D, YYYY'); +} diff --git a/src/components/learner-credit-management/search/CatalogSearch.jsx b/src/components/learner-credit-management/search/CatalogSearch.jsx index d6f6e3f463..43cc7aae8d 100644 --- a/src/components/learner-credit-management/search/CatalogSearch.jsx +++ b/src/components/learner-credit-management/search/CatalogSearch.jsx @@ -1,10 +1,9 @@ -import React, { useMemo } from 'react'; +import React from 'react'; import { useParams } from 'react-router-dom'; import algoliasearch from 'algoliasearch/lite'; import { Configure, InstantSearch } from 'react-instantsearch-dom'; import { FormattedMessage } from '@edx/frontend-platform/i18n'; -import { getConfig } from '@edx/frontend-platform/config'; import { SearchHeader } from '@edx/frontend-enterprise-catalog-search'; import { configuration } from '../../../config'; @@ -14,19 +13,13 @@ const CatalogSearch = () => { const { budgetId } = useParams(); const searchClient = algoliasearch(configuration.ALGOLIA.APP_ID, configuration.ALGOLIA.SEARCH_API_KEY); - const config = getConfig(); - const courseIndex = useMemo(() => { - const cIndex = searchClient.initIndex(config.ALGOLIA_INDEX_NAME); - return cIndex; - }, [config.ALGOLIA_INDEX_NAME, searchClient]); - const searchFilters = `enterprise_catalog_query_uuids:${budgetId}`; return (
@@ -39,7 +32,6 @@ const CatalogSearch = () => { diff --git a/src/components/learner-credit-management/search/CatalogSearchResults.jsx b/src/components/learner-credit-management/search/CatalogSearchResults.jsx index 137b129845..60c20e0262 100644 --- a/src/components/learner-credit-management/search/CatalogSearchResults.jsx +++ b/src/components/learner-credit-management/search/CatalogSearchResults.jsx @@ -98,13 +98,7 @@ export const BaseCatalogSearchResults = ({ > renderCardComponent(props)} /> diff --git a/src/components/learner-credit-management/tests/BudgetCard.test.jsx b/src/components/learner-credit-management/tests/BudgetCard.test.jsx index 0418ec820b..a2bc074944 100644 --- a/src/components/learner-credit-management/tests/BudgetCard.test.jsx +++ b/src/components/learner-credit-management/tests/BudgetCard.test.jsx @@ -112,7 +112,6 @@ describe('', () => { enterpriseUUID={enterpriseUUID} enterpriseSlug={enterpriseId} />); - screen.debug(); expect(screen.getByText('Overview')); expect(screen.queryByText('Executive Education')).not.toBeInTheDocument(); const formattedString = `Expired ${dayjs(mockOffer.end).format('MMMM D, YYYY')}`; diff --git a/src/components/learner-credit-management/tests/CatalogSearch.test.jsx b/src/components/learner-credit-management/tests/CatalogSearch.test.jsx index 72d1ab01e5..ee74751e87 100644 --- a/src/components/learner-credit-management/tests/CatalogSearch.test.jsx +++ b/src/components/learner-credit-management/tests/CatalogSearch.test.jsx @@ -17,7 +17,6 @@ jest.mock('react-instantsearch-dom', () => ({ const DEFAULT_SEARCH_CONTEXT_VALUE = { refinements: {} }; -// eslint-disable-next-line react/prop-types const SearchDataWrapper = ({ children, searchContextValue }) => ( ({ const DEFAULT_SEARCH_CONTEXT_VALUE = { refinements: {} }; const SearchDataWrapper = ({ - // eslint-disable-next-line react/prop-types + children, - // eslint-disable-next-line react/prop-types + searchContextValue = DEFAULT_SEARCH_CONTEXT_VALUE, }) => ( @@ -137,8 +137,6 @@ describe('Main Catalogs view works as expected', () => { , , ); - screen.debug(); - expect(screen.queryByText(TEST_COURSE_NAME)).toBeInTheDocument(); expect(screen.queryByText(TEST_COURSE_NAME_2)).toBeInTheDocument(); expect(screen.getAllByText('Showing 2 of 2.')[0]).toBeInTheDocument(); diff --git a/src/components/learner-credit-management/utils.jsx b/src/components/learner-credit-management/utils.jsx deleted file mode 100644 index dc32726943..0000000000 --- a/src/components/learner-credit-management/utils.jsx +++ /dev/null @@ -1,6 +0,0 @@ -import dayjs from 'dayjs'; - -// eslint-disable-next-line import/prefer-default-export -export function formatDate(date) { - return dayjs(date).format('MMM D, YYYY'); -} diff --git a/src/components/settings/tests/SettingsTabs.test.jsx b/src/components/settings/tests/SettingsTabs.test.jsx index 7dff9d0a67..ed8576396d 100644 --- a/src/components/settings/tests/SettingsTabs.test.jsx +++ b/src/components/settings/tests/SettingsTabs.test.jsx @@ -76,7 +76,6 @@ const mockStore = configureMockStore([thunk]); const getMockStore = store => mockStore(store); const defaultStore = getMockStore({ ...initialStore }); -// eslint-disable-next-line react/prop-types const SettingsTabsWithRouter = ({ store = defaultStore }) => ( diff --git a/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/EnrollBulkAction.test.jsx b/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/EnrollBulkAction.test.jsx index c603c2ebd8..3d42aaa9a2 100644 --- a/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/EnrollBulkAction.test.jsx +++ b/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/EnrollBulkAction.test.jsx @@ -50,7 +50,6 @@ const initialStore = mockStore({ }, }); -// eslint-disable-next-line react/prop-types const EnrollBulkActionWithProvider = ({ store = initialStore, ...rest }) => ( diff --git a/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/RemindBulkAction.test.jsx b/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/RemindBulkAction.test.jsx index e01e23160d..329cff540b 100644 --- a/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/RemindBulkAction.test.jsx +++ b/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/RemindBulkAction.test.jsx @@ -42,7 +42,6 @@ const initialStore = mockStore({ }, }); -// eslint-disable-next-line react/prop-types const RemindBulkActionWithProvider = ({ store = initialStore, ...rest }) => ( diff --git a/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/RevokeBulkAction.test.jsx b/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/RevokeBulkAction.test.jsx index 2e2bbcf624..e5f947b638 100644 --- a/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/RevokeBulkAction.test.jsx +++ b/src/components/subscriptions/licenses/LicenseManagementTable/bulk-actions/RevokeBulkAction.test.jsx @@ -39,7 +39,6 @@ const initialStore = mockStore({ }, }); -// eslint-disable-next-line react/prop-types const RevokeBulkActionWithProvider = ({ store = initialStore, ...rest }) => ( diff --git a/src/components/subscriptions/licenses/LicenseManagementTable/tests/index.test.jsx b/src/components/subscriptions/licenses/LicenseManagementTable/tests/index.test.jsx index 6ac5cc5086..de07041417 100644 --- a/src/components/subscriptions/licenses/LicenseManagementTable/tests/index.test.jsx +++ b/src/components/subscriptions/licenses/LicenseManagementTable/tests/index.test.jsx @@ -58,7 +58,6 @@ const expiredSubscriptionPlan = ( }; }; -// eslint-disable-next-line react/prop-types const LicenseManagementTableWrapper = ({ subscriptionPlan, ...props }) => ( diff --git a/src/components/subscriptions/tests/MultipleSubscriptionsPage.test.jsx b/src/components/subscriptions/tests/MultipleSubscriptionsPage.test.jsx index e476bdce5a..7e3633180d 100644 --- a/src/components/subscriptions/tests/MultipleSubscriptionsPage.test.jsx +++ b/src/components/subscriptions/tests/MultipleSubscriptionsPage.test.jsx @@ -63,7 +63,6 @@ const defaultSubscriptions = { const mockStore = configureMockStore([thunk]); -// eslint-disable-next-line react/prop-types const MultipleSubscriptionsPageWrapper = ({ subscriptions = defaultSubscriptions, ...props }) => ( diff --git a/src/components/subscriptions/tests/expiration/SubscriptionExpirationBanner.test.jsx b/src/components/subscriptions/tests/expiration/SubscriptionExpirationBanner.test.jsx index a0dc6aea45..e743f3ae70 100644 --- a/src/components/subscriptions/tests/expiration/SubscriptionExpirationBanner.test.jsx +++ b/src/components/subscriptions/tests/expiration/SubscriptionExpirationBanner.test.jsx @@ -27,7 +27,7 @@ jest.mock('@edx/frontend-enterprise-utils', () => { }); // PropType validation for state is done by SubscriptionManagementContext -// eslint-disable-next-line react/prop-types + const ExpirationBannerWrapper = ({ detailState, isSubscriptionPlanDetails = false }) => ( diff --git a/src/components/subscriptions/tests/expiration/SubscriptionExpirationModals.test.jsx b/src/components/subscriptions/tests/expiration/SubscriptionExpirationModals.test.jsx index 2dbbfe237a..a86f455417 100644 --- a/src/components/subscriptions/tests/expiration/SubscriptionExpirationModals.test.jsx +++ b/src/components/subscriptions/tests/expiration/SubscriptionExpirationModals.test.jsx @@ -29,7 +29,7 @@ jest.mock('@edx/frontend-enterprise-utils', () => { }); // PropType validation for state is done by SubscriptionManagementContext -// eslint-disable-next-line react/prop-types + const ExpirationModalsWithContext = ({ detailState }) => ( diff --git a/src/components/test/testUtils.jsx b/src/components/test/testUtils.jsx index b5ac1bf34e..02a98208fb 100644 --- a/src/components/test/testUtils.jsx +++ b/src/components/test/testUtils.jsx @@ -12,7 +12,6 @@ export function renderWithRouter( history = createMemoryHistory({ initialEntries: [route] }), } = {}, ) { - // eslint-disable-next-line react/prop-types const Wrapper = ({ children }) => ( {children} ); diff --git a/src/containers/EnterpriseApp/EnterpriseApp.test.jsx b/src/containers/EnterpriseApp/EnterpriseApp.test.jsx index bde4287dcc..7b76f07112 100644 --- a/src/containers/EnterpriseApp/EnterpriseApp.test.jsx +++ b/src/containers/EnterpriseApp/EnterpriseApp.test.jsx @@ -47,13 +47,13 @@ const EnterpriseAppContextProvider = ({ jest.mock('../../components/EnterpriseApp/EnterpriseAppContextProvider', () => ({ __esModule: true, ...jest.requireActual('../../components/EnterpriseApp/EnterpriseAppContextProvider'), - // eslint-disable-next-line react/prop-types + default: ({ children }) => {children}, })); jest.mock('../Sidebar', () => ({ __esModule: true, - // eslint-disable-next-line react/prop-types + default: ({ children }) =>
{children}
, })); @@ -93,7 +93,6 @@ const initialState = { }, }; -// eslint-disable-next-line react/prop-types const EnterpriseAppWrapper = ({ store, initialEntries, ...props }) => ( diff --git a/src/data/constants/learnerCredit.js b/src/data/constants/learnerCredit.js deleted file mode 100644 index 1c41bd6bbc..0000000000 --- a/src/data/constants/learnerCredit.js +++ /dev/null @@ -1,28 +0,0 @@ -export const PAGE_TITLE = 'edX Enterprise Catalogs'; - -/** - * Event names to use for tracking - * Spec: https://openedx.atlassian.net/wiki/spaces/AN/pages/2624455676/Enterprise+public+catalog+Event+Design - */ -export const TRACKING_APP_NAME = 'admin-portal'; -// end: tracking related -export const QUERY_TITLE_REFINEMENT = 'enterprise_catalog_query_titles'; -export const AVAILABILITY_REFINEMENT = 'availability'; -export const AVAILABILITY_REFINEMENT_DEFAULTS = [ - 'Available Now', - 'Starting Soon', - 'Upcoming', -]; - -// Facet filters -export const CONTENT_TYPE_REFINEMENT = 'content_type'; -export const COURSE_TYPE_REFINEMENT = 'course_type'; -export const LEARNING_TYPE_REFINEMENT = 'learning_type'; -export const LANGUAGE_REFINEMENT = 'language'; - -// Learning types -export const CONTENT_TYPE_COURSE = 'course'; -export const CONTENT_TYPE_PROGRAM = 'program'; -export const EXEC_ED_TITLE = 'Executive Education'; - -export const EXEC_COURSE_TYPE = 'executive-education-2u'; diff --git a/src/data/hooks.js b/src/data/hooks.js index 51789d08fe..c44b512dd5 100644 --- a/src/data/hooks.js +++ b/src/data/hooks.js @@ -2,7 +2,7 @@ import { useEffect, useMemo, useState, useRef, } from 'react'; -import { CONTENT_TYPE_COURSE, CONTENT_TYPE_PROGRAM } from './constants/learnerCredit'; +import { CONTENT_TYPE_COURSE } from '../components/learner-credit-management/data/constants'; export function useInterval(callback, delay) { const savedCallback = useRef(); @@ -48,13 +48,9 @@ export function useTimeout(callback, delay) { export const useSelectedCourse = () => { const [course, setCourse] = useState(null); - const isProgram = useMemo( - () => course?.contentType === CONTENT_TYPE_PROGRAM, - [course], - ); const isCourse = useMemo( - () => course && course.contentType === CONTENT_TYPE_COURSE, + () => course?.contentType === CONTENT_TYPE_COURSE, [course], ); - return [course, setCourse, isProgram, isCourse]; + return [course, setCourse, isCourse]; }; diff --git a/src/static/default-card-header-dark.png b/src/static/default-card-header-dark.png deleted file mode 100644 index d692970952c1fdfdd6a9bae9885ecee639b9ffda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76508 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 M;QyYc5dVe!f9`84GXMYp diff --git a/src/static/default-card-header-light.png b/src/static/default-card-header-light.png deleted file mode 100644 index 9da8a136f2bf9edd9223ad1a944b24d006d21d2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27327 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 Ai~s-t