diff --git a/src/config/constants.ts b/src/config/constants.ts index f1b718b26..44eb014dc 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -1 +1,5 @@ -export const SETTINGS_TITLE: string = 'Profile Settings' +export enum ToolTitle { + designLib = 'Design Library', + settings = 'Profile Settings', + work = 'Work', +} diff --git a/src/config/environments/environment.dev.config.ts b/src/config/environments/environment.dev.config.ts index 2b41ce034..5a3256772 100644 --- a/src/config/environments/environment.dev.config.ts +++ b/src/config/environments/environment.dev.config.ts @@ -1,10 +1,14 @@ import { GlobalConfig } from '../../lib' +import { ToolTitle } from '../constants' import { AppHostEnvironment } from './app-host-environment.enum' import { EnvironmentConfigDefault } from './environment.default.config' export const EnvironmentConfigDev: GlobalConfig = { ...EnvironmentConfigDefault, + DISABLED_TOOLS: [ + ToolTitle.designLib, + ], ENV: AppHostEnvironment.dev, TAG_MANAGER_ID: 'GTM-W7B537Z', } diff --git a/src/config/environments/environment.prod.config.ts b/src/config/environments/environment.prod.config.ts index 14d232096..e6705b611 100644 --- a/src/config/environments/environment.prod.config.ts +++ b/src/config/environments/environment.prod.config.ts @@ -1,4 +1,5 @@ import { GlobalConfig } from '../../lib' +import { ToolTitle } from '../constants' import { AppHostEnvironment } from './app-host-environment.enum' import { EnvironmentConfigDefault } from './environment.default.config' @@ -9,6 +10,9 @@ export const EnvironmentConfigProd: GlobalConfig = { V3: 'https://api.topcoder.com/v3', V5: 'https://api.topcoder.com/v5', }, + DISABLED_TOOLS: [ + ToolTitle.designLib, + ], ENV: AppHostEnvironment.prod, TAG_MANAGER_ID: 'GTM-MXXQHG8', URL: { diff --git a/src/header/utility-selectors/UtilitySelector/ProfileSelector/ProfileSelector.tsx b/src/header/utility-selectors/UtilitySelector/ProfileSelector/ProfileSelector.tsx index 909168150..9dfc37615 100644 --- a/src/header/utility-selectors/UtilitySelector/ProfileSelector/ProfileSelector.tsx +++ b/src/header/utility-selectors/UtilitySelector/ProfileSelector/ProfileSelector.tsx @@ -1,6 +1,6 @@ import { FC, useContext } from 'react' -import { SETTINGS_TITLE } from '../../../../config' +import { ToolTitle } from '../../../../config' import { profileContext, ProfileContextData } from '../../../../lib' import '../../../../lib/styles/index.scss' @@ -24,7 +24,7 @@ const ProfileSelector: FC<{}> = () => { return (
{!isLoggedIn && } - {isLoggedIn && } + {isLoggedIn && }
) } diff --git a/src/index.tsx b/src/index.tsx index ecd653f4a..98b14b623 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -3,6 +3,7 @@ import ReactDOM from 'react-dom' import { BrowserRouter } from 'react-router-dom' import { default as App } from './App' +import { EnvironmentConfig } from './config' import './index.scss' import { RouteProvider } from './lib' import reportWebVitals from './reportWebVitals' @@ -11,7 +12,11 @@ import { UtilsRoutes } from './utils' ReactDOM.render( - + diff --git a/src/lib/global-config.model.ts b/src/lib/global-config.model.ts index 3f0ea23c0..5427a8da8 100644 --- a/src/lib/global-config.model.ts +++ b/src/lib/global-config.model.ts @@ -3,6 +3,7 @@ export interface GlobalConfig { V3: string V5: string } + DISABLED_TOOLS?: Array ENV: string LOGGING: { PUBLIC_TOKEN: string diff --git a/src/lib/route-provider/route.provider.tsx b/src/lib/route-provider/route.provider.tsx index f3330a37b..626009866 100644 --- a/src/lib/route-provider/route.provider.tsx +++ b/src/lib/route-provider/route.provider.tsx @@ -1,12 +1,15 @@ import { Dispatch, FC, ReactElement, ReactNode, SetStateAction, useEffect, useState } from 'react' import { Route } from 'react-router-dom' +import { GlobalConfig } from '../global-config.model' + import { PlatformRoute } from './platform-route.model' import { RouteContextData } from './route-context-data.model' import { default as routeContext, defaultRouteContextData } from './route.context' interface RouteProviderProps { children: ReactNode + config: GlobalConfig toolsRoutes: Array utilsRoutes: Array } @@ -22,9 +25,13 @@ export const RouteProvider: FC = (props: RouteProviderProps) const getAndSetRoutes: () => void = () => { + function routeDisabled(route: PlatformRoute): boolean { + return !route.enabled || !!props.config.DISABLED_TOOLS?.includes(route.title) + } + // TODO: try to make these prop names configurable instead of hard-codded - const toolsRoutes: Array = props.toolsRoutes.filter(route => route.enabled) - const utilsRoutes: Array = props.utilsRoutes.filter(route => route.enabled) + const toolsRoutes: Array = props.toolsRoutes.filter(route => !routeDisabled(route)) + const utilsRoutes: Array = props.utilsRoutes.filter(route => !routeDisabled(route)) allRoutes = [ ...toolsRoutes, ...utilsRoutes, @@ -58,8 +65,7 @@ export const RouteProvider: FC = (props: RouteProviderProps) getAndSetRoutes() }, [ - props.toolsRoutes, - props.utilsRoutes, + props, ]) return ( diff --git a/src/lib/route-provider/route.utils.ts b/src/lib/route-provider/route.utils.ts index e206fbc9e..ad09f6287 100644 --- a/src/lib/route-provider/route.utils.ts +++ b/src/lib/route-provider/route.utils.ts @@ -1,8 +1,6 @@ -export const routeRoot: string = '/' +export const routeRoot: string = '/work' -export const routeIsActive: (activePath: string, pathName: string, rootPath?: string) => boolean - = (activePath: string, pathName: string, rootPath: string = routeRoot) => { - - return activePath?.startsWith(pathName) - && (pathName !== rootPath || activePath === rootPath) - } +export function routeIsActive(activePath: string, pathName: string, rootPath?: string): boolean { + return activePath?.startsWith(pathName) + && (pathName !== rootPath || activePath === rootPath) +} diff --git a/src/tools/design-lib/DesignLib.tsx b/src/tools/design-lib/DesignLib.tsx index df66fb2b8..ee5a6e913 100644 --- a/src/tools/design-lib/DesignLib.tsx +++ b/src/tools/design-lib/DesignLib.tsx @@ -1,9 +1,10 @@ import { FC, useContext } from 'react' import { Outlet, Routes } from 'react-router-dom' +import { ToolTitle } from '../../config' import { ContentLayout, routeContext, RouteContextData } from '../../lib' -export const toolTitle: string = 'Design Library' +export const toolTitle: string = ToolTitle.designLib const DesignLib: FC<{}> = () => { diff --git a/src/tools/self-service/SelfService.test.tsx b/src/tools/self-service/SelfService.test.tsx deleted file mode 100644 index 51a4f60d0..000000000 --- a/src/tools/self-service/SelfService.test.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import '@testing-library/jest-dom' - -describe('', () => { - - test('it should render the title prop', () => {}) -}) diff --git a/src/tools/self-service/SelfService.tsx b/src/tools/self-service/SelfService.tsx deleted file mode 100644 index 22cdd4268..000000000 --- a/src/tools/self-service/SelfService.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { FC } from 'react' - -import { ContentLayout } from '../../lib' - -export const toolTitle: string = 'Self Service' - -const SelfService: FC<{}> = () => - -export default SelfService diff --git a/src/tools/self-service/index.ts b/src/tools/self-service/index.ts deleted file mode 100644 index cc191ac55..000000000 --- a/src/tools/self-service/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './self-service.routes' diff --git a/src/tools/self-service/self-service.routes.tsx b/src/tools/self-service/self-service.routes.tsx deleted file mode 100644 index d00d9c849..000000000 --- a/src/tools/self-service/self-service.routes.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { PlatformRoute } from '../../lib' - -import SelfService, { toolTitle } from './SelfService' - -export const selfServiceRoutes: Array = [ - { - children: [], - element: , - enabled: true, - route: '/self-service', - title: toolTitle, - }, -] diff --git a/src/tools/tools.routes.ts b/src/tools/tools.routes.ts index fea3b2049..636ad9826 100644 --- a/src/tools/tools.routes.ts +++ b/src/tools/tools.routes.ts @@ -1,15 +1,13 @@ import { PlatformRoute } from '../lib' import { designLibRoutes } from './design-lib/' -import { selfServiceRoutes } from './self-service' -import { workIntakeRoutes } from './work-intake' +import { workRoutes } from './work' const toolRoutes: Array = [ // NOTE: these will be displayed in the order they are defined in this array // TODO: support ordering + ...workRoutes, ...designLibRoutes, - ...selfServiceRoutes, - ...workIntakeRoutes, ] export default toolRoutes diff --git a/src/tools/work-intake/WorkIntake.tsx b/src/tools/work-intake/WorkIntake.tsx deleted file mode 100644 index 1a84d32a1..000000000 --- a/src/tools/work-intake/WorkIntake.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { FC } from 'react' - -import { ContentLayout, Form } from '../../lib' - -import { workIntakeDef } from './work-intake-form.config' - -export const toolTitle: string = 'Work' - -const WorkIntake: FC<{}> = () => { - - function requestGenerator(): any { // TODO - return {} - } - - function save(): any { // TODO - return {} - } - - return ( - -
- - ) -} - -export default WorkIntake diff --git a/src/tools/work-intake/index.ts b/src/tools/work-intake/index.ts deleted file mode 100644 index 244e35eb5..000000000 --- a/src/tools/work-intake/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './work-intake.routes' diff --git a/src/tools/work-intake/work-intake.routes.tsx b/src/tools/work-intake/work-intake.routes.tsx deleted file mode 100644 index fb515da3b..000000000 --- a/src/tools/work-intake/work-intake.routes.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { PlatformRoute } from '../../lib' - -import WorkIntake, { toolTitle } from './WorkIntake' - -export const workIntakeRoutes: Array = [ - { - children: [], - element: , - enabled: true, - route: '/work-intake', - title: toolTitle, - }, -] diff --git a/src/tools/work/Work.test.tsx b/src/tools/work/Work.test.tsx new file mode 100644 index 000000000..a59199cd5 --- /dev/null +++ b/src/tools/work/Work.test.tsx @@ -0,0 +1,6 @@ +import '@testing-library/jest-dom' + +describe('', () => { + + test('it should render the work page', () => {}) +}) diff --git a/src/tools/work/Work.tsx b/src/tools/work/Work.tsx new file mode 100644 index 000000000..2fddf2183 --- /dev/null +++ b/src/tools/work/Work.tsx @@ -0,0 +1,25 @@ +import { FC, useContext } from 'react' +import { Outlet, Routes } from 'react-router-dom' + +import { ToolTitle } from '../../config' +import { ContentLayout, routeContext, RouteContextData } from '../../lib' + +export const toolTitle: string = ToolTitle.work + +const Work: FC<{}> = () => { + + const { getChildRoutes }: RouteContextData = useContext(routeContext) + + return ( + + <> + + + {getChildRoutes(toolTitle)} + + + + ) +} + +export default Work diff --git a/src/tools/work/dashboard/Dashboard.test.tsx b/src/tools/work/dashboard/Dashboard.test.tsx new file mode 100644 index 000000000..c5f110bee --- /dev/null +++ b/src/tools/work/dashboard/Dashboard.test.tsx @@ -0,0 +1,6 @@ +import '@testing-library/jest-dom' + +describe('', () => { + + test('it should render the Dashboard', () => {}) +}) diff --git a/src/tools/work/dashboard/Dashboard.tsx b/src/tools/work/dashboard/Dashboard.tsx new file mode 100644 index 000000000..05c7c0d29 --- /dev/null +++ b/src/tools/work/dashboard/Dashboard.tsx @@ -0,0 +1,19 @@ +import { FC } from 'react' +import { Link } from 'react-router-dom' + +const Dashboard: FC<{}> = () => { + return ( + <> +

+ Dashboard +

+
+ + Create Data Exploration + +
+ + ) +} + +export default Dashboard diff --git a/src/tools/work/dashboard/index.ts b/src/tools/work/dashboard/index.ts new file mode 100644 index 000000000..11753fb6e --- /dev/null +++ b/src/tools/work/dashboard/index.ts @@ -0,0 +1 @@ +export { default as Dashboard } from './Dashboard' diff --git a/src/tools/work/index.ts b/src/tools/work/index.ts new file mode 100644 index 000000000..fc0646633 --- /dev/null +++ b/src/tools/work/index.ts @@ -0,0 +1 @@ +export * from './work.routes' diff --git a/src/tools/work-intake/WorkIntake.test.tsx b/src/tools/work/work-intake/WorkIntake.test.tsx similarity index 55% rename from src/tools/work-intake/WorkIntake.test.tsx rename to src/tools/work/work-intake/WorkIntake.test.tsx index c5c0d7658..51fc99bf9 100644 --- a/src/tools/work-intake/WorkIntake.test.tsx +++ b/src/tools/work/work-intake/WorkIntake.test.tsx @@ -2,5 +2,5 @@ import '@testing-library/jest-dom' describe('', () => { - test('it should render the title prop', () => {}) + test('it should render the work intake form', () => {}) }) diff --git a/src/tools/work/work-intake/WorkIntake.tsx b/src/tools/work/work-intake/WorkIntake.tsx new file mode 100644 index 000000000..dc8a1e546 --- /dev/null +++ b/src/tools/work/work-intake/WorkIntake.tsx @@ -0,0 +1,27 @@ +import { FC } from 'react' + +import { Form } from '../../../lib' + +import { workIntakeDef } from './work-intake-form.config' + +const WorkIntake: FC<{}> = () => { + + function requestGenerator(): any { // TODO + return {} + } + + function save(): any { // TODO + return {} + } + + return ( + + ) +} + +export default WorkIntake diff --git a/src/tools/work/work-intake/index.ts b/src/tools/work/work-intake/index.ts new file mode 100644 index 000000000..91faffb09 --- /dev/null +++ b/src/tools/work/work-intake/index.ts @@ -0,0 +1 @@ +export { default as WorkIntake } from './WorkIntake' diff --git a/src/tools/work-intake/work-intake-form.config.ts b/src/tools/work/work-intake/work-intake-form.config.ts similarity index 98% rename from src/tools/work-intake/work-intake-form.config.ts rename to src/tools/work/work-intake/work-intake-form.config.ts index 17f66116c..337b9433e 100644 --- a/src/tools/work-intake/work-intake-form.config.ts +++ b/src/tools/work/work-intake/work-intake-form.config.ts @@ -3,7 +3,7 @@ import { inputOptional, validatorRequired, validatorSslUrl, -} from '../../lib' +} from '../../../lib' export const workIntakeDef: FormDefinition = { buttons: [ diff --git a/src/tools/work/work.routes.tsx b/src/tools/work/work.routes.tsx new file mode 100644 index 000000000..e5d097007 --- /dev/null +++ b/src/tools/work/work.routes.tsx @@ -0,0 +1,32 @@ +import { EnvironmentConfig } from '../../config' +import { IconOutline, PlatformRoute } from '../../lib' + +import { Dashboard } from './dashboard' +import { default as Work, toolTitle } from './Work' +import { WorkIntake } from './work-intake' + +export const workRoutes: Array = [ + { + children: [ + { + children: [], + element: , + enabled: true, + icon: IconOutline.MailIcon, + route: '', + title: 'Home', + }, + { + children: [], + element: , + enabled: true, + route: '/create', + title: toolTitle, + }, + ], + element: , + enabled: !EnvironmentConfig.DISABLED_TOOLS?.includes(toolTitle), + route: '/work', + title: toolTitle, + }, +] diff --git a/src/utils/settings/Settings.tsx b/src/utils/settings/Settings.tsx index bac76aabe..485df367f 100644 --- a/src/utils/settings/Settings.tsx +++ b/src/utils/settings/Settings.tsx @@ -3,7 +3,7 @@ import { Dispatch, FC, SetStateAction, useContext, useState } from 'react' import Modal from 'react-responsive-modal' import { NavigateFunction, useNavigate } from 'react-router-dom' -import { SETTINGS_TITLE } from '../../config' +import { ToolTitle } from '../../config' import { authUrlLogin, Avatar, @@ -21,6 +21,8 @@ import { PasswordReset } from './password-reset' import { ProfileUpdate } from './profile-update' import styles from './Settings.module.scss' +export const settingsTitle: string = ToolTitle.settings + const Settings: FC<{}> = () => { const profileContextData: ProfileContextData = useContext(profileContext) @@ -56,7 +58,7 @@ const Settings: FC<{}> = () => { return ( diff --git a/src/utils/settings/settings.routes.tsx b/src/utils/settings/settings.routes.tsx index f369b3855..2f815a9c1 100644 --- a/src/utils/settings/settings.routes.tsx +++ b/src/utils/settings/settings.routes.tsx @@ -1,7 +1,6 @@ -import { SETTINGS_TITLE } from '../../config' import { PlatformRoute } from '../../lib' -import Settings from './Settings' +import Settings, { settingsTitle } from './Settings' export const settingsRoutes: Array = [ { @@ -9,6 +8,6 @@ export const settingsRoutes: Array = [ element: , enabled: true, route: '/settings', - title: SETTINGS_TITLE, + title: settingsTitle, }, ]