diff --git a/src/back-end/lib/db/affiliation.ts b/src/back-end/lib/db/affiliation.ts index 8702946d3..680aac57b 100644 --- a/src/back-end/lib/db/affiliation.ts +++ b/src/back-end/lib/db/affiliation.ts @@ -47,11 +47,12 @@ export interface RawHistoryRecord async function rawAffiliationToAffiliation( connection: Connection, - params: RawAffiliation + params: RawAffiliation, + allowInactive = false ): Promise { const { user: userId, organization: orgId } = params; const organization = getValidValue( - await readOneOrganization(connection, orgId, false), + await readOneOrganization(connection, orgId, allowInactive), null ); const user = getValidValue(await readOneUser(connection, userId), null); @@ -136,8 +137,8 @@ export const readOneAffiliation = tryDb<[Id, Id], Affiliation | null>( ); export const readOneAffiliationById = tryDb<[Id, boolean?], Affiliation | null>( - async (connection, id, activeOnly = true) => { - const result = await connection("affiliations") + async (connection, id, allowInactive = false) => { + let query = connection("affiliations") .join( "organizations", "affiliations.organization", @@ -146,16 +147,21 @@ export const readOneAffiliationById = tryDb<[Id, boolean?], Affiliation | null>( ) .select("affiliations.*") .where({ "affiliations.id": id }) - .andWhereNot({ - ...(activeOnly - ? { "affiliations.membershipStatus": MembershipStatus.Inactive } - : {}), - "organizations.active": false - }) .first(); + if (!allowInactive) { + query = query.andWhereNot({ + "affiliations.membershipStatus": MembershipStatus.Inactive, + "organizations.active": false + }); + } + + const result = await query; + return valid( - result ? await rawAffiliationToAffiliation(connection, result) : null + result + ? await rawAffiliationToAffiliation(connection, result, allowInactive) + : null ); } ); diff --git a/src/back-end/lib/db/counter.ts b/src/back-end/lib/db/counter.ts index f223f86a3..6e98a4f67 100644 --- a/src/back-end/lib/db/counter.ts +++ b/src/back-end/lib/db/counter.ts @@ -5,14 +5,16 @@ import { Counter } from "shared/lib/resources/counter"; export const incrementCounters = tryDb<[string[]], Record>( async (connection, names) => { // Update existing counters - const existingCounters: string[] = await connection("viewCounters") + const existingCounters: { name: string }[] = await connection( + "viewCounters" + ) .whereIn("name", names) .increment("count") .update({}, "name"); // Create new counters where applicable for (const name of names) { - if (!existingCounters.includes(name)) { + if (!existingCounters.some(({ name: eName }) => eName === name)) { await connection("viewCounters").insert({ name, count: 1 diff --git a/src/back-end/lib/db/organization.ts b/src/back-end/lib/db/organization.ts index 6cc7d98b7..963e2c321 100644 --- a/src/back-end/lib/db/organization.ts +++ b/src/back-end/lib/db/organization.ts @@ -171,7 +171,7 @@ async function rawHistoryRecordToHistoryRecord( const { affiliation: affilationId, event: type, ...restOfRaw } = value; const affiliation = getValidValue( - await readOneAffiliationById(connection, affilationId, false), + await readOneAffiliationById(connection, affilationId, true), null ); @@ -365,15 +365,14 @@ export const readOneOrganization = tryDb< query = query.andWhere({ "organizations.active": true }); } - const resultWithViewerIsOrgAdmin = await query.first< - RawOrganization & { viewerIsOrgAdmin: boolean } + const result = await query.first< + RawOrganization & { viewerIsOrgAdmin?: boolean } >(); - const { viewerIsOrgAdmin, ...result } = resultWithViewerIsOrgAdmin; if (result) { if ( !session || (isVendor(session) && - !(result.owner === session.user?.id || viewerIsOrgAdmin)) + !(result.owner === session.user?.id || result.viewerIsOrgAdmin)) ) { delete result.owner; delete result.numTeamMembers; @@ -412,6 +411,7 @@ export const readOneOrganization = tryDb< ) ) ); + delete result.viewerIsOrgAdmin; } } return valid( diff --git a/src/back-end/lib/db/proposal/code-with-us.ts b/src/back-end/lib/db/proposal/code-with-us.ts index decac62cf..7aad98d1c 100644 --- a/src/back-end/lib/db/proposal/code-with-us.ts +++ b/src/back-end/lib/db/proposal/code-with-us.ts @@ -180,7 +180,7 @@ async function rawCWUProposalSlimToCWUProposalSlim( : null; const proponentOrganization = proponentOrganizationId ? getValidValue( - await readOneOrganization(connection, proponentOrganizationId), + await readOneOrganization(connection, proponentOrganizationId, true), undefined ) : null; diff --git a/src/back-end/lib/resources/opportunity/team-with-us.ts b/src/back-end/lib/resources/opportunity/team-with-us.ts index 5fdb3ef40..5b02a3629 100644 --- a/src/back-end/lib/resources/opportunity/team-with-us.ts +++ b/src/back-end/lib/resources/opportunity/team-with-us.ts @@ -1185,7 +1185,12 @@ const delete_: crud.Delete< if (isInvalid(validatedTWUOpportunity)) { return invalid({ notFound: ["Opportunity not found."] }); } - if (validatedTWUOpportunity.value.status !== TWUOpportunityStatus.Draft) { + if ( + ![ + TWUOpportunityStatus.Draft, + TWUOpportunityStatus.UnderReview + ].includes(validatedTWUOpportunity.value.status) + ) { return invalid({ permissions: [permissions.ERROR_MESSAGE] }); } return valid(validatedTWUOpportunity.value.id); diff --git a/src/front-end/sass/index.scss b/src/front-end/sass/index.scss index c48152a96..3efda61a2 100644 --- a/src/front-end/sass/index.scss +++ b/src/front-end/sass/index.scss @@ -964,12 +964,6 @@ nav.navbar .nav-link:hover { } } -.twu-banner { - background-color: $c-banner-bg; - padding: 0.75rem 0 0.75rem; - z-index: 1001; // Above nav, below modals -} - .li-paren { counter-reset: list; & > li { diff --git a/src/front-end/typescript/config.ts b/src/front-end/typescript/config.ts index 8c9710c89..0296a26b7 100644 --- a/src/front-end/typescript/config.ts +++ b/src/front-end/typescript/config.ts @@ -65,5 +65,3 @@ export const CWU_PAYMENT_OPTIONS_URL = export const TWU_BC_BID_URL = "https://bcbid.gov.bc.ca/page.aspx/en/bpm/process_manage_extranet/176305"; - -export const TWU_BANNER_ACKNOWLEDGED = "twu-banner-acknowledged"; diff --git a/src/front-end/typescript/lib/app/init.ts b/src/front-end/typescript/lib/app/init.ts index b91fa361c..d9a081abe 100644 --- a/src/front-end/typescript/lib/app/init.ts +++ b/src/front-end/typescript/lib/app/init.ts @@ -1,4 +1,3 @@ -import { TWU_BANNER_ACKNOWLEDGED } from "front-end/config"; import { State, Msg } from "front-end/lib/app/types"; import * as Nav from "front-end/lib/app/view/nav"; import * as AcceptNewTerms from "front-end/lib/components/accept-new-app-terms"; @@ -16,7 +15,6 @@ const init: component.base.Init = () => { const [navState, navCmds] = Nav.init(null); return [ { - showTWUBanner: false, ready: false, incomingRoute: null, toasts: [], @@ -35,10 +33,7 @@ const init: component.base.Init = () => { acceptNewTermsCmds, (msg) => adt("acceptNewTerms", msg) as Msg ), - ...component.cmd.mapMany(navCmds, (msg) => adt("nav", msg) as Msg), - component.cmd.localStorage.getItem(TWU_BANNER_ACKNOWLEDGED, (msg) => - adt("setShowTWUBanner", !msg) - ) + ...component.cmd.mapMany(navCmds, (msg) => adt("nav", msg) as Msg) ] ]; }; diff --git a/src/front-end/typescript/lib/app/types.ts b/src/front-end/typescript/lib/app/types.ts index 706daa7aa..e84708632 100644 --- a/src/front-end/typescript/lib/app/types.ts +++ b/src/front-end/typescript/lib/app/types.ts @@ -146,7 +146,6 @@ export type ModalId = "acceptNewTerms"; export interface State { //App Internal State ready: boolean; - showTWUBanner: boolean; incomingRoute: router.IncomingRoute | null; activeRoute: Route; //Toasts @@ -229,7 +228,6 @@ export type InnerMsg = | ADT<"submitAcceptNewTerms"> | ADT<"onAcceptNewTermsResponse", AcceptNewTerms.AcceptNewTermsResponse> | ADT<"nav", Nav.Msg> - | ADT<"setShowTWUBanner", boolean> | ADT<"pageLanding", PageLanding.Msg> | ADT<"pageDashboard", PageDashboard.Msg> | ADT<"pageOpportunities", PageOpportunities.Msg> diff --git a/src/front-end/typescript/lib/app/update.ts b/src/front-end/typescript/lib/app/update.ts index 837685b5f..346c2e94a 100644 --- a/src/front-end/typescript/lib/app/update.ts +++ b/src/front-end/typescript/lib/app/update.ts @@ -1,7 +1,4 @@ -import { - TOAST_AUTO_DISMISS_DURATION, - TWU_BANNER_ACKNOWLEDGED -} from "front-end/config"; +import { TOAST_AUTO_DISMISS_DURATION } from "front-end/config"; import { makeStartLoading, makeStopLoading } from "front-end/lib"; import router from "front-end/lib/app/router"; import { @@ -915,20 +912,6 @@ const update: component.base.Update = ({ state, msg }) => { mapChildMsg: adtCurried>("nav") }); - case "setShowTWUBanner": - return [ - state.set("showTWUBanner", msg.value), - !msg.value - ? [ - component.cmd.localStorage.setItem( - TWU_BANNER_ACKNOWLEDGED, - TWU_BANNER_ACKNOWLEDGED, - adt("noop") as Msg - ) - ] - : [] - ]; - case "pageOrgEdit": return component.app.updatePage({ ...defaultPageUpdateParams, diff --git a/src/front-end/typescript/lib/app/view/index.tsx b/src/front-end/typescript/lib/app/view/index.tsx index 13f99f834..d414ab509 100644 --- a/src/front-end/typescript/lib/app/view/index.tsx +++ b/src/front-end/typescript/lib/app/view/index.tsx @@ -88,7 +88,6 @@ import { SHOW_TEST_INDICATOR } from "shared/config"; import { hasAcceptedTermsOrIsAnonymous } from "shared/lib/resources/session"; import { UserType } from "shared/lib/resources/user"; import { ADT, adt, adtCurried } from "shared/lib/types"; -import TWUBannner from "front-end/lib/app/view/twu-banner"; function makeViewPageProps( props: component_.base.ComponentViewProps, @@ -890,10 +889,6 @@ const view: component_.base.ComponentView = (props) => { navProps.contextualActions ? "contextual-actions-visible" : "" } app d-flex flex-column`} style={{ minHeight: "100vh" }}> - dispatch(adt("setShowTWUBanner", false))} - /> {viewPageProps.component.simpleNav ? null :