diff --git a/src/apps/companies/__test__/router.test.js b/src/apps/companies/__test__/router.test.js index 463d9164683..6f83484c85d 100644 --- a/src/apps/companies/__test__/router.test.js +++ b/src/apps/companies/__test__/router.test.js @@ -9,9 +9,6 @@ describe('Company router', () => { '/:companyId/unarchive', '/:companyId', '/:companyId/details', - '/:companyId/business-details', - '/:companyId/hierarchies/ghq/:globalHqId/add', - '/:companyId/hierarchies/ghq/remove', '/:companyId/hierarchies/subsidiaries/:subsidiaryCompanyId/add', '/:companyId/contacts', '/:companyId/orders', diff --git a/src/apps/companies/apps/business-details/__test__/router.test.js b/src/apps/companies/apps/business-details/__test__/router.test.js deleted file mode 100644 index cf6ef98e32d..00000000000 --- a/src/apps/companies/apps/business-details/__test__/router.test.js +++ /dev/null @@ -1,8 +0,0 @@ -const router = require('../router') - -describe('Business details routes', () => { - it('should define all routes', () => { - const paths = router.stack.filter((r) => r.route).map((r) => r.route.path) - expect(paths).to.deep.equal(['/:companyId/business-details']) - }) -}) diff --git a/src/apps/companies/apps/business-details/client/CompanyBusinessDetails.jsx b/src/apps/companies/apps/business-details/client/CompanyBusinessDetails.jsx deleted file mode 100644 index 7456ed6d08c..00000000000 --- a/src/apps/companies/apps/business-details/client/CompanyBusinessDetails.jsx +++ /dev/null @@ -1,201 +0,0 @@ -import React from 'react' -import { connect } from 'react-redux' -import PropTypes from 'prop-types' -import Details from '@govuk-react/details' -import Link from '@govuk-react/link' -import styled from 'styled-components' -import Button from '@govuk-react/button' -import { SPACING_POINTS } from '@govuk-react/constants' - -import SectionAbout from './SectionAbout' -import SectionAddresses from './SectionAddresses' -import SectionHierarchy from './SectionHierarchy' -import SectionRegion from './SectionRegion' -import SectionSector from './SectionSector' -import SectionOneList from './SectionOneList' -import ArchiveForm from '../../../../../client/components/ArchiveForm' -import { StatusMessage } from '../../../../../client/components/' -import { COMPANY_DISSOLVED_OPTION } from '../../../constants' -import { CompanyResource } from '../../../../../client/components/Resource' -import CompanyLayout from '../../../../../client/components/Layout/CompanyLayout' -import urls from '../../../../../lib/urls' - -import { - ID as CHECK_PENDING_REQUEST_ID, - TASK_ARCHIVE_COMPANY, - state2props, -} from './state' -import { DNB__CHECK_PENDING_REQUEST } from '../../../../../client/actions' -import Task from '../../../../../client/components/Task' - -const { format } = require('../../../../../client/utils/date') - -const StyledRoot = styled('div')` - & > table { - margin-top: ${SPACING_POINTS[8]}px; - margin-bottom: ${SPACING_POINTS[8]}px; - } -` -const isDnbCompany = (dunsNumber) => !!dunsNumber -const isArchived = (archived) => !!archived -const lastUpdated = (company) => - [company.dnbModifiedOn, company.modifiedOn, company.createdOn] - .filter(Boolean) - .sort() - .reverse()[0] -const canEditOneList = (permissions) => - permissions && - permissions.includes('company.change_company') && - permissions.includes('company.change_one_list_core_team_member') && - permissions.includes( - 'company.change_one_list_tier_and_global_account_manager' - ) - -const CompanyBusinessDetails = ({ - subsidiariesCount, - dnbRelatedCompaniesCount, - globalUltimate, - isDnbPending, - companyId, - flashMessages, - csrfToken, - permissions, -}) => ( - - {(company) => ( - - -
- This page shows information about this business and how it is - related to other businesses. -
-
- Changes made to this information can be found on the{' '} - - Edit history page - - . -
- {lastUpdated(company) && ( -
Last updated on: {format(lastUpdated(company))}
- )} - - {() => - isDnbPending && ( - <> -
- - Changes to these business details are currently being - reviewed. - - - ) - } -
- {isDnbCompany(company.dunsNumber) && ( -
-

- Most business details have been verified by trusted - third-parties to keep them updated automatically. Business - description, region and sector are not updated by third parties. -

-

- Think some details are wrong? ‘Edit’ and - ‘Submit’ new details for review. -

-
- )} - - - - - - - {canEditOneList(permissions) && ( - - )} - ({ - values, - companyId, - csrfToken, - })} - archiveReasons={[ - { - label: COMPANY_DISSOLVED_OPTION, - value: COMPANY_DISSOLVED_OPTION, - }, - ]} - /> -
-
- )} -
-) - -CompanyBusinessDetails.propTypes = { - subsidiariesCount: PropTypes.number, - dnbRelatedCompaniesCount: PropTypes.number, - globalUltimate: PropTypes.object, - companyId: PropTypes.string.isRequired, - flashMessages: PropTypes.object, - csrfToken: PropTypes.string, - permissions: PropTypes.array, -} - -CompanyBusinessDetails.defaultProps = { - subsidiariesCount: 0, - dnbRelatedCompaniesCount: 0, -} - -export default connect(state2props)(CompanyBusinessDetails) diff --git a/src/apps/companies/apps/business-details/client/reducer.js b/src/apps/companies/apps/business-details/client/reducer.js deleted file mode 100644 index 8c3efb4425a..00000000000 --- a/src/apps/companies/apps/business-details/client/reducer.js +++ /dev/null @@ -1,11 +0,0 @@ -import { DNB__CHECK_PENDING_REQUEST } from '../../../../../client/actions' - -export default ( - state = { - isDnbPending: false, - }, - { type, result } -) => - type === DNB__CHECK_PENDING_REQUEST - ? { ...state, isDnbPending: result } - : state diff --git a/src/apps/companies/apps/business-details/controllers.js b/src/apps/companies/apps/business-details/controllers.js deleted file mode 100644 index 9238721e8ef..00000000000 --- a/src/apps/companies/apps/business-details/controllers.js +++ /dev/null @@ -1,29 +0,0 @@ -/* eslint-disable camelcase */ - -const { pick } = require('lodash') - -const { getCompanySubsidiaries } = require('../../repos') - -async function renderBusinessDetails(req, res) { - const { company, globalUltimate, dnbRelatedCompaniesCount } = res.locals - const permissions = res.locals.user.permissions - const subsidiaries = await getCompanySubsidiaries(req, company.id) - - res.render('companies/apps/business-details/views/client-container', { - props: { - subsidiariesCount: subsidiaries.count, - dnbRelatedCompaniesCount, - globalUltimate: globalUltimate - ? pick(globalUltimate, ['name', 'url']) - : undefined, - permissions, - localNavItems: res.locals.localNavItems, - flashMessages: res.locals.getMessages(), - companyId: company.id, - }, - }) -} - -module.exports = { - renderBusinessDetails, -} diff --git a/src/apps/companies/apps/business-details/router.js b/src/apps/companies/apps/business-details/router.js deleted file mode 100644 index b564c1cfad5..00000000000 --- a/src/apps/companies/apps/business-details/router.js +++ /dev/null @@ -1,8 +0,0 @@ -const router = require('express').Router() - -const urls = require('../../../../lib/urls') -const { renderBusinessDetails } = require('./controllers') - -router.get(urls.companies.businessDetails.route, renderBusinessDetails) - -module.exports = router diff --git a/src/apps/companies/apps/business-details/views/client-container.njk b/src/apps/companies/apps/business-details/views/client-container.njk deleted file mode 100644 index 3a373a42a5f..00000000000 --- a/src/apps/companies/apps/business-details/views/client-container.njk +++ /dev/null @@ -1,9 +0,0 @@ -{% extends "_layouts/template-no-local-header.njk" %} - -{% block body %} - {% component 'react-slot', { - id: 'company-business-details', - props: props - } %} - -{% endblock %} diff --git a/src/apps/companies/constants.js b/src/apps/companies/constants.js index 0d555a249ea..ed1f0709a91 100644 --- a/src/apps/companies/constants.js +++ b/src/apps/companies/constants.js @@ -81,7 +81,6 @@ const QUERY_FIELDS = Object.values(QUERY_FIELDS_MAP) const NONE_TEXT = 'None' const NOT_SET_TEXT = 'Not set' const NOT_AVAILABLE_TEXT = 'Not available' -const COMPANY_DISSOLVED_OPTION = 'Company is dissolved' module.exports = { GLOBAL_NAV_ITEM, @@ -92,5 +91,4 @@ module.exports = { NONE_TEXT, NOT_SET_TEXT, NOT_AVAILABLE_TEXT, - COMPANY_DISSOLVED_OPTION, } diff --git a/src/apps/companies/labels.js b/src/apps/companies/labels.js index 7373ee32027..1ae0e12a5b9 100644 --- a/src/apps/companies/labels.js +++ b/src/apps/companies/labels.js @@ -103,25 +103,6 @@ const exportPotentialLabels = { }, } -const exportSegmentsLabels = { - hep: 'High export potential', - 'non-hep': 'Not high export potential', -} -const exportSubSegmentsLabels = { - sustain_nurture_and_grow: 'Sustain: nurture & grow', - sustain_develop_export_capability: 'Sustain: develop export capability', - sustain_communicate_benefits: 'Sustain: communicate benefits', - sustain_increase_competitiveness: 'Sustain: increase competitiveness', - reassure_nurture_and_grow: 'Reassure: nurture & grow', - reassure_develop_export_capability: 'Reassure: develop export capability', - reassure_leave_be: 'Reassure: leave be', - reassure_change_the_game: 'Reassure: change the game', - promote_develop_export_capability: 'Promote: develop export capability', - promote_communicate_benefits: 'Promote: communicate benefits', - promote_change_the_game: 'Promote: change the game', - challenge: 'Challenge', -} - module.exports = { companyDetailsLabels, companyTypeOptions, @@ -132,6 +113,4 @@ module.exports = { aboutLabels, businessHierarchyLabels, exportPotentialLabels, - exportSegmentsLabels, - exportSubSegmentsLabels, } diff --git a/src/apps/companies/middleware/hierarchies.js b/src/apps/companies/middleware/hierarchies.js index 0de9e9e7e6d..564719f836e 100644 --- a/src/apps/companies/middleware/hierarchies.js +++ b/src/apps/companies/middleware/hierarchies.js @@ -6,45 +6,6 @@ function transformErrorMessage(error) { return get(error, 'global_headquarters', ['There has been an error'])[0] } -async function setGlobalHQ(req, res, next) { - const companyId = req.params.companyId - const globalHqId = req.params.globalHqId - const body = { global_headquarters: globalHqId } - const detailsUrl = `/companies/${companyId}/business-details` - - try { - await updateCompany(req, companyId, body) - - req.flash('success', 'You’ve linked the Global Headquarters') - return res.redirect(detailsUrl) - } catch (error) { - if (error.statusCode === 400) { - req.flash('error', transformErrorMessage(error.error)) - return res.redirect(detailsUrl) - } - next(error) - } -} - -async function removeGlobalHQ(req, res, next) { - const companyId = req.params.companyId - const body = { global_headquarters: null } - const detailsUrl = `/companies/${companyId}/business-details` - - try { - await updateCompany(req, companyId, body) - - req.flash('success', 'You’ve removed the link to Global Headquarters') - return res.redirect(detailsUrl) - } catch (error) { - if (error.statusCode === 400) { - req.flash('error', transformErrorMessage(error.error)) - return res.redirect(detailsUrl) - } - next(error) - } -} - async function addSubsidiary(req, res, next) { const { companyId, subsidiaryCompanyId } = req.params const body = { global_headquarters: companyId } @@ -64,7 +25,5 @@ async function addSubsidiary(req, res, next) { } module.exports = { - setGlobalHQ, - removeGlobalHQ, addSubsidiary, } diff --git a/src/apps/companies/router.js b/src/apps/companies/router.js index 65462afaf44..008218b0f59 100644 --- a/src/apps/companies/router.js +++ b/src/apps/companies/router.js @@ -12,8 +12,6 @@ const { const { renderDetails } = require('./controllers/details') -const { renderBusinessDetails } = require('./apps/business-details/controllers') - const { renderOrders } = require('./controllers/orders') const { archiveCompany, unarchiveCompany } = require('./controllers/archive') const { renderContacts } = require('./controllers/contacts') @@ -31,11 +29,7 @@ const { addCompanyOrRemoveFromList, } = require('./middleware/params') const { setInteractionsDetails } = require('./middleware/interactions') -const { - setGlobalHQ, - removeGlobalHQ, - addSubsidiary, -} = require('./middleware/hierarchies') +const { addSubsidiary } = require('./middleware/hierarchies') const lastInteractionDate = require('./middleware/last-interaction-date') const formatPostcodes = require('./middleware/format-postcodes') @@ -43,7 +37,6 @@ const addCompanyFormRouter = require('./apps/add-company/router') const editCompanyFormRouter = require('./apps/edit-company/router') const activityFeedRouter = require('./apps/activity-feed/router') const dnbHierarchyRouter = require('./apps/dnb-hierarchy/router') -const businessDetailsRouter = require('./apps/business-details/router') const editHistoryRouter = require('./apps/edit-history/router') const matchCompanyRouter = require('./apps/match-company/router') const exportsRouter = require('./apps/exports/router') @@ -88,11 +81,6 @@ router.use( router.get(urls.companies.detail.route, redirectToFirstNavItem) router.get(urls.companies.details.route, renderDetails) -router.get(urls.companies.businessDetails.route, renderBusinessDetails) - -router.get(urls.companies.hierarchies.ghq.add.route, setGlobalHQ) -router.get(urls.companies.hierarchies.ghq.remove.route, removeGlobalHQ) - router.get(urls.companies.hierarchies.subsidiaries.add.route, addSubsidiary) router.get(urls.companies.contacts.route, setReturnUrl, renderContacts) @@ -116,7 +104,6 @@ router.get(urls.companies.subsidiaries.index.route, renderSubsidiaries) router.use(activityFeedRouter) router.use(dnbHierarchyRouter) -router.use(businessDetailsRouter) router.use(matchCompanyRouter) router.use(exportsRouter) router.use(referralsRouter) diff --git a/src/apps/routers.js b/src/apps/routers.js index 335bf4caf52..dfc8d334b6b 100644 --- a/src/apps/routers.js +++ b/src/apps/routers.js @@ -110,6 +110,9 @@ const reactRoutes = [ '/tasks/create', '/tasks/:taskId/edit', '/companies/:companyId/overview', + '/companies/:companyId/business-details', + '/companies/:companyId/hierarchies/ghq/:globalHqId/add', + '/companies/:companyId/hierarchies/ghq/remove', ] reactRoutes.forEach((path) => { diff --git a/src/client/actions.js b/src/client/actions.js index 9922e567bd9..49f7baa4696 100644 --- a/src/client/actions.js +++ b/src/client/actions.js @@ -320,3 +320,6 @@ export const PAGINATED_RESOURCE__ON_SUCCESS = 'PAGINATED_RESOURCE__ON_SUCCESS' export const MY_TASKS_CHECK_COMPLETE = 'MY_TASKS_CHECK_COMPLETE' export const MY_TASKS_LOADED = 'MY_TASKS_LOADED' + +export const COMPANIES__GLOBAL_ULTIMATE_LOADED = + 'COMPANIES__GLOBAL_ULTIMATE_LOADED' diff --git a/src/client/components/CompanyLocalHeader/CompanyLocalHeaderNew.jsx b/src/client/components/CompanyLocalHeader/CompanyLocalHeaderNew.jsx deleted file mode 100644 index 2103926cfdb..00000000000 --- a/src/client/components/CompanyLocalHeader/CompanyLocalHeaderNew.jsx +++ /dev/null @@ -1,253 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import styled from 'styled-components' -import Main from '@govuk-react/main' -import GridCol from '@govuk-react/grid-col' -import GridRow from '@govuk-react/grid-row' -import Button from '@govuk-react/button' -import Details from '@govuk-react/details' -import { SPACING, FONT_SIZE, BREAKPOINTS } from '@govuk-react/constants' -import { Link } from 'govuk-react' -import { H4 } from '@govuk-react/heading' - -import { GREY_3, TEXT_COLOUR } from '../../utils/colours' -import LocalHeaderCompanyLists from './LocalHeaderCompanyLists' -import LocalHeaderCompanyRefer from './LocalHeaderCompanyRefer' -import Badge from '../Badge' -import StatusMessage from '../StatusMessage' -import { addressToStringResource } from '../../utils/addresses' -import urls from '../../../lib/urls' -import ArchivePanel from '../ArchivePanel' -import { isItaTierDAccount } from '../../modules/Companies/utils' -import { RelatedCompaniesCountResource } from '../Resource' - -const LocalHeaderTradingNames = styled(H4)` - font-weight: normal; -` - -const StyledAddress = styled('p')` - margin-top: ${SPACING.SCALE_2}; - margin-bottom: ${SPACING.SCALE_2}; -` - -const BadgeText = styled('span')` - font-weight: 600; - font-size: ${FONT_SIZE.SIZE_16}; -` - -const TypeWrapper = styled('div')` - @media (min-width: ${BREAKPOINTS.TABLET}) { - display: table-row; - } -` -const StyledButtonContainer = styled('div')` - width: 100%; - display: inline-block; -` - -const StyledList = styled('div')` - padding-bottom: 10px; - display: inline-flex; -` - -const StyledButtonLink = styled.a({ - marginBottom: 10, - float: 'right', -}) - -const BadgeWrapper = styled('div')` - @media (min-width: ${BREAKPOINTS.TABLET}) { - display: table-cell; - } -` - -const StyledDetails = styled(Details)` - @media (min-width: ${BREAKPOINTS.TABLET}) { - margin: 0 0 0 ${SPACING.SCALE_3}; - } - span, - div { - font-size: ${FONT_SIZE.SIZE_16}; - } -` - -const StyledDescription = styled('div')` - padding: ${SPACING.SCALE_2}; - background-color: ${GREY_3}; - - * + & { - margin-top: ${SPACING.SCALE_3}; - } - - p { - margin-top: 0; - margin-bottom: 0; - - &:not(:last-child) { - margin-bottom: ${SPACING.SCALE_2}; - } - } - - & + * { - margin-top: ${SPACING.SCALE_3}; - } -` - -const StyledMain = styled(Main)` - padding-top: ${SPACING.SCALE_1}; - div { - font-size: ${FONT_SIZE.SIZE_20}; - } -` -const StyledRelatedCompaniesWrapper = styled('div')` - padding-bottom: 20px; -` - -const isUltimate = (company) => !!company.isGlobalUltimate -const isGlobalHQ = (company) => - company.headquarterType && company.headquarterType.name === 'ghq' - -const hasAllocatedLeadIta = (company) => - company.oneListGroupGlobalAccountManager != null - -const hasManagedAccountDetails = (company) => - company.oneListGroupTier && hasAllocatedLeadIta(company) - -const CompanyLocalHeaderNew = ({ company, returnUrl, csrfToken }) => - company && ( - <> - - - {company?.tradingNames?.length > 0 && ( - - Trading as: {company.tradingNames.join(', ')} - - )} - - - {addressToStringResource(company.address)} - - {company.dunsNumber && ( - - {({ relatedCompaniesCount }) => - relatedCompaniesCount > 0 && ( - - - {`View company tree: ${ - relatedCompaniesCount + 1 - } companies`} - - - ) - } - - )} - - - - - - - - - - - - - {(isUltimate(company) || isGlobalHQ(company)) && ( - - - - - {isUltimate(company) ? 'Ultimate HQ' : 'Global HQ'} - - - - {isUltimate(company) && ( - - This HQ is in control of all related company records for{' '} - {company.name}. - - )} - - )} - {hasManagedAccountDetails(company) && ( - - {hasManagedAccountDetails(company) && ( - <> -

- This is an account managed company (One List{' '} - {company.oneListGroupTier.name}) -

-

- {isItaTierDAccount(company.oneListGroupTier) - ? 'Lead ITA' - : 'Global Account Manager'} - : {company.oneListGroupGlobalAccountManager.name}{' '} - - {isItaTierDAccount(company.oneListGroupTier) - ? 'View Lead adviser' - : 'View core team'} - -

- - )} -
- )} - - {company.archived && ( - - )} - - {company.pendingDnbInvestigation && ( - - - This company record is based on information that has not yet been - validated. This information is currently being checked by the Data - Hub support team. - - - )} - - ) - -CompanyLocalHeaderNew.propTypes = { - company: PropTypes.object.isRequired, - returnUrl: PropTypes.string, -} - -CompanyLocalHeaderNew.defaultProps = { - returnUrl: null, -} - -export default CompanyLocalHeaderNew diff --git a/src/client/components/Layout/CompanyLayoutNew.jsx b/src/client/components/Layout/CompanyLayoutNew.jsx index b42ecf84b95..5cea77cd3ea 100644 --- a/src/client/components/Layout/CompanyLayoutNew.jsx +++ b/src/client/components/Layout/CompanyLayoutNew.jsx @@ -3,39 +3,36 @@ import PropTypes from 'prop-types' import GridCol from '@govuk-react/grid-col' import GridRow from '@govuk-react/grid-row' -import { CompanyTabbedLocalNavigation, DefaultLayout } from '..' +import { CompanyTabbedLocalNavigation, Main } from '..' import CompanyInvestmentSubNavigation from '../CompanyTabbedLocalNavigation/CompanyInvestmentTab' -import { buildCompanyBreadcrumbs } from '../../modules/Companies/utils' -import CompanyLocalHeaderNew from '../CompanyLocalHeader/CompanyLocalHeaderNew' +import CompanyLocalHeader from '../CompanyLocalHeader' const CompanyLayoutNew = ({ company, breadcrumbs, children, returnUrl, - pageTitle, + flashMessages, isInvestment = false, isLCP = false, }) => ( - - ) - } - > - - {isInvestment && ( - - )} - - {children} - - + <> + +
+ + {isInvestment && ( + + )} + + {children} + +
+ ) CompanyLayoutNew.propTypes = { diff --git a/src/client/components/Layout/DefaultLayoutBase.jsx b/src/client/components/Layout/DefaultLayoutBase.jsx new file mode 100644 index 00000000000..040a214015c --- /dev/null +++ b/src/client/components/Layout/DefaultLayoutBase.jsx @@ -0,0 +1,51 @@ +import React, { useEffect, useState } from 'react' +import { createGlobalStyle } from 'styled-components' +import PropTypes from 'prop-types' +import GridCol from '@govuk-react/grid-col' +import GridRow from '@govuk-react/grid-row' + +import Footer from '../Footer' +import DataHubHeader from '../DataHubHeader' + +const GlobalStyles = createGlobalStyle` + *, *:before, *:after { + box-sizing: initial; + } +` + +/** + * This is a reduced version of DefaultLayout, similar to the _layout + * template used by the old Nunjucks pages. + */ +const DefaultLayoutBase = ({ pageTitle, children }) => { + const [showVerticalNav, setShowVerticalNav] = useState(false) + useEffect(() => { + document.title = `${pageTitle} - DBT Data Hub` + }, [pageTitle]) + return ( + <> + + + + {children} + +