= (props: CourseCurriculumProp
setIsTcAcademyPolicyModal(false)
}
- function onDiceModalClose(): void {
- setIsDiceModalOpen(false)
- }
-
return (
<>
@@ -232,11 +213,6 @@ const CourseCurriculum: FC
= (props: CourseCurriculumProp
onClose={onAcademicHonestyModalClose}
onConfirm={handlePolicyAccept}
/>
-
-
>
)
}
diff --git a/src/apps/learn/src/course-details/course-curriculum/dice-modal/DiceModal.module.scss b/src/apps/learn/src/course-details/course-curriculum/dice-modal/DiceModal.module.scss
deleted file mode 100644
index 974999840..000000000
--- a/src/apps/learn/src/course-details/course-curriculum/dice-modal/DiceModal.module.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-@import '@libs/ui/styles/includes';
-
-.diceModal {
-
- p {
- margin-bottom: $sp-4;
-
- &.buttonContainer {
- display: flex;
- justify-content: center;
- }
- }
-}
diff --git a/src/apps/learn/src/course-details/course-curriculum/dice-modal/DiceModal.tsx b/src/apps/learn/src/course-details/course-curriculum/dice-modal/DiceModal.tsx
deleted file mode 100644
index edf2f89d2..000000000
--- a/src/apps/learn/src/course-details/course-curriculum/dice-modal/DiceModal.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react'
-
-import { EnvironmentConfig } from '~/config'
-import { BaseModal, Button } from '~/libs/ui'
-
-import styles from './DiceModal.module.scss'
-
-const preventDefault = (ev: any): void => {
- ev?.preventDefault?.()
-}
-
-interface DiceModalProps {
- isOpen: boolean
- onClose: () => void
-}
-
-const DiceModal: FC = (props: DiceModalProps) => {
-
- const [isOpen, setIsOpen]: [boolean, Dispatch>]
- = useState(false)
-
- useEffect(() => {
- setIsOpen(props.isOpen)
- }, [props.isOpen])
-
- return (
-
-
-
-
- Wipro requires employees to enable Multifactor Authentication
- with DICE ID in order to take Topcoder Academy courses.
-
-
- Please go to Account Settings to configure your account.
-
-
-
-
-
-
-
- When you have completed configuring your account,
- click below to refresh your settings.
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default DiceModal
diff --git a/src/apps/learn/src/course-details/course-curriculum/dice-modal/index.ts b/src/apps/learn/src/course-details/course-curriculum/dice-modal/index.ts
deleted file mode 100644
index b74a55774..000000000
--- a/src/apps/learn/src/course-details/course-curriculum/dice-modal/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as DiceModal } from './DiceModal'
diff --git a/src/apps/learn/src/free-code-camp/FreeCodeCamp.tsx b/src/apps/learn/src/free-code-camp/FreeCodeCamp.tsx
index 819cad557..db164a3e5 100644
--- a/src/apps/learn/src/free-code-camp/FreeCodeCamp.tsx
+++ b/src/apps/learn/src/free-code-camp/FreeCodeCamp.tsx
@@ -50,7 +50,6 @@ import {
getCoursePath,
getLessonPathFromModule,
} from '../learn.routes'
-import { LearnConfig } from '../config'
import { CoursePageContextValue, useCoursePageContext } from '../course-page-wrapper'
import { useCheckAndMarkCourseCompleted } from './hooks/use-mark-course-completed'
@@ -410,7 +409,7 @@ const FreeCodeCamp: FC<{}> = () => {
/**
* Check if the user accepted the academic honesty policy
- * and either is not a wipro user or the wipro user has dice enabled.
+ * and either is not a wipro user.
* if not, redirect user to course details page to accept the policy
*/
useLayoutEffect(() => {
@@ -421,11 +420,9 @@ const FreeCodeCamp: FC<{}> = () => {
}
// if the user is logged in,
- // and the user is a either not wipro user or is a wipro user with dice enabled,
// and if the user has accepted the academic honesty policy,
// the user is permitted to take the course, so there's nothing to do.
if (isLoggedIn
- && (!LearnConfig.REQUIRE_DICE_ID || !profile?.isWipro || !!profile?.diceEnabled)
&& !!certificateProgress?.academicHonestyPolicyAcceptedAt) {
return
}
diff --git a/src/apps/talent-search/src/routes/search-results-page/SearchResultsPage.tsx b/src/apps/talent-search/src/routes/search-results-page/SearchResultsPage.tsx
index dd7a315e6..501f15b86 100644
--- a/src/apps/talent-search/src/routes/search-results-page/SearchResultsPage.tsx
+++ b/src/apps/talent-search/src/routes/search-results-page/SearchResultsPage.tsx
@@ -1,4 +1,4 @@
-import { FC, useCallback, useState } from 'react'
+import { FC, useCallback, useEffect, useState } from 'react'
import classNames from 'classnames'
import { Button, ContentLayout, LinkButton, LoadingCircles } from '~/libs/ui'
@@ -17,6 +17,9 @@ import styles from './SearchResultsPage.module.scss'
const SearchResultsPage: FC = () => {
const [showSkillsModal, setShowSkillsModal] = useState(false)
+ const [currentPage, setCurrentPage] = useState(1)
+ const itemsPerPage = 10
+
const [skills, setSkills] = useUrlQuerySearchParms('q')
const {
loading,
@@ -25,6 +28,27 @@ const SearchResultsPage: FC = () => {
hasNext,
total,
}: InfiniteTalentMatchesResposne = useInfiniteTalentMatches(skills)
+ const paginatedMatches = matches.slice(0, currentPage * itemsPerPage)
+
+ useEffect(() => {
+ const handleScroll: () => void = () => {
+ const scrollY = window.scrollY
+ const visibleHeight = window.innerHeight
+ const fullHeight = document.body.scrollHeight
+ const footerElem = document.getElementById('footer-nav-el')
+ const footerHeight = (footerElem && footerElem.offsetHeight) || 650
+ if (scrollY + visibleHeight >= fullHeight - (footerHeight + 100)) {
+ // Scroll near bottom
+ setCurrentPage(prev => {
+ const maxPages = Math.ceil(matches.length / itemsPerPage)
+ return prev < maxPages ? prev + 1 : prev
+ })
+ }
+ }
+
+ window.addEventListener('scroll', handleScroll)
+ return () => window.removeEventListener('scroll', handleScroll)
+ }, [matches])
const toggleSkillsModal = useCallback(() => setShowSkillsModal(s => !s), [])
@@ -100,7 +124,7 @@ const SearchResultsPage: FC = () => {
)}
- {matches.map(member => (
+ {paginatedMatches.map(member => (
-
-
-
\ No newline at end of file
diff --git a/src/apps/wallet-admin/src/lib/components/payment-method-table/PaymentMethodTable.tsx b/src/apps/wallet-admin/src/lib/components/payment-method-table/PaymentMethodTable.tsx
index 825ca636a..3ed1a388d 100644
--- a/src/apps/wallet-admin/src/lib/components/payment-method-table/PaymentMethodTable.tsx
+++ b/src/apps/wallet-admin/src/lib/components/payment-method-table/PaymentMethodTable.tsx
@@ -30,6 +30,7 @@ const PaymentProviderTable: React.FC = (props: PaymentM
CONNECTED PROVIDER
PROVIDER ID
STATUS
+ {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}
diff --git a/src/apps/wallet-admin/src/lib/components/tax-forms-table/TaxFormTable.tsx b/src/apps/wallet-admin/src/lib/components/tax-forms-table/TaxFormTable.tsx
index d384988d7..d6db81256 100644
--- a/src/apps/wallet-admin/src/lib/components/tax-forms-table/TaxFormTable.tsx
+++ b/src/apps/wallet-admin/src/lib/components/tax-forms-table/TaxFormTable.tsx
@@ -31,6 +31,7 @@ const TaxFormTable: React.FC = (props: TaxFormTableProps) =>
FORM
DATE FILED
STATUS
+ {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}
diff --git a/src/apps/wallet/src/lib/assets/security/dicelogo.png b/src/apps/wallet/src/lib/assets/security/dicelogo.png
deleted file mode 100644
index 723b63b2e..000000000
Binary files a/src/apps/wallet/src/lib/assets/security/dicelogo.png and /dev/null differ
diff --git a/src/apps/wallet/src/lib/assets/security/dicelogobig.png b/src/apps/wallet/src/lib/assets/security/dicelogobig.png
deleted file mode 100644
index b18935081..000000000
Binary files a/src/apps/wallet/src/lib/assets/security/dicelogobig.png and /dev/null differ
diff --git a/src/apps/wallet/src/lib/assets/security/dicelogosmall.png b/src/apps/wallet/src/lib/assets/security/dicelogosmall.png
deleted file mode 100644
index c2be4e4a8..000000000
Binary files a/src/apps/wallet/src/lib/assets/security/dicelogosmall.png and /dev/null differ
diff --git a/src/apps/wallet/src/lib/assets/security/index.ts b/src/apps/wallet/src/lib/assets/security/index.ts
index 4559e27b4..efa8c4123 100644
--- a/src/apps/wallet/src/lib/assets/security/index.ts
+++ b/src/apps/wallet/src/lib/assets/security/index.ts
@@ -1,17 +1,9 @@
-import { ReactComponent as MFAImage } from './mfa.svg'
import { ReactComponent as AppleStore } from './apple-store.svg'
import credentialImage from './credential.png'
-import diceIdLogo from './dicelogo.png'
-import diceIdLogoBig from './dicelogobig.png'
-import diceIdLogoSmall from './dicelogosmall.png'
import googlePlay from './google-play.png'
export {
AppleStore,
credentialImage,
- diceIdLogo,
- diceIdLogoBig,
- diceIdLogoSmall,
googlePlay,
- MFAImage,
}
diff --git a/src/apps/wallet/src/lib/assets/security/mfa.svg b/src/apps/wallet/src/lib/assets/security/mfa.svg
deleted file mode 100644
index 33b5ab0cc..000000000
--- a/src/apps/wallet/src/lib/assets/security/mfa.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/src/config/environments/default.env.ts b/src/config/environments/default.env.ts
index 8db092aba..403668d77 100644
--- a/src/config/environments/default.env.ts
+++ b/src/config/environments/default.env.ts
@@ -78,11 +78,19 @@ export const USERFLOW_SURVEYS = {
}
export const ADMIN = {
+ AGREE_ELECTRONICALLY: '5b2798b2-ae82-4210-9b4d-5d6428125ccb',
+ AGREE_FOR_DOCUSIGN_TEMPLATE: '999a26ad-b334-453c-8425-165d4cf496d7',
AV_SCAN_SCORER_REVIEW_TYPE_ID: '68c5a381-c8ab-48af-92a7-7a869a4ee6c3',
+ AVSCAN_TOPIC: 'avscan.action.scan',
+ AWS_CLEAN_BUCKET: '',
+ AWS_DMZ_BUCKET: 'topcoder-dev-submissions',
+ AWS_QUARANTINE_BUCKET: '',
+ AWS_REGION: 'us-east-1',
CHALLENGE_URL: 'https://www.topcoder-dev.com/challenges',
CONNECT_URL: 'https://connect.topcoder-dev.com',
DEFAULT_PAYMENT_TERMS: 1,
DIRECT_URL: 'https://www.topcoder-dev.com/direct',
ONLINE_REVIEW_URL: 'https://software.topcoder-dev.com/review',
+ SUBMISSION_SCAN_TOPIC: 'submission.scan.complete',
WORK_MANAGER_URL: 'https://challenges.topcoder-dev.com',
}
diff --git a/src/config/environments/global-config.model.ts b/src/config/environments/global-config.model.ts
index a2a518bb6..8550fb496 100644
--- a/src/config/environments/global-config.model.ts
+++ b/src/config/environments/global-config.model.ts
@@ -52,5 +52,13 @@ export interface GlobalConfig {
ONLINE_REVIEW_URL: string
CHALLENGE_URL: string
AV_SCAN_SCORER_REVIEW_TYPE_ID: string
+ AGREE_ELECTRONICALLY: string
+ AGREE_FOR_DOCUSIGN_TEMPLATE: string
+ AWS_REGION: string
+ AWS_DMZ_BUCKET: string
+ AWS_CLEAN_BUCKET: string
+ AWS_QUARANTINE_BUCKET: string
+ SUBMISSION_SCAN_TOPIC: string
+ AVSCAN_TOPIC: string
}
}
diff --git a/src/config/environments/prod.env.ts b/src/config/environments/prod.env.ts
index 69e9fab0a..5fe1b34bb 100644
--- a/src/config/environments/prod.env.ts
+++ b/src/config/environments/prod.env.ts
@@ -7,11 +7,19 @@ export const VANILLA_FORUM = {
}
export const ADMIN = {
+ AGREE_ELECTRONICALLY: '2db6c920-4089-4755-9cd1-99b0df0af961',
+ AGREE_FOR_DOCUSIGN_TEMPLATE: '1363a7ab-fd3e-4d7c-abbb-2f7440b8b355',
AV_SCAN_SCORER_REVIEW_TYPE_ID: '55bbb17d-aac2-45a6-89c3-a8d102863d05',
+ AVSCAN_TOPIC: 'avscan.action.scan',
+ AWS_CLEAN_BUCKET: '',
+ AWS_DMZ_BUCKET: 'topcoder-submissions',
+ AWS_QUARANTINE_BUCKET: '',
+ AWS_REGION: 'us-east-1',
CHALLENGE_URL: 'https://www.topcoder.com/challenges',
CONNECT_URL: 'https://connect.topcoder.com',
DEFAULT_PAYMENT_TERMS: 1,
DIRECT_URL: 'https://www.topcoder.com/direct',
ONLINE_REVIEW_URL: 'https://software.topcoder.com/review',
+ SUBMISSION_SCAN_TOPIC: 'submission.scan.complete',
WORK_MANAGER_URL: 'https://challenges.topcoder.com',
}
diff --git a/src/libs/core/lib/auth/user-functions/index.ts b/src/libs/core/lib/auth/user-functions/index.ts
index 7a5ad1a47..d406614d2 100644
--- a/src/libs/core/lib/auth/user-functions/index.ts
+++ b/src/libs/core/lib/auth/user-functions/index.ts
@@ -1,4 +1,3 @@
export {
- getDiceStatusAsync as userGetDiceStatusAsync,
updatePasswordAsync as userUpdatePasswordAsync,
} from './user.functions'
diff --git a/src/libs/core/lib/auth/user-functions/user-store/index.ts b/src/libs/core/lib/auth/user-functions/user-store/index.ts
index 5e88d6a17..28b205023 100644
--- a/src/libs/core/lib/auth/user-functions/user-store/index.ts
+++ b/src/libs/core/lib/auth/user-functions/user-store/index.ts
@@ -1,5 +1,4 @@
export {
- getMfaStatusAsync as userStoreGetMfaStatusAsync,
patchAsync as userStorePatchAsync,
} from './user-xhr.store'
export { type UserPatchRequest } from './user-xhr.store'
diff --git a/src/libs/core/lib/auth/user-functions/user-store/user-xhr.store.ts b/src/libs/core/lib/auth/user-functions/user-store/user-xhr.store.ts
index e133b8385..c644c3017 100644
--- a/src/libs/core/lib/auth/user-functions/user-store/user-xhr.store.ts
+++ b/src/libs/core/lib/auth/user-functions/user-store/user-xhr.store.ts
@@ -1,17 +1,8 @@
-import { xhrGetAsync, xhrPatchAsync } from '../../../xhr'
+import { xhrPatchAsync } from '../../../xhr'
import { AuthUser } from '../../authentication-functions/auth-user.model'
import { user as userEndpoint } from './user-endpoint.config'
-export interface MfaStatusResult {
- result: {
- content: {
- diceEnabled: boolean
- mfaEnabled: boolean
- }
- }
-}
-
export interface UserPatchRequest {
param: {
credential: {
@@ -21,10 +12,6 @@ export interface UserPatchRequest {
}
}
-export async function getMfaStatusAsync(userId: number): Promise {
- return xhrGetAsync(`${userEndpoint(userId)}/2fa`)
-}
-
export async function patchAsync(userId: number, request: UserPatchRequest): Promise {
const url: string = userEndpoint(userId)
return xhrPatchAsync(url, request)
diff --git a/src/libs/core/lib/auth/user-functions/user.functions.ts b/src/libs/core/lib/auth/user-functions/user.functions.ts
index 613e7100c..2ba611493 100644
--- a/src/libs/core/lib/auth/user-functions/user.functions.ts
+++ b/src/libs/core/lib/auth/user-functions/user.functions.ts
@@ -1,10 +1,4 @@
-import { UserPatchRequest, userStoreGetMfaStatusAsync, userStorePatchAsync } from './user-store'
-import { MfaStatusResult } from './user-store/user-xhr.store'
-
-export async function getDiceStatusAsync(userId: number): Promise {
- const result: MfaStatusResult = await userStoreGetMfaStatusAsync(userId)
- return !!result.result.content.mfaEnabled && !!result.result.content.diceEnabled
-}
+import { UserPatchRequest, userStorePatchAsync } from './user-store'
export async function updatePasswordAsync(userId: number, currentPassword: string, password: string): Promise {
const request: UserPatchRequest = {
diff --git a/src/libs/core/lib/profile/data-providers/index.ts b/src/libs/core/lib/profile/data-providers/index.ts
index 41e6581cc..b4511c660 100644
--- a/src/libs/core/lib/profile/data-providers/index.ts
+++ b/src/libs/core/lib/profile/data-providers/index.ts
@@ -5,8 +5,6 @@ export * from './useUserCompletedCertifications'
export * from './useStatsHistory'
export * from './useStatsDistribution'
export * from './useMemberEmailPreferences'
-export * from './useMemberMFAStatus'
-export * from './useDiceIdConnection'
export * from './useMemberTraits'
export * from './useMemberDevicesLookup'
export * from './useCountryLookup'
diff --git a/src/libs/core/lib/profile/data-providers/useDiceIdConnection.ts b/src/libs/core/lib/profile/data-providers/useDiceIdConnection.ts
deleted file mode 100644
index d86e3c30c..000000000
--- a/src/libs/core/lib/profile/data-providers/useDiceIdConnection.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import useSWR, { SWRConfiguration, SWRResponse } from 'swr'
-
-import { diceIDURL } from '~/libs/core'
-
-export interface DiceConnectionStatus {
- accepted: boolean
- connection: string | null
- diceEnabled: boolean
-}
-
-export function useDiceIdConnection(userId: number): DiceConnectionStatus | undefined {
- const options: SWRConfiguration = { refreshInterval: 5000 } // pooling interval 5s
-
- const { data }: SWRResponse
- = useSWR(`${diceIDURL(userId)}/diceConnection`, options)
-
- return data ? data.result.content : undefined
-}
diff --git a/src/libs/core/lib/profile/data-providers/useMemberMFAStatus.ts b/src/libs/core/lib/profile/data-providers/useMemberMFAStatus.ts
deleted file mode 100644
index 844b5a496..000000000
--- a/src/libs/core/lib/profile/data-providers/useMemberMFAStatus.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import useSWR, { KeyedMutator, SWRResponse } from 'swr'
-
-import { memberModifyMfaURL } from '~/libs/core'
-
-export interface MemberMFAStatus {
- createdAt: Date
- createdBy: number
- diceEnabled: boolean
- id: number
- mfaEnabled: boolean
- modifiedAt: Date
- modifiedBy: number
- userId: number
-}
-
-export interface UseMemberMFAStatusAPI {
- data: MemberMFAStatus | undefined
- mutate: KeyedMutator
-}
-
-export function useMemberMFAStatus(userId: number): UseMemberMFAStatusAPI {
- const { data, mutate }: SWRResponse = useSWR(memberModifyMfaURL(userId))
-
- return {
- data: data ? data.result.content : undefined,
- mutate,
- }
-}
diff --git a/src/libs/core/lib/profile/index.ts b/src/libs/core/lib/profile/index.ts
index 87b18783d..df5249fd8 100644
--- a/src/libs/core/lib/profile/index.ts
+++ b/src/libs/core/lib/profile/index.ts
@@ -11,7 +11,6 @@ export * from './user-badge.model'
export * from './modify-user-role.model'
export * from './user-email-preference.model'
export * from './modify-user-email-preferences.model'
-export * from './modify-user-mfa.model'
export * from './user-traits.model'
export * from './modify-tracks.request'
export * from './modify-user-profile.model'
diff --git a/src/libs/core/lib/profile/modify-user-mfa.model.ts b/src/libs/core/lib/profile/modify-user-mfa.model.ts
deleted file mode 100644
index 1fda94156..000000000
--- a/src/libs/core/lib/profile/modify-user-mfa.model.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-export interface ModifyUserMFARequest {
- param: {
- mfaEnabled?: boolean
- diceEnabled?: boolean
- }
-}
-
-export interface ModifyUserMFAResponse {
- id: string
- result: {
- content: {
- mfaEnabled: boolean
- diceEnabled: boolean
- },
- success: boolean
- }
-}
diff --git a/src/libs/core/lib/profile/profile-functions/index.ts b/src/libs/core/lib/profile/profile-functions/index.ts
index fd4a249c6..ed8ec1d6c 100644
--- a/src/libs/core/lib/profile/profile-functions/index.ts
+++ b/src/libs/core/lib/profile/profile-functions/index.ts
@@ -8,7 +8,6 @@ export {
editNameAsync as profileEditNameAsync,
updatePrimaryMemberRoleAsync,
updateMemberEmailPreferencesAsync,
- updateMemberMFAStatusAsync,
updateMemberPasswordAsync,
updateMemberTraitsAsync,
createMemberTraitsAsync,
diff --git a/src/libs/core/lib/profile/profile-functions/profile-factory/profile.factory.ts b/src/libs/core/lib/profile/profile-functions/profile-factory/profile.factory.ts
index 23e62c088..a17be2d18 100644
--- a/src/libs/core/lib/profile/profile-functions/profile-factory/profile.factory.ts
+++ b/src/libs/core/lib/profile/profile-functions/profile-factory/profile.factory.ts
@@ -3,7 +3,7 @@ import { UserProfile } from '../../user-profile.model'
import { UserRole } from './user-role.enum'
-export function create(profile: UserProfile, token?: TokenModel, hasDiceEnabled?: boolean): UserProfile {
+export function create(profile: UserProfile, token?: TokenModel): UserProfile {
// Currently, the "Self-Service Customer" role is being set when a user is created
// during the self-service workflow. There are no other roles being set to distinguish
@@ -16,7 +16,6 @@ export function create(profile: UserProfile, token?: TokenModel, hasDiceEnabled?
profile.isMember = !profile.isCustomer
profile.isWipro = profile.email?.endsWith('@wipro.com')
- profile.diceEnabled = !!hasDiceEnabled
// store roles for custom capability checks
profile.roles = token?.roles || []
diff --git a/src/libs/core/lib/profile/profile-functions/profile-store/index.ts b/src/libs/core/lib/profile/profile-functions/profile-store/index.ts
index 39e376a86..f74524d04 100644
--- a/src/libs/core/lib/profile/profile-functions/profile-store/index.ts
+++ b/src/libs/core/lib/profile/profile-functions/profile-store/index.ts
@@ -12,7 +12,5 @@ export {
learnBaseURL,
memberStatsDistroURL,
memberEmailPreferencesURL,
- memberModifyMfaURL,
- diceIDURL,
userSkillsUrl,
} from './profile-endpoint.config'
diff --git a/src/libs/core/lib/profile/profile-functions/profile-store/profile-endpoint.config.ts b/src/libs/core/lib/profile/profile-functions/profile-store/profile-endpoint.config.ts
index e418f131e..78de45d52 100644
--- a/src/libs/core/lib/profile/profile-functions/profile-store/profile-endpoint.config.ts
+++ b/src/libs/core/lib/profile/profile-functions/profile-store/profile-endpoint.config.ts
@@ -39,14 +39,6 @@ export function memberEmailPreferencesURL(): string {
return `https://community-app.${EnvironmentConfig.TC_DOMAIN}/api/mailchimp/28bfd3c062/members`
}
-export function memberModifyMfaURL(userId: number): string {
- return `${EnvironmentConfig.API.V3}/users/${userId}/2fa`
-}
-
-export function diceIDURL(userId: number): string {
- return `${EnvironmentConfig.API.V3}/users/${userId}`
-}
-
export function userSkillsUrl(userIdOrAction: string): string {
return `${EnvironmentConfig.API.V5}/standardized-skills/user-skills/${userIdOrAction}`
}
diff --git a/src/libs/core/lib/profile/profile-functions/profile-store/profile-xhr.store.ts b/src/libs/core/lib/profile/profile-functions/profile-store/profile-xhr.store.ts
index 84966a017..3272b716b 100644
--- a/src/libs/core/lib/profile/profile-functions/profile-store/profile-xhr.store.ts
+++ b/src/libs/core/lib/profile/profile-functions/profile-store/profile-xhr.store.ts
@@ -3,7 +3,6 @@ import { CountryLookup } from '../../country-lookup.model'
import { EditNameRequest } from '../../edit-name-request.model'
import { ModifyTracksRequest } from '../../modify-tracks.request'
import { ModifyMemberEmailPreferencesRequest } from '../../modify-user-email-preferences.model'
-import { ModifyUserMFARequest, ModifyUserMFAResponse } from '../../modify-user-mfa.model'
import { UpdateProfileRequest, UserPhotoUpdateResponse } from '../../modify-user-profile.model'
import { ModifyUserPropertyRequest, ModifyUserPropertyResponse } from '../../modify-user-role.model'
import { UserEmailPreferences } from '../../user-email-preference.model'
@@ -15,7 +14,6 @@ import { UserVerify } from '../../user-verify.model'
import {
countryLookupURL,
memberEmailPreferencesURL,
- memberModifyMfaURL,
memberModifyURL,
profile as profileUrl,
verify as verifyUrl,
@@ -63,13 +61,6 @@ export async function updateMemberEmailPreferences(
)
}
-export async function updateMemberMFA(userId: number, payload: ModifyUserMFARequest): Promise {
- return xhrPatchAsync(
- memberModifyMfaURL(userId),
- payload,
- )
-}
-
export async function updateMemberPassword(
userId: number,
currentPassword: string,
diff --git a/src/libs/core/lib/profile/profile-functions/profile.functions.ts b/src/libs/core/lib/profile/profile-functions/profile.functions.ts
index 1f1e482bd..581723f3a 100644
--- a/src/libs/core/lib/profile/profile-functions/profile.functions.ts
+++ b/src/libs/core/lib/profile/profile-functions/profile.functions.ts
@@ -1,9 +1,8 @@
-import { tokenGetAsync, TokenModel, userGetDiceStatusAsync } from '../../auth'
+import { tokenGetAsync, TokenModel } from '../../auth'
import { CountryLookup } from '../country-lookup.model'
import { EditNameRequest } from '../edit-name-request.model'
import { ModifyTracksRequest } from '../modify-tracks.request'
import { ModifyMemberEmailPreferencesRequest } from '../modify-user-email-preferences.model'
-import { ModifyUserMFARequest, ModifyUserMFAResponse } from '../modify-user-mfa.model'
import { UpdateProfileRequest, UserPhotoUpdateResponse } from '../modify-user-profile.model'
import { ModifyUserPropertyResponse } from '../modify-user-role.model'
import { UserEmailPreferences } from '../user-email-preference.model'
@@ -20,7 +19,6 @@ import {
getCountryLookup,
modifyTracks,
updateMemberEmailPreferences,
- updateMemberMFA,
updateMemberPassword,
updateMemberPhoto,
updateMemberProfile,
@@ -40,13 +38,10 @@ export async function getLoggedInAsync(handle?: string): Promise = profileStoreGet(safeHandle)
- const dicePromise: Promise = userGetDiceStatusAsync(token.userId)
-
- const [profileResult, diceEnabled]: [UserProfile, boolean] = await Promise.all([profilePromise, dicePromise])
+ const profileResult: UserProfile = await profileStoreGet(safeHandle)
// make the changes we need based on the token
- const output: UserProfile = profileFactoryCreate(profileResult, token, diceEnabled)
+ const output: UserProfile = profileFactoryCreate(profileResult, token)
return output
}
@@ -107,13 +102,6 @@ export async function updateMemberEmailPreferencesAsync(
return updateMemberEmailPreferences(email, emailPreferences)
}
-export async function updateMemberMFAStatusAsync(
- userId: number,
- payload: ModifyUserMFARequest,
-): Promise {
- return updateMemberMFA(userId, payload)
-}
-
export async function updateMemberPasswordAsync(
userId: number,
currentPassword: string,
diff --git a/src/libs/core/lib/profile/user-profile.model.ts b/src/libs/core/lib/profile/user-profile.model.ts
index 03d863bfd..1e263d2d0 100644
--- a/src/libs/core/lib/profile/user-profile.model.ts
+++ b/src/libs/core/lib/profile/user-profile.model.ts
@@ -20,7 +20,6 @@ export interface UserProfile {
competitionCountryCode: string
createdAt: number
description: string
- diceEnabled: boolean
email: string
firstName: string
handle: string
diff --git a/src/libs/shared/lib/components/profile-picture/ProfilePicture.tsx b/src/libs/shared/lib/components/profile-picture/ProfilePicture.tsx
index e7b713dc1..059be6399 100644
--- a/src/libs/shared/lib/components/profile-picture/ProfilePicture.tsx
+++ b/src/libs/shared/lib/components/profile-picture/ProfilePicture.tsx
@@ -29,8 +29,8 @@ const ProfilePicture: FC = props => {
>
{!loaded && (
- {props.member.firstName.slice(0, 1)}
- {props.member.lastName.slice(0, 1)}
+ {props.member?.firstName?.slice(0, 1)}
+ {props.member?.lastName?.slice(0, 1)}
)}
{props.member.photoURL && !error && (
diff --git a/src/libs/ui/lib/components/content-layout/ContentLayout.module.scss b/src/libs/ui/lib/components/content-layout/ContentLayout.module.scss
index 7cc8a3ac9..628902a35 100644
--- a/src/libs/ui/lib/components/content-layout/ContentLayout.module.scss
+++ b/src/libs/ui/lib/components/content-layout/ContentLayout.module.scss
@@ -36,6 +36,12 @@
color: $black-100;
}
}
+
+ @media (max-width: 767px) {
+ .page-header {
+ flex-direction: column;
+ }
+ }
}
}
}
diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-date-picker/InputDatePicker.tsx b/src/libs/ui/lib/components/form/form-groups/form-input/input-date-picker/InputDatePicker.tsx
index 2c4840898..729f36d3e 100644
--- a/src/libs/ui/lib/components/form/form-groups/form-input/input-date-picker/InputDatePicker.tsx
+++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-date-picker/InputDatePicker.tsx
@@ -14,6 +14,7 @@ import styles from './InputDatePicker.module.scss'
interface InputDatePickerProps {
date: Date | undefined | null
onChange: (date: Date | null) => void
+ onBlur?: () => void
readonly className?: string
readonly dateFormat?: string | string[]
readonly dirty?: boolean
@@ -26,6 +27,7 @@ interface InputDatePickerProps {
readonly maxTime?: Date | undefined
readonly minDate?: Date | null | undefined
readonly minTime?: Date | undefined
+ readonly minYear?: Date | null |undefined
readonly placeholder?: string
readonly showMonthPicker?: boolean
readonly showYearPicker?: boolean
@@ -76,7 +78,8 @@ const InputDatePicker: FC = (props: InputDatePickerProps)
const datePickerRef = useRef>(null)
const years = useMemo(() => {
const maxYear = getYear(props.maxDate ? props.maxDate : new Date()) + 1
- return range(1979, maxYear, 1)
+ const minYear = getYear(props.minYear ? props.minYear : 1979)
+ return range(minYear, maxYear, 1)
}, [props.maxDate])
const [stateHasFocus, setStateHasFocus] = useState(false)
@@ -184,7 +187,10 @@ const InputDatePicker: FC = (props: InputDatePickerProps)
popperPlacement='bottom'
portalId='react-date-portal'
onFocus={() => setStateHasFocus(true)}
- onBlur={() => setStateHasFocus(false)}
+ onBlur={() => {
+ setStateHasFocus(false)
+ props.onBlur?.()
+ }}
isClearable={props.isClearable}
/>
diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-select-react/InputSelectReact.module.scss b/src/libs/ui/lib/components/form/form-groups/form-input/input-select-react/InputSelectReact.module.scss
index 3fe20ea51..761a49e51 100644
--- a/src/libs/ui/lib/components/form/form-groups/form-input/input-select-react/InputSelectReact.module.scss
+++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-select-react/InputSelectReact.module.scss
@@ -77,7 +77,7 @@
&:global(__single-value) {
@extend .body-small;
- color: $black-60;
+ color: $black-100;
white-space: break-spaces;
word-break: break-all;
text-align: left;
diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-select-react/InputSelectReact.tsx b/src/libs/ui/lib/components/form/form-groups/form-input/input-select-react/InputSelectReact.tsx
index 224f73928..e2b0e62ea 100644
--- a/src/libs/ui/lib/components/form/form-groups/form-input/input-select-react/InputSelectReact.tsx
+++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-select-react/InputSelectReact.tsx
@@ -28,6 +28,7 @@ interface InputSelectReactProps {
readonly classNameWrapper?: string
readonly dirty?: boolean
readonly disabled?: boolean
+ readonly isLoading?: boolean
readonly error?: string
readonly hideInlineErrors?: boolean
readonly hint?: string
@@ -48,6 +49,7 @@ interface InputSelectReactProps {
readonly async?: boolean
readonly loadOptions?: (inputValue: string, callback: (option: any) => void) => void
readonly filterOption?: (option: InputSelectOption, value: string) => boolean
+ readonly isClearable?: boolean
}
/**
@@ -105,11 +107,12 @@ const InputSelectReact: FC = props => {
// throw the proper event type to the form handler (needs name & form element on target)
function handleSelect(option: unknown): void {
+ const selectedOption = option as InputSelectOption | null
props.onChange({
target: {
form: findParentFrom(wrapRef.current as HTMLDivElement),
name: props.name,
- value: (option as InputSelectOption).value,
+ value: selectedOption?.value || '',
},
} as ChangeEvent)
}
@@ -162,9 +165,11 @@ const InputSelectReact: FC = props => {
formatCreateLabel={props.createLabel}
onCreateOption={props.onCreateOption}
onBlur={handleBlur}
+ isClearable={props.isClearable}
backspaceRemovesValue
isDisabled={props.disabled}
filterOption={props.filterOption}
+ isLoading={props.isLoading}
/>
)
diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.module.scss b/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.module.scss
index d3673be51..16505e78b 100644
--- a/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.module.scss
+++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-select/InputSelect.module.scss
@@ -5,7 +5,7 @@
align-items: center;
margin-top: $sp-1;
cursor: pointer;
- color: $black-60;
+ color: $black-100;
&-icon {
margin-left: auto;
diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-text/InputText.module.scss b/src/libs/ui/lib/components/form/form-groups/form-input/input-text/InputText.module.scss
index 555e29b8e..2ef89273c 100644
--- a/src/libs/ui/lib/components/form/form-groups/form-input/input-text/InputText.module.scss
+++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-text/InputText.module.scss
@@ -3,7 +3,7 @@
.form-input-text {
@extend .body-small;
- color: $black-60;
+ color: $black-100;
box-sizing: border-box;
border: 0;
width: 100%;
diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-text/InputText.tsx b/src/libs/ui/lib/components/form/form-groups/form-input/input-text/InputText.tsx
index 5fc1847a6..b7315367f 100644
--- a/src/libs/ui/lib/components/form/form-groups/form-input/input-text/InputText.tsx
+++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-text/InputText.tsx
@@ -37,6 +37,7 @@ export interface InputTextProps {
readonly forceUpdateValue?: boolean
readonly inputControl?: UseFormRegisterReturn
readonly isLoading?: boolean
+ readonly maxLength?: number
}
const InputText: FC = (props: InputTextProps) => {
@@ -70,6 +71,7 @@ const InputText: FC = (props: InputTextProps) => {
onBlur={props.inputControl ? props.inputControl.onBlur : props.onBlur}
onChange={props.inputControl ? props.inputControl.onChange : props.onChange}
name={props.inputControl ? props.inputControl.name : props.name}
+ maxLength={props.maxLength}
/>
)
diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-textarea/InputTextarea.module.scss b/src/libs/ui/lib/components/form/form-groups/form-input/input-textarea/InputTextarea.module.scss
index 0b5e6eee4..90737f689 100644
--- a/src/libs/ui/lib/components/form/form-groups/form-input/input-textarea/InputTextarea.module.scss
+++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-textarea/InputTextarea.module.scss
@@ -4,13 +4,12 @@
.form-input-textarea {
@include font-roboto;
@extend .body-small;
- color: $black-60;
+ color: $black-100;
box-sizing: border-box;
border: none;
outline: none;
resize: vertical;
margin-left: calc(-1 * $border);
- overflow: hidden;
padding: $border;
&::placeholder {
diff --git a/src/libs/ui/lib/components/form/form-groups/form-input/input-textarea/InputTextarea.tsx b/src/libs/ui/lib/components/form/form-groups/form-input/input-textarea/InputTextarea.tsx
index ccfa44f0f..25e2dee42 100644
--- a/src/libs/ui/lib/components/form/form-groups/form-input/input-textarea/InputTextarea.tsx
+++ b/src/libs/ui/lib/components/form/form-groups/form-input/input-textarea/InputTextarea.tsx
@@ -23,6 +23,7 @@ interface InputTextareaProps {
readonly tabIndex?: number
readonly value?: string | number
readonly inputControl?: UseFormRegisterReturn
+ readonly classNameWrapper?: string
}
const InputTextarea: FC = (props: InputTextareaProps) => (
diff --git a/src/libs/ui/lib/components/table/table-functions/table.functions.ts b/src/libs/ui/lib/components/table/table-functions/table.functions.ts
index 10fd8bbde..736b58eff 100644
--- a/src/libs/ui/lib/components/table/table-functions/table.functions.ts
+++ b/src/libs/ui/lib/components/table/table-functions/table.functions.ts
@@ -65,6 +65,11 @@ export function getSorted(
.sort((a: T, b: T) => {
const aField: string = a[sort.fieldName]
const bField: string = b[sort.fieldName]
+
+ // Handle undefined/null values safely
+ if (aField === undefined && bField === undefined) return 0
+ if (aField === undefined) return 1
+ if (bField === undefined) return -1
return sort.direction === 'asc'
? aField.localeCompare(bField)
: bField.localeCompare(aField)
diff --git a/src/libs/ui/lib/components/tabs-navbar/TabsNavbar.tsx b/src/libs/ui/lib/components/tabs-navbar/TabsNavbar.tsx
index 0b2d8f019..9d0ea8c76 100644
--- a/src/libs/ui/lib/components/tabs-navbar/TabsNavbar.tsx
+++ b/src/libs/ui/lib/components/tabs-navbar/TabsNavbar.tsx
@@ -125,7 +125,7 @@ const TabsNavbar: FC = (props: TabsNavbarProps) => {
handleActivateTab={handleActivateTab}
handleActivateChildTab={handleActivateChildTab}
/>
-
+ {props.tabs.length > 1 && }
diff --git a/yarn.lock b/yarn.lock
index 6fd04826d..b2349b56f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2529,6 +2529,18 @@
resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8"
integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==
+"@isaacs/balanced-match@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29"
+ integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==
+
+"@isaacs/brace-expansion@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3"
+ integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==
+ dependencies:
+ "@isaacs/balanced-match" "^4.0.1"
+
"@isaacs/cliui@^8.0.2":
version "8.0.2"
resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
@@ -4765,6 +4777,13 @@
resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.4.3.tgz#af975e367743fa91989cd666666aec31a8f50591"
integrity sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==
+"@tinymce/tinymce-react@^6.2.1":
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/@tinymce/tinymce-react/-/tinymce-react-6.2.1.tgz#23e1d73b0a5b1f01c7d23f5b6c6bb71d7fc617c7"
+ integrity sha512-P/xWz3sNeJ2kXykxBkxM+4vEUYFlqWuJFifcJTmIwqHODJc17eZWvtNapzqGD+mUjXglf3VePu7ojRV1kdK22A==
+ dependencies:
+ prop-types "^15.6.2"
+
"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
@@ -4899,6 +4918,20 @@
"@types/node" "*"
"@types/responselike" "^1.0.0"
+"@types/codemirror@5.60.15":
+ version "5.60.15"
+ resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.15.tgz#0f82be6f4126d1e59cf4c4830e56dcd49d3c3e8a"
+ integrity sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==
+ dependencies:
+ "@types/tern" "*"
+
+"@types/codemirror@^5.60.10":
+ version "5.60.16"
+ resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.16.tgz#1f462f9771113bd8e1c6130c666b17db8e1087c2"
+ integrity sha512-V/yHdamffSS075jit+fDxaOAmdP2liok8NSNJnAZfDJErzOheuygHZEhAJrfmk5TEyM32MhkZjwo/idX791yxw==
+ dependencies:
+ "@types/tern" "*"
+
"@types/connect-history-api-fallback@^1.3.5":
version "1.3.5"
resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae"
@@ -5170,6 +5203,11 @@
resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.7.tgz#400a76809fd08c2bbd9e25f3be06ea38c8e0a1d3"
integrity sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==
+"@types/marked@^4.0.7":
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.3.2.tgz#e2e0ad02ebf5626bd215c5bae2aff6aff0ce9eac"
+ integrity sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==
+
"@types/mdast@^3.0.0":
version "3.0.11"
resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0"
@@ -5439,6 +5477,13 @@
resolved "https://registry.yarnpkg.com/@types/systemjs/-/systemjs-6.13.0.tgz#c46a6083488b095fc2e00270f28fb6fe9f420ec6"
integrity sha512-T7P3qWZmtAVNUrEkWXlT8Hm8ND0w7rVmMZu+HYmS38mrNyAyxIdoZQ23ySmClhWR1oq0E2RhOSmuI3Cs2By6nQ==
+"@types/tern@*":
+ version "0.23.9"
+ resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.9.tgz#6f6093a4a9af3e6bb8dde528e024924d196b367c"
+ integrity sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==
+ dependencies:
+ "@types/estree" "*"
+
"@types/testing-library__jest-dom@^5.14.5", "@types/testing-library__jest-dom@^5.9.1":
version "5.14.5"
resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f"
@@ -5980,6 +6025,11 @@ ajv@^8.9.0:
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
+amazon-s3-uri@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/amazon-s3-uri/-/amazon-s3-uri-0.1.1.tgz#37afdfa88352ee0c22ac12ea6417a7c725f2b90b"
+ integrity sha512-LklZtJ3lgTFdVpy/5ln0okxdgMdnRmFLRg9FGcJ7DeB5Ez5TCs1DHdmVovcPIxW9tQlA1+QLpGNg1Ig6hv768A==
+
ansi-align@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
@@ -7337,6 +7387,18 @@ coa@^2.0.2:
chalk "^2.4.1"
q "^1.1.2"
+codemirror-spell-checker@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz#1c660f9089483ccb5113b9ba9ca19c3f4993371e"
+ integrity sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ==
+ dependencies:
+ typo-js "*"
+
+codemirror@^5.65.15:
+ version "5.65.19"
+ resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.19.tgz#71016c701d6a4b6e1982b0f6e7186be65e49653d"
+ integrity sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==
+
collect-v8-coverage@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
@@ -7722,6 +7784,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
+cross-spawn@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
crypto-js@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631"
@@ -8624,6 +8695,17 @@ duplexify@^3.5.0, duplexify@^3.6.0:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
+easymde@2.20.0:
+ version "2.20.0"
+ resolved "https://registry.yarnpkg.com/easymde/-/easymde-2.20.0.tgz#88b3161feab6e1900afa9c4dab3f1da352b0a26e"
+ integrity sha512-V1Z5f92TfR42Na852OWnIZMbM7zotWQYTddNaLYZFVKj7APBbyZ3FYJ27gBw2grMW3R6Qdv9J8n5Ij7XRSIgXQ==
+ dependencies:
+ "@types/codemirror" "^5.60.10"
+ "@types/marked" "^4.0.7"
+ codemirror "^5.65.15"
+ codemirror-spell-checker "1.1.2"
+ marked "^4.1.0"
+
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -9995,6 +10077,14 @@ foreground-child@^3.1.0:
cross-spawn "^7.0.0"
signal-exit "^4.0.1"
+foreground-child@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f"
+ integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==
+ dependencies:
+ cross-spawn "^7.0.6"
+ signal-exit "^4.0.1"
+
fork-ts-checker-webpack-plugin@^6.5.0:
version "6.5.2"
resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340"
@@ -10314,6 +10404,18 @@ glob@^10.0.0:
package-json-from-dist "^1.0.0"
path-scurry "^1.11.1"
+glob@^11.0.0:
+ version "11.0.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.3.tgz#9d8087e6d72ddb3c4707b1d2778f80ea3eaefcd6"
+ integrity sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==
+ dependencies:
+ foreground-child "^3.3.1"
+ jackspeak "^4.1.1"
+ minimatch "^10.0.3"
+ minipass "^7.1.2"
+ package-json-from-dist "^1.0.0"
+ path-scurry "^2.0.0"
+
glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
@@ -11410,6 +11512,13 @@ jackspeak@^3.1.2:
optionalDependencies:
"@pkgjs/parseargs" "^0.11.0"
+jackspeak@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae"
+ integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+
jake@^10.8.5:
version "10.8.5"
resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46"
@@ -12814,6 +12923,11 @@ lru-cache@^10.2.0:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+lru-cache@^11.0.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117"
+ integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==
+
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@@ -12910,6 +13024,11 @@ marked@4.1.1:
resolved "https://registry.yarnpkg.com/marked/-/marked-4.1.1.tgz#2f709a4462abf65a283f2453dc1c42ab177d302e"
integrity sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==
+marked@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
+ integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
+
matchmediaquery@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.3.1.tgz#8247edc47e499ebb7c58f62a9ff9ccf5b815c6d7"
@@ -13542,6 +13661,13 @@ minimatch@3.1.2, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch
dependencies:
brace-expansion "^1.1.7"
+minimatch@^10.0.3:
+ version "10.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa"
+ integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
+ dependencies:
+ "@isaacs/brace-expansion" "^5.0.0"
+
minimatch@^5.0.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.1.tgz#6c9dffcf9927ff2a31e74b5af11adf8b9604b022"
@@ -14261,6 +14387,14 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+path-scurry@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580"
+ integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==
+ dependencies:
+ lru-cache "^11.0.0"
+ minipass "^7.1.2"
+
path-to-regexp@0.1.12:
version "0.1.12"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
@@ -16543,6 +16677,14 @@ rimraf@^3.0.0, rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
+rimraf@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.0.1.tgz#ffb8ad8844dd60332ab15f52bc104bc3ed71ea4e"
+ integrity sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==
+ dependencies:
+ glob "^11.0.0"
+ package-json-from-dist "^1.0.0"
+
rimraf@~2.6.2:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
@@ -17439,7 +17581,7 @@ stringify-object@^3.3.0:
is-obj "^1.0.1"
is-regexp "^1.0.0"
-"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -17453,6 +17595,13 @@ strip-ansi@^3.0.0:
dependencies:
ansi-regex "^2.0.0"
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-ansi@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
@@ -17977,6 +18126,11 @@ tinycolor2@^1.4.1:
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e"
integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
+tinymce@^7.9.1:
+ version "7.9.1"
+ resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-7.9.1.tgz#1b18bad9cb7a3b4b12e3e5a7f29fc7daad0713d7"
+ integrity sha512-zaOHwmiP1EqTeLRXAvVriDb00JYnfEjWGPdKEuac7MiZJ5aiDMZ4Unc98Gmajn+PBljOmO1GKV6G0KwWn3+k8A==
+
tmpl@1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
@@ -18272,6 +18426,11 @@ typescript@^4.8.4:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78"
integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==
+typo-js@*:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.2.5.tgz#0aa65e0be9b69036463a3827de8185b4144e3086"
+ integrity sha512-F45vFWdGX8xahIk/sOp79z2NJs8ETMYsmMChm9D5Hlx3+9j7VnCyQyvij5MOCrNY3NNe8noSyokRjQRfq+Bc7A==
+
ua-parser-js@^0.7.30:
version "0.7.35"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307"
@@ -19291,7 +19450,7 @@ workbox-window@6.5.4:
"@types/trusted-types" "^2.0.2"
workbox-core "6.5.4"
-"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -19309,6 +19468,15 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.0.1.tgz#2101e861777fec527d0ea90c57c6b03aac56a5b3"