Skip to content

Commit 3ddaf5a

Browse files
committed
Merge branch 'master' into rpenido/fal-4058/add-unit-tag-support
2 parents 2577828 + fe36e65 commit 3ddaf5a

18 files changed

Lines changed: 306 additions & 35 deletions

File tree

src/course-outline/CourseOutline.jsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ const CourseOutline = ({ courseId }) => {
108108
handlePasteClipboardClick,
109109
notificationDismissUrl,
110110
discussionsSettings,
111-
discussionsIncontextFeedbackUrl,
112111
discussionsIncontextLearnmoreUrl,
113112
deprecatedBlocksInfo,
114113
proctoringErrors,
@@ -241,7 +240,6 @@ const CourseOutline = ({ courseId }) => {
241240
notificationDismissUrl={notificationDismissUrl}
242241
handleDismissNotification={handleDismissNotification}
243242
discussionsSettings={discussionsSettings}
244-
discussionsIncontextFeedbackUrl={discussionsIncontextFeedbackUrl}
245243
discussionsIncontextLearnmoreUrl={discussionsIncontextLearnmoreUrl}
246244
deprecatedBlocksInfo={deprecatedBlocksInfo}
247245
proctoringErrors={proctoringErrors}
@@ -266,7 +264,6 @@ const CourseOutline = ({ courseId }) => {
266264
notificationDismissUrl={notificationDismissUrl}
267265
handleDismissNotification={handleDismissNotification}
268266
discussionsSettings={discussionsSettings}
269-
discussionsIncontextFeedbackUrl={discussionsIncontextFeedbackUrl}
270267
discussionsIncontextLearnmoreUrl={discussionsIncontextLearnmoreUrl}
271268
deprecatedBlocksInfo={deprecatedBlocksInfo}
272269
proctoringErrors={proctoringErrors}

src/course-outline/__mocks__/courseOutlineIndex.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3044,7 +3044,6 @@ module.exports = {
30443044
blocks: [],
30453045
advanceSettingsUrl: '/settings/advanced/course-v1:edx+101+y76',
30463046
},
3047-
discussionsIncontextFeedbackUrl: '',
30483047
discussionsIncontextLearnmoreUrl: '',
30493048
initialState: {
30503049
expandedLocators: [

src/course-outline/__mocks__/courseOutlineIndexWithoutSections.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module.exports = {
66
blocks: [],
77
advanceSettingsUrl: '/settings/advanced/course-v1:edx+101+y76',
88
},
9-
discussionsIncontextFeedbackUrl: '',
109
discussionsIncontextLearnmoreUrl: '',
1110
initialState: {
1211
expandedLocators: [

src/course-outline/data/api.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ export const exportTags = (courseId) => `${getApiBaseUrl()}/api/content_tagging/
3535
* @property {string} courseReleaseDate
3636
* @property {Object} courseStructure
3737
* @property {Object} deprecatedBlocksInfo
38-
* @property {string} discussionsIncontextFeedbackUrl
3938
* @property {string} discussionsIncontextLearnmoreUrl
4039
* @property {Object} initialState
4140
* @property {Object} initialUserClipboard

src/course-outline/hooks.jsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ const useCourseOutline = ({ courseId }) => {
6666
lmsLink,
6767
notificationDismissUrl,
6868
discussionsSettings,
69-
discussionsIncontextFeedbackUrl,
7069
discussionsIncontextLearnmoreUrl,
7170
deprecatedBlocksInfo,
7271
proctoringErrors,
@@ -341,7 +340,6 @@ const useCourseOutline = ({ courseId }) => {
341340
handlePasteClipboardClick,
342341
notificationDismissUrl,
343342
discussionsSettings,
344-
discussionsIncontextFeedbackUrl,
345343
discussionsIncontextLearnmoreUrl,
346344
deprecatedBlocksInfo,
347345
proctoringErrors,

src/course-outline/page-alerts/PageAlerts.jsx

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ const PageAlerts = ({
3131
notificationDismissUrl,
3232
handleDismissNotification,
3333
discussionsSettings,
34-
discussionsIncontextFeedbackUrl,
3534
discussionsIncontextLearnmoreUrl,
3635
deprecatedBlocksInfo,
3736
proctoringErrors,
@@ -114,13 +113,6 @@ const PageAlerts = ({
114113
platformName: process.env.SITE_NAME,
115114
})}
116115
</div>
117-
<Hyperlink
118-
showLaunchIcon={false}
119-
destination={discussionsIncontextFeedbackUrl}
120-
target="_blank"
121-
>
122-
{intl.formatMessage(messages.discussionNotificationFeedback)}
123-
</Hyperlink>
124116
</Alert>
125117
);
126118
};
@@ -453,7 +445,6 @@ PageAlerts.defaultProps = {
453445
notificationDismissUrl: '',
454446
handleDismissNotification: null,
455447
discussionsSettings: {},
456-
discussionsIncontextFeedbackUrl: '',
457448
discussionsIncontextLearnmoreUrl: '',
458449
deprecatedBlocksInfo: {},
459450
proctoringErrors: [],
@@ -470,7 +461,6 @@ PageAlerts.propTypes = {
470461
discussionsSettings: PropTypes.shape({
471462
providerType: PropTypes.string,
472463
}),
473-
discussionsIncontextFeedbackUrl: PropTypes.string,
474464
discussionsIncontextLearnmoreUrl: PropTypes.string,
475465
deprecatedBlocksInfo: PropTypes.shape({
476466
blocks: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),

src/course-outline/page-alerts/PageAlerts.test.jsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
render,
66
fireEvent,
77
screen,
8-
waitFor,
98
} from '@testing-library/react';
109
import { IntlProvider } from '@edx/frontend-platform/i18n';
1110
import { AppProvider } from '@edx/frontend-platform/react';
@@ -43,7 +42,6 @@ const pageAlertsData = {
4342
notificationDismissUrl: '',
4443
handleDismissNotification: null,
4544
discussionsSettings: {},
46-
discussionsIncontextFeedbackUrl: '',
4745
discussionsIncontextLearnmoreUrl: '',
4846
deprecatedBlocksInfo: {},
4947
proctoringErrors: [],
@@ -102,7 +100,6 @@ describe('<PageAlerts />', () => {
102100
discussionsSettings: {
103101
providerType: 'openedx',
104102
},
105-
discussionsIncontextFeedbackUrl: 'some-feedback-url',
106103
discussionsIncontextLearnmoreUrl: 'some-learn-more-url',
107104
});
108105

@@ -115,12 +112,6 @@ describe('<PageAlerts />', () => {
115112
fireEvent.click(dismissBtn);
116113
const discussionAlertDismissKey = `discussionAlertDismissed-${pageAlertsData.courseId}`;
117114
expect(localStorage.getItem(discussionAlertDismissKey)).toBe('true');
118-
119-
await waitFor(() => {
120-
const feedbackLink = screen.queryByText(messages.discussionNotificationFeedback.defaultMessage);
121-
expect(feedbackLink).toBeInTheDocument();
122-
expect(feedbackLink).toHaveAttribute('href', 'some-feedback-url');
123-
});
124115
});
125116

126117
it('renders deprecation warning alerts', async () => {

src/editors/sharedComponents/CodeEditor/hooks.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,41 @@ export const prepareShowBtnEscapeHTML = () => {
2424
};
2525

2626
export const cleanHTML = ({ initialText }) => {
27+
const altRegex = /(alt="(.*?)")/g;
28+
const altTextMap = {};
29+
let altTextIndex = 0;
30+
31+
// Replace alt attributes with ALT_TEXT_0/1/2...
32+
const initialTextWithoutAltAttr = initialText.replace(altRegex, (match) => {
33+
const altText = `ALT_TEXT_${altTextIndex++}`;
34+
altTextMap[altText] = match;
35+
return altText;
36+
});
37+
38+
// Replace HTML entities in the rest of the text, excluding altTexts
2739
const translateRegex = new RegExp(`&(${Object.keys(alphanumericMap).join('|')});`, 'g');
2840
const translator = ($0, $1) => alphanumericMap[$1];
29-
return initialText.replace(translateRegex, translator);
41+
const cleanedTextWithoutAltAttr = initialTextWithoutAltAttr.replace(translateRegex, translator);
42+
43+
// Clean altText matches in altTextMap, ignore &quot;
44+
const alphanumericMapForAltText = { ...alphanumericMap };
45+
delete alphanumericMapForAltText.quot;
46+
Object.keys(altTextMap).forEach((key) => {
47+
const altTextValue = altTextMap[key];
48+
const cleanedAltTextValue = altTextValue.replace(
49+
/&(\w+);/g,
50+
($0, $1) => alphanumericMapForAltText[$1] || $0,
51+
);
52+
altTextMap[key] = cleanedAltTextValue;
53+
});
54+
55+
// Restore the original alt attributes from altTextMap
56+
const finalCleanedText = Object.keys(altTextMap).reduce(
57+
(text, altText) => text.replace(altText, altTextMap[altText]),
58+
cleanedTextWithoutAltAttr,
59+
);
60+
61+
return finalCleanedText;
3062
};
3163

3264
export const syntaxChecker = ({ textArr, lang }) => {

src/editors/sharedComponents/CodeEditor/index.test.jsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,17 @@ describe('CodeEditor', () => {
6464
describe('cleanHTML', () => {
6565
const dirtyText = `&${Object.keys(alphanumericMap).join('; , &')};`;
6666
const cleanText = `${Object.values(alphanumericMap).join(' , ')}`;
67+
const dirtyTextWithAlt = '<img src="image.png" alt="Description &le; and &ge; &quot;do not convert these to double quotes&quot; 1" /> and &le; and &ge;';
68+
const cleanTextWithAlt = '<img src="image.png" alt="Description ≤ and ≥ &quot;do not convert these to double quotes&quot; 1" /> and ≤ and ≥';
6769

6870
it('escapes alphanumerics and sets them to be literals', () => {
6971
expect(hooks.cleanHTML({ initialText: dirtyText })).toEqual(cleanText);
7072
});
73+
74+
it('replaces alt attributes with placeholders and restores them', () => {
75+
const result = hooks.cleanHTML({ initialText: dirtyTextWithAlt });
76+
expect(result).toEqual(cleanTextWithAlt);
77+
});
7178
});
7279

7380
describe('escapeHTMLSpecialChars', () => {

src/library-authoring/components/BaseCard.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.library-item-card {
22
.pgn__card {
3-
height: 100%
3+
height: 100%;
4+
min-width: 15rem;
45
}
56

67
.library-item-header {

0 commit comments

Comments
 (0)