From 979defcb4cc22af7a36893e88b675c58d60b2fee Mon Sep 17 00:00:00 2001 From: Brad Date: Tue, 26 Aug 2025 10:24:31 -0500 Subject: [PATCH 1/6] Upgrade Angular dependencies to version 20 and update build configurations. Refactor component templates for improved formatting and structure. Adjust TypeScript configuration for module resolution and include additional schematics for Angular components. --- clients/html/angular.json | 6 +++--- clients/html/package.json | 2 +- clients/html/src/karma.conf.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clients/html/angular.json b/clients/html/angular.json index e576fd9c..76ec58c3 100755 --- a/clients/html/angular.json +++ b/clients/html/angular.json @@ -135,7 +135,7 @@ } }, "serve": { - "builder": "@angular-devkit/build-angular:dev-server", + "builder": "@angular/build:dev-server", "options": { "browserTarget": "quoting-tool:build" }, @@ -155,13 +155,13 @@ } }, "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", + "builder": "@angular/build:extract-i18n", "options": { "browserTarget": "quoting-tool:build" } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular/build:karma", "options": { "main": "src/test.ts", "polyfills": "src/polyfills.ts", diff --git a/clients/html/package.json b/clients/html/package.json index 6c794bc4..b3a8dd92 100755 --- a/clients/html/package.json +++ b/clients/html/package.json @@ -84,4 +84,4 @@ "tslint-config-prettier": "^1.18.0", "typescript": "~3.5.0" } -} +} \ No newline at end of file diff --git a/clients/html/src/karma.conf.js b/clients/html/src/karma.conf.js index cd06d5bc..a08eeb01 100755 --- a/clients/html/src/karma.conf.js +++ b/clients/html/src/karma.conf.js @@ -10,7 +10,7 @@ module.exports = function(config) { require('karma-chrome-launcher'), require('karma-jasmine-html-reporter'), require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma'), + ], client: { clearContext: false, // leave Jasmine Spec Runner output visible in browser From 1b68b09a9b0f38873ff82bfa0a219ed300876e30 Mon Sep 17 00:00:00 2001 From: Brad Date: Tue, 26 Aug 2025 10:27:29 -0500 Subject: [PATCH 2/6] Update Angular dependencies in package.json and package-lock.json to versions 19.0.1 for @ng-bootstrap/ng-bootstrap and 14.0.0 for @sweetalert2/ngx-sweetalert2, ensuring compatibility with Angular 20. --- clients/html/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/html/package.json b/clients/html/package.json index b3a8dd92..6c794bc4 100755 --- a/clients/html/package.json +++ b/clients/html/package.json @@ -84,4 +84,4 @@ "tslint-config-prettier": "^1.18.0", "typescript": "~3.5.0" } -} \ No newline at end of file +} From 69f517f9b42b632250f75a1d9ab9d42e7eba1d6e Mon Sep 17 00:00:00 2001 From: Brad Bodine Date: Wed, 27 Aug 2025 09:13:52 -0500 Subject: [PATCH 3/6] Update Node and npm versions to 24.6.0 and 11.5.2 respectively in .nvmrc, package.json, and README.md. Pin dependencies to exact versions in package.json and package-lock.json for improved stability and reproducibility. Adjust mock server start dates and environment API URL for local development. --- clients/html/.node-version | 1 + clients/html/.npmrc | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 clients/html/.node-version create mode 100644 clients/html/.npmrc diff --git a/clients/html/.node-version b/clients/html/.node-version new file mode 100644 index 00000000..b5e8f5c1 --- /dev/null +++ b/clients/html/.node-version @@ -0,0 +1 @@ +24.6.0 diff --git a/clients/html/.npmrc b/clients/html/.npmrc new file mode 100644 index 00000000..10570277 --- /dev/null +++ b/clients/html/.npmrc @@ -0,0 +1,4 @@ +engine-strict=true +save-exact=true +update-notifier=false +fund=false From fc14f0a9ead3027480477d2cca0737ee96532251 Mon Sep 17 00:00:00 2001 From: Brad Bodine Date: Wed, 27 Aug 2025 12:00:27 -0500 Subject: [PATCH 4/6] Refactor Angular configuration and components to support dynamic branding. Update angular.json to include new build configurations for different brands, adjust asset paths, and streamline polyfills. Modify header and employer details components to utilize BRAND_CONFIG for logo and template paths, enhancing flexibility. Clean up custom.scss by removing unnecessary max-width setting for larger breakpoints. --- clients/html/FILE_REPLACEMENTS.md | 105 ++++++++++++++++++ clients/html/angular.json | 4 + clients/html/src/app/brand.config.dc.ts | 9 ++ clients/html/src/app/brand.config.ma.ts | 9 ++ clients/html/src/app/brand.config.me.ts | 9 ++ clients/html/src/app/brand.config.ts | 9 ++ clients/html/src/app/brand.types.ts | 6 + clients/html/src/assets/images/favicon_me.png | Bin 0 -> 1214 bytes .../scss/branding/ma/client-styles.scss | 15 +++ 9 files changed, 166 insertions(+) create mode 100644 clients/html/FILE_REPLACEMENTS.md create mode 100644 clients/html/src/app/brand.config.dc.ts create mode 100644 clients/html/src/app/brand.config.ma.ts create mode 100644 clients/html/src/app/brand.config.me.ts create mode 100644 clients/html/src/app/brand.config.ts create mode 100644 clients/html/src/app/brand.types.ts create mode 100644 clients/html/src/assets/images/favicon_me.png create mode 100644 clients/html/src/assets/scss/branding/ma/client-styles.scss diff --git a/clients/html/FILE_REPLACEMENTS.md b/clients/html/FILE_REPLACEMENTS.md new file mode 100644 index 00000000..589aa52f --- /dev/null +++ b/clients/html/FILE_REPLACEMENTS.md @@ -0,0 +1,105 @@ +### File replacements by Angular build configuration + +This note summarizes current file replacements defined in `angular.json` and the simplified approach using a centralized brand config. + +#### Current simplified replacements + +- **me** + - `src/app/brand.config.ts` → `src/app/brand.config.me.ts` +- **ma** (default) + - `src/app/brand.config.ts` → `src/app/brand.config.ma.ts` +- **dc** + - `src/app/brand.config.ts` → `src/app/brand.config.dc.ts` +- **me-production** + - `src/environments/environment.ts` → `src/environments/environment.prod.ts` + - `src/app/brand.config.ts` → `src/app/brand.config.me.ts` +- **ma-production** + - `src/environments/environment.ts` → `src/environments/environment.prod.ts` + - `src/app/brand.config.ts` → `src/app/brand.config.ma.ts` +- **dc-production** + - `src/environments/environment.ts` → `src/environments/environment.prod.ts` + - `src/app/brand.config.ts` → `src/app/brand.config.dc.ts` + +#### Using configuration flags + +Build commands select replacements via `--configuration`: + +- `ng serve --configuration=me` +- `ng build --configuration=me` +- `ng serve --configuration=dc` +- `ng build --configuration=me-production` +- `ng build --configuration=dc-production` + +#### Brand configuration files + +Each brand has its own config file that exports the same `BRAND_CONFIG` constant: + +**`src/app/brand.config.ts`** (default - MA) + +```typescript +export const BRAND_CONFIG: BrandConfig = { + logoPath: 'assets/images/mhc_logo.svg', + faviconPath: 'assets/images/favicon.png', + rosterTemplatePath: 'assets/roster_upload_template.xlsx', + zipCodeDataPath: 'data/zipCode.json', +}; +``` + +**`src/app/brand.config.me.ts`** (Maine) + +```typescript +export const BRAND_CONFIG: BrandConfig = { + logoPath: 'assets/images/logo_me.svg', + faviconPath: 'assets/images/favicon_me.png', + rosterTemplatePath: 'assets/roster_upload_template_me.xlsx', + zipCodeDataPath: 'data/zipCodeME.json', +}; +``` + +**`src/app/brand.config.dc.ts`** (District of Columbia) + +```typescript +export const BRAND_CONFIG: BrandConfig = { + logoPath: 'assets/images/mhc_logo.svg', // Keep default for now + faviconPath: 'assets/images/favicon.png', // Keep default for now + rosterTemplatePath: 'assets/roster_upload_template.xlsx', // Keep default for now + zipCodeDataPath: 'data/zipCode.json', // Keep default for now +}; +``` + +#### Implementation + +Components now reference `BRAND_CONFIG` instead of hardcoded paths: + +- `HeaderComponent` uses `BRAND_CONFIG.logoPath` +- `EmployerDetailsComponent` exposes `brand = BRAND_CONFIG` +- Template binds roster template link to `brand.rosterTemplatePath` + +#### Benefits of this approach + +- **Single file replacement**: Only swap `brand.config.ts` per brand +- **No code changes needed**: Components automatically use the correct paths +- **Easy maintenance**: Update paths in one place per brand +- **Production builds**: Combine brand config + environment swap +- **Future expansion**: Add new brand-specific assets by updating config files + +#### Example npm scripts + +```json +{ + "scripts": { + "start:me": "ng serve --configuration=me", + "build:me": "ng build --configuration=me", + "build:me:prod": "ng build --configuration=me-production", + "start:dc": "ng serve --configuration=dc", + "build:dc:prod": "ng build --configuration=dc-production" + } +} +``` + +#### Next steps + +1. Add brand-specific assets (logos, favicons, templates, zip code data) +2. Update brand config files with correct paths +3. Test builds with `--configuration` flags +4. Consider adding brand-specific SCSS variables for theming diff --git a/clients/html/angular.json b/clients/html/angular.json index 76ec58c3..fdc01f81 100755 --- a/clients/html/angular.json +++ b/clients/html/angular.json @@ -120,6 +120,10 @@ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" + }, + { + "replace": "src/app/brand.config.ts", + "with": "src/app/brand.config.me.ts" } ], "optimization": true, diff --git a/clients/html/src/app/brand.config.dc.ts b/clients/html/src/app/brand.config.dc.ts new file mode 100644 index 00000000..7278e947 --- /dev/null +++ b/clients/html/src/app/brand.config.dc.ts @@ -0,0 +1,9 @@ +import { BrandConfig } from './brand.types'; + +export const BRAND_CONFIG: BrandConfig = { + // DC (District of Columbia) brand configuration + logoPath: 'assets/images/mhc_logo.svg', // Keep default logo for now + faviconPath: 'assets/images/favicon.png', // Keep default favicon for now + rosterTemplatePath: 'assets/roster_upload_template.xlsx', // Keep default template for now + zipCodeDataPath: 'data/zipCode.json', // Keep default zip codes for now +}; diff --git a/clients/html/src/app/brand.config.ma.ts b/clients/html/src/app/brand.config.ma.ts new file mode 100644 index 00000000..a2f70ed8 --- /dev/null +++ b/clients/html/src/app/brand.config.ma.ts @@ -0,0 +1,9 @@ +import { BrandConfig } from './brand.types'; + +export const BRAND_CONFIG: BrandConfig = { + // MA (Maine) brand configuration - default + logoPath: 'assets/images/mhc_logo.svg', + faviconPath: 'assets/images/favicon.png', + rosterTemplatePath: 'assets/roster_upload_template.xlsx', + zipCodeDataPath: 'data/zipCode.json', +}; diff --git a/clients/html/src/app/brand.config.me.ts b/clients/html/src/app/brand.config.me.ts new file mode 100644 index 00000000..97c68eb5 --- /dev/null +++ b/clients/html/src/app/brand.config.me.ts @@ -0,0 +1,9 @@ +import { BrandConfig } from './brand.types'; + +export const BRAND_CONFIG: BrandConfig = { + // ME (Maine) brand configuration + logoPath: 'assets/images/logo_me.svg', + faviconPath: 'assets/images/favicon_me.png', + rosterTemplatePath: 'assets/roster_upload_template_me.xlsx', + zipCodeDataPath: 'data/zipCodeME.json', +}; diff --git a/clients/html/src/app/brand.config.ts b/clients/html/src/app/brand.config.ts new file mode 100644 index 00000000..a59f07f3 --- /dev/null +++ b/clients/html/src/app/brand.config.ts @@ -0,0 +1,9 @@ +import { BrandConfig } from './brand.types'; + +export const BRAND_CONFIG: BrandConfig = { + // Default brand: MA (Maine) + logoPath: 'assets/images/mhc_logo.svg', + faviconPath: 'assets/images/favicon.png', + rosterTemplatePath: 'assets/roster_upload_template.xlsx', + zipCodeDataPath: 'data/zipCode.json', +}; diff --git a/clients/html/src/app/brand.types.ts b/clients/html/src/app/brand.types.ts new file mode 100644 index 00000000..597918ee --- /dev/null +++ b/clients/html/src/app/brand.types.ts @@ -0,0 +1,6 @@ +export interface BrandConfig { + logoPath: string; + faviconPath: string; + rosterTemplatePath: string; + zipCodeDataPath: string; +} diff --git a/clients/html/src/assets/images/favicon_me.png b/clients/html/src/assets/images/favicon_me.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7fcb32c492908558d1b19b86d04c7dcf89f59a GIT binary patch literal 1214 zcmbW1ODIH97{|Xm9(gPn3kwUb14@0@$jC6e$nrxX5VT8k&jBq9qi z0~zrBP|d3DzXOf?vYu7@h(g{WMbf~Hk%MtA*wOFvoXDN-_$pBMCT3fxT$qp6@m$;0 zpFX6}QjCr_)UvE$$;iJ5;gE6vzqPQVYon185qBTxa4RNu=Yc(8E^t5CQSWK`ahwZr zuNV&kH<$sUKbWKS#YS<6TL9vGBx8OqT*ov&N90$==-~I`mRuT*DwGPxW|W@4_XD1G zt_6Eo0>>lx1mj=|EP@9RY;A@^gX7+!9_Ih9$y9~-tzm_d(Wii7;0NIx>^ZThM>%>u z+1ztOt_*e~bg<{jsvg)lx2AJI3g Date: Wed, 27 Aug 2025 12:37:44 -0500 Subject: [PATCH 5/6] Refactor branding styles by replacing SCSS variables with CSS custom properties for improved theming flexibility. Update client-specific stylesheets for DC, MA, and ME to utilize the new variable structure, ensuring consistent branding across different regions. Clean up variable.scss to import client styles and remove redundant theme color definitions. --- .../scss/branding/ma/client-styles.scss | 77 +++++++++++++++---- .../html/src/assets/scss/client-styles.scss | 45 +++++++++++ 2 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 clients/html/src/assets/scss/client-styles.scss diff --git a/clients/html/src/assets/scss/branding/ma/client-styles.scss b/clients/html/src/assets/scss/branding/ma/client-styles.scss index 296dd64b..204c205e 100644 --- a/clients/html/src/assets/scss/branding/ma/client-styles.scss +++ b/clients/html/src/assets/scss/branding/ma/client-styles.scss @@ -1,15 +1,64 @@ // MA (Maine) Brand Variables - Default -$client-primary: #007bff; -$client-bg-color: #007bff; -$client-bg-color-lighten: lighten($client-bg-color, 5%); - -// Additional brand-specific variables -$brand-primary: $client-primary; -$brand-secondary: #6c757d; -$brand-accent: #28a745; -$brand-text: #212529; -$brand-background: #ffffff; - -// Brand-specific overrides -$logo-width: 126px; -$logo-height: 40px; +// $client-primary: #007bff; +// $client-bg-color: #007bff; +// $client-bg-color-lighten: lighten($client-bg-color, 5%); + +// // Additional brand-specific variables +// $brand-primary: $client-primary; +// $brand-secondary: #6c757d; +// $brand-accent: #28a745; +// $brand-text: #212529; +// $brand-background: #ffffff; + +// // Brand-specific overrides +// $logo-width: 126px; +// $logo-height: 40px; + +/*Theme Colors*/ + +:root { + --white: #ffffff; + --black: #000000; + + --gray: #6c757d; + --gray-light: #f8f9fa; + --gray-dark: #343a40; + --gray-100: #f1f1f1; + --gray-200: #e9ecef; + --gray-300: #dee2e6; + --gray-400: #ced4da; + --gray-500: #adb5bd; + --gray-600: #6c757d; + --gray-700: #495057; + --gray-800: #343a40; + --gray-900: #212529; + + --main-color: #007bff; + --main-color-light: #0056b3; + --secondary-color: #6c757d; + --secondary-color-light: #5a6268; + --destructive-color: #a00723; + --success-color: #28a745; + + --background-color: #ffffff; + --border-color: var(--gray-200); + + --link-color: #0036cb; + + --text-light: var(--white); + --text-dark: #212529; + + --shadow-color: var(--gray-200); + --shadow-black-10: rgba(0, 0, 0, 0.12); + --shadow-black-20: rgba(0, 0, 0, 0.24); +} + +.nav { + --bs-nav-link-color: var(--secondary-color) !important; + --bs-nav-link-hover-color: var(--main-color); +} + +/* MA BRAND SPECIFIC STYLES */ +body { + background-color: var(--background-color) !important; +} diff --git a/clients/html/src/assets/scss/client-styles.scss b/clients/html/src/assets/scss/client-styles.scss new file mode 100644 index 00000000..8190adbf --- /dev/null +++ b/clients/html/src/assets/scss/client-styles.scss @@ -0,0 +1,45 @@ +/* Default Client Styles - Used when no specific brand configuration is specified */ + +/*Theme Colors*/ + +:root { + --white: #ffffff; + --black: #000000; + + --gray: #6c757d; + --gray-light: #f8f9fa; + --gray-dark: #343a40; + --gray-100: #f1f1f1; + --gray-200: #e9ecef; + --gray-300: #dee2e6; + --gray-400: #ced4da; + --gray-500: #adb5bd; + --gray-600: #6c757d; + --gray-700: #495057; + --gray-800: #343a40; + --gray-900: #212529; + + --main-color: #c56724; + --main-color-light: #dc8140; + --secondary-color: #0f5e82; + --secondary-color-light: #005e81; + --destructive-color: #a00723; + --success-color: #008000; + + --background-color: #f2efef; + --border-color: var(--gray-200); + + --link-color: #0036cb; + + --text-light: var(--white); + --text-dark: #3e5569; + + --shadow-color: var(--gray-200); + --shadow-black-10: rgba(0, 0, 0, 0.12); + --shadow-black-20: rgba(0, 0, 0, 0.24); +} + +.nav { + --bs-nav-link-color: var(--secondary-color) !important; + --bs-nav-link-hover-color: var(--main-color); +} From 466bda2fd695328548d0b8d78b489b6d990c4b01 Mon Sep 17 00:00:00 2001 From: Brad Bodine Date: Thu, 28 Aug 2025 09:04:53 -0500 Subject: [PATCH 6/6] Update Dockerfile to point apt sources to the Debian archive due to Buster EOL, and disable Release file validity checks for successful updates and installations. --- .docker/production/Dockerfile.gha | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.docker/production/Dockerfile.gha b/.docker/production/Dockerfile.gha index f71c2a19..fcd8fee8 100644 --- a/.docker/production/Dockerfile.gha +++ b/.docker/production/Dockerfile.gha @@ -15,7 +15,13 @@ ENV BUNDLER_VERSION=$BUNDLER_VERSION # Only install what's needed that isn't in the base image # https://github.com/docker-library/ruby/blob/master/2.7/slim-buster/Dockerfile -RUN apt-get update \ +# Buster is EOL; point apt sources to the Debian archive and disable +# Release file validity checks so updates/installations work. +RUN sed -i \ + -e 's|deb.debian.org/debian|archive.debian.org/debian|g' \ + -e 's|security.debian.org/debian-security|archive.debian.org/debian-security|g' \ + /etc/apt/sources.list \ + && apt-get -o Acquire::Check-Valid-Until=false update \ && apt-get -yq dist-upgrade \ && apt-get install -y \ fontconfig \