From b15ade43538b10a79852e7862425c9e542de1c4b Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Fri, 13 Oct 2023 14:58:55 -0700 Subject: [PATCH 01/19] feat: Make "Pages & Resources" course apps into plugins --- package-lock.json | 29 +++++++++++++++++++ package.json | 3 ++ plugins/course-apps/calculator/Settings.jsx | 27 +++++++++++++++++ .../course-apps}/calculator/messages.js | 0 plugins/course-apps/calculator/package.json | 9 ++++++ plugins/course-apps/edxnotes/Settings.jsx | 27 +++++++++++++++++ .../course-apps}/edxnotes/messages.js | 0 plugins/course-apps/edxnotes/package.json | 9 ++++++ .../course-apps}/live/BBBSettings.jsx | 4 +-- .../course-apps}/live/BbbSettings.test.jsx | 4 +-- .../course-apps}/live/LiveCommonFields.jsx | 2 +- .../course-apps}/live/Settings.jsx | 8 ++--- .../course-apps}/live/Settings.test.jsx | 4 +-- .../course-apps}/live/ZoomSettings.jsx | 2 +- .../course-apps}/live/ZoomSettings.test.jsx | 4 +-- .../course-apps}/live/constants.js | 0 .../course-apps}/live/data/api.js | 0 .../course-apps}/live/data/slice.js | 2 +- .../course-apps}/live/data/thunks.js | 4 +-- .../live/factories/mockApiResponses.jsx | 0 .../course-apps}/live/messages.js | 0 plugins/course-apps/live/package.json | 9 ++++++ src/pages-and-resources/PagesAndResources.jsx | 2 +- .../app-settings-modal/AppSettingsModal.jsx | 2 ++ .../calculator/Settings.jsx | 25 ---------------- src/pages-and-resources/edxnotes/Settings.jsx | 25 ---------------- src/store.js | 4 ++- webpack.dev.config.js | 11 +++++++ 28 files changed, 147 insertions(+), 69 deletions(-) create mode 100644 plugins/course-apps/calculator/Settings.jsx rename {src/pages-and-resources => plugins/course-apps}/calculator/messages.js (100%) create mode 100644 plugins/course-apps/calculator/package.json create mode 100644 plugins/course-apps/edxnotes/Settings.jsx rename {src/pages-and-resources => plugins/course-apps}/edxnotes/messages.js (100%) create mode 100644 plugins/course-apps/edxnotes/package.json rename {src/pages-and-resources => plugins/course-apps}/live/BBBSettings.jsx (95%) rename {src/pages-and-resources => plugins/course-apps}/live/BbbSettings.test.jsx (97%) rename {src/pages-and-resources => plugins/course-apps}/live/LiveCommonFields.jsx (94%) rename {src/pages-and-resources => plugins/course-apps}/live/Settings.jsx (94%) rename {src/pages-and-resources => plugins/course-apps}/live/Settings.test.jsx (98%) rename {src/pages-and-resources => plugins/course-apps}/live/ZoomSettings.jsx (95%) rename {src/pages-and-resources => plugins/course-apps}/live/ZoomSettings.test.jsx (98%) rename {src/pages-and-resources => plugins/course-apps}/live/constants.js (100%) rename {src/pages-and-resources => plugins/course-apps}/live/data/api.js (100%) rename {src/pages-and-resources => plugins/course-apps}/live/data/slice.js (95%) rename {src/pages-and-resources => plugins/course-apps}/live/data/thunks.js (94%) rename {src/pages-and-resources => plugins/course-apps}/live/factories/mockApiResponses.jsx (100%) rename {src/pages-and-resources => plugins/course-apps}/live/messages.js (100%) create mode 100644 plugins/course-apps/live/package.json delete mode 100644 src/pages-and-resources/calculator/Settings.jsx delete mode 100644 src/pages-and-resources/edxnotes/Settings.jsx create mode 100644 webpack.dev.config.js diff --git a/package-lock.json b/package-lock.json index 5ccf21be10..d606fcfa6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,9 @@ "@fortawesome/free-regular-svg-icons": "5.11.2", "@fortawesome/free-solid-svg-icons": "5.11.2", "@fortawesome/react-fontawesome": "0.2.0", + "@openedx-plugins/course-app-calculator": "file:plugins/course-apps/calculator", + "@openedx-plugins/course-app-edxnotes": "file:plugins/course-apps/edxnotes", + "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", @@ -4555,6 +4558,18 @@ "node": ">= 8" } }, + "node_modules/@openedx-plugins/course-app-calculator": { + "resolved": "plugins/course-apps/calculator", + "link": true + }, + "node_modules/@openedx-plugins/course-app-edxnotes": { + "resolved": "plugins/course-apps/edxnotes", + "link": true + }, + "node_modules/@openedx-plugins/course-app-live": { + "resolved": "plugins/course-apps/live", + "link": true + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -22532,6 +22547,20 @@ "engines": { "node": ">=10" } + }, + "plugins/course-apps/calculator": { + "name": "@openedx-plugins/course-app-calculator", + "version": "0.1.0", + "devDependencies": {} + }, + "plugins/course-apps/edxnotes": { + "name": "@openedx-plugins/course-app-edxnotes", + "version": "0.1.0", + "devDependencies": {} + }, + "plugins/course-apps/live": { + "version": "0.1.0", + "devDependencies": {} } } } diff --git a/package.json b/package.json index d0de704129..2f4dcba36a 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,9 @@ "@fortawesome/free-regular-svg-icons": "5.11.2", "@fortawesome/free-solid-svg-icons": "5.11.2", "@fortawesome/react-fontawesome": "0.2.0", + "@openedx-plugins/course-app-calculator": "file:plugins/course-apps/calculator", + "@openedx-plugins/course-app-edxnotes": "file:plugins/course-apps/edxnotes", + "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", diff --git a/plugins/course-apps/calculator/Settings.jsx b/plugins/course-apps/calculator/Settings.jsx new file mode 100644 index 0000000000..f23a619312 --- /dev/null +++ b/plugins/course-apps/calculator/Settings.jsx @@ -0,0 +1,27 @@ +import React from 'react'; + +import { useIntl } from '@edx/frontend-platform/i18n'; + +import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; +import messages from './messages'; + +/** + * Settings widget for the "calculator" Course App. + * @param {{onClose: () => void}} props + * @returns + */ +const CalculatorSettings = ({ onClose }) => { + const intl = useIntl(); + return ( + + ); +}; + +export default CalculatorSettings; diff --git a/src/pages-and-resources/calculator/messages.js b/plugins/course-apps/calculator/messages.js similarity index 100% rename from src/pages-and-resources/calculator/messages.js rename to plugins/course-apps/calculator/messages.js diff --git a/plugins/course-apps/calculator/package.json b/plugins/course-apps/calculator/package.json new file mode 100644 index 0000000000..fc35064f31 --- /dev/null +++ b/plugins/course-apps/calculator/package.json @@ -0,0 +1,9 @@ +{ + "name": "@openedx-plugins/course-app-calculator", + "version": "0.1.0", + "description": "Calculator configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} + \ No newline at end of file diff --git a/plugins/course-apps/edxnotes/Settings.jsx b/plugins/course-apps/edxnotes/Settings.jsx new file mode 100644 index 0000000000..24d7af74b5 --- /dev/null +++ b/plugins/course-apps/edxnotes/Settings.jsx @@ -0,0 +1,27 @@ +import React from 'react'; + +import { useIntl } from '@edx/frontend-platform/i18n'; + +import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; +import messages from './messages'; + +/** + * Settings widget for the "edxnotes" Course App. + * @param {{onClose: () => void}} props + * @returns + */ +const NotesSettings = ({ onClose }) => { + const intl = useIntl(); + return ( + + ); + }; + + export default NotesSettings; diff --git a/src/pages-and-resources/edxnotes/messages.js b/plugins/course-apps/edxnotes/messages.js similarity index 100% rename from src/pages-and-resources/edxnotes/messages.js rename to plugins/course-apps/edxnotes/messages.js diff --git a/plugins/course-apps/edxnotes/package.json b/plugins/course-apps/edxnotes/package.json new file mode 100644 index 0000000000..ffb7d91f71 --- /dev/null +++ b/plugins/course-apps/edxnotes/package.json @@ -0,0 +1,9 @@ +{ + "name": "@openedx-plugins/course-app-edxnotes", + "version": "0.1.0", + "description": "edxnotes configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} + \ No newline at end of file diff --git a/src/pages-and-resources/live/BBBSettings.jsx b/plugins/course-apps/live/BBBSettings.jsx similarity index 95% rename from src/pages-and-resources/live/BBBSettings.jsx rename to plugins/course-apps/live/BBBSettings.jsx index 45acf33b4d..968943b7a7 100644 --- a/src/pages-and-resources/live/BBBSettings.jsx +++ b/plugins/course-apps/live/BBBSettings.jsx @@ -5,9 +5,9 @@ import { Form, Hyperlink } from '@edx/paragon'; import PropTypes from 'prop-types'; import messages from './messages'; import { providerNames, bbbPlanTypes } from './constants'; -import AppConfigFormDivider from '../discussions/app-config-form/apps/shared/AppConfigFormDivider'; +import AppConfigFormDivider from 'CourseAuthoring/pages-and-resources/discussions/app-config-form/apps/shared/AppConfigFormDivider'; import LiveCommonFields from './LiveCommonFields'; -import { useModel } from '../../generic/model-store'; +import { useModel } from 'CourseAuthoring/generic/model-store'; const BbbSettings = ({ intl, diff --git a/src/pages-and-resources/live/BbbSettings.test.jsx b/plugins/course-apps/live/BbbSettings.test.jsx similarity index 97% rename from src/pages-and-resources/live/BbbSettings.test.jsx rename to plugins/course-apps/live/BbbSettings.test.jsx index 22ee3a2f0b..a9abf8ce2b 100644 --- a/src/pages-and-resources/live/BbbSettings.test.jsx +++ b/plugins/course-apps/live/BbbSettings.test.jsx @@ -15,8 +15,8 @@ import { AppProvider, PageRoute } from '@edx/frontend-platform/react'; import { IntlProvider } from '@edx/frontend-platform/i18n'; import userEvent from '@testing-library/user-event'; -import initializeStore from '../../store'; -import { executeThunk } from '../../utils'; +import initializeStore from 'CourseAuthoring/store'; +import { executeThunk } from 'CourseAuthoring/utils'; import LiveSettings from './Settings'; import { generateLiveConfigurationApiResponse, diff --git a/src/pages-and-resources/live/LiveCommonFields.jsx b/plugins/course-apps/live/LiveCommonFields.jsx similarity index 94% rename from src/pages-and-resources/live/LiveCommonFields.jsx rename to plugins/course-apps/live/LiveCommonFields.jsx index c357a36bf7..94c152a5cb 100644 --- a/src/pages-and-resources/live/LiveCommonFields.jsx +++ b/plugins/course-apps/live/LiveCommonFields.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import PropTypes from 'prop-types'; import messages from './messages'; -import FormikControl from '../../generic/FormikControl'; +import FormikControl from 'CourseAuthoring/generic/FormikControl'; const LiveCommonFields = ({ intl, diff --git a/src/pages-and-resources/live/Settings.jsx b/plugins/course-apps/live/Settings.jsx similarity index 94% rename from src/pages-and-resources/live/Settings.jsx rename to plugins/course-apps/live/Settings.jsx index 628d67e8c9..9b75478203 100644 --- a/src/pages-and-resources/live/Settings.jsx +++ b/plugins/course-apps/live/Settings.jsx @@ -7,11 +7,11 @@ import PropTypes from 'prop-types'; import * as Yup from 'yup'; import { fetchLiveData, saveLiveConfiguration, saveLiveConfigurationAsDraft } from './data/thunks'; import { selectApp } from './data/slice'; -import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; -import { useModel } from '../../generic/model-store'; -import Loading from '../../generic/Loading'; +import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; +import { useModel } from 'CourseAuthoring/generic/model-store'; +import Loading from 'CourseAuthoring/generic/Loading'; import { iconsSrc, bbbPlanTypes } from './constants'; -import { RequestStatus } from '../../data/constants'; +import { RequestStatus } from 'CourseAuthoring/data/constants'; import messages from './messages'; import ZoomSettings from './ZoomSettings'; import BBBSettings from './BBBSettings'; diff --git a/src/pages-and-resources/live/Settings.test.jsx b/plugins/course-apps/live/Settings.test.jsx similarity index 98% rename from src/pages-and-resources/live/Settings.test.jsx rename to plugins/course-apps/live/Settings.test.jsx index f8fe6cdb3d..cbf23f573d 100644 --- a/src/pages-and-resources/live/Settings.test.jsx +++ b/plugins/course-apps/live/Settings.test.jsx @@ -18,8 +18,8 @@ import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; import { AppProvider, PageRoute } from '@edx/frontend-platform/react'; import { IntlProvider } from '@edx/frontend-platform/i18n'; -import initializeStore from '../../store'; -import { executeThunk } from '../../utils'; +import initializeStore from 'CourseAuthoring/store'; +import { executeThunk } from 'CourseAuthoring/utils'; import LiveSettings from './Settings'; import { generateLiveConfigurationApiResponse, diff --git a/src/pages-and-resources/live/ZoomSettings.jsx b/plugins/course-apps/live/ZoomSettings.jsx similarity index 95% rename from src/pages-and-resources/live/ZoomSettings.jsx rename to plugins/course-apps/live/ZoomSettings.jsx index 0d25dfa953..ec322d0244 100644 --- a/src/pages-and-resources/live/ZoomSettings.jsx +++ b/plugins/course-apps/live/ZoomSettings.jsx @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import messages from './messages'; import { providerNames } from './constants'; import LiveCommonFields from './LiveCommonFields'; -import FormikControl from '../../generic/FormikControl'; +import FormikControl from 'CourseAuthoring/generic/FormikControl'; const ZoomSettings = ({ intl, diff --git a/src/pages-and-resources/live/ZoomSettings.test.jsx b/plugins/course-apps/live/ZoomSettings.test.jsx similarity index 98% rename from src/pages-and-resources/live/ZoomSettings.test.jsx rename to plugins/course-apps/live/ZoomSettings.test.jsx index 5078066557..732c0e79c4 100644 --- a/src/pages-and-resources/live/ZoomSettings.test.jsx +++ b/plugins/course-apps/live/ZoomSettings.test.jsx @@ -13,8 +13,8 @@ import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; import { AppProvider, PageRoute } from '@edx/frontend-platform/react'; import { IntlProvider } from '@edx/frontend-platform/i18n'; -import initializeStore from '../../store'; -import { executeThunk } from '../../utils'; +import initializeStore from 'CourseAuthoring/store'; +import { executeThunk } from 'CourseAuthoring/utils'; import LiveSettings from './Settings'; import { generateLiveConfigurationApiResponse, diff --git a/src/pages-and-resources/live/constants.js b/plugins/course-apps/live/constants.js similarity index 100% rename from src/pages-and-resources/live/constants.js rename to plugins/course-apps/live/constants.js diff --git a/src/pages-and-resources/live/data/api.js b/plugins/course-apps/live/data/api.js similarity index 100% rename from src/pages-and-resources/live/data/api.js rename to plugins/course-apps/live/data/api.js diff --git a/src/pages-and-resources/live/data/slice.js b/plugins/course-apps/live/data/slice.js similarity index 95% rename from src/pages-and-resources/live/data/slice.js rename to plugins/course-apps/live/data/slice.js index 69ccf6b669..5f4c2a72d8 100644 --- a/src/pages-and-resources/live/data/slice.js +++ b/plugins/course-apps/live/data/slice.js @@ -1,6 +1,6 @@ /* eslint-disable no-param-reassign */ import { createSlice } from '@reduxjs/toolkit'; -import { RequestStatus } from '../../../data/constants'; +import { RequestStatus } from 'CourseAuthoring/data/constants'; const slice = createSlice({ name: 'live', diff --git a/src/pages-and-resources/live/data/thunks.js b/plugins/course-apps/live/data/thunks.js similarity index 94% rename from src/pages-and-resources/live/data/thunks.js rename to plugins/course-apps/live/data/thunks.js index c9f2487cf2..07b50104ca 100644 --- a/src/pages-and-resources/live/data/thunks.js +++ b/plugins/course-apps/live/data/thunks.js @@ -1,5 +1,5 @@ import { history } from '@edx/frontend-platform'; -import { addModel, addModels, updateModel } from '../../../generic/model-store'; +import { addModel, addModels, updateModel } from 'CourseAuthoring/generic/model-store'; import { getLiveConfiguration, getLiveProviders, @@ -8,7 +8,7 @@ import { deNormalizeSettings, } from './api'; import { loadApps, updateStatus, updateSaveStatus } from './slice'; -import { RequestStatus } from '../../../data/constants'; +import { RequestStatus } from 'CourseAuthoring/data/constants'; function updateLiveSettingsState({ appConfig, diff --git a/src/pages-and-resources/live/factories/mockApiResponses.jsx b/plugins/course-apps/live/factories/mockApiResponses.jsx similarity index 100% rename from src/pages-and-resources/live/factories/mockApiResponses.jsx rename to plugins/course-apps/live/factories/mockApiResponses.jsx diff --git a/src/pages-and-resources/live/messages.js b/plugins/course-apps/live/messages.js similarity index 100% rename from src/pages-and-resources/live/messages.js rename to plugins/course-apps/live/messages.js diff --git a/plugins/course-apps/live/package.json b/plugins/course-apps/live/package.json new file mode 100644 index 0000000000..a9701ce478 --- /dev/null +++ b/plugins/course-apps/live/package.json @@ -0,0 +1,9 @@ +{ + "name": "@openedx-plugins/course-app-live", + "version": "0.1.0", + "description": "Live course configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} + \ No newline at end of file diff --git a/src/pages-and-resources/PagesAndResources.jsx b/src/pages-and-resources/PagesAndResources.jsx index d91cbefae0..84e57744a4 100644 --- a/src/pages-and-resources/PagesAndResources.jsx +++ b/src/pages-and-resources/PagesAndResources.jsx @@ -120,7 +120,7 @@ const PagesAndResources = ({ courseId, intl }) => { // if we use a template string here: // TypeError: Cannot read property 'range' of null with using template strings here. // Ref: https://github.com/babel/babel-eslint/issues/530 - return await import('./' + match.params.appId + '/Settings.jsx'); // eslint-disable-line + return await import('@openedx-plugins/course-app-' + match.params.appId + '/Settings.jsx'); // eslint-disable-line } catch (error) { console.trace(error); // eslint-disable-line no-console return null; diff --git a/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx b/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx index 6ac63122ba..b4453cb8ad 100644 --- a/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx +++ b/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx @@ -125,6 +125,8 @@ const AppSettingsModal = ({ const updateSettingsRequestStatus = useSelector(getSavingStatus); const alertRef = useRef(null); const [saveError, setSaveError] = useState(false); + // FIXME: open the "Live" settings, then refresh the page. The courseApps model is not loaded, and an error occurs + // when trying to access 'appInfo.documentationLinks'. This happens even before the refactor to use plugins. const appInfo = useModel('courseApps', appId); const dispatch = useDispatch(); const submitButtonState = updateSettingsRequestStatus === RequestStatus.IN_PROGRESS ? 'pending' : 'default'; diff --git a/src/pages-and-resources/calculator/Settings.jsx b/src/pages-and-resources/calculator/Settings.jsx deleted file mode 100644 index 138532de81..0000000000 --- a/src/pages-and-resources/calculator/Settings.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; - -import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; -import messages from './messages'; - -const CalculatorSettings = ({ intl, onClose }) => ( - -); - -CalculatorSettings.propTypes = { - intl: intlShape.isRequired, - onClose: PropTypes.func.isRequired, -}; - -export default injectIntl(CalculatorSettings); diff --git a/src/pages-and-resources/edxnotes/Settings.jsx b/src/pages-and-resources/edxnotes/Settings.jsx deleted file mode 100644 index bfc510bbac..0000000000 --- a/src/pages-and-resources/edxnotes/Settings.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; - -import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; -import messages from './messages'; - -const NotesSettings = ({ intl, onClose }) => ( - -); - -NotesSettings.propTypes = { - intl: intlShape.isRequired, - onClose: PropTypes.func.isRequired, -}; - -export default injectIntl(NotesSettings); diff --git a/src/store.js b/src/store.js index 4b88a64353..0fc619288d 100644 --- a/src/store.js +++ b/src/store.js @@ -9,7 +9,9 @@ import { reducer as advancedSettingsReducer } from './advanced-settings/data/sli import { reducer as gradingSettingsReducer } from './grading-settings/data/slice'; import { reducer as studioHomeReducer } from './studio-home/data/slice'; import { reducer as scheduleAndDetailsReducer } from './schedule-and-details/data/slice'; -import { reducer as liveReducer } from './pages-and-resources/live/data/slice'; +// FIXME: because the 'live' plugin is using Redux, we have to hard-code a reference to it here. +// If this app + the plugin were using React-query, there'd be no issues. +import { reducer as liveReducer } from '@openedx-plugins/course-app-live/data/slice'; import { reducer as filesReducer } from './files-and-uploads/data/slice'; import { reducer as courseTeamReducer } from './course-team/data/slice'; import { reducer as CourseUpdatesReducer } from './course-updates/data/slice'; diff --git a/webpack.dev.config.js b/webpack.dev.config.js new file mode 100644 index 0000000000..73e45c5576 --- /dev/null +++ b/webpack.dev.config.js @@ -0,0 +1,11 @@ +const path = require('path'); +const { createConfig } = require('@edx/frontend-build'); + +const config = createConfig('webpack-dev'); + +/** + * Plugins can use 'CourseAuthoring' as an import alias for this app: + */ +config.resolve.alias.CourseAuthoring = path.resolve(__dirname, 'src/'); + +module.exports = config; From 371aa1d1b303d00f82beeb5caee398a462a61e7f Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Mon, 16 Oct 2023 14:08:45 -0700 Subject: [PATCH 02/19] feat: move ora_settings --- package-lock.json | 10 ++++++++++ package.json | 1 + .../course-apps}/ora_settings/Settings.jsx | 8 ++++---- .../course-apps}/ora_settings/Settings.test.jsx | 8 ++++---- .../ora_settings/__snapshots__/Settings.test.jsx.snap | 0 .../course-apps}/ora_settings/messages.js | 0 plugins/course-apps/ora_settings/package.json | 9 +++++++++ 7 files changed, 28 insertions(+), 8 deletions(-) rename {src/pages-and-resources => plugins/course-apps}/ora_settings/Settings.jsx (86%) rename {src/pages-and-resources => plugins/course-apps}/ora_settings/Settings.test.jsx (75%) rename {src/pages-and-resources => plugins/course-apps}/ora_settings/__snapshots__/Settings.test.jsx.snap (100%) rename {src/pages-and-resources => plugins/course-apps}/ora_settings/messages.js (100%) create mode 100644 plugins/course-apps/ora_settings/package.json diff --git a/package-lock.json b/package-lock.json index d606fcfa6e..a5cd4d97ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "@openedx-plugins/course-app-calculator": "file:plugins/course-apps/calculator", "@openedx-plugins/course-app-edxnotes": "file:plugins/course-apps/edxnotes", "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", + "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", @@ -4570,6 +4571,10 @@ "resolved": "plugins/course-apps/live", "link": true }, + "node_modules/@openedx-plugins/course-app-ora_settings": { + "resolved": "plugins/course-apps/ora_settings", + "link": true + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -22559,6 +22564,11 @@ "devDependencies": {} }, "plugins/course-apps/live": { + "name": "@openedx-plugins/course-app-live", + "version": "0.1.0", + "devDependencies": {} + }, + "plugins/course-apps/ora_settings": { "version": "0.1.0", "devDependencies": {} } diff --git a/package.json b/package.json index 2f4dcba36a..6d7973a340 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@openedx-plugins/course-app-calculator": "file:plugins/course-apps/calculator", "@openedx-plugins/course-app-edxnotes": "file:plugins/course-apps/edxnotes", "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", + "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", diff --git a/src/pages-and-resources/ora_settings/Settings.jsx b/plugins/course-apps/ora_settings/Settings.jsx similarity index 86% rename from src/pages-and-resources/ora_settings/Settings.jsx rename to plugins/course-apps/ora_settings/Settings.jsx index 4bfb3560a0..8478fd2829 100644 --- a/src/pages-and-resources/ora_settings/Settings.jsx +++ b/plugins/course-apps/ora_settings/Settings.jsx @@ -5,11 +5,11 @@ import * as Yup from 'yup'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Hyperlink } from '@edx/paragon'; -import { useModel } from '../../generic/model-store'; +import { useModel } from 'CourseAuthoring/generic/model-store'; -import FormSwitchGroup from '../../generic/FormSwitchGroup'; -import { useAppSetting } from '../../utils'; -import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; +import FormSwitchGroup from 'CourseAuthoring/generic/FormSwitchGroup'; +import { useAppSetting } from 'CourseAuthoring/utils'; +import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; import messages from './messages'; const ORASettings = ({ intl, onClose }) => { diff --git a/src/pages-and-resources/ora_settings/Settings.test.jsx b/plugins/course-apps/ora_settings/Settings.test.jsx similarity index 75% rename from src/pages-and-resources/ora_settings/Settings.test.jsx rename to plugins/course-apps/ora_settings/Settings.test.jsx index 86d8c0808d..68cb1ca011 100644 --- a/src/pages-and-resources/ora_settings/Settings.test.jsx +++ b/plugins/course-apps/ora_settings/Settings.test.jsx @@ -9,14 +9,14 @@ jest.mock('@edx/frontend-platform/i18n', () => ({ jest.mock('yup', () => ({ boolean: jest.fn().mockReturnValue('Yub.boolean'), })); -jest.mock('../../generic/model-store', () => ({ +jest.mock('CourseAuthoring/generic/model-store', () => ({ useModel: jest.fn().mockReturnValue({ documentationLinks: { learnMoreConfiguration: 'https://learnmore.test' } }), })); -jest.mock('../../generic/FormSwitchGroup', () => 'FormSwitchGroup'); -jest.mock('../../utils', () => ({ +jest.mock('CourseAuthoring/generic/FormSwitchGroup', () => 'FormSwitchGroup'); +jest.mock('CourseAuthoring/utils', () => ({ useAppSetting: jest.fn().mockReturnValue(['abitrary value', jest.fn().mockName('saveSetting')]), })); -jest.mock('../app-settings-modal/AppSettingsModal', () => 'AppSettingsModal'); +jest.mock('CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal', () => 'AppSettingsModal'); const props = { onClose: jest.fn().mockName('onClose'), diff --git a/src/pages-and-resources/ora_settings/__snapshots__/Settings.test.jsx.snap b/plugins/course-apps/ora_settings/__snapshots__/Settings.test.jsx.snap similarity index 100% rename from src/pages-and-resources/ora_settings/__snapshots__/Settings.test.jsx.snap rename to plugins/course-apps/ora_settings/__snapshots__/Settings.test.jsx.snap diff --git a/src/pages-and-resources/ora_settings/messages.js b/plugins/course-apps/ora_settings/messages.js similarity index 100% rename from src/pages-and-resources/ora_settings/messages.js rename to plugins/course-apps/ora_settings/messages.js diff --git a/plugins/course-apps/ora_settings/package.json b/plugins/course-apps/ora_settings/package.json new file mode 100644 index 0000000000..138b1551bd --- /dev/null +++ b/plugins/course-apps/ora_settings/package.json @@ -0,0 +1,9 @@ +{ + "name": "@openedx-plugins/course-app-ora_settings", + "version": "0.1.0", + "description": "Open Response Assessment configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} + \ No newline at end of file From c2fc5c9293cb48feaf3a5dfc20a589dc27191668 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Mon, 16 Oct 2023 14:13:57 -0700 Subject: [PATCH 03/19] feat: move proctoring --- package-lock.json | 10 ++++++++++ package.json | 1 + .../course-apps}/proctoring/Settings.jsx | 18 +++++++++--------- .../course-apps}/proctoring/Settings.test.jsx | 8 ++++---- .../course-apps}/proctoring/messages.js | 0 plugins/course-apps/proctoring/package.json | 9 +++++++++ 6 files changed, 33 insertions(+), 13 deletions(-) rename {src/pages-and-resources => plugins/course-apps}/proctoring/Settings.jsx (97%) rename {src/pages-and-resources => plugins/course-apps}/proctoring/Settings.test.jsx (99%) rename {src/pages-and-resources => plugins/course-apps}/proctoring/messages.js (100%) create mode 100644 plugins/course-apps/proctoring/package.json diff --git a/package-lock.json b/package-lock.json index a5cd4d97ff..70720b1e03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "@openedx-plugins/course-app-edxnotes": "file:plugins/course-apps/edxnotes", "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", + "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", @@ -4575,6 +4576,10 @@ "resolved": "plugins/course-apps/ora_settings", "link": true }, + "node_modules/@openedx-plugins/course-app-proctoring": { + "resolved": "plugins/course-apps/proctoring", + "link": true + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -22569,6 +22574,11 @@ "devDependencies": {} }, "plugins/course-apps/ora_settings": { + "name": "@openedx-plugins/course-app-ora_settings", + "version": "0.1.0", + "devDependencies": {} + }, + "plugins/course-apps/proctoring": { "version": "0.1.0", "devDependencies": {} } diff --git a/package.json b/package.json index 6d7973a340..062676150c 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@openedx-plugins/course-app-edxnotes": "file:plugins/course-apps/edxnotes", "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", + "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", diff --git a/src/pages-and-resources/proctoring/Settings.jsx b/plugins/course-apps/proctoring/Settings.jsx similarity index 97% rename from src/pages-and-resources/proctoring/Settings.jsx rename to plugins/course-apps/proctoring/Settings.jsx index 34136c64fa..047ff144a1 100644 --- a/src/pages-and-resources/proctoring/Settings.jsx +++ b/plugins/course-apps/proctoring/Settings.jsx @@ -13,15 +13,15 @@ import { ActionRow, Alert, Badge, Form, Hyperlink, ModalDialog, StatefulButton, } from '@edx/paragon'; -import ExamsApiService from '../../data/services/ExamsApiService'; -import StudioApiService from '../../data/services/StudioApiService'; -import Loading from '../../generic/Loading'; -import ConnectionErrorAlert from '../../generic/ConnectionErrorAlert'; -import FormSwitchGroup from '../../generic/FormSwitchGroup'; -import { useModel } from '../../generic/model-store'; -import PermissionDeniedAlert from '../../generic/PermissionDeniedAlert'; -import { useIsMobile } from '../../utils'; -import { PagesAndResourcesContext } from '../PagesAndResourcesProvider'; +import ExamsApiService from 'CourseAuthoring/data/services/ExamsApiService'; +import StudioApiService from 'CourseAuthoring/data/services/StudioApiService'; +import Loading from 'CourseAuthoring/generic/Loading'; +import ConnectionErrorAlert from 'CourseAuthoring/generic/ConnectionErrorAlert'; +import FormSwitchGroup from 'CourseAuthoring/generic/FormSwitchGroup'; +import { useModel } from 'CourseAuthoring/generic/model-store'; +import PermissionDeniedAlert from 'CourseAuthoring/generic/PermissionDeniedAlert'; +import { useIsMobile } from 'CourseAuthoring/utils'; +import { PagesAndResourcesContext } from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; import messages from './messages'; const ProctoringSettings = ({ intl, onClose }) => { diff --git a/src/pages-and-resources/proctoring/Settings.test.jsx b/plugins/course-apps/proctoring/Settings.test.jsx similarity index 99% rename from src/pages-and-resources/proctoring/Settings.test.jsx rename to plugins/course-apps/proctoring/Settings.test.jsx index 9e5e6e8cab..df0592350e 100644 --- a/src/pages-and-resources/proctoring/Settings.test.jsx +++ b/plugins/course-apps/proctoring/Settings.test.jsx @@ -9,10 +9,10 @@ import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; import { IntlProvider, injectIntl } from '@edx/frontend-platform/i18n'; import { AppProvider } from '@edx/frontend-platform/react'; -import StudioApiService from '../../data/services/StudioApiService'; -import ExamsApiService from '../../data/services/ExamsApiService'; -import initializeStore from '../../store'; -import PagesAndResourcesProvider from '../PagesAndResourcesProvider'; +import StudioApiService from 'CourseAuthoring/data/services/StudioApiService'; +import ExamsApiService from 'CourseAuthoring/data/services/ExamsApiService'; +import initializeStore from 'CourseAuthoring/store'; +import PagesAndResourcesProvider from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; import ProctoredExamSettings from './Settings'; const defaultProps = { diff --git a/src/pages-and-resources/proctoring/messages.js b/plugins/course-apps/proctoring/messages.js similarity index 100% rename from src/pages-and-resources/proctoring/messages.js rename to plugins/course-apps/proctoring/messages.js diff --git a/plugins/course-apps/proctoring/package.json b/plugins/course-apps/proctoring/package.json new file mode 100644 index 0000000000..dfe2df2b80 --- /dev/null +++ b/plugins/course-apps/proctoring/package.json @@ -0,0 +1,9 @@ +{ + "name": "@openedx-plugins/course-app-proctoring", + "version": "0.1.0", + "description": "Proctoring configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} + \ No newline at end of file From e7af2837e8421626711869345b15cb1af2a3d748 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Mon, 16 Oct 2023 14:16:26 -0700 Subject: [PATCH 04/19] feat: move progress --- package-lock.json | 10 ++++++++++ package.json | 1 + .../course-apps}/progress/Settings.jsx | 6 +++--- .../course-apps}/progress/messages.js | 0 plugins/course-apps/progress/package.json | 9 +++++++++ 5 files changed, 23 insertions(+), 3 deletions(-) rename {src/pages-and-resources => plugins/course-apps}/progress/Settings.jsx (89%) rename {src/pages-and-resources => plugins/course-apps}/progress/messages.js (100%) create mode 100644 plugins/course-apps/progress/package.json diff --git a/package-lock.json b/package-lock.json index 70720b1e03..7f8cef51e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", + "@openedx-plugins/course-app-progress": "file:plugins/course-apps/progress", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", @@ -4580,6 +4581,10 @@ "resolved": "plugins/course-apps/proctoring", "link": true }, + "node_modules/@openedx-plugins/course-app-progress": { + "resolved": "plugins/course-apps/progress", + "link": true + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -22579,6 +22584,11 @@ "devDependencies": {} }, "plugins/course-apps/proctoring": { + "name": "@openedx-plugins/course-app-proctoring", + "version": "0.1.0", + "devDependencies": {} + }, + "plugins/course-apps/progress": { "version": "0.1.0", "devDependencies": {} } diff --git a/package.json b/package.json index 062676150c..f8a3af548a 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", + "@openedx-plugins/course-app-progress": "file:plugins/course-apps/progress", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", diff --git a/src/pages-and-resources/progress/Settings.jsx b/plugins/course-apps/progress/Settings.jsx similarity index 89% rename from src/pages-and-resources/progress/Settings.jsx rename to plugins/course-apps/progress/Settings.jsx index 965f110b1b..248ae4abb4 100644 --- a/src/pages-and-resources/progress/Settings.jsx +++ b/plugins/course-apps/progress/Settings.jsx @@ -3,9 +3,9 @@ import PropTypes from 'prop-types'; import React from 'react'; import * as Yup from 'yup'; import { getConfig } from '@edx/frontend-platform'; -import FormSwitchGroup from '../../generic/FormSwitchGroup'; -import { useAppSetting } from '../../utils'; -import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; +import FormSwitchGroup from 'CourseAuthoring/generic/FormSwitchGroup'; +import { useAppSetting } from 'CourseAuthoring/utils'; +import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; import messages from './messages'; const ProgressSettings = ({ intl, onClose }) => { diff --git a/src/pages-and-resources/progress/messages.js b/plugins/course-apps/progress/messages.js similarity index 100% rename from src/pages-and-resources/progress/messages.js rename to plugins/course-apps/progress/messages.js diff --git a/plugins/course-apps/progress/package.json b/plugins/course-apps/progress/package.json new file mode 100644 index 0000000000..d0cac617f0 --- /dev/null +++ b/plugins/course-apps/progress/package.json @@ -0,0 +1,9 @@ +{ + "name": "@openedx-plugins/course-app-progress", + "version": "0.1.0", + "description": "Progress configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} + \ No newline at end of file From 447dfbf92fa2591dc164aa4e895c8a60d60776f1 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Mon, 16 Oct 2023 14:20:24 -0700 Subject: [PATCH 05/19] feat: move teams --- package-lock.json | 10 ++++++++++ package.json | 1 + plugins/course-apps/calculator/package.json | 1 - plugins/course-apps/edxnotes/package.json | 1 - plugins/course-apps/live/package.json | 1 - plugins/course-apps/proctoring/package.json | 1 - plugins/course-apps/progress/package.json | 1 - .../course-apps}/teams/GroupEditor.jsx | 6 +++--- .../course-apps}/teams/Settings.jsx | 8 ++++---- .../course-apps}/teams/messages.js | 0 plugins/course-apps/teams/package.json | 8 ++++++++ 11 files changed, 26 insertions(+), 12 deletions(-) rename {src/pages-and-resources => plugins/course-apps}/teams/GroupEditor.jsx (96%) rename {src/pages-and-resources => plugins/course-apps}/teams/Settings.jsx (94%) rename {src/pages-and-resources => plugins/course-apps}/teams/messages.js (100%) create mode 100644 plugins/course-apps/teams/package.json diff --git a/package-lock.json b/package-lock.json index 7f8cef51e4..b62d2d386c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", "@openedx-plugins/course-app-progress": "file:plugins/course-apps/progress", + "@openedx-plugins/course-app-teams": "file:plugins/course-apps/teams", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", @@ -4585,6 +4586,10 @@ "resolved": "plugins/course-apps/progress", "link": true }, + "node_modules/@openedx-plugins/course-app-teams": { + "resolved": "plugins/course-apps/teams", + "link": true + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -22589,6 +22594,11 @@ "devDependencies": {} }, "plugins/course-apps/progress": { + "name": "@openedx-plugins/course-app-progress", + "version": "0.1.0", + "devDependencies": {} + }, + "plugins/course-apps/teams": { "version": "0.1.0", "devDependencies": {} } diff --git a/package.json b/package.json index f8a3af548a..50aa679958 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", "@openedx-plugins/course-app-progress": "file:plugins/course-apps/progress", + "@openedx-plugins/course-app-teams": "file:plugins/course-apps/teams", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", diff --git a/plugins/course-apps/calculator/package.json b/plugins/course-apps/calculator/package.json index fc35064f31..1acb4010aa 100644 --- a/plugins/course-apps/calculator/package.json +++ b/plugins/course-apps/calculator/package.json @@ -6,4 +6,3 @@ }, "devDependencies": {} } - \ No newline at end of file diff --git a/plugins/course-apps/edxnotes/package.json b/plugins/course-apps/edxnotes/package.json index ffb7d91f71..1fe9983157 100644 --- a/plugins/course-apps/edxnotes/package.json +++ b/plugins/course-apps/edxnotes/package.json @@ -6,4 +6,3 @@ }, "devDependencies": {} } - \ No newline at end of file diff --git a/plugins/course-apps/live/package.json b/plugins/course-apps/live/package.json index a9701ce478..9724042566 100644 --- a/plugins/course-apps/live/package.json +++ b/plugins/course-apps/live/package.json @@ -6,4 +6,3 @@ }, "devDependencies": {} } - \ No newline at end of file diff --git a/plugins/course-apps/proctoring/package.json b/plugins/course-apps/proctoring/package.json index dfe2df2b80..b636995922 100644 --- a/plugins/course-apps/proctoring/package.json +++ b/plugins/course-apps/proctoring/package.json @@ -6,4 +6,3 @@ }, "devDependencies": {} } - \ No newline at end of file diff --git a/plugins/course-apps/progress/package.json b/plugins/course-apps/progress/package.json index d0cac617f0..ea4ada254e 100644 --- a/plugins/course-apps/progress/package.json +++ b/plugins/course-apps/progress/package.json @@ -6,4 +6,3 @@ }, "devDependencies": {} } - \ No newline at end of file diff --git a/src/pages-and-resources/teams/GroupEditor.jsx b/plugins/course-apps/teams/GroupEditor.jsx similarity index 96% rename from src/pages-and-resources/teams/GroupEditor.jsx rename to plugins/course-apps/teams/GroupEditor.jsx index 99f98fd770..a734ff212c 100644 --- a/src/pages-and-resources/teams/GroupEditor.jsx +++ b/plugins/course-apps/teams/GroupEditor.jsx @@ -2,10 +2,10 @@ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Button, Form, TransitionReplace } from '@edx/paragon'; import PropTypes from 'prop-types'; import React, { useState } from 'react'; -import { GroupTypes, TeamSizes } from '../../data/constants'; +import { GroupTypes, TeamSizes } from 'CourseAuthoring/data/constants'; -import CollapsableEditor from '../../generic/CollapsableEditor'; -import FormikControl from '../../generic/FormikControl'; +import CollapsableEditor from 'CourseAuthoring/generic/CollapsableEditor'; +import FormikControl from 'CourseAuthoring/generic/FormikControl'; import messages from './messages'; // Maps a team type to its corresponding intl message diff --git a/src/pages-and-resources/teams/Settings.jsx b/plugins/course-apps/teams/Settings.jsx similarity index 94% rename from src/pages-and-resources/teams/Settings.jsx rename to plugins/course-apps/teams/Settings.jsx index 2aebe0cbdf..f2564e0656 100644 --- a/src/pages-and-resources/teams/Settings.jsx +++ b/plugins/course-apps/teams/Settings.jsx @@ -7,10 +7,10 @@ import PropTypes from 'prop-types'; import React from 'react'; import { v4 as uuid } from 'uuid'; import * as Yup from 'yup'; -import { GroupTypes, TeamSizes } from '../../data/constants'; -import FormikControl from '../../generic/FormikControl'; -import { setupYupExtensions, useAppSetting } from '../../utils'; -import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; +import { GroupTypes, TeamSizes } from 'CourseAuthoring/data/constants'; +import FormikControl from 'CourseAuthoring/generic/FormikControl'; +import { setupYupExtensions, useAppSetting } from 'CourseAuthoring/utils'; +import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; import GroupEditor from './GroupEditor'; import messages from './messages'; diff --git a/src/pages-and-resources/teams/messages.js b/plugins/course-apps/teams/messages.js similarity index 100% rename from src/pages-and-resources/teams/messages.js rename to plugins/course-apps/teams/messages.js diff --git a/plugins/course-apps/teams/package.json b/plugins/course-apps/teams/package.json new file mode 100644 index 0000000000..22e94efcde --- /dev/null +++ b/plugins/course-apps/teams/package.json @@ -0,0 +1,8 @@ +{ + "name": "@openedx-plugins/course-app-teams", + "version": "0.1.0", + "description": "Teams configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} From 2ccc8cf0acf688de7ef41dd7c3447bfb71b8d855 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Mon, 16 Oct 2023 14:23:20 -0700 Subject: [PATCH 06/19] feat: move wiki --- package-lock.json | 10 ++++++++++ package.json | 1 + .../course-apps}/wiki/Settings.jsx | 6 +++--- .../course-apps}/wiki/messages.js | 0 plugins/course-apps/wiki/package.json | 8 ++++++++ 5 files changed, 22 insertions(+), 3 deletions(-) rename {src/pages-and-resources => plugins/course-apps}/wiki/Settings.jsx (86%) rename {src/pages-and-resources => plugins/course-apps}/wiki/messages.js (100%) create mode 100644 plugins/course-apps/wiki/package.json diff --git a/package-lock.json b/package-lock.json index b62d2d386c..975c521c97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", "@openedx-plugins/course-app-progress": "file:plugins/course-apps/progress", "@openedx-plugins/course-app-teams": "file:plugins/course-apps/teams", + "@openedx-plugins/course-app-wiki": "file:plugins/course-apps/wiki", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", @@ -4590,6 +4591,10 @@ "resolved": "plugins/course-apps/teams", "link": true }, + "node_modules/@openedx-plugins/course-app-wiki": { + "resolved": "plugins/course-apps/wiki", + "link": true + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -22599,6 +22604,11 @@ "devDependencies": {} }, "plugins/course-apps/teams": { + "name": "@openedx-plugins/course-app-teams", + "version": "0.1.0", + "devDependencies": {} + }, + "plugins/course-apps/wiki": { "version": "0.1.0", "devDependencies": {} } diff --git a/package.json b/package.json index 50aa679958..ba0feddced 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", "@openedx-plugins/course-app-progress": "file:plugins/course-apps/progress", "@openedx-plugins/course-app-teams": "file:plugins/course-apps/teams", + "@openedx-plugins/course-app-wiki": "file:plugins/course-apps/wiki", "@reduxjs/toolkit": "1.5.0", "classnames": "2.2.6", "core-js": "3.8.1", diff --git a/src/pages-and-resources/wiki/Settings.jsx b/plugins/course-apps/wiki/Settings.jsx similarity index 86% rename from src/pages-and-resources/wiki/Settings.jsx rename to plugins/course-apps/wiki/Settings.jsx index a2711629c2..e71b27f81b 100644 --- a/src/pages-and-resources/wiki/Settings.jsx +++ b/plugins/course-apps/wiki/Settings.jsx @@ -3,9 +3,9 @@ import PropTypes from 'prop-types'; import React from 'react'; import * as Yup from 'yup'; -import FormSwitchGroup from '../../generic/FormSwitchGroup'; -import { useAppSetting } from '../../utils'; -import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; +import FormSwitchGroup from 'CourseAuthoring/generic/FormSwitchGroup'; +import { useAppSetting } from 'CourseAuthoring/utils'; +import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; import messages from './messages'; const WikiSettings = ({ intl, onClose }) => { diff --git a/src/pages-and-resources/wiki/messages.js b/plugins/course-apps/wiki/messages.js similarity index 100% rename from src/pages-and-resources/wiki/messages.js rename to plugins/course-apps/wiki/messages.js diff --git a/plugins/course-apps/wiki/package.json b/plugins/course-apps/wiki/package.json new file mode 100644 index 0000000000..8e38b8d60d --- /dev/null +++ b/plugins/course-apps/wiki/package.json @@ -0,0 +1,8 @@ +{ + "name": "@openedx-plugins/course-app-wiki", + "version": "0.1.0", + "description": "Wiki configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} From c81182f9240cd3d21b8c138172c49992f71faf6d Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Tue, 17 Oct 2023 11:26:37 -0700 Subject: [PATCH 07/19] feat: move Xpert settings --- .../plugins/xpert_unit_summary/README.rst | 4 ++ .../plugins/xpert_unit_summary/Settings.jsx | 2 +- .../xpert_unit_summary/Settings.test.jsx | 0 .../plugins/xpert_unit_summary}/appInfo.js | 0 .../plugins/xpert_unit_summary}/data/api.js | 0 .../xpert_unit_summary}/data/thunks.js | 6 +- .../plugins/xpert_unit_summary}/index.js | 0 .../plugins/xpert_unit_summary}/messages.js | 0 .../plugins/xpert_unit_summary/package.json | 8 +++ .../settings-modal/ResetIcon.jsx | 0 .../settings-modal/SettingsModal.jsx | 24 ++++---- .../settings-modal/SettingsModal.scss | 3 + .../settings-modal/messages.js | 0 src/index.scss | 1 - src/pages-and-resources/PagesAndResources.jsx | 55 +------------------ .../PagesAndResources.scss | 1 - .../PluginSettingsComponent.jsx | 32 +++++++++++ 17 files changed, 67 insertions(+), 69 deletions(-) create mode 100644 some-other-repo/plugins/xpert_unit_summary/README.rst rename src/pages-and-resources/xpert-unit-summary/XpertUnitSummarySettings.jsx => some-other-repo/plugins/xpert_unit_summary/Settings.jsx (93%) rename src/pages-and-resources/xpert-unit-summary/XpertUnitSummarySettings.test.jsx => some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx (100%) rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/appInfo.js (100%) rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/data/api.js (100%) rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/data/thunks.js (94%) rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/index.js (100%) rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/messages.js (100%) create mode 100644 some-other-repo/plugins/xpert_unit_summary/package.json rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/settings-modal/ResetIcon.jsx (100%) rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/settings-modal/SettingsModal.jsx (93%) rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/settings-modal/SettingsModal.scss (88%) rename {src/pages-and-resources/xpert-unit-summary => some-other-repo/plugins/xpert_unit_summary}/settings-modal/messages.js (100%) delete mode 100644 src/pages-and-resources/PagesAndResources.scss create mode 100644 src/pages-and-resources/PluginSettingsComponent.jsx diff --git a/some-other-repo/plugins/xpert_unit_summary/README.rst b/some-other-repo/plugins/xpert_unit_summary/README.rst new file mode 100644 index 0000000000..498c753fa0 --- /dev/null +++ b/some-other-repo/plugins/xpert_unit_summary/README.rst @@ -0,0 +1,4 @@ +Xpert Unit Summaries Configuration Plugin +========================================= + +Install this using ``npm install some-other-repo/plugins/xpert_unit_summary/ --no-save``. diff --git a/src/pages-and-resources/xpert-unit-summary/XpertUnitSummarySettings.jsx b/some-other-repo/plugins/xpert_unit_summary/Settings.jsx similarity index 93% rename from src/pages-and-resources/xpert-unit-summary/XpertUnitSummarySettings.jsx rename to some-other-repo/plugins/xpert_unit_summary/Settings.jsx index 34bb30f404..cb0fe9b16e 100644 --- a/src/pages-and-resources/xpert-unit-summary/XpertUnitSummarySettings.jsx +++ b/some-other-repo/plugins/xpert_unit_summary/Settings.jsx @@ -3,7 +3,7 @@ import { history } from '@edx/frontend-platform'; import { useDispatch } from 'react-redux'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; -import { PagesAndResourcesContext } from '../PagesAndResourcesProvider'; +import { PagesAndResourcesContext } from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; import SettingsModal from './settings-modal/SettingsModal'; import messages from './messages'; diff --git a/src/pages-and-resources/xpert-unit-summary/XpertUnitSummarySettings.test.jsx b/some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx similarity index 100% rename from src/pages-and-resources/xpert-unit-summary/XpertUnitSummarySettings.test.jsx rename to some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx diff --git a/src/pages-and-resources/xpert-unit-summary/appInfo.js b/some-other-repo/plugins/xpert_unit_summary/appInfo.js similarity index 100% rename from src/pages-and-resources/xpert-unit-summary/appInfo.js rename to some-other-repo/plugins/xpert_unit_summary/appInfo.js diff --git a/src/pages-and-resources/xpert-unit-summary/data/api.js b/some-other-repo/plugins/xpert_unit_summary/data/api.js similarity index 100% rename from src/pages-and-resources/xpert-unit-summary/data/api.js rename to some-other-repo/plugins/xpert_unit_summary/data/api.js diff --git a/src/pages-and-resources/xpert-unit-summary/data/thunks.js b/some-other-repo/plugins/xpert_unit_summary/data/thunks.js similarity index 94% rename from src/pages-and-resources/xpert-unit-summary/data/thunks.js rename to some-other-repo/plugins/xpert_unit_summary/data/thunks.js index b79a36ccb1..a43eb2191b 100644 --- a/src/pages-and-resources/xpert-unit-summary/data/thunks.js +++ b/some-other-repo/plugins/xpert_unit_summary/data/thunks.js @@ -2,10 +2,10 @@ import { getXpertSettings, postXpertSettings, getXpertPluginConfigurable, deleteXpertSettings, } from './api'; -import { updateSavingStatus, updateLoadingStatus, updateResetStatus } from '../../data/slice'; -import { RequestStatus } from '../../../data/constants'; +import { updateSavingStatus, updateLoadingStatus, updateResetStatus } from 'CourseAuthoring/pages-and-resources/data/slice'; +import { RequestStatus } from 'CourseAuthoring/data/constants'; -import { addModel, updateModel } from '../../../generic/model-store'; +import { addModel, updateModel } from 'CourseAuthoring/generic/model-store'; export function updateXpertSettings(courseId, state) { return async (dispatch) => { diff --git a/src/pages-and-resources/xpert-unit-summary/index.js b/some-other-repo/plugins/xpert_unit_summary/index.js similarity index 100% rename from src/pages-and-resources/xpert-unit-summary/index.js rename to some-other-repo/plugins/xpert_unit_summary/index.js diff --git a/src/pages-and-resources/xpert-unit-summary/messages.js b/some-other-repo/plugins/xpert_unit_summary/messages.js similarity index 100% rename from src/pages-and-resources/xpert-unit-summary/messages.js rename to some-other-repo/plugins/xpert_unit_summary/messages.js diff --git a/some-other-repo/plugins/xpert_unit_summary/package.json b/some-other-repo/plugins/xpert_unit_summary/package.json new file mode 100644 index 0000000000..2eb1754692 --- /dev/null +++ b/some-other-repo/plugins/xpert_unit_summary/package.json @@ -0,0 +1,8 @@ +{ + "name": "@openedx-plugins/course-app-xpert_unit_summary", + "version": "0.1.0", + "description": "Xpert Unit Summaries configuration for courses using it", + "dependencies": { + }, + "devDependencies": {} +} diff --git a/src/pages-and-resources/xpert-unit-summary/settings-modal/ResetIcon.jsx b/some-other-repo/plugins/xpert_unit_summary/settings-modal/ResetIcon.jsx similarity index 100% rename from src/pages-and-resources/xpert-unit-summary/settings-modal/ResetIcon.jsx rename to some-other-repo/plugins/xpert_unit_summary/settings-modal/ResetIcon.jsx diff --git a/src/pages-and-resources/xpert-unit-summary/settings-modal/SettingsModal.jsx b/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx similarity index 93% rename from src/pages-and-resources/xpert-unit-summary/settings-modal/SettingsModal.jsx rename to some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx index 5cf183dd1d..92f67689b6 100644 --- a/src/pages-and-resources/xpert-unit-summary/settings-modal/SettingsModal.jsx +++ b/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx @@ -24,22 +24,24 @@ import React, { import { useDispatch, useSelector } from 'react-redux'; import * as Yup from 'yup'; -import { RequestStatus } from '../../../data/constants'; -import ConnectionErrorAlert from '../../../generic/ConnectionErrorAlert'; -import FormSwitchGroup from '../../../generic/FormSwitchGroup'; -import Loading from '../../../generic/Loading'; -import { useModel } from '../../../generic/model-store'; -import PermissionDeniedAlert from '../../../generic/PermissionDeniedAlert'; -import { useIsMobile } from '../../../utils'; -import { getLoadingStatus, getSavingStatus, getResetStatus } from '../../data/selectors'; -import { updateSavingStatus, updateResetStatus } from '../../data/slice'; +import { RequestStatus } from 'CourseAuthoring/data/constants'; +import ConnectionErrorAlert from 'CourseAuthoring/generic/ConnectionErrorAlert'; +import FormSwitchGroup from 'CourseAuthoring/generic/FormSwitchGroup'; +import Loading from 'CourseAuthoring/generic/Loading'; +import { useModel } from 'CourseAuthoring/generic/model-store'; +import PermissionDeniedAlert from 'CourseAuthoring/generic/PermissionDeniedAlert'; +import { useIsMobile } from 'CourseAuthoring/utils'; +import { getLoadingStatus, getSavingStatus, getResetStatus } from 'CourseAuthoring/pages-and-resources/data/selectors'; +import { updateSavingStatus, updateResetStatus } from 'CourseAuthoring/pages-and-resources/data/slice'; import { updateXpertSettings, resetXpertSettings, removeXpertSettings } from '../data/thunks'; -import AppConfigFormDivider from '../../discussions/app-config-form/apps/shared/AppConfigFormDivider'; -import { PagesAndResourcesContext } from '../../PagesAndResourcesProvider'; +import AppConfigFormDivider from 'CourseAuthoring/pages-and-resources/discussions/app-config-form/apps/shared/AppConfigFormDivider'; +import { PagesAndResourcesContext } from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; import messages from './messages'; import appInfo from '../appInfo'; import ResetIcon from './ResetIcon'; +import './SettingsModal.scss'; + const AppSettingsForm = ({ formikProps, children, showForm, }) => children && ( diff --git a/src/pages-and-resources/xpert-unit-summary/settings-modal/SettingsModal.scss b/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.scss similarity index 88% rename from src/pages-and-resources/xpert-unit-summary/settings-modal/SettingsModal.scss rename to some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.scss index 82942e2105..ce1c9a4e24 100644 --- a/src/pages-and-resources/xpert-unit-summary/settings-modal/SettingsModal.scss +++ b/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.scss @@ -1,3 +1,6 @@ +@import "~@edx/brand/paragon/variables"; +@import "~@edx/paragon/scss/core/utilities-only"; + .summary-radio { display: flex; align-items: center; diff --git a/src/pages-and-resources/xpert-unit-summary/settings-modal/messages.js b/some-other-repo/plugins/xpert_unit_summary/settings-modal/messages.js similarity index 100% rename from src/pages-and-resources/xpert-unit-summary/settings-modal/messages.js rename to some-other-repo/plugins/xpert_unit_summary/settings-modal/messages.js diff --git a/src/index.scss b/src/index.scss index bc0a403f1b..51ac159d48 100755 --- a/src/index.scss +++ b/src/index.scss @@ -14,7 +14,6 @@ @import "studio-home/scss/StudioHome"; @import "generic/styles"; @import "schedule-and-details/ScheduleAndDetails"; -@import "pages-and-resources/PagesAndResources"; @import "course-team/CourseTeam"; @import "course-updates/CourseUpdates"; @import "export-page/CourseExportPage"; diff --git a/src/pages-and-resources/PagesAndResources.jsx b/src/pages-and-resources/PagesAndResources.jsx index 84e57744a4..a0167b8d97 100644 --- a/src/pages-and-resources/PagesAndResources.jsx +++ b/src/pages-and-resources/PagesAndResources.jsx @@ -9,12 +9,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { Button, Hyperlink } from '@edx/paragon'; import messages from './messages'; import DiscussionsSettings from './discussions'; -import { - XpertUnitSummarySettings, - fetchXpertPluginConfigurable, - fetchXpertSettings, - appInfo as XpertAppInfo, -} from './xpert-unit-summary'; +import { CourseAppPluginSettings } from './PluginSettingsComponent'; import PageGrid from './pages/PageGrid'; import { fetchCourseApps } from './data/thunks'; @@ -34,8 +29,6 @@ const PagesAndResources = ({ courseId, intl }) => { const dispatch = useDispatch(); useEffect(() => { dispatch(fetchCourseApps(courseId)); - dispatch(fetchXpertPluginConfigurable(courseId)); - dispatch(fetchXpertSettings(courseId)); }, [courseId]); const courseAppIds = useSelector(state => state.pagesAndResources.courseAppIds); @@ -47,12 +40,6 @@ const PagesAndResources = ({ courseId, intl }) => { // Each page here is driven by a course app const pages = useModels('courseApps', courseAppIds); - const xpertPluginConfigurable = useModel('XpertSettings.enabled', 'xpert-unit-summary'); - const xpertSettings = useModel('XpertSettings', 'xpert-unit-summary'); - const permissonPages = [{ - ...XpertAppInfo, - enabled: xpertSettings?.enabled !== undefined, - }]; if (loadingStatus === RequestStatus.IN_PROGRESS) { // eslint-disable-next-line react/jsx-no-useless-fragment @@ -82,17 +69,6 @@ const PagesAndResources = ({ courseId, intl }) => { - { - xpertPluginConfigurable?.enabled ? ( - <> -
-

{intl.formatMessage(messages.contentPermissions)}

-
- - - ) : '' - } - { - - - - { - ({ match, history }) => { - const SettingsComponent = React.lazy(async () => { - try { - // There seems to be a bug in babel-eslint that causes the checker to crash with the following error - // if we use a template string here: - // TypeError: Cannot read property 'range' of null with using template strings here. - // Ref: https://github.com/babel/babel-eslint/issues/530 - return await import('@openedx-plugins/course-app-' + match.params.appId + '/Settings.jsx'); // eslint-disable-line - } catch (error) { - console.trace(error); // eslint-disable-line no-console - return null; - } - }); - return ( - - history.push(url)} /> - - ); - } + ({ match, history }) => + } diff --git a/src/pages-and-resources/PagesAndResources.scss b/src/pages-and-resources/PagesAndResources.scss deleted file mode 100644 index b577fe0f4b..0000000000 --- a/src/pages-and-resources/PagesAndResources.scss +++ /dev/null @@ -1 +0,0 @@ -@import "./xpert-unit-summary/settings-modal/SettingsModal"; diff --git a/src/pages-and-resources/PluginSettingsComponent.jsx b/src/pages-and-resources/PluginSettingsComponent.jsx new file mode 100644 index 0000000000..8fe569ca35 --- /dev/null +++ b/src/pages-and-resources/PluginSettingsComponent.jsx @@ -0,0 +1,32 @@ +import React from 'react'; + +/** + * Dynamically load the Settings modal for a "Course App", and display it. + * @param {{appId: string, history: {push: (url: string) => void}, backUrl: string}} props + * @returns + */ +export function CourseAppPluginSettings({ appId, history, backUrl }) { + + // We need to memoize this or it will get initialized hundreds of times: + const SettingsComponent = React.useMemo(() => + React.lazy(async () => { + try { + // There seems to be a bug in babel-eslint that causes the checker to crash with the following error + // if we use a template string here: + // TypeError: Cannot read property 'range' of null with using template strings here. + // Ref: https://github.com/babel/babel-eslint/issues/530 + return await import('@openedx-plugins/course-app-' + appId + '/Settings.jsx'); // eslint-disable-line + } catch (error) { + console.trace(error); // eslint-disable-line no-console + return null; + } + }), + [appId] + ); + + return ( + + history.push(backUrl)} /> + + ); +} From d1be807313b73fee3607151f68b5cc43f3d9181e Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Fri, 27 Oct 2023 11:47:45 -0700 Subject: [PATCH 08/19] fix: add webpack.prod.config.js --- webpack.prod.config.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 webpack.prod.config.js diff --git a/webpack.prod.config.js b/webpack.prod.config.js new file mode 100644 index 0000000000..f14752cdce --- /dev/null +++ b/webpack.prod.config.js @@ -0,0 +1,11 @@ +const path = require('path'); +const { createConfig } = require('@edx/frontend-build'); + +const config = createConfig('webpack-prod'); + +/** + * Plugins can use 'CourseAuthoring' as an import alias for this app: + */ +config.resolve.alias.CourseAuthoring = path.resolve(__dirname, 'src/'); + +module.exports = config; From 0a0695b78ae321d7ab6949183a3ee76f936c4c95 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Fri, 3 Nov 2023 15:41:51 -0700 Subject: [PATCH 09/19] fix: clean up unused parts of package.json files --- package-lock.json | 22 ++++++++------------- plugins/course-apps/calculator/package.json | 5 +---- plugins/course-apps/edxnotes/package.json | 5 +---- plugins/course-apps/live/package.json | 5 +---- plugins/course-apps/proctoring/package.json | 5 +---- plugins/course-apps/progress/package.json | 5 +---- plugins/course-apps/teams/package.json | 5 +---- plugins/course-apps/wiki/package.json | 5 +---- 8 files changed, 15 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac1da2bb4a..27e4b9e360 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26004,18 +26004,15 @@ }, "plugins/course-apps/calculator": { "name": "@openedx-plugins/course-app-calculator", - "version": "0.1.0", - "devDependencies": {} + "version": "0.1.0" }, "plugins/course-apps/edxnotes": { "name": "@openedx-plugins/course-app-edxnotes", - "version": "0.1.0", - "devDependencies": {} + "version": "0.1.0" }, "plugins/course-apps/live": { "name": "@openedx-plugins/course-app-live", - "version": "0.1.0", - "devDependencies": {} + "version": "0.1.0" }, "plugins/course-apps/ora_settings": { "name": "@openedx-plugins/course-app-ora_settings", @@ -26024,22 +26021,19 @@ }, "plugins/course-apps/proctoring": { "name": "@openedx-plugins/course-app-proctoring", - "version": "0.1.0", - "devDependencies": {} + "version": "0.1.0" }, "plugins/course-apps/progress": { "name": "@openedx-plugins/course-app-progress", - "version": "0.1.0", - "devDependencies": {} + "version": "0.1.0" }, "plugins/course-apps/teams": { "name": "@openedx-plugins/course-app-teams", - "version": "0.1.0", - "devDependencies": {} + "version": "0.1.0" }, "plugins/course-apps/wiki": { - "version": "0.1.0", - "devDependencies": {} + "name": "@openedx-plugins/course-app-wiki", + "version": "0.1.0" } } } diff --git a/plugins/course-apps/calculator/package.json b/plugins/course-apps/calculator/package.json index 1acb4010aa..861065da83 100644 --- a/plugins/course-apps/calculator/package.json +++ b/plugins/course-apps/calculator/package.json @@ -1,8 +1,5 @@ { "name": "@openedx-plugins/course-app-calculator", "version": "0.1.0", - "description": "Calculator configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "description": "Calculator configuration for courses using it" } diff --git a/plugins/course-apps/edxnotes/package.json b/plugins/course-apps/edxnotes/package.json index 1fe9983157..92fc49d6b0 100644 --- a/plugins/course-apps/edxnotes/package.json +++ b/plugins/course-apps/edxnotes/package.json @@ -1,8 +1,5 @@ { "name": "@openedx-plugins/course-app-edxnotes", "version": "0.1.0", - "description": "edxnotes configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "description": "edxnotes configuration for courses using it" } diff --git a/plugins/course-apps/live/package.json b/plugins/course-apps/live/package.json index 9724042566..477d313a37 100644 --- a/plugins/course-apps/live/package.json +++ b/plugins/course-apps/live/package.json @@ -1,8 +1,5 @@ { "name": "@openedx-plugins/course-app-live", "version": "0.1.0", - "description": "Live course configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "description": "Live course configuration for courses using it" } diff --git a/plugins/course-apps/proctoring/package.json b/plugins/course-apps/proctoring/package.json index b636995922..34e2ee8a34 100644 --- a/plugins/course-apps/proctoring/package.json +++ b/plugins/course-apps/proctoring/package.json @@ -1,8 +1,5 @@ { "name": "@openedx-plugins/course-app-proctoring", "version": "0.1.0", - "description": "Proctoring configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "description": "Proctoring configuration for courses using it" } diff --git a/plugins/course-apps/progress/package.json b/plugins/course-apps/progress/package.json index ea4ada254e..324db0917c 100644 --- a/plugins/course-apps/progress/package.json +++ b/plugins/course-apps/progress/package.json @@ -1,8 +1,5 @@ { "name": "@openedx-plugins/course-app-progress", "version": "0.1.0", - "description": "Progress configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "description": "Progress configuration for courses using it" } diff --git a/plugins/course-apps/teams/package.json b/plugins/course-apps/teams/package.json index 22e94efcde..c227991bc1 100644 --- a/plugins/course-apps/teams/package.json +++ b/plugins/course-apps/teams/package.json @@ -1,8 +1,5 @@ { "name": "@openedx-plugins/course-app-teams", "version": "0.1.0", - "description": "Teams configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "description": "Teams configuration for courses using it" } diff --git a/plugins/course-apps/wiki/package.json b/plugins/course-apps/wiki/package.json index 8e38b8d60d..f8634daba2 100644 --- a/plugins/course-apps/wiki/package.json +++ b/plugins/course-apps/wiki/package.json @@ -1,8 +1,5 @@ { "name": "@openedx-plugins/course-app-wiki", "version": "0.1.0", - "description": "Wiki configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "description": "Wiki configuration for courses using it" } From 48ba65e4013c3adec7ad818727f0f4b6abd4cc77 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Mon, 6 Nov 2023 14:48:30 -0800 Subject: [PATCH 10/19] feat: Add an error message when displaying a Course App Plugin fails --- src/pages-and-resources/PagesAndResources.jsx | 4 ++-- src/pages-and-resources/SettingsComponent.jsx | 24 ++++++++++--------- src/pages-and-resources/messages.js | 4 ++++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/pages-and-resources/PagesAndResources.jsx b/src/pages-and-resources/PagesAndResources.jsx index 789c1bedea..ef629f8df8 100644 --- a/src/pages-and-resources/PagesAndResources.jsx +++ b/src/pages-and-resources/PagesAndResources.jsx @@ -66,14 +66,14 @@ const PagesAndResources = ({ courseId, intl }) => { - - } /> } /> } /> } /> + + ); diff --git a/src/pages-and-resources/SettingsComponent.jsx b/src/pages-and-resources/SettingsComponent.jsx index 238a01636c..a73f30d2c9 100644 --- a/src/pages-and-resources/SettingsComponent.jsx +++ b/src/pages-and-resources/SettingsComponent.jsx @@ -1,22 +1,24 @@ import React from 'react'; import PropTypes from 'prop-types'; import { useParams, useNavigate } from 'react-router-dom'; +import { useIntl } from '@edx/frontend-platform/i18n'; +import { ErrorAlert } from '@edx/frontend-lib-content-components'; + +import messages from './messages'; const SettingsComponent = ({ url }) => { const { appId } = useParams(); const navigate = useNavigate(); + const intl = useIntl(); - const LazyLoadedComponent = React.useMemo(() => React.lazy(async () => { - try { - // There seems to be a bug in babel-eslint that causes the checker to crash with the following error - // if we use a template string here: - // TypeError: Cannot read property 'range' of null with using template strings here. - // Ref: https://github.com/babel/babel-eslint/issues/530 - return await import('@openedx-plugins/course-app-' + appId + '/Settings.jsx'); // eslint-disable-line - } catch (error) { - console.trace(error); // eslint-disable-line no-console - return null; - } + const LazyLoadedComponent = React.useMemo(() => React.lazy(() => { + return import(`@openedx-plugins/course-app-${appId}/Settings.jsx`).catch((err) => { // eslint-disable-line + // If we couldn't load this plugin, log the details to the console. + console.trace(err); + return { + default: () => {intl.formatMessage(messages.errorShowingConfiguration)}, + }; + }); }), [appId]); return navigate(url)} />; diff --git a/src/pages-and-resources/messages.js b/src/pages-and-resources/messages.js index 97148c29c1..cd8670dddf 100644 --- a/src/pages-and-resources/messages.js +++ b/src/pages-and-resources/messages.js @@ -13,6 +13,10 @@ const messages = defineMessages({ id: 'course-authoring.pages-resources.viewLive.button', defaultMessage: 'View live', }, + errorShowingConfiguration: { + id: 'course-authoring.pages-resources.courseAppPlugin.errorMessage', + defaultMessage: 'An error occurred when loading the configuration UI for that app.', + }, enabled: { id: 'course-authoring.badge.enabled', defaultMessage: 'Enabled', From 86b538ac19555a1c940b97fd0edd5ac2c5a3f90b Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Tue, 7 Nov 2023 12:33:35 -0800 Subject: [PATCH 11/19] chore: fix various eslint warnings --- .eslintrc.js | 17 +++ package-lock.json | 138 +++++++++++++++++- package.json | 1 + plugins/course-apps/calculator/Settings.jsx | 8 +- plugins/course-apps/calculator/package.json | 9 +- plugins/course-apps/edxnotes/Settings.jsx | 16 +- plugins/course-apps/edxnotes/package.json | 9 +- plugins/course-apps/live/BBBSettings.jsx | 7 +- plugins/course-apps/live/BbbSettings.test.jsx | 4 +- plugins/course-apps/live/LiveCommonFields.jsx | 3 +- plugins/course-apps/live/Settings.jsx | 7 +- plugins/course-apps/live/Settings.test.jsx | 3 +- plugins/course-apps/live/ZoomSettings.jsx | 3 +- .../course-apps/live/ZoomSettings.test.jsx | 2 +- plugins/course-apps/live/data/thunks.js | 3 +- plugins/course-apps/live/package.json | 14 +- plugins/course-apps/ora_settings/package.json | 11 +- plugins/course-apps/proctoring/Settings.jsx | 1 + plugins/course-apps/proctoring/package.json | 12 +- plugins/course-apps/progress/package.json | 10 +- plugins/course-apps/teams/package.json | 12 +- plugins/course-apps/wiki/package.json | 10 +- .../xpert_unit_summary/Settings.test.jsx | 9 +- .../plugins/xpert_unit_summary/data/thunks.js | 9 +- .../plugins/xpert_unit_summary/index.js | 10 -- .../plugins/xpert_unit_summary/package.json | 14 +- .../settings-modal/SettingsModal.jsx | 3 +- src/pages-and-resources/SettingsComponent.jsx | 24 +-- src/store.js | 7 +- 29 files changed, 303 insertions(+), 73 deletions(-) delete mode 100644 some-other-repo/plugins/xpert_unit_summary/index.js diff --git a/.eslintrc.js b/.eslintrc.js index 58835cd2a9..cda8bf3e2e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,4 @@ +const path = require('path'); // eslint-disable-next-line import/no-extraneous-dependencies const { createConfig } = require('@edx/frontend-build'); @@ -13,5 +14,21 @@ module.exports = createConfig( indent: ['error', 2], 'no-restricted-exports': 'off', }, + settings: { + // Import URLs should be resolved using aliases + 'import/resolver': { + webpack: { + config: path.resolve(__dirname, 'webpack.dev.config.js'), + }, + }, + }, + overrides: [ + { + files: ['plugins/**/*.test.jsx', 'some-other-repo/plugins/**/*.test.jsx'], + rules: { + 'import/no-extraneous-dependencies': 'off', + }, + }, + ], }, ); diff --git a/package-lock.json b/package-lock.json index 27e4b9e360..3f05bf97c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "classnames": "2.2.6", "core-js": "3.8.1", "email-validator": "2.0.4", + "eslint-import-resolver-webpack": "^0.13.8", "file-saver": "^2.0.5", "formik": "2.2.6", "jszip": "^3.10.1", @@ -7428,6 +7429,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.find": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.2.tgz", + "integrity": "sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -12692,6 +12707,92 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-import-resolver-webpack": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.8.tgz", + "integrity": "sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA==", + "dependencies": { + "array.prototype.find": "^2.2.2", + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "hasown": "^2.0.0", + "interpret": "^1.4.0", + "is-core-module": "^2.13.1", + "is-regex": "^1.1.4", + "lodash": "^4.17.21", + "resolve": "^2.0.0-next.5", + "semver": "^5.7.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0", + "webpack": ">=1.11.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", @@ -13824,6 +13925,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "license": "MIT", @@ -14213,8 +14319,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -14615,6 +14725,17 @@ "node": ">=0.10.0" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -15399,11 +15520,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18590,6 +18711,11 @@ "node": ">= 4.0.0" } }, + "node_modules/memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==" + }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", diff --git a/package.json b/package.json index 1ed643679d..470b7c1dd9 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "classnames": "2.2.6", "core-js": "3.8.1", "email-validator": "2.0.4", + "eslint-import-resolver-webpack": "^0.13.8", "file-saver": "^2.0.5", "formik": "2.2.6", "jszip": "^3.10.1", diff --git a/plugins/course-apps/calculator/Settings.jsx b/plugins/course-apps/calculator/Settings.jsx index f23a619312..7bfed1f658 100644 --- a/plugins/course-apps/calculator/Settings.jsx +++ b/plugins/course-apps/calculator/Settings.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import PropTypes from 'prop-types'; import { useIntl } from '@edx/frontend-platform/i18n'; @@ -7,8 +8,7 @@ import messages from './messages'; /** * Settings widget for the "calculator" Course App. - * @param {{onClose: () => void}} props - * @returns + * @param {{onClose: () => void}} props */ const CalculatorSettings = ({ onClose }) => { const intl = useIntl(); @@ -24,4 +24,8 @@ const CalculatorSettings = ({ onClose }) => { ); }; +CalculatorSettings.propTypes = { + onClose: PropTypes.func.isRequired, +}; + export default CalculatorSettings; diff --git a/plugins/course-apps/calculator/package.json b/plugins/course-apps/calculator/package.json index 861065da83..50a280a909 100644 --- a/plugins/course-apps/calculator/package.json +++ b/plugins/course-apps/calculator/package.json @@ -1,5 +1,12 @@ { "name": "@openedx-plugins/course-app-calculator", "version": "0.1.0", - "description": "Calculator configuration for courses using it" + "description": "Calculator configuration for courses using it", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*" + } } diff --git a/plugins/course-apps/edxnotes/Settings.jsx b/plugins/course-apps/edxnotes/Settings.jsx index 24d7af74b5..b6672320ca 100644 --- a/plugins/course-apps/edxnotes/Settings.jsx +++ b/plugins/course-apps/edxnotes/Settings.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import PropTypes from 'prop-types'; import { useIntl } from '@edx/frontend-platform/i18n'; @@ -7,8 +8,7 @@ import messages from './messages'; /** * Settings widget for the "edxnotes" Course App. - * @param {{onClose: () => void}} props - * @returns + * @param {{onClose: () => void}} props */ const NotesSettings = ({ onClose }) => { const intl = useIntl(); @@ -21,7 +21,11 @@ const NotesSettings = ({ onClose }) => { learnMoreText={intl.formatMessage(messages.enableNotesLink)} onClose={onClose} /> - ); - }; - - export default NotesSettings; + ); +}; + +NotesSettings.propTypes = { + onClose: PropTypes.func.isRequired, +}; + +export default NotesSettings; diff --git a/plugins/course-apps/edxnotes/package.json b/plugins/course-apps/edxnotes/package.json index 92fc49d6b0..10dfd35488 100644 --- a/plugins/course-apps/edxnotes/package.json +++ b/plugins/course-apps/edxnotes/package.json @@ -1,5 +1,12 @@ { "name": "@openedx-plugins/course-app-edxnotes", "version": "0.1.0", - "description": "edxnotes configuration for courses using it" + "description": "edxnotes configuration for courses using it", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*" + } } diff --git a/plugins/course-apps/live/BBBSettings.jsx b/plugins/course-apps/live/BBBSettings.jsx index 968943b7a7..bb1106f04c 100644 --- a/plugins/course-apps/live/BBBSettings.jsx +++ b/plugins/course-apps/live/BBBSettings.jsx @@ -3,12 +3,13 @@ import { getConfig } from '@edx/frontend-platform'; import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Form, Hyperlink } from '@edx/paragon'; import PropTypes from 'prop-types'; -import messages from './messages'; -import { providerNames, bbbPlanTypes } from './constants'; import AppConfigFormDivider from 'CourseAuthoring/pages-and-resources/discussions/app-config-form/apps/shared/AppConfigFormDivider'; -import LiveCommonFields from './LiveCommonFields'; import { useModel } from 'CourseAuthoring/generic/model-store'; +import { providerNames, bbbPlanTypes } from './constants'; +import LiveCommonFields from './LiveCommonFields'; +import messages from './messages'; + const BbbSettings = ({ intl, values, diff --git a/plugins/course-apps/live/BbbSettings.test.jsx b/plugins/course-apps/live/BbbSettings.test.jsx index 456077acab..143d4eafdc 100644 --- a/plugins/course-apps/live/BbbSettings.test.jsx +++ b/plugins/course-apps/live/BbbSettings.test.jsx @@ -17,6 +17,8 @@ import { IntlProvider } from '@edx/frontend-platform/i18n'; import userEvent from '@testing-library/user-event'; import initializeStore from 'CourseAuthoring/store'; import { executeThunk } from 'CourseAuthoring/utils'; +import PagesAndResourcesProvider from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; + import LiveSettings from './Settings'; import { generateLiveConfigurationApiResponse, @@ -24,11 +26,9 @@ import { initialState, configurationProviders, } from './factories/mockApiResponses'; - import { fetchLiveConfiguration, fetchLiveProviders } from './data/thunks'; import { providerConfigurationApiUrl, providersApiUrl } from './data/api'; import messages from './messages'; -import PagesAndResourcesProvider from '../PagesAndResourcesProvider'; let axiosMock; let container; diff --git a/plugins/course-apps/live/LiveCommonFields.jsx b/plugins/course-apps/live/LiveCommonFields.jsx index 94c152a5cb..6e49e62df0 100644 --- a/plugins/course-apps/live/LiveCommonFields.jsx +++ b/plugins/course-apps/live/LiveCommonFields.jsx @@ -1,9 +1,10 @@ import React from 'react'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import PropTypes from 'prop-types'; -import messages from './messages'; import FormikControl from 'CourseAuthoring/generic/FormikControl'; +import messages from './messages'; + const LiveCommonFields = ({ intl, values, diff --git a/plugins/course-apps/live/Settings.jsx b/plugins/course-apps/live/Settings.jsx index 60061903a2..07dfd50292 100644 --- a/plugins/course-apps/live/Settings.jsx +++ b/plugins/course-apps/live/Settings.jsx @@ -6,13 +6,14 @@ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import PropTypes from 'prop-types'; import * as Yup from 'yup'; import { useNavigate } from 'react-router-dom'; -import { fetchLiveData, saveLiveConfiguration, saveLiveConfigurationAsDraft } from './data/thunks'; -import { selectApp } from './data/slice'; import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; import { useModel } from 'CourseAuthoring/generic/model-store'; import Loading from 'CourseAuthoring/generic/Loading'; -import { iconsSrc, bbbPlanTypes } from './constants'; import { RequestStatus } from 'CourseAuthoring/data/constants'; + +import { fetchLiveData, saveLiveConfiguration, saveLiveConfigurationAsDraft } from './data/thunks'; +import { selectApp } from './data/slice'; +import { iconsSrc, bbbPlanTypes } from './constants'; import messages from './messages'; import ZoomSettings from './ZoomSettings'; import BBBSettings from './BBBSettings'; diff --git a/plugins/course-apps/live/Settings.test.jsx b/plugins/course-apps/live/Settings.test.jsx index 1d8ad8cb6e..71bfc509f1 100644 --- a/plugins/course-apps/live/Settings.test.jsx +++ b/plugins/course-apps/live/Settings.test.jsx @@ -20,6 +20,8 @@ import { IntlProvider } from '@edx/frontend-platform/i18n'; import initializeStore from 'CourseAuthoring/store'; import { executeThunk } from 'CourseAuthoring/utils'; +import PagesAndResourcesProvider from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; + import LiveSettings from './Settings'; import { generateLiveConfigurationApiResponse, @@ -31,7 +33,6 @@ import { import { fetchLiveConfiguration, fetchLiveProviders } from './data/thunks'; import { providerConfigurationApiUrl, providersApiUrl } from './data/api'; import messages from './messages'; -import PagesAndResourcesProvider from '../PagesAndResourcesProvider'; let axiosMock; let container; diff --git a/plugins/course-apps/live/ZoomSettings.jsx b/plugins/course-apps/live/ZoomSettings.jsx index ec322d0244..edb17f830e 100644 --- a/plugins/course-apps/live/ZoomSettings.jsx +++ b/plugins/course-apps/live/ZoomSettings.jsx @@ -1,10 +1,11 @@ import React from 'react'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import PropTypes from 'prop-types'; +import FormikControl from 'CourseAuthoring/generic/FormikControl'; + import messages from './messages'; import { providerNames } from './constants'; import LiveCommonFields from './LiveCommonFields'; -import FormikControl from 'CourseAuthoring/generic/FormikControl'; const ZoomSettings = ({ intl, diff --git a/plugins/course-apps/live/ZoomSettings.test.jsx b/plugins/course-apps/live/ZoomSettings.test.jsx index 30dd252567..a0e0836131 100644 --- a/plugins/course-apps/live/ZoomSettings.test.jsx +++ b/plugins/course-apps/live/ZoomSettings.test.jsx @@ -15,6 +15,7 @@ import { IntlProvider } from '@edx/frontend-platform/i18n'; import initializeStore from 'CourseAuthoring/store'; import { executeThunk } from 'CourseAuthoring/utils'; +import PagesAndResourcesProvider from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; import LiveSettings from './Settings'; import { generateLiveConfigurationApiResponse, @@ -26,7 +27,6 @@ import { import { fetchLiveConfiguration, fetchLiveProviders } from './data/thunks'; import { providerConfigurationApiUrl, providersApiUrl } from './data/api'; import messages from './messages'; -import PagesAndResourcesProvider from '../PagesAndResourcesProvider'; let axiosMock; let container; diff --git a/plugins/course-apps/live/data/thunks.js b/plugins/course-apps/live/data/thunks.js index e018b3a9e4..6c31082896 100644 --- a/plugins/course-apps/live/data/thunks.js +++ b/plugins/course-apps/live/data/thunks.js @@ -1,4 +1,6 @@ import { addModel, addModels, updateModel } from 'CourseAuthoring/generic/model-store'; +import { RequestStatus } from 'CourseAuthoring/data/constants'; + import { getLiveConfiguration, getLiveProviders, @@ -7,7 +9,6 @@ import { deNormalizeSettings, } from './api'; import { loadApps, updateStatus, updateSaveStatus } from './slice'; -import { RequestStatus } from 'CourseAuthoring/data/constants'; function updateLiveSettingsState({ appConfig, diff --git a/plugins/course-apps/live/package.json b/plugins/course-apps/live/package.json index 477d313a37..cdafe9789b 100644 --- a/plugins/course-apps/live/package.json +++ b/plugins/course-apps/live/package.json @@ -1,5 +1,17 @@ { "name": "@openedx-plugins/course-app-live", "version": "0.1.0", - "description": "Live course configuration for courses using it" + "description": "Live course configuration for courses using it", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "@reduxjs/toolkit": "*", + "lodash": "*", + "prop-types": "*", + "react": "*", + "react-redux": "*", + "react-router-dom": "*", + "yup": "*" + } } diff --git a/plugins/course-apps/ora_settings/package.json b/plugins/course-apps/ora_settings/package.json index 138b1551bd..d224dc02fd 100644 --- a/plugins/course-apps/ora_settings/package.json +++ b/plugins/course-apps/ora_settings/package.json @@ -2,8 +2,13 @@ "name": "@openedx-plugins/course-app-ora_settings", "version": "0.1.0", "description": "Open Response Assessment configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*", + "yup": "*" + } } \ No newline at end of file diff --git a/plugins/course-apps/proctoring/Settings.jsx b/plugins/course-apps/proctoring/Settings.jsx index 047ff144a1..4f9e901e09 100644 --- a/plugins/course-apps/proctoring/Settings.jsx +++ b/plugins/course-apps/proctoring/Settings.jsx @@ -22,6 +22,7 @@ import { useModel } from 'CourseAuthoring/generic/model-store'; import PermissionDeniedAlert from 'CourseAuthoring/generic/PermissionDeniedAlert'; import { useIsMobile } from 'CourseAuthoring/utils'; import { PagesAndResourcesContext } from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; + import messages from './messages'; const ProctoringSettings = ({ intl, onClose }) => { diff --git a/plugins/course-apps/proctoring/package.json b/plugins/course-apps/proctoring/package.json index 34e2ee8a34..798ac02fe7 100644 --- a/plugins/course-apps/proctoring/package.json +++ b/plugins/course-apps/proctoring/package.json @@ -1,5 +1,15 @@ { "name": "@openedx-plugins/course-app-proctoring", "version": "0.1.0", - "description": "Proctoring configuration for courses using it" + "description": "Proctoring configuration for courses using it", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "classnames": "*", + "email-validator": "*", + "react": "*", + "prop-types": "*", + "moment": "*" + } } diff --git a/plugins/course-apps/progress/package.json b/plugins/course-apps/progress/package.json index 324db0917c..910eefaf25 100644 --- a/plugins/course-apps/progress/package.json +++ b/plugins/course-apps/progress/package.json @@ -1,5 +1,13 @@ { "name": "@openedx-plugins/course-app-progress", "version": "0.1.0", - "description": "Progress configuration for courses using it" + "description": "Progress configuration for courses using it", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*", + "yup": "*" + } } diff --git a/plugins/course-apps/teams/package.json b/plugins/course-apps/teams/package.json index c227991bc1..e2cddf5f08 100644 --- a/plugins/course-apps/teams/package.json +++ b/plugins/course-apps/teams/package.json @@ -1,5 +1,15 @@ { "name": "@openedx-plugins/course-app-teams", "version": "0.1.0", - "description": "Teams configuration for courses using it" + "description": "Teams configuration for courses using it", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "formik": "*", + "prop-types": "*", + "react": "*", + "uuid": "*", + "yup": "*" + } } diff --git a/plugins/course-apps/wiki/package.json b/plugins/course-apps/wiki/package.json index f8634daba2..3cbcaf7144 100644 --- a/plugins/course-apps/wiki/package.json +++ b/plugins/course-apps/wiki/package.json @@ -1,5 +1,13 @@ { "name": "@openedx-plugins/course-app-wiki", "version": "0.1.0", - "description": "Wiki configuration for courses using it" + "description": "Wiki configuration for courses using it", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*", + "yup": "*" + } } diff --git a/some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx b/some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx index 6c7828624c..f0294c0521 100644 --- a/some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx +++ b/some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx @@ -10,12 +10,13 @@ import { queryByTestId, render, waitFor, getByText, fireEvent, } from '@testing-library/react'; import MockAdapter from 'axios-mock-adapter'; -import PagesAndResourcesProvider from '../PagesAndResourcesProvider'; -import { XpertUnitSummarySettings } from './index'; -import initializeStore from '../../store'; +import PagesAndResourcesProvider from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; +import initializeStore from 'CourseAuthoring/store'; +import { executeThunk } from 'CourseAuthoring/utils'; + +import XpertUnitSummarySettings from './Settings'; import * as API from './data/api'; import * as Thunks from './data/thunks'; -import { executeThunk } from '../../utils'; const courseId = 'course-v1:edX+TestX+Test_Course'; let axiosMock; diff --git a/some-other-repo/plugins/xpert_unit_summary/data/thunks.js b/some-other-repo/plugins/xpert_unit_summary/data/thunks.js index a43eb2191b..270fdce5f9 100644 --- a/some-other-repo/plugins/xpert_unit_summary/data/thunks.js +++ b/some-other-repo/plugins/xpert_unit_summary/data/thunks.js @@ -1,12 +1,11 @@ -import { - getXpertSettings, postXpertSettings, getXpertPluginConfigurable, deleteXpertSettings, -} from './api'; - import { updateSavingStatus, updateLoadingStatus, updateResetStatus } from 'CourseAuthoring/pages-and-resources/data/slice'; import { RequestStatus } from 'CourseAuthoring/data/constants'; - import { addModel, updateModel } from 'CourseAuthoring/generic/model-store'; +import { + getXpertSettings, postXpertSettings, getXpertPluginConfigurable, deleteXpertSettings, +} from './api'; + export function updateXpertSettings(courseId, state) { return async (dispatch) => { dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS })); diff --git a/some-other-repo/plugins/xpert_unit_summary/index.js b/some-other-repo/plugins/xpert_unit_summary/index.js deleted file mode 100644 index 1ba14190b3..0000000000 --- a/some-other-repo/plugins/xpert_unit_summary/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import XpertUnitSummarySettings from './XpertUnitSummarySettings'; -import appInfo from './appInfo'; -import { fetchXpertPluginConfigurable, fetchXpertSettings } from './data/thunks'; - -export { - XpertUnitSummarySettings, - appInfo, - fetchXpertPluginConfigurable, - fetchXpertSettings, -}; diff --git a/some-other-repo/plugins/xpert_unit_summary/package.json b/some-other-repo/plugins/xpert_unit_summary/package.json index 2eb1754692..85276581b1 100644 --- a/some-other-repo/plugins/xpert_unit_summary/package.json +++ b/some-other-repo/plugins/xpert_unit_summary/package.json @@ -2,7 +2,15 @@ "name": "@openedx-plugins/course-app-xpert_unit_summary", "version": "0.1.0", "description": "Xpert Unit Summaries configuration for courses using it", - "dependencies": { - }, - "devDependencies": {} + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "formik": "*", + "prop-types": "*", + "yup": "*", + "react": "*", + "react-redux": "*", + "react-router-dom": "*" + } } diff --git a/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx b/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx index 92f67689b6..eb061052e9 100644 --- a/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx +++ b/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx @@ -33,9 +33,10 @@ import PermissionDeniedAlert from 'CourseAuthoring/generic/PermissionDeniedAlert import { useIsMobile } from 'CourseAuthoring/utils'; import { getLoadingStatus, getSavingStatus, getResetStatus } from 'CourseAuthoring/pages-and-resources/data/selectors'; import { updateSavingStatus, updateResetStatus } from 'CourseAuthoring/pages-and-resources/data/slice'; -import { updateXpertSettings, resetXpertSettings, removeXpertSettings } from '../data/thunks'; import AppConfigFormDivider from 'CourseAuthoring/pages-and-resources/discussions/app-config-form/apps/shared/AppConfigFormDivider'; import { PagesAndResourcesContext } from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; + +import { updateXpertSettings, resetXpertSettings, removeXpertSettings } from '../data/thunks'; import messages from './messages'; import appInfo from '../appInfo'; import ResetIcon from './ResetIcon'; diff --git a/src/pages-and-resources/SettingsComponent.jsx b/src/pages-and-resources/SettingsComponent.jsx index a73f30d2c9..a45d64db10 100644 --- a/src/pages-and-resources/SettingsComponent.jsx +++ b/src/pages-and-resources/SettingsComponent.jsx @@ -6,20 +6,24 @@ import { ErrorAlert } from '@edx/frontend-lib-content-components'; import messages from './messages'; +const PluginLoadFailedError = () => { + const intl = useIntl(); + return {intl.formatMessage(messages.errorShowingConfiguration)}; +}; + const SettingsComponent = ({ url }) => { const { appId } = useParams(); const navigate = useNavigate(); - const intl = useIntl(); - const LazyLoadedComponent = React.useMemo(() => React.lazy(() => { - return import(`@openedx-plugins/course-app-${appId}/Settings.jsx`).catch((err) => { // eslint-disable-line - // If we couldn't load this plugin, log the details to the console. - console.trace(err); - return { - default: () => {intl.formatMessage(messages.errorShowingConfiguration)}, - }; - }); - }), [appId]); + const LazyLoadedComponent = React.useMemo( + () => React.lazy(() => + import(`@openedx-plugins/course-app-${appId}/Settings.jsx`).catch((err) => { // eslint-disable-line + // If we couldn't load this plugin, log the details to the console. + console.trace(err); // eslint-disable-line no-console + return { default: PluginLoadFailedError }; + })), + [appId], + ); return navigate(url)} />; }; diff --git a/src/store.js b/src/store.js index 0fc619288d..57eb27e2d1 100644 --- a/src/store.js +++ b/src/store.js @@ -1,5 +1,9 @@ import { configureStore } from '@reduxjs/toolkit'; +// FIXME: because the 'live' plugin is using Redux, we have to hard-code a reference to it here. +// If this app + the plugin were using React-query, there'd be no issues. +import { reducer as liveReducer } from '@openedx-plugins/course-app-live/data/slice'; + import { reducer as modelsReducer } from './generic/model-store'; import { reducer as courseDetailReducer } from './data/slice'; import { reducer as discussionsReducer } from './pages-and-resources/discussions'; @@ -9,9 +13,6 @@ import { reducer as advancedSettingsReducer } from './advanced-settings/data/sli import { reducer as gradingSettingsReducer } from './grading-settings/data/slice'; import { reducer as studioHomeReducer } from './studio-home/data/slice'; import { reducer as scheduleAndDetailsReducer } from './schedule-and-details/data/slice'; -// FIXME: because the 'live' plugin is using Redux, we have to hard-code a reference to it here. -// If this app + the plugin were using React-query, there'd be no issues. -import { reducer as liveReducer } from '@openedx-plugins/course-app-live/data/slice'; import { reducer as filesReducer } from './files-and-uploads/data/slice'; import { reducer as courseTeamReducer } from './course-team/data/slice'; import { reducer as CourseUpdatesReducer } from './course-updates/data/slice'; From b3855417034899abedb84421710c6315a20ffd71 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Tue, 7 Nov 2023 12:45:17 -0800 Subject: [PATCH 12/19] chore: fix jest tests --- jest.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/jest.config.js b/jest.config.js index 4e5f6ce264..e1f2674844 100644 --- a/jest.config.js +++ b/jest.config.js @@ -13,5 +13,6 @@ module.exports = createConfig('jest', { ], moduleNameMapper: { '^lodash-es$': 'lodash', + '^CourseAuthoring/(.*)$': '/src/$1', }, }); From 6d0481cd33e4b4e0ef6a6a1622006f63e4fe6388 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Tue, 7 Nov 2023 14:57:37 -0800 Subject: [PATCH 13/19] fix: error preventing "npm ci" from working --- package-lock.json | 125 ++++++++++++++++-- plugins/course-apps/calculator/package.json | 5 + plugins/course-apps/edxnotes/package.json | 5 + plugins/course-apps/live/package.json | 5 + plugins/course-apps/ora_settings/package.json | 5 + plugins/course-apps/proctoring/package.json | 5 + plugins/course-apps/progress/package.json | 5 + plugins/course-apps/teams/package.json | 5 + plugins/course-apps/wiki/package.json | 5 + .../plugins/xpert_unit_summary/package.json | 5 + 10 files changed, 162 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c36437a88..4020cfd716 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26196,36 +26196,145 @@ }, "plugins/course-apps/calculator": { "name": "@openedx-plugins/course-app-calculator", - "version": "0.1.0" + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } }, "plugins/course-apps/edxnotes": { "name": "@openedx-plugins/course-app-edxnotes", - "version": "0.1.0" + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } }, "plugins/course-apps/live": { "name": "@openedx-plugins/course-app-live", - "version": "0.1.0" + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "@reduxjs/toolkit": "*", + "lodash": "*", + "prop-types": "*", + "react": "*", + "react-redux": "*", + "react-router-dom": "*", + "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } }, "plugins/course-apps/ora_settings": { "name": "@openedx-plugins/course-app-ora_settings", "version": "0.1.0", - "devDependencies": {} + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*", + "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } }, "plugins/course-apps/proctoring": { "name": "@openedx-plugins/course-app-proctoring", - "version": "0.1.0" + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "classnames": "*", + "email-validator": "*", + "moment": "*", + "prop-types": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } }, "plugins/course-apps/progress": { "name": "@openedx-plugins/course-app-progress", - "version": "0.1.0" + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*", + "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } }, "plugins/course-apps/teams": { "name": "@openedx-plugins/course-app-teams", - "version": "0.1.0" + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "formik": "*", + "prop-types": "*", + "react": "*", + "uuid": "*", + "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } }, "plugins/course-apps/wiki": { "name": "@openedx-plugins/course-app-wiki", - "version": "0.1.0" + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*", + "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } } } } diff --git a/plugins/course-apps/calculator/package.json b/plugins/course-apps/calculator/package.json index 50a280a909..9d874cec89 100644 --- a/plugins/course-apps/calculator/package.json +++ b/plugins/course-apps/calculator/package.json @@ -8,5 +8,10 @@ "@edx/paragon": "*", "prop-types": "*", "react": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } diff --git a/plugins/course-apps/edxnotes/package.json b/plugins/course-apps/edxnotes/package.json index 10dfd35488..59dab81651 100644 --- a/plugins/course-apps/edxnotes/package.json +++ b/plugins/course-apps/edxnotes/package.json @@ -8,5 +8,10 @@ "@edx/paragon": "*", "prop-types": "*", "react": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } diff --git a/plugins/course-apps/live/package.json b/plugins/course-apps/live/package.json index cdafe9789b..8b9d0c7746 100644 --- a/plugins/course-apps/live/package.json +++ b/plugins/course-apps/live/package.json @@ -13,5 +13,10 @@ "react-redux": "*", "react-router-dom": "*", "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } diff --git a/plugins/course-apps/ora_settings/package.json b/plugins/course-apps/ora_settings/package.json index d224dc02fd..9d30455f28 100644 --- a/plugins/course-apps/ora_settings/package.json +++ b/plugins/course-apps/ora_settings/package.json @@ -9,6 +9,11 @@ "prop-types": "*", "react": "*", "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } \ No newline at end of file diff --git a/plugins/course-apps/proctoring/package.json b/plugins/course-apps/proctoring/package.json index 798ac02fe7..8a39634a6c 100644 --- a/plugins/course-apps/proctoring/package.json +++ b/plugins/course-apps/proctoring/package.json @@ -11,5 +11,10 @@ "react": "*", "prop-types": "*", "moment": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } diff --git a/plugins/course-apps/progress/package.json b/plugins/course-apps/progress/package.json index 910eefaf25..db155933f9 100644 --- a/plugins/course-apps/progress/package.json +++ b/plugins/course-apps/progress/package.json @@ -9,5 +9,10 @@ "prop-types": "*", "react": "*", "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } diff --git a/plugins/course-apps/teams/package.json b/plugins/course-apps/teams/package.json index e2cddf5f08..591a9691c9 100644 --- a/plugins/course-apps/teams/package.json +++ b/plugins/course-apps/teams/package.json @@ -11,5 +11,10 @@ "react": "*", "uuid": "*", "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } diff --git a/plugins/course-apps/wiki/package.json b/plugins/course-apps/wiki/package.json index 3cbcaf7144..4c776106cb 100644 --- a/plugins/course-apps/wiki/package.json +++ b/plugins/course-apps/wiki/package.json @@ -9,5 +9,10 @@ "prop-types": "*", "react": "*", "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } diff --git a/some-other-repo/plugins/xpert_unit_summary/package.json b/some-other-repo/plugins/xpert_unit_summary/package.json index 85276581b1..18859ba8fd 100644 --- a/some-other-repo/plugins/xpert_unit_summary/package.json +++ b/some-other-repo/plugins/xpert_unit_summary/package.json @@ -12,5 +12,10 @@ "react": "*", "react-redux": "*", "react-router-dom": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } } } From 8d26ef218347dcfddd680829c6aad45df1cb4f86 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Wed, 8 Nov 2023 11:37:33 -0800 Subject: [PATCH 14/19] feat: better tests for --- .../SettingsComponent.test.jsx | 81 ++++++++++++++++--- .../SettingsComponent.test.jsx.snap | 3 - .../apps/openedx/OpenedXConfigForm.jsx | 4 +- src/store.js | 2 +- 4 files changed, 72 insertions(+), 18 deletions(-) delete mode 100644 src/pages-and-resources/__snapshots__/SettingsComponent.test.jsx.snap diff --git a/src/pages-and-resources/SettingsComponent.test.jsx b/src/pages-and-resources/SettingsComponent.test.jsx index 382d3992a4..21b3aa4244 100644 --- a/src/pages-and-resources/SettingsComponent.test.jsx +++ b/src/pages-and-resources/SettingsComponent.test.jsx @@ -1,26 +1,83 @@ import React, { Suspense } from 'react'; -import { BrowserRouter } from 'react-router-dom'; -import { render } from '@testing-library/react'; +import { useParams } from 'react-router-dom'; +import { render, screen, waitFor } from '@testing-library/react'; +import { IntlProvider } from '@edx/frontend-platform/i18n'; +import { AppProvider } from '@edx/frontend-platform/react'; +import { initializeMockApp } from '@edx/frontend-platform/testing'; +import PagesAndResourcesProvider from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider'; +import initializeStore from 'CourseAuthoring/store'; +import { RequestStatus } from 'CourseAuthoring/data/constants'; import SettingsComponent from './SettingsComponent'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), - useParams: () => ({ - appId: 'wiki', - }), + useParams: jest.fn(), })); +jest.mock('CourseAuthoring/utils', () => ({ + useAppSetting: () => [false, () => undefined], + useIsMobile: () => false, +})); + +let store; + +// eslint-disable-next-line react/prop-types +const RequiredProviders = ({ children }) => ( + + + + {children} + + + +); + describe('SettingsComponent', () => { + beforeEach(async () => { + initializeMockApp(); + store = initializeStore({ + models: { + courseApps: { + wiki: {}, + }, + }, + pagesAndResources: { + loadingStatus: RequestStatus.SUCCESSFUL, + }, + }); + }); + test('renders LazyLoadedComponent when provided with props', async () => { - const { asFragment } = render( - - - - - , + useParams.mockImplementation(() => ({ appId: 'wiki' })); + + const rendered = render( + + + , + { wrapper: RequiredProviders }, + ); + + await waitFor(() => expect(rendered.getByText('Configure wiki')).toBeInTheDocument()); + + const modalComponent = screen.getByRole('dialog'); + expect(modalComponent.querySelector('#enable-wiki-toggleHelpText')).toContainHTML('The course wiki can be set up'); + }); + + test('renders error message when plugin is unavilable when provided with props', async () => { + // Silence noisy error about the plugin failing to load, when we do that deliberately. + jest.spyOn(console, 'trace').mockImplementation(() => {}); + // Specify an invalid course app, with no matching plugin: + useParams.mockImplementation(() => ({ appId: 'invalid-plugin' })); + + const rendered = render( + + + , + { wrapper: RequiredProviders }, ); - expect(asFragment).toMatchSnapshot(); + const errorMessage = 'An error occurred when loading the configuration UI'; + await waitFor(() => expect(rendered.container).toHaveTextContent(errorMessage)); }); }); diff --git a/src/pages-and-resources/__snapshots__/SettingsComponent.test.jsx.snap b/src/pages-and-resources/__snapshots__/SettingsComponent.test.jsx.snap deleted file mode 100644 index 65a738980a..0000000000 --- a/src/pages-and-resources/__snapshots__/SettingsComponent.test.jsx.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`SettingsComponent renders LazyLoadedComponent when provided with props 1`] = `[Function]`; diff --git a/src/pages-and-resources/discussions/app-config-form/apps/openedx/OpenedXConfigForm.jsx b/src/pages-and-resources/discussions/app-config-form/apps/openedx/OpenedXConfigForm.jsx index 3f2e95b2d8..d3db782fc2 100644 --- a/src/pages-and-resources/discussions/app-config-form/apps/openedx/OpenedXConfigForm.jsx +++ b/src/pages-and-resources/discussions/app-config-form/apps/openedx/OpenedXConfigForm.jsx @@ -6,8 +6,8 @@ import React, { useState } from 'react'; import { useSelector } from 'react-redux'; import * as Yup from 'yup'; -import { useModel, useModels } from '../../../../../generic/model-store'; -import { setupYupExtensions } from '../../../../../utils'; +import { useModel, useModels } from 'CourseAuthoring/generic/model-store'; +import { setupYupExtensions } from 'CourseAuthoring/utils'; import messages from '../../messages'; import { checkFieldErrors } from '../../utils'; import AnonymousPostingFields from '../shared/AnonymousPostingFields'; diff --git a/src/store.js b/src/store.js index 0766951324..6021fbe14d 100644 --- a/src/store.js +++ b/src/store.js @@ -6,7 +6,7 @@ import { reducer as liveReducer } from '@openedx-plugins/course-app-live/data/sl import { reducer as modelsReducer } from './generic/model-store'; import { reducer as courseDetailReducer } from './data/slice'; -import { reducer as discussionsReducer } from './pages-and-resources/discussions'; +import { reducer as discussionsReducer } from './pages-and-resources/discussions/data/slice'; import { reducer as pagesAndResourcesReducer } from './pages-and-resources/data/slice'; import { reducer as customPagesReducer } from './custom-pages/data/slice'; import { reducer as advancedSettingsReducer } from './advanced-settings/data/slice'; From 2ab6b2d6a3db0fbd49140a7f5959048ce23b8b56 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Wed, 15 Nov 2023 14:48:48 -0800 Subject: [PATCH 15/19] chore: move xpert_unit_summary into same dir as other plugins --- .eslintrc.js | 2 +- plugins/course-apps/xpert_unit_summary/README.rst | 4 ++++ .../course-apps}/xpert_unit_summary/Settings.jsx | 0 .../course-apps}/xpert_unit_summary/Settings.test.jsx | 0 .../course-apps}/xpert_unit_summary/appInfo.js | 0 .../course-apps}/xpert_unit_summary/data/api.js | 0 .../course-apps}/xpert_unit_summary/data/thunks.js | 0 .../course-apps}/xpert_unit_summary/messages.js | 0 .../course-apps}/xpert_unit_summary/package.json | 0 .../xpert_unit_summary/settings-modal/ResetIcon.jsx | 0 .../xpert_unit_summary/settings-modal/SettingsModal.jsx | 0 .../xpert_unit_summary/settings-modal/SettingsModal.scss | 0 .../xpert_unit_summary/settings-modal/messages.js | 0 some-other-repo/plugins/xpert_unit_summary/README.rst | 4 ---- 14 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 plugins/course-apps/xpert_unit_summary/README.rst rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/Settings.jsx (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/Settings.test.jsx (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/appInfo.js (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/data/api.js (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/data/thunks.js (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/messages.js (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/package.json (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/settings-modal/ResetIcon.jsx (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/settings-modal/SettingsModal.jsx (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/settings-modal/SettingsModal.scss (100%) rename {some-other-repo/plugins => plugins/course-apps}/xpert_unit_summary/settings-modal/messages.js (100%) delete mode 100644 some-other-repo/plugins/xpert_unit_summary/README.rst diff --git a/.eslintrc.js b/.eslintrc.js index cda8bf3e2e..702051d2cf 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -24,7 +24,7 @@ module.exports = createConfig( }, overrides: [ { - files: ['plugins/**/*.test.jsx', 'some-other-repo/plugins/**/*.test.jsx'], + files: ['plugins/**/*.test.jsx'], rules: { 'import/no-extraneous-dependencies': 'off', }, diff --git a/plugins/course-apps/xpert_unit_summary/README.rst b/plugins/course-apps/xpert_unit_summary/README.rst new file mode 100644 index 0000000000..6c3c162782 --- /dev/null +++ b/plugins/course-apps/xpert_unit_summary/README.rst @@ -0,0 +1,4 @@ +Xpert Unit Summaries Configuration Plugin +========================================= + +Install this using ``npm install plugins/course-apps/xpert_unit_summary/ --no-save``. diff --git a/some-other-repo/plugins/xpert_unit_summary/Settings.jsx b/plugins/course-apps/xpert_unit_summary/Settings.jsx similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/Settings.jsx rename to plugins/course-apps/xpert_unit_summary/Settings.jsx diff --git a/some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx b/plugins/course-apps/xpert_unit_summary/Settings.test.jsx similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/Settings.test.jsx rename to plugins/course-apps/xpert_unit_summary/Settings.test.jsx diff --git a/some-other-repo/plugins/xpert_unit_summary/appInfo.js b/plugins/course-apps/xpert_unit_summary/appInfo.js similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/appInfo.js rename to plugins/course-apps/xpert_unit_summary/appInfo.js diff --git a/some-other-repo/plugins/xpert_unit_summary/data/api.js b/plugins/course-apps/xpert_unit_summary/data/api.js similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/data/api.js rename to plugins/course-apps/xpert_unit_summary/data/api.js diff --git a/some-other-repo/plugins/xpert_unit_summary/data/thunks.js b/plugins/course-apps/xpert_unit_summary/data/thunks.js similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/data/thunks.js rename to plugins/course-apps/xpert_unit_summary/data/thunks.js diff --git a/some-other-repo/plugins/xpert_unit_summary/messages.js b/plugins/course-apps/xpert_unit_summary/messages.js similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/messages.js rename to plugins/course-apps/xpert_unit_summary/messages.js diff --git a/some-other-repo/plugins/xpert_unit_summary/package.json b/plugins/course-apps/xpert_unit_summary/package.json similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/package.json rename to plugins/course-apps/xpert_unit_summary/package.json diff --git a/some-other-repo/plugins/xpert_unit_summary/settings-modal/ResetIcon.jsx b/plugins/course-apps/xpert_unit_summary/settings-modal/ResetIcon.jsx similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/settings-modal/ResetIcon.jsx rename to plugins/course-apps/xpert_unit_summary/settings-modal/ResetIcon.jsx diff --git a/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx b/plugins/course-apps/xpert_unit_summary/settings-modal/SettingsModal.jsx similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.jsx rename to plugins/course-apps/xpert_unit_summary/settings-modal/SettingsModal.jsx diff --git a/some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.scss b/plugins/course-apps/xpert_unit_summary/settings-modal/SettingsModal.scss similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/settings-modal/SettingsModal.scss rename to plugins/course-apps/xpert_unit_summary/settings-modal/SettingsModal.scss diff --git a/some-other-repo/plugins/xpert_unit_summary/settings-modal/messages.js b/plugins/course-apps/xpert_unit_summary/settings-modal/messages.js similarity index 100% rename from some-other-repo/plugins/xpert_unit_summary/settings-modal/messages.js rename to plugins/course-apps/xpert_unit_summary/settings-modal/messages.js diff --git a/some-other-repo/plugins/xpert_unit_summary/README.rst b/some-other-repo/plugins/xpert_unit_summary/README.rst deleted file mode 100644 index 498c753fa0..0000000000 --- a/some-other-repo/plugins/xpert_unit_summary/README.rst +++ /dev/null @@ -1,4 +0,0 @@ -Xpert Unit Summaries Configuration Plugin -========================================= - -Install this using ``npm install some-other-repo/plugins/xpert_unit_summary/ --no-save``. From 7257af985aa199db070d5edd25359b424d02b57c Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Wed, 15 Nov 2023 14:51:39 -0800 Subject: [PATCH 16/19] fix: eslint-import-resolver-webpack is a dev dependency --- package-lock.json | 21 +++++++++++++-------- package.json | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53fef72f49..6127957559 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,6 @@ "classnames": "2.2.6", "core-js": "3.8.1", "email-validator": "2.0.4", - "eslint-import-resolver-webpack": "^0.13.8", "file-saver": "^2.0.5", "formik": "2.2.6", "jszip": "^3.10.1", @@ -71,6 +70,7 @@ "axios-mock-adapter": "1.22.0", "enzyme": "3.11.0", "enzyme-to-json": "^3.6.2", + "eslint-import-resolver-webpack": "^0.13.8", "glob": "7.2.3", "husky": "7.0.4", "jest-canvas-mock": "^2.5.2", @@ -4743,11 +4743,6 @@ "node": ">= 8" } }, - "node_modules/@openedx/brand-openedx": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@openedx/brand-openedx/-/brand-openedx-1.2.3.tgz", - "integrity": "sha512-Dn9CtpC8fovh++Xi4NF5NJoeR9yU2yXZnV9IujxIyGd/dn0Phq5t6dzJVfupwq09mpDnzJv7egA8Znz/3ljO+w==" - }, "node_modules/@openedx-plugins/course-app-calculator": { "resolved": "plugins/course-apps/calculator", "link": true @@ -6573,6 +6568,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.2.tgz", "integrity": "sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -11854,6 +11850,7 @@ "version": "0.13.8", "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.8.tgz", "integrity": "sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA==", + "dev": true, "dependencies": { "array.prototype.find": "^2.2.2", "debug": "^3.2.7", @@ -11879,6 +11876,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -11887,6 +11885,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.2.0", @@ -11900,6 +11899,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, "engines": { "node": ">= 0.10" } @@ -11908,6 +11908,7 @@ "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -11924,6 +11925,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -11932,6 +11934,7 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "dev": true, "engines": { "node": ">=0.6" } @@ -13206,7 +13209,8 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true }, "node_modules/find-up": { "version": "5.0.0", @@ -18741,7 +18745,8 @@ "node_modules/memory-fs": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==" + "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", + "dev": true }, "node_modules/meow": { "version": "9.0.0", diff --git a/package.json b/package.json index 8bf80ca44d..c55cfead84 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,6 @@ "classnames": "2.2.6", "core-js": "3.8.1", "email-validator": "2.0.4", - "eslint-import-resolver-webpack": "^0.13.8", "file-saver": "^2.0.5", "formik": "2.2.6", "jszip": "^3.10.1", @@ -96,6 +95,7 @@ "axios-mock-adapter": "1.22.0", "enzyme": "3.11.0", "enzyme-to-json": "^3.6.2", + "eslint-import-resolver-webpack": "^0.13.8", "glob": "7.2.3", "husky": "7.0.4", "jest-canvas-mock": "^2.5.2", From 833845f3669a8b88915be7ca4e166da0cd6608e5 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Fri, 16 Feb 2024 15:42:41 -0800 Subject: [PATCH 17/19] chore: move learning_assistant to be a plugin too --- .../learning_assistant/Settings.jsx | 13 +++++++------ .../learning_assistant/Settings.test.jsx | 4 ++-- .../learning_assistant/messages.js | 0 .../learning_assistant/package.json | 19 +++++++++++++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) rename {src/pages-and-resources => plugins/course-apps}/learning_assistant/Settings.jsx (83%) rename {src/pages-and-resources => plugins/course-apps}/learning_assistant/Settings.test.jsx (93%) rename {src/pages-and-resources => plugins/course-apps}/learning_assistant/messages.js (100%) create mode 100644 plugins/course-apps/learning_assistant/package.json diff --git a/src/pages-and-resources/learning_assistant/Settings.jsx b/plugins/course-apps/learning_assistant/Settings.jsx similarity index 83% rename from src/pages-and-resources/learning_assistant/Settings.jsx rename to plugins/course-apps/learning_assistant/Settings.jsx index ee2e17f5b9..28c8cc5ed8 100644 --- a/src/pages-and-resources/learning_assistant/Settings.jsx +++ b/plugins/course-apps/learning_assistant/Settings.jsx @@ -1,16 +1,18 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Hyperlink } from '@edx/paragon'; -import AppSettingsModal from '../app-settings-modal/AppSettingsModal'; +import AppSettingsModal from 'CourseAuthoring/pages-and-resources/app-settings-modal/AppSettingsModal'; +import { useModel } from 'CourseAuthoring/generic/model-store'; + import messages from './messages'; -import { useModel } from '../../generic/model-store'; -const LearningAssistantSettings = ({ intl, onClose }) => { +const LearningAssistantSettings = ({ onClose }) => { const appId = 'learning_assistant'; const appInfo = useModel('courseApps', appId); + const intl = useIntl(); // We need to render more than one link, so we use the bodyChildren prop. const bodyChildren = ( @@ -55,8 +57,7 @@ const LearningAssistantSettings = ({ intl, onClose }) => { }; LearningAssistantSettings.propTypes = { - intl: intlShape.isRequired, onClose: PropTypes.func.isRequired, }; -export default injectIntl(LearningAssistantSettings); +export default LearningAssistantSettings; diff --git a/src/pages-and-resources/learning_assistant/Settings.test.jsx b/plugins/course-apps/learning_assistant/Settings.test.jsx similarity index 93% rename from src/pages-and-resources/learning_assistant/Settings.test.jsx rename to plugins/course-apps/learning_assistant/Settings.test.jsx index 087434857d..a9bfa58200 100644 --- a/src/pages-and-resources/learning_assistant/Settings.test.jsx +++ b/plugins/course-apps/learning_assistant/Settings.test.jsx @@ -1,9 +1,9 @@ import React from 'react'; import { screen, waitFor } from '@testing-library/react'; +import { RequestStatus } from 'CourseAuthoring/data/constants'; +import { render } from 'CourseAuthoring/pages-and-resources/utils.test'; import LearningAssistantSettings from './Settings'; -import { render } from '../utils.test'; -import { RequestStatus } from '../../data/constants'; const onClose = () => { }; diff --git a/src/pages-and-resources/learning_assistant/messages.js b/plugins/course-apps/learning_assistant/messages.js similarity index 100% rename from src/pages-and-resources/learning_assistant/messages.js rename to plugins/course-apps/learning_assistant/messages.js diff --git a/plugins/course-apps/learning_assistant/package.json b/plugins/course-apps/learning_assistant/package.json new file mode 100644 index 0000000000..9d30455f28 --- /dev/null +++ b/plugins/course-apps/learning_assistant/package.json @@ -0,0 +1,19 @@ +{ + "name": "@openedx-plugins/course-app-ora_settings", + "version": "0.1.0", + "description": "Open Response Assessment configuration for courses using it", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*", + "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } +} + \ No newline at end of file From d869816b188124b23892ec10776090f5825dbd68 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Fri, 16 Feb 2024 15:47:49 -0800 Subject: [PATCH 18/19] feat: for compatibility, install 2U plugins by default --- package-lock.json | 54 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 ++ 2 files changed, 56 insertions(+) diff --git a/package-lock.json b/package-lock.json index cf80558cf4..b28920bdc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,12 +26,14 @@ "@fortawesome/react-fontawesome": "0.2.0", "@openedx-plugins/course-app-calculator": "file:plugins/course-apps/calculator", "@openedx-plugins/course-app-edxnotes": "file:plugins/course-apps/edxnotes", + "@openedx-plugins/course-app-learning_assistant": "file:plugins/course-apps/learning_assistant", "@openedx-plugins/course-app-live": "file:plugins/course-apps/live", "@openedx-plugins/course-app-ora_settings": "file:plugins/course-apps/ora_settings", "@openedx-plugins/course-app-proctoring": "file:plugins/course-apps/proctoring", "@openedx-plugins/course-app-progress": "file:plugins/course-apps/progress", "@openedx-plugins/course-app-teams": "file:plugins/course-apps/teams", "@openedx-plugins/course-app-wiki": "file:plugins/course-apps/wiki", + "@openedx-plugins/course-app-xpert_unit_summary": "file:plugins/course-apps/xpert_unit_summary", "@reduxjs/toolkit": "1.9.7", "@tanstack/react-query": "4.36.1", "broadcast-channel": "^7.0.0", @@ -5385,6 +5387,10 @@ "resolved": "plugins/course-apps/edxnotes", "link": true }, + "node_modules/@openedx-plugins/course-app-learning_assistant": { + "resolved": "plugins/course-apps/learning_assistant", + "link": true + }, "node_modules/@openedx-plugins/course-app-live": { "resolved": "plugins/course-apps/live", "link": true @@ -5409,6 +5415,10 @@ "resolved": "plugins/course-apps/wiki", "link": true }, + "node_modules/@openedx-plugins/course-app-xpert_unit_summary": { + "resolved": "plugins/course-apps/xpert_unit_summary", + "link": true + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -28780,6 +28790,7 @@ } }, "plugins/course-apps/calculator": { + "name": "@openedx-plugins/course-app-calculator", "version": "0.1.0", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", @@ -28795,6 +28806,7 @@ } }, "plugins/course-apps/edxnotes": { + "name": "@openedx-plugins/course-app-edxnotes", "version": "0.1.0", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", @@ -28809,7 +28821,25 @@ } } }, + "plugins/course-apps/learning_assistant": { + "name": "@openedx-plugins/course-app-ora_settings", + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "prop-types": "*", + "react": "*", + "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } + }, "plugins/course-apps/live": { + "name": "@openedx-plugins/course-app-live", "version": "0.1.0", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", @@ -28830,6 +28860,7 @@ } }, "plugins/course-apps/ora_settings": { + "name": "@openedx-plugins/course-app-ora_settings", "version": "0.1.0", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", @@ -28846,6 +28877,7 @@ } }, "plugins/course-apps/proctoring": { + "name": "@openedx-plugins/course-app-proctoring", "version": "0.1.0", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", @@ -28864,6 +28896,7 @@ } }, "plugins/course-apps/progress": { + "name": "@openedx-plugins/course-app-progress", "version": "0.1.0", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", @@ -28880,6 +28913,7 @@ } }, "plugins/course-apps/teams": { + "name": "@openedx-plugins/course-app-teams", "version": "0.1.0", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", @@ -28898,6 +28932,7 @@ } }, "plugins/course-apps/wiki": { + "name": "@openedx-plugins/course-app-wiki", "version": "0.1.0", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", @@ -28912,6 +28947,25 @@ "optional": true } } + }, + "plugins/course-apps/xpert_unit_summary": { + "version": "0.1.0", + "peerDependencies": { + "@edx/frontend-app-course-authoring": "*", + "@edx/frontend-platform": "*", + "@edx/paragon": "*", + "formik": "*", + "prop-types": "*", + "react": "*", + "react-redux": "*", + "react-router-dom": "*", + "yup": "*" + }, + "peerDependenciesMeta": { + "@edx/frontend-app-course-authoring": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index 29a7d672c3..37d6a13223 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,8 @@ "@openedx-plugins/course-app-progress": "file:plugins/course-apps/progress", "@openedx-plugins/course-app-teams": "file:plugins/course-apps/teams", "@openedx-plugins/course-app-wiki": "file:plugins/course-apps/wiki", + "@openedx-plugins/course-app-learning_assistant": "file:plugins/course-apps/learning_assistant", + "@openedx-plugins/course-app-xpert_unit_summary": "file:plugins/course-apps/xpert_unit_summary", "@reduxjs/toolkit": "1.9.7", "@tanstack/react-query": "4.36.1", "broadcast-channel": "^7.0.0", From decd2919c5d74a6d2d75fd5a3766c791dd4b892f Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Fri, 16 Feb 2024 16:02:04 -0800 Subject: [PATCH 19/19] fix: bug with learning_assistant package.json --- plugins/course-apps/learning_assistant/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/course-apps/learning_assistant/package.json b/plugins/course-apps/learning_assistant/package.json index 9d30455f28..0c96b6fc5c 100644 --- a/plugins/course-apps/learning_assistant/package.json +++ b/plugins/course-apps/learning_assistant/package.json @@ -1,11 +1,11 @@ { - "name": "@openedx-plugins/course-app-ora_settings", + "name": "@openedx-plugins/course-app-learning_assistant", "version": "0.1.0", - "description": "Open Response Assessment configuration for courses using it", + "description": "Learning Assistant configuration for courses using it", "peerDependencies": { "@edx/frontend-app-course-authoring": "*", "@edx/frontend-platform": "*", - "@edx/paragon": "*", + "@openedx/paragon": "*", "prop-types": "*", "react": "*", "yup": "*"