From 43e7b2a964c6f93637b4e969aa341cbb810d3c4a Mon Sep 17 00:00:00 2001 From: Colby Williams Date: Wed, 9 Feb 2022 18:09:15 -0600 Subject: [PATCH 1/3] useUrl hook --- web/src/App.tsx | 14 ++- web/src/components/ComponentList.tsx | 6 +- web/src/components/ComponentTaskList.tsx | 8 +- web/src/components/ComponentsCard.tsx | 6 +- web/src/components/DeploymentScopeForm.tsx | 6 +- web/src/components/DeploymentScopeList.tsx | 3 +- web/src/components/HeaderBar.tsx | 15 +-- web/src/components/HeaderBreadcrumb.tsx | 11 ++- web/src/components/ProjectList.tsx | 6 +- web/src/components/ProjectTemplateForm.tsx | 5 +- web/src/components/ProjectTemplateList.tsx | 6 +- web/src/components/ScheduleForm.tsx | 6 +- web/src/components/ScheduleList.tsx | 8 +- web/src/components/nav/OrgSettingsNav.tsx | 5 +- web/src/components/nav/ProjectNav.tsx | 5 +- web/src/components/nav/ProjectSettingsNav.tsx | 5 +- web/src/components/nav/RootNav.tsx | 6 +- web/src/hooks/index.ts | 4 + .../hooks/useCancelProjectComponentTask.ts | 6 +- web/src/hooks/useCreateProjectComponent.ts | 6 +- .../hooks/useCreateProjectComponentTask.ts | 6 +- web/src/hooks/useCreateProjectSchedule.ts | 6 +- web/src/hooks/useOrg.ts | 6 +- web/src/hooks/useProject.ts | 7 +- web/src/hooks/useProjectComponent.ts | 7 +- web/src/hooks/useProjectComponentTask.ts | 7 +- web/src/hooks/useProjectComponentTasks.ts | 5 +- web/src/hooks/useProjectSchedule.ts | 7 +- web/src/hooks/useRerunProjectComponentTask.ts | 6 +- web/src/hooks/useUpdateProjectSchedule.ts | 6 +- web/src/hooks/useUrl.ts | 98 +++++++++++++++++++ web/src/view/ContentRouter.tsx | 1 - web/src/view/NavRouter.tsx | 10 +- web/src/view/ProjectView.tsx | 6 +- web/src/view/RootView.tsx | 67 +++---------- web/src/view/index.ts | 1 + 36 files changed, 217 insertions(+), 166 deletions(-) create mode 100644 web/src/hooks/useUrl.ts diff --git a/web/src/App.tsx b/web/src/App.tsx index a4772ef6..61769e82 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -4,7 +4,7 @@ import React from 'react'; import { QueryClient, QueryClientProvider } from 'react-query'; import { ReactQueryDevtools } from 'react-query/devtools' -import { BrowserRouter } from 'react-router-dom'; +import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'; import { RootView } from './view'; import './App.css' @@ -18,10 +18,18 @@ const queryClient = new QueryClient({ } }) -export const App: React.FC = () => ( +export const App: React.FC = () => ( - + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + diff --git a/web/src/components/ComponentList.tsx b/web/src/components/ComponentList.tsx index 4cf30d41..97ef41bc 100644 --- a/web/src/components/ComponentList.tsx +++ b/web/src/components/ComponentList.tsx @@ -3,10 +3,10 @@ import React, { useEffect, useState } from 'react'; import { IColumn, Stack, Text } from '@fluentui/react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Component, ComponentTemplate } from 'teamcloud'; import { ContentList, ComponentLink, ComponentTemplateLink, UserPersona } from '.'; -import { useDeploymentScopes, useProjectMembers, useProjectComponentTemplates, useProjectComponents } from '../hooks'; +import { useDeploymentScopes, useProjectMembers, useProjectComponentTemplates, useProjectComponents, useUrl } from '../hooks'; import collaboration from '../img/MSC17_collaboration_010_noBG.png' import { ComponentIcon } from './ComponentIcon'; @@ -18,7 +18,7 @@ export interface IComponentListProps { export const ComponentList: React.FC = (props) => { const navigate = useNavigate(); - const { orgId, projectId } = useParams() as { orgId: string, projectId: string }; + const { orgId, projectId } = useUrl() as { orgId: string, projectId: string }; const [items, setItems] = useState<{ component: Component, template: ComponentTemplate }[]>() diff --git a/web/src/components/ComponentTaskList.tsx b/web/src/components/ComponentTaskList.tsx index a843c408..c762998e 100644 --- a/web/src/components/ComponentTaskList.tsx +++ b/web/src/components/ComponentTaskList.tsx @@ -2,14 +2,12 @@ // Licensed under the MIT License. import React, { useEffect } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { CheckboxVisibility, DetailsList, DetailsListLayoutMode, FontIcon, getTheme, IColumn, IconButton, IContextualMenuProps, IDetailsRowProps, IIconProps, IRenderFunction, Link, SelectionMode, Stack, Text } from '@fluentui/react'; import { ComponentTask, KnownComponentTaskState } from 'teamcloud'; -import { useOrg, useProject, useProjectComponent, useProjectComponentTasks, useProjectComponentTemplates, useProjectComponentTask } from '../hooks'; +import { useOrg, useProject, useProjectComponent, useProjectComponentTasks, useProjectComponentTemplates, useProjectComponentTask, useCancelProjectComponentTask, useRerunProjectComponentTask, useUrl } from '../hooks'; import { ComponentTaskConsole } from '.'; import { isActiveComponentTaskState, isFinalComponentTaskState } from '../Utils'; -import { useCancelProjectComponentTask } from '../hooks/useCancelProjectComponentTask'; -import { useRerunProjectComponentTask } from '../hooks/useRerunProjectComponentTask'; export interface IComponentTaskListProps { } @@ -18,7 +16,7 @@ export const ComponentTaskList: React.FunctionComponent const theme = getTheme(); const navigate = useNavigate(); - const { orgId, projectId, itemId, subitemId } = useParams() as { orgId: string, projectId: string, itemId: string, subitemId: string }; + const { orgId, projectId, itemId, subitemId } = useUrl() as { orgId: string, projectId: string, itemId: string, subitemId: string }; const { data: org } = useOrg(); const { data: project } = useProject(); diff --git a/web/src/components/ComponentsCard.tsx b/web/src/components/ComponentsCard.tsx index 872d91e4..28864dd8 100644 --- a/web/src/components/ComponentsCard.tsx +++ b/web/src/components/ComponentsCard.tsx @@ -2,17 +2,17 @@ // Licensed under the MIT License. import React, { useEffect, useState } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Stack, DefaultButton, Text, ICommandBarItemProps, Dialog, DialogType, DialogFooter, PrimaryButton, IColumn, DetailsList, DetailsListLayoutMode, CheckboxVisibility, IDetailsRowProps, IRenderFunction, SelectionMode } from '@fluentui/react'; import { Component, ComponentTemplate } from 'teamcloud'; -import { useOrg, useDeploymentScopes, useProject, useProjectComponents, useProjectComponentTemplates, useDeleteProjectComponent } from '../hooks'; +import { useOrg, useDeploymentScopes, useProject, useProjectComponents, useProjectComponentTemplates, useDeleteProjectComponent, useUrl } from '../hooks'; import { DetailCard, ComponentLink, ComponentIcon } from '.'; export const ComponentsCard: React.FC = () => { const navigate = useNavigate(); - const { orgId, projectId } = useParams() as { orgId: string, projectId: string }; + const { orgId, projectId } = useUrl() as { orgId: string, projectId: string }; const { data: org } = useOrg(); const { data: scopes } = useDeploymentScopes(); diff --git a/web/src/components/DeploymentScopeForm.tsx b/web/src/components/DeploymentScopeForm.tsx index 041d84f2..fa731dff 100644 --- a/web/src/components/DeploymentScopeForm.tsx +++ b/web/src/components/DeploymentScopeForm.tsx @@ -3,11 +3,11 @@ import React, { useCallback, useEffect, useState } from 'react'; import { ComboBox, DefaultButton, IComboBoxOption, PrimaryButton, Stack, TextField } from '@fluentui/react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { FuiForm } from '@rjsf/fluent-ui' import { IChangeEvent, ISubmitEvent } from '@rjsf/core'; import { DeploymentScopeDefinition } from 'teamcloud'; -import { useAdapters, useCreateDeploymentScope } from '../hooks'; +import { useAdapters, useCreateDeploymentScope, useUrl } from '../hooks'; import { ContentSeparator, TCFieldTemplate } from '.'; export interface IDeploymentScopeFormProps { @@ -20,7 +20,7 @@ export const DeploymentScopeForm: React.FC = (props) const { onScopeChange } = props; const navigate = useNavigate(); - const { orgId } = useParams() as { orgId: string }; + const { orgId } = useUrl() as { orgId: string }; const { data: adapterInformation } = useAdapters(); diff --git a/web/src/components/DeploymentScopeList.tsx b/web/src/components/DeploymentScopeList.tsx index ac472632..d91645bc 100644 --- a/web/src/components/DeploymentScopeList.tsx +++ b/web/src/components/DeploymentScopeList.tsx @@ -6,10 +6,9 @@ import { useNavigate } from 'react-router-dom'; import { Checkbox, IColumn, DefaultButton } from '@fluentui/react'; import { DeploymentScope } from 'teamcloud'; import { ContentList } from '.'; -import { useOrg, useDeploymentScopes } from '../hooks'; +import { useOrg, useDeploymentScopes, useAuthorizeDeployemntScope } from '../hooks'; import collaboration from '../img/MSC17_collaboration_010_noBG.png' -import { useAuthorizeDeployemntScope } from '../hooks/useAuthorizeDeploymentScope'; export const DeploymentScopeList: React.FC = () => { diff --git a/web/src/components/HeaderBar.tsx b/web/src/components/HeaderBar.tsx index f94b0a59..b6a9fa35 100644 --- a/web/src/components/HeaderBar.tsx +++ b/web/src/components/HeaderBar.tsx @@ -2,7 +2,7 @@ // Licensed under the MIT License. import React from 'react'; -import { Route, Routes, useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Stack, getTheme, Link } from '@fluentui/react'; import { HeaderBreadcrumb, UserInfo } from '.'; @@ -26,18 +26,7 @@ export const HeaderBar: React.FC = () => { navigate('/')}>TeamCloud - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - + diff --git a/web/src/components/HeaderBreadcrumb.tsx b/web/src/components/HeaderBreadcrumb.tsx index 161a83b4..db313775 100644 --- a/web/src/components/HeaderBreadcrumb.tsx +++ b/web/src/components/HeaderBreadcrumb.tsx @@ -2,22 +2,27 @@ // Licensed under the MIT License. import React from 'react'; -import { useNavigate, useLocation, useParams } from 'react-router-dom'; +import { useNavigate, useLocation } from 'react-router-dom'; import { Text, Breadcrumb, IBreadcrumbItem } from '@fluentui/react'; import { endsWithLowerCase, includesLowerCase, matchesLowerCase, matchesRouteParam } from '../Utils'; -import { useOrgs, useProject, useProjectComponent } from '../hooks'; +import { useOrgs, useProject, useProjectComponent, useUrl } from '../hooks'; export const HeaderBreadcrumb: React.FC = () => { const location = useLocation(); const navigate = useNavigate(); - const { orgId, projectId, navId, itemId, settingId } = useParams() as { orgId: string, projectId: string, navId: string, itemId: string, settingId: string }; + + const foo = useUrl(); + const { orgId, projectId, navId, itemId, settingId } = useUrl() as { orgId: string, projectId: string, navId: string, itemId: string, settingId: string }; const { data: orgs } = useOrgs(); const { data: project } = useProject(); const { data: component } = useProjectComponent(); const _breadcrumbs = (): IBreadcrumbItem[] => { + + console.debug(foo); + const crumbs: IBreadcrumbItem[] = []; if (orgId === undefined) diff --git a/web/src/components/ProjectList.tsx b/web/src/components/ProjectList.tsx index 989e9a64..9a7fe46d 100644 --- a/web/src/components/ProjectList.tsx +++ b/web/src/components/ProjectList.tsx @@ -2,11 +2,11 @@ // Licensed under the MIT License. import React from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { DetailsListLayoutMode, IColumn, IRenderFunction, IDetailsRowProps, CheckboxVisibility, SelectionMode, Persona, PersonaSize, getTheme, DetailsList, Stack } from '@fluentui/react'; import { Project } from 'teamcloud'; import { NoData } from '.'; -import { useProjects } from '../hooks'; +import { useProjects, useUrl } from '../hooks'; import collaboration from '../img/MSC17_collaboration_010_noBG.png' @@ -14,7 +14,7 @@ export const ProjectList: React.FC = () => { const navigate = useNavigate(); - const { orgId } = useParams() as { orgId: string }; + const { orgId } = useUrl() as { orgId: string }; const { data: projects } = useProjects(); diff --git a/web/src/components/ProjectTemplateForm.tsx b/web/src/components/ProjectTemplateForm.tsx index 45d816f2..9dce6ded 100644 --- a/web/src/components/ProjectTemplateForm.tsx +++ b/web/src/components/ProjectTemplateForm.tsx @@ -2,9 +2,10 @@ // Licensed under the MIT License. import React, { useEffect, useState } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { DefaultButton, PrimaryButton, Stack, TextField } from '@fluentui/react'; import { ProjectTemplateDefinition } from 'teamcloud'; +import { useUrl } from '../hooks'; export interface IProjectTemplateFormProps { embedded?: boolean; @@ -15,7 +16,7 @@ export interface IProjectTemplateFormProps { export const ProjectTemplateForm: React.FC = (props) => { const navigate = useNavigate(); - const { orgId } = useParams() as { orgId: string }; + const { orgId } = useUrl() as { orgId: string }; // Project Template const [templateName, setTemplateName] = useState(props.embedded ? 'Sample Project Template' : undefined); diff --git a/web/src/components/ProjectTemplateList.tsx b/web/src/components/ProjectTemplateList.tsx index 039368bf..bb5dfd55 100644 --- a/web/src/components/ProjectTemplateList.tsx +++ b/web/src/components/ProjectTemplateList.tsx @@ -2,12 +2,12 @@ // Licensed under the MIT License. import React, { useState } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Checkbox, IColumn, IconButton, Label, Modal, Stack, Text } from '@fluentui/react'; import ReactMarkdown from 'react-markdown'; import { ProjectTemplate } from 'teamcloud'; import { ContentList, ContentSeparator } from '.'; -import { useProjectTemplates } from '../hooks'; +import { useProjectTemplates, useUrl } from '../hooks'; import collaboration from '../img/MSC17_collaboration_010_noBG.png' @@ -15,7 +15,7 @@ export const ProjectTemplateList: React.FC = () => { const navigate = useNavigate(); - const { orgId } = useParams() as { orgId: string }; + const { orgId } = useUrl() as { orgId: string }; const { data: templates } = useProjectTemplates(); diff --git a/web/src/components/ScheduleForm.tsx b/web/src/components/ScheduleForm.tsx index 5b780df3..ef6e44fb 100644 --- a/web/src/components/ScheduleForm.tsx +++ b/web/src/components/ScheduleForm.tsx @@ -2,10 +2,10 @@ // Licensed under the MIT License. import React, { useState, useEffect } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { DefaultButton, Dropdown, DropdownMenuItemType, IDropdownOption, PrimaryButton, Stack, Checkbox, Toggle, IComboBoxOption, ComboBox, IComboBox, Text, Label } from '@fluentui/react'; import { Component, ComponentTaskTemplate, ComponentTemplate, ScheduleDefinition } from 'teamcloud'; -import { useOrg, useProject, useProjectComponentTemplates, useProjectComponents, useProjectMembers, useUser, useCreateProjectSchedule, useProjectSchedule, useUpdateProjectSchedule } from '../hooks'; +import { useOrg, useProject, useProjectComponentTemplates, useProjectComponents, useProjectMembers, useUser, useCreateProjectSchedule, useProjectSchedule, useUpdateProjectSchedule, useUrl } from '../hooks'; import { DaysOfWeek, DaysOfWeekNames, ProjectMember, shiftToLocal, shiftToUtc } from '../model'; import { ContentSeparator } from '.'; import { ErrorBar } from './common'; @@ -14,7 +14,7 @@ export const ScheduleForm: React.FC = () => { const navigate = useNavigate(); - const { orgId, projectId, itemId } = useParams() as { orgId: string, projectId: string, itemId: string }; + const { orgId, projectId, itemId } = useUrl() as { orgId: string, projectId: string, itemId: string }; const now = new Date(); diff --git a/web/src/components/ScheduleList.tsx b/web/src/components/ScheduleList.tsx index 95bacfbd..8da09390 100644 --- a/web/src/components/ScheduleList.tsx +++ b/web/src/components/ScheduleList.tsx @@ -3,13 +3,13 @@ import React, { useEffect, useState } from 'react'; import { Checkbox, IColumn, PersonaSize, Stack, Text } from '@fluentui/react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Component, ComponentTaskTemplate, ComponentTemplate, Schedule } from 'teamcloud'; import { ContentList, UserPersona } from '.'; -import { useProjectMembers, useProjectComponentTemplates, useProjectComponents, useProjectSchedules } from '../hooks'; +import { useProjectMembers, useProjectComponentTemplates, useProjectComponents, useProjectSchedules, useUrl } from '../hooks'; +import { shiftToLocal } from '../model'; import collaboration from '../img/MSC17_collaboration_010_noBG.png' -import { shiftToLocal } from '../model'; export interface IScheduleListProps { onItemInvoked?: (schedule: Schedule, component: Component) => void; @@ -18,7 +18,7 @@ export interface IScheduleListProps { export const ScheduleList: React.FC = (props) => { const navigate = useNavigate(); - const { orgId, projectId } = useParams() as { orgId: string, projectId: string }; + const { orgId, projectId } = useUrl() as { orgId: string, projectId: string }; const [items, setItems] = useState<{ schedule: Schedule, tasks?: { component?: Component, template?: ComponentTemplate, taskTemplate?: ComponentTaskTemplate }[] }[]>() diff --git a/web/src/components/nav/OrgSettingsNav.tsx b/web/src/components/nav/OrgSettingsNav.tsx index ea52fa37..aaca9d3e 100644 --- a/web/src/components/nav/OrgSettingsNav.tsx +++ b/web/src/components/nav/OrgSettingsNav.tsx @@ -2,13 +2,14 @@ // Licensed under the MIT License. import React from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Nav, INavLinkGroup, Stack, getTheme } from '@fluentui/react'; +import { useUrl } from '../../hooks'; export const OrgSettingsNav: React.FC = () => { const navigate = useNavigate(); - const { orgId, settingId } = useParams() as { orgId: string, settingId: string }; + const { orgId, settingId } = useUrl() as { orgId: string, settingId: string }; const _navLinkGroups = (): INavLinkGroup[] => [{ links: orgId ? [ diff --git a/web/src/components/nav/ProjectNav.tsx b/web/src/components/nav/ProjectNav.tsx index e72cfc1f..768ea492 100644 --- a/web/src/components/nav/ProjectNav.tsx +++ b/web/src/components/nav/ProjectNav.tsx @@ -2,13 +2,14 @@ // Licensed under the MIT License. import React from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Nav, INavLinkGroup, INavLink, Stack, ActionButton, Persona, PersonaSize } from '@fluentui/react'; +import { useUrl } from '../../hooks'; export const ProjectNav: React.FC = () => { const navigate = useNavigate(); - const { orgId, projectId, navId } = useParams() as { orgId: string, projectId: string, navId: string }; + const { orgId, projectId, navId } = useUrl() as { orgId: string, projectId: string, navId: string }; const _navLinkGroups = (): INavLinkGroup[] => [{ links: (orgId && projectId) ? [ diff --git a/web/src/components/nav/ProjectSettingsNav.tsx b/web/src/components/nav/ProjectSettingsNav.tsx index 7eb14474..32849ac4 100644 --- a/web/src/components/nav/ProjectSettingsNav.tsx +++ b/web/src/components/nav/ProjectSettingsNav.tsx @@ -2,15 +2,16 @@ // Licensed under the MIT License. import React from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Nav, INavLinkGroup, Stack, getTheme } from '@fluentui/react'; +import { useUrl } from '../../hooks'; export interface IProjectSettingsNavProps { } export const ProjectSettingsNav: React.FC = (props) => { const navigate = useNavigate(); - const { orgId, projectId, settingId } = useParams() as { orgId: string, projectId: string, settingId: string }; + const { orgId, projectId, settingId } = useUrl() as { orgId: string, projectId: string, settingId: string }; const _navLinkGroups = (): INavLinkGroup[] => [{ links: (orgId && projectId) ? [ diff --git a/web/src/components/nav/RootNav.tsx b/web/src/components/nav/RootNav.tsx index e6ace3aa..e0e733b1 100644 --- a/web/src/components/nav/RootNav.tsx +++ b/web/src/components/nav/RootNav.tsx @@ -2,15 +2,15 @@ // Licensed under the MIT License. import React from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Nav, INavLinkGroup, INavLink, Stack, ActionButton, Persona, PersonaSize, getTheme, Text } from '@fluentui/react'; -import { useOrgs } from '../../hooks'; +import { useOrgs, useUrl } from '../../hooks'; export const RootNav: React.FC = () => { const navigate = useNavigate(); - const { orgId } = useParams() as { orgId: string }; + const { orgId } = useUrl() as { orgId: string }; const { data: orgs } = useOrgs(); diff --git a/web/src/hooks/index.ts b/web/src/hooks/index.ts index 02b24ff5..cb935d54 100644 --- a/web/src/hooks/index.ts +++ b/web/src/hooks/index.ts @@ -5,8 +5,10 @@ export * from './useAdapters' export * from './useAddMembers' export * from './useAddProjectMembers' export * from './useAuditCommands' +export * from './useAuthorizeDeploymentScope' export * from './useAzureManagementGroups' export * from './useAzureSubscriptions' +export * from './useCancelProjectComponentTask' export * from './useCreateDeploymentScope' export * from './useCreateOrg' export * from './useCreateProject' @@ -37,7 +39,9 @@ export * from './useProjectSchedules' export * from './useProjectTemplates' export * from './useProjectUsers' export * from './useQueriesTyped' +export * from './useRerunProjectComponentTask' export * from './useRunProjectSchedule' export * from './useUpdateProjectSchedule' +export * from './useUrl' export * from './useUser' export * from './useUsers' diff --git a/web/src/hooks/useCancelProjectComponentTask.ts b/web/src/hooks/useCancelProjectComponentTask.ts index 8fe630c4..63abb90d 100644 --- a/web/src/hooks/useCancelProjectComponentTask.ts +++ b/web/src/hooks/useCancelProjectComponentTask.ts @@ -2,16 +2,16 @@ // Licensed under the MIT License. import { useQueryClient, useMutation } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; import { ComponentTask } from "teamcloud"; -import { useOrg, useProject, useProjectComponent, useProjectComponentTasks } from "."; +import { useOrg, useProject, useProjectComponent, useProjectComponentTasks, useUrl } from "."; import { api, onResponse } from "../API"; export const useCancelProjectComponentTask = () => { const navigate = useNavigate(); - const { orgId, projectId, itemId } = useParams() as { orgId: string, projectId: string, itemId: string }; + const { orgId, projectId, itemId } = useUrl() as { orgId: string, projectId: string, itemId: string }; const { data: org } = useOrg(); const { data: project } = useProject(); diff --git a/web/src/hooks/useCreateProjectComponent.ts b/web/src/hooks/useCreateProjectComponent.ts index bf7bcd12..56f07d2a 100644 --- a/web/src/hooks/useCreateProjectComponent.ts +++ b/web/src/hooks/useCreateProjectComponent.ts @@ -2,16 +2,16 @@ // Licensed under the MIT License. import { useMutation, useQueryClient } from 'react-query' -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { ComponentDefinition } from 'teamcloud'; import { api, onResponse } from '../API'; -import { useOrg, useProject, useProjectComponents } from '.'; +import { useOrg, useProject, useProjectComponents, useUrl } from '.'; export const useCreateProjectComponent = () => { const navigate = useNavigate(); - const { orgId, projectId } = useParams() as { orgId: string, projectId: string }; + const { orgId, projectId } = useUrl() as { orgId: string, projectId: string }; const { data: org } = useOrg(); const { data: project } = useProject(); diff --git a/web/src/hooks/useCreateProjectComponentTask.ts b/web/src/hooks/useCreateProjectComponentTask.ts index 918714f8..7f10215a 100644 --- a/web/src/hooks/useCreateProjectComponentTask.ts +++ b/web/src/hooks/useCreateProjectComponentTask.ts @@ -2,16 +2,16 @@ // Licensed under the MIT License. import { useMutation, useQueryClient } from 'react-query' -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { ComponentTaskDefinition } from 'teamcloud'; import { api, onResponse } from '../API'; -import { useOrg, useProject, useProjectComponent, useProjectComponentTasks } from '.'; +import { useOrg, useProject, useProjectComponent, useProjectComponentTasks, useUrl } from '.'; export const useCreateProjectComponentTask = () => { const navigate = useNavigate(); - const { orgId, projectId, itemId } = useParams() as { orgId: string, projectId: string, itemId: string }; + const { orgId, projectId, itemId } = useUrl() as { orgId: string, projectId: string, itemId: string }; const { data: org } = useOrg(); const { data: project } = useProject(); diff --git a/web/src/hooks/useCreateProjectSchedule.ts b/web/src/hooks/useCreateProjectSchedule.ts index 452b01c7..6e20ac00 100644 --- a/web/src/hooks/useCreateProjectSchedule.ts +++ b/web/src/hooks/useCreateProjectSchedule.ts @@ -2,16 +2,16 @@ // Licensed under the MIT License. import { useMutation, useQueryClient } from 'react-query' -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { ScheduleDefinition } from 'teamcloud'; import { api, onResponse } from '../API'; -import { useOrg, useProject, useProjectSchedules } from '.'; +import { useOrg, useProject, useProjectSchedules, useUrl } from '.'; export const useCreateProjectSchedule = () => { const navigate = useNavigate(); - const { orgId, projectId } = useParams() as { orgId: string, projectId: string }; + const { orgId, projectId } = useUrl() as { orgId: string, projectId: string }; const { data: org } = useOrg(); const { data: project } = useProject(); diff --git a/web/src/hooks/useOrg.ts b/web/src/hooks/useOrg.ts index bc12850e..520ebb00 100644 --- a/web/src/hooks/useOrg.ts +++ b/web/src/hooks/useOrg.ts @@ -1,14 +1,14 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { useParams } from 'react-router-dom'; import { useQuery } from 'react-query' import { useIsAuthenticated } from '@azure/msal-react'; import { api, onResponse } from '../API'; +import { useUrl } from '.'; export const useOrg = () => { - const { orgId } = useParams() as { orgId: string }; + const { orgId } = useUrl() as { orgId: string }; const isAuthenticated = useIsAuthenticated(); @@ -20,6 +20,6 @@ export const useOrg = () => { return data; }, { - enabled: isAuthenticated && !!orgId && orgId.toLowerCase() !== 'new' + enabled: isAuthenticated && !!orgId }); } diff --git a/web/src/hooks/useProject.ts b/web/src/hooks/useProject.ts index 98a879f7..e75bf88a 100644 --- a/web/src/hooks/useProject.ts +++ b/web/src/hooks/useProject.ts @@ -1,15 +1,14 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { useParams } from 'react-router-dom'; import { useQuery } from 'react-query' import { useIsAuthenticated } from '@azure/msal-react'; import { api, onResponse } from '../API'; -import { useOrg } from '.'; +import { useOrg, useUrl } from '.'; export const useProject = () => { - const { projectId } = useParams() as { projectId: string }; + const { projectId } = useUrl() as { projectId: string }; const isAuthenticated = useIsAuthenticated(); @@ -23,6 +22,6 @@ export const useProject = () => { return data; }, { - enabled: isAuthenticated && !!org?.id && !!projectId && projectId.toLowerCase() !== 'new' + enabled: isAuthenticated && !!org?.id && !!projectId }); } diff --git a/web/src/hooks/useProjectComponent.ts b/web/src/hooks/useProjectComponent.ts index 7b0984d9..467b9fca 100644 --- a/web/src/hooks/useProjectComponent.ts +++ b/web/src/hooks/useProjectComponent.ts @@ -2,16 +2,15 @@ // Licensed under the MIT License. import { useQuery } from 'react-query' -import { useParams } from 'react-router-dom'; import { useIsAuthenticated } from '@azure/msal-react'; import { api } from '../API'; -import { useProject } from '.'; +import { useProject, useUrl } from '.'; import { useErrorHandler } from '../view/ErrorHandler'; import { HttpError } from '../Errors'; export const useProjectComponent = (required?: boolean) => { - const { navId, itemId } = useParams() as { navId: string, itemId: string }; + const { navId, itemId } = useUrl() as { navId: string, itemId: string }; const { data: project } = useProject(); const isAuthenticated = useIsAuthenticated(); @@ -37,7 +36,7 @@ export const useProjectComponent = (required?: boolean) => { return data; }, { - enabled: isAuthenticated && !!project?.id && !!navId && navId.toLowerCase() === 'components' && !!itemId && itemId.toLowerCase() !== 'new', + enabled: isAuthenticated && !!project?.id && !!navId && navId.toLowerCase() === 'components' && !!itemId, retry: (cnt, err) => !(err instanceof HttpError && err.statusCode === 404), onError: required ? handleError : undefined }); diff --git a/web/src/hooks/useProjectComponentTask.ts b/web/src/hooks/useProjectComponentTask.ts index 59050f10..8a3b04dc 100644 --- a/web/src/hooks/useProjectComponentTask.ts +++ b/web/src/hooks/useProjectComponentTask.ts @@ -2,15 +2,14 @@ // Licensed under the MIT License. import { useQuery } from 'react-query' -import { useParams } from 'react-router-dom'; import { useIsAuthenticated } from '@azure/msal-react'; import { matchesRouteParam } from '../Utils'; import { api, onResponse } from '../API'; -import { useProject, useProjectComponent } from '.'; +import { useProject, useProjectComponent, useUrl } from '.'; export const useProjectComponentTask = () => { - const { itemId, subitemId } = useParams() as { itemId: string, subitemId: string }; + const { itemId, subitemId } = useUrl() as { itemId: string, subitemId: string }; const isAuthenticated = useIsAuthenticated(); @@ -25,6 +24,6 @@ export const useProjectComponentTask = () => { return data; }, { - enabled: isAuthenticated && !!project?.id && !!component?.id && !!itemId && matchesRouteParam(component, itemId) && !!subitemId && subitemId.toLowerCase() !== 'new', + enabled: isAuthenticated && !!project?.id && !!component?.id && !!itemId && matchesRouteParam(component, itemId) && !!subitemId }); } diff --git a/web/src/hooks/useProjectComponentTasks.ts b/web/src/hooks/useProjectComponentTasks.ts index 5fe2fb9f..8fd10cb3 100644 --- a/web/src/hooks/useProjectComponentTasks.ts +++ b/web/src/hooks/useProjectComponentTasks.ts @@ -2,15 +2,14 @@ // Licensed under the MIT License. import { useQuery } from 'react-query' -import { useParams } from 'react-router-dom'; import { useIsAuthenticated } from '@azure/msal-react'; import { matchesRouteParam } from '../Utils'; import { api, onResponse } from '../API'; -import { useProject, useProjectComponent } from '.'; +import { useProject, useProjectComponent, useUrl } from '.'; export const useProjectComponentTasks = () => { - const { itemId } = useParams() as { itemId: string }; + const { itemId } = useUrl() as { itemId: string }; const isAuthenticated = useIsAuthenticated(); diff --git a/web/src/hooks/useProjectSchedule.ts b/web/src/hooks/useProjectSchedule.ts index 3ca9bdb9..3f7a48db 100644 --- a/web/src/hooks/useProjectSchedule.ts +++ b/web/src/hooks/useProjectSchedule.ts @@ -2,14 +2,13 @@ // Licensed under the MIT License. import { useQuery } from 'react-query' -import { useParams } from 'react-router-dom'; import { useIsAuthenticated } from '@azure/msal-react'; import { api, onResponse } from '../API'; -import { useProject } from '.'; +import { useProject, useUrl } from '.'; export const useProjectSchedule = () => { - const { settingId, itemId } = useParams() as { settingId: string, itemId: string }; + const { settingId, itemId } = useUrl() as { settingId: string, itemId: string }; const isAuthenticated = useIsAuthenticated(); @@ -23,6 +22,6 @@ export const useProjectSchedule = () => { return data; }, { - enabled: isAuthenticated && !!project?.id && !!settingId && settingId.toLowerCase() === 'schedules' && !!itemId && itemId.toLowerCase() !== 'new' + enabled: isAuthenticated && !!project?.id && !!settingId && settingId.toLowerCase() === 'schedules' && !!itemId }); } diff --git a/web/src/hooks/useRerunProjectComponentTask.ts b/web/src/hooks/useRerunProjectComponentTask.ts index 8e3350e7..ea7c3c00 100644 --- a/web/src/hooks/useRerunProjectComponentTask.ts +++ b/web/src/hooks/useRerunProjectComponentTask.ts @@ -1,7 +1,7 @@ import { useQueryClient, useMutation } from "react-query"; -import { useNavigate, useParams } from "react-router"; +import { useNavigate } from "react-router"; import { ComponentTask } from "teamcloud"; -import { useOrg, useProject, useProjectComponent, useProjectComponentTasks } from "."; +import { useOrg, useProject, useProjectComponent, useProjectComponentTasks, useUrl } from "."; import { api, onResponse } from "../API"; @@ -9,7 +9,7 @@ export const useRerunProjectComponentTask = () => { const navigate = useNavigate(); - const { orgId, projectId, itemId } = useParams() as { orgId: string, projectId: string, itemId: string }; + const { orgId, projectId, itemId } = useUrl() as { orgId: string, projectId: string, itemId: string }; const { data: org } = useOrg(); const { data: project } = useProject(); diff --git a/web/src/hooks/useUpdateProjectSchedule.ts b/web/src/hooks/useUpdateProjectSchedule.ts index a985f376..bf2d4c59 100644 --- a/web/src/hooks/useUpdateProjectSchedule.ts +++ b/web/src/hooks/useUpdateProjectSchedule.ts @@ -2,16 +2,16 @@ // Licensed under the MIT License. import { useMutation, useQueryClient } from 'react-query' -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { Schedule } from 'teamcloud'; import { api, onResponse } from '../API'; -import { useOrg, useProject } from '.'; +import { useOrg, useProject, useUrl } from '.'; export const useUpdateProjectSchedule = () => { const navigate = useNavigate(); - const { orgId, projectId } = useParams() as { orgId: string, projectId: string }; + const { orgId, projectId } = useUrl() as { orgId: string, projectId: string }; const { data: org } = useOrg(); const { data: project } = useProject(); diff --git a/web/src/hooks/useUrl.ts b/web/src/hooks/useUrl.ts new file mode 100644 index 00000000..61c3e5cc --- /dev/null +++ b/web/src/hooks/useUrl.ts @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { useEffect, useState } from "react"; +import { useLocation } from 'react-router-dom'; +import { matchesLowerCase } from "../Utils"; + +export const useUrl = () => { + + const { pathname } = useLocation(); + + const [orgId, setOrgId] = useState(); + const [projectId, setProjectId] = useState(); + const [settingId, setSettingId] = useState(); + const [navId, setNavId] = useState(); + const [subnavId, setSubnavId] = useState(); + const [itemId, setItemId] = useState(); + const [subitemId, setSubitemId] = useState(); + + useEffect(() => { + + const parts = pathname.split('/').filter(e => e); + + const length = parts.length; + + let org = undefined; + let project = undefined; + let setting = undefined; + let nav = undefined; + let subnav = undefined; + let item = undefined; + let subitem = undefined; + + if (length >= 2 && matchesLowerCase('orgs', parts[0]) && !matchesLowerCase('new', parts[1])) { + + org = parts[1]; // orgs/:orgId + + if (length >= 3 && matchesLowerCase('settings', parts[2])) { + + if (length >= 4) { + setting = parts[3]; // orgs/:orgId/settings/:settingId + + if (length >= 5 && !matchesLowerCase('new', parts[4])) + item = parts[4] // orgs/:orgId/settings/:settingId/:itemId + } + + } else if (length >= 4 && matchesLowerCase('projects', parts[2]) && !matchesLowerCase('new', parts[3])) { + + project = parts[3]; // orgs/:orgId/projects/:projectId + + if (length >= 5) { + + if (matchesLowerCase('settings', parts[4])) { + + if (length >= 6) { + setting = parts[5]; // orgs/:orgId/projects/:projectId/settings/:settingId + + if (length >= 7 && !matchesLowerCase('new', parts[6])) + item = parts[6]; // orgs/:orgId/projects/:projectId/settings/:settingId/:itemId + } + } else { + + nav = parts[4]; // orgs/:orgId/projects/:projectId/:navId + + if (length >= 6 && !matchesLowerCase('new', parts[5])) { + item = parts[5]; // orgs/:orgId/projects/:projectId/:navId/:itemId + + if (length >= 7) { + subnav = parts[6]; // orgs/:orgId/projects/:projectId/:navId/:itemId/:subNavId + + if (length >= 8) + subitem = parts[7]; // orgs/:orgId/projects/:projectId/:navId/:itemId/:subNavId/:subItemId + } + } + } + } + } + } + + if (org !== orgId) + setOrgId(org); + if (project !== projectId) + setProjectId(project); + if (setting !== settingId) + setSettingId(setting); + if (nav !== navId) + setNavId(nav); + if (subnav !== subnavId) + setSubnavId(subnav); + if (item !== itemId) + setItemId(item); + if (subitem !== subitemId) + setSubitemId(subitem); + + }, [itemId, navId, orgId, pathname, projectId, settingId, subitemId, subnavId]); + + return { orgId: orgId, projectId: projectId, settingId: settingId, navId: navId, subnavId: subnavId, itemId: itemId, subitemId: subitemId } +} diff --git a/web/src/view/ContentRouter.tsx b/web/src/view/ContentRouter.tsx index 6494f3cd..8b06e817 100644 --- a/web/src/view/ContentRouter.tsx +++ b/web/src/view/ContentRouter.tsx @@ -10,7 +10,6 @@ export const ContentRouter: React.FC = () => (
- } /> } /> } /> } /> diff --git a/web/src/view/NavRouter.tsx b/web/src/view/NavRouter.tsx index 0227ac3c..35b0c159 100644 --- a/web/src/view/NavRouter.tsx +++ b/web/src/view/NavRouter.tsx @@ -8,18 +8,12 @@ import { OrgSettingsNav, ProjectNav, ProjectSettingsNav, RootNav } from '../comp export const NavRouter: React.FC = () => (
- } /> - } /> + } /> + } /> } /> - } /> } /> } /> - } /> - } /> - } /> } /> - } /> - } />
); diff --git a/web/src/view/ProjectView.tsx b/web/src/view/ProjectView.tsx index 9f52f416..e4538460 100644 --- a/web/src/view/ProjectView.tsx +++ b/web/src/view/ProjectView.tsx @@ -2,18 +2,18 @@ // Licensed under the MIT License. import React, { useCallback, useEffect, useState } from 'react'; -import { Route, Routes, useNavigate, useParams } from 'react-router-dom'; +import { Route, Routes, useNavigate } from 'react-router-dom'; import { Stack, IconButton } from '@fluentui/react'; import { useQueryClient } from 'react-query'; import { ComponentTaskMenu, ComponentOverview, ProjectOverview, ContentHeader, ContentProgress, ContentContainer, MemberList, ComponentList, ComponentForm, ProjectSettingsOverview, ScheduleForm, ScheduleList } from '../components'; -import { useAddProjectMembers, useOrg, useProject, useProjectComponent, useProjectComponents, useProjectComponentTemplates, useProjectMembers, useProjectSchedule, useProjectSchedules } from '../hooks'; +import { useAddProjectMembers, useOrg, useProject, useProjectComponent, useProjectComponents, useProjectComponentTemplates, useProjectMembers, useProjectSchedule, useProjectSchedules, useUrl } from '../hooks'; import { startSignalR, stopSignalR } from '../API'; import { Message } from '../model'; export const ProjectView: React.FC = () => { const navigate = useNavigate(); - const { orgId, projectId } = useParams() as { orgId: string, projectId: string }; + const { orgId, projectId } = useUrl() as { orgId: string, projectId: string }; const [favorite, setFavorate] = useState(false); diff --git a/web/src/view/RootView.tsx b/web/src/view/RootView.tsx index 06a18c93..c721d79b 100644 --- a/web/src/view/RootView.tsx +++ b/web/src/view/RootView.tsx @@ -5,7 +5,6 @@ import React, { useEffect } from 'react'; import { InteractionType } from '@azure/msal-browser'; import { AuthenticatedTemplate, MsalAuthenticationResult, useMsalAuthentication } from '@azure/msal-react'; import { getTheme, Stack } from '@fluentui/react'; -import { Navigate, Route, Routes } from 'react-router-dom'; import { HeaderBar } from '../components'; import { auth } from '../API'; import { ContentRouter, NavRouter } from '.'; @@ -43,60 +42,18 @@ export const RootView: React.FC = (props) => { return ( - - } /> - } /> - } /> - } /> - } /> - } /> - - - - - - - - - - - - + + + + + + + + + + - } /> - {/* - - - - - - - - - - - - - - */} - + + ); } diff --git a/web/src/view/index.ts b/web/src/view/index.ts index 75a06fca..548856e8 100644 --- a/web/src/view/index.ts +++ b/web/src/view/index.ts @@ -4,6 +4,7 @@ export * from './ContentRouter' export * from './Error403' export * from './Error404' +export * from './ErrorHandler' export * from './NavRouter' export * from './NewOrgView' export * from './NewProjectView' From 3eb2ea389d7c743bae20922b3714773f53e140fb Mon Sep 17 00:00:00 2001 From: Colby Williams Date: Wed, 9 Feb 2022 18:26:31 -0600 Subject: [PATCH 2/3] expose image version in container --- .github/workflows/release.yml | 6 ++++++ deploy/bicep/website.bicep | 8 ++++---- src/TeamCloud.API/Controllers/RootController.cs | 3 ++- src/TeamCloud.API/Data/TeamCloudInformation.cs | 3 ++- src/TeamCloud.API/Dockerfile | 3 +++ src/TeamCloud.Orchestrator/Dockerfile | 3 +++ web/Dockerfile | 4 ++++ 7 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c21148a3..587e2bcc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,6 +103,8 @@ jobs: tags: | teamcloud.azurecr.io/teamcloud/api:${{ steps.gitversion.outputs.assemblySemVer }} teamcloud.azurecr.io/teamcloud/api:latest + build-args: | + image_version=${{ steps.gitversion.outputs.assemblySemVer }} - name: Build and push Orchestrator Image uses: docker/build-push-action@v2 @@ -112,6 +114,8 @@ jobs: tags: | teamcloud.azurecr.io/teamcloud/orchestrator:${{ steps.gitversion.outputs.assemblySemVer }} teamcloud.azurecr.io/teamcloud/orchestrator:latest + build-args: | + image_version=${{ steps.gitversion.outputs.assemblySemVer }} - name: Build and push Website Image uses: docker/build-push-action@v2 @@ -121,6 +125,8 @@ jobs: tags: | teamcloud.azurecr.io/teamcloud/website:${{ steps.gitversion.outputs.assemblySemVer }} teamcloud.azurecr.io/teamcloud/website:latest + build-args: | + image_version=${{ steps.gitversion.outputs.assemblySemVer }} # This must be run LAST - AFTER everything is added to release_assets - name: Prepare Release Assets diff --git a/deploy/bicep/website.bicep b/deploy/bicep/website.bicep index b6137a5f..c2324373 100644 --- a/deploy/bicep/website.bicep +++ b/deploy/bicep/website.bicep @@ -60,10 +60,10 @@ resource web 'Microsoft.Web/sites@2021-02-01' = { name: 'REACT_APP_TC_API_URL' value: reactAppTcApiUrl } - { - name: 'REACT_APP_VERSION' - value: reactAppVersion - } + // { + // name: 'REACT_APP_VERSION' + // value: reactAppVersion + // } { name: 'WEBSITE_NODE_DEFAULT_VERSION' value: '16' diff --git a/src/TeamCloud.API/Controllers/RootController.cs b/src/TeamCloud.API/Controllers/RootController.cs index 6cf880df..47b8f94e 100644 --- a/src/TeamCloud.API/Controllers/RootController.cs +++ b/src/TeamCloud.API/Controllers/RootController.cs @@ -33,7 +33,8 @@ public IActionResult Get() { var info = new TeamCloudInformation { - Version = teamCloudOptions.Version + ImageVersion = System.Environment.GetEnvironmentVariable("TEAMCLOUD_IMAGE_VERSION"), + TemplateVersion = teamCloudOptions.Version }; return DataResult diff --git a/src/TeamCloud.API/Data/TeamCloudInformation.cs b/src/TeamCloud.API/Data/TeamCloudInformation.cs index 35936eb5..738d0f04 100644 --- a/src/TeamCloud.API/Data/TeamCloudInformation.cs +++ b/src/TeamCloud.API/Data/TeamCloudInformation.cs @@ -11,5 +11,6 @@ namespace TeamCloud.API.Data; [JsonObject(NamingStrategyType = typeof(TeamCloudNamingStrategy))] public class TeamCloudInformation { - public string Version { get; set; } + public string ImageVersion { get; set; } + public string TemplateVersion { get; set; } } diff --git a/src/TeamCloud.API/Dockerfile b/src/TeamCloud.API/Dockerfile index 7c1e2ec3..3491d923 100644 --- a/src/TeamCloud.API/Dockerfile +++ b/src/TeamCloud.API/Dockerfile @@ -1,5 +1,8 @@ FROM mcr.microsoft.com/dotnet/aspnet:6.0 +ARG image_version=unknown +ENV TEAMCLOUD_IMAGE_VERSION=$image_version + ENV PORT 8080 EXPOSE 8080 diff --git a/src/TeamCloud.Orchestrator/Dockerfile b/src/TeamCloud.Orchestrator/Dockerfile index f0814090..109fdf86 100644 --- a/src/TeamCloud.Orchestrator/Dockerfile +++ b/src/TeamCloud.Orchestrator/Dockerfile @@ -7,6 +7,9 @@ COPY publish /home/site/wwwroot FROM mcr.microsoft.com/azure-functions/dotnet:4-appservice # FROM mcr.microsoft.com/azure-functions/dotnet:4 +ARG image_version=unknown +ENV TEAMCLOUD_IMAGE_VERSION=$image_version + ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ AzureFunctionsJobHost__Logging__Console__IsEnabled=true diff --git a/web/Dockerfile b/web/Dockerfile index d3715702..c9199ab6 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -18,6 +18,10 @@ RUN mkdir -p /home/LogFiles /opt/startup /home/site/wwwroot \ iproute2 \ nano +ARG image_version=unknown +ENV REACT_APP_VERSION=$image_version +ENV TEAMCLOUD_IMAGE_VERSION=$image_version + # setup default site RUN rm -f /etc/ssh/sshd_config COPY deploy/startup /opt/startup From 2bb64e3601390d4cfb6e70d39e421c9635c6c4d2 Mon Sep 17 00:00:00 2001 From: Colby Williams Date: Wed, 9 Feb 2022 18:33:15 -0600 Subject: [PATCH 3/3] remove old version appsettings --- deploy/bicep/main.bicep | 1 - deploy/bicep/website.bicep | 6 ------ 2 files changed, 7 deletions(-) diff --git a/deploy/bicep/main.bicep b/deploy/bicep/main.bicep index 62b95ddd..09db21c9 100644 --- a/deploy/bicep/main.bicep +++ b/deploy/bicep/main.bicep @@ -158,7 +158,6 @@ module web 'website.bicep' = { reactAppMsalClientId: reactAppMsalClientId reactAppMsalScope: reactAppMsalScope reactAppTcApiUrl: api.outputs.url - reactAppVersion: version webAppName: name teamcloudImageRepo: teamcloudImageRepo } diff --git a/deploy/bicep/website.bicep b/deploy/bicep/website.bicep index c2324373..c2bd9027 100644 --- a/deploy/bicep/website.bicep +++ b/deploy/bicep/website.bicep @@ -10,8 +10,6 @@ param reactAppTcApiUrl string @description('Scope.') param reactAppMsalScope string -param reactAppVersion string = '' - param teamcloudImageRepo string = 'teamcloud' var name = toLower(webAppName) @@ -60,10 +58,6 @@ resource web 'Microsoft.Web/sites@2021-02-01' = { name: 'REACT_APP_TC_API_URL' value: reactAppTcApiUrl } - // { - // name: 'REACT_APP_VERSION' - // value: reactAppVersion - // } { name: 'WEBSITE_NODE_DEFAULT_VERSION' value: '16'