From 605abde54ba914f91a23dd7f4fa9d2dee90a8d47 Mon Sep 17 00:00:00 2001 From: Antonio Etayo Date: Tue, 7 Mar 2023 08:52:36 -0400 Subject: [PATCH 01/62] Adding some extra messaging to the lti sso error messaging --- src/containers/Auth/CanvasLtiLogin.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/containers/Auth/CanvasLtiLogin.js b/src/containers/Auth/CanvasLtiLogin.js index 30d619d58..2a012b4f7 100644 --- a/src/containers/Auth/CanvasLtiLogin.js +++ b/src/containers/Auth/CanvasLtiLogin.js @@ -48,10 +48,11 @@ function CanvasLtiSSO(props) { } }) .catch((err) => { + const error = Array.isArray(err.errors) ? err.errors[0] : err; Swal.fire({ icon: 'error', title: 'Failed to login!', - html: Array.isArray(err.errors) ? err.errors[0] : err, + html: `

${error}

Please contact support at Currikistudio.org

`, }); }); } From 778cbb366b40fc476828c1b370438faa8718db83 Mon Sep 17 00:00:00 2001 From: aqibnwaz Date: Wed, 8 Mar 2023 14:18:18 +0500 Subject: [PATCH 02/62] fix explore search lib bugs --- src/containers/Search/index.js | 101 ++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 14 deletions(-) diff --git a/src/containers/Search/index.js b/src/containers/Search/index.js index cb29da46c..5be487405 100644 --- a/src/containers/Search/index.js +++ b/src/containers/Search/index.js @@ -149,7 +149,9 @@ function SearchInterface(props) { const [educationLevels, setEducationLevels] = useState([]); const [indClone, setIndClone] = useState(false); const [isLoader, setisLoader] = useState(false); - const hideShowSideBar = useSelector((state) => state.msTeams.toggle_sidebar); + const hideShowSideBar = useSelector( + (state) => state.msTeams.toggle_sidebar + ); const isMsTeam = useSelector((state) => state.msTeams.is_msteam); useEffect(() => { @@ -210,7 +212,7 @@ function SearchInterface(props) { }; useEffect(() => { - if (allState.searchResult) { + if (allState?.searchResult) { if (allState.searchResult?.length > 0) { setSearch(allState.searchResult); SetSearchQuery(allState.searchQuery); @@ -235,7 +237,7 @@ function SearchInterface(props) { }, [ allState.searchMeta, allState.searchQuery, - allState.searchResult, + allState?.searchResult, ]); useEffect(() => { @@ -326,7 +328,12 @@ function SearchInterface(props) { return ( <>
-
+
{ + onSelect={async (eventKey) => { + setisLoader(true); if (eventKey === "Independent activities") { setActiveModel("Independent activities"); + const searchData = { + query: searchInput?.trim(), + subjectArray: activeSubject, + gradeArray: activeEducation, + authorTagsArray: activeAuthorTag, + authors: authorName || undefined, + standardArray: activeType, + from: 0, + size: 20, + no_words: noWords || undefined, + }; + + setSearch(null); + await dispatch( + searchIndependentActivitiesAction( + searchData, + "showcase_activities" + ) + ); } else { setActiveModel(""); + // if (allState.searchType === "Projects") { + if ( + activeModel === "total" || + activeModel === "Independent activities" + ) { + const searchData = { + phrase: searchQueries?.trim(), + from: 0, + size: 20, + type: searchType, + subjectArray: activeSubject || undefined, + gradeArray: activeEducation || undefined, + authorTagsArray: + activeAuthorTag || undefined, + standardArray: activeType || undefined, + author: authorName || undefined, + no_words: noWords || undefined, + }; + setSearch(null); + await dispatch( + simpleSearchAction(searchData) + ); + Swal.close(); + } else { + const searchData = { + phrase: searchQueries?.trim(), + from: 0, + size: 20, + type: searchType, + model: activeModel, + subjectArray: activeSubject || undefined, + gradeArray: activeEducation || undefined, + authorTagsArray: + activeAuthorTag || undefined, + standardArray: activeType || undefined, + author: authorName || undefined, + no_words: noWords || undefined, + }; + setSearch(null); + await dispatch( + simpleSearchAction(searchData) + ); + Swal.close(); + } + // } } dispatch(setSearchTypeAction(eventKey)); - setSearchInput(""); + // setSearchInput(""); - setNoWords(""); + // setNoWords(""); setSearchType(""); - setSearch(null); + // setSearch(null); setTotalCount(0); setActivePage(1); - setMeta({}); + // setMeta({}); setToggleStates({ searchLibrary: true, subject: true, @@ -397,14 +469,14 @@ function SearchInterface(props) { authorTag: false, type: false, }); - setActiveSubject([]); - setActiveEducation([]); - setActiveAuthorTag([]); - SetAuthor([]); + // setActiveSubject([]); + // setActiveEducation([]); + // setActiveAuthorTag([]); + // SetAuthor([]); Settodate([]); Setfromdate([]); setisLoader(false); - setActiveType([]); + // setActiveType([]); }} defaultActiveKey={ !fromTeam ? allState.searchType : "Projects" @@ -751,6 +823,7 @@ function SearchInterface(props) { activeKey={activetab} id="uncontrolled-tab-example" onSelect={async (e) => { + setisLoader(true); setSearch(null); setActiveTab(e); if (e === "total") { From 4cb5e3f881ad64c04db0e91cae3fd5aa2e61f453 Mon Sep 17 00:00:00 2001 From: muhammadqamar Date: Wed, 8 Mar 2023 22:12:23 +0500 Subject: [PATCH 03/62] more changes --- .../Admin/CreateUser/EmailCheckForm/index.js | 56 +++++++------ src/containers/Admin/CreateUser/index.js | 79 ++++++++++++------- src/containers/Videos/formik/addvideo.js | 2 +- 3 files changed, 84 insertions(+), 53 deletions(-) diff --git a/src/containers/Admin/CreateUser/EmailCheckForm/index.js b/src/containers/Admin/CreateUser/EmailCheckForm/index.js index 851e6b0b4..ab7e08272 100644 --- a/src/containers/Admin/CreateUser/EmailCheckForm/index.js +++ b/src/containers/Admin/CreateUser/EmailCheckForm/index.js @@ -1,19 +1,26 @@ -import React, { useState } from 'react'; -import { connect, useDispatch } from 'react-redux'; -import { withRouter } from 'react-router-dom'; -import adminService from 'services/admin.service'; -import { setCurrentUser, removeActiveAdminForm } from 'store/actions/admin'; -import PropTypes from 'prop-types'; -import './style.scss'; +/* eslint-disable */ +import React, { useState } from "react"; +import { connect, useDispatch } from "react-redux"; +import { withRouter } from "react-router-dom"; +import adminService from "services/admin.service"; +import { + setCurrentUser, + removeActiveAdminForm, +} from "store/actions/admin"; +import PropTypes from "prop-types"; +import "./style.scss"; const EmailCheckForm = (props) => { const { currentOrg, handleEmailChecked } = props; - const [email, setEmail] = useState(''); + const [email, setEmail] = useState(""); const [error, setError] = useState(null); const dispatch = useDispatch(); const doCheck = async () => { setError(null); - const response = await adminService.checkUserEmail(currentOrg.id, email); + const response = await adminService.checkUserEmail( + currentOrg.id, + email + ); console.log(response); if (response?.message && response?.user) { // User exists and belongs to currentOrg @@ -24,13 +31,13 @@ const EmailCheckForm = (props) => { if (response?.user) { // User exists but doesn't belong to currentOrg dispatch(setCurrentUser(response.user)); - handleEmailChecked('existing-user', response?.user?.email); + handleEmailChecked("existing-user", response?.user?.email); return; } if (response?.message) { // User does not exist - handleEmailChecked('new-user', email); + handleEmailChecked("new-user", email); } }; @@ -40,22 +47,23 @@ const EmailCheckForm = (props) => {
- setEmail(e.target.value)} /> - {error && ( -
- {error} -
- )} + setEmail(e.target.value)} + /> + {error &&
{error}
}
- {error ? ( - - ) : ( - - )} +
diff --git a/src/containers/Admin/CreateUser/index.js b/src/containers/Admin/CreateUser/index.js index 76f75de41..250b64165 100644 --- a/src/containers/Admin/CreateUser/index.js +++ b/src/containers/Admin/CreateUser/index.js @@ -1,41 +1,50 @@ -import React, { useState } from 'react'; -import { connect, useDispatch } from 'react-redux'; -import { withRouter } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { Modal, Button } from 'react-bootstrap'; -import EmailCheckForm from 'containers/Admin/CreateUser/EmailCheckForm'; -import CreateUserForm from 'containers/Admin/formik/createuser'; -import { removeActiveAdminForm } from 'store/actions/admin'; -import './style.scss'; +/* eslint-disable */ +import React, { useState } from "react"; +import { connect, useDispatch } from "react-redux"; +import { withRouter } from "react-router-dom"; +import PropTypes from "prop-types"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { Modal, Button } from "react-bootstrap"; +import EmailCheckForm from "containers/Admin/CreateUser/EmailCheckForm"; +import CreateUserForm from "containers/Admin/formik/createuser"; +import { removeActiveAdminForm } from "store/actions/admin"; +import "./style.scss"; const CreateUser = (props) => { const { mode } = props; const dispatch = useDispatch(); - const [step, setStep] = useState('emailCheck'); + const [step, setStep] = useState("emailCheck"); const [checkedEmail, setCheckedEmail] = useState(null); const [existingUser, setExistingUser] = useState(false); const handleEmailChecked = (result, email) => { - if (result === 'new-user') { + alert(result); + if (result === "new-user") { setCheckedEmail(email); - setStep('createUser'); + setStep("createUser"); return; } - if (result === 'existing-user') { + if (result === "existing-user") { setCheckedEmail(email); setExistingUser(true); - setStep('createUser'); + setStep("createUser"); return; } - if (result === 'added-to-org') setStep('done'); + if (result === "added-to-org") setStep("done"); }; return ( <> - {mode === 'create_user' && step === 'emailCheck' && ( - dispatch(removeActiveAdminForm())}> - + {mode === "create_user" && step === "emailCheck" && ( + dispatch(removeActiveAdminForm())} + > + Add User @@ -43,20 +52,34 @@ const CreateUser = (props) => { )} - {mode === 'create_user' && step === 'createUser' && checkedEmail && ( -
-
- + {mode === "create_user" && + step === "createUser" && + checkedEmail && ( +
+
+ +
-
- )} - {mode === 'create_user' && step === 'done' && ( - dispatch(removeActiveAdminForm())}> + )} + {mode === "create_user" && step === "done" && ( + dispatch(removeActiveAdminForm())} + >

User added successfully

- +
)} diff --git a/src/containers/Videos/formik/addvideo.js b/src/containers/Videos/formik/addvideo.js index ad0d01899..781c5e01c 100644 --- a/src/containers/Videos/formik/addvideo.js +++ b/src/containers/Videos/formik/addvideo.js @@ -418,7 +418,7 @@ const AddVideo = ({ ? videoId : selectedVideoIdKaltura } - platformName="Youtube" + platformName="Kaltura" placeholder="Enter a video url" setisbackHide={setisbackHide} /> From ac9962e1ad05cce73edfb29fb6c00e3119d22b70 Mon Sep 17 00:00:00 2001 From: aqibnwaz Date: Thu, 9 Mar 2023 17:45:54 +0500 Subject: [PATCH 04/62] update newly lti structure --- src/containers/Admin/controller.js | 291 +++++++---- src/containers/Admin/formik/createLtiTool.js | 126 ++--- src/containers/Admin/index.js | 520 ++++++++++++++----- src/containers/Admin/table.js | 20 +- src/services/admin.service.js | 508 ++++++++++++++---- 5 files changed, 1014 insertions(+), 451 deletions(-) diff --git a/src/containers/Admin/controller.js b/src/containers/Admin/controller.js index e9556d221..1cfb5276b 100644 --- a/src/containers/Admin/controller.js +++ b/src/containers/Admin/controller.js @@ -88,7 +88,9 @@ function Controller(props) { const dispatch = useDispatch(); // const [allUsersAdded, setAllUsersAdded] = useState([]); const adminState = useSelector((state) => state.admin); - const [activeRoleInComponent, setActiveRoleInComponent] = useState(""); + const [activeRoleInComponent, setActiveRoleInComponent] = useState( + "" + ); const organization = useSelector((state) => state.organization); const { permission, activeOrganization } = organization; const { activityTypes } = useSelector((state) => state.admin); @@ -98,8 +100,10 @@ function Controller(props) { const [authorsArray, setAuthorsArray] = useState([]); const [loaderImgUser, setLoaderImgUser] = useState(false); const [selectedFilterItem, setSelectedFilterItem] = useState(""); - const [ltiToolTypes, setLtiToolTypes] = useState(); - const { orgMediaSources } = useSelector((state) => state.admin); + const [LtiToolTypes, setLtiToolTypes] = useState(); + const { ltiToolsTypes, orgMediaSources } = useSelector( + (state) => state.admin + ); useMemo(() => { if (type === "Users") { dispatch(getRoles()); @@ -118,13 +122,20 @@ function Controller(props) { setActiveRoleInComponent(roles[0]?.display_name); } else if (roles?.length > 0 && activeRole) { setActiveRoleInComponent( - roles?.filter((role) => role.id === activeRole)[0]?.display_name + roles?.filter((role) => role.id === activeRole)[0] + ?.display_name ); } } else if (roles?.length > 0 && subTypeState === "Manage Roles") { setActiveRoleInComponent(roles[0]?.display_name); } - }, [roles, adminState?.activeTab, subTypeState, activeRole, setActiveRole]); + }, [ + roles, + adminState?.activeTab, + subTypeState, + activeRole, + setActiveRole, + ]); const searchUserProjectFilter = useCallback(async () => { if (authorName.length >= 2) { @@ -154,14 +165,12 @@ function Controller(props) { // const secondaryColor = getGlobalColor('--main-secondary-color'); useEffect(() => { - // setLtiToolTypes(ltiToolsTypes); - const filterdata = orgMediaSources?.mediaSources?.filter( - (t) => t.name !== "My device" && t.media_type === "Video" - ); - setLtiToolTypes( - filterdata?.filter((t) => t.pivot.lti_tool_settings_status === true) - ); - }, []); + if (ltiToolsTypes?.length) { + setLtiToolTypes(ltiToolsTypes); + } else { + setLtiToolTypes([]); + } + }, [ltiToolsTypes]); return (
{/* LEFT SIDE OF CONTROLLER GOES HERE */} @@ -182,11 +191,12 @@ function Controller(props) { /> {/* search */} - {searchQuery.trim().length > 0 && searchQuery.trim().length < 2 && ( - - )} + {searchQuery.trim().length > 0 && + searchQuery.trim().length < 2 && ( + + )}
)} @@ -246,7 +256,9 @@ function Controller(props) { className="" type="text" placeholder="Search" - onChange={({ target }) => setSearchQueryTeam(target.value)} + onChange={({ target }) => + setSearchQueryTeam(target.value) + } />
@@ -362,28 +374,32 @@ function Controller(props) {
)} - {!!search && type === "Activities" && subType === "Activity Types" && ( -
- - -
- )} - {!!search && type === "Activities" && subType === "Activity Items" && ( -
- - -
- )} + {!!search && + type === "Activities" && + subType === "Activity Types" && ( +
+ + +
+ )} + {!!search && + type === "Activities" && + subType === "Activity Items" && ( +
+ + +
+ )} {!!search && type === "Activities" && subType === "Subjects" && (
@@ -399,52 +415,60 @@ function Controller(props) {
)} - {!!search && type === "Activities" && subType === "Education Level" && ( -
- - {/* search */} - -
- )} + {!!search && + type === "Activities" && + subType === "Education Level" && ( +
+ + {/* search */} + +
+ )} - {!!search && type === "Activities" && subType === "Author Tags" && ( -
- - {/* search */} - -
- )} + {!!search && + type === "Activities" && + subType === "Author Tags" && ( +
+ + {/* search */} + +
+ )} - {!!search && type === "Activities" && subType === "Activity Layouts" && ( -
- - {/* search */} - -
- )} + {!!search && + type === "Activities" && + subType === "Activity Layouts" && ( +
+ + {/* search */} + +
+ )} {paginationCounter && (
Rows per page - {size} + + {size} + @@ -542,7 +568,8 @@ function Controller(props) { }} >
- {author.first_name[0] + author.last_name[0]} + {author.first_name[0] + + author.last_name[0]}
@@ -559,10 +586,16 @@ function Controller(props) { )}
{loaderImgUser && ( - loader + loader )} {authorName && authorName.length < 2 && ( -
Enter at least 2 characters.
+
+ Enter at least 2 characters. +
)}
@@ -660,7 +693,9 @@ function Controller(props) { { setLibraryReqSelected(true); setProjectFilterObj({ @@ -674,7 +709,9 @@ function Controller(props) { { setLibraryReqSelected(false); setProjectFilterObj({ @@ -688,7 +725,9 @@ function Controller(props) { { setLibraryReqSelected(false); setProjectFilterObj({ @@ -702,7 +741,9 @@ function Controller(props) { { setLibraryReqSelected(false); setProjectFilterObj({ @@ -719,7 +760,9 @@ function Controller(props) { setProjectFilterObj({ ...projectFilterObj, @@ -732,7 +775,9 @@ function Controller(props) { setProjectFilterObj({ ...projectFilterObj, @@ -770,14 +815,19 @@ function Controller(props) { )} @@ -785,14 +835,19 @@ function Controller(props) { )} @@ -898,7 +953,10 @@ function Controller(props) { setActiveRoleInComponent(head.display_name); if (subTypeState === "Manage Roles") dispatch( - roleDetail(activeOrganization.id, head.id) + roleDetail( + activeOrganization.id, + head.id + ) ); if ( subTypeState === "All Users" && @@ -926,7 +984,9 @@ function Controller(props) { - {filterLtiSettings?.name ? filterLtiSettings?.name : "All"} + {filterLtiSettings?.name + ? filterLtiSettings?.name + : "All"} @@ -949,7 +1009,7 @@ function Controller(props) { {t.value} ))} */} - {ltiToolTypes?.map((t) => { + {LtiToolTypes?.map((t) => { return ( { @@ -1011,7 +1071,9 @@ function Controller(props) { {!!importUser && type === "Projects" && subType === "All Projects" && - permission?.Organization?.includes("organization:edit-project") && ( + permission?.Organization?.includes( + "organization:edit-project" + ) && (
- {/*
-

Tool type

-
- - {ltiToolTypes?.filter((type) => type.id === values.media_source_id)[0]?.name} - - - {ltiToolTypes.map((type) => { - if (type.name !== 'My device' && type.name !== 'BrightCove') { - return ( - <> - { - setFieldValue('media_source_id', type.id); - }} - > - {type.name} - - - ); - } - })} - - -
-
*/} {/* Tool Type Update Start */}

Tool type

{errors.lti_version && diff --git a/src/containers/Admin/index.js b/src/containers/Admin/index.js index 0dc89d434..4f1d94067 100644 --- a/src/containers/Admin/index.js +++ b/src/containers/Admin/index.js @@ -1,42 +1,49 @@ /* eslint-disable */ -import React, { useEffect, useState } from 'react'; -import { Tabs, Tab, Alert } from 'react-bootstrap'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { useDispatch, useSelector } from 'react-redux'; -import { ltiToolType, setActiveAdminForm } from 'store/actions/admin'; -import EditProjectModel from './model/editprojectmodel'; -import { removeActiveAdminForm, setActiveTab } from 'store/actions/admin'; -import CreateActivityItem from './formik/createActivityItem'; -import CreateActivityType from './formik/createActivity'; -import CreateOrg from './formik/createOrg'; -import AddRole from './formik/addRole'; -import CreateUser from './CreateUser'; -import CreateUserForm from 'containers/Admin/formik/createuser'; -import BrightCove from './formik/createBrightCove'; -import Pills from './pills'; -import Heading from './heading'; -import Breadcrump from 'utils/BreadCrump/breadcrump'; -import * as actionTypes from 'store/actionTypes'; -import CreateLms from './formik/createLms'; -import CreateDefaultSso from './formik/createDefaultSso'; -import CreateLtiTool from './formik/createLtiTool'; -import RemoveUser from './RemoveUser'; -import './style.scss'; -import { getRoles } from 'store/actions/organization'; -import EditProject from './formik/editProject'; -import { useHistory } from 'react-router-dom'; +import React, { useEffect, useState } from "react"; +import { Tabs, Tab, Alert } from "react-bootstrap"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useDispatch, useSelector } from "react-redux"; +import { ltiToolType, setActiveAdminForm } from "store/actions/admin"; +import EditProjectModel from "./model/editprojectmodel"; +import { + removeActiveAdminForm, + setActiveTab, +} from "store/actions/admin"; +import CreateActivityItem from "./formik/createActivityItem"; +import CreateActivityType from "./formik/createActivity"; +import CreateOrg from "./formik/createOrg"; +import AddRole from "./formik/addRole"; +import CreateUser from "./CreateUser"; +import CreateUserForm from "containers/Admin/formik/createuser"; +import BrightCove from "./formik/createBrightCove"; +import Pills from "./pills"; +import Heading from "./heading"; +import Breadcrump from "utils/BreadCrump/breadcrump"; +import * as actionTypes from "store/actionTypes"; +import CreateLms from "./formik/createLms"; +import CreateDefaultSso from "./formik/createDefaultSso"; +import CreateLtiTool from "./formik/createLtiTool"; +import RemoveUser from "./RemoveUser"; +import "./style.scss"; +import { getRoles } from "store/actions/organization"; +import EditProject from "./formik/editProject"; +import { useHistory } from "react-router-dom"; // import editicon from 'assets/images/edit2.svg'; -import CreateSubject from './formik/createSubject'; -import CreateEducationLevel from './formik/createEducationLevel'; -import CreateAuthorTag from './formik/createAuthorTag'; -import CreateActivityLayout from './formik/createActivityLayout'; -import EditTeamModel from './model/EditTeamModel'; -import { getGlobalColor } from 'containers/App/DynamicBrandingApply'; -import MyVerticallyCenteredModal from 'components/models/videoH5pmodal'; -import { getAllMediaSources, getOrganizationMedaiSource, setLtiToolSettings } from 'store/actions/admin'; -import { getAllIV } from 'store/actions/resource'; +import CreateSubject from "./formik/createSubject"; +import CreateEducationLevel from "./formik/createEducationLevel"; +import CreateAuthorTag from "./formik/createAuthorTag"; +import CreateActivityLayout from "./formik/createActivityLayout"; +import EditTeamModel from "./model/EditTeamModel"; +import { getGlobalColor } from "containers/App/DynamicBrandingApply"; +import MyVerticallyCenteredModal from "components/models/videoH5pmodal"; +import { + getAllMediaSources, + getOrganizationMedaiSource, + setLtiToolSettings, +} from "store/actions/admin"; +import { getAllIV } from "store/actions/resource"; -import EditSmSvg from 'iconLibrary/mainContainer/EditSmSvg'; +import EditSmSvg from "iconLibrary/mainContainer/EditSmSvg"; function AdminPanel({ showSSO }) { const history = useHistory(); @@ -47,31 +54,71 @@ function AdminPanel({ showSSO }) { const { paginations } = useSelector((state) => state.ui); const organization = useSelector((state) => state.organization); const [modalShowh5p, setModalShowh5p] = useState(false); - const { permission, roles, currentOrganization, activeOrganization } = organization; + const { + permission, + roles, + currentOrganization, + activeOrganization, + } = organization; const { activeForm, activeTab, removeUser } = adminState; const [modalShow, setModalShow] = useState(false); const [modalShowTeam, setModalShowTeam] = useState(false); const [rowData, setrowData] = useState(false); const [activePageNumber, setActivePageNumber] = useState(false); const [currentActivity, setCurrentActivity] = useState(null); - const hideShowSideBar = useSelector((state) => state.msTeams.toggle_sidebar); + const hideShowSideBar = useSelector( + (state) => state.msTeams.toggle_sidebar + ); const isMsTeam = useSelector((state) => state.msTeams.is_msteam); const [videoSourceLTI, setVideoSourceLTI] = useState([ - { media_source_id: 1, h5p_library: null, lti_tool_settings_status: true, created_at: '' }, - { media_source_id: 2, h5p_library: null, lti_tool_settings_status: true, created_at: '' }, - { media_source_id: 3, h5p_library: null, lti_tool_settings_status: true, created_at: '' }, - { media_source_id: 5, h5p_library: null, lti_tool_settings_status: true, created_at: '' }, - { media_source_id: 6, h5p_library: null, lti_tool_settings_status: true, created_at: '' }, - { media_source_id: 10, h5p_library: null, lti_tool_settings_status: true, created_at: '' }, + { + media_source_id: 1, + h5p_library: null, + lti_tool_settings_status: true, + created_at: "", + }, + { + media_source_id: 2, + h5p_library: null, + lti_tool_settings_status: true, + created_at: "", + }, + { + media_source_id: 3, + h5p_library: null, + lti_tool_settings_status: true, + created_at: "", + }, + { + media_source_id: 5, + h5p_library: null, + lti_tool_settings_status: true, + created_at: "", + }, + { + media_source_id: 6, + h5p_library: null, + lti_tool_settings_status: true, + created_at: "", + }, + { + media_source_id: 10, + h5p_library: null, + lti_tool_settings_status: true, + created_at: "", + }, ]); useEffect(() => { - if ((roles?.length === 0 && activeOrganization?.id) || activeOrganization?.id !== currentOrganization?.id) { + if ( + (roles?.length === 0 && activeOrganization?.id) || + activeOrganization?.id !== currentOrganization?.id + ) { dispatch(getRoles()); } }, [activeOrganization]); useEffect(() => {}, [activeTab]); useEffect(() => { - const tab = localStorage.getItem('activeTab'); + const tab = localStorage.getItem("activeTab"); if (tab) { dispatch(setActiveTab(tab)); } @@ -93,18 +140,25 @@ function AdminPanel({ showSSO }) { })(); }, [activeOrganization]); - const paragraphColor = getGlobalColor('--main-paragraph-text-color'); + const paragraphColor = getGlobalColor( + "--main-paragraph-text-color" + ); // ltiToolType calling useEffect(() => { if (activeOrganization?.id) { - dispatch(ltiToolType(activeOrganization?.id || currentOrganization?.id)); + dispatch(ltiToolType(activeOrganization?.id)); } - }, [activeOrganization, currentOrganization]); + }, [activeOrganization]); return (
{true ? ( <> -
+
@@ -115,44 +169,72 @@ function AdminPanel({ showSSO }) { id="uncontrolled-tab-example" onSelect={(key) => { dispatch(setActiveTab(key)); - localStorage.setItem('activeTab', key); + localStorage.setItem("activeTab", key); }} > - {permission?.Organization?.includes('organization:view') && ( - + {permission?.Organization?.includes( + "organization:view" + ) && ( +
-

Main organization: {currentOrganization?.name}

+

+ Main organization:{" "} + {currentOrganization?.name} +

{currentOrganization?.description}

- {permission?.Organization?.includes('organization:edit') && ( + {permission?.Organization?.includes( + "organization:edit" + ) && ( )}
- +
)} - {(permission?.Organization?.includes('organization:view-all-project') || permission?.Organization?.includes('organization:view-exported-project')) && ( + {(permission?.Organization?.includes( + "organization:view-all-project" + ) || + permission?.Organization?.includes( + "organization:view-exported-project" + )) && (
)} {/* Ind.Activity Start */} - {(permission?.['Independent Activity']?.includes('independent-activity:view') || - permission?.['Independent Activity']?.includes('independent-activity:view-export')) && ( - + {(permission?.["Independent Activity"]?.includes( + "independent-activity:view" + ) || + permission?.["Independent Activity"]?.includes( + "independent-activity:view-export" + )) && ( +
@@ -181,36 +278,69 @@ function AdminPanel({ showSSO }) { )} {/* Ind.Activity End*/} - {(permission?.Organization?.includes('organization:view-activity-item') || - permission?.Organization?.includes('organization:view-activity-type') || - permission?.Organization?.includes('organization:view-activity-layout') || - permission?.Organization?.includes('organization:view-subject') || - permission?.Organization?.includes('organization:view-education-level') || - permission?.Organization?.includes('organization:view-author-tag')) && ( + {(permission?.Organization?.includes( + "organization:view-activity-item" + ) || + permission?.Organization?.includes( + "organization:view-activity-type" + ) || + permission?.Organization?.includes( + "organization:view-activity-layout" + ) || + permission?.Organization?.includes( + "organization:view-subject" + ) || + permission?.Organization?.includes( + "organization:view-education-level" + ) || + permission?.Organization?.includes( + "organization:view-author-tag" + )) && (
)} - {(permission?.Organization?.includes('organization:view-user') || permission?.Organization?.includes('organization:view-role')) && ( + {(permission?.Organization?.includes( + "organization:view-user" + ) || + permission?.Organization?.includes( + "organization:view-role" + )) && (
)} - {permission?.Organization?.includes('organization:view-user') && ( + {permission?.Organization?.includes( + "organization:view-user" + ) && (
- +
)} - {(permission?.Organization?.includes('organization:view-lms-setting') || - permission?.Organization?.includes('organization:view-all-setting') || - permission?.Organization?.includes('organization:view-media')) && ( + {(permission?.Organization?.includes( + "organization:view-lms-setting" + ) || + permission?.Organization?.includes( + "organization:view-all-setting" + ) || + permission?.Organization?.includes( + "organization:view-media" + )) && (
@@ -248,31 +403,46 @@ function AdminPanel({ showSSO }) { ) : ( { dispatch(setActiveTab(key)); - localStorage.setItem('activeTab', key); + localStorage.setItem("activeTab", key); }} > - {permission.activeRole?.includes('admin') && !currentOrganization?.parent && ( - -
- -
-
- )} + {permission.activeRole?.includes("admin") && + !currentOrganization?.parent && ( + +
+ +
+
+ )}
)}
- {(activeForm === 'add_activity_type' || activeForm === 'edit_activity_type') && ( + {(activeForm === "add_activity_type" || + activeForm === "edit_activity_type") && (
-
{activeForm === 'add_activity_type' ? : }
+
+ {activeForm === "add_activity_type" ? ( + + ) : ( + + )} +
)} - {(activeForm === 'add_activity_item' || activeForm === 'edit_activity_item') && ( + {(activeForm === "add_activity_item" || + activeForm === "edit_activity_item") && (
-
{activeForm === 'add_activity_item' ? : }
+
+ {activeForm === "add_activity_item" ? ( + + ) : ( + + )} +
)} - {(activeForm === 'add_subject' || activeForm === 'edit_subject') && ( + {(activeForm === "add_subject" || + activeForm === "edit_subject") && (
-
{activeForm === 'add_subject' ? : }
+
+ {activeForm === "add_subject" ? ( + + ) : ( + + )} +
)} - {(activeForm === 'add_education_level' || activeForm === 'edit_education_level') && ( + {(activeForm === "add_education_level" || + activeForm === "edit_education_level") && (
-
{activeForm === 'add_education_level' ? : }
+
+ {activeForm === "add_education_level" ? ( + + ) : ( + + )} +
)} - {(activeForm === 'add_author_tag' || activeForm === 'edit_author_tag') && ( + {(activeForm === "add_author_tag" || + activeForm === "edit_author_tag") && (
-
{activeForm === 'add_author_tag' ? : }
+
+ {activeForm === "add_author_tag" ? ( + + ) : ( + + )} +
)} - {(activeForm === 'add_activity_layout' || activeForm === 'edit_activity_layout') && ( + {(activeForm === "add_activity_layout" || + activeForm === "edit_activity_layout") && (
-
{activeForm === 'add_activity_layout' ? : }
+
+ {activeForm === "add_activity_layout" ? ( + + ) : ( + + )} +
)} - {(activeForm === 'add_org' || activeForm === 'edit_org') && ( + {(activeForm === "add_org" || + activeForm === "edit_org") && (
-
- {activeForm === 'add_org' ? : } +
+ {activeForm === "add_org" ? ( + + ) : ( + + )}
)} - {activeForm === 'add_role' && ( + {activeForm === "add_role" && (
)} - {activeForm === 'add_lms' && ( + {activeForm === "add_lms" && (
)} - {activeForm === 'add_brightcove' && ( + {activeForm === "add_brightcove" && (
)} - {activeForm === 'clone_brightcove' && ( + {activeForm === "clone_brightcove" && (
)} - {activeForm === 'edit_bright_form' && ( + {activeForm === "edit_bright_form" && (
)} - {activeForm === 'edit_lms' && ( + {activeForm === "edit_lms" && (
)} - {activeForm === 'clone_lms' && ( + {activeForm === "clone_lms" && (
)} - {activeForm === 'edit_project' && ( + {activeForm === "edit_project" && (
- +
)} - {activeForm === 'create_user' && } - {activeForm === 'edit_user' && ( + {activeForm === "create_user" && ( + + )} + {activeForm === "edit_user" && (
@@ -439,7 +657,7 @@ function AdminPanel({ showSSO }) {
)} - {activeForm === 'add_default_sso' && ( + {activeForm === "add_default_sso" && (
)} - {activeForm === 'edit_default_sso' && ( + {activeForm === "edit_default_sso" && (
)} - {activeForm === 'clone_lti_tool' && ( + {activeForm === "clone_lti_tool" && (
)} - {(activeForm === 'add_lti_tool' || activeForm === 'edit_lti_tool') && ( + {(activeForm === "add_lti_tool" || + activeForm === "edit_lti_tool") && (
-
{activeForm === 'add_lti_tool' ? : }
+
+ {activeForm === "add_lti_tool" ? ( + + ) : ( + + )} +
)} - {removeUser && } + {removeUser && ( + + )} - setModalShowTeam(false)} activePage={activePageNumber} activeOrganization={activeOrganization} showFooter={true} /> + setModalShowTeam(false)} + activePage={activePageNumber} + activeOrganization={activeOrganization} + showFooter={true} + /> ) : ( -
- You are not authorized to view this page. +
+ + You are not authorized to view this page. +
)} - setModalShowh5p(false)} activity={currentActivity} showvideoH5p={true} activeType={'demo'} activities={true} /> + setModalShowh5p(false)} + activity={currentActivity} + showvideoH5p={true} + activeType={"demo"} + activities={true} + />
); } diff --git a/src/containers/Admin/table.js b/src/containers/Admin/table.js index 3c422536b..6afa31a62 100644 --- a/src/containers/Admin/table.js +++ b/src/containers/Admin/table.js @@ -254,10 +254,14 @@ function Table(props) { }); }; //const history = useHistory(); - const [ltiToolTypes, setLtiToolTypes] = useState([]); + const [LtiToolTypes, setLtiToolTypes] = useState([]); const { ltiToolsTypes } = useSelector((state) => state.admin); useEffect(() => { - setLtiToolTypes(ltiToolsTypes); + if (ltiToolsTypes?.length) { + setLtiToolTypes(ltiToolsTypes); + } else { + setLtiToolTypes([]); + } }, [ltiToolsTypes]); return (
@@ -1873,19 +1877,23 @@ function Table(props) { {row.tool_name} {row.tool_url} - {/* {toolTypeArray.filter((type) => type.key === row.tool_type)[0]?.value} */} - {!filterLtiSettings ? ( + + {row.lti_tool_type + ? row.lti_tool_type?.name + : "N/A"} + + {/* {!filterLtiSettings ? ( {row?.media_sources?.name} ) : ( { - ltiToolTypes?.filter( + LtiToolTypes?.filter( (type) => type.id == row.media_source_id )[0]?.name } - )} + )} */} {/* {`${row.user.first_name} ${row.user.last_name}`} */} {row.tool_description} diff --git a/src/services/admin.service.js b/src/services/admin.service.js index d7149e6cb..03ade34a6 100644 --- a/src/services/admin.service.js +++ b/src/services/admin.service.js @@ -1,14 +1,17 @@ /* eslint-disable */ -import config from 'config'; -import Swal from 'sweetalert2'; -import httpService from './http.service'; -import { errorCatcher } from './errors'; +import config from "config"; +import Swal from "sweetalert2"; +import httpService from "./http.service"; +import { errorCatcher } from "./errors"; const { apiVersion } = config; const addUserInOrganization = (user, subOrgId) => httpService - .post(`/${apiVersion}/suborganizations/${subOrgId}/add-new-user`, user) + .post( + `/${apiVersion}/suborganizations/${subOrgId}/add-new-user`, + user + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -17,7 +20,10 @@ const addUserInOrganization = (user, subOrgId) => const editUserInOrganization = (user, subOrgId) => httpService - .put(`/${apiVersion}/suborganizations/${subOrgId}/update-user-detail`, user) + .put( + `/${apiVersion}/suborganizations/${subOrgId}/update-user-detail`, + user + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -25,16 +31,36 @@ const editUserInOrganization = (user, subOrgId) => }); // project -const getAllProject = (subOrgId, page, size, authorId, createdFrom, createdTo, updatedFrom, updatedTo, shared, index, query = '', column = '', orderBy = '') => +const getAllProject = ( + subOrgId, + page, + size, + authorId, + createdFrom, + createdTo, + updatedFrom, + updatedTo, + shared, + index, + query = "", + column = "", + orderBy = "" +) => httpService // eslint-disable-next-line max-len .get( - `/${apiVersion}/suborganizations/${subOrgId}/projects?page=${page}${size ? `&size=${size}` : ''}${authorId ? `&author_id=${authorId}` : ''}${ - createdFrom ? `&created_from=${createdFrom}` : '' - }${createdTo ? `&created_to=${createdTo}` : ''} - ${updatedFrom ? `&updated_from=${updatedFrom}` : ''}${updatedTo ? `&updated_to=${updatedTo}` : ''}${shared || shared === 0 ? `&shared=${shared}` : ''}${ - index ? `&indexing=${index}` : '' - }${query ? `&query=${query}` : ''}${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''}`, + `/${apiVersion}/suborganizations/${subOrgId}/projects?page=${page}${ + size ? `&size=${size}` : "" + }${authorId ? `&author_id=${authorId}` : ""}${ + createdFrom ? `&created_from=${createdFrom}` : "" + }${createdTo ? `&created_to=${createdTo}` : ""} + ${updatedFrom ? `&updated_from=${updatedFrom}` : ""}${ + updatedTo ? `&updated_to=${updatedTo}` : "" + }${shared || shared === 0 ? `&shared=${shared}` : ""}${ + index ? `&indexing=${index}` : "" + }${query ? `&query=${query}` : ""}${ + column ? `&order_by_column=${column}` : "" + }${orderBy ? `&order_by_type=${orderBy}` : ""}` ) .then(({ data }) => data) .catch((err) => { @@ -42,11 +68,22 @@ const getAllProject = (subOrgId, page, size, authorId, createdFrom, createdTo, u Promise.reject(err.response.data); }); -const getAllExportedProject = (subOrgId, page, size, query = '', column = '', orderBy = '') => +const getAllExportedProject = ( + subOrgId, + page, + size, + query = "", + column = "", + orderBy = "" +) => httpService .get( - `/${apiVersion}/suborganization/${subOrgId}/users/notifications/export-list?page=${page}${size ? `&size=${size}` : ''}${query ? `&query=${query}` : ''} - ${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''}`, + `/${apiVersion}/suborganization/${subOrgId}/users/notifications/export-list?page=${page}${ + size ? `&size=${size}` : "" + }${query ? `&query=${query}` : ""} + ${column ? `&order_by_column=${column}` : ""}${ + orderBy ? `&order_by_type=${orderBy}` : "" + }` ) .then(({ data }) => data) .catch((err) => { @@ -56,7 +93,9 @@ const getAllExportedProject = (subOrgId, page, size, query = '', column = '', or const exportProject = (subOrgId, projectId) => httpService - .post(`/${apiVersion}/suborganization/${subOrgId}/projects/${projectId}/export`) + .post( + `/${apiVersion}/suborganization/${subOrgId}/projects/${projectId}/export` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -65,25 +104,41 @@ const exportProject = (subOrgId, projectId) => const importProject = (subOrgId, projectData) => httpService - .post(`/${apiVersion}/suborganization/${subOrgId}/projects/import`, projectData) + .post( + `/${apiVersion}/suborganization/${subOrgId}/projects/import`, + projectData + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); return Promise.reject(err.response.data); }); -const getAllProjectSearch = (subOrgId, page, search, size, column, orderBy) => +const getAllProjectSearch = ( + subOrgId, + page, + search, + size, + column, + orderBy +) => httpService .get( - `/${apiVersion}/suborganizations/${subOrgId}/projects?page=${page}${search ? `&query=${search.replace(/#/, '%23')}` : ''} - ${size ? `&size=${size}` : ''}${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''}`, + `/${apiVersion}/suborganizations/${subOrgId}/projects?page=${page}${ + search ? `&query=${search.replace(/#/, "%23")}` : "" + } + ${size ? `&size=${size}` : ""}${ + column ? `&order_by_column=${column}` : "" + }${orderBy ? `&order_by_type=${orderBy}` : ""}` ) .then(({ data }) => data) .catch((err) => Promise.reject(err.response.data)); const getUserProject = (subOrgId, page) => httpService - .get(`/${apiVersion}/suborganizations/${subOrgId}/projects?exclude_starter=true&page=${page}`) + .get( + `/${apiVersion}/suborganizations/${subOrgId}/projects?exclude_starter=true&page=${page}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -92,22 +147,42 @@ const getUserProject = (subOrgId, page) => const getUserProjectSearch = (subOrgId, page, search) => httpService - .get(`/${apiVersion}/suborganizations/${subOrgId}/projects?exclude_starter=true&page=${page}&query=${search.replace(/#/, '%23')}`) + .get( + `/${apiVersion}/suborganizations/${subOrgId}/projects?exclude_starter=true&page=${page}&query=${search.replace( + /#/, + "%23" + )}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); return Promise.reject(err.response.data); }); -const getAllProjectIndex = (subOrgId, page, index, size, authorId, createdFrom, createdTo, updatedFrom, updatedTo, shared) => +const getAllProjectIndex = ( + subOrgId, + page, + index, + size, + authorId, + createdFrom, + createdTo, + updatedFrom, + updatedTo, + shared +) => httpService // eslint-disable-next-line max-len .get( - `/${apiVersion}/suborganizations/${subOrgId}/projects?page=${page}&indexing=${index}${size ? `&size=${size}` : ''}${authorId ? `&author_id=${authorId}` : ''}${ - createdFrom ? `&created_from=${createdFrom}` : '' - }${createdTo ? `&created_to=${createdTo}` : ''}${updatedFrom ? `&updated_from=${updatedFrom}` : ''}${updatedTo ? `&updated_to=${updatedTo}` : ''}${ - shared || shared === 0 ? `&shared=${shared}` : '' - }`, + `/${apiVersion}/suborganizations/${subOrgId}/projects?page=${page}&indexing=${index}${ + size ? `&size=${size}` : "" + }${authorId ? `&author_id=${authorId}` : ""}${ + createdFrom ? `&created_from=${createdFrom}` : "" + }${createdTo ? `&created_to=${createdTo}` : ""}${ + updatedFrom ? `&updated_from=${updatedFrom}` : "" + }${updatedTo ? `&updated_to=${updatedTo}` : ""}${ + shared || shared === 0 ? `&shared=${shared}` : "" + }` ) .then(({ data }) => data) .catch((err) => { @@ -117,7 +192,11 @@ const getAllProjectIndex = (subOrgId, page, index, size, authorId, createdFrom, const userSerchIndexs = (subOrgId, page, index, search, size) => httpService - .get(`/${apiVersion}/suborganizations/${subOrgId}/projects?page=${page}&indexing=${index}${size ? `&size=${size}` : ''}&query=${search.replace(/#/, '%23') || ''}`) + .get( + `/${apiVersion}/suborganizations/${subOrgId}/projects?page=${page}&indexing=${index}${ + size ? `&size=${size}` : "" + }&query=${search.replace(/#/, "%23") || ""}` + ) .then(({ data }) => data) .catch((err) => Promise.reject(err.response.data)); @@ -130,13 +209,25 @@ const updateIndex = (projectId, index) => Promise.reject(err.response.data); }); -const getLmsProject = (subOrgId, page, size, query, column, orderBy, filterBy = '') => +const getLmsProject = ( + subOrgId, + page, + size, + query, + column, + orderBy, + filterBy = "" +) => httpService .get( `${apiVersion}/suborganizations/${subOrgId}/lms-settings?page=${page} - ${query !== '' ? `&query=${query}` : ''}${size !== '' ? `&size=${size}` : ''} - ${column !== '' ? `&order_by_column=${column}` : ''}${orderBy !== '' ? `&order_by_type=${orderBy}` : ''} - ${filterBy !== '' ? `&filter=${filterBy}` : ''}`, + ${query !== "" ? `&query=${query}` : ""}${ + size !== "" ? `&size=${size}` : "" + } + ${column !== "" ? `&order_by_column=${column}` : ""}${ + orderBy !== "" ? `&order_by_type=${orderBy}` : "" + } + ${filterBy !== "" ? `&filter=${filterBy}` : ""}` ) .then(({ data }) => data) .catch((err) => { @@ -145,7 +236,9 @@ const getLmsProject = (subOrgId, page, size, query, column, orderBy, filterBy = const deleteLmsProject = (subOrgId, id) => httpService - .remove(`${apiVersion}/suborganizations/${subOrgId}/lms-settings/${id}`) + .remove( + `${apiVersion}/suborganizations/${subOrgId}/lms-settings/${id}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -154,7 +247,10 @@ const deleteLmsProject = (subOrgId, id) => const updateLmsProject = (subOrgId, id, values) => httpService - .put(`${apiVersion}/suborganizations/${subOrgId}/lms-settings/${id}`, values) + .put( + `${apiVersion}/suborganizations/${subOrgId}/lms-settings/${id}`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -163,7 +259,10 @@ const updateLmsProject = (subOrgId, id, values) => const createLmsProject = (subOrgId, values) => httpService - .post(`${apiVersion}/suborganizations/${subOrgId}/lms-settings`, values) + .post( + `${apiVersion}/suborganizations/${subOrgId}/lms-settings`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -172,15 +271,29 @@ const createLmsProject = (subOrgId, values) => const getLmsProjectSearch = (subOrgId, search, page) => httpService - .get(`${apiVersion}/suborganizations/${subOrgId}/lms-settings?page=${page}&query=${search.replace(/#/, '%23')}`) + .get( + `${apiVersion}/suborganizations/${subOrgId}/lms-settings?page=${page}&query=${search.replace( + /#/, + "%23" + )}` + ) .then(({ data }) => data) .catch((err) => { Promise.reject(err.response.data); }); -const getActivityTypes = (subOrgId, page, size, column, orderBy, search) => +const getActivityTypes = ( + subOrgId, + page, + size, + column, + orderBy, + search +) => httpService - .get(`/${apiVersion}/suborganizations/${subOrgId}/activity-types?page=${page}&size=${size}&order_by_column=${column}&order_by_type=${orderBy}&query=${search}`) + .get( + `/${apiVersion}/suborganizations/${subOrgId}/activity-types?page=${page}&size=${size}&order_by_column=${column}&order_by_type=${orderBy}&query=${search}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -189,7 +302,13 @@ const getActivityTypes = (subOrgId, page, size, column, orderBy, search) => const getUserReport = (mode, size, page, query) => httpService - .get(`/${apiVersion}/users/report/basic${mode ? `?mode=${mode}` : ''}${size ? `&size=${size}` : ''}${page ? `&page=${page}` : ''}${query ? `&query=${query}` : ''}`) + .get( + `/${apiVersion}/users/report/basic${ + mode ? `?mode=${mode}` : "" + }${size ? `&size=${size}` : ""}${page ? `&page=${page}` : ""}${ + query ? `&query=${query}` : "" + }` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -198,7 +317,13 @@ const getUserReport = (mode, size, page, query) => const getJobListing = (filter, size, page, query) => httpService - .get(`/${apiVersion}/queue-monitor/jobs${filter ? `?filter=${filter}` : ''}${size ? `&size=${size}` : ''}${page ? `&page=${page}` : ''}${query ? `&query=${query}` : ''}`) + .get( + `/${apiVersion}/queue-monitor/jobs${ + filter ? `?filter=${filter}` : "" + }${size ? `&size=${size}` : ""}${page ? `&page=${page}` : ""}${ + query ? `&query=${query}` : "" + }` + ) .then((data) => data) .catch((err) => { errorCatcher(err.response.data); @@ -243,20 +368,38 @@ const forgetSpecificFailedJob = (job) => const getLogsListing = (filter, size, page, query) => httpService - .get(`/${apiVersion}/queue-monitor${filter ? `?filter=${filter}` : ''}${size ? `&size=${size}` : ''}${page ? `&page=${page}` : ''}${query ? `&query=${query}` : ''}`) + .get( + `/${apiVersion}/queue-monitor${ + filter ? `?filter=${filter}` : "" + }${size ? `&size=${size}` : ""}${page ? `&page=${page}` : ""}${ + query ? `&query=${query}` : "" + }` + ) .then((data) => data) .catch((err) => { errorCatcher(err.response.data); Promise.reject(err.response.data); }); -const getDefaultSso = (orgId, page, size, query, column, orderBy, filterBy = '') => +const getDefaultSso = ( + orgId, + page, + size, + query, + column, + orderBy, + filterBy = "" +) => httpService .get( `${apiVersion}/organizations/${orgId}/default-sso-settings?page=${page} - ${query !== '' ? `&query=${query}` : ''}${size !== '' ? `&size=${size}` : ''} - ${column !== '' ? `&order_by_column=${column}` : ''}${orderBy !== '' ? `&order_by_type=${orderBy}` : ''} - ${filterBy !== '' ? `&filter=${filterBy}` : ''}`, + ${query !== "" ? `&query=${query}` : ""}${ + size !== "" ? `&size=${size}` : "" + } + ${column !== "" ? `&order_by_column=${column}` : ""}${ + orderBy !== "" ? `&order_by_type=${orderBy}` : "" + } + ${filterBy !== "" ? `&filter=${filterBy}` : ""}` ) .then(({ data }) => data) .catch((err) => { @@ -265,7 +408,10 @@ const getDefaultSso = (orgId, page, size, query, column, orderBy, filterBy = '') const createDefaultSso = (orgId, values) => httpService - .post(`${apiVersion}/organizations/${orgId}/default-sso-settings`, values) + .post( + `${apiVersion}/organizations/${orgId}/default-sso-settings`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -274,7 +420,10 @@ const createDefaultSso = (orgId, values) => const updateDefaultSso = (orgId, id, values) => httpService - .put(`${apiVersion}/organizations/${orgId}/default-sso-settings/${id}`, values) + .put( + `${apiVersion}/organizations/${orgId}/default-sso-settings/${id}`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -283,7 +432,9 @@ const updateDefaultSso = (orgId, id, values) => const deleteDefaultSso = (orgId, id) => httpService - .remove(`${apiVersion}/organizations/${orgId}/default-sso-settings/${id}`) + .remove( + `${apiVersion}/organizations/${orgId}/default-sso-settings/${id}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -292,19 +443,31 @@ const deleteDefaultSso = (orgId, id) => const searchDefaultSso = (orgId, search, page) => httpService - .get(`${apiVersion}/organizations/${orgId}/default-sso-settings?page=${page}&query=${search}`) + .get( + `${apiVersion}/organizations/${orgId}/default-sso-settings?page=${page}&query=${search}` + ) .then(({ data }) => data) .catch((err) => { Promise.reject(err.response.data); }); -const getLtiTools = (subOrgId, page, size, query, column, orderBy, filterBy) => +const getLtiTools = ( + subOrgId, + page, + size, + query, + column, + orderBy, + filterBy +) => httpService .get( `${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings?page=${page} - ${query ? `&query=${query}` : ''}${size ? `&size=${size}` : ''} - ${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''} - ${filterBy ? `&filter=${filterBy}` : ''}`, + ${query ? `&query=${query}` : ""}${size ? `&size=${size}` : ""} + ${column ? `&order_by_column=${column}` : ""}${ + orderBy ? `&order_by_type=${orderBy}` : "" + } + ${filterBy ? `&filter=${filterBy}` : ""}` ) .then(({ data }) => data) .catch((err) => { @@ -313,7 +476,9 @@ const getLtiTools = (subOrgId, page, size, query, column, orderBy, filterBy) => const getLtiToolsMedia = (subOrgId, page, size, query, filterBy) => httpService - .get(`${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings?page=${page}&size=${size}&query=${query}&filter=${filterBy}`) + .get( + `${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings?page=${page}&size=${size}&query=${query}&filter=${filterBy}` + ) .then(({ data }) => data) .catch((err) => { Promise.reject(err.response.data); @@ -321,7 +486,10 @@ const getLtiToolsMedia = (subOrgId, page, size, query, filterBy) => const createLtiTool = (subOrgId, values) => httpService - .post(`${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings`, values) + .post( + `${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -330,7 +498,10 @@ const createLtiTool = (subOrgId, values) => const updateLtiTool = (subOrgId, id, values) => httpService - .put(`${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings/${id}`, values) + .put( + `${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings/${id}`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -339,7 +510,9 @@ const updateLtiTool = (subOrgId, id, values) => const deleteLtiTool = (subOrgId, id) => httpService - .remove(`${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings/${id}`) + .remove( + `${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings/${id}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -348,7 +521,11 @@ const deleteLtiTool = (subOrgId, id) => const searchLtiTool = (subOrgId, query, page) => httpService - .get(`${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings?page=${page}${query ? `&query=${query.replace(/#/, '%23')}` : ''}`) + .get( + `${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings?page=${page}${ + query ? `&query=${query.replace(/#/, "%23")}` : "" + }` + ) .then(({ data }) => data) .catch((err) => { Promise.reject(err.response.data); @@ -356,28 +533,36 @@ const searchLtiTool = (subOrgId, query, page) => const cloneLtiTool = (subOrgId, id, user_id) => httpService - .post(`/${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings/${id}/clone`, { - user_id: user_id, - }) + .post( + `/${apiVersion}/suborganizations/${subOrgId}/lti-tool-settings/${id}/clone`, + { + user_id: user_id, + } + ) .then((res) => Swal.fire(res.data.message)) .catch((err) => { if (err.response.data.errors) { Swal.fire(err.response.data.errors[0]); } else { Swal.fire({ - icon: 'error', - text: 'Something went wrong!', + icon: "error", + text: "Something went wrong!", }); } }); const ltiToolType = (subOrgId) => httpService - .get(`/${apiVersion}/suborganizations/${subOrgId}/lti-tool-type`) + .get(`/${apiVersion}/lti-tool-type`) .then(({ data }) => data) .catch((err) => { Promise.reject(err); }); -const checkUserEmail = (orgId, email) => httpService.get(`${apiVersion}/suborganization/${orgId}/users/check-email?email=${email}`).then(({ data }) => data); +const checkUserEmail = (orgId, email) => + httpService + .get( + `${apiVersion}/suborganization/${orgId}/users/check-email?email=${email}` + ) + .then(({ data }) => data); const addUserToOrg = (subOrgId, userId, role) => httpService @@ -393,20 +578,27 @@ const addUserToOrg = (subOrgId, userId, role) => const removeUser = (subOrgId, userId, preserve) => httpService - .remove(`${apiVersion}/suborganizations/${subOrgId}/remove-user`, { - user_id: userId, - preserve_data: preserve, - }) + .remove( + `${apiVersion}/suborganizations/${subOrgId}/remove-user`, + { + user_id: userId, + preserve_data: preserve, + } + ) .then(({ data }) => data) .catch((err) => Promise.reject(err.response.data)); const getSubjects = (subOrgId, page, size, query, column, orderBy) => httpService .get( - `${apiVersion}/suborganizations/${subOrgId}/subjects${page ? `?page=${page}` : ''}${size ? `&size=${size}` : ''}${!page && !size ? `?skipPagination=${true}` : ''}${ - query ? `&query=${query.replace(/#/, '%23')}` : '' - } - ${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''}`, + `${apiVersion}/suborganizations/${subOrgId}/subjects${ + page ? `?page=${page}` : "" + }${size ? `&size=${size}` : ""}${ + !page && !size ? `?skipPagination=${true}` : "" + }${query ? `&query=${query.replace(/#/, "%23")}` : ""} + ${column ? `&order_by_column=${column}` : ""}${ + orderBy ? `&order_by_type=${orderBy}` : "" + }` ) .then(({ data }) => data) .catch((err) => { @@ -415,7 +607,10 @@ const getSubjects = (subOrgId, page, size, query, column, orderBy) => const createSubject = (subOrgId, values) => httpService - .post(`${apiVersion}/suborganizations/${subOrgId}/subjects`, values) + .post( + `${apiVersion}/suborganizations/${subOrgId}/subjects`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -424,7 +619,10 @@ const createSubject = (subOrgId, values) => const updateSubject = (subOrgId, id, values) => httpService - .put(`${apiVersion}/suborganizations/${subOrgId}/subjects/${id}`, values) + .put( + `${apiVersion}/suborganizations/${subOrgId}/subjects/${id}`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -433,20 +631,33 @@ const updateSubject = (subOrgId, id, values) => const deleteSubject = (subOrgId, id) => httpService - .remove(`${apiVersion}/suborganizations/${subOrgId}/subjects/${id}`) + .remove( + `${apiVersion}/suborganizations/${subOrgId}/subjects/${id}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); return Promise.reject(); }); -const getEducationLevel = (subOrgId, page, size, query, column, orderBy) => +const getEducationLevel = ( + subOrgId, + page, + size, + query, + column, + orderBy +) => httpService .get( - `${apiVersion}/suborganizations/${subOrgId}/education-levels${page ? `?page=${page}` : ''}${size ? `&size=${size}` : ''}${!page && !size ? `?skipPagination=${true}` : ''}${ - query ? `&query=${query.replace(/#/, '%23')}` : '' - } - ${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''}`, + `${apiVersion}/suborganizations/${subOrgId}/education-levels${ + page ? `?page=${page}` : "" + }${size ? `&size=${size}` : ""}${ + !page && !size ? `?skipPagination=${true}` : "" + }${query ? `&query=${query.replace(/#/, "%23")}` : ""} + ${column ? `&order_by_column=${column}` : ""}${ + orderBy ? `&order_by_type=${orderBy}` : "" + }` ) .then(({ data }) => data) .catch((err) => { @@ -455,7 +666,10 @@ const getEducationLevel = (subOrgId, page, size, query, column, orderBy) => const createEducationLevel = (subOrgId, values) => httpService - .post(`${apiVersion}/suborganizations/${subOrgId}/education-levels`, values) + .post( + `${apiVersion}/suborganizations/${subOrgId}/education-levels`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -464,7 +678,10 @@ const createEducationLevel = (subOrgId, values) => const updateEducationLevel = (subOrgId, id, values) => httpService - .put(`${apiVersion}/suborganizations/${subOrgId}/education-levels/${id}`, values) + .put( + `${apiVersion}/suborganizations/${subOrgId}/education-levels/${id}`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -473,7 +690,9 @@ const updateEducationLevel = (subOrgId, id, values) => const deleteEducationLevel = (subOrgId, id) => httpService - .remove(`${apiVersion}/suborganizations/${subOrgId}/education-levels/${id}`) + .remove( + `${apiVersion}/suborganizations/${subOrgId}/education-levels/${id}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -483,10 +702,14 @@ const deleteEducationLevel = (subOrgId, id) => const getAuthorTag = (subOrgId, page, size, query, column, orderBy) => httpService .get( - `${apiVersion}/suborganizations/${subOrgId}/author-tags${page ? `?page=${page}` : ''}${size ? `&size=${size}` : ''}${!page && !size ? `?skipPagination=${true}` : ''}${ - query ? `&query=${query.replace(/#/, '%23')}` : '' - } - ${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''}`, + `${apiVersion}/suborganizations/${subOrgId}/author-tags${ + page ? `?page=${page}` : "" + }${size ? `&size=${size}` : ""}${ + !page && !size ? `?skipPagination=${true}` : "" + }${query ? `&query=${query.replace(/#/, "%23")}` : ""} + ${column ? `&order_by_column=${column}` : ""}${ + orderBy ? `&order_by_type=${orderBy}` : "" + }` ) .then(({ data }) => data) .catch((err) => { @@ -495,7 +718,10 @@ const getAuthorTag = (subOrgId, page, size, query, column, orderBy) => const createAuthorTag = (subOrgId, values) => httpService - .post(`${apiVersion}/suborganizations/${subOrgId}/author-tags`, values) + .post( + `${apiVersion}/suborganizations/${subOrgId}/author-tags`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -504,7 +730,10 @@ const createAuthorTag = (subOrgId, values) => const updateAuthorTag = (subOrgId, id, values) => httpService - .put(`${apiVersion}/suborganizations/${subOrgId}/author-tags/${id}`, values) + .put( + `${apiVersion}/suborganizations/${subOrgId}/author-tags/${id}`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -513,18 +742,33 @@ const updateAuthorTag = (subOrgId, id, values) => const deleteAuthorTag = (subOrgId, id) => httpService - .remove(`${apiVersion}/suborganizations/${subOrgId}/author-tags/${id}`) + .remove( + `${apiVersion}/suborganizations/${subOrgId}/author-tags/${id}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); return Promise.reject(); }); -const getActivityLayout = (subOrgId, page, size, query, column, orderBy) => +const getActivityLayout = ( + subOrgId, + page, + size, + query, + column, + orderBy +) => httpService .get( - `${apiVersion}/suborganizations/${subOrgId}/activity-layouts${page ? `?page=${page}` : ''}${size ? `&size=${size}` : ''}${query ? `&query=${query.replace(/#/, '%23')}` : ''} - ${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''}`, + `${apiVersion}/suborganizations/${subOrgId}/activity-layouts${ + page ? `?page=${page}` : "" + }${size ? `&size=${size}` : ""}${ + query ? `&query=${query.replace(/#/, "%23")}` : "" + } + ${column ? `&order_by_column=${column}` : ""}${ + orderBy ? `&order_by_type=${orderBy}` : "" + }` ) .then(({ data }) => data) .catch((err) => { @@ -533,7 +777,10 @@ const getActivityLayout = (subOrgId, page, size, query, column, orderBy) => const createActivityLayout = (subOrgId, values) => httpService - .post(`${apiVersion}/suborganizations/${subOrgId}/activity-layouts`, values) + .post( + `${apiVersion}/suborganizations/${subOrgId}/activity-layouts`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -542,7 +789,10 @@ const createActivityLayout = (subOrgId, values) => const updateActivityLayout = (subOrgId, id, values) => httpService - .put(`${apiVersion}/suborganizations/${subOrgId}/activity-layouts/${id}`, values) + .put( + `${apiVersion}/suborganizations/${subOrgId}/activity-layouts/${id}`, + values + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -551,7 +801,9 @@ const updateActivityLayout = (subOrgId, id, values) => const deleteActivityLayout = (subOrgId, id) => httpService - .remove(`${apiVersion}/suborganizations/${subOrgId}/activity-layouts/${id}`) + .remove( + `${apiVersion}/suborganizations/${subOrgId}/activity-layouts/${id}` + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); @@ -559,13 +811,22 @@ const deleteActivityLayout = (subOrgId, id) => }); // eslint-disable-next-line camelcase -const teamsActionAdminPanel = (subOrgId, query, page, size, order_by_column = '', order_by_type = '') => +const teamsActionAdminPanel = ( + subOrgId, + query, + page, + size, + order_by_column = "", + order_by_type = "" +) => httpService // eslint-disable-next-line camelcase .get( - `${apiVersion}/suborganization/${subOrgId}/get-admin-teams?size=${size}${query ? `&query=${query}` : ''}${page ? `&page=${page}` : ''}${ - order_by_column ? `&order_by_column=${order_by_column}` : '' - }${order_by_type ? `&order_by_type=${order_by_type}` : ''}`, + `${apiVersion}/suborganization/${subOrgId}/get-admin-teams?size=${size}${ + query ? `&query=${query}` : "" + }${page ? `&page=${page}` : ""}${ + order_by_column ? `&order_by_column=${order_by_column}` : "" + }${order_by_type ? `&order_by_type=${order_by_type}` : ""}` ) .then(({ data }) => data) .catch((err) => { @@ -591,21 +852,35 @@ const getOrgMediaSource = (orgId) => //update org media source const updateOrgMediaSource = (subOrgId, media_source_ids) => httpService - .put(`${apiVersion}/suborganizations/${subOrgId}/update-media-sources`, { - media_source_ids: media_source_ids, - }) + .put( + `${apiVersion}/suborganizations/${subOrgId}/update-media-sources`, + { + media_source_ids: media_source_ids, + } + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); return Promise.reject(); }); -const getMediaSources = (subOrgId, page, size, query, column, orderBy) => +const getMediaSources = ( + subOrgId, + page, + size, + query, + column, + orderBy +) => httpService .get( - `${apiVersion}/suborganizations/${subOrgId}/media-sources${page ? `?page=${page}` : ''}${size ? `&size=${size}` : ''}${!page && !size ? `?skipPagination=${true}` : ''}${ - query ? `&query=${query.replace(/#/, '%23')}` : '' - } - ${column ? `&order_by_column=${column}` : ''}${orderBy ? `&order_by_type=${orderBy}` : ''}`, + `${apiVersion}/suborganizations/${subOrgId}/media-sources${ + page ? `?page=${page}` : "" + }${size ? `&size=${size}` : ""}${ + !page && !size ? `?skipPagination=${true}` : "" + }${query ? `&query=${query.replace(/#/, "%23")}` : ""} + ${column ? `&order_by_column=${column}` : ""}${ + orderBy ? `&order_by_type=${orderBy}` : "" + }` ) .then(({ data }) => data) .catch((err) => { @@ -614,7 +889,11 @@ const getMediaSources = (subOrgId, page, size, query, column, orderBy) => const gettAllDynamicPermisison = (subOrgId, roleId, add) => httpService - .get(`/${apiVersion}/suborganizations/${subOrgId}/role/${roleId}/permissions${add ? '?view=all' : ''}`) + .get( + `/${apiVersion}/suborganizations/${subOrgId}/role/${roleId}/permissions${ + add ? "?view=all" : "" + }` + ) .then(({ data }) => data) .catch((err) => { // errorCatcher(err.response.data); @@ -622,7 +901,10 @@ const gettAllDynamicPermisison = (subOrgId, roleId, add) => }); const updateAllDynamicPermisison = (subOrgId, data) => httpService - .put(`/${apiVersion}/suborganizations/${subOrgId}/update-role-ui-permissions`, data) + .put( + `/${apiVersion}/suborganizations/${subOrgId}/update-role-ui-permissions`, + data + ) .then(({ data }) => data) .catch((err) => { errorCatcher(err.response.data); From 3450aa3c981e4bcc5fdbdd4d485a129476efb82e Mon Sep 17 00:00:00 2001 From: "DESKTOP-V9B7HMN\\TK-LPT-0358" Date: Fri, 10 Mar 2023 16:07:19 +0500 Subject: [PATCH 05/62] playlist screen in projects reponsive fix for msteams --- src/containers/Playlists/index.js | 6 +++++- src/containers/Playlists/style.scss | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/containers/Playlists/index.js b/src/containers/Playlists/index.js index 556a9c001..d7776875c 100755 --- a/src/containers/Playlists/index.js +++ b/src/containers/Playlists/index.js @@ -111,6 +111,10 @@ function PlaylistsPage(props) { const [uploadImageStatus, setUploadImageStatus] = useState(false); const [projectPlaylistPublishtoCanvas, setprojectPlaylistPublishtoCanvas] = useState(false); const { screenState } = useSelector((s) => s.myactivities); + const hideShowSideBar = useSelector( + (state) => state.msTeams.toggle_sidebar + ); + const isMsTeam = useSelector((state) => state.msTeams.is_msteam); const { match, @@ -546,7 +550,7 @@ function PlaylistsPage(props) { /> ) : ( -
+
Date: Fri, 10 Mar 2023 16:12:30 +0500 Subject: [PATCH 06/62] playlist screen in projects, toggle sidebar animate style for msteams --- src/containers/Playlists/style.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/containers/Playlists/style.scss b/src/containers/Playlists/style.scss index bf74395ac..b49591d5f 100644 --- a/src/containers/Playlists/style.scss +++ b/src/containers/Playlists/style.scss @@ -4,6 +4,10 @@ .content-wrapper { margin-left: 136px; padding: 25px; + -webkit-transition: all 1s ease-out; + -moz-transition: all 1s ease-out; + -o-transition: all 1s ease-out; + transition: all 1s ease-out; } #board { From f4b1100b614ea61cd45d1a9799ff1c57ac8981e5 Mon Sep 17 00:00:00 2001 From: aqibnwaz Date: Mon, 13 Mar 2023 15:55:42 +0500 Subject: [PATCH 07/62] add updated lti feature --- src/containers/Admin/table.js | 69 ++++++++++++++--------------------- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/src/containers/Admin/table.js b/src/containers/Admin/table.js index 6afa31a62..bc954caa4 100644 --- a/src/containers/Admin/table.js +++ b/src/containers/Admin/table.js @@ -1860,29 +1860,16 @@ function Table(props) { subType === "LTI Tools" && (localStateData ? ( localStateData?.length > 0 ? ( - localStateData - ?.filter((item) => { - if (filterLtiSettings) { - if ( - item?.media_sources?.name === - filterLtiSettings?.name - ) { - return item; - } - } else { - return item; - } - }) - ?.map((row, counter) => ( - - {row.tool_name} - {row.tool_url} - - {row.lti_tool_type - ? row.lti_tool_type?.name - : "N/A"} - - {/* {!filterLtiSettings ? ( + localStateData?.map((row, counter) => ( + + {row.tool_name} + {row.tool_url} + + {row.lti_tool_type + ? row.lti_tool_type?.name + : "N/A"} + + {/* {!filterLtiSettings ? ( {row?.media_sources?.name} ) : ( @@ -1895,25 +1882,25 @@ function Table(props) { )} */} - {/* {`${row.user.first_name} ${row.user.last_name}`} */} - {row.tool_description} - -
- {row.lti_version} -
- -
+ {/* {`${row.user.first_name} ${row.user.last_name}`} */} + {row.tool_description} + +
+ {row.lti_version} +
+
- - - )) +
+ + + )) ) : ( From 48d0b90b155bd2959a0ff4ed12e98fcd97031463 Mon Sep 17 00:00:00 2001 From: aqibnwaz Date: Mon, 13 Mar 2023 17:20:26 +0500 Subject: [PATCH 08/62] fix xapi response text --- src/store/actions/indActivities.js | 170 +++++++++++++++++++---------- 1 file changed, 110 insertions(+), 60 deletions(-) diff --git a/src/store/actions/indActivities.js b/src/store/actions/indActivities.js index bf8eeadc9..b6c39f30c 100644 --- a/src/store/actions/indActivities.js +++ b/src/store/actions/indActivities.js @@ -1,14 +1,21 @@ /* eslint-disable */ -import { toast } from 'react-toastify'; -import Swal from 'sweetalert2'; +import { toast } from "react-toastify"; +import Swal from "sweetalert2"; -import resourceService from 'services/resource.service'; -import indResourceService from 'services/indActivities.service'; -import store from '../index'; -import * as actionTypes from '../actionTypes'; +import resourceService from "services/resource.service"; +import indResourceService from "services/indActivities.service"; +import store from "../index"; +import * as actionTypes from "../actionTypes"; -export const createIndResourceAction = (metadata, hide, accountId, settingId, redirecttoactivity, fullWidth) => async (dispatch) => { +export const createIndResourceAction = ( + metadata, + hide, + accountId, + settingId, + redirecttoactivity, + fullWidth +) => async (dispatch) => { const centralizedState = store.getState(); const { organization: { activeOrganization }, @@ -16,17 +23,17 @@ export const createIndResourceAction = (metadata, hide, accountId, settingId, re const data = { library: window.h5peditorCopy.getLibrary(), parameters: JSON.stringify(window.h5peditorCopy.getParams()), - action: 'create', + action: "create", brightcove_account_id: accountId || undefined, brightcove_api_setting_id: settingId || undefined, }; - toast.info('Creating new Activity ...', { - className: 'project-loading', + toast.info("Creating new Activity ...", { + className: "project-loading", closeOnClick: false, closeButton: false, position: toast.POSITION.BOTTOM_RIGHT, autoClose: 100000, - icon: '', + icon: "", }); const insertedH5pResource = await resourceService.h5pToken(data); if (!insertedH5pResource.fail) { @@ -35,10 +42,10 @@ export const createIndResourceAction = (metadata, hide, accountId, settingId, re const activity = { h5p_content_id: resource.id, thumb_url: metadata?.thumb_url, - action: 'create', + action: "create", title: metadata?.title, - type: 'h5p', - content: 'place_holder', + type: "h5p", + content: "place_holder", subject_id: metadata?.subject_id, education_level_id: metadata?.education_level_id, author_tag_id: metadata?.author_tag_id, @@ -48,11 +55,16 @@ export const createIndResourceAction = (metadata, hide, accountId, settingId, re organization_visibility_type_id: 1, }; - const result = await indResourceService.create(activeOrganization.id, activity); - const resultShared = await indResourceService.sharedIndependentActivity(insertedH5pResource.id); - window.top.postMessage(resultShared, 'http://127.0.0.1:5501'); + const result = await indResourceService.create( + activeOrganization.id, + activity + ); + const resultShared = await indResourceService.sharedIndependentActivity( + insertedH5pResource.id + ); + window.top.postMessage(resultShared, "http://127.0.0.1:5501"); toast.dismiss(); - toast.success('Activity Created', { + toast.success("Activity Created", { position: toast.POSITION.BOTTOM_RIGHT, autoClose: 4000, }); @@ -60,7 +72,7 @@ export const createIndResourceAction = (metadata, hide, accountId, settingId, re if (fullWidth) { setTimeout(() => { Swal.fire({ - title: 'We can close the window here now', + title: "We can close the window here now", showConfirmButton: false, showCancelButton: false, }); @@ -68,19 +80,19 @@ export const createIndResourceAction = (metadata, hide, accountId, settingId, re } else { dispatch({ type: actionTypes.ADD_IND_ACTIVITIES, - payload: result['independent-activity'], + payload: result["independent-activity"], }); hide(); dispatch({ type: actionTypes.SET_ACTIVE_ACTIVITY_SCREEN, - payload: '', + payload: "", }); dispatch({ - type: 'ADD_VIDEO_URL', - payload: '', + type: "ADD_VIDEO_URL", + payload: "", }); if (redirecttoactivity) { - window.location.href = '/'; + window.location.href = "/"; } } } @@ -100,11 +112,18 @@ export const createIndResourceAction = (metadata, hide, accountId, settingId, re // }); // } // }; -export const allIndActivity = (orgId, page, size, search) => async (dispatch) => { +export const allIndActivity = (orgId, page, size, search) => async ( + dispatch +) => { dispatch({ type: actionTypes.ALL_IND_ACTIVITIES_REQUEST, }); - const allActivities = await indResourceService.allIndActivity(orgId, page, size, search); + const allActivities = await indResourceService.allIndActivity( + orgId, + page, + size, + search + ); // console.log("allActivities", allActivities); if (allActivities) { if (page > 1) { @@ -130,8 +149,22 @@ export const allIndActivity = (orgId, page, size, search) => async (dispatch) => return allActivities; }; -export const allAdminExportActivity = (orgId, page, size, search, column, orderBy) => async (dispatch) => { - const allActivities = await indResourceService.allAdminExportActivity(orgId, page, size, search, column, orderBy); +export const allAdminExportActivity = ( + orgId, + page, + size, + search, + column, + orderBy +) => async (dispatch) => { + const allActivities = await indResourceService.allAdminExportActivity( + orgId, + page, + size, + search, + column, + orderBy + ); // console.log("allActivities", allActivities); if (allActivities) { dispatch({ @@ -146,15 +179,20 @@ export const allAdminExportActivity = (orgId, page, size, search, column, orderB } }; -export const deleteIndActivity = (activityId, admin) => async (dispatch) => { +export const deleteIndActivity = (activityId, admin) => async ( + dispatch +) => { const centralizedState = store.getState(); const { organization: { activeOrganization }, } = centralizedState; - const allActivities = await indResourceService.deleteIndActivity(activeOrganization.id, activityId); + const allActivities = await indResourceService.deleteIndActivity( + activeOrganization.id, + activityId + ); if (allActivities.message) { Swal.fire({ - icon: 'success', + icon: "success", html: allActivities.message, }); if (admin) { @@ -171,23 +209,31 @@ export const deleteIndActivity = (activityId, admin) => async (dispatch) => { } }; -export const editIndActivityItem = (activityId, data, admin) => async (dispatch) => { +export const editIndActivityItem = ( + activityId, + data, + admin +) => async (dispatch) => { const centralizedState = store.getState(); const { organization: { activeOrganization }, } = centralizedState; - toast.info('Updating Activity ...', { - className: 'project-loading', + toast.info("Updating Activity ...", { + className: "project-loading", closeOnClick: false, closeButton: false, position: toast.POSITION.BOTTOM_RIGHT, autoClose: 100000, - icon: '', + icon: "", }); - const editActivities = await indResourceService.editIndActivityItem(activeOrganization.id, data, activityId); + const editActivities = await indResourceService.editIndActivityItem( + activeOrganization.id, + data, + activityId + ); toast.dismiss(); - toast.success('Activity Updated', { + toast.success("Activity Updated", { position: toast.POSITION.BOTTOM_RIGHT, autoClose: 4000, }); @@ -195,12 +241,12 @@ export const editIndActivityItem = (activityId, data, admin) => async (dispatch) if (admin) { dispatch({ type: actionTypes.EDIT_ADMIN_IND_ACTIVITIES, - payload: editActivities['independent-activity'], + payload: editActivities["independent-activity"], }); } else { dispatch({ type: actionTypes.EDIT_IND_ACTIVITIES, - payload: editActivities['independent-activity'], + payload: editActivities["independent-activity"], }); } } @@ -211,15 +257,15 @@ export const adminIntActivities = ( page, size, searchQueryProject, - column = '', - orderBy = '', + column = "", + orderBy = "", authorId, createdFrom, createdTo, updatedFrom, updatedTo, shared, - index, + index ) => async (dispatch) => { const allActivities = await indResourceService.allAdminIntActivities( orgId, @@ -234,7 +280,7 @@ export const adminIntActivities = ( updatedFrom, updatedTo, shared, - index, + index ); if (allActivities) { dispatch({ @@ -249,78 +295,82 @@ export const adminIntActivities = ( } }; export const shareEnableLink = (id, admin) => async (dispatch) => { - toast.info('Updating Activity ...', { - className: 'project-loading', + toast.info("Exporting Activity ...", { + className: "project-loading", closeOnClick: false, closeButton: false, position: toast.POSITION.BOTTOM_RIGHT, autoClose: 100000, - icon: '', + icon: "", }); const result = await indResourceService.shareEnable(id); toast.dismiss(); - toast.success('Activity Updated', { + toast.success("Activity (xApi) is downloaded", { position: toast.POSITION.BOTTOM_RIGHT, autoClose: 4000, }); if (admin) { dispatch({ type: actionTypes.EDIT_ADMIN_IND_ACTIVITIES, - payload: result?.['independent-activity'], + payload: result?.["independent-activity"], }); } else { dispatch({ type: actionTypes.EDIT_IND_ACTIVITIES, - payload: result['independent-activity'], + payload: result["independent-activity"], }); } return result; }; export const shareDisableLink = (id, admin) => async (dispatch) => { - toast.info('Updating Activity ...', { - className: 'project-loading', + toast.info("Updating Activity ...", { + className: "project-loading", closeOnClick: false, closeButton: false, position: toast.POSITION.BOTTOM_RIGHT, autoClose: 100000, - icon: '', + icon: "", }); const result = await indResourceService.shareDisable(id); toast.dismiss(); - toast.success('Activity Updated', { + toast.success("Activity Updated", { position: toast.POSITION.BOTTOM_RIGHT, autoClose: 4000, }); if (admin) { dispatch({ type: actionTypes.EDIT_ADMIN_IND_ACTIVITIES, - payload: result?.['independent-activity'], + payload: result?.["independent-activity"], }); } else { dispatch({ type: actionTypes.EDIT_IND_ACTIVITIES, - payload: result['independent-activity'], + payload: result["independent-activity"], }); } return result; }; export const getIndex = (id, index, admin) => async (dispatch) => { - toast.info('Updating Activity ...', { - className: 'project-loading', + toast.info("Updating Activity ...", { + className: "project-loading", closeOnClick: false, closeButton: false, position: toast.POSITION.BOTTOM_RIGHT, autoClose: 100000, - icon: '', + icon: "", }); let result; if (admin) { - result = await indResourceService.getIndex(id, index.indexing, admin); + result = await indResourceService.getIndex( + id, + index.indexing, + admin + ); } else { result = await indResourceService.getIndex(id, index); } - console.log('Reslt index', result); + console.log("Reslt index", result); toast.dismiss(); if (result.message) { From 8258dfb61ec70a00ed9443191673324c292115f1 Mon Sep 17 00:00:00 2001 From: "DESKTOP-V9B7HMN\\TK-LPT-0358" Date: Tue, 14 Mar 2023 15:37:20 +0500 Subject: [PATCH 09/62] Teams pages responsive issue fix --- src/containers/Teams/TeamAddProjects/index.js | 4 +++- src/containers/Teams/TeamAddProjects/style.scss | 7 ++++++- src/containers/Teams/TeamDetailView/index.js | 4 +++- src/containers/Teams/TeamDetailView/style.scss | 7 ++++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/containers/Teams/TeamAddProjects/index.js b/src/containers/Teams/TeamAddProjects/index.js index b7582813f..62931ead4 100644 --- a/src/containers/Teams/TeamAddProjects/index.js +++ b/src/containers/Teams/TeamAddProjects/index.js @@ -31,6 +31,8 @@ const AddTeamProjects = (props) => { const projectReduxState = useSelector((state) => state.project); const { teamPermission } = useSelector((state) => state.team); const [searchQuery, setsearchQuery] = useState(''); + const hideShowSideBar = useSelector((state) => state.msTeams.toggle_sidebar); + const isMsTeam = useSelector((state) => state.msTeams.is_msteam); // use effect to redirect user to team page if newTeam is not found useEffect(() => { if (location.pathname.includes('/teams/add-projects') && !newTeam?.name && organization?.domain) { @@ -97,7 +99,7 @@ const AddTeamProjects = (props) => { }; return (
-
+
diff --git a/src/containers/Teams/TeamAddProjects/style.scss b/src/containers/Teams/TeamAddProjects/style.scss index 81694f082..68efe20bb 100644 --- a/src/containers/Teams/TeamAddProjects/style.scss +++ b/src/containers/Teams/TeamAddProjects/style.scss @@ -74,7 +74,12 @@ position: relative; overflow: visible; padding: 16px 24px; - margin-left: 136px !important; + margin-left: 136px; + margin-top: 0px !important; + -webkit-transition: all 1s ease-out; + -moz-transition: all 1s ease-out; + -o-transition: all 1s ease-out; + transition: all 1s ease-out; margin-top: 0px !important; .team-row { display: flex; diff --git a/src/containers/Teams/TeamDetailView/index.js b/src/containers/Teams/TeamDetailView/index.js index fddb89dc7..807be6194 100644 --- a/src/containers/Teams/TeamDetailView/index.js +++ b/src/containers/Teams/TeamDetailView/index.js @@ -83,6 +83,8 @@ const TeamDetail = ({ const [createProject, setCreateProject] = useState(false); const [showInvite, setShowInvite] = useState(false); const [toggleLeft, setToggleLeft] = useState(false); + const hideShowSideBar = useSelector((state) => state.msTeams.toggle_sidebar); + const isMsTeam = useSelector((state) => state.msTeams.is_msteam); const authUser = team?.users?.filter((u) => u.id === (user || {}).id); useEffect(() => { @@ -359,7 +361,7 @@ const TeamDetail = ({ const secondaryColor = getGlobalColor('--main-secondary-color'); return (
-
+
diff --git a/src/containers/Teams/TeamDetailView/style.scss b/src/containers/Teams/TeamDetailView/style.scss index b6113997a..d660422b1 100644 --- a/src/containers/Teams/TeamDetailView/style.scss +++ b/src/containers/Teams/TeamDetailView/style.scss @@ -211,7 +211,12 @@ position: relative; overflow: visible; padding: 16px 24px; - margin-left: 136px !important; + margin-left: 136px; + margin-top: 0px !important; + -webkit-transition: all 1s ease-out; + -moz-transition: all 1s ease-out; + -o-transition: all 1s ease-out; + transition: all 1s ease-out; margin-top: 0px !important; .team-row { display: flex; From 4cd06be4abfbc60268b5fa7123114670f143953a Mon Sep 17 00:00:00 2001 From: aqibnwaz Date: Wed, 15 Mar 2023 14:12:35 +0500 Subject: [PATCH 10/62] fix ms team feedback --- src/components/FileInputDnd/index.js | 36 ++-- src/components/Header/index.js | 160 ++++++++++++------ .../UploadCoursePresentation/index.js | 37 ++-- 3 files changed, 160 insertions(+), 73 deletions(-) diff --git a/src/components/FileInputDnd/index.js b/src/components/FileInputDnd/index.js index f10629083..64fbe8f39 100644 --- a/src/components/FileInputDnd/index.js +++ b/src/components/FileInputDnd/index.js @@ -1,10 +1,10 @@ /* eslint-disable */ -import React, { useRef } from 'react'; +import React, { useRef } from "react"; import UploadImg from "assets/images/upload1.png"; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import './style.scss'; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import "./style.scss"; -const FileInputDnd = ({ handleChange, acceptFormats }) => { +const FileInputDnd = ({ handleChange, acceptFormats, fileError }) => { const inputRef = useRef(null); const areaClick = (e) => { @@ -23,27 +23,43 @@ const FileInputDnd = ({ handleChange, acceptFormats }) => { const handleFileChange = (e) => { handleChange(e.target.files[0]); }; - + const handleDrag = (e) => { e.preventDefault(); }; return ( <> -
+
- Cloud upload image + Cloud upload image

Drag & drop file or browse to upload

- + + {fileError && ( +
+ {fileError} +
+ )} ); }; -export default FileInputDnd; \ No newline at end of file +export default FileInputDnd; diff --git a/src/components/Header/index.js b/src/components/Header/index.js index 0c3e11d36..c3dce550e 100755 --- a/src/components/Header/index.js +++ b/src/components/Header/index.js @@ -1,28 +1,28 @@ /* eslint-disable */ -import React, { useEffect, useState } from 'react'; -import PropTypes from 'prop-types'; -import { connect, useSelector, useDispatch } from 'react-redux'; -import { Link } from 'react-router-dom'; -import { Dropdown } from 'react-bootstrap'; - -import { SHOW_HELP } from 'store/actionTypes'; -import { logoutAction } from 'store/actions/auth'; -import { toggleSideBar } from 'store/actions/msTeams'; -import { Event } from 'trackers/ga'; - -import HeaderNotification from './notification'; -import MultitenancyDropdown from './multitenancyDropdown'; - -import './style.scss'; -import { getGlobalColor } from 'containers/App/DynamicBrandingApply'; -import HelpSvg from 'iconLibrary/header/HelpSvg'; -import EditMdSvg from 'iconLibrary/mainContainer/EditMdSvg'; -import ChangePasswordMdSvg from 'iconLibrary/header/ChangePasswordMdSvg'; -import LogoutMdSvg from 'iconLibrary/header/LogoutMdSvg'; -import HeaderHambergSvg from 'iconLibrary/header/HeaderHambergSvg'; -import Forum from 'iconLibrary/header/Forum'; -import Community from 'iconLibrary/header/Community'; -import Group from 'iconLibrary/header/Group'; +import React, { useEffect, useState } from "react"; +import PropTypes from "prop-types"; +import { connect, useSelector, useDispatch } from "react-redux"; +import { Link } from "react-router-dom"; +import { Dropdown } from "react-bootstrap"; +import Swal from "sweetalert2"; +import { SHOW_HELP } from "store/actionTypes"; +import { logoutAction } from "store/actions/auth"; +import { toggleSideBar } from "store/actions/msTeams"; +import { Event } from "trackers/ga"; + +import HeaderNotification from "./notification"; +import MultitenancyDropdown from "./multitenancyDropdown"; + +import "./style.scss"; +import { getGlobalColor } from "containers/App/DynamicBrandingApply"; +import HelpSvg from "iconLibrary/header/HelpSvg"; +import EditMdSvg from "iconLibrary/mainContainer/EditMdSvg"; +import ChangePasswordMdSvg from "iconLibrary/header/ChangePasswordMdSvg"; +import LogoutMdSvg from "iconLibrary/header/LogoutMdSvg"; +import HeaderHambergSvg from "iconLibrary/header/HeaderHambergSvg"; +import Forum from "iconLibrary/header/Forum"; +import Community from "iconLibrary/header/Community"; +import Group from "iconLibrary/header/Group"; function Header(props) { const { logout, toggleMenuSideBar } = props; const dispatch = useDispatch(); @@ -30,10 +30,14 @@ function Header(props) { const { user } = useSelector((state) => state.auth); const { currentOrganization } = stateHeader; const [primaryColor, setPrimaryColor] = useState(); - const hideShowSideBar = useSelector((state) => state.msTeams.toggle_sidebar); + const hideShowSideBar = useSelector( + (state) => state.msTeams.toggle_sidebar + ); const isMsTeam = useSelector((state) => state.msTeams.is_msteam); useEffect(() => { - const primaryColorFunction = getGlobalColor('--main-primary-color'); + const primaryColorFunction = getGlobalColor( + "--main-primary-color" + ); setPrimaryColor(primaryColorFunction); }, [currentOrganization]); @@ -46,21 +50,36 @@ function Header(props) {
- {isMsTeam == true && - toggleMenuSideBar(!hideShowSideBar)} className={`${hideShowSideBar == false ? 'expand-hamberg' : ''}`}> - } + {isMsTeam == true && ( + toggleMenuSideBar(!hideShowSideBar)} + className={`${ + hideShowSideBar == false ? "expand-hamberg" : "" + }`} + > + + + )}
- +
@@ -72,7 +91,7 @@ function Header(props) {
  • -
  • + {/*
  • @@ -80,14 +99,20 @@ function Header(props) { - +
    Groups
    - +
    Forums @@ -95,18 +120,29 @@ function Header(props) { -
  • + */}
  • { - // dispatch({ - // type: SHOW_HELP, - // payload: true, - // }); - // }} - href="https://www.currikistudio.org/help/" - target="_blank" + style={{ cursor: "pointer", textAlign: "center" }} + onClick={() => { + Swal.fire({ + title: "Are you Sure?", + text: "You will be redirect out of the tab!", + showCancelButton: true, + confirmButtonText: "OK", + }).then((result) => { + if (result.isConfirmed) { + window.open( + "https://www.currikistudio.org/help/", + "_blank" + ); + } else if (result.isDenied) { + Swal.close(); + } + }); + }} + // href="https://www.currikistudio.org/help/" + // target="_blank" > @@ -119,7 +155,10 @@ function Header(props) {
  • -
    +
    {user?.first_name[0]}

    Profile

    @@ -127,7 +166,10 @@ function Header(props) {
    -
    +
    {user?.first_name[0]}
    @@ -142,21 +184,29 @@ function Header(props) {

    - +
    My Account
    - +
    {/* changePassword */} - + Change Password
    @@ -164,7 +214,11 @@ function Header(props) { { - Event('button click', 'User press Logout button', 'Login Page'); + Event( + "button click", + "User press Logout button", + "Login Page" + ); logout(); }} > diff --git a/src/containers/MyActivity/AddCoursePresentation/UploadCoursePresentation/index.js b/src/containers/MyActivity/AddCoursePresentation/UploadCoursePresentation/index.js index 846c12c2b..8cc8582d5 100644 --- a/src/containers/MyActivity/AddCoursePresentation/UploadCoursePresentation/index.js +++ b/src/containers/MyActivity/AddCoursePresentation/UploadCoursePresentation/index.js @@ -1,27 +1,44 @@ /* eslint-disable */ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState } from "react"; import FileUploadDnd from "components/FileInputDnd"; -import FilePreviewAndStore from '../FilePreviewAndStore'; +import FilePreviewAndStore from "../FilePreviewAndStore"; -const UploadCoursePresentation = ({ setEnableDescribeBtn, setLoading }) => { +const UploadCoursePresentation = ({ + setEnableDescribeBtn, + setLoading, +}) => { const [selectedFile, setSelectedFile] = useState(null); - + const [fileError, setfileError] = useState(""); const handleFileChange = (file) => { - setSelectedFile(file); + if (file?.type === "application/pdf") { + setSelectedFile(file); + setfileError(""); + } else { + setfileError("File Format not Supported"); + setSelectedFile(null); + } }; return (
    -
    -
    - +
    +
    +
    - +
    ); }; -export default UploadCoursePresentation; \ No newline at end of file +export default UploadCoursePresentation; From ce391fa7305eee07be9cc146feeea7f525a54936 Mon Sep 17 00:00:00 2001 From: Antonio Etayo Date: Wed, 15 Mar 2023 09:18:49 -0400 Subject: [PATCH 11/62] Bugfix to aspect ratio scaling during pdf import for course presentation --- .../AddCoursePresentation/FilePreviewAndStore/index.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/containers/MyActivity/AddCoursePresentation/FilePreviewAndStore/index.js b/src/containers/MyActivity/AddCoursePresentation/FilePreviewAndStore/index.js index 33edf4b78..2bb728595 100644 --- a/src/containers/MyActivity/AddCoursePresentation/FilePreviewAndStore/index.js +++ b/src/containers/MyActivity/AddCoursePresentation/FilePreviewAndStore/index.js @@ -36,16 +36,15 @@ const FilePreviewAndStore = ({ file, setEnableDescribeBtn, setLoading }) => { var render_context = { canvasContext: ctx, viewport: viewport, - background: 'black', }; var renderTask = page.render(render_context); renderTask.promise.then(() => { // adding black bars ctx.drawImage(ctx.canvas, 0, 0, canvas.width-blackBarWidth, canvas.height, blackBarWidth, 0, canvas.width-blackBarWidth, canvas.height); - ctx.beginPath(); - ctx.rect(0, 0, blackBarWidth, canvas.height); ctx.fillStyle = "black"; - ctx.fill(); + ctx.fillRect(0, 0, blackBarWidth, canvas.height); + ctx.fillRect(ctx.canvas.width - blackBarWidth, 0, blackBarWidth, canvas.height); + setPreviewImageSource(canvas.toDataURL('image/png')); setEnableDescribeBtn(true); setLoading(false); From 2f32bf1eeef1c62f4a239830bbb26feb9a3d984a Mon Sep 17 00:00:00 2001 From: AqibYounasAtTkxel <94671546+AqibYounasAtTkxel@users.noreply.github.com> Date: Thu, 16 Mar 2023 14:17:43 +0500 Subject: [PATCH 12/62] admin search query filter issue fixed --- src/containers/Admin/controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/containers/Admin/controller.js b/src/containers/Admin/controller.js index 1cfb5276b..55c5629f8 100644 --- a/src/containers/Admin/controller.js +++ b/src/containers/Admin/controller.js @@ -962,7 +962,7 @@ function Controller(props) { subTypeState === "All Users" && activeRole !== head.id ) { - setSearchQuery(""); + // setSearchQuery(""); setActiveRole(head.id); setActivePage(1); } From 361646cf611bea394fefc17e84df9afd5531a941 Mon Sep 17 00:00:00 2001 From: aqibnwaz Date: Thu, 16 Mar 2023 19:43:32 +0500 Subject: [PATCH 13/62] fix lti issue on media updation --- src/store/reducers/admin.js | 142 +++++++++++++++++++++++++----------- 1 file changed, 100 insertions(+), 42 deletions(-) diff --git a/src/store/reducers/admin.js b/src/store/reducers/admin.js index 13dd45d32..e4f9249ca 100644 --- a/src/store/reducers/admin.js +++ b/src/store/reducers/admin.js @@ -1,9 +1,9 @@ /* eslint-disable */ -import * as actionTypes from '../actionTypes'; +import * as actionTypes from "../actionTypes"; const INITIAL_STATE = { activeForm: null, loading: true, - activeTab: 'Organization', + activeTab: "Organization", activityTypes: [], activityItems: [], usersReport: [], @@ -34,7 +34,7 @@ const INITIAL_STATE = { orgLtiSettings: [], ltiToolsTypes: [], allIv: [], - selectedFIlterLti: '', + selectedFIlterLti: "", dynamicPermission: null, roleAddDynamicPermission: null, ltiToolsReloadStatus: false, @@ -51,7 +51,9 @@ export default (state = INITIAL_STATE, action) => { case actionTypes.SET_ALL_IV: return { ...state, - allIv: action.payload.filter((data) => data.name?.includes('InteractiveVideo')), + allIv: action.payload.filter((data) => + data.name?.includes("InteractiveVideo") + ), }; case actionTypes.SET_ALL_PERMISSION: return { @@ -63,7 +65,12 @@ export default (state = INITIAL_STATE, action) => { ...state, [action.reducer]: { ...state[action.reducer], - meta: { ...state[action.reducer]?.meta, total: state[action.reducer]?.meta?.total + action.payload, to: state[action.reducer]?.meta?.to + action.payload }, + meta: { + ...state[action.reducer]?.meta, + total: + state[action.reducer]?.meta?.total + action.payload, + to: state[action.reducer]?.meta?.to + action.payload, + }, }, }; @@ -108,10 +115,15 @@ export default (state = INITIAL_STATE, action) => { editUser: action.payload, }; case actionTypes.LOAD_RESOURCE_ITEMS_REQUEST: - const refreshActivityItems = state.activityItems.data.filter((data) => data.id !== action.payload); + const refreshActivityItems = state.activityItems.data.filter( + (data) => data.id !== action.payload + ); return { ...state, - activityItems: { ...state.activityItems, data: refreshActivityItems }, + activityItems: { + ...state.activityItems, + data: refreshActivityItems, + }, }; case actionTypes.GET_ACTIVITY_TYPES: return { @@ -223,21 +235,31 @@ export default (state = INITIAL_STATE, action) => { }, }; case actionTypes.DEL_BRIGHTCOVE: - const newBrigthList = state.allbrightCove?.data.filter((data) => data.id !== action.payload); + const newBrigthList = state.allbrightCove?.data.filter( + (data) => data.id !== action.payload + ); return { ...state, - allbrightCove: { ...state.allbrightCove, data: newBrigthList }, + allbrightCove: { + ...state.allbrightCove, + data: newBrigthList, + }, }; case actionTypes.EDIT_BRIGHTCOVE: - const newBrigthListEdit = state.allbrightCove.data.map((data) => { - if (data.id === action.payload.id) { - return action.payload; + const newBrigthListEdit = state.allbrightCove.data.map( + (data) => { + if (data.id === action.payload.id) { + return action.payload; + } + return data; } - return data; - }); + ); return { ...state, - allbrightCove: { ...state.allbrightCove, data: newBrigthListEdit }, + allbrightCove: { + ...state.allbrightCove, + data: newBrigthListEdit, + }, }; case actionTypes.GET_TEAMS_ADMIN: return { @@ -260,32 +282,51 @@ export default (state = INITIAL_STATE, action) => { exportedActivities: action.payload, }; case actionTypes.EDIT_ADMIN_IND_ACTIVITIES: - const newIndActivityData = state.indActivities.data.map((data) => { - if (data.id === action.payload.id) { - return action.payload; + const newIndActivityData = state.indActivities.data.map( + (data) => { + if (data.id === action.payload.id) { + return action.payload; + } + return data; } - return data; - }); + ); return { ...state, - indActivities: { ...state.indActivities, data: newIndActivityData }, + indActivities: { + ...state.indActivities, + data: newIndActivityData, + }, }; case actionTypes.EDIT_INDEX_ADMIN_IND_ACTIVITIES: - const newIndIndexActivityData = state.indActivities.data.map((data) => { - if (data.id === action.activityId) { - return { ...data, indexing: action.payload.indexing, indexing_text: action.payload.indexing_text }; + const newIndIndexActivityData = state.indActivities.data.map( + (data) => { + if (data.id === action.activityId) { + return { + ...data, + indexing: action.payload.indexing, + indexing_text: action.payload.indexing_text, + }; + } + return data; } - return data; - }); + ); return { ...state, - indActivities: { ...state.indActivities, data: newIndIndexActivityData }, + indActivities: { + ...state.indActivities, + data: newIndIndexActivityData, + }, }; case actionTypes.DEL_ADMIN_IND_ACTIVITIES: - const delIndActivityData = state.indActivities.data.filter((data) => data.id !== action.payload); + const delIndActivityData = state.indActivities.data.filter( + (data) => data.id !== action.payload + ); return { ...state, - indActivities: { ...state.indActivities, data: delIndActivityData }, + indActivities: { + ...state.indActivities, + data: delIndActivityData, + }, }; case actionTypes.GET_ALL_MEDIA_SOURCE: @@ -300,9 +341,13 @@ export default (state = INITIAL_STATE, action) => { }; case actionTypes.GET_ORG_MEDIA_SOURCE: - const filterdata = action.payload.mediaSources?.filter((videoSource) => videoSource.media_type === 'Video'); + const filterdata = action.payload.mediaSources?.filter( + (videoSource) => videoSource.media_type === "Video" + ); const filteLti = state.orgLtiSettings.map((item) => { - const item2 = filterdata.find((t) => t.id === item.media_source_id)?.pivot; + const item2 = filterdata.find( + (t) => t.id === item.media_source_id + )?.pivot; return item2 ? { ...item, ...item2 } : item; }); return { @@ -311,12 +356,9 @@ export default (state = INITIAL_STATE, action) => { orgLtiSettings: filteLti, }; case actionTypes.UPDATE_ORG_MEDIA_SOURCE: - const updateLtiTools = action.payload.mediaSources?.filter((source) => source.media_type === 'Video'); - // const updateLtiTools = action.payload.mediaSources?.filter((source) => source.media_type === 'Video' && source.pivot.lti_tool_settings_status === true); return { ...state, orgMediaSources: action.payload, - ltiToolsTypes: updateLtiTools, }; case actionTypes.GET_MEDIA_SOURCES: @@ -345,16 +387,26 @@ export default (state = INITIAL_STATE, action) => { let setUpdateTotal = state.ltiTools.meta.total; let updatedTo = state.ltiTools.meta.to; // let updatedTo = state.ltiTools.meta.to != null ? state.ltiTools.meta.to : 0; - if (state.ltiTools.meta.to == null || state.ltiTools.meta.to == 0) { + if ( + state.ltiTools.meta.to == null || + state.ltiTools.meta.to == 0 + ) { reloadStatus = true; - } else if ((action.payload === 'INCREMENT' && !state.selectedFIlterLti) || (action.payload === 'INCREMENT' && state.selectedFIlterLti === parseInt(action.ltitoolType))) { + } else if ( + (action.payload === "INCREMENT" && + !state.selectedFIlterLti) || + (action.payload === "INCREMENT" && + state.selectedFIlterLti === parseInt(action.ltitoolType)) + ) { state.ltiTools.meta.total = setUpdateTotal + 1; if (updatedTo === setUpdateTotal) { state.ltiTools.meta.to = updatedTo + 1; } - } else if (action.payload == 'DECREMENT') { + } else if (action.payload == "DECREMENT") { state.ltiTools.meta.total = setUpdateTotal - 1; - state.ltiTools.data = state.ltiTools.data.filter((item) => item.id !== action.id); + state.ltiTools.data = state.ltiTools.data.filter( + (item) => item.id !== action.id + ); if (updatedTo === setUpdateTotal) { state.ltiTools.meta.to = updatedTo - 1; if (state.ltiTools.meta.to == 0) { @@ -362,15 +414,18 @@ export default (state = INITIAL_STATE, action) => { } else { reloadStatus = false; } - } else if (state.selectedFIlterLti == '' || state.selectedFIlterLti == null) { + } else if ( + state.selectedFIlterLti == "" || + state.selectedFIlterLti == null + ) { reloadStatus = true; } else { reloadStatus = true; } } else if ( - action.payload == 'DECREMENT_TYPE_CHANGED' && + action.payload == "DECREMENT_TYPE_CHANGED" && state.selectedFIlterLti != null && - state.selectedFIlterLti != '' && + state.selectedFIlterLti != "" && state.selectedFIlterLti != parseInt(action.ltitoolType) ) { state.ltiTools.meta.total = setUpdateTotal - 1; @@ -395,7 +450,10 @@ export default (state = INITIAL_STATE, action) => { // Add New Lti Tool in redux case actionTypes.LTI_TOOLS_ADD_NEW: - state.ltiTools.data = [action.payload, ...state?.ltiTools?.data]; + state.ltiTools.data = [ + action.payload, + ...state?.ltiTools?.data, + ]; return { ...state, ltiTools: { ...state.ltiTools }, From faf05072646573f552c92415a327f9ad3580dcdb Mon Sep 17 00:00:00 2001 From: Antonio Etayo Date: Mon, 20 Mar 2023 09:12:45 -0400 Subject: [PATCH 14/62] Bringing back the screen size warning --- src/containers/App/index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/containers/App/index.js b/src/containers/App/index.js index 05dc0ecc1..4b47b5817 100755 --- a/src/containers/App/index.js +++ b/src/containers/App/index.js @@ -149,15 +149,15 @@ function App(props) {
    )} - {/*
    {help && }
    ); From 4a4f327d3a5eacce44eafd8a80ae8e19c2aa44b3 Mon Sep 17 00:00:00 2001 From: Antonio Etayo Date: Mon, 20 Mar 2023 10:53:54 -0400 Subject: [PATCH 15/62] Remove the size warning when viewing deeplinking search and activities themselves --- src/containers/App/index.js | 46 ++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/containers/App/index.js b/src/containers/App/index.js index 4b47b5817..f827675cc 100755 --- a/src/containers/App/index.js +++ b/src/containers/App/index.js @@ -1,5 +1,5 @@ /* eslint-disable */ -import React, { useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { ToastContainer } from 'react-toastify'; import { connect, useDispatch, useSelector } from 'react-redux'; @@ -21,6 +21,7 @@ let runOnce = true; function App(props) { const dispatch = useDispatch(); const { getUser } = props; + const [ msTeams, setMsTeams ] = useState(true); useEffect(() => { getUser(); }, [getUser]); @@ -119,6 +120,13 @@ function App(props) { }, ]; } + + // Remove the screen size warning when entering through msteams into deeplinking or activity view + if ((window.location.href.includes('msteam') || window.location.href.includes('lti/content')) && !window.location.href.includes('sso')) { + setMsTeams(true); + } else { + setMsTeams(false); + } }, [window.location.href]); return ( @@ -149,24 +157,26 @@ function App(props) {
    )} -
    - - -
    -

    Please use desktop browser

    - -

    CurrikiStudio doesn’t support mobile for authors. To continue, we recommend that you use either a browser on a tablet, desktop or laptop computer.

    -

    - All activities built with CurrikiStudio are accessible on mobile for learners. However, in order for an author to build a truly - interactive, immersive learning experience, a full browser is required. -

    - -

    - To learn more click here - Curriki -

    + {!msTeams && ( +
    + + +
    +

    Please use desktop browser

    + +

    CurrikiStudio doesn’t support mobile for authors. To continue, we recommend that you use either a browser on a tablet, desktop or laptop computer.

    +

    + All activities built with CurrikiStudio are accessible on mobile for learners. However, in order for an author to build a truly + interactive, immersive learning experience, a full browser is required. +

    + +

    + To learn more click here + Curriki +

    +
    -
    + )} {help && }
    ); From 1fa65b7566296f40ec82dbee59721dbbb2b4a0fb Mon Sep 17 00:00:00 2001 From: "DESKTOP-V9B7HMN\\TK-LPT-0358" Date: Wed, 22 Mar 2023 16:41:54 +0500 Subject: [PATCH 16/62] Share playlist preview activity id undefined issue fix --- src/containers/Preview/PlaylistPreview/ActivityShared.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/containers/Preview/PlaylistPreview/ActivityShared.js b/src/containers/Preview/PlaylistPreview/ActivityShared.js index 37751b802..f9a9588ff 100644 --- a/src/containers/Preview/PlaylistPreview/ActivityShared.js +++ b/src/containers/Preview/PlaylistPreview/ActivityShared.js @@ -263,6 +263,7 @@ const ActivityShared = (props) => { Activity:   {selectedPlaylist?.activity.title} + {selectedPlaylist?.activity.id && (
    { setH5pCurrentActivity={() => setSelectedPlaylist()} />
    + )}
    From 10064752a2ea79dd46a392a4f8057cd94aba727f Mon Sep 17 00:00:00 2001 From: "DESKTOP-V9B7HMN\\TK-LPT-0358" Date: Fri, 24 Mar 2023 16:35:12 +0500 Subject: [PATCH 17/62] Next/previous button hide in case no activity found --- src/containers/Preview/PlaylistPreview/ActivityShared.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/containers/Preview/PlaylistPreview/ActivityShared.js b/src/containers/Preview/PlaylistPreview/ActivityShared.js index f9a9588ff..4bfa343be 100644 --- a/src/containers/Preview/PlaylistPreview/ActivityShared.js +++ b/src/containers/Preview/PlaylistPreview/ActivityShared.js @@ -265,6 +265,7 @@ const ActivityShared = (props) => { {selectedPlaylist?.activity.id && (
    + {typeof(selectedPlaylist?.playlist.activities[selectedPlaylist?.playlist?.activities?.findIndex((f) => f.id === selectedPlaylist?.activity.id) - 1]) !== "undefined" && { activtyPlaylist setH5pCurrentActivity={() => setSelectedPlaylist()} /> + } + {typeof (selectedPlaylist?.playlist.activities[selectedPlaylist?.playlist?.activities?.findIndex((f) => f.id === selectedPlaylist?.activity.id) + 1]) !== "undefined" && { activtyPlaylist setH5pCurrentActivity={() => setSelectedPlaylist()} /> + }
    )}
    From accedb8ce9e1d4d4b1ef3e0a16690cd39c4d70a1 Mon Sep 17 00:00:00 2001 From: Antonio Etayo Date: Fri, 24 Mar 2023 10:37:12 -0400 Subject: [PATCH 18/62] Refactoring of msteams code to work properly outside the msteams embed context --- .../DeepLinking/ActivitiesList/index.js | 33 ++--- .../LMS/Canvas/DeepLinking/Project/index.js | 35 +++--- .../LMS/MsTeams/MsTeamActivityLaunch/index.js | 16 ++- .../MsTeamActivityLaunchScreen/index.js | 53 +++----- .../MsTeams/MsTeamsActivityContainer/index.js | 116 ++++++++++++++++++ src/containers/MsTeams/callback.js | 40 +++--- src/helpers/xapi.js | 3 +- src/routers/AppRouter.js | 21 ++-- src/services/msTeams.service.js | 24 ++-- src/store/actions/msTeams.js | 4 +- 10 files changed, 228 insertions(+), 117 deletions(-) create mode 100644 src/containers/LMS/MsTeams/MsTeamsActivityContainer/index.js diff --git a/src/containers/LMS/Canvas/DeepLinking/ActivitiesList/index.js b/src/containers/LMS/Canvas/DeepLinking/ActivitiesList/index.js index ec5631344..be42e94ac 100644 --- a/src/containers/LMS/Canvas/DeepLinking/ActivitiesList/index.js +++ b/src/containers/LMS/Canvas/DeepLinking/ActivitiesList/index.js @@ -47,22 +47,25 @@ const ActivitiesList = (props) => { const activityId = parseInt(id, 10); setSelectedActivityId(activityId); - await microsoftTeams.app.initialize(); - - microsoftTeams.pages.config.setValidityState(true); - microsoftTeams.pages.config.registerOnSaveHandler((saveEvent) => { - const configPromise = microsoftTeams.pages.config.setConfig({ - websiteUrl: config.domainUrl, - contentUrl: `${config.domainUrl}msteam/launch/activity/${activity.id}`, - entityId: activity.id, - suggestedDisplayName: activity.title, + microsoftTeams.app.initialize() + .then(() => { + microsoftTeams.app.getContext().then((context) => { + microsoftTeams.pages.config.setValidityState(true); + microsoftTeams.pages.config.registerOnSaveHandler((saveEvent) => { + const configPromise = microsoftTeams.pages.config.setConfig({ + websiteUrl: `${config.domainUrl}msteam/${context.user.tenant.id}/launch/activity/${activity.id}`, + contentUrl: `${config.domainUrl}msteam/${context.user.tenant.id}/launch/activity/${activity.id}`, + entityId: activity.id, + suggestedDisplayName: activity.title, + }); + configPromise.then((result) => { + saveEvent.notifySuccess(); + }) + // eslint-disable-next-line no-shadow + .catch((error) => { saveEvent.notifyFailure('failure message'); }); + }); + }); }); - configPromise.then((result) => { - saveEvent.notifySuccess(); - }) - // eslint-disable-next-line no-shadow - .catch((error) => { saveEvent.notifyFailure('failure message'); }); - }); }; return ( diff --git a/src/containers/LMS/Canvas/DeepLinking/Project/index.js b/src/containers/LMS/Canvas/DeepLinking/Project/index.js index ed9e095da..fe3226048 100644 --- a/src/containers/LMS/Canvas/DeepLinking/Project/index.js +++ b/src/containers/LMS/Canvas/DeepLinking/Project/index.js @@ -53,24 +53,25 @@ const Project = (props) => { const activity = selectedPlaylist.activities.find((act) => act.id === activityId); setSelectedActivityId(activityId); - await microsoftTeams.app.initialize(); - - microsoftTeams.pages.config.setValidityState(true); - microsoftTeams.pages.config.registerOnSaveHandler((saveEvent) => { - const configPromise = microsoftTeams.pages.config.setConfig({ - websiteUrl: config.domainUrl, - contentUrl: `${config.domainUrl}msteam/launch/activity/${activity.id}`, - // websiteUrl: 'https://2e37-110-36-227-66.ngrok.io/', - // contentUrl: `https://2e37-110-36-227-66.ngrok.io/msteam/launch/activity/${activity.id}`, - entityId: activity.id, - suggestedDisplayName: activity.title, + microsoftTeams.app.initialize() + .then(() => { + microsoftTeams.app.getContext().then((context) => { + microsoftTeams.pages.config.setValidityState(true); + microsoftTeams.pages.config.registerOnSaveHandler((saveEvent) => { + const configPromise = microsoftTeams.pages.config.setConfig({ + websiteUrl: `${config.domainUrl}msteam/${context.user.tenant.id}/launch/activity/${activity.id}`, + contentUrl: `${config.domainUrl}msteam/${context.user.tenant.id}/launch/activity/${activity.id}`, + entityId: activity.id, + suggestedDisplayName: activity.title, + }); + configPromise.then((result) => { + saveEvent.notifySuccess(); + }) + // eslint-disable-next-line no-shadow + .catch((error) => { saveEvent.notifyFailure('failure message'); }); + }); + }); }); - configPromise.then((result) => { - saveEvent.notifySuccess(); - }) - // eslint-disable-next-line no-shadow - .catch((error) => { saveEvent.notifyFailure('failure message'); }); - }); }; return ( diff --git a/src/containers/LMS/MsTeams/MsTeamActivityLaunch/index.js b/src/containers/LMS/MsTeams/MsTeamActivityLaunch/index.js index 4e77eece8..6eef7ba9b 100644 --- a/src/containers/LMS/MsTeams/MsTeamActivityLaunch/index.js +++ b/src/containers/LMS/MsTeams/MsTeamActivityLaunch/index.js @@ -39,11 +39,15 @@ function MsTeamActivityLaunch({match}) { // Get app context and auth token useEffect(() => { - app.initialize().then(async () => { - await app.getContext().then((response) => { - setMsContext(response); + app.initialize() + .then(async () => { + await app.getContext().then((response) => { + setMsContext(response); + }); + }).catch(() => { + console.log('ae failed to init msteams sdk'); + window.location.replace(`https://login.microsoftonline.com/75f881ff-c83b-44de-a964-f0f9ee64c60c/oauth2/authorize?client_id=${config.teamsClientId}&response_type=code&Scope=offline_access%20user.read%20mail.read&redirect_uri=https%3A%2F%2Fdev2.spiralcorp.net%2Fmsteams%2Fcallback`); }); - }); }, []); useEffect(()=>{ @@ -54,7 +58,7 @@ function MsTeamActivityLaunch({match}) { } }, [msContext]); - useEffect(() => { + useEffect(() => { if (msContext === null) return; if(queryParams.get("userRole") == 'student'){ @@ -67,7 +71,7 @@ function MsTeamActivityLaunch({match}) { //validate code issuance time if(mt_code_obj == null || code_issuance_minutes > 10 == true || localStorage.getItem('mt_code_utilized') == 'true'){ - window.location.replace(`https://login.microsoftonline.com/${msContext.user.tenant.id}/oauth2/authorize?client_id=${config.teamsClientId}&response_type=code&Scope=offline_access%20user.read%20mail.read`); + window.location.replace(`https://login.microsoftonline.com/${msContext.user.tenant.id}/oauth2/authorize?client_id=${config.teamsClientId}&response_type=code&Scope=offline_access%20user.read%20mail.read&redirect_uri=https%3A%2F%2Fdev2.spiralcorp.net%2Fmsteams%2Fcallback`); return; } } diff --git a/src/containers/LMS/MsTeams/MsTeamActivityLaunchScreen/index.js b/src/containers/LMS/MsTeams/MsTeamActivityLaunchScreen/index.js index 4379e3d04..8fd439da9 100644 --- a/src/containers/LMS/MsTeams/MsTeamActivityLaunchScreen/index.js +++ b/src/containers/LMS/MsTeams/MsTeamActivityLaunchScreen/index.js @@ -1,5 +1,5 @@ /* eslint-disable */ -import React, { useEffect, useReducer, useState } from 'react'; +import React, { useEffect, useReducer } from 'react'; import { connect } from 'react-redux'; import { withRouter } from 'react-router-dom'; import PropTypes from 'prop-types'; @@ -7,9 +7,8 @@ import Swal from 'sweetalert2'; import gifloader from 'assets/images/dotsloader.gif'; import * as xAPIHelper from 'helpers/xapi'; import { loadH5pResourceXapi } from 'store/actions/resource'; -import { loadH5pResourceSettings, getSubmissionAction } from 'store/actions/gapi'; +import { loadH5pResourceSettings } from 'store/actions/gapi'; import { turnInAction } from 'store/actions/msTeams'; -import { saveResultScreenshotAction } from 'store/actions/safelearn'; import './styles.scss'; const reducer = (activityState, action) => { @@ -60,18 +59,13 @@ const MsTeamActivityLaunchScreen = (props) => { const { activityId, paramObj, - context, activeCourse, match, history, - student, - submission, h5pSettings, loadH5pSettings, - getSubmission, sendStatement, turnIn, - sendScreenshot, } = props; // We do use it with the reducer /* eslint-disable-next-line no-unused-vars */ @@ -104,16 +98,14 @@ const MsTeamActivityLaunchScreen = (props) => { // Init useEffect(() => { - window.scrollTo(0, 0); - const params = new URL(window.location.href).searchParams; // If we're in speedgrader, redirect to summary - // if (params.has('view') && params.get('view') === 'SpeedGrader') { - if (paramObj.mtAssignmentStatus == 'submitted' || (params.has('view') && params.get('view') === 'SpeedGrader')) { + if (paramObj.mtAssignmentStatus === 'submitted' || paramObj.view === 'SpeedGrader') { history.push(`/msteam/summary/${paramObj.classId}/${activityId}/${paramObj.submissionId}`); return; } - loadH5pSettings(activityId, context.user.id, paramObj.submissionId); + window.scrollTo(0, 0); + loadH5pSettings(activityId, paramObj.userId, paramObj.submissionId); }, [activityId]); // Load H5P core @@ -135,14 +127,6 @@ const MsTeamActivityLaunchScreen = (props) => { // Loops until H5P object and dispatcher are ready const intervalId = setInterval(() => { dispatch({ type: 'CHECK_ASSETS' }); - /* - if (typeof window.H5P === 'undefined' || !window.H5P.externalDispatcher) return; - - dispatch({ type: 'CLEAR_INTERVAL' }); - console.log('H5P dispatcher found'); - dispatch({ type: 'CLEAR_INTERVAL' }); - setH5pObject(window.H5P); - */ }, 500); dispatch({ type: 'SET_INTERVAL', intervalId }); }, [h5pSettings]); @@ -154,6 +138,11 @@ const MsTeamActivityLaunchScreen = (props) => { return; } + if (paramObj.userRole !== 'student') { + activityState.h5pObject.init(); + return; + } + // Hook into H5P dispatcher only if xAPI is needed for this route if (xAPIHelper.isxAPINeeded(match.path) === true) { activityState.h5pObject.externalDispatcher.on('xAPI', function (event) { @@ -167,10 +156,10 @@ const MsTeamActivityLaunchScreen = (props) => { activeCourse, submissionId: paramObj.submissionId, attemptId: Date.now(), - studentId: context.user.id, + studentId: paramObj.userId, classworkId: paramObj.classId, courseId: paramObj.assignmentId, - auth: context.user.id, + auth: paramObj.userId, tool_platform: 'MS Teams', homepage: 'https://teams.microsoft.com' }; @@ -181,9 +170,6 @@ const MsTeamActivityLaunchScreen = (props) => { ); sendStatement(xapiData); - if (h5pSettings?.organization?.api_key) { - sendScreenshot(h5pSettings.organization, xapiData, h5pSettings.activity.title, context.user.displayName); - } if(paramObj.userRole == 'student'){ const h5pCurrentInstance = this; // Ask the user if he wants to turn-in the work to Teams @@ -194,7 +180,7 @@ const MsTeamActivityLaunchScreen = (props) => { confirmButtonText: 'Turn In', }).then((result) => { if (result.isConfirmed) { - turnIn(params.classworkId, params.submissionId, params.courseId); + turnIn(localStorage.getItem('msteams_token'), params.classworkId, params.submissionId, params.courseId); Swal.fire('Saved!', '', 'success'); h5pCurrentInstance.trigger('turnInSaved'); } else { @@ -219,25 +205,17 @@ const MsTeamActivityLaunchScreen = (props) => { }; MsTeamActivityLaunchScreen.defaultProps = { - submission: null, h5pSettings: null, }; MsTeamActivityLaunchScreen.propTypes = { activityId: PropTypes.string.isRequired, - // params : PropTypes.object.isRequired, - // classId: PropTypes.string.isRequired, - // activeCourse: PropTypes.object.isRequired, match: PropTypes.object.isRequired, history: PropTypes.object.isRequired, - // student: PropTypes.object.isRequired, - submission: PropTypes.object, h5pSettings: PropTypes.object, loadH5pSettings: PropTypes.func.isRequired, - getSubmission: PropTypes.func.isRequired, sendStatement: PropTypes.func.isRequired, turnIn: PropTypes.func.isRequired, - sendScreenshot: PropTypes.func.isRequired, }; const mapStateToProps = (state) => ({ @@ -248,11 +226,8 @@ const mapStateToProps = (state) => ({ const mapDispatchToProps = (dispatch) => ({ loadH5pSettings: (activityId, studentId, submissionId) => dispatch(loadH5pResourceSettings(activityId, studentId, submissionId)), - getSubmission: (classworkId, courseId, auth) => dispatch(getSubmissionAction(classworkId, courseId, auth)), sendStatement: (statement) => dispatch(loadH5pResourceXapi(statement)), - turnIn: (classworkId, submissionId, courseId) => dispatch(turnInAction(classworkId, submissionId, courseId)), - sendScreenshot: (org, statement, title, studentName) => dispatch(saveResultScreenshotAction(org, statement, title, studentName)), - // getOutcomeSummary: (submissionId) => dispatch(getOutcomeSummaryAction()), + turnIn: (token, classworkId, submissionId, courseId) => dispatch(turnInAction(token, classworkId, submissionId, courseId)), }); export default withRouter(connect(mapStateToProps, mapDispatchToProps)(MsTeamActivityLaunchScreen)); diff --git a/src/containers/LMS/MsTeams/MsTeamsActivityContainer/index.js b/src/containers/LMS/MsTeams/MsTeamsActivityContainer/index.js new file mode 100644 index 000000000..caf4701ef --- /dev/null +++ b/src/containers/LMS/MsTeams/MsTeamsActivityContainer/index.js @@ -0,0 +1,116 @@ +/* eslint-disable */ +import React, { useEffect, useState } from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import { Helmet } from 'react-helmet'; +import MsTeamActivityLaunchScreen from 'containers/LMS/MsTeams/MsTeamActivityLaunchScreen'; +import MsTeamActivityTabLaunchScreen from 'containers/LMS/MsTeams/MsTeamActivityTabLaunchScreen'; +import MsTeamsService from 'services/msTeams.service'; +import { useLocation } from "react-router-dom"; +import { app } from '@microsoft/teams-js'; +import { Alert } from 'react-bootstrap'; + +// import './styles.scss'; + +function MsTeamsActivityContainer({match}) { + const { activityId, tenantId } = match.params; + const queryParams = new URLSearchParams(useLocation().search); + const classId = queryParams.get('classId'); + const assignmentId = queryParams.get('assignmentId'); + const submissionId = queryParams.get('submissionId'); + const view = queryParams.get('view'); + const userRole = queryParams.get('userRole'); + const token = localStorage.getItem('msteams_token'); + const tokenTimestamp = localStorage.getItem('msteams_token_timestamp'); + const freshToken = (token && ((new Date() - new Date(tokenTimestamp)) / 1000) / 60 < 15); + const [error, setError] = useState(null); + const [activityParams, setActivityParams] = useState(null); + + + // Getting the microsoft auth code that will allow us to request a token on the callback and redirect back here + useEffect(() => { + if (freshToken) return; + + const url = new URL(`https://login.microsoftonline.com/${tenantId}/oauth2/authorize`); + const params = new URLSearchParams(); + params.append('client_id', config.teamsClientId); + params.append('response_type', 'code'); + params.append('scope', 'offline_access user.read mail.read'); + params.append('redirect_uri', `https://${window.location.hostname}/msteams/callback`); + params.append('state', window.location.href); + url.search = params.toString(); + window.location.replace(url); + }, []); + + useEffect(() => { + if (!freshToken) return; + + if (userRole === 'teacher') { + setActivityParams({ + assignmentId, + classId, + view, + userRole, + submissionId: 'preview', + mtAssignmentStatus: 'preview', + userId: 'teacher', + }); + return; + } + + MsTeamsService.getSubmissionStatus(token, submissionId, assignmentId, classId) + .then((response) => { + setActivityParams({ + assignmentId, + classId, + view, + userRole, + submissionId, + mtAssignmentStatus: response.submission.status, + userId: response.submission.submittedBy.user.id, + }); + }).catch((e) => { + console.log('Error fetching submission status', e); + setError('Error fetching submission status'); + }); + }, []); + + return ( + <> +
    +
    + +