Skip to content

Commit 42e974b

Browse files
authored
Release v2025.1.0 - Registration DateTime Change Feature (#127)
- Add registration datetime change functionality - New modal component for selecting alternative time slots - Cloud function to handle backend datetime changes - Prevent changes after check-in - Send updated confirmation email - Admin control via allowChangeRegistration parameter - Add translations for English and Spanish - Apply Prettier formatting across codebase - Update all package versions to 2025.1.0 Co-authored-by: Joel Meaders <joelmeaders@outlook.com>
1 parent f7acbe9 commit 42e974b

File tree

97 files changed

+30399
-23459
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+30399
-23459
lines changed

CHANGELOG.md

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,60 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to a versioning scheme of `year.minor.patch`.
77

8+
## [2025.1.0] - 2025-11-15
9+
10+
### Added
11+
12+
- **Registration DateTime Change**: Users can now change their registration date/time after initial submission
13+
- New modal component for selecting alternative date/time slots
14+
- Prevents changes after check-in to maintain event integrity
15+
- Sends updated confirmation email automatically
16+
- Admin control via `allowChangeRegistration` parameter
17+
- **Core Services**: New `changeRegistrationDateTime` callable function for backend processing
18+
- **App State Management**: Added `allowChangeRegistration$` observable to centralize admin controls
19+
- **Translations**: Added new translation keys for date/time change feature (English & Spanish)
20+
- "CONTINUE", "SUCCESS" in common translations
21+
- "SELECT_DATETIME" in schedule section
22+
- Full set of confirmation change messages
23+
24+
### Changed
25+
26+
- **Code Formatting**: Applied Prettier formatting across entire codebase
27+
- Consistent indentation and spacing in all TypeScript, HTML, and SCSS files
28+
- Updated ESLint configurations for better formatting rules
29+
- **Models**: Added `allowChangeRegistration` to `PublicParameters` admin interface
30+
- **Functions**: Enhanced email template creation for registration confirmations
31+
32+
### Fixed
33+
34+
- Minor whitespace and formatting inconsistencies throughout the codebase
35+
- Import statement organization and ordering
36+
837
## [2025.0.1] - 2025-11-09
938

1039
### Added
40+
1141
- **TimeSlot Pipe**: New custom pipe for formatting appointment time slots (e.g., "10AM - 11AM")
12-
- Displays start and end times for one-hour time slots
13-
- Supports timezone parameter for proper time zone handling
14-
- Includes comprehensive unit tests
42+
- Displays start and end times for one-hour time slots
43+
- Supports timezone parameter for proper time zone handling
44+
- Includes comprehensive unit tests
1545

1646
### Changed
47+
1748
- **UI Improvements**: Updated time display formatting across registration flow
18-
- Date/time selection page now uses TimeSlot pipe for consistent formatting
19-
- Schedule card component uses TimeSlot pipe instead of raw date formatting
20-
- Submit page displays time slots in user-friendly format
49+
- Date/time selection page now uses TimeSlot pipe for consistent formatting
50+
- Schedule card component uses TimeSlot pipe instead of raw date formatting
51+
- Submit page displays time slots in user-friendly format
2152
- **Translations**: Updated infant toy messaging to be more inclusive
22-
- English: Changed from "gender neutral toys" to "toys for children ages 0-2"
23-
- Spanish: Updated to match new English messaging
53+
- English: Changed from "gender neutral toys" to "toys for children ages 0-2"
54+
- Spanish: Updated to match new English messaging
2455

2556
### Removed
57+
2658
- Outdated face mask recommendation from event information page
2759

2860
### Fixed
61+
2962
- Test suite compatibility: Updated test mocks and helpers for better reliability
3063
- Removed debug console.log statements from test environment configuration
3164
- Fixed Auth mock to include `authStateReady` method
@@ -35,13 +68,15 @@ and this project adheres to a versioning scheme of `year.minor.patch`.
3568
## [2025.0.0] - 2025-11-09
3669

3770
### Added
71+
3872
- **E2E Testing**: New Playwright-based end-to-end testing framework (`santashop-e2e` package)
3973
- **Workspace Support**: Migrated to pnpm with workspace configuration for better monorepo management
4074
- **Test Helpers**: New shared test helper utilities in `test-helpers/` directory
4175
- E2E test scripts for automated testing workflows
4276
- Concurrent task execution support for parallel builds
4377

4478
### Changed
79+
4580
- **Breaking**: Migrated from npm to pnpm package manager
4681
- **Breaking**: Updated to ESLint flat config format (eslint.config.js)
4782
- **Dependencies**: Updated Angular to v20.3.10
@@ -53,11 +88,13 @@ and this project adheres to a versioning scheme of `year.minor.patch`.
5388
- Enhanced CI/CD configuration for admin and app builds
5489

5590
### Removed
91+
5692
- Legacy `.eslintrc.json` configuration files
5793
- Legacy `.eslintignore` files
5894
- `package-lock.json` (replaced by `pnpm-lock.yaml`)
5995

6096
### Fixed
97+
6198
- Various TypeScript type errors and linting issues
6299
- Build configuration inconsistencies across packages
63100
- Import path optimizations
@@ -67,5 +104,6 @@ and this project adheres to a versioning scheme of `year.minor.patch`.
67104
## Previous Versions
68105

69106
### [4.3.1] - Previous Release
107+
70108
- Last release using semantic versioning and npm
71109
- See git history for details of changes prior to 2025.0.0

firebase.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
"source": "/undoRegistration",
4242
"function": "undoRegistration"
4343
},
44+
{
45+
"source": "/changeRegistrationDateTime",
46+
"function": "changeRegistrationDateTime"
47+
},
4448
{
4549
"source": "/updateEmailAddress",
4650
"function": "updateEmailAddress"

package.json

Lines changed: 98 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,100 @@
11
{
2-
"name": "santasworkshop",
3-
"version": "2025.0.1",
4-
"author": "Joel Meaders",
5-
"private": true,
6-
"scripts": {
7-
"ng": "ng",
8-
"functions:deploy:test": "firebase use santas-workshop-test && firebase deploy --only functions",
9-
"functions:deploy:prod": "firebase use santas-workshop-193b5 && firebase deploy --only functions",
10-
"emulators:start": "firebase use santas-workshop-test && firebase emulators:start --import .firebase --export-on-exit",
11-
"emulators:start:noexport": "firebase use santas-workshop-test && firebase emulators:start --import .firebase",
12-
"emulators:start:sample": "firebase use santas-workshop-test && firebase emulators:start --import .firebase-sample-data --export-on-exit .firebase-sample-data",
13-
"fsrules:deploy": "firebase deploy --only firestore:rules",
14-
"prettier:format": "npx prettier --end-of-line auto --write .",
15-
"ci:admin:config": "ts-node -O '{\"module\": \"commonjs\"}' config.admin.ts",
16-
"ci:admin:build": "pnpm --filter @santashop/models build && pnpm --filter @santashop/core build:prod && ng build santashop-admin --configuration=production",
17-
"ci:app:config": "ts-node -O '{\"module\": \"commonjs\"}' config.app.ts",
18-
"ci:app:build": "pnpm --filter @santashop/models build && pnpm --filter @santashop/core build:prod && ng build santashop-app --configuration=production",
19-
"e2e:setup": "pnpm --filter @santashop/e2e exec playwright install",
20-
"e2e:test": "pnpm e2e:prebuild && concurrently -k -s first -n \"APP,TESTS\" -c \"blue,green\" \"pnpm e2e:serve\" \"pnpm e2e:run\"",
21-
"e2e:prebuild": "cd santashop-functions && npm run build",
22-
"e2e:serve": "pnpm --filter @santashop/app start:test",
23-
"e2e:run": "wait-on http://localhost:4100 && pnpm --filter @santashop/e2e test",
24-
"e2e:ui": "wait-on http://localhost:4100 && pnpm --filter @santashop/e2e test:ui",
25-
"e2e:debug": "wait-on http://localhost:4100 && pnpm --filter @santashop/e2e test:debug"
26-
},
27-
"dependencies": {
28-
"@angular/animations": "^20.3.10",
29-
"@angular/common": "^20.3.10",
30-
"@angular/compiler": "^20.3.10",
31-
"@angular/core": "^20.3.10",
32-
"@angular/fire": "^20.0.1",
33-
"@angular/forms": "^20.3.10",
34-
"@angular/platform-browser": "^20.3.10",
35-
"@angular/platform-browser-dynamic": "^20.3.10",
36-
"@angular/router": "^20.3.10",
37-
"@ionic/angular": "^8.7.9",
38-
"@ngx-translate/core": "^17.0.0",
39-
"@ngx-translate/http-loader": "^17.0.0",
40-
"@zxing/browser": "^0.1.5",
41-
"@zxing/library": "^0.21.3",
42-
"@zxing/ngx-scanner": "^20.0.0",
43-
"chart.js": "^4.5.1",
44-
"chartjs-plugin-datalabels": "^2.2.0",
45-
"date-fns": "^4.1.0",
46-
"firebase": "^11.10.0",
47-
"ionicons": "^8.0.13",
48-
"ng2-charts": "^8.0.0",
49-
"reflect-metadata": "^0.2.2",
50-
"rxjs": "^7.8.2",
51-
"tslib": "~2.7.0",
52-
"zone.js": "~0.15.1"
53-
},
54-
"devDependencies": {
55-
"@angular-devkit/build-angular": "^20.3.9",
56-
"@angular-eslint/builder": "20.5.1",
57-
"@angular-eslint/eslint-plugin": "20.5.1",
58-
"@angular-eslint/eslint-plugin-template": "20.5.1",
59-
"@angular-eslint/schematics": "20.5.1",
60-
"@angular-eslint/template-parser": "20.5.1",
61-
"@angular/cli": "^20.3.9",
62-
"@angular/compiler-cli": "^20.3.10",
63-
"@hirez_io/observer-spy": "^2.2.0",
64-
"@ionic/angular-toolkit": "^12.3.0",
65-
"@ionic/cli": "^7.2.1",
66-
"@playwright/test": "^1.49.1",
67-
"@types/jasmine": "^5.1.12",
68-
"@types/node": "^24.10.0",
69-
"@types/underscore": "^1.13.0",
70-
"@typescript-eslint/eslint-plugin": "^8.46.3",
71-
"@typescript-eslint/parser": "8.46.3",
72-
"angular-eslint": "^20.5.1",
73-
"concurrently": "^9.1.2",
74-
"eslint": "^9.39.1",
75-
"eslint-config-prettier": "^10.1.8",
76-
"eslint-plugin-import": "^2.32.0",
77-
"eslint-plugin-jsdoc": "^61.1.12",
78-
"eslint-plugin-prefer-arrow": "1.2.3",
79-
"eslint-plugin-prettier": "^5.5.4",
80-
"firebase-tools": "^14.24.0",
81-
"jasmine-core": "~5.12.1",
82-
"jasmine-spec-reporter": "~7.0.0",
83-
"karma": "~6.4.4",
84-
"karma-chrome-launcher": "~3.2.0",
85-
"karma-cli": "^2.0.0",
86-
"karma-coverage": "~2.2.1",
87-
"karma-jasmine": "~5.1.0",
88-
"karma-jasmine-html-reporter": "^2.1.0",
89-
"ng-packagr": "^20.3.0",
90-
"open": "^10.2.0",
91-
"prettier": "^3.6.2",
92-
"ts-node": "~10.9.2",
93-
"typescript": "5.8.3",
94-
"wait-on": "^8.0.3",
95-
"webpack-bundle-analyzer": "^4.10.2"
96-
},
97-
"volta": {
98-
"node": "24.11.0"
99-
}
2+
"name": "santasworkshop",
3+
"version": "2025.1.0",
4+
"author": "Joel Meaders",
5+
"private": true,
6+
"scripts": {
7+
"ng": "ng",
8+
"functions:deploy:test": "firebase use santas-workshop-test && firebase deploy --only functions",
9+
"functions:deploy:prod": "firebase use santas-workshop-193b5 && firebase deploy --only functions",
10+
"emulators:start": "firebase use santas-workshop-test && firebase emulators:start --import .firebase --export-on-exit",
11+
"emulators:start:noexport": "firebase use santas-workshop-test && firebase emulators:start --import .firebase",
12+
"emulators:start:sample": "firebase use santas-workshop-test && firebase emulators:start --import .firebase-sample-data --export-on-exit .firebase-sample-data",
13+
"fsrules:deploy": "firebase deploy --only firestore:rules",
14+
"prettier:format": "npx prettier --end-of-line auto --write .",
15+
"ci:admin:config": "ts-node -O '{\"module\": \"commonjs\"}' config.admin.ts",
16+
"ci:admin:build": "pnpm --filter @santashop/models build && pnpm --filter @santashop/core build:prod && ng build santashop-admin --configuration=production",
17+
"ci:app:config": "ts-node -O '{\"module\": \"commonjs\"}' config.app.ts",
18+
"ci:app:build": "pnpm --filter @santashop/models build && pnpm --filter @santashop/core build:prod && ng build santashop-app --configuration=production",
19+
"e2e:setup": "pnpm --filter @santashop/e2e exec playwright install",
20+
"e2e:test": "pnpm e2e:prebuild && concurrently -k -s first -n \"APP,TESTS\" -c \"blue,green\" \"pnpm e2e:serve\" \"pnpm e2e:run\"",
21+
"e2e:prebuild": "cd santashop-functions && npm run build",
22+
"e2e:serve": "pnpm --filter @santashop/app start:test",
23+
"e2e:run": "wait-on http://localhost:4100 && pnpm --filter @santashop/e2e test",
24+
"e2e:ui": "wait-on http://localhost:4100 && pnpm --filter @santashop/e2e test:ui",
25+
"e2e:debug": "wait-on http://localhost:4100 && pnpm --filter @santashop/e2e test:debug"
26+
},
27+
"dependencies": {
28+
"@angular/animations": "^20.3.10",
29+
"@angular/common": "^20.3.10",
30+
"@angular/compiler": "^20.3.10",
31+
"@angular/core": "^20.3.10",
32+
"@angular/fire": "^20.0.1",
33+
"@angular/forms": "^20.3.10",
34+
"@angular/platform-browser": "^20.3.10",
35+
"@angular/platform-browser-dynamic": "^20.3.10",
36+
"@angular/router": "^20.3.10",
37+
"@ionic/angular": "^8.7.9",
38+
"@ngx-translate/core": "^17.0.0",
39+
"@ngx-translate/http-loader": "^17.0.0",
40+
"@zxing/browser": "^0.1.5",
41+
"@zxing/library": "^0.21.3",
42+
"@zxing/ngx-scanner": "^20.0.0",
43+
"chart.js": "^4.5.1",
44+
"chartjs-plugin-datalabels": "^2.2.0",
45+
"date-fns": "^4.1.0",
46+
"firebase": "^11.10.0",
47+
"ionicons": "^8.0.13",
48+
"ng2-charts": "^8.0.0",
49+
"reflect-metadata": "^0.2.2",
50+
"rxjs": "^7.8.2",
51+
"tslib": "~2.7.0",
52+
"zone.js": "~0.15.1"
53+
},
54+
"devDependencies": {
55+
"@angular-devkit/build-angular": "^20.3.9",
56+
"@angular-eslint/builder": "20.5.1",
57+
"@angular-eslint/eslint-plugin": "20.5.1",
58+
"@angular-eslint/eslint-plugin-template": "20.5.1",
59+
"@angular-eslint/schematics": "20.5.1",
60+
"@angular-eslint/template-parser": "20.5.1",
61+
"@angular/cli": "^20.3.9",
62+
"@angular/compiler-cli": "^20.3.10",
63+
"@hirez_io/observer-spy": "^2.2.0",
64+
"@ionic/angular-toolkit": "^12.3.0",
65+
"@ionic/cli": "^7.2.1",
66+
"@playwright/test": "^1.49.1",
67+
"@types/jasmine": "^5.1.12",
68+
"@types/node": "^24.10.0",
69+
"@types/underscore": "^1.13.0",
70+
"@typescript-eslint/eslint-plugin": "^8.46.3",
71+
"@typescript-eslint/parser": "8.46.3",
72+
"angular-eslint": "^20.5.1",
73+
"concurrently": "^9.1.2",
74+
"eslint": "^9.39.1",
75+
"eslint-config-prettier": "^10.1.8",
76+
"eslint-plugin-import": "^2.32.0",
77+
"eslint-plugin-jsdoc": "^61.1.12",
78+
"eslint-plugin-prefer-arrow": "1.2.3",
79+
"eslint-plugin-prettier": "^5.5.4",
80+
"firebase-tools": "^14.24.0",
81+
"jasmine-core": "~5.12.1",
82+
"jasmine-spec-reporter": "~7.0.0",
83+
"karma": "~6.4.4",
84+
"karma-chrome-launcher": "~3.2.0",
85+
"karma-cli": "^2.0.0",
86+
"karma-coverage": "~2.2.1",
87+
"karma-jasmine": "~5.1.0",
88+
"karma-jasmine-html-reporter": "^2.1.0",
89+
"ng-packagr": "^20.3.0",
90+
"open": "^10.2.0",
91+
"prettier": "^3.6.2",
92+
"ts-node": "~10.9.2",
93+
"typescript": "5.8.3",
94+
"wait-on": "^8.0.3",
95+
"webpack-bundle-analyzer": "^4.10.2"
96+
},
97+
"volta": {
98+
"node": "24.11.0"
99+
}
100100
}

0 commit comments

Comments
 (0)