diff --git a/packages/client/src/App.tsx b/packages/client/src/App.tsx index e2d7c4b6ba0..70b038272c2 100644 --- a/packages/client/src/App.tsx +++ b/packages/client/src/App.tsx @@ -45,7 +45,12 @@ import { SCOPES } from '@opencrvs/commons/client' import { getTheme } from '@opencrvs/components' import * as React from 'react' import { Provider } from 'react-redux' -import { createBrowserRouter, Outlet, RouterProvider } from 'react-router-dom' +import { + createBrowserRouter, + Outlet, + redirect, + RouterProvider +} from 'react-router-dom' import styled, { createGlobalStyle, ThemeProvider } from 'styled-components' import { ErrorBoundary } from './components/ErrorBoundary' import { StyledErrorBoundary } from './components/StyledErrorBoundary' @@ -85,237 +90,417 @@ const MainSection = styled.section` background: ${({ theme }) => theme.colors.background}; ` -export const routesConfig = [ - { - path: '/', - element: ( - - - - - - - - - - - - - - ), - children: [ - { path: routes.HOME, element: }, - { path: routes.SELECT_VITAL_EVENT, element: }, - { path: routes.SELECT_DEATH_INFORMANT, element: }, - { path: routes.SELECT_MARRIAGE_INFORMANT, element: }, - { path: routes.DRAFT_BIRTH_PARENT_FORM, element: }, - { - path: routes.VIEW_VERIFY_CERTIFICATE, - element: - }, - { - path: routes.DRAFT_BIRTH_PARENT_FORM_PAGE, - element: - }, - { - path: routes.DRAFT_BIRTH_PARENT_FORM_PAGE_GROUP, - element: - }, - { path: routes.DRAFT_DEATH_FORM, element: }, - { path: routes.DRAFT_DEATH_FORM_PAGE, element: }, - { path: routes.DRAFT_MARRIAGE_FORM, element: }, - { - path: routes.DRAFT_DEATH_FORM_PAGE_GROUP, - element: - }, - { path: routes.DRAFT_MARRIAGE_FORM_PAGE, element: }, - { - path: routes.DRAFT_MARRIAGE_FORM_PAGE_GROUP, - element: - }, - { path: routes.REVIEW_EVENT_PARENT_FORM_PAGE, element: }, - { - path: routes.REVIEW_EVENT_PARENT_FORM_PAGE_GROUP, - element: - }, - { path: routes.REVIEW_CORRECTION, element: }, - { path: routes.REGISTRAR_HOME, element: }, - { path: routes.REGISTRAR_HOME_TAB, element: }, - { path: routes.REGISTRAR_HOME_TAB_PAGE, element: }, - { - path: routes.ALL_USER_EMAIL, - element: ( - - - - ) - }, - { - path: routes.ADVANCED_SEARCH, - element: ( - - - - ) - }, - { - path: routes.ADVANCED_SEARCH_RESULT, - element: ( - - - - ) - }, - { path: routes.DECLARATION_RECORD_AUDIT, element: }, - { path: routes.SEARCH, element: }, - { path: routes.SEARCH_RESULT, element: }, - { path: routes.CERTIFICATE_COLLECTOR, element: }, - { path: routes.VERIFY_COLLECTOR, element: }, - { path: routes.VERIFY_CORRECTOR, element: }, - { path: routes.REVIEW_CERTIFICATE, element: }, - { path: routes.PRINT_CERTIFICATE_PAYMENT, element: }, - { path: routes.CERTIFICATE_CORRECTION, element: }, - { - path: routes.CERTIFICATE_CORRECTION_REVIEW, - element: - }, - { path: routes.SETTINGS, element: }, - { - path: routes.TEAM_USER_LIST, - element: ( - - - - ) - }, - { - path: routes.SYSTEM_LIST, - element: ( - - - - ) - }, - { - path: routes.VS_EXPORTS, - element: ( - - - - ) - }, - { path: routes.USER_PROFILE, element: }, - { path: routes.VIEW_RECORD, element: }, - { - path: routes.PERFORMANCE_REGISTRATIONS_LIST, - element: - }, - { - path: routes.PERFORMANCE_STATISTICS, - element: ( - - - - ) - }, - { - path: routes.PERFORMANCE_LEADER_BOARDS, - element: ( - - - - ) - }, - { - path: routes.PERFORMANCE_DASHBOARD, - element: ( - - - - ) - }, +function createRedirect(from: string, to: string) { + return { + path: from, + loader: () => { + return redirect(to) + } + } +} + +export const routesConfig = window.config.FEATURES.V2_EVENTS + ? [ { - path: routes.ORGANISATIONS_INDEX, + path: '/', element: ( - - - - ) - }, - { path: routes.ISSUE_COLLECTOR, element: }, - { path: routes.ISSUE_VERIFY_COLLECTOR, element: }, - { path: routes.ISSUE_CERTIFICATE_PAYMENT, element: }, - { path: routes.PRINT_RECORD, element: }, - { - path: routes.PERFORMANCE_FIELD_AGENT_LIST, - element: - }, + + + + + + + + + + + + + + ), + children: [ + v2RoutesConfig, + createRedirect('/v2/*', '/'), + createRedirect('/registration-home/my-drafts/*', '/'), + createRedirect('/registration-home/requiresUpdate/*', '/'), + createRedirect('/registration-home/progress/*', '/'), + createRedirect('/registration-home/outbox/*', '/'), + createRedirect('/registration-home/readyToIssue/*', '/'), + createRedirect('/registration-home/print/*', '/'), + createRedirect('/registration-home/readyForReview/*', '/'), + createRedirect('/events', '/events/create'), + // Search results, + // Advanced search, + { + path: routes.ALL_USER_EMAIL, + element: ( + + + + ) + }, + { path: routes.SETTINGS, element: }, + { + path: routes.TEAM_USER_LIST, + element: ( + + + + ) + }, + { + path: routes.SYSTEM_LIST, + element: ( + + + + ) + }, + { + path: routes.VS_EXPORTS, + element: ( + + + + ) + }, + { path: routes.USER_PROFILE, element: }, + { + path: routes.PERFORMANCE_REGISTRATIONS_LIST, + element: + }, + { + path: routes.PERFORMANCE_STATISTICS, + element: ( + + + + ) + }, + { + path: routes.PERFORMANCE_LEADER_BOARDS, + element: ( + + + + ) + }, + { + path: routes.PERFORMANCE_DASHBOARD, + element: ( + + + + ) + }, + { + path: routes.ORGANISATIONS_INDEX, + element: ( + + + + ) + }, + { + path: routes.PERFORMANCE_FIELD_AGENT_LIST, + element: + }, + { + path: routes.PERFORMANCE_HOME, + element: ( + + + + ) + }, + { + path: routes.EVENT_COMPLETENESS_RATES, + element: + }, + { + path: routes.WORKFLOW_STATUS, + element: + }, + { + path: routes.CREATE_USER_ON_LOCATION, + element: + }, + { + path: routes.CREATE_USER_SECTION, + element: + }, + { + path: routes.REVIEW_USER_FORM, + element: + }, + { + path: routes.REVIEW_USER_DETAILS, + element: + } + ] + } + ] + : [ { - path: routes.PERFORMANCE_HOME, + path: '/', element: ( - - - - ) - }, - { - path: routes.EVENT_COMPLETENESS_RATES, - element: - }, - { - path: routes.WORKFLOW_STATUS, - element: - }, - { - path: routes.CREATE_USER_ON_LOCATION, - element: - }, - { - path: routes.CREATE_USER_SECTION, - element: - }, - { - path: routes.REVIEW_USER_FORM, - element: - }, - { - path: routes.REVIEW_USER_DETAILS, - element: - }, - v2RoutesConfig + + + + + + + + + + + + + + ), + children: [ + { path: routes.HOME, element: }, + { path: routes.SELECT_VITAL_EVENT, element: }, + { path: routes.SELECT_DEATH_INFORMANT, element: }, + { + path: routes.SELECT_MARRIAGE_INFORMANT, + element: + }, + { + path: routes.DRAFT_BIRTH_PARENT_FORM, + element: + }, + { + path: routes.VIEW_VERIFY_CERTIFICATE, + element: + }, + { + path: routes.DRAFT_BIRTH_PARENT_FORM_PAGE, + element: + }, + { + path: routes.DRAFT_BIRTH_PARENT_FORM_PAGE_GROUP, + element: + }, + { path: routes.DRAFT_DEATH_FORM, element: }, + { path: routes.DRAFT_DEATH_FORM_PAGE, element: }, + { path: routes.DRAFT_MARRIAGE_FORM, element: }, + { + path: routes.DRAFT_DEATH_FORM_PAGE_GROUP, + element: + }, + { + path: routes.DRAFT_MARRIAGE_FORM_PAGE, + element: + }, + { + path: routes.DRAFT_MARRIAGE_FORM_PAGE_GROUP, + element: + }, + { + path: routes.REVIEW_EVENT_PARENT_FORM_PAGE, + element: + }, + { + path: routes.REVIEW_EVENT_PARENT_FORM_PAGE_GROUP, + element: + }, + { path: routes.REVIEW_CORRECTION, element: }, + { path: routes.REGISTRAR_HOME, element: }, + { path: routes.REGISTRAR_HOME_TAB, element: }, + { path: routes.REGISTRAR_HOME_TAB_PAGE, element: }, + { + path: routes.ALL_USER_EMAIL, + element: ( + + + + ) + }, + { + path: routes.ADVANCED_SEARCH, + element: ( + + + + ) + }, + { + path: routes.ADVANCED_SEARCH_RESULT, + element: ( + + + + ) + }, + { path: routes.DECLARATION_RECORD_AUDIT, element: }, + { path: routes.SEARCH, element: }, + { path: routes.SEARCH_RESULT, element: }, + { path: routes.CERTIFICATE_COLLECTOR, element: }, + { path: routes.VERIFY_COLLECTOR, element: }, + { path: routes.VERIFY_CORRECTOR, element: }, + { path: routes.REVIEW_CERTIFICATE, element: }, + { path: routes.PRINT_CERTIFICATE_PAYMENT, element: }, + { path: routes.CERTIFICATE_CORRECTION, element: }, + { + path: routes.CERTIFICATE_CORRECTION_REVIEW, + element: + }, + { path: routes.SETTINGS, element: }, + { + path: routes.TEAM_USER_LIST, + element: ( + + + + ) + }, + { + path: routes.SYSTEM_LIST, + element: ( + + + + ) + }, + { + path: routes.VS_EXPORTS, + element: ( + + + + ) + }, + { path: routes.USER_PROFILE, element: }, + { path: routes.VIEW_RECORD, element: }, + { + path: routes.PERFORMANCE_REGISTRATIONS_LIST, + element: + }, + { + path: routes.PERFORMANCE_STATISTICS, + element: ( + + + + ) + }, + { + path: routes.PERFORMANCE_LEADER_BOARDS, + element: ( + + + + ) + }, + { + path: routes.PERFORMANCE_DASHBOARD, + element: ( + + + + ) + }, + { + path: routes.ORGANISATIONS_INDEX, + element: ( + + + + ) + }, + { path: routes.ISSUE_COLLECTOR, element: }, + { path: routes.ISSUE_VERIFY_COLLECTOR, element: }, + { path: routes.ISSUE_CERTIFICATE_PAYMENT, element: }, + { path: routes.PRINT_RECORD, element: }, + { + path: routes.PERFORMANCE_FIELD_AGENT_LIST, + element: + }, + { + path: routes.PERFORMANCE_HOME, + element: ( + + + + ) + }, + { + path: routes.EVENT_COMPLETENESS_RATES, + element: + }, + { + path: routes.WORKFLOW_STATUS, + element: + }, + { + path: routes.CREATE_USER_ON_LOCATION, + element: + }, + { + path: routes.CREATE_USER_SECTION, + element: + }, + { + path: routes.REVIEW_USER_FORM, + element: + }, + { + path: routes.REVIEW_USER_DETAILS, + element: + }, + v2RoutesConfig + ] + } ] - } -] interface IAppProps { client?: ApolloClient diff --git a/packages/client/src/v2-events/README.md b/packages/client/src/v2-events/README.md index e7c28469263..d475559492f 100644 --- a/packages/client/src/v2-events/README.md +++ b/packages/client/src/v2-events/README.md @@ -29,6 +29,10 @@ Client for managing custom events. We will be iterating over the structure during the project. Treat it as a starting point. Many times the important thing is to have any structure. +## Route structure + +By default, Events V2 is accessible via the /v2 route, allowing the application’s normal operations to continue alongside its development. When Events V2 needs to be deployed to a live environment as the primary event type, the environment variable V2_EVENTS=true can be set in the country config package. This hides the old event views completely and replaces them with Events V2. Once Events V2 is officially released, it will become the default event view. + ## Development practices - Do not import components outside v2-events. If you need a component, copy it in and refactor it. diff --git a/packages/client/src/v2-events/layouts/workqueues/index.tsx b/packages/client/src/v2-events/layouts/workqueues/index.tsx index bc822792d60..4005503834a 100644 --- a/packages/client/src/v2-events/layouts/workqueues/index.tsx +++ b/packages/client/src/v2-events/layouts/workqueues/index.tsx @@ -23,6 +23,7 @@ import { } from '@opencrvs/components' import { Plus } from '@opencrvs/components/src/icons' import { ROUTES } from '@client/v2-events/routes' +import { ProfileMenu } from '@client/components/ProfileMenu' /** * Basic frame for the workqueues. Includes the left navigation and the app bar. @@ -59,6 +60,7 @@ export function WorkqueueLayout({ children }: { children: React.ReactNode }) { /> } + desktopRight={} /> } skipToContentText="skip" diff --git a/packages/client/src/v2-events/routes/config.tsx b/packages/client/src/v2-events/routes/config.tsx index 5f21d7e7606..f574047484f 100644 --- a/packages/client/src/v2-events/routes/config.tsx +++ b/packages/client/src/v2-events/routes/config.tsx @@ -30,6 +30,7 @@ import { ROUTES } from './routes' * * Each route is defined as a child of the `ROUTES.V2` route. */ + export const routesConfig = { path: ROUTES.V2.path, element: ( diff --git a/packages/client/src/v2-events/routes/routes.ts b/packages/client/src/v2-events/routes/routes.ts index 249a2c91140..f0a977cce76 100644 --- a/packages/client/src/v2-events/routes/routes.ts +++ b/packages/client/src/v2-events/routes/routes.ts @@ -15,7 +15,7 @@ import { routes as workqueueRoutes } from '@client/v2-events/features/workqueues export const ROUTES = { V2: route( - 'v2', + window.config.FEATURES.V2_EVENTS ? '' : 'v2', {}, { EVENTS: route( diff --git a/packages/client/typings/window.d.ts b/packages/client/typings/window.d.ts index f1b8c3c2a8b..cb620c44607 100644 --- a/packages/client/typings/window.d.ts +++ b/packages/client/typings/window.d.ts @@ -42,6 +42,7 @@ interface Window { EXTERNAL_VALIDATION_WORKQUEUE: boolean PRINT_DECLARATION: boolean DATE_OF_BIRTH_UNKNOWN: boolean + V2_EVENTS: boolean } LANGUAGES: string LOGIN_URL: string