From c5c0cf2d5b5a527ff835b63133f034d06fb84a42 Mon Sep 17 00:00:00 2001 From: dat Date: Fri, 27 Jun 2025 17:01:19 +0700 Subject: [PATCH 001/102] Topcoder admin app: move src/apps/gamification-admin -> src/apps/admin (cherry picked from commit 2f1995bd7331ff83ae0f782709639fe8ad3403d7) --- src/apps/admin/src/admin-app.routes.tsx | 8 ++++---- .../BillingAccountsTable/BillingAccountsTable.tsx | 2 +- .../src/lib/components/ClientsTable/ClientsTable.tsx | 2 +- .../components/ReviewSummaryList/ReviewSummaryList.tsx | 2 +- .../src/lib/components/ReviewerList/ReviewerList.tsx | 2 +- src/apps/admin/src/lib/hooks/useManageBillingAccounts.ts | 2 +- src/apps/admin/src/lib/hooks/useManageClients.ts | 2 +- src/apps/admin/src/lib/hooks/useTableFilterBackend.ts | 2 +- src/apps/admin/src/lib/hooks/useTableFilterLocal.ts | 2 +- .../{ => admin/src/platform}/gamification-admin/README.md | 0 .../{ => admin/src/platform}/gamification-admin/index.ts | 0 .../src/platform}/gamification-admin/src/config/index.ts | 0 .../gamification-admin/src/game-lib/game-badge.model.ts | 0 .../hooks/use-get-game-badge-assignees-page.hook.ts | 0 .../src/game-lib/hooks/use-get-game-badge-details.hook.ts | 0 .../src/game-lib/hooks/use-get-game-badges-page.hook.ts | 0 .../platform}/gamification-admin/src/game-lib/index.ts | 0 .../InputHandleAutocomplete.module.scss | 0 .../member-autocomplete/InputHandleAutocomplete.tsx | 0 .../src/game-lib/member-autocomplete/index.ts | 0 .../member-autocomplete/input-handle-functions.ts | 0 .../badge-activated-modal/BadgeActivatedModal.module.scss | 0 .../modals/badge-activated-modal/BadgeActivatedModal.tsx | 0 .../src/game-lib/modals/badge-activated-modal/index.ts | 0 .../badge-assigned-modal/BadgeAssignedModal.module.scss | 0 .../modals/badge-assigned-modal/BadgeAssignedModal.tsx | 0 .../src/game-lib/modals/badge-assigned-modal/index.ts | 0 .../badge-created-modal/BadgeCreatedModal.module.scss | 0 .../modals/badge-created-modal/BadgeCreatedModal.tsx | 0 .../src/game-lib/modals/badge-created-modal/index.ts | 0 .../gamification-admin/src/game-lib/pagination/index.ts | 0 .../src/game-lib/pagination/infinite-page-dao.model.ts | 0 .../game-lib/pagination/infinite-page-handler.model.ts | 0 .../src/game-lib/pagination/page.model.ts | 0 .../src/game-lib/pagination/sort.model.ts | 0 .../src/game-lib/pagination/use-infinite-page.hook.ts | 0 .../gamification-admin/src/gamification-admin.routes.tsx | 0 .../src/platform}/gamification-admin/src/index.ts | 0 .../AwardedMembersTab/AwardedMembersTab.module.scss | 0 .../badge-detail/AwardedMembersTab/AwardedMembersTab.tsx | 0 .../awarded-members-table.config.tsx | 0 .../MemberActionRenderer.module.scss | 0 .../member-action-renderer/MemberActionRenderer.tsx | 0 .../awarded-members-table/member-action-renderer/index.ts | 0 .../MemberAwaredAtRenderer.module.scss | 0 .../member-awardedAt-renderer/MemberAwaredAtRenderer.tsx | 0 .../member-awardedAt-renderer/index.ts | 0 .../MemberHandleRenderer.module.scss | 0 .../member-handle-renderer/MemberHandleRenderer.tsx | 0 .../awarded-members-table/member-handle-renderer/index.ts | 0 .../src/pages/badge-detail/AwardedMembersTab/index.ts | 0 .../src/pages/badge-detail/BadgeDetailPage.module.scss | 0 .../src/pages/badge-detail/BadgeDetailPage.tsx | 0 .../badge-detail/BatchAwardTab/BatchAwardTab.module.scss | 0 .../pages/badge-detail/BatchAwardTab/BatchAwardTab.tsx | 0 .../src/pages/badge-detail/BatchAwardTab/index.ts | 0 .../ManualAwardTab/ManualAwardTab.module.scss | 0 .../pages/badge-detail/ManualAwardTab/ManualAwardTab.tsx | 0 .../src/pages/badge-detail/ManualAwardTab/index.ts | 0 .../src/pages/badge-detail/badge-details-tabs.config.ts | 0 .../src/pages/badge-detail/badge-details.functions.ts | 0 .../src/pages/badge-detail/batch-assign-badge.store.ts | 0 .../src/pages/badge-detail/manual-assign-badge.store.ts | 0 .../src/pages/badge-detail/update-badge.store.ts | 0 .../src/pages/badge-detail/updated-badge-request.model.ts | 0 .../src/pages/badge-listing/BadgeListingPage.module.scss | 0 .../src/pages/badge-listing/BadgeListingPage.tsx | 0 .../badge-action-renderer/BadgeActionRenderer.module.scss | 0 .../badge-action-renderer/BadgeActionRenderer.tsx | 0 .../badge-listing-table/badge-action-renderer/index.ts | 0 .../badge-listing-table/badge-listing-table.config.tsx | 0 .../BadgeListingNameRenderer.module.scss | 0 .../badge-name-renderer/BadgeListingNameRenderer.tsx | 0 .../badge-listing-table/badge-name-renderer/index.ts | 0 .../src/pages/badge-listing/badge-listing-table/index.ts | 0 .../src/pages/create-badge/CreateBadgePage.module.scss | 0 .../src/pages/create-badge/CreateBadgePage.tsx | 0 .../create-badge/create-badge-form/CreateBadgeForm.tsx | 0 .../create-badge-form/create-badge-form.config.tsx | 0 .../create-badge-store/create-badge-request.model.ts | 0 .../create-badge-store/create-badge.store.ts | 0 .../create-badge-functions/create-badge-store/index.ts | 0 .../create-badge-functions/create-badge.functions.ts | 2 +- .../create-badge-form/create-badge-functions/index.ts | 0 .../src/pages/create-badge/create-badge-form/index.ts | 0 .../ManageReviewerPage/ManageReviewerPage.tsx | 2 +- .../ReviewManagementPage/ReviewManagementPage.tsx | 2 +- .../src/lib/components/filter-bar/FilterBar.tsx | 5 ++++- .../wallet/src/lib/components/filter-bar/FilterBar.tsx | 2 +- src/libs/ui/lib/components/table/Table.tsx | 2 +- .../components/table/table-functions/table.functions.ts | 3 ++- src/libs/ui/lib/components/table/table-sort/TableSort.tsx | 3 ++- 92 files changed, 25 insertions(+), 20 deletions(-) rename src/apps/{ => admin/src/platform}/gamification-admin/README.md (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/config/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/game-badge.model.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/hooks/use-get-game-badge-assignees-page.hook.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/hooks/use-get-game-badge-details.hook.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/hooks/use-get-game-badges-page.hook.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/member-autocomplete/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/member-autocomplete/input-handle-functions.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-activated-modal/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-assigned-modal/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/modals/badge-created-modal/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/pagination/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/pagination/infinite-page-dao.model.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/pagination/infinite-page-handler.model.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/pagination/page.model.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/pagination/sort.model.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/game-lib/pagination/use-infinite-page.hook.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/gamification-admin.routes.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/awarded-members-table.config.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/AwardedMembersTab/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/BadgeDetailPage.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/BadgeDetailPage.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/BatchAwardTab/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/ManualAwardTab/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/badge-details-tabs.config.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/badge-details.functions.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/batch-assign-badge.store.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/manual-assign-badge.store.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/update-badge.store.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-detail/updated-badge-request.model.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/BadgeListingPage.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/BadgeListingPage.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-listing-table.config.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/badge-listing/badge-listing-table/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/CreateBadgePage.module.scss (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/CreateBadgePage.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/create-badge-form/CreateBadgeForm.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-form.config.tsx (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge-request.model.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge.store.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge.functions.ts (73%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/index.ts (100%) rename src/apps/{ => admin/src/platform}/gamification-admin/src/pages/create-badge/create-badge-form/index.ts (100%) diff --git a/src/apps/admin/src/admin-app.routes.tsx b/src/apps/admin/src/admin-app.routes.tsx index b64649b3b..ec2648d75 100644 --- a/src/apps/admin/src/admin-app.routes.tsx +++ b/src/apps/admin/src/admin-app.routes.tsx @@ -1,4 +1,4 @@ -import { baseDetailPath, createBadgePath } from '~/apps/gamification-admin' +import { baseDetailPath, createBadgePath } from '~/apps/admin/src/platform/gamification-admin' import { AppSubdomain, ToolTitle } from '~/config' import { lazyLoad, @@ -120,13 +120,13 @@ const SkillManagementLandingPage: LazyLoadedComponent = lazyLoad( 'LandingPage', ) const BadgeDetailPage: LazyLoadedComponent = lazyLoad( - () => import('../../gamification-admin/src/pages/badge-detail/BadgeDetailPage'), + () => import('./platform/gamification-admin/src/pages/badge-detail/BadgeDetailPage'), ) const BadgeListingPage: LazyLoadedComponent = lazyLoad( - () => import('../../gamification-admin/src/pages/badge-listing/BadgeListingPage'), + () => import('./platform/gamification-admin/src/pages/badge-listing/BadgeListingPage'), ) const CreateBadgePage: LazyLoadedComponent = lazyLoad( - () => import('../../gamification-admin/src/pages/create-badge/CreateBadgePage'), + () => import('./platform/gamification-admin/src/pages/create-badge/CreateBadgePage'), ) export const toolTitle: string = ToolTitle.admin diff --git a/src/apps/admin/src/lib/components/BillingAccountsTable/BillingAccountsTable.tsx b/src/apps/admin/src/lib/components/BillingAccountsTable/BillingAccountsTable.tsx index fe6f2a046..30518a117 100644 --- a/src/apps/admin/src/lib/components/BillingAccountsTable/BillingAccountsTable.tsx +++ b/src/apps/admin/src/lib/components/BillingAccountsTable/BillingAccountsTable.tsx @@ -5,7 +5,7 @@ import { Dispatch, FC, SetStateAction, useMemo } from 'react' import { Link } from 'react-router-dom' import classNames from 'classnames' -import { Sort } from '~/apps/gamification-admin/src/game-lib' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { colWidthType, LinkButton, Table, TableColumn } from '~/libs/ui' import { useWindowSize, WindowSize } from '~/libs/shared' diff --git a/src/apps/admin/src/lib/components/ClientsTable/ClientsTable.tsx b/src/apps/admin/src/lib/components/ClientsTable/ClientsTable.tsx index 2338f4b75..42a90ee0f 100644 --- a/src/apps/admin/src/lib/components/ClientsTable/ClientsTable.tsx +++ b/src/apps/admin/src/lib/components/ClientsTable/ClientsTable.tsx @@ -5,7 +5,7 @@ import { Dispatch, FC, SetStateAction, useMemo } from 'react' import { Link } from 'react-router-dom' import classNames from 'classnames' -import { Sort } from '~/apps/gamification-admin/src/game-lib' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { useWindowSize, WindowSize } from '~/libs/shared' import { colWidthType, Table, TableColumn } from '~/libs/ui' diff --git a/src/apps/admin/src/lib/components/ReviewSummaryList/ReviewSummaryList.tsx b/src/apps/admin/src/lib/components/ReviewSummaryList/ReviewSummaryList.tsx index 8758a014b..f95ee26fa 100644 --- a/src/apps/admin/src/lib/components/ReviewSummaryList/ReviewSummaryList.tsx +++ b/src/apps/admin/src/lib/components/ReviewSummaryList/ReviewSummaryList.tsx @@ -4,7 +4,7 @@ import { useNavigate } from 'react-router-dom' import { EnvironmentConfig } from '~/config' import { useWindowSize, WindowSize } from '~/libs/shared' import { Button, colWidthType, LinkButton, Table, type TableColumn } from '~/libs/ui' -import { Sort } from '~/apps/gamification-admin/src/game-lib/pagination' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { Pagination } from '../common/Pagination' import { useEventCallback } from '../../hooks' diff --git a/src/apps/admin/src/lib/components/ReviewerList/ReviewerList.tsx b/src/apps/admin/src/lib/components/ReviewerList/ReviewerList.tsx index ade329594..4960400ae 100644 --- a/src/apps/admin/src/lib/components/ReviewerList/ReviewerList.tsx +++ b/src/apps/admin/src/lib/components/ReviewerList/ReviewerList.tsx @@ -10,7 +10,7 @@ import { Table, type TableColumn, } from '~/libs/ui' -import { Sort } from '~/apps/gamification-admin/src/game-lib/pagination' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { Reviewer } from '../../models' import { useEventCallback } from '../../hooks' diff --git a/src/apps/admin/src/lib/hooks/useManageBillingAccounts.ts b/src/apps/admin/src/lib/hooks/useManageBillingAccounts.ts index 680765b09..d49a4aec0 100644 --- a/src/apps/admin/src/lib/hooks/useManageBillingAccounts.ts +++ b/src/apps/admin/src/lib/hooks/useManageBillingAccounts.ts @@ -7,7 +7,7 @@ import { useReducer, } from 'react' -import { Sort } from '~/apps/gamification-admin/src/game-lib' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { TABLE_PAGINATION_ITEM_PER_PAGE } from '../../config/index.config' import { BillingAccount, FormBillingAccountsFilter } from '../models' diff --git a/src/apps/admin/src/lib/hooks/useManageClients.ts b/src/apps/admin/src/lib/hooks/useManageClients.ts index f7b9af786..9594e6ad1 100644 --- a/src/apps/admin/src/lib/hooks/useManageClients.ts +++ b/src/apps/admin/src/lib/hooks/useManageClients.ts @@ -7,7 +7,7 @@ import { useReducer, } from 'react' -import { Sort } from '~/apps/gamification-admin/src/game-lib' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { TABLE_PAGINATION_ITEM_PER_PAGE } from '../../config/index.config' import { ClientInfo, FormClientsFilter } from '../models' diff --git a/src/apps/admin/src/lib/hooks/useTableFilterBackend.ts b/src/apps/admin/src/lib/hooks/useTableFilterBackend.ts index 0c1723d78..988ea4016 100644 --- a/src/apps/admin/src/lib/hooks/useTableFilterBackend.ts +++ b/src/apps/admin/src/lib/hooks/useTableFilterBackend.ts @@ -10,7 +10,7 @@ import { useState, } from 'react' -import { Sort } from '~/apps/gamification-admin/src/game-lib' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' export interface useTableFilterBackendProps { page: number diff --git a/src/apps/admin/src/lib/hooks/useTableFilterLocal.ts b/src/apps/admin/src/lib/hooks/useTableFilterLocal.ts index f371440a5..32f1f18e7 100644 --- a/src/apps/admin/src/lib/hooks/useTableFilterLocal.ts +++ b/src/apps/admin/src/lib/hooks/useTableFilterLocal.ts @@ -4,7 +4,7 @@ import { Dispatch, SetStateAction, useEffect, useMemo, useState } from 'react' import _ from 'lodash' -import { Sort } from '~/apps/gamification-admin/src/game-lib' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { TABLE_PAGINATION_ITEM_PER_PAGE } from '../../config/index.config' import { checkIsDateObject, checkIsNumberObject, checkIsStringNumeric } from '../utils' diff --git a/src/apps/gamification-admin/README.md b/src/apps/admin/src/platform/gamification-admin/README.md similarity index 100% rename from src/apps/gamification-admin/README.md rename to src/apps/admin/src/platform/gamification-admin/README.md diff --git a/src/apps/gamification-admin/index.ts b/src/apps/admin/src/platform/gamification-admin/index.ts similarity index 100% rename from src/apps/gamification-admin/index.ts rename to src/apps/admin/src/platform/gamification-admin/index.ts diff --git a/src/apps/gamification-admin/src/config/index.ts b/src/apps/admin/src/platform/gamification-admin/src/config/index.ts similarity index 100% rename from src/apps/gamification-admin/src/config/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/config/index.ts diff --git a/src/apps/gamification-admin/src/game-lib/game-badge.model.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/game-badge.model.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/game-badge.model.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/game-badge.model.ts diff --git a/src/apps/gamification-admin/src/game-lib/hooks/use-get-game-badge-assignees-page.hook.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/hooks/use-get-game-badge-assignees-page.hook.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/hooks/use-get-game-badge-assignees-page.hook.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/hooks/use-get-game-badge-assignees-page.hook.ts diff --git a/src/apps/gamification-admin/src/game-lib/hooks/use-get-game-badge-details.hook.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/hooks/use-get-game-badge-details.hook.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/hooks/use-get-game-badge-details.hook.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/hooks/use-get-game-badge-details.hook.ts diff --git a/src/apps/gamification-admin/src/game-lib/hooks/use-get-game-badges-page.hook.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/hooks/use-get-game-badges-page.hook.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/hooks/use-get-game-badges-page.hook.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/hooks/use-get-game-badges-page.hook.ts diff --git a/src/apps/gamification-admin/src/game-lib/index.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/index.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/index.ts diff --git a/src/apps/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.module.scss b/src/apps/admin/src/platform/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.module.scss similarity index 100% rename from src/apps/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.module.scss diff --git a/src/apps/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.tsx b/src/apps/admin/src/platform/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.tsx similarity index 100% rename from src/apps/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.tsx rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/member-autocomplete/InputHandleAutocomplete.tsx diff --git a/src/apps/gamification-admin/src/game-lib/member-autocomplete/index.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/member-autocomplete/index.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/member-autocomplete/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/member-autocomplete/index.ts diff --git a/src/apps/gamification-admin/src/game-lib/member-autocomplete/input-handle-functions.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/member-autocomplete/input-handle-functions.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/member-autocomplete/input-handle-functions.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/member-autocomplete/input-handle-functions.ts diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.module.scss b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.module.scss similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.module.scss diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.tsx b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.tsx similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.tsx rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-activated-modal/BadgeActivatedModal.tsx diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-activated-modal/index.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-activated-modal/index.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-activated-modal/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-activated-modal/index.ts diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.module.scss b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.module.scss similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.module.scss diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.tsx b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.tsx similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.tsx rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-assigned-modal/BadgeAssignedModal.tsx diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-assigned-modal/index.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-assigned-modal/index.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-assigned-modal/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-assigned-modal/index.ts diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.module.scss b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.module.scss similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.module.scss diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/index.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-created-modal/index.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/modals/badge-created-modal/index.ts diff --git a/src/apps/gamification-admin/src/game-lib/pagination/index.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/index.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/pagination/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/index.ts diff --git a/src/apps/gamification-admin/src/game-lib/pagination/infinite-page-dao.model.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/infinite-page-dao.model.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/pagination/infinite-page-dao.model.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/infinite-page-dao.model.ts diff --git a/src/apps/gamification-admin/src/game-lib/pagination/infinite-page-handler.model.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/infinite-page-handler.model.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/pagination/infinite-page-handler.model.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/infinite-page-handler.model.ts diff --git a/src/apps/gamification-admin/src/game-lib/pagination/page.model.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/page.model.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/pagination/page.model.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/page.model.ts diff --git a/src/apps/gamification-admin/src/game-lib/pagination/sort.model.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/sort.model.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/pagination/sort.model.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/sort.model.ts diff --git a/src/apps/gamification-admin/src/game-lib/pagination/use-infinite-page.hook.ts b/src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/use-infinite-page.hook.ts similarity index 100% rename from src/apps/gamification-admin/src/game-lib/pagination/use-infinite-page.hook.ts rename to src/apps/admin/src/platform/gamification-admin/src/game-lib/pagination/use-infinite-page.hook.ts diff --git a/src/apps/gamification-admin/src/gamification-admin.routes.tsx b/src/apps/admin/src/platform/gamification-admin/src/gamification-admin.routes.tsx similarity index 100% rename from src/apps/gamification-admin/src/gamification-admin.routes.tsx rename to src/apps/admin/src/platform/gamification-admin/src/gamification-admin.routes.tsx diff --git a/src/apps/gamification-admin/src/index.ts b/src/apps/admin/src/platform/gamification-admin/src/index.ts similarity index 100% rename from src/apps/gamification-admin/src/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/awarded-members-table.config.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/awarded-members-table.config.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/awarded-members-table.config.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/awarded-members-table.config.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/MemberActionRenderer.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-action-renderer/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/MemberAwaredAtRenderer.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-awardedAt-renderer/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/MemberHandleRenderer.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/awarded-members-table/member-handle-renderer/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/AwardedMembersTab/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/AwardedMembersTab/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/BadgeDetailPage.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BadgeDetailPage.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/BadgeDetailPage.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BadgeDetailPage.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-detail/BadgeDetailPage.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BadgeDetailPage.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/BadgeDetailPage.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BadgeDetailPage.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BatchAwardTab/BatchAwardTab.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-detail/BatchAwardTab/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BatchAwardTab/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/BatchAwardTab/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/BatchAwardTab/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/ManualAwardTab/ManualAwardTab.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-detail/ManualAwardTab/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/ManualAwardTab/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/ManualAwardTab/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/ManualAwardTab/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/badge-details-tabs.config.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/badge-details-tabs.config.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/badge-details-tabs.config.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/badge-details-tabs.config.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/badge-details.functions.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/badge-details.functions.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/badge-details.functions.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/badge-details.functions.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/batch-assign-badge.store.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/batch-assign-badge.store.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/batch-assign-badge.store.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/batch-assign-badge.store.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/manual-assign-badge.store.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/manual-assign-badge.store.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/manual-assign-badge.store.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/manual-assign-badge.store.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/update-badge.store.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/update-badge.store.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/update-badge.store.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/update-badge.store.ts diff --git a/src/apps/gamification-admin/src/pages/badge-detail/updated-badge-request.model.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/updated-badge-request.model.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-detail/updated-badge-request.model.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-detail/updated-badge-request.model.ts diff --git a/src/apps/gamification-admin/src/pages/badge-listing/BadgeListingPage.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/BadgeListingPage.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/BadgeListingPage.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/BadgeListingPage.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-listing/BadgeListingPage.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/BadgeListingPage.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/BadgeListingPage.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/BadgeListingPage.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/BadgeActionRenderer.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-action-renderer/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-listing-table.config.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-listing-table.config.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-listing-table.config.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-listing-table.config.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.module.scss diff --git a/src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/BadgeListingNameRenderer.tsx diff --git a/src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/badge-name-renderer/index.ts diff --git a/src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/badge-listing/badge-listing-table/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/badge-listing/badge-listing-table/index.ts diff --git a/src/apps/gamification-admin/src/pages/create-badge/CreateBadgePage.module.scss b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/CreateBadgePage.module.scss similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/CreateBadgePage.module.scss rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/CreateBadgePage.module.scss diff --git a/src/apps/gamification-admin/src/pages/create-badge/CreateBadgePage.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/CreateBadgePage.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/CreateBadgePage.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/CreateBadgePage.tsx diff --git a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/CreateBadgeForm.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/CreateBadgeForm.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/create-badge-form/CreateBadgeForm.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/CreateBadgeForm.tsx diff --git a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-form.config.tsx b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-form.config.tsx similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-form.config.tsx rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-form.config.tsx diff --git a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge-request.model.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge-request.model.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge-request.model.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge-request.model.ts diff --git a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge.store.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge.store.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge.store.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/create-badge.store.ts diff --git a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge-store/index.ts diff --git a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge.functions.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge.functions.ts similarity index 73% rename from src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge.functions.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge.functions.ts index 2b5714ff7..cdf74cd37 100644 --- a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge.functions.ts +++ b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/create-badge.functions.ts @@ -1,4 +1,4 @@ -import { GameBadge } from '~/apps/gamification-admin/src/game-lib' +import { GameBadge } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { CreateBadgeRequest, createBadgeSubmitRequestAsync } from './create-badge-store' diff --git a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/create-badge-functions/index.ts diff --git a/src/apps/gamification-admin/src/pages/create-badge/create-badge-form/index.ts b/src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/index.ts similarity index 100% rename from src/apps/gamification-admin/src/pages/create-badge/create-badge-form/index.ts rename to src/apps/admin/src/platform/gamification-admin/src/pages/create-badge/create-badge-form/index.ts diff --git a/src/apps/admin/src/review-management/ManageReviewerPage/ManageReviewerPage.tsx b/src/apps/admin/src/review-management/ManageReviewerPage/ManageReviewerPage.tsx index d0eb114d4..1ab05a46c 100644 --- a/src/apps/admin/src/review-management/ManageReviewerPage/ManageReviewerPage.tsx +++ b/src/apps/admin/src/review-management/ManageReviewerPage/ManageReviewerPage.tsx @@ -17,7 +17,7 @@ import { LoadingSpinner, PageTitle, } from '~/libs/ui' -import { Sort } from '~/apps/gamification-admin/src/game-lib/pagination' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { Display, diff --git a/src/apps/admin/src/review-management/ReviewManagementPage/ReviewManagementPage.tsx b/src/apps/admin/src/review-management/ReviewManagementPage/ReviewManagementPage.tsx index 87061d7d6..70ee17d9b 100644 --- a/src/apps/admin/src/review-management/ReviewManagementPage/ReviewManagementPage.tsx +++ b/src/apps/admin/src/review-management/ReviewManagementPage/ReviewManagementPage.tsx @@ -11,7 +11,7 @@ import { import { sortBy } from 'lodash' import { LoadingSpinner, PageTitle } from '~/libs/ui' -import { Sort } from '~/apps/gamification-admin/src/game-lib/pagination' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { Display, diff --git a/src/apps/wallet-admin/src/lib/components/filter-bar/FilterBar.tsx b/src/apps/wallet-admin/src/lib/components/filter-bar/FilterBar.tsx index 154292610..5b53ba647 100644 --- a/src/apps/wallet-admin/src/lib/components/filter-bar/FilterBar.tsx +++ b/src/apps/wallet-admin/src/lib/components/filter-bar/FilterBar.tsx @@ -2,7 +2,10 @@ import React, { ChangeEvent } from 'react' import { Button, IconOutline, InputSelect, InputText } from '~/libs/ui' -import { InputHandleAutocomplete, MembersAutocompeteResult } from '~/apps/gamification-admin/src/game-lib' +import { + InputHandleAutocomplete, + MembersAutocompeteResult, +} from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import styles from './FilterBar.module.scss' diff --git a/src/apps/wallet/src/lib/components/filter-bar/FilterBar.tsx b/src/apps/wallet/src/lib/components/filter-bar/FilterBar.tsx index f21ecf92c..b82ae5a5c 100644 --- a/src/apps/wallet/src/lib/components/filter-bar/FilterBar.tsx +++ b/src/apps/wallet/src/lib/components/filter-bar/FilterBar.tsx @@ -2,7 +2,7 @@ import React, { ChangeEvent } from 'react' import { Button, InputSelect, InputText } from '~/libs/ui' -import { InputHandleAutocomplete, MembersAutocompeteResult } from '~/apps/gamification-admin/src/game-lib' +import { InputHandleAutocomplete, MembersAutocompeteResult } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import styles from './FilterBar.module.scss' diff --git a/src/libs/ui/lib/components/table/Table.tsx b/src/libs/ui/lib/components/table/Table.tsx index 9786666e5..900b34e19 100644 --- a/src/libs/ui/lib/components/table/Table.tsx +++ b/src/libs/ui/lib/components/table/Table.tsx @@ -2,10 +2,10 @@ import { Dispatch, SetStateAction, useEffect, useMemo, useRef, useState } from ' import _ from 'lodash' import classNames from 'classnames' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' import { useWindowSize, WindowSize } from '~/libs/shared' import { Button } from '../button' -import { Sort } from '../../../../../apps/gamification-admin/src/game-lib/pagination' import { IconOutline } from '../svgs' import { Tooltip } from '../tooltip' import '../../styles/_includes.scss' 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 6c98b2857..10fd8bbde 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 @@ -1,4 +1,5 @@ -import { Sort } from '../../../../../../apps/gamification-admin/src/game-lib/pagination' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' + import { TableColumn } from '../table-column.model' export function getDefaultSort(columns: ReadonlyArray>, initSort?: Sort): Sort { diff --git a/src/libs/ui/lib/components/table/table-sort/TableSort.tsx b/src/libs/ui/lib/components/table/table-sort/TableSort.tsx index c5a04797c..497f0ebcf 100644 --- a/src/libs/ui/lib/components/table/table-sort/TableSort.tsx +++ b/src/libs/ui/lib/components/table/table-sort/TableSort.tsx @@ -1,7 +1,8 @@ import { FC, SVGProps } from 'react' import classNames from 'classnames' -import { Sort } from '../../../../../../apps/gamification-admin/src/game-lib/pagination' +import { Sort } from '~/apps/admin/src/platform/gamification-admin/src/game-lib' + import { IconOutline } from '../../svgs' import { Button } from '../../button' From 16ca231f44907b04ef68a92e7f5eb30d41b1a734 Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Tue, 8 Jul 2025 19:42:02 +0530 Subject: [PATCH 002/102] PM-1456 Remove security section from account settings --- .../src/settings/tabs/account/AccountTab.tsx | 3 - .../account/security/Security.module.scss | 43 ---- .../tabs/account/security/Security.tsx | 143 ----------- .../ConnectionHandler/index.tsx | 24 -- .../DiceSetupModal.module.scss | 68 ----- .../dice-setup-modal/DiceSetupModal.tsx | 240 ------------------ .../security/dice-setup-modal/index.ts | 1 - .../settings/tabs/account/security/index.ts | 1 - 8 files changed, 523 deletions(-) delete mode 100644 src/apps/accounts/src/settings/tabs/account/security/Security.module.scss delete mode 100644 src/apps/accounts/src/settings/tabs/account/security/Security.tsx delete mode 100644 src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/ConnectionHandler/index.tsx delete mode 100644 src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/DiceSetupModal.module.scss delete mode 100644 src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/DiceSetupModal.tsx delete mode 100644 src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/index.ts delete mode 100644 src/apps/accounts/src/settings/tabs/account/security/index.ts diff --git a/src/apps/accounts/src/settings/tabs/account/AccountTab.tsx b/src/apps/accounts/src/settings/tabs/account/AccountTab.tsx index b0551acda..3d33610b7 100644 --- a/src/apps/accounts/src/settings/tabs/account/AccountTab.tsx +++ b/src/apps/accounts/src/settings/tabs/account/AccountTab.tsx @@ -3,7 +3,6 @@ import { FC } from 'react' import { UserProfile, UserTraits } from '~/libs/core' import { AccountRole } from './account-role' -import { SecuritySection } from './security' import { UserAndPassword } from './user-and-pass' import { MemberAddress } from './address' import styles from './AccountTab.module.scss' @@ -22,8 +21,6 @@ const AccountTab: FC = (props: AccountTabProps) => ( - - ) diff --git a/src/apps/accounts/src/settings/tabs/account/security/Security.module.scss b/src/apps/accounts/src/settings/tabs/account/security/Security.module.scss deleted file mode 100644 index d80b6953d..000000000 --- a/src/apps/accounts/src/settings/tabs/account/security/Security.module.scss +++ /dev/null @@ -1,43 +0,0 @@ -@import '@libs/ui/styles/includes'; - -.container { - margin: $sp-8 0; - - .content { - display: grid; - grid-template-columns: 1fr; - margin-bottom: 0; - - >p { - max-width: 380px; - } - - .imageWrap { - padding: $sp-2; - background-color: $black-5; - border-radius: 4px; - margin-right: $sp-2; - align-self: flex-start; - } - - .diceBtnWrap { - display: flex; - align-items: center; - color: #767676; - - @include ltelg { - margin-top: $sp-4; - } - - .diceIdButton { - align-self: center; - } - - svg { - width: 24px; - height: 24px; - margin-left: $sp-2; - } - } - } -} \ No newline at end of file diff --git a/src/apps/accounts/src/settings/tabs/account/security/Security.tsx b/src/apps/accounts/src/settings/tabs/account/security/Security.tsx deleted file mode 100644 index f521783bf..000000000 --- a/src/apps/accounts/src/settings/tabs/account/security/Security.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react' -import { toast } from 'react-toastify' -import { KeyedMutator } from 'swr' - -import { Button, Collapsible, FormToggleSwitch } from '~/libs/ui' -import { diceIdLogo, MFAImage, SettingSection, triggerSurvey } from '~/apps/accounts/src/lib' -import { MemberMFAStatus, updateMemberMFAStatusAsync, useMemberMFAStatus, UserProfile } from '~/libs/core' - -import { DiceSetupModal } from './dice-setup-modal' -import styles from './Security.module.scss' - -interface SecurityProps { - profile: UserProfile -} - -const Security: FC = (props: SecurityProps) => { - const [setupDiceModalOpen, setSetupDiceModalOpen]: [boolean, Dispatch>] = useState(false) - - const { data: mfaStatusData, mutate: mutateMFAData }: { - data: MemberMFAStatus | undefined - mutate: KeyedMutator, - } = useMemberMFAStatus(props.profile.userId) - - const [mfaEnabled, setMFAEnabled]: [boolean, Dispatch>] = useState(false) - const [diceEnabled, setDiceEnabled]: [boolean, Dispatch>] = useState(false) - - useEffect(() => { - if (mfaStatusData) { - setMFAEnabled(mfaStatusData.mfaEnabled) - setDiceEnabled(mfaStatusData.diceEnabled) - } - }, [mfaStatusData]) - - function handleUserMFAChange(): void { - updateMemberMFAStatusAsync(props.profile.userId, { - param: { - mfaEnabled: !mfaEnabled, - }, - }) - .then(response => { - setMFAEnabled(response.result.content.mfaEnabled) - setDiceEnabled(response.result.content.diceEnabled) - toast.success('Your Multi Factor Authentication (MFA) status was updated.') - triggerSurvey() - }) - .catch(() => { - toast.error('Something went wrong. Please try again later.') - }) - } - - function handleUserDiceChange(): void { - if (!diceEnabled) { - return - } - - updateMemberMFAStatusAsync(props.profile.userId, { - param: { - diceEnabled: !diceEnabled, - }, - }) - .then(response => { - setMFAEnabled(response.result.content.mfaEnabled) - setDiceEnabled(response.result.content.diceEnabled) - toast.success('Your DICE credential was disabled.') - triggerSurvey() - }) - .catch(() => { - toast.error('Something went wrong. Please try again later.') - }) - } - - function handleDiceModalStatus(): void { - setSetupDiceModalOpen(!setupDiceModalOpen) - } - - return ( - Security} - containerClass={styles.container} - contentClass={styles.content} - > - - - - )} - title='Multi Factor Authentication (MFA) Status' - // eslint-disable-next-line max-len - infoText='Status of MFA for your Topcoder account. If enabled, MFA will be enforced during the Topcoder login process.' - actionElement={( - - )} - /> - - - DiceID logo - - )} - title='DICE ID Authenticator App' - infoText='DICE ID authentication application.' - actionElement={( -
- { - diceEnabled ? ( - - ) : ( -
- )} - /> - - {setupDiceModalOpen && ( - - )} -
- ) -} - -export default Security diff --git a/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/ConnectionHandler/index.tsx b/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/ConnectionHandler/index.tsx deleted file mode 100644 index 07e3f7075..000000000 --- a/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/ConnectionHandler/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { FC, useEffect } from 'react' - -import { DiceConnectionStatus, useDiceIdConnection } from '~/libs/core' - -interface ConnectionHandlerProps { - onChange: (newStatus: DiceConnectionStatus) => void; - userId: number; -} - -export const ConnectionHandler: FC = ( - props: ConnectionHandlerProps, -) => { - const diceConnection: DiceConnectionStatus | undefined = useDiceIdConnection(props.userId) - - useEffect(() => { - if (diceConnection) { - props.onChange(diceConnection) - } - }, [diceConnection, props]) - - return ( - <> - ) -} diff --git a/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/DiceSetupModal.module.scss b/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/DiceSetupModal.module.scss deleted file mode 100644 index 0fe6f3dec..000000000 --- a/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/DiceSetupModal.module.scss +++ /dev/null @@ -1,68 +0,0 @@ -@import '@libs/ui/styles/includes'; - -.diceModal { - :global(.modal-body) { - align-items: flex-start; - } - - :global(.react-responsive-modal-closeButton) { - display: flex; - } - - .titleWrap { - display: flex; - align-items: center; - - img { - margin-right: $sp-4; - } - } - - .appSoresWrap { - display: flex; - justify-content: space-evenly; - margin: $sp-4 0; - width: 100%; - - .appStoreCard { - display: flex; - flex-direction: column; - } - } - - .qrCode { - margin: auto; - } - - .credentialImage { - height: 280px; - width: 400px; - align-self: center; - } - - .diceBigLogo { - margin: $sp-4 0; - } - - .errorWrap { - display: flex; - align-items: center; - - svg { - margin-right: $sp-2; - width: 28px; - height: 28px; - } - } - - .ctaButtons { - display: flex; - justify-content: space-between; - width: 100%; - flex: 1; - } - - .errorText { - color: #ef476f; - } -} \ No newline at end of file diff --git a/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/DiceSetupModal.tsx b/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/DiceSetupModal.tsx deleted file mode 100644 index 1b03bce41..000000000 --- a/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/DiceSetupModal.tsx +++ /dev/null @@ -1,240 +0,0 @@ -/* eslint-disable complexity */ -import { Dispatch, FC, SetStateAction, useState } from 'react' -import { QRCodeSVG } from 'qrcode.react' -import { toast } from 'react-toastify' -import { KeyedMutator } from 'swr' - -import { BaseModal, Button } from '~/libs/ui' -import { - AppleStore, - credentialImage, - diceIdLogoBig, - diceIdLogoSmall, - googlePlay, -} from '~/apps/accounts/src/lib' -import { DiceConnectionStatus, UserProfile } from '~/libs/core' - -import { ConnectionHandler } from './ConnectionHandler' -import styles from './DiceSetupModal.module.scss' - -const GooglePlayLink: string = 'https://play.google.com/store/apps/details?id=com.diwallet1' -const AppleStoreLink: string = 'https://apps.apple.com/us/app/dice-id/id1624858853' -interface DiceSetupModalProps { - mutateMFAData: KeyedMutator - onClose: () => void - profile: UserProfile -} - -const DiceSetupModal: FC = (props: DiceSetupModalProps) => { - const [step, setStep]: [number, Dispatch>] = useState(1) - - const [diceConnectionUrl, setDiceConnectionUrl] = useState() - - function handleSecondaryButtonClick(): void { - switch (step) { - case 2: return setStep(step - 1) - default: return props.onClose() - } - } - - function handlePrimaryButtonClick(): void { - switch (step) { - case 1: - return setStep(step + 1) - default: return props.onClose() - } - } - - function handleDiceConnectionStatusChange(newStatus: DiceConnectionStatus): void { - if (newStatus.diceEnabled) { - setStep(4) - toast.success('Your credentials have been verified and you are all set for' - + ' MFA using your decentralized identity (DICE ID).') - props.mutateMFAData() - } else if (newStatus.accepted) { - setStep(3) - } else if (newStatus.connection) { - setDiceConnectionUrl(newStatus.connection) - setStep(2) - } - } - - return ( - - DICE ID Title Logo -

DICE ID AUTHENTICATOR SETUP

- - )} - size='body' - classNames={{ modal: styles.diceModal }} - buttons={( -
-
- )} - > - { - step < 4 && ( -

- Step - {' '} - {step} - {' '} - of 3 -

- ) - } - { - step === 1 && ( - <> -

First, please download the DICE ID App from the Google Play Store or the iOS App Store.

-
-
- - Google Play Store - - -
-
- - - - -
-
-

- After you have downloaded and installed the mobile app, - make sure to complete the configuration process. - When ready, click next below. -

- - ) - } - { - step === 2 && ( - <> - -

- Scan the following DICE ID QR Code in your DICE ID - mobile application. -

- {diceConnectionUrl ? ( - - ) : ( -

Loading...

- )} -

- Once the connection is established, the service will - offer you a Verifiable Credential. -
- Press the ACCEPT button in your DICE ID App. -
- If you DECLINE the invitation, please try again after 5 - minutes. -

- - ) - } - { - step === 3 && ( - <> - -

- You will receive the credential offer from Topcoder in the DICE ID wallet home page. -
- Your credentials should get automatically processed in few seconds. -
- If you have disabled the auto-accept feature, - please review the credential offer and manually accept it. -
-
- Example credential offer: -

- Example Credential Offer - - ) - } - { - step === 4 && ( - <> -

Setup completed!

-

- Hello - {' '} - {props.profile.handle} - , -
-
- Your credentials have been verified and you are all set - for MFA using your decentralized identity (DICE ID). -

- DICE ID Logo -

- For more information on DICE ID, please visit - {' '} - - https://www.diceid.com - -

-

Please click Finish below.

- - ) - } -
- ) -} - -export default DiceSetupModal diff --git a/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/index.ts b/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/index.ts deleted file mode 100644 index da7fd8d0c..000000000 --- a/src/apps/accounts/src/settings/tabs/account/security/dice-setup-modal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as DiceSetupModal } from './DiceSetupModal' diff --git a/src/apps/accounts/src/settings/tabs/account/security/index.ts b/src/apps/accounts/src/settings/tabs/account/security/index.ts deleted file mode 100644 index 998d0b21d..000000000 --- a/src/apps/accounts/src/settings/tabs/account/security/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as SecuritySection } from './Security' From 316229f5bb7e6e61e894dfb3f69604c475e8f612 Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Tue, 8 Jul 2025 20:10:50 +0530 Subject: [PATCH 003/102] Rename tab --- src/apps/accounts/src/settings/tabs/account/AccountTab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/accounts/src/settings/tabs/account/AccountTab.tsx b/src/apps/accounts/src/settings/tabs/account/AccountTab.tsx index 3d33610b7..39999ac33 100644 --- a/src/apps/accounts/src/settings/tabs/account/AccountTab.tsx +++ b/src/apps/accounts/src/settings/tabs/account/AccountTab.tsx @@ -14,7 +14,7 @@ interface AccountTabProps { const AccountTab: FC = (props: AccountTabProps) => (
-

ACCOUNT INFORMATION & SECURITY

+

ACCOUNT INFORMATION

From e3e6a6567103ce082faa470f7ef328b8e474da84 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Tue, 8 Jul 2025 17:49:44 +0200 Subject: [PATCH 004/102] fix: null check for copilot stats --- src/apps/copilots/src/services/members.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/copilots/src/services/members.ts b/src/apps/copilots/src/services/members.ts index 6926bd805..750827c82 100644 --- a/src/apps/copilots/src/services/members.ts +++ b/src/apps/copilots/src/services/members.ts @@ -42,8 +42,8 @@ export const getMembersByUserIds = async ( const membersFactory = (members: Member[]): FormattedMembers[] => members.map(member => ({ ...member, - activeProjects: member.stats.find(item => item.COPILOT.activeProjects)?.COPILOT.activeProjects || 0, - copilotFulfillment: member.stats.find(item => item.COPILOT.fulfillment)?.COPILOT.fulfillment || 0, + activeProjects: member.stats.find(item => item.COPILOT?.activeProjects)?.COPILOT?.activeProjects || 0, + copilotFulfillment: member.stats.find(item => item.COPILOT?.fulfillment)?.COPILOT?.fulfillment || 0, })) /** From edddfa0ed9e7bf27e697b0752914bc2908ab387a Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Tue, 8 Jul 2025 17:49:48 +0200 Subject: [PATCH 005/102] fix: null check for copilot stats --- src/apps/copilots/src/services/members.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/copilots/src/services/members.ts b/src/apps/copilots/src/services/members.ts index 750827c82..85b05a16c 100644 --- a/src/apps/copilots/src/services/members.ts +++ b/src/apps/copilots/src/services/members.ts @@ -42,8 +42,8 @@ export const getMembersByUserIds = async ( const membersFactory = (members: Member[]): FormattedMembers[] => members.map(member => ({ ...member, - activeProjects: member.stats.find(item => item.COPILOT?.activeProjects)?.COPILOT?.activeProjects || 0, - copilotFulfillment: member.stats.find(item => item.COPILOT?.fulfillment)?.COPILOT?.fulfillment || 0, + activeProjects: member.stats?.find(item => item.COPILOT?.activeProjects)?.COPILOT?.activeProjects || 0, + copilotFulfillment: member.stats?.find(item => item.COPILOT?.fulfillment)?.COPILOT?.fulfillment || 0, })) /** From 06a863b2aabebf187e49041cae92a165bed2ac12 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Tue, 8 Jul 2025 17:52:50 +0200 Subject: [PATCH 006/102] fix: null check for copilot stats --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1297d2e4a..d6b3cb6b2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -222,6 +222,7 @@ workflows: - LVT-256 - CORE-635 - feat/system-admin + - pm-1464 - deployQa: context: org-global From 8d20c3092ac5f7b316edaad16c29c5e9fa7529b8 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Tue, 8 Jul 2025 21:41:35 +0200 Subject: [PATCH 007/102] fix: redirect to requests page once request is created --- src/apps/copilots/src/pages/copilot-request-form/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/copilots/src/pages/copilot-request-form/index.tsx b/src/apps/copilots/src/pages/copilot-request-form/index.tsx index 8fec31503..3bbcd78a5 100644 --- a/src/apps/copilots/src/pages/copilot-request-form/index.tsx +++ b/src/apps/copilots/src/pages/copilot-request-form/index.tsx @@ -7,6 +7,7 @@ import { profileContext, ProfileContextData } from '~/libs/core' import { Button, IconSolid, InputDatePicker, InputMultiselectOption, InputRadio, InputSelect, InputSelectReact, InputText, InputTextarea } from '~/libs/ui' import { InputSkillSelector } from '~/libs/shared' +import { EnvironmentConfig } from '~/config' import { getProjects } from '../../services/projects' import { ProjectTypes, ProjectTypeValues } from '../../constants' @@ -217,6 +218,7 @@ const CopilotRequestForm: FC<{}> = () => { setIsFormChanged(false) setFormErrors({}) setPaymentType('') + window.location.href = `https://copilots.${EnvironmentConfig.TC_DOMAIN}/requests` }) .catch(e => { toast.error(e.message) From 258c6da8b72b13469e7361edf4ff53febaaf541a Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Tue, 8 Jul 2025 21:42:08 +0200 Subject: [PATCH 008/102] fix: redirect to requests page once request is created --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1297d2e4a..13c605742 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -222,6 +222,7 @@ workflows: - LVT-256 - CORE-635 - feat/system-admin + - pm-1322 - deployQa: context: org-global From 2df6c37609fcc5883f3200745a75445eb77a96fc Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Tue, 8 Jul 2025 22:22:09 +0200 Subject: [PATCH 009/102] fix: redirect to requests page once request is created --- src/apps/copilots/src/pages/copilot-request-form/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps/copilots/src/pages/copilot-request-form/index.tsx b/src/apps/copilots/src/pages/copilot-request-form/index.tsx index 3bbcd78a5..6156c5277 100644 --- a/src/apps/copilots/src/pages/copilot-request-form/index.tsx +++ b/src/apps/copilots/src/pages/copilot-request-form/index.tsx @@ -218,7 +218,10 @@ const CopilotRequestForm: FC<{}> = () => { setIsFormChanged(false) setFormErrors({}) setPaymentType('') - window.location.href = `https://copilots.${EnvironmentConfig.TC_DOMAIN}/requests` + // Added a small timeout for the toast to be visible properly to the users + setTimeout(() => { + window.location.href = `https://copilots.${EnvironmentConfig.TC_DOMAIN}/requests` + }, 1000) }) .catch(e => { toast.error(e.message) From a81813090eb455c7ba8500541848ce9a8c46f867 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Wed, 9 Jul 2025 17:01:11 +0200 Subject: [PATCH 010/102] fix: used router to navigate --- src/apps/copilots/src/pages/copilot-request-form/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/copilots/src/pages/copilot-request-form/index.tsx b/src/apps/copilots/src/pages/copilot-request-form/index.tsx index 6156c5277..fc1eeefda 100644 --- a/src/apps/copilots/src/pages/copilot-request-form/index.tsx +++ b/src/apps/copilots/src/pages/copilot-request-form/index.tsx @@ -2,6 +2,7 @@ import { FC, useContext, useMemo, useState } from 'react' import { bind, debounce, isEmpty } from 'lodash' import { toast } from 'react-toastify' import classNames from 'classnames' +import { useNavigate } from "react-router-dom" import { profileContext, ProfileContextData } from '~/libs/core' import { Button, IconSolid, InputDatePicker, InputMultiselectOption, @@ -17,6 +18,7 @@ import styles from './styles.module.scss' // eslint-disable-next-line const CopilotRequestForm: FC<{}> = () => { const { profile }: ProfileContextData = useContext(profileContext) + const navigate = useNavigate(); const [formValues, setFormValues] = useState({}) const [isFormChanged, setIsFormChanged] = useState(false) @@ -220,7 +222,7 @@ const CopilotRequestForm: FC<{}> = () => { setPaymentType('') // Added a small timeout for the toast to be visible properly to the users setTimeout(() => { - window.location.href = `https://copilots.${EnvironmentConfig.TC_DOMAIN}/requests` + navigate("/requests") }, 1000) }) .catch(e => { From fa09b18d5d6178d54235dfadfd003c5d62e24735 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Wed, 9 Jul 2025 17:09:00 +0200 Subject: [PATCH 011/102] fix: used router to navigate --- src/apps/copilots/src/pages/copilot-request-form/index.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/apps/copilots/src/pages/copilot-request-form/index.tsx b/src/apps/copilots/src/pages/copilot-request-form/index.tsx index fc1eeefda..53d98eecb 100644 --- a/src/apps/copilots/src/pages/copilot-request-form/index.tsx +++ b/src/apps/copilots/src/pages/copilot-request-form/index.tsx @@ -1,14 +1,13 @@ import { FC, useContext, useMemo, useState } from 'react' import { bind, debounce, isEmpty } from 'lodash' import { toast } from 'react-toastify' +import { useNavigate } from 'react-router-dom' import classNames from 'classnames' -import { useNavigate } from "react-router-dom" import { profileContext, ProfileContextData } from '~/libs/core' import { Button, IconSolid, InputDatePicker, InputMultiselectOption, InputRadio, InputSelect, InputSelectReact, InputText, InputTextarea } from '~/libs/ui' import { InputSkillSelector } from '~/libs/shared' -import { EnvironmentConfig } from '~/config' import { getProjects } from '../../services/projects' import { ProjectTypes, ProjectTypeValues } from '../../constants' @@ -18,7 +17,7 @@ import styles from './styles.module.scss' // eslint-disable-next-line const CopilotRequestForm: FC<{}> = () => { const { profile }: ProfileContextData = useContext(profileContext) - const navigate = useNavigate(); + const navigate = useNavigate() const [formValues, setFormValues] = useState({}) const [isFormChanged, setIsFormChanged] = useState(false) @@ -222,7 +221,7 @@ const CopilotRequestForm: FC<{}> = () => { setPaymentType('') // Added a small timeout for the toast to be visible properly to the users setTimeout(() => { - navigate("/requests") + navigate('/requests') }, 1000) }) .catch(e => { From 9f88d4a12c79d924fb634b9a079b62b9f243ac06 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Wed, 9 Jul 2025 20:53:59 +0200 Subject: [PATCH 012/102] fix: implemented client side infinite scroll --- .../search-results-page/SearchResultsPage.tsx | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) 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..a2a37fcdc 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,30 @@ const SearchResultsPage: FC = () => { hasNext, total, }: InfiniteTalentMatchesResposne = useInfiniteTalentMatches(skills) + const paginatedMatches = matches.slice(0, currentPage * itemsPerPage) + + useEffect(() => { + const handleScroll = () => { + const scrollY = window.scrollY + const visibleHeight = window.innerHeight + const fullHeight = document.body.scrollHeight + + if (scrollY + visibleHeight >= fullHeight - 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]) + + useEffect(() => { + setCurrentPage(1) + }, [skills, matches]) const toggleSkillsModal = useCallback(() => setShowSkillsModal(s => !s), []) @@ -100,7 +127,7 @@ const SearchResultsPage: FC = () => { )}
- {matches.map(member => ( + {paginatedMatches.map(member => ( Date: Wed, 9 Jul 2025 20:58:02 +0200 Subject: [PATCH 013/102] fix: implemented client side infinite scroll --- .../search-results-page/SearchResultsPage.tsx | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) 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 a2a37fcdc..6eff3576d 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 @@ -31,27 +31,27 @@ const SearchResultsPage: FC = () => { const paginatedMatches = matches.slice(0, currentPage * itemsPerPage) useEffect(() => { - const handleScroll = () => { - const scrollY = window.scrollY - const visibleHeight = window.innerHeight - const fullHeight = document.body.scrollHeight - - if (scrollY + visibleHeight >= fullHeight - 100) { + const handleScroll: () => void = () => { + const scrollY = window.scrollY + const visibleHeight = window.innerHeight + const fullHeight = document.body.scrollHeight + + if (scrollY + visibleHeight >= fullHeight - 100) { // Scroll near bottom - setCurrentPage(prev => { - const maxPages = Math.ceil(matches.length / itemsPerPage) - return prev < maxPages ? prev + 1 : prev - }) - } + 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]) + }, [matches]) - useEffect(() => { + useEffect(() => { setCurrentPage(1) - }, [skills, matches]) + }, [skills, matches]) const toggleSkillsModal = useCallback(() => setShowSkillsModal(s => !s), []) From fd517ed53bb79c9ac692af21d1ef01c3b89b9b98 Mon Sep 17 00:00:00 2001 From: Hentry Martin Date: Wed, 9 Jul 2025 22:33:43 +0200 Subject: [PATCH 014/102] fix: make notes mandatory --- .../apply-opportunity-modal/ApplyOpportunityModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/copilots/src/pages/copilot-opportunity-details/apply-opportunity-modal/ApplyOpportunityModal.tsx b/src/apps/copilots/src/pages/copilot-opportunity-details/apply-opportunity-modal/ApplyOpportunityModal.tsx index 27acf2830..9598a7343 100644 --- a/src/apps/copilots/src/pages/copilot-opportunity-details/apply-opportunity-modal/ApplyOpportunityModal.tsx +++ b/src/apps/copilots/src/pages/copilot-opportunity-details/apply-opportunity-modal/ApplyOpportunityModal.tsx @@ -50,7 +50,7 @@ const ApplyOpportunityModal: FC = props => { buttons={ !success ? ( <> - + +
+ + {props.isAdding && ( +
+ +
+ )} + + + ) +} + +export default DialogAddTermUser diff --git a/src/apps/admin/src/lib/components/DialogAddTermUser/index.ts b/src/apps/admin/src/lib/components/DialogAddTermUser/index.ts new file mode 100644 index 000000000..9a6be4150 --- /dev/null +++ b/src/apps/admin/src/lib/components/DialogAddTermUser/index.ts @@ -0,0 +1 @@ +export { default as DialogAddTermUser } from './DialogAddTermUser' diff --git a/src/apps/admin/src/lib/components/FieldHandleSelect/FieldHandleSelect.tsx b/src/apps/admin/src/lib/components/FieldHandleSelect/FieldHandleSelect.tsx index 013c03f7a..13db6f37c 100644 --- a/src/apps/admin/src/lib/components/FieldHandleSelect/FieldHandleSelect.tsx +++ b/src/apps/admin/src/lib/components/FieldHandleSelect/FieldHandleSelect.tsx @@ -34,8 +34,9 @@ const fetchDatas = ( interface Props { label?: string className?: string + classNameWrapper?: string placeholder?: string - readonly value?: SelectOption + readonly value?: SelectOption | null readonly onChange?: (event: SelectOption) => void readonly disabled?: boolean readonly error?: string diff --git a/src/apps/admin/src/lib/components/FieldSingleSelectAsync/FieldSingleSelectAsync.tsx b/src/apps/admin/src/lib/components/FieldSingleSelectAsync/FieldSingleSelectAsync.tsx index 3325123dd..3c9d90abf 100644 --- a/src/apps/admin/src/lib/components/FieldSingleSelectAsync/FieldSingleSelectAsync.tsx +++ b/src/apps/admin/src/lib/components/FieldSingleSelectAsync/FieldSingleSelectAsync.tsx @@ -16,8 +16,9 @@ import styles from './FieldSingleSelectAsync.module.scss' interface Props { label?: string className?: string + classNameWrapper?: string placeholder?: string - readonly value?: SelectOption + readonly value?: SelectOption | null readonly onChange?: (event: SelectOption) => void readonly disabled?: boolean readonly loadOptions?: ( diff --git a/src/apps/admin/src/lib/components/TermsAddForm/TermsAddForm.module.scss b/src/apps/admin/src/lib/components/TermsAddForm/TermsAddForm.module.scss new file mode 100644 index 000000000..9f21caaf6 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsAddForm/TermsAddForm.module.scss @@ -0,0 +1,64 @@ +@import '@libs/ui/styles/includes'; + +.container { + display: flex; + flex-direction: column; + position: relative; +} + +.blockBtns { + display: flex; + gap: 15px; + justify-content: flex-end; +} + +.blockActionLoading { + position: absolute; + width: 64px; + display: flex; + align-items: center; + justify-content: center; + height: 64px; + left: $sp-8; + bottom: $sp-8; + + .spinner { + background: none; + } + + @include ltelg { + left: $sp-4; + bottom: $sp-4; + } +} + +.fieldTextContainer, +.fieldTitle { + grid-column: 1 / span 2; +} + +.fieldTextContainer { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 10px; + + textarea { + height: 200px; + resize: none; + } +} + +.fieldText { + width: 100%; +} + +.btnDelete { + display: flex; + align-items: center; + gap: 5px; + + strong { + font-weight: bold; + } +} diff --git a/src/apps/admin/src/lib/components/TermsAddForm/TermsAddForm.tsx b/src/apps/admin/src/lib/components/TermsAddForm/TermsAddForm.tsx new file mode 100644 index 000000000..303bcc35c --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsAddForm/TermsAddForm.tsx @@ -0,0 +1,393 @@ +/** + * Terms Add Form. + */ +import { + Dispatch, + FC, + SetStateAction, + useCallback, + useEffect, + useMemo, + useState, +} from 'react' +import { NavigateFunction, useNavigate, useParams } from 'react-router-dom' +import { + Controller, + ControllerRenderProps, + useForm, + UseFormReturn, +} from 'react-hook-form' +import _ from 'lodash' +import classNames from 'classnames' + +import { + Button, + ConfirmModal, + InputSelectReact, + InputText, + InputTextarea, + LinkButton, +} from '~/libs/ui' +import { yupResolver } from '@hookform/resolvers/yup' +import { EnvironmentConfig } from '~/config' + +import { FormAddWrapper } from '../common/FormAddWrapper' +import { FormAddTerm } from '../../models' +import { formAddTermSchema } from '../../utils' +import { useManageAddTerm, useManageAddTermProps } from '../../hooks' +import { FieldHtmlEditor } from '../common/FieldHtmlEditor' + +import styles from './TermsAddForm.module.scss' + +interface Props { + className?: string +} + +const electronicallyAgreeableId = EnvironmentConfig.ADMIN.AGREE_ELECTRONICALLY +const docusignTypeId = EnvironmentConfig.ADMIN.AGREE_FOR_DOCUSIGN_TEMPLATE + +export const TermsAddForm: FC = (props: Props) => { + const [removeConfirmationOpen, setRemoveConfirmationOpen]: [ + boolean, + Dispatch>, + ] = useState(false) + const navigate: NavigateFunction = useNavigate() + const [showEditor, setShowEditor] = useState(false) + const { id = '' }: { id?: string } = useParams<{ + id?: string + }>() + const [hideField, setHideField] = useState<{ [key: string]: boolean }>({ + docusignTemplateId: true, + url: true, + }) + + const { + isFetchingTermsTypes, + isFetchingTermsAgreeabilityTypes, + isLoading, + isRemoving, + doAddTerm, + doRemoveTerm, + doUpdateTerm, + signedUsersTotal, + termsTypes, + termsAgreeabilityTypes, + termInfo, + }: useManageAddTermProps = useManageAddTerm(id) + + const termsTypesOptions = useMemo( + () => termsTypes.map(item => ({ + label: item.name, + value: `${item.id}`, + })), + [termsTypes], + ) + const termsAgreeabilityTypesOptions = useMemo( + () => termsAgreeabilityTypes.map(item => ({ + label: item.name, + value: item.id, + })), + [termsAgreeabilityTypes], + ) + const isEdit = !!id + const { + register, + handleSubmit, + control, + reset, + getValues, + setValue, + watch, + formState: { errors, isDirty }, + }: UseFormReturn = useForm({ + defaultValues: { + agreeabilityTypeId: '', + docusignTemplateId: '', + text: '', + title: '', + typeId: '', + url: '', + }, + mode: 'all', + resolver: yupResolver(formAddTermSchema), + }) + + /** + * Handle submit form event + */ + const onSubmit = useCallback( + (data: FormAddTerm) => { + const requestBody = _.pickBy(data, _.identity) + if (isEdit) { + doUpdateTerm(requestBody, () => { + navigate('./../..') + }) + } else { + doAddTerm(requestBody, () => { + navigate('./..') + }) + } + }, + [isEdit, navigate], + ) + + const agreeabilityTypeId = watch('agreeabilityTypeId') + useEffect(() => { + // check to enable/disable 'Docusign Template ID' and 'URL' fields + if (agreeabilityTypeId) { + const isDocuSignFieldEnabled = agreeabilityTypeId === docusignTypeId + const isUrlEnabled + = agreeabilityTypeId === electronicallyAgreeableId + if (!isDocuSignFieldEnabled) { + const docusignTemplateId = getValues('docusignTemplateId') + if (docusignTemplateId) { + setValue('docusignTemplateId', '') + } + } + + if (!isUrlEnabled) { + const url = getValues('url') + if (url) { + setValue('url', '') + } + } + + setHideField({ + docusignTemplateId: !isDocuSignFieldEnabled, + url: !isUrlEnabled, + }) + } + }, [agreeabilityTypeId]) + + useEffect(() => { + if (termInfo) { + reset({ + agreeabilityTypeId: termInfo.agreeabilityTypeId, + docusignTemplateId: termInfo.docusignTemplateId ?? '', + text: termInfo.text ?? '', + title: termInfo.title, + typeId: `${termInfo.typeId}`, + url: termInfo.url ?? '', + }) + } + }, [termInfo]) + + return ( + + {isEdit && ( +
+ + {signedUsersTotal > 0 && ( + + {signedUsersTotal} + {' '} + {signedUsersTotal > 1 ? 'Users' : 'User'} + {' '} + have Signed + + )} +
+ )} + + + Cancel + + + )} + > + + + }) { + return ( + + ) + }} + /> + + }) { + return ( + + ) + }} + /> + {agreeabilityTypeId && !hideField.docusignTemplateId && ( + + )} + {agreeabilityTypeId && !hideField.url && ( + + )} + +
+ + {showEditor ? ( + + }) { + return ( + + ) + }} + /> + ) : ( + + )} +
+ + { + navigate('./../..') + }) + }} + open={removeConfirmationOpen} + > +
Are you sure want to delete this terms of use?
+
+
+ ) +} + +export default TermsAddForm diff --git a/src/apps/admin/src/lib/components/TermsAddForm/index.ts b/src/apps/admin/src/lib/components/TermsAddForm/index.ts new file mode 100644 index 000000000..36732cf2f --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsAddForm/index.ts @@ -0,0 +1 @@ +export { default as TermsAddForm } from './TermsAddForm' diff --git a/src/apps/admin/src/lib/components/TermsFilters/TermsFilters.module.scss b/src/apps/admin/src/lib/components/TermsFilters/TermsFilters.module.scss new file mode 100644 index 000000000..e2b0c8f60 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsFilters/TermsFilters.module.scss @@ -0,0 +1,43 @@ +@import '@libs/ui/styles/includes'; + +.container { + display: flex; + flex-direction: column; + padding: $sp-8 $sp-8 0; + + @include ltelg { + padding: $sp-4 $sp-4 0; + } +} + +.fields { + display: flex; + gap: 15px; + align-items: flex-start; + flex-wrap: wrap; + + @include ltemd { + flex-direction: column; + gap: 0; + align-items: flex-end; + } +} + +.field { + flex: 1; + max-width: 500px; + + @include ltelg { + width: 100%; + } + + @include ltemd { + max-width: none; + } +} + +.blockBottom { + display: flex; + gap: 10px; + margin-top: 3px; +} diff --git a/src/apps/admin/src/lib/components/TermsFilters/TermsFilters.tsx b/src/apps/admin/src/lib/components/TermsFilters/TermsFilters.tsx new file mode 100644 index 000000000..eabe67afd --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsFilters/TermsFilters.tsx @@ -0,0 +1,96 @@ +/** + * Terms Filters. + */ +import { FC, useCallback } from 'react' +import { useForm, UseFormReturn } from 'react-hook-form' +import _ from 'lodash' +import classNames from 'classnames' + +import { yupResolver } from '@hookform/resolvers/yup' +import { Button, InputText } from '~/libs/ui' + +import { formSearchByKeySchema } from '../../utils' +import { FormSearchByKey } from '../../models' + +import styles from './TermsFilters.module.scss' + +interface Props { + className?: string + isLoading: boolean + onSubmitForm?: (data: FormSearchByKey) => void +} + +const defaultValues: FormSearchByKey = { + searchKey: '', +} + +export const TermsFilters: FC = (props: Props) => { + const { + register, + handleSubmit, + reset, + formState: { isValid, isDirty }, + }: UseFormReturn = useForm({ + defaultValues, + mode: 'all', + resolver: yupResolver(formSearchByKeySchema), + }) + + /** + * Handle submit form event + */ + const onSubmit = useCallback( + (data: FormSearchByKey) => { + props.onSubmitForm?.(data) + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [props.onSubmitForm], + ) + + return ( +
+
+ +
+ + +
+
+
+ ) +} + +export default TermsFilters diff --git a/src/apps/admin/src/lib/components/TermsFilters/index.ts b/src/apps/admin/src/lib/components/TermsFilters/index.ts new file mode 100644 index 000000000..9d0c6b84f --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsFilters/index.ts @@ -0,0 +1 @@ +export { default as TermsFilters } from './TermsFilters' diff --git a/src/apps/admin/src/lib/components/TermsTable/TermsTable.module.scss b/src/apps/admin/src/lib/components/TermsTable/TermsTable.module.scss new file mode 100644 index 000000000..4aa6484b0 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsTable/TermsTable.module.scss @@ -0,0 +1,31 @@ +@import '@libs/ui/styles/includes'; + +.container { + display: flex; + flex-direction: column; + padding-top: 0; + + a { + color: $blue-110; + + &:hover { + color: $blue-110; + } + } +} + +.rowActions { + display: flex; + align-items: center; +} + +.tableCell { + white-space: break-spaces !important; + text-align: left !important; +} + +.desktopTable { + td { + vertical-align: middle; + } +} diff --git a/src/apps/admin/src/lib/components/TermsTable/TermsTable.tsx b/src/apps/admin/src/lib/components/TermsTable/TermsTable.tsx new file mode 100644 index 000000000..6781c8c76 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsTable/TermsTable.tsx @@ -0,0 +1,158 @@ +/** + * Terms Table. + */ +import { Dispatch, FC, SetStateAction, useMemo } from 'react' +import { Link } from 'react-router-dom' +import _ from 'lodash' +import classNames from 'classnames' + +import { colWidthType, LinkButton, Table, TableColumn } from '~/libs/ui' +import { EnvironmentConfig } from '~/config' +import { useWindowSize, WindowSize } from '~/libs/shared' + +import { MobileTableColumn, UserTerm } from '../../models' +import { TableMobile } from '../common/TableMobile' +import { Pagination } from '../common/Pagination' +import { TableWrapper } from '../common/TableWrapper' + +import styles from './TermsTable.module.scss' + +interface Props { + className?: string + datas: UserTerm[] + totalPages: number + page: number + setPage: Dispatch> + colWidth: colWidthType | undefined + setColWidth: Dispatch> | undefined +} + +const electronicallyAgreeableId = EnvironmentConfig.ADMIN.AGREE_ELECTRONICALLY +const agreeForDocuSignTemplateId + = EnvironmentConfig.ADMIN.AGREE_FOR_DOCUSIGN_TEMPLATE + +export const TermsTable: FC = (props: Props) => { + const { width: screenWidth }: WindowSize = useWindowSize() + const isTablet = useMemo(() => screenWidth <= 1050, [screenWidth]) + const columns = useMemo[]>( + () => [ + { + columnId: 'title', + label: 'Title', + renderer: (data: UserTerm) => ( +
+ {data.title} +
+ ), + type: 'element', + }, + { + columnId: 'type', + label: 'Type', + propertyName: 'type', + type: 'text', + }, + { + className: styles.tableCell, + columnId: 'agreeabilityType', + label: 'Agreeability Type', + propertyName: 'agreeabilityType', + type: 'text', + }, + { + className: styles.tableCell, + columnId: 'Info', + label: 'Info', + renderer: (data: UserTerm) => ( +
+ { + data.agreeabilityTypeId === electronicallyAgreeableId + ? data.url + : data.agreeabilityTypeId === agreeForDocuSignTemplateId + ? data.docusignTemplateId + : '' + } +
+ ), + type: 'element', + }, + { + columnId: 'Action', + label: '', + renderer: (data: UserTerm) => ( +
+ +
+ ), + type: 'element', + }, + ], + // eslint-disable-next-line react-hooks/exhaustive-deps + [], + ) + + const columnsMobile = useMemo[][]>( + () => columns.map(column => { + if (column.label === '') { + return [ + { + ...column, + colSpan: 2, + mobileType: 'last-value', + }, + ] + } + + return [ + { + ...column, + className: '', + label: `${column.label as string} label`, + mobileType: 'label', + renderer: () => ( +
+ {column.label as string} + : +
+ ), + type: 'element', + }, + { + ...column, + mobileType: 'last-value', + }, + ] + }), + [columns], + ) + + return ( + + {isTablet ? ( + + ) : ( + + )} + + + ) +} + +export default TermsTable diff --git a/src/apps/admin/src/lib/components/TermsTable/index.ts b/src/apps/admin/src/lib/components/TermsTable/index.ts new file mode 100644 index 000000000..5c5f0bbf3 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsTable/index.ts @@ -0,0 +1 @@ +export { default as TermsTable } from './TermsTable' diff --git a/src/apps/admin/src/lib/components/TermsUsersFilters/TermsUsersFilters.module.scss b/src/apps/admin/src/lib/components/TermsUsersFilters/TermsUsersFilters.module.scss new file mode 100644 index 000000000..eedf63665 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsUsersFilters/TermsUsersFilters.module.scss @@ -0,0 +1,38 @@ +@import '@libs/ui/styles/includes'; + +.container { + display: flex; + flex-direction: column; + padding: $sp-8 $sp-8 0; + + @include ltelg { + padding: $sp-4 $sp-4 0; + } +} + +.fields { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 15px 30px; + + @include ltelg { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + @include ltemd { + grid-template-columns: 1fr; + } +} + +.blockBottom { + display: flex; + justify-content: flex-end; + align-items: flex-start; + gap: 15px; + flex-wrap: wrap; + + @include ltemd { + flex-direction: column; + align-items: flex-end; + } +} diff --git a/src/apps/admin/src/lib/components/TermsUsersFilters/TermsUsersFilters.tsx b/src/apps/admin/src/lib/components/TermsUsersFilters/TermsUsersFilters.tsx new file mode 100644 index 000000000..dca5e12ac --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsUsersFilters/TermsUsersFilters.tsx @@ -0,0 +1,163 @@ +/** + * Terms Users Filters. + */ +import { FC, useCallback } from 'react' +import { + Controller, + ControllerRenderProps, + useForm, + UseFormReturn, +} from 'react-hook-form' +import _ from 'lodash' +import classNames from 'classnames' + +import { Button, InputDatePicker, InputText } from '~/libs/ui' +import { yupResolver } from '@hookform/resolvers/yup' + +import { formTermsUsersFilterSchema } from '../../utils' +import { FormTermsUsersFilter } from '../../models' + +import styles from './TermsUsersFilters.module.scss' + +interface Props { + className?: string + isLoading: boolean + onSubmitForm?: (data: FormTermsUsersFilter) => void +} + +const defaultValues: FormTermsUsersFilter = { + handle: '', + signTermsFrom: undefined, + signTermsTo: undefined, + userId: '', +} + +export const TermsUsersFilters: FC = (props: Props) => { + const { + register, + reset, + handleSubmit, + control, + formState: { isValid, isDirty }, + }: UseFormReturn = useForm({ + defaultValues, + mode: 'all', + resolver: yupResolver(formTermsUsersFilterSchema), + }) + + /** + * Handle submit form event + */ + const onSubmit = useCallback( + (data: FormTermsUsersFilter) => { + props.onSubmitForm?.(data) + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [props.onSubmitForm], + ) + + return ( +
+
+ + + + }) { + return ( + + ) + }} + /> + + }) { + return ( + + ) + }} + /> +
+ +
+ + +
+ + ) +} + +export default TermsUsersFilters diff --git a/src/apps/admin/src/lib/components/TermsUsersFilters/index.ts b/src/apps/admin/src/lib/components/TermsUsersFilters/index.ts new file mode 100644 index 000000000..03d543750 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsUsersFilters/index.ts @@ -0,0 +1 @@ +export { default as TermsUsersFilters } from './TermsUsersFilters' diff --git a/src/apps/admin/src/lib/components/TermsUsersTable/TermsUsersTable.module.scss b/src/apps/admin/src/lib/components/TermsUsersTable/TermsUsersTable.module.scss new file mode 100644 index 000000000..4c1af00f9 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsUsersTable/TermsUsersTable.module.scss @@ -0,0 +1,21 @@ +.container { + display: flex; + flex-direction: column; + padding-top: 0; +} + +.rowActions { + display: flex; + align-items: center; +} + +.tableCell { + white-space: break-spaces !important; + text-align: left !important; +} + +.desktopTable { + td { + vertical-align: middle; + } +} diff --git a/src/apps/admin/src/lib/components/TermsUsersTable/TermsUsersTable.tsx b/src/apps/admin/src/lib/components/TermsUsersTable/TermsUsersTable.tsx new file mode 100644 index 000000000..d94b9c4e3 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsUsersTable/TermsUsersTable.tsx @@ -0,0 +1,213 @@ +/** + * Terms Users Table. + */ +import { Dispatch, FC, SetStateAction, useCallback, useMemo } from 'react' +import _ from 'lodash' +import classNames from 'classnames' + +import { + Button, + colWidthType, + InputCheckbox, + Table, + TableColumn, +} from '~/libs/ui' +import { useWindowSize, WindowSize } from '~/libs/shared' + +import { MobileTableColumn, TermUserInfo, UserMappingType } from '../../models' +import { TableWrapper } from '../common/TableWrapper' +import { TableMobile } from '../common/TableMobile' +import { Pagination } from '../common/Pagination' + +import styles from './TermsUsersTable.module.scss' + +interface Props { + className?: string + datas: TermUserInfo[] + totalPages: number + page: number + setPage: Dispatch> + colWidth: colWidthType | undefined + setColWidth: Dispatch> | undefined + usersMapping: UserMappingType + isRemovingBool: boolean + isRemoving: { [key: string]: boolean } + toggleSelect: (key: number) => void + forceSelect: (key: number) => void + forceUnSelect: (key: number) => void + doRemoveTermUser: (userId: number) => void + selectedDatas: { + [id: number]: boolean + } +} + +export const TermsUsersTable: FC = (props: Props) => { + const { width: screenWidth }: WindowSize = useWindowSize() + const isTablet = useMemo(() => screenWidth <= 744, [screenWidth]) + + const isSelectAll = useMemo( + () => _.every(props.datas, item => props.selectedDatas[item.userId]), + [props.datas, props.selectedDatas], + ) + + /** + * Handle select/unselect all items event + */ + const toggleSelectAll = useCallback(() => { + if (isSelectAll) { + _.forEach(props.datas, item => { + props.forceUnSelect(item.userId) + }) + } else { + _.forEach(props.datas, item => { + props.forceSelect(item.userId) + }) + } + }, [isSelectAll, props.datas]) + + const columns = useMemo[]>( + () => [ + { + className: styles.blockCellCheckBox, + columnId: 'checkbox', + label: () => ( // eslint-disable-line react/no-unstable-nested-components +
+ +
+ ), + renderer: (data: TermUserInfo) => ( + + ), + type: 'element', + }, + { + columnId: 'userId', + label: 'User Id', + propertyName: 'userId', + type: 'text', + }, + { + columnId: 'handle', + label: 'Handle', + renderer: (data: TermUserInfo) => ( + <> + {!props.usersMapping[data.userId] + ? 'loading...' + : props.usersMapping[data.userId]} + + ), + type: 'element', + }, + { + columnId: 'Action', + label: '', + renderer: (data: TermUserInfo) => ( + + ), + type: 'element', + }, + ], + [ + props.usersMapping, + props.selectedDatas, + props.isRemovingBool, + props.isRemoving, + isSelectAll, + props.doRemoveTermUser, + toggleSelectAll, + ], + ) + + const columnsMobile = useMemo[][]>( + () => columns.map(column => { + if (column.columnId === 'checkbox') { + return [ + { + ...column, + colSpan: 2, + }, + ] + } + + if (column.label === '') { + return [ + { + ...column, + colSpan: 2, + mobileType: 'last-value', + }, + ] + } + + return [ + { + ...column, + className: '', + label: `${column.label as string} label`, + mobileType: 'label', + renderer: () => ( +
+ {column.label as string} + : +
+ ), + type: 'element', + }, + { + ...column, + mobileType: 'last-value', + }, + ] + }), + [columns], + ) + + return ( + + {isTablet ? ( + + ) : ( +
+ )} + + + ) +} + +export default TermsUsersTable diff --git a/src/apps/admin/src/lib/components/TermsUsersTable/index.ts b/src/apps/admin/src/lib/components/TermsUsersTable/index.ts new file mode 100644 index 000000000..c6fc91097 --- /dev/null +++ b/src/apps/admin/src/lib/components/TermsUsersTable/index.ts @@ -0,0 +1 @@ +export { default as TermsUsersTable } from './TermsUsersTable' diff --git a/src/apps/admin/src/lib/components/common/FieldHtmlEditor/Editor/Editor.module.scss b/src/apps/admin/src/lib/components/common/FieldHtmlEditor/Editor/Editor.module.scss new file mode 100644 index 000000000..0a958e4ed --- /dev/null +++ b/src/apps/admin/src/lib/components/common/FieldHtmlEditor/Editor/Editor.module.scss @@ -0,0 +1,181 @@ +@import '@libs/ui/styles/typography'; +@import '@libs/ui/styles/includes'; + +$error-line-height: 14px; + +.container { + display: flex; + flex-direction: column; + height: 280px; + gap: 9px; + @include ltemd { + height: 280px; + gap: 0; + } + + &.disabled { + :global { + .CodeMirror, + .editor-toolbar { + background-color: $black-10; + } + .CodeMirror.CodeMirror-wrap { + border-left: 1px solid $black-10; + border-right: 1px solid $black-10; + border-bottom: 1px solid $black-10; + } + .editor-toolbar { + border-top: 1px solid $black-10; + border-left: 1px solid $black-10; + border-right: 1px solid $black-10; + } + } + } + + &.isError { + :global { + .CodeMirror.CodeMirror-wrap { + border-right: 1px solid $red-100; + border-left: 1px solid $red-100; + border-bottom: 1px solid $red-100; + } + .editor-toolbar { + border-top: 1px solid $red-100; + border-left: 1px solid $red-100; + border-right: 1px solid $red-100; + } + } + } + + :global { + .EasyMDEContainer { + height: 100px; + flex: 1; + display: flex; + flex-direction: column; + } + + .CodeMirror.CodeMirror-wrap { + @include font-roboto; + + min-height: 0; + flex: 1; + box-sizing: border-box; + height: auto; + border-right: 1px solid white; + border-left: 1px solid white; + border-bottom: 1px solid white; + border-top: 1px solid #d9d9d9; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + font-size: 14px; + color: $black-60; + } + + .CodeMirror-sizer, + .CodeMirror-scroll { + min-height: unset !important; + } + + .editor-toolbar { + opacity: 1; + border-radius: 0; + border-top: 1px solid white; + border-left: 1px solid white; + border-right: 1px solid white; + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 0 8px; + background-color: white; + @include ltemd { + gap: $sp-1; + padding: 0 $sp-1; + } + &::after, + &::before { + content: none; + } + + button.table { + width: auto; + } + + button { + margin: 8px 0; + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + min-width: 24px; + color: black; + + @include ltemd { + margin: $sp-1 0; + height: 24px; + width: 24px; + } + } + + i.separator { + border-left: 1px solid #d9d9d9; + @include ltemd { + margin: 0 $sp-1; + } + } + } + + .editor-statusbar { + @include font-roboto; + + font-size: 14px; + line-height: 19px; + padding: $sp-4 0 0 0; + overflow: hidden; + display: flex; + + span { + min-width: 0; + } + + .upload-image { + @include font-roboto; + + margin-left: 0; + margin-right: auto; + display: flex; + font-size: 14px; + line-height: 20px; + } + + .countOfRemainingChars { + margin-left: 0; + min-width: 0; + display: flex; + } + + .message { + display: none; + } + } + } +} + +.error { + display: flex; + align-items: center; + color: $red-100; + // extend body ultra small and override it + font-size: 14px; + line-height: 19px; + line-height: $error-line-height; + margin-top: $sp-1; + + svg { + @include icon-md; + fill: $red-100; + margin-right: $sp-1; + } +} diff --git a/src/apps/admin/src/lib/components/common/FieldHtmlEditor/Editor/Editor.tsx b/src/apps/admin/src/lib/components/common/FieldHtmlEditor/Editor/Editor.tsx new file mode 100644 index 000000000..b54851059 --- /dev/null +++ b/src/apps/admin/src/lib/components/common/FieldHtmlEditor/Editor/Editor.tsx @@ -0,0 +1,421 @@ +/** + * Field Markdown Editor. + */ +import { FC, useCallback, useEffect, useRef } from 'react' +import _ from 'lodash' +import CodeMirror from 'codemirror' +import EasyMDE from 'easymde' +import classNames from 'classnames' +import 'easymde/dist/easymde.min.css' + +import { useOnComponentDidMount } from '~/apps/admin/src/lib/hooks' + +import styles from './Editor.module.scss' + +interface Props { + className?: string + placeholder?: string + initialValue?: string + onChange?: (value: string) => void + onBlur?: (event: any) => void + error?: string + showBorder?: boolean + disabled?: boolean +} +const errorMessages = { + fileTooLarge: + 'Uploading #image_name# was failed. The file is too big (#image_size#).\n' + + 'Maximum file size is #image_max_size#.', + importError: + 'Uploading #image_name# was failed. Something went wrong when uploading the file.', + noFileGiven: 'Select a file.', + typeNotAllowed: + 'Uploading #image_name# was failed. The file type (#image_type#) is not supported.', +} +const maxUploadSize = 40 * 1024 * 1024 +const imageExtensions = ['gif', 'png', 'jpeg', 'jpg', 'bmp', 'svg'] +const allowedImageExtensions = [ + ...imageExtensions, + ...imageExtensions.map(key => `image/${key}`), +] +const allowedOtherExtensions = [ + 'application/zip', + 'zip', + 'application/octet-stream', + 'application/x-zip-compressed', + 'multipart/x-zip', + 'text/plain', + 'txt', + 'mov', + 'video/mpeg', + 'mp4', + 'video/mp4', + 'webm', + 'video/webm', + 'doc', + 'docx', + 'pdf', + 'application/pdf', + 'csv', + 'text/csv', + 'htm', + 'html', + 'text/html', + 'js', + 'json', + 'application/json', + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.ms-excel', + 'xls', + 'xlsx', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'ppt', + 'application/vnd.ms-powerpoint', + 'pptx', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', +] + +const stateStrategy = { + atom: (ret: any) => { + ret.quote = true + }, + comment: (ret: any) => { + ret.code = true + }, + em: (ret: any) => { + ret.italic = true + }, + link: (ret: any) => { + ret.link = true + }, + quote: (ret: any) => { + ret.quote = true + }, + strikethrough: (ret: any) => { + ret.strikethrough = true + }, + strong: (ret: any) => { + ret.bold = true + }, + tag: (ret: any) => { + ret.image = true + }, +} + +const toggleStrategy = { + bold: (start: any, end: any) => { + const startType = start.replace(/(\*\*|__)(?![\s\S]*(\*\*|__))/, '') + const endType = end.replace(/(\*\*|__)/, '') + return { endType, startType } + }, + italic: (start: any, end: any) => { + const startType = start.replace(/(\*|_)(?![\s\S]*(\*|_))/, '') + const endType = end.replace(/(\*|_)/, '') + return { endType, startType } + }, + strikethrough: (start: any, end: any) => { + const startType = start.replace(/(\*\*|~~)(?![\s\S]*(\*\*|~~))/, '') + const endType = end.replace(/(\*\*|~~)/, '') + return { endType, startType } + }, +} + +type CodeMirrorType = keyof typeof stateStrategy | 'variable-2' + +export const Editor: FC = (props: Props) => { + const elementRef = useRef(null) + const easyMDE = useRef(null) + + /** + * The state of CodeMirror at the given position. + */ + const getState = useCallback( + (cm: CodeMirror.Editor, posInput?: CodeMirror.Position | undefined) => { + const pos = posInput || cm.getCursor('start') + const stat = cm.getTokenAt(pos) + if (!stat.type) return {} + + const types = stat.type.split(' ') + + const ret: any = {} + + let data: CodeMirrorType + let text + for (let i = 0; i < types.length; i++) { + data = types[i] as CodeMirrorType + if (data === 'variable-2') { + text = cm.getLine(pos.line) + if (/^\s*\d+\.\s/.test(text)) { + ret['ordered-list'] = true + } else { + ret['unordered-list'] = true + } + } else if (data.match(/^header(-[1-6])?$/)) { + ret[data.replace('header', 'heading')] = true + } else if (data in stateStrategy) { + stateStrategy[data](ret) + } + } + + return ret + }, + [], + ) + + /** + * Handle toggle block + */ + const toggleBlock = useCallback( + (editor: any, type: string, startChars: any, endCharsInput?: any) => { + if ( + /editor-preview-active/.test( + editor.codemirror.getWrapperElement().lastChild.className, + ) + ) { + return + } + + const endChars + = typeof endCharsInput === 'undefined' + ? startChars + : endCharsInput + const cm = editor.codemirror + const stat = getState(cm) + + let text = '' + let start = startChars + let end = endChars + + const startPoint = cm.getCursor('start') + const endPoint = cm.getCursor('end') + + if (stat[type]) { + text = cm.getLine(startPoint.line) + start = text.slice(0, startPoint.ch) + end = text.slice(startPoint.ch) + toggleStrategy[type as keyof typeof toggleStrategy](start, end) + + cm.replaceRange( + start + end, + { + ch: 0, + line: startPoint.line, + }, + { + ch: 99999999999999, + line: startPoint.line, + }, + ) + + if (type === 'bold' || type === 'strikethrough') { + startPoint.ch -= 2 + if (startPoint !== endPoint) { + endPoint.ch -= 2 + } + } else if (type === 'italic') { + startPoint.ch -= 1 + if (startPoint !== endPoint) { + endPoint.ch -= 1 + } + } + } else { + text = cm.getSelection() + let trimText = text.trim() + let lastSpaces = '' + for (let i = trimText.length; i < text.length; i++) { + lastSpaces += text[i] + } + + if (type === 'bold') { + trimText = trimText.split('**') + .join('') + } else if (type === 'italic') { + trimText = trimText.split('*') + .join('') + } else if (type === 'strikethrough') { + trimText = trimText.split('~~') + .join('') + } + + cm.replaceSelection(start + trimText + end + lastSpaces) + + startPoint.ch += startChars.length + endPoint.ch = startPoint.ch + text.length + } + + cm.setSelection(startPoint, endPoint) + cm.focus() + }, + [getState], + ) + + /** + * Show hint after '@' + */ + const completeAfter = useCallback((cm: CodeMirror.Editor) => { + if (!cm.state.completionActive) { + if (cm.getCursor().ch === 0) { + cm.replaceSelection('@') + } else { + const from = { + ch: 0, + line: cm.getCursor().line, + } + const to = cm.getCursor() + const line = cm.getRange(from, to) + const lastIndexOf = line.lastIndexOf(' ') + const tokenIndex = lastIndexOf > -1 ? lastIndexOf + 1 : 0 + cm.replaceRange('@', { + ch: tokenIndex, + line: cm.getCursor().line, + }) + } + } + + return CodeMirror.Pass + }, []) + + useOnComponentDidMount(() => { + easyMDE.current = new EasyMDE({ + autofocus: false, + element: elementRef.current as HTMLElement, + errorCallback: _.noop, // A callback function used to define how to display an error message. + errorMessages, + forceSync: true, // true, force text changes made in EasyMDE to be immediately stored in original text area. + hideIcons: ['guide', 'heading', 'preview', 'side-by-side'], + imageAccept: [ + ...allowedImageExtensions, + ...allowedOtherExtensions, + ].join(', '), // A comma-separated list of mime-types and extensions + imageMaxSize: maxUploadSize, // Maximum image size in bytes + imageTexts: { + sbInit: '', + sbOnDragEnter: 'Drop file to upload it.', + sbOnDrop: 'Uploading file #images_names#...', + sbOnUploaded: 'Uploaded #image_name#', + sbProgress: 'Uploading #file_name#: #progress#%', + sizeUnits: ' B, KB, MB', + }, + imageUploadFunction: _.noop, + initialValue: props.initialValue, + insertTexts: { + file: ['[](', '#url#)'], + horizontalRule: ['', '\n\n-----\n\n'], + image: ['![](', '#url#)'], + link: ['[', '](#url#)'], + table: [ + '', + // eslint-disable-next-line max-len + '\n\n| Column 1 | Column 2 | Column 3 |\n|' + + '-------- | -------- | -------- |\n|' + + ' Text | Text | Text |\n\n', + ], + uploadedFile: ['[#name#](#url#)', ''], + uploadedImage: ['![#name#](#url#)', ''], + uploadingFile: ['[Uploading #name#]()', ''], + uploadingImage: ['![Uploading #name#]()', ''], + } as any, + placeholder: '', + shortcuts: { + toggleHeading1: '', + toggleHeading2: '', + toggleHeading3: '', + }, + status: [ + { + className: 'message', + defaultValue: el => { + el.innerHTML = '' + }, + onUpdate: el => { + el.innerHTML = '' + }, + }, + 'upload-image', + ], + toolbar: [ + { + action: function format(editor: any) { + toggleBlock( + editor, + 'bold', + editor.options.blockStyles.bold, + ) + }, + className: 'fa fa-bold', + name: 'bold', + title: 'Bold', + }, + { + action: function format(editor: any) { + toggleBlock( + editor, + 'italic', + editor.options.blockStyles.italic, + ) + }, + className: 'fa fa-italic', + name: 'italic', + title: 'Italic', + }, + 'strikethrough', + '|', + 'heading-1', + 'heading-2', + 'heading-3', + '|', + 'code', + 'quote', + '|', + 'unordered-list', + 'ordered-list', + 'clean-block', + '|', + { + action: function mentions(editor: EasyMDE) { + completeAfter(editor.codemirror) + }, + className: 'fa fa-at', + name: 'mentions', + title: 'Mention a Topcoder User', + }, + 'link', + 'image', + 'table', + 'horizontal-rule', + '|', + 'fullscreen', + '|', + 'guide', + ], + uploadImage: false, + }) + + easyMDE.current.codemirror.on('change', (cm: CodeMirror.Editor) => { + props.onChange?.(cm.getValue()) + }) + + easyMDE.current.codemirror.on('blur', (event: any) => { + props.onBlur?.(event) + }) + }) + + useEffect(() => { + easyMDE.current?.value(props.initialValue) + }, [props.initialValue]) + + return ( +
+