Admin Bugbash Fixes - #209

Merged
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash
Aug 25, 2026
Merged

Admin Bugbash Fixes#209
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash

Conversation

@Yurika-Kan

Copy link
Copy Markdown
Collaborator

📝 Description

  • Navbar clears the user only on unauthenticated, killing the load/refresh flicker; phone validation messages reworded.
  • Invalid ?donationId / ?orderId deep links show a "not found" error.
  • Donation Statistics totals fetch is independent of pagination, so "All Pantries" renders on every page.
  • Failed application fetches render an "Unable to Load Applications" error state.
  • Application Review "View Details" uses navigate() instead of href (SPA transition).
  • Cognito errors include the AWS reason and re-throw existing HttpExceptions.
  • Approve Food Manufacturers pagination arrows disable at first/last page.
  • Pantry assignee column checks for active volunteers before falling back to "No Volunteer".
  • User Management shows an "Admin" badge on admin rows.
  • Donation / Pantry / Manufacturer / Order Management show a "no results match filter" state.
  • Order Management table wrapped in overflowX="auto".
  • Removed dev-only "All Pages" nav link.
  • Donation details and delete modals hold the last donation in a ref while closing, fixing focus-trap errors.
  • Admin order table now refreshes auto after allocation edits.

CopilotAI lite review requested due to automatic review settings August 12, 2026 04:17

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bundles a set of admin-facing UI/UX bug fixes across the frontend (empty/error states, pagination behavior, SPA navigation, table overflow, and modal stability) plus backend improvements to validation messages and Cognito error propagation, along with an auth endpoint audit document.

Changes:

  • Improve admin list pages: add “no matching results” / error states, fix pagination behaviors, and enhance navigation/labels.
  • Stabilize donation modals during close (avoid focus-trap/body-lock issues) and refresh admin orders after allocation edits.
  • Update backend phone validation messages and include underlying Cognito/AWS failure reasons in auth errors; add backend auth posture audit doc.

Reviewed changes

Copilot reviewed 19 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
apps/frontend/src/containers/userManagement.tsxAdds an “Admin” badge for admin rows in the volunteer table.
apps/frontend/src/containers/approvePantries.tsxAdds fetch error state UI and switches “View Details” to SPA navigation.
apps/frontend/src/containers/approveFoodManufacturers.tsxAdds fetch error UI, “no matching applications” empty state, SPA navigation, and disables pagination arrows at bounds.
apps/frontend/src/containers/adminPantryManagement.tsxAdds “no pantries / no matching pantries” empty state and refines assignee display to only consider active volunteers.
apps/frontend/src/containers/adminOrderManagement.tsxRefactors order fetch into a reusable callback, adds deep-link “not found” error, refreshes after edits, and adds horizontal overflow for the table.
apps/frontend/src/containers/adminDonationStats.tsxFetches total stats independent of pagination so “All Pantries” totals render on every page.
apps/frontend/src/containers/adminDonation.tsxAdds deep-link “donation not found” error, adds filtered empty state, and renders details modal in a way that supports stable closing.
apps/frontend/src/components/Navbar.tsxAvoids clearing current user during non-unauthenticated transitions; removes dev-only nav link; adjusts label text.
apps/frontend/src/components/forms/fmDeleteDonationModal.tsxHolds the last donation in a ref during close to prevent modal lock/focus issues.
apps/frontend/src/components/forms/donationDetailsModal.tsxHolds the last donation in a ref during close; updates header/details rendering accordingly.
apps/backend/src/users/dtos/userSchema.dto.tsUpdates phone validation message wording.
apps/backend/src/users/dtos/update-user-info.dto.tsUpdates phone validation message wording.
apps/backend/src/pantries/dtos/update-pantry-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/pantries/dtos/pantry-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/manufacturer-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/auth/dtos/sign-up.dto.tsUpdates phone validation message wording.
apps/backend/src/auth/auth.service.tsRe-throws existing HttpExceptions and appends underlying error “reason” to internal server errors.
apps/backend/src/auth/AUTH_AUDIT.mdAdds a living inventory of backend routes and their auth/guard posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx Outdated
Comment threadapps/frontend/src/containers/approvePantries.tsx
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one other thing: is the test.ico actually needed here?

Comment threadapps/backend/src/auth/AUTH_AUDIT.md Outdated
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts
Comment threadapps/frontend/src/components/Navbar.tsx
Comment threadapps/frontend/src/containers/adminOrderManagement.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx Outdated
Comment threadapps/frontend/src/containers/userManagement.tsx
Prevents "Donation #undefined" header flash during modal close animation.
Yurika-Kanand others added 2 commits August 14, 2026 18:11
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Yurika-Kan <148014074+Yurika-Kan@users.noreply.github.com>
Yurika-Kanand others added 3 commits August 14, 2026 18:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see a few slack questions in addition to this.

{
index: true,
element: <Homepage />,
element: <Navigate to={ROUTES.LOGIN} replace />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have an issue that, if the user is already logged in, and is supposed to be brought straight to the profile page (one that depends entirely on backend data, unlike the homepage we used to have), itll take 30 seconds for the backend to startup before the user can actually see details on it (right now it just says No Profile Found until then). Im not sure if there is a workaround for this (or maybe its not a big deal since in theory the backend will be permanently running when its in production), but wanted to ask.

Comment threadapps/frontend/src/app.tsx
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts
Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx
@@ -35,8 +35,10 @@ const NewVolunteerModal: React.FC<NewVolunteerModalProps> = ({
const [isOpen, setIsOpen] = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a new bug, where the alert state gets stale.

To reproduce:

  1. Open the "Add New User" modal.
  2. Enter a faulty name/email/phone number.
  3. Close the modal.
  4. Open the modal again, and the error message appears without filling in any fields.

@jiang-h-yjiang-h-y mentioned this pull request Aug 18, 2026
Yurika-Kanand others added 6 commits August 23, 2026 13:58
Drops password/phone (never used by admin-created users) and adds role
directly to the DTO instead of an ad-hoc Omit<> intersection type.
…n cold backend
Previously a single failed getMe() call (e.g. backend still starting up)
permanently showed "Profile not found", with no recovery short of a
manual refresh. Now retries every 3s while the backend is unreachable
(no HTTP response), only giving up on a real auth error response.
Closing via backdrop click or the X button left isEditing stuck true,
so reopening the modal showed the edit form instead of the details
view. Only the Cancel button reset it before. Now onOpenChange resets
isEditing whenever the dialog closes, matching Cancel's behavior.
Requested in review for readability now that public/protected routes
are interleaved without the old homepage route as a visual anchor.
Standardizes filter UX by adding search-to-filter inputs to
adminDonation, approveFoodManufacturers, and approvePantries, matching
the existing pattern in pantry/manufacturer management pages.
…ntity
Backend rejects edit/delete once a donation has reserved items even
while status is still AVAILABLE; mirror that in the details modal.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • Retry profile fetch: cold backend no longer sticks "not found" forever, retries first.
  • Trim SignUpDto: adminCreateUser only uses fields it needs now.
  • Reset isEditing: donation details modal clears edit state on close.
  • Protected routes marker: comment in app.tsx flags where protected routes start.
  • Search in filter dropdowns: manufacturer/pantry filters get search box (adminDonation, approveFoodManufacturers, approvePantries).
  • Hide edit/delete on reserved donations: donationDetailsModal hides edit/delete when items have reserved quantity.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 43 out of 44 changed files in this pull request and generated 3 comments.

Suppressed comments (1)

apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.ts:41

  • The updated validation copy here uses "Secondary phone contact…", but other updated DTOs in this PR use the shorter "Secondary phone…" phrasing. For consistency (and clearer UX), align this message with the others (e.g., "Secondary phone must be a valid US phone number.").
 @IsOptional()
@IsString()
@IsPhoneNumber('US', {
message: 'Secondary phone contact must be a valid US phone number.',
})

Comment threadapps/frontend/src/containers/profilePage.tsx Outdated
Comment on lines 301 to 309
<OrderDetailsModal
orderId={selectedOrderId}
isOpen={selectedOrderId !== null}
onClose={() => {
setSelectedOrderId(null);
navigate(ROUTES.ADMIN_ORDER_MANAGEMENT, { replace: true });
}}
onSuccess={fetchOrders}
/>
Comment threadapps/frontend/src/components/pagination.tsx
Yurika-Kanand others added 4 commits August 23, 2026 16:16
Alert state persisted across modal reopens since only isOpen was reset. clearAlert now runs on every close path (X, Cancel, backdrop, success/fail).
Long badge labels (e.g. "Food Manufacturer") could overflow past the
card's right edge on narrow cards since the header row never wrapped.
… disappears
selectedManufacturers never got reconciled against manufacturerOptions after
a refetch, so deleting a manufacturer's last donation left its name stuck in
the filter state with no visible checkbox to uncheck it, permanently showing
"No donations match the selected filter." Also reset the filter's search
text on close so it doesn't show a stale query with no results.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • stale manufacturer filter stuck showing "No donations match filter" after last matching donation deleted
  • Filter selection now prunes itself against live options on every refetch
  • Search box text now clears when filter dropdown closes

…ut safely
Address Copilot review comments: fetchOrders was resetting currentPages
to 1 on every call, bouncing admin back to page 1 after saving edits
in the order details modal. Also type retryTimeout as possibly
undefined to match how it's actually assigned.
The accepted Copilot autofix (cc953a8) left the closing tag missing
its '>', a JSX syntax error that would fail the build.

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Admin and Volunteer Food Request Management Filter still needs the search added to it, but aside from this looks great!!!

@jiang-h-yjiang-h-y left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! tested that the bugs we surfaced can no longer be reproduced

@Yurika-Kan
Yurika-Kan merged commit 279213a into mainAug 25, 2026
4 checks passed
@Yurika-Kan
Yurika-Kan deleted the yk/admin-bugbash branch August 25, 2026 03:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Yurika-Kan@dburkhart07@jiang-h-y
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Admin Bugbash Fixes - #209

Merged
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash
Aug 25, 2026
Merged

Admin Bugbash Fixes#209
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash

Conversation

@Yurika-Kan

Copy link
Copy Markdown
Collaborator

📝 Description

  • Navbar clears the user only on unauthenticated, killing the load/refresh flicker; phone validation messages reworded.
  • Invalid ?donationId / ?orderId deep links show a "not found" error.
  • Donation Statistics totals fetch is independent of pagination, so "All Pantries" renders on every page.
  • Failed application fetches render an "Unable to Load Applications" error state.
  • Application Review "View Details" uses navigate() instead of href (SPA transition).
  • Cognito errors include the AWS reason and re-throw existing HttpExceptions.
  • Approve Food Manufacturers pagination arrows disable at first/last page.
  • Pantry assignee column checks for active volunteers before falling back to "No Volunteer".
  • User Management shows an "Admin" badge on admin rows.
  • Donation / Pantry / Manufacturer / Order Management show a "no results match filter" state.
  • Order Management table wrapped in overflowX="auto".
  • Removed dev-only "All Pages" nav link.
  • Donation details and delete modals hold the last donation in a ref while closing, fixing focus-trap errors.
  • Admin order table now refreshes auto after allocation edits.

CopilotAI lite review requested due to automatic review settings August 12, 2026 04:17

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bundles a set of admin-facing UI/UX bug fixes across the frontend (empty/error states, pagination behavior, SPA navigation, table overflow, and modal stability) plus backend improvements to validation messages and Cognito error propagation, along with an auth endpoint audit document.

Changes:

  • Improve admin list pages: add “no matching results” / error states, fix pagination behaviors, and enhance navigation/labels.
  • Stabilize donation modals during close (avoid focus-trap/body-lock issues) and refresh admin orders after allocation edits.
  • Update backend phone validation messages and include underlying Cognito/AWS failure reasons in auth errors; add backend auth posture audit doc.

Reviewed changes

Copilot reviewed 19 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
apps/frontend/src/containers/userManagement.tsxAdds an “Admin” badge for admin rows in the volunteer table.
apps/frontend/src/containers/approvePantries.tsxAdds fetch error state UI and switches “View Details” to SPA navigation.
apps/frontend/src/containers/approveFoodManufacturers.tsxAdds fetch error UI, “no matching applications” empty state, SPA navigation, and disables pagination arrows at bounds.
apps/frontend/src/containers/adminPantryManagement.tsxAdds “no pantries / no matching pantries” empty state and refines assignee display to only consider active volunteers.
apps/frontend/src/containers/adminOrderManagement.tsxRefactors order fetch into a reusable callback, adds deep-link “not found” error, refreshes after edits, and adds horizontal overflow for the table.
apps/frontend/src/containers/adminDonationStats.tsxFetches total stats independent of pagination so “All Pantries” totals render on every page.
apps/frontend/src/containers/adminDonation.tsxAdds deep-link “donation not found” error, adds filtered empty state, and renders details modal in a way that supports stable closing.
apps/frontend/src/components/Navbar.tsxAvoids clearing current user during non-unauthenticated transitions; removes dev-only nav link; adjusts label text.
apps/frontend/src/components/forms/fmDeleteDonationModal.tsxHolds the last donation in a ref during close to prevent modal lock/focus issues.
apps/frontend/src/components/forms/donationDetailsModal.tsxHolds the last donation in a ref during close; updates header/details rendering accordingly.
apps/backend/src/users/dtos/userSchema.dto.tsUpdates phone validation message wording.
apps/backend/src/users/dtos/update-user-info.dto.tsUpdates phone validation message wording.
apps/backend/src/pantries/dtos/update-pantry-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/pantries/dtos/pantry-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/manufacturer-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/auth/dtos/sign-up.dto.tsUpdates phone validation message wording.
apps/backend/src/auth/auth.service.tsRe-throws existing HttpExceptions and appends underlying error “reason” to internal server errors.
apps/backend/src/auth/AUTH_AUDIT.mdAdds a living inventory of backend routes and their auth/guard posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx Outdated
Comment threadapps/frontend/src/containers/approvePantries.tsx
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one other thing: is the test.ico actually needed here?

Comment threadapps/backend/src/auth/AUTH_AUDIT.md Outdated
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts
Comment threadapps/frontend/src/components/Navbar.tsx
Comment threadapps/frontend/src/containers/adminOrderManagement.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx Outdated
Comment threadapps/frontend/src/containers/userManagement.tsx
Prevents "Donation #undefined" header flash during modal close animation.
Yurika-Kanand others added 2 commits August 14, 2026 18:11
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Yurika-Kan <148014074+Yurika-Kan@users.noreply.github.com>
Yurika-Kanand others added 3 commits August 14, 2026 18:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see a few slack questions in addition to this.

{
index: true,
element: <Homepage />,
element: <Navigate to={ROUTES.LOGIN} replace />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have an issue that, if the user is already logged in, and is supposed to be brought straight to the profile page (one that depends entirely on backend data, unlike the homepage we used to have), itll take 30 seconds for the backend to startup before the user can actually see details on it (right now it just says No Profile Found until then). Im not sure if there is a workaround for this (or maybe its not a big deal since in theory the backend will be permanently running when its in production), but wanted to ask.

Comment threadapps/frontend/src/app.tsx
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts
Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx
@@ -35,8 +35,10 @@ const NewVolunteerModal: React.FC<NewVolunteerModalProps> = ({
const [isOpen, setIsOpen] = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a new bug, where the alert state gets stale.

To reproduce:

  1. Open the "Add New User" modal.
  2. Enter a faulty name/email/phone number.
  3. Close the modal.
  4. Open the modal again, and the error message appears without filling in any fields.

@jiang-h-yjiang-h-y mentioned this pull request Aug 18, 2026
Yurika-Kanand others added 6 commits August 23, 2026 13:58
Drops password/phone (never used by admin-created users) and adds role
directly to the DTO instead of an ad-hoc Omit<> intersection type.
…n cold backend
Previously a single failed getMe() call (e.g. backend still starting up)
permanently showed "Profile not found", with no recovery short of a
manual refresh. Now retries every 3s while the backend is unreachable
(no HTTP response), only giving up on a real auth error response.
Closing via backdrop click or the X button left isEditing stuck true,
so reopening the modal showed the edit form instead of the details
view. Only the Cancel button reset it before. Now onOpenChange resets
isEditing whenever the dialog closes, matching Cancel's behavior.
Requested in review for readability now that public/protected routes
are interleaved without the old homepage route as a visual anchor.
Standardizes filter UX by adding search-to-filter inputs to
adminDonation, approveFoodManufacturers, and approvePantries, matching
the existing pattern in pantry/manufacturer management pages.
…ntity
Backend rejects edit/delete once a donation has reserved items even
while status is still AVAILABLE; mirror that in the details modal.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • Retry profile fetch: cold backend no longer sticks "not found" forever, retries first.
  • Trim SignUpDto: adminCreateUser only uses fields it needs now.
  • Reset isEditing: donation details modal clears edit state on close.
  • Protected routes marker: comment in app.tsx flags where protected routes start.
  • Search in filter dropdowns: manufacturer/pantry filters get search box (adminDonation, approveFoodManufacturers, approvePantries).
  • Hide edit/delete on reserved donations: donationDetailsModal hides edit/delete when items have reserved quantity.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 43 out of 44 changed files in this pull request and generated 3 comments.

Suppressed comments (1)

apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.ts:41

  • The updated validation copy here uses "Secondary phone contact…", but other updated DTOs in this PR use the shorter "Secondary phone…" phrasing. For consistency (and clearer UX), align this message with the others (e.g., "Secondary phone must be a valid US phone number.").
 @IsOptional()
@IsString()
@IsPhoneNumber('US', {
message: 'Secondary phone contact must be a valid US phone number.',
})

Comment threadapps/frontend/src/containers/profilePage.tsx Outdated
Comment on lines 301 to 309
<OrderDetailsModal
orderId={selectedOrderId}
isOpen={selectedOrderId !== null}
onClose={() => {
setSelectedOrderId(null);
navigate(ROUTES.ADMIN_ORDER_MANAGEMENT, { replace: true });
}}
onSuccess={fetchOrders}
/>
Comment threadapps/frontend/src/components/pagination.tsx
Yurika-Kanand others added 4 commits August 23, 2026 16:16
Alert state persisted across modal reopens since only isOpen was reset. clearAlert now runs on every close path (X, Cancel, backdrop, success/fail).
Long badge labels (e.g. "Food Manufacturer") could overflow past the
card's right edge on narrow cards since the header row never wrapped.
… disappears
selectedManufacturers never got reconciled against manufacturerOptions after
a refetch, so deleting a manufacturer's last donation left its name stuck in
the filter state with no visible checkbox to uncheck it, permanently showing
"No donations match the selected filter." Also reset the filter's search
text on close so it doesn't show a stale query with no results.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • stale manufacturer filter stuck showing "No donations match filter" after last matching donation deleted
  • Filter selection now prunes itself against live options on every refetch
  • Search box text now clears when filter dropdown closes

…ut safely
Address Copilot review comments: fetchOrders was resetting currentPages
to 1 on every call, bouncing admin back to page 1 after saving edits
in the order details modal. Also type retryTimeout as possibly
undefined to match how it's actually assigned.
The accepted Copilot autofix (cc953a8) left the closing tag missing
its '>', a JSX syntax error that would fail the build.

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Admin and Volunteer Food Request Management Filter still needs the search added to it, but aside from this looks great!!!

@jiang-h-yjiang-h-y left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! tested that the bugs we surfaced can no longer be reproduced

@Yurika-Kan
Yurika-Kan merged commit 279213a into mainAug 25, 2026
4 checks passed
@Yurika-Kan
Yurika-Kan deleted the yk/admin-bugbash branch August 25, 2026 03:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Yurika-Kan@dburkhart07@jiang-h-y
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Admin Bugbash Fixes - #209

Merged
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash
Aug 25, 2026
Merged

Admin Bugbash Fixes#209
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash

Conversation

@Yurika-Kan

Copy link
Copy Markdown
Collaborator

📝 Description

  • Navbar clears the user only on unauthenticated, killing the load/refresh flicker; phone validation messages reworded.
  • Invalid ?donationId / ?orderId deep links show a "not found" error.
  • Donation Statistics totals fetch is independent of pagination, so "All Pantries" renders on every page.
  • Failed application fetches render an "Unable to Load Applications" error state.
  • Application Review "View Details" uses navigate() instead of href (SPA transition).
  • Cognito errors include the AWS reason and re-throw existing HttpExceptions.
  • Approve Food Manufacturers pagination arrows disable at first/last page.
  • Pantry assignee column checks for active volunteers before falling back to "No Volunteer".
  • User Management shows an "Admin" badge on admin rows.
  • Donation / Pantry / Manufacturer / Order Management show a "no results match filter" state.
  • Order Management table wrapped in overflowX="auto".
  • Removed dev-only "All Pages" nav link.
  • Donation details and delete modals hold the last donation in a ref while closing, fixing focus-trap errors.
  • Admin order table now refreshes auto after allocation edits.

CopilotAI lite review requested due to automatic review settings August 12, 2026 04:17

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bundles a set of admin-facing UI/UX bug fixes across the frontend (empty/error states, pagination behavior, SPA navigation, table overflow, and modal stability) plus backend improvements to validation messages and Cognito error propagation, along with an auth endpoint audit document.

Changes:

  • Improve admin list pages: add “no matching results” / error states, fix pagination behaviors, and enhance navigation/labels.
  • Stabilize donation modals during close (avoid focus-trap/body-lock issues) and refresh admin orders after allocation edits.
  • Update backend phone validation messages and include underlying Cognito/AWS failure reasons in auth errors; add backend auth posture audit doc.

Reviewed changes

Copilot reviewed 19 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
apps/frontend/src/containers/userManagement.tsxAdds an “Admin” badge for admin rows in the volunteer table.
apps/frontend/src/containers/approvePantries.tsxAdds fetch error state UI and switches “View Details” to SPA navigation.
apps/frontend/src/containers/approveFoodManufacturers.tsxAdds fetch error UI, “no matching applications” empty state, SPA navigation, and disables pagination arrows at bounds.
apps/frontend/src/containers/adminPantryManagement.tsxAdds “no pantries / no matching pantries” empty state and refines assignee display to only consider active volunteers.
apps/frontend/src/containers/adminOrderManagement.tsxRefactors order fetch into a reusable callback, adds deep-link “not found” error, refreshes after edits, and adds horizontal overflow for the table.
apps/frontend/src/containers/adminDonationStats.tsxFetches total stats independent of pagination so “All Pantries” totals render on every page.
apps/frontend/src/containers/adminDonation.tsxAdds deep-link “donation not found” error, adds filtered empty state, and renders details modal in a way that supports stable closing.
apps/frontend/src/components/Navbar.tsxAvoids clearing current user during non-unauthenticated transitions; removes dev-only nav link; adjusts label text.
apps/frontend/src/components/forms/fmDeleteDonationModal.tsxHolds the last donation in a ref during close to prevent modal lock/focus issues.
apps/frontend/src/components/forms/donationDetailsModal.tsxHolds the last donation in a ref during close; updates header/details rendering accordingly.
apps/backend/src/users/dtos/userSchema.dto.tsUpdates phone validation message wording.
apps/backend/src/users/dtos/update-user-info.dto.tsUpdates phone validation message wording.
apps/backend/src/pantries/dtos/update-pantry-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/pantries/dtos/pantry-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/manufacturer-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/auth/dtos/sign-up.dto.tsUpdates phone validation message wording.
apps/backend/src/auth/auth.service.tsRe-throws existing HttpExceptions and appends underlying error “reason” to internal server errors.
apps/backend/src/auth/AUTH_AUDIT.mdAdds a living inventory of backend routes and their auth/guard posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx Outdated
Comment threadapps/frontend/src/containers/approvePantries.tsx
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one other thing: is the test.ico actually needed here?

Comment threadapps/backend/src/auth/AUTH_AUDIT.md Outdated
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts
Comment threadapps/frontend/src/components/Navbar.tsx
Comment threadapps/frontend/src/containers/adminOrderManagement.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx Outdated
Comment threadapps/frontend/src/containers/userManagement.tsx
Prevents "Donation #undefined" header flash during modal close animation.
Yurika-Kanand others added 2 commits August 14, 2026 18:11
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Yurika-Kan <148014074+Yurika-Kan@users.noreply.github.com>
Yurika-Kanand others added 3 commits August 14, 2026 18:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see a few slack questions in addition to this.

{
index: true,
element: <Homepage />,
element: <Navigate to={ROUTES.LOGIN} replace />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have an issue that, if the user is already logged in, and is supposed to be brought straight to the profile page (one that depends entirely on backend data, unlike the homepage we used to have), itll take 30 seconds for the backend to startup before the user can actually see details on it (right now it just says No Profile Found until then). Im not sure if there is a workaround for this (or maybe its not a big deal since in theory the backend will be permanently running when its in production), but wanted to ask.

Comment threadapps/frontend/src/app.tsx
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts
Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx
@@ -35,8 +35,10 @@ const NewVolunteerModal: React.FC<NewVolunteerModalProps> = ({
const [isOpen, setIsOpen] = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a new bug, where the alert state gets stale.

To reproduce:

  1. Open the "Add New User" modal.
  2. Enter a faulty name/email/phone number.
  3. Close the modal.
  4. Open the modal again, and the error message appears without filling in any fields.

@jiang-h-yjiang-h-y mentioned this pull request Aug 18, 2026
Yurika-Kanand others added 6 commits August 23, 2026 13:58
Drops password/phone (never used by admin-created users) and adds role
directly to the DTO instead of an ad-hoc Omit<> intersection type.
…n cold backend
Previously a single failed getMe() call (e.g. backend still starting up)
permanently showed "Profile not found", with no recovery short of a
manual refresh. Now retries every 3s while the backend is unreachable
(no HTTP response), only giving up on a real auth error response.
Closing via backdrop click or the X button left isEditing stuck true,
so reopening the modal showed the edit form instead of the details
view. Only the Cancel button reset it before. Now onOpenChange resets
isEditing whenever the dialog closes, matching Cancel's behavior.
Requested in review for readability now that public/protected routes
are interleaved without the old homepage route as a visual anchor.
Standardizes filter UX by adding search-to-filter inputs to
adminDonation, approveFoodManufacturers, and approvePantries, matching
the existing pattern in pantry/manufacturer management pages.
…ntity
Backend rejects edit/delete once a donation has reserved items even
while status is still AVAILABLE; mirror that in the details modal.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • Retry profile fetch: cold backend no longer sticks "not found" forever, retries first.
  • Trim SignUpDto: adminCreateUser only uses fields it needs now.
  • Reset isEditing: donation details modal clears edit state on close.
  • Protected routes marker: comment in app.tsx flags where protected routes start.
  • Search in filter dropdowns: manufacturer/pantry filters get search box (adminDonation, approveFoodManufacturers, approvePantries).
  • Hide edit/delete on reserved donations: donationDetailsModal hides edit/delete when items have reserved quantity.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 43 out of 44 changed files in this pull request and generated 3 comments.

Suppressed comments (1)

apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.ts:41

  • The updated validation copy here uses "Secondary phone contact…", but other updated DTOs in this PR use the shorter "Secondary phone…" phrasing. For consistency (and clearer UX), align this message with the others (e.g., "Secondary phone must be a valid US phone number.").
 @IsOptional()
@IsString()
@IsPhoneNumber('US', {
message: 'Secondary phone contact must be a valid US phone number.',
})

Comment threadapps/frontend/src/containers/profilePage.tsx Outdated
Comment on lines 301 to 309
<OrderDetailsModal
orderId={selectedOrderId}
isOpen={selectedOrderId !== null}
onClose={() => {
setSelectedOrderId(null);
navigate(ROUTES.ADMIN_ORDER_MANAGEMENT, { replace: true });
}}
onSuccess={fetchOrders}
/>
Comment threadapps/frontend/src/components/pagination.tsx
Yurika-Kanand others added 4 commits August 23, 2026 16:16
Alert state persisted across modal reopens since only isOpen was reset. clearAlert now runs on every close path (X, Cancel, backdrop, success/fail).
Long badge labels (e.g. "Food Manufacturer") could overflow past the
card's right edge on narrow cards since the header row never wrapped.
… disappears
selectedManufacturers never got reconciled against manufacturerOptions after
a refetch, so deleting a manufacturer's last donation left its name stuck in
the filter state with no visible checkbox to uncheck it, permanently showing
"No donations match the selected filter." Also reset the filter's search
text on close so it doesn't show a stale query with no results.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • stale manufacturer filter stuck showing "No donations match filter" after last matching donation deleted
  • Filter selection now prunes itself against live options on every refetch
  • Search box text now clears when filter dropdown closes

…ut safely
Address Copilot review comments: fetchOrders was resetting currentPages
to 1 on every call, bouncing admin back to page 1 after saving edits
in the order details modal. Also type retryTimeout as possibly
undefined to match how it's actually assigned.
The accepted Copilot autofix (cc953a8) left the closing tag missing
its '>', a JSX syntax error that would fail the build.

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Admin and Volunteer Food Request Management Filter still needs the search added to it, but aside from this looks great!!!

@jiang-h-yjiang-h-y left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! tested that the bugs we surfaced can no longer be reproduced

@Yurika-Kan
Yurika-Kan merged commit 279213a into mainAug 25, 2026
4 checks passed
@Yurika-Kan
Yurika-Kan deleted the yk/admin-bugbash branch August 25, 2026 03:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Yurika-Kan@dburkhart07@jiang-h-y
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Admin Bugbash Fixes - #209

Merged
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash
Aug 25, 2026
Merged

Admin Bugbash Fixes#209
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash

Conversation

@Yurika-Kan

Copy link
Copy Markdown
Collaborator

📝 Description

  • Navbar clears the user only on unauthenticated, killing the load/refresh flicker; phone validation messages reworded.
  • Invalid ?donationId / ?orderId deep links show a "not found" error.
  • Donation Statistics totals fetch is independent of pagination, so "All Pantries" renders on every page.
  • Failed application fetches render an "Unable to Load Applications" error state.
  • Application Review "View Details" uses navigate() instead of href (SPA transition).
  • Cognito errors include the AWS reason and re-throw existing HttpExceptions.
  • Approve Food Manufacturers pagination arrows disable at first/last page.
  • Pantry assignee column checks for active volunteers before falling back to "No Volunteer".
  • User Management shows an "Admin" badge on admin rows.
  • Donation / Pantry / Manufacturer / Order Management show a "no results match filter" state.
  • Order Management table wrapped in overflowX="auto".
  • Removed dev-only "All Pages" nav link.
  • Donation details and delete modals hold the last donation in a ref while closing, fixing focus-trap errors.
  • Admin order table now refreshes auto after allocation edits.

CopilotAI lite review requested due to automatic review settings August 12, 2026 04:17

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bundles a set of admin-facing UI/UX bug fixes across the frontend (empty/error states, pagination behavior, SPA navigation, table overflow, and modal stability) plus backend improvements to validation messages and Cognito error propagation, along with an auth endpoint audit document.

Changes:

  • Improve admin list pages: add “no matching results” / error states, fix pagination behaviors, and enhance navigation/labels.
  • Stabilize donation modals during close (avoid focus-trap/body-lock issues) and refresh admin orders after allocation edits.
  • Update backend phone validation messages and include underlying Cognito/AWS failure reasons in auth errors; add backend auth posture audit doc.

Reviewed changes

Copilot reviewed 19 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
apps/frontend/src/containers/userManagement.tsxAdds an “Admin” badge for admin rows in the volunteer table.
apps/frontend/src/containers/approvePantries.tsxAdds fetch error state UI and switches “View Details” to SPA navigation.
apps/frontend/src/containers/approveFoodManufacturers.tsxAdds fetch error UI, “no matching applications” empty state, SPA navigation, and disables pagination arrows at bounds.
apps/frontend/src/containers/adminPantryManagement.tsxAdds “no pantries / no matching pantries” empty state and refines assignee display to only consider active volunteers.
apps/frontend/src/containers/adminOrderManagement.tsxRefactors order fetch into a reusable callback, adds deep-link “not found” error, refreshes after edits, and adds horizontal overflow for the table.
apps/frontend/src/containers/adminDonationStats.tsxFetches total stats independent of pagination so “All Pantries” totals render on every page.
apps/frontend/src/containers/adminDonation.tsxAdds deep-link “donation not found” error, adds filtered empty state, and renders details modal in a way that supports stable closing.
apps/frontend/src/components/Navbar.tsxAvoids clearing current user during non-unauthenticated transitions; removes dev-only nav link; adjusts label text.
apps/frontend/src/components/forms/fmDeleteDonationModal.tsxHolds the last donation in a ref during close to prevent modal lock/focus issues.
apps/frontend/src/components/forms/donationDetailsModal.tsxHolds the last donation in a ref during close; updates header/details rendering accordingly.
apps/backend/src/users/dtos/userSchema.dto.tsUpdates phone validation message wording.
apps/backend/src/users/dtos/update-user-info.dto.tsUpdates phone validation message wording.
apps/backend/src/pantries/dtos/update-pantry-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/pantries/dtos/pantry-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/manufacturer-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/auth/dtos/sign-up.dto.tsUpdates phone validation message wording.
apps/backend/src/auth/auth.service.tsRe-throws existing HttpExceptions and appends underlying error “reason” to internal server errors.
apps/backend/src/auth/AUTH_AUDIT.mdAdds a living inventory of backend routes and their auth/guard posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx Outdated
Comment threadapps/frontend/src/containers/approvePantries.tsx
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one other thing: is the test.ico actually needed here?

Comment threadapps/backend/src/auth/AUTH_AUDIT.md Outdated
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts
Comment threadapps/frontend/src/components/Navbar.tsx
Comment threadapps/frontend/src/containers/adminOrderManagement.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx Outdated
Comment threadapps/frontend/src/containers/userManagement.tsx
Prevents "Donation #undefined" header flash during modal close animation.
Yurika-Kanand others added 2 commits August 14, 2026 18:11
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Yurika-Kan <148014074+Yurika-Kan@users.noreply.github.com>
Yurika-Kanand others added 3 commits August 14, 2026 18:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see a few slack questions in addition to this.

{
index: true,
element: <Homepage />,
element: <Navigate to={ROUTES.LOGIN} replace />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have an issue that, if the user is already logged in, and is supposed to be brought straight to the profile page (one that depends entirely on backend data, unlike the homepage we used to have), itll take 30 seconds for the backend to startup before the user can actually see details on it (right now it just says No Profile Found until then). Im not sure if there is a workaround for this (or maybe its not a big deal since in theory the backend will be permanently running when its in production), but wanted to ask.

Comment threadapps/frontend/src/app.tsx
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts
Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx
@@ -35,8 +35,10 @@ const NewVolunteerModal: React.FC<NewVolunteerModalProps> = ({
const [isOpen, setIsOpen] = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a new bug, where the alert state gets stale.

To reproduce:

  1. Open the "Add New User" modal.
  2. Enter a faulty name/email/phone number.
  3. Close the modal.
  4. Open the modal again, and the error message appears without filling in any fields.

@jiang-h-yjiang-h-y mentioned this pull request Aug 18, 2026
Yurika-Kanand others added 6 commits August 23, 2026 13:58
Drops password/phone (never used by admin-created users) and adds role
directly to the DTO instead of an ad-hoc Omit<> intersection type.
…n cold backend
Previously a single failed getMe() call (e.g. backend still starting up)
permanently showed "Profile not found", with no recovery short of a
manual refresh. Now retries every 3s while the backend is unreachable
(no HTTP response), only giving up on a real auth error response.
Closing via backdrop click or the X button left isEditing stuck true,
so reopening the modal showed the edit form instead of the details
view. Only the Cancel button reset it before. Now onOpenChange resets
isEditing whenever the dialog closes, matching Cancel's behavior.
Requested in review for readability now that public/protected routes
are interleaved without the old homepage route as a visual anchor.
Standardizes filter UX by adding search-to-filter inputs to
adminDonation, approveFoodManufacturers, and approvePantries, matching
the existing pattern in pantry/manufacturer management pages.
…ntity
Backend rejects edit/delete once a donation has reserved items even
while status is still AVAILABLE; mirror that in the details modal.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • Retry profile fetch: cold backend no longer sticks "not found" forever, retries first.
  • Trim SignUpDto: adminCreateUser only uses fields it needs now.
  • Reset isEditing: donation details modal clears edit state on close.
  • Protected routes marker: comment in app.tsx flags where protected routes start.
  • Search in filter dropdowns: manufacturer/pantry filters get search box (adminDonation, approveFoodManufacturers, approvePantries).
  • Hide edit/delete on reserved donations: donationDetailsModal hides edit/delete when items have reserved quantity.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 43 out of 44 changed files in this pull request and generated 3 comments.

Suppressed comments (1)

apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.ts:41

  • The updated validation copy here uses "Secondary phone contact…", but other updated DTOs in this PR use the shorter "Secondary phone…" phrasing. For consistency (and clearer UX), align this message with the others (e.g., "Secondary phone must be a valid US phone number.").
 @IsOptional()
@IsString()
@IsPhoneNumber('US', {
message: 'Secondary phone contact must be a valid US phone number.',
})

Comment threadapps/frontend/src/containers/profilePage.tsx Outdated
Comment on lines 301 to 309
<OrderDetailsModal
orderId={selectedOrderId}
isOpen={selectedOrderId !== null}
onClose={() => {
setSelectedOrderId(null);
navigate(ROUTES.ADMIN_ORDER_MANAGEMENT, { replace: true });
}}
onSuccess={fetchOrders}
/>
Comment threadapps/frontend/src/components/pagination.tsx
Yurika-Kanand others added 4 commits August 23, 2026 16:16
Alert state persisted across modal reopens since only isOpen was reset. clearAlert now runs on every close path (X, Cancel, backdrop, success/fail).
Long badge labels (e.g. "Food Manufacturer") could overflow past the
card's right edge on narrow cards since the header row never wrapped.
… disappears
selectedManufacturers never got reconciled against manufacturerOptions after
a refetch, so deleting a manufacturer's last donation left its name stuck in
the filter state with no visible checkbox to uncheck it, permanently showing
"No donations match the selected filter." Also reset the filter's search
text on close so it doesn't show a stale query with no results.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • stale manufacturer filter stuck showing "No donations match filter" after last matching donation deleted
  • Filter selection now prunes itself against live options on every refetch
  • Search box text now clears when filter dropdown closes

…ut safely
Address Copilot review comments: fetchOrders was resetting currentPages
to 1 on every call, bouncing admin back to page 1 after saving edits
in the order details modal. Also type retryTimeout as possibly
undefined to match how it's actually assigned.
The accepted Copilot autofix (cc953a8) left the closing tag missing
its '>', a JSX syntax error that would fail the build.

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Admin and Volunteer Food Request Management Filter still needs the search added to it, but aside from this looks great!!!

@jiang-h-yjiang-h-y left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! tested that the bugs we surfaced can no longer be reproduced

@Yurika-Kan
Yurika-Kan merged commit 279213a into mainAug 25, 2026
4 checks passed
@Yurika-Kan
Yurika-Kan deleted the yk/admin-bugbash branch August 25, 2026 03:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Yurika-Kan@dburkhart07@jiang-h-y
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Admin Bugbash Fixes - #209

Merged
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash
Aug 25, 2026
Merged

Admin Bugbash Fixes#209
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash

Conversation

@Yurika-Kan

Copy link
Copy Markdown
Collaborator

📝 Description

  • Navbar clears the user only on unauthenticated, killing the load/refresh flicker; phone validation messages reworded.
  • Invalid ?donationId / ?orderId deep links show a "not found" error.
  • Donation Statistics totals fetch is independent of pagination, so "All Pantries" renders on every page.
  • Failed application fetches render an "Unable to Load Applications" error state.
  • Application Review "View Details" uses navigate() instead of href (SPA transition).
  • Cognito errors include the AWS reason and re-throw existing HttpExceptions.
  • Approve Food Manufacturers pagination arrows disable at first/last page.
  • Pantry assignee column checks for active volunteers before falling back to "No Volunteer".
  • User Management shows an "Admin" badge on admin rows.
  • Donation / Pantry / Manufacturer / Order Management show a "no results match filter" state.
  • Order Management table wrapped in overflowX="auto".
  • Removed dev-only "All Pages" nav link.
  • Donation details and delete modals hold the last donation in a ref while closing, fixing focus-trap errors.
  • Admin order table now refreshes auto after allocation edits.

CopilotAI lite review requested due to automatic review settings August 12, 2026 04:17

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bundles a set of admin-facing UI/UX bug fixes across the frontend (empty/error states, pagination behavior, SPA navigation, table overflow, and modal stability) plus backend improvements to validation messages and Cognito error propagation, along with an auth endpoint audit document.

Changes:

  • Improve admin list pages: add “no matching results” / error states, fix pagination behaviors, and enhance navigation/labels.
  • Stabilize donation modals during close (avoid focus-trap/body-lock issues) and refresh admin orders after allocation edits.
  • Update backend phone validation messages and include underlying Cognito/AWS failure reasons in auth errors; add backend auth posture audit doc.

Reviewed changes

Copilot reviewed 19 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
apps/frontend/src/containers/userManagement.tsxAdds an “Admin” badge for admin rows in the volunteer table.
apps/frontend/src/containers/approvePantries.tsxAdds fetch error state UI and switches “View Details” to SPA navigation.
apps/frontend/src/containers/approveFoodManufacturers.tsxAdds fetch error UI, “no matching applications” empty state, SPA navigation, and disables pagination arrows at bounds.
apps/frontend/src/containers/adminPantryManagement.tsxAdds “no pantries / no matching pantries” empty state and refines assignee display to only consider active volunteers.
apps/frontend/src/containers/adminOrderManagement.tsxRefactors order fetch into a reusable callback, adds deep-link “not found” error, refreshes after edits, and adds horizontal overflow for the table.
apps/frontend/src/containers/adminDonationStats.tsxFetches total stats independent of pagination so “All Pantries” totals render on every page.
apps/frontend/src/containers/adminDonation.tsxAdds deep-link “donation not found” error, adds filtered empty state, and renders details modal in a way that supports stable closing.
apps/frontend/src/components/Navbar.tsxAvoids clearing current user during non-unauthenticated transitions; removes dev-only nav link; adjusts label text.
apps/frontend/src/components/forms/fmDeleteDonationModal.tsxHolds the last donation in a ref during close to prevent modal lock/focus issues.
apps/frontend/src/components/forms/donationDetailsModal.tsxHolds the last donation in a ref during close; updates header/details rendering accordingly.
apps/backend/src/users/dtos/userSchema.dto.tsUpdates phone validation message wording.
apps/backend/src/users/dtos/update-user-info.dto.tsUpdates phone validation message wording.
apps/backend/src/pantries/dtos/update-pantry-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/pantries/dtos/pantry-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/manufacturer-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/auth/dtos/sign-up.dto.tsUpdates phone validation message wording.
apps/backend/src/auth/auth.service.tsRe-throws existing HttpExceptions and appends underlying error “reason” to internal server errors.
apps/backend/src/auth/AUTH_AUDIT.mdAdds a living inventory of backend routes and their auth/guard posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx Outdated
Comment threadapps/frontend/src/containers/approvePantries.tsx
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one other thing: is the test.ico actually needed here?

Comment threadapps/backend/src/auth/AUTH_AUDIT.md Outdated
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts
Comment threadapps/frontend/src/components/Navbar.tsx
Comment threadapps/frontend/src/containers/adminOrderManagement.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx Outdated
Comment threadapps/frontend/src/containers/userManagement.tsx
Prevents "Donation #undefined" header flash during modal close animation.
Yurika-Kanand others added 2 commits August 14, 2026 18:11
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Yurika-Kan <148014074+Yurika-Kan@users.noreply.github.com>
Yurika-Kanand others added 3 commits August 14, 2026 18:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see a few slack questions in addition to this.

{
index: true,
element: <Homepage />,
element: <Navigate to={ROUTES.LOGIN} replace />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have an issue that, if the user is already logged in, and is supposed to be brought straight to the profile page (one that depends entirely on backend data, unlike the homepage we used to have), itll take 30 seconds for the backend to startup before the user can actually see details on it (right now it just says No Profile Found until then). Im not sure if there is a workaround for this (or maybe its not a big deal since in theory the backend will be permanently running when its in production), but wanted to ask.

Comment threadapps/frontend/src/app.tsx
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts
Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx
@@ -35,8 +35,10 @@ const NewVolunteerModal: React.FC<NewVolunteerModalProps> = ({
const [isOpen, setIsOpen] = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a new bug, where the alert state gets stale.

To reproduce:

  1. Open the "Add New User" modal.
  2. Enter a faulty name/email/phone number.
  3. Close the modal.
  4. Open the modal again, and the error message appears without filling in any fields.

@jiang-h-yjiang-h-y mentioned this pull request Aug 18, 2026
Yurika-Kanand others added 6 commits August 23, 2026 13:58
Drops password/phone (never used by admin-created users) and adds role
directly to the DTO instead of an ad-hoc Omit<> intersection type.
…n cold backend
Previously a single failed getMe() call (e.g. backend still starting up)
permanently showed "Profile not found", with no recovery short of a
manual refresh. Now retries every 3s while the backend is unreachable
(no HTTP response), only giving up on a real auth error response.
Closing via backdrop click or the X button left isEditing stuck true,
so reopening the modal showed the edit form instead of the details
view. Only the Cancel button reset it before. Now onOpenChange resets
isEditing whenever the dialog closes, matching Cancel's behavior.
Requested in review for readability now that public/protected routes
are interleaved without the old homepage route as a visual anchor.
Standardizes filter UX by adding search-to-filter inputs to
adminDonation, approveFoodManufacturers, and approvePantries, matching
the existing pattern in pantry/manufacturer management pages.
…ntity
Backend rejects edit/delete once a donation has reserved items even
while status is still AVAILABLE; mirror that in the details modal.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • Retry profile fetch: cold backend no longer sticks "not found" forever, retries first.
  • Trim SignUpDto: adminCreateUser only uses fields it needs now.
  • Reset isEditing: donation details modal clears edit state on close.
  • Protected routes marker: comment in app.tsx flags where protected routes start.
  • Search in filter dropdowns: manufacturer/pantry filters get search box (adminDonation, approveFoodManufacturers, approvePantries).
  • Hide edit/delete on reserved donations: donationDetailsModal hides edit/delete when items have reserved quantity.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 43 out of 44 changed files in this pull request and generated 3 comments.

Suppressed comments (1)

apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.ts:41

  • The updated validation copy here uses "Secondary phone contact…", but other updated DTOs in this PR use the shorter "Secondary phone…" phrasing. For consistency (and clearer UX), align this message with the others (e.g., "Secondary phone must be a valid US phone number.").
 @IsOptional()
@IsString()
@IsPhoneNumber('US', {
message: 'Secondary phone contact must be a valid US phone number.',
})

Comment threadapps/frontend/src/containers/profilePage.tsx Outdated
Comment on lines 301 to 309
<OrderDetailsModal
orderId={selectedOrderId}
isOpen={selectedOrderId !== null}
onClose={() => {
setSelectedOrderId(null);
navigate(ROUTES.ADMIN_ORDER_MANAGEMENT, { replace: true });
}}
onSuccess={fetchOrders}
/>
Comment threadapps/frontend/src/components/pagination.tsx
Yurika-Kanand others added 4 commits August 23, 2026 16:16
Alert state persisted across modal reopens since only isOpen was reset. clearAlert now runs on every close path (X, Cancel, backdrop, success/fail).
Long badge labels (e.g. "Food Manufacturer") could overflow past the
card's right edge on narrow cards since the header row never wrapped.
… disappears
selectedManufacturers never got reconciled against manufacturerOptions after
a refetch, so deleting a manufacturer's last donation left its name stuck in
the filter state with no visible checkbox to uncheck it, permanently showing
"No donations match the selected filter." Also reset the filter's search
text on close so it doesn't show a stale query with no results.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • stale manufacturer filter stuck showing "No donations match filter" after last matching donation deleted
  • Filter selection now prunes itself against live options on every refetch
  • Search box text now clears when filter dropdown closes

…ut safely
Address Copilot review comments: fetchOrders was resetting currentPages
to 1 on every call, bouncing admin back to page 1 after saving edits
in the order details modal. Also type retryTimeout as possibly
undefined to match how it's actually assigned.
The accepted Copilot autofix (cc953a8) left the closing tag missing
its '>', a JSX syntax error that would fail the build.

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Admin and Volunteer Food Request Management Filter still needs the search added to it, but aside from this looks great!!!

@jiang-h-yjiang-h-y left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! tested that the bugs we surfaced can no longer be reproduced

@Yurika-Kan
Yurika-Kan merged commit 279213a into mainAug 25, 2026
4 checks passed
@Yurika-Kan
Yurika-Kan deleted the yk/admin-bugbash branch August 25, 2026 03:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Yurika-Kan@dburkhart07@jiang-h-y
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Admin Bugbash Fixes - #209

Merged
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash
Aug 25, 2026
Merged

Admin Bugbash Fixes#209
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash

Conversation

@Yurika-Kan

Copy link
Copy Markdown
Collaborator

📝 Description

  • Navbar clears the user only on unauthenticated, killing the load/refresh flicker; phone validation messages reworded.
  • Invalid ?donationId / ?orderId deep links show a "not found" error.
  • Donation Statistics totals fetch is independent of pagination, so "All Pantries" renders on every page.
  • Failed application fetches render an "Unable to Load Applications" error state.
  • Application Review "View Details" uses navigate() instead of href (SPA transition).
  • Cognito errors include the AWS reason and re-throw existing HttpExceptions.
  • Approve Food Manufacturers pagination arrows disable at first/last page.
  • Pantry assignee column checks for active volunteers before falling back to "No Volunteer".
  • User Management shows an "Admin" badge on admin rows.
  • Donation / Pantry / Manufacturer / Order Management show a "no results match filter" state.
  • Order Management table wrapped in overflowX="auto".
  • Removed dev-only "All Pages" nav link.
  • Donation details and delete modals hold the last donation in a ref while closing, fixing focus-trap errors.
  • Admin order table now refreshes auto after allocation edits.

CopilotAI lite review requested due to automatic review settings August 12, 2026 04:17

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bundles a set of admin-facing UI/UX bug fixes across the frontend (empty/error states, pagination behavior, SPA navigation, table overflow, and modal stability) plus backend improvements to validation messages and Cognito error propagation, along with an auth endpoint audit document.

Changes:

  • Improve admin list pages: add “no matching results” / error states, fix pagination behaviors, and enhance navigation/labels.
  • Stabilize donation modals during close (avoid focus-trap/body-lock issues) and refresh admin orders after allocation edits.
  • Update backend phone validation messages and include underlying Cognito/AWS failure reasons in auth errors; add backend auth posture audit doc.

Reviewed changes

Copilot reviewed 19 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
apps/frontend/src/containers/userManagement.tsxAdds an “Admin” badge for admin rows in the volunteer table.
apps/frontend/src/containers/approvePantries.tsxAdds fetch error state UI and switches “View Details” to SPA navigation.
apps/frontend/src/containers/approveFoodManufacturers.tsxAdds fetch error UI, “no matching applications” empty state, SPA navigation, and disables pagination arrows at bounds.
apps/frontend/src/containers/adminPantryManagement.tsxAdds “no pantries / no matching pantries” empty state and refines assignee display to only consider active volunteers.
apps/frontend/src/containers/adminOrderManagement.tsxRefactors order fetch into a reusable callback, adds deep-link “not found” error, refreshes after edits, and adds horizontal overflow for the table.
apps/frontend/src/containers/adminDonationStats.tsxFetches total stats independent of pagination so “All Pantries” totals render on every page.
apps/frontend/src/containers/adminDonation.tsxAdds deep-link “donation not found” error, adds filtered empty state, and renders details modal in a way that supports stable closing.
apps/frontend/src/components/Navbar.tsxAvoids clearing current user during non-unauthenticated transitions; removes dev-only nav link; adjusts label text.
apps/frontend/src/components/forms/fmDeleteDonationModal.tsxHolds the last donation in a ref during close to prevent modal lock/focus issues.
apps/frontend/src/components/forms/donationDetailsModal.tsxHolds the last donation in a ref during close; updates header/details rendering accordingly.
apps/backend/src/users/dtos/userSchema.dto.tsUpdates phone validation message wording.
apps/backend/src/users/dtos/update-user-info.dto.tsUpdates phone validation message wording.
apps/backend/src/pantries/dtos/update-pantry-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/pantries/dtos/pantry-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/manufacturer-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/auth/dtos/sign-up.dto.tsUpdates phone validation message wording.
apps/backend/src/auth/auth.service.tsRe-throws existing HttpExceptions and appends underlying error “reason” to internal server errors.
apps/backend/src/auth/AUTH_AUDIT.mdAdds a living inventory of backend routes and their auth/guard posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx Outdated
Comment threadapps/frontend/src/containers/approvePantries.tsx
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one other thing: is the test.ico actually needed here?

Comment threadapps/backend/src/auth/AUTH_AUDIT.md Outdated
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts
Comment threadapps/frontend/src/components/Navbar.tsx
Comment threadapps/frontend/src/containers/adminOrderManagement.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx Outdated
Comment threadapps/frontend/src/containers/userManagement.tsx
Prevents "Donation #undefined" header flash during modal close animation.
Yurika-Kanand others added 2 commits August 14, 2026 18:11
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Yurika-Kan <148014074+Yurika-Kan@users.noreply.github.com>
Yurika-Kanand others added 3 commits August 14, 2026 18:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see a few slack questions in addition to this.

{
index: true,
element: <Homepage />,
element: <Navigate to={ROUTES.LOGIN} replace />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have an issue that, if the user is already logged in, and is supposed to be brought straight to the profile page (one that depends entirely on backend data, unlike the homepage we used to have), itll take 30 seconds for the backend to startup before the user can actually see details on it (right now it just says No Profile Found until then). Im not sure if there is a workaround for this (or maybe its not a big deal since in theory the backend will be permanently running when its in production), but wanted to ask.

Comment threadapps/frontend/src/app.tsx
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts
Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx
@@ -35,8 +35,10 @@ const NewVolunteerModal: React.FC<NewVolunteerModalProps> = ({
const [isOpen, setIsOpen] = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a new bug, where the alert state gets stale.

To reproduce:

  1. Open the "Add New User" modal.
  2. Enter a faulty name/email/phone number.
  3. Close the modal.
  4. Open the modal again, and the error message appears without filling in any fields.

@jiang-h-yjiang-h-y mentioned this pull request Aug 18, 2026
Yurika-Kanand others added 6 commits August 23, 2026 13:58
Drops password/phone (never used by admin-created users) and adds role
directly to the DTO instead of an ad-hoc Omit<> intersection type.
…n cold backend
Previously a single failed getMe() call (e.g. backend still starting up)
permanently showed "Profile not found", with no recovery short of a
manual refresh. Now retries every 3s while the backend is unreachable
(no HTTP response), only giving up on a real auth error response.
Closing via backdrop click or the X button left isEditing stuck true,
so reopening the modal showed the edit form instead of the details
view. Only the Cancel button reset it before. Now onOpenChange resets
isEditing whenever the dialog closes, matching Cancel's behavior.
Requested in review for readability now that public/protected routes
are interleaved without the old homepage route as a visual anchor.
Standardizes filter UX by adding search-to-filter inputs to
adminDonation, approveFoodManufacturers, and approvePantries, matching
the existing pattern in pantry/manufacturer management pages.
…ntity
Backend rejects edit/delete once a donation has reserved items even
while status is still AVAILABLE; mirror that in the details modal.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • Retry profile fetch: cold backend no longer sticks "not found" forever, retries first.
  • Trim SignUpDto: adminCreateUser only uses fields it needs now.
  • Reset isEditing: donation details modal clears edit state on close.
  • Protected routes marker: comment in app.tsx flags where protected routes start.
  • Search in filter dropdowns: manufacturer/pantry filters get search box (adminDonation, approveFoodManufacturers, approvePantries).
  • Hide edit/delete on reserved donations: donationDetailsModal hides edit/delete when items have reserved quantity.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 43 out of 44 changed files in this pull request and generated 3 comments.

Suppressed comments (1)

apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.ts:41

  • The updated validation copy here uses "Secondary phone contact…", but other updated DTOs in this PR use the shorter "Secondary phone…" phrasing. For consistency (and clearer UX), align this message with the others (e.g., "Secondary phone must be a valid US phone number.").
 @IsOptional()
@IsString()
@IsPhoneNumber('US', {
message: 'Secondary phone contact must be a valid US phone number.',
})

Comment threadapps/frontend/src/containers/profilePage.tsx Outdated
Comment on lines 301 to 309
<OrderDetailsModal
orderId={selectedOrderId}
isOpen={selectedOrderId !== null}
onClose={() => {
setSelectedOrderId(null);
navigate(ROUTES.ADMIN_ORDER_MANAGEMENT, { replace: true });
}}
onSuccess={fetchOrders}
/>
Comment threadapps/frontend/src/components/pagination.tsx
Yurika-Kanand others added 4 commits August 23, 2026 16:16
Alert state persisted across modal reopens since only isOpen was reset. clearAlert now runs on every close path (X, Cancel, backdrop, success/fail).
Long badge labels (e.g. "Food Manufacturer") could overflow past the
card's right edge on narrow cards since the header row never wrapped.
… disappears
selectedManufacturers never got reconciled against manufacturerOptions after
a refetch, so deleting a manufacturer's last donation left its name stuck in
the filter state with no visible checkbox to uncheck it, permanently showing
"No donations match the selected filter." Also reset the filter's search
text on close so it doesn't show a stale query with no results.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • stale manufacturer filter stuck showing "No donations match filter" after last matching donation deleted
  • Filter selection now prunes itself against live options on every refetch
  • Search box text now clears when filter dropdown closes

…ut safely
Address Copilot review comments: fetchOrders was resetting currentPages
to 1 on every call, bouncing admin back to page 1 after saving edits
in the order details modal. Also type retryTimeout as possibly
undefined to match how it's actually assigned.
The accepted Copilot autofix (cc953a8) left the closing tag missing
its '>', a JSX syntax error that would fail the build.

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Admin and Volunteer Food Request Management Filter still needs the search added to it, but aside from this looks great!!!

@jiang-h-yjiang-h-y left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! tested that the bugs we surfaced can no longer be reproduced

@Yurika-Kan
Yurika-Kan merged commit 279213a into mainAug 25, 2026
4 checks passed
@Yurika-Kan
Yurika-Kan deleted the yk/admin-bugbash branch August 25, 2026 03:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Yurika-Kan@dburkhart07@jiang-h-y
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Admin Bugbash Fixes - #209

Merged
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash
Aug 25, 2026
Merged

Admin Bugbash Fixes#209
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash

Conversation

@Yurika-Kan

Copy link
Copy Markdown
Collaborator

📝 Description

  • Navbar clears the user only on unauthenticated, killing the load/refresh flicker; phone validation messages reworded.
  • Invalid ?donationId / ?orderId deep links show a "not found" error.
  • Donation Statistics totals fetch is independent of pagination, so "All Pantries" renders on every page.
  • Failed application fetches render an "Unable to Load Applications" error state.
  • Application Review "View Details" uses navigate() instead of href (SPA transition).
  • Cognito errors include the AWS reason and re-throw existing HttpExceptions.
  • Approve Food Manufacturers pagination arrows disable at first/last page.
  • Pantry assignee column checks for active volunteers before falling back to "No Volunteer".
  • User Management shows an "Admin" badge on admin rows.
  • Donation / Pantry / Manufacturer / Order Management show a "no results match filter" state.
  • Order Management table wrapped in overflowX="auto".
  • Removed dev-only "All Pages" nav link.
  • Donation details and delete modals hold the last donation in a ref while closing, fixing focus-trap errors.
  • Admin order table now refreshes auto after allocation edits.

CopilotAI lite review requested due to automatic review settings August 12, 2026 04:17

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bundles a set of admin-facing UI/UX bug fixes across the frontend (empty/error states, pagination behavior, SPA navigation, table overflow, and modal stability) plus backend improvements to validation messages and Cognito error propagation, along with an auth endpoint audit document.

Changes:

  • Improve admin list pages: add “no matching results” / error states, fix pagination behaviors, and enhance navigation/labels.
  • Stabilize donation modals during close (avoid focus-trap/body-lock issues) and refresh admin orders after allocation edits.
  • Update backend phone validation messages and include underlying Cognito/AWS failure reasons in auth errors; add backend auth posture audit doc.

Reviewed changes

Copilot reviewed 19 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
apps/frontend/src/containers/userManagement.tsxAdds an “Admin” badge for admin rows in the volunteer table.
apps/frontend/src/containers/approvePantries.tsxAdds fetch error state UI and switches “View Details” to SPA navigation.
apps/frontend/src/containers/approveFoodManufacturers.tsxAdds fetch error UI, “no matching applications” empty state, SPA navigation, and disables pagination arrows at bounds.
apps/frontend/src/containers/adminPantryManagement.tsxAdds “no pantries / no matching pantries” empty state and refines assignee display to only consider active volunteers.
apps/frontend/src/containers/adminOrderManagement.tsxRefactors order fetch into a reusable callback, adds deep-link “not found” error, refreshes after edits, and adds horizontal overflow for the table.
apps/frontend/src/containers/adminDonationStats.tsxFetches total stats independent of pagination so “All Pantries” totals render on every page.
apps/frontend/src/containers/adminDonation.tsxAdds deep-link “donation not found” error, adds filtered empty state, and renders details modal in a way that supports stable closing.
apps/frontend/src/components/Navbar.tsxAvoids clearing current user during non-unauthenticated transitions; removes dev-only nav link; adjusts label text.
apps/frontend/src/components/forms/fmDeleteDonationModal.tsxHolds the last donation in a ref during close to prevent modal lock/focus issues.
apps/frontend/src/components/forms/donationDetailsModal.tsxHolds the last donation in a ref during close; updates header/details rendering accordingly.
apps/backend/src/users/dtos/userSchema.dto.tsUpdates phone validation message wording.
apps/backend/src/users/dtos/update-user-info.dto.tsUpdates phone validation message wording.
apps/backend/src/pantries/dtos/update-pantry-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/pantries/dtos/pantry-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/manufacturer-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/auth/dtos/sign-up.dto.tsUpdates phone validation message wording.
apps/backend/src/auth/auth.service.tsRe-throws existing HttpExceptions and appends underlying error “reason” to internal server errors.
apps/backend/src/auth/AUTH_AUDIT.mdAdds a living inventory of backend routes and their auth/guard posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx Outdated
Comment threadapps/frontend/src/containers/approvePantries.tsx
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one other thing: is the test.ico actually needed here?

Comment threadapps/backend/src/auth/AUTH_AUDIT.md Outdated
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts
Comment threadapps/frontend/src/components/Navbar.tsx
Comment threadapps/frontend/src/containers/adminOrderManagement.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx Outdated
Comment threadapps/frontend/src/containers/userManagement.tsx
Prevents "Donation #undefined" header flash during modal close animation.
Yurika-Kanand others added 2 commits August 14, 2026 18:11
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Yurika-Kan <148014074+Yurika-Kan@users.noreply.github.com>
Yurika-Kanand others added 3 commits August 14, 2026 18:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see a few slack questions in addition to this.

{
index: true,
element: <Homepage />,
element: <Navigate to={ROUTES.LOGIN} replace />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have an issue that, if the user is already logged in, and is supposed to be brought straight to the profile page (one that depends entirely on backend data, unlike the homepage we used to have), itll take 30 seconds for the backend to startup before the user can actually see details on it (right now it just says No Profile Found until then). Im not sure if there is a workaround for this (or maybe its not a big deal since in theory the backend will be permanently running when its in production), but wanted to ask.

Comment threadapps/frontend/src/app.tsx
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts
Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx
@@ -35,8 +35,10 @@ const NewVolunteerModal: React.FC<NewVolunteerModalProps> = ({
const [isOpen, setIsOpen] = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a new bug, where the alert state gets stale.

To reproduce:

  1. Open the "Add New User" modal.
  2. Enter a faulty name/email/phone number.
  3. Close the modal.
  4. Open the modal again, and the error message appears without filling in any fields.

@jiang-h-yjiang-h-y mentioned this pull request Aug 18, 2026
Yurika-Kanand others added 6 commits August 23, 2026 13:58
Drops password/phone (never used by admin-created users) and adds role
directly to the DTO instead of an ad-hoc Omit<> intersection type.
…n cold backend
Previously a single failed getMe() call (e.g. backend still starting up)
permanently showed "Profile not found", with no recovery short of a
manual refresh. Now retries every 3s while the backend is unreachable
(no HTTP response), only giving up on a real auth error response.
Closing via backdrop click or the X button left isEditing stuck true,
so reopening the modal showed the edit form instead of the details
view. Only the Cancel button reset it before. Now onOpenChange resets
isEditing whenever the dialog closes, matching Cancel's behavior.
Requested in review for readability now that public/protected routes
are interleaved without the old homepage route as a visual anchor.
Standardizes filter UX by adding search-to-filter inputs to
adminDonation, approveFoodManufacturers, and approvePantries, matching
the existing pattern in pantry/manufacturer management pages.
…ntity
Backend rejects edit/delete once a donation has reserved items even
while status is still AVAILABLE; mirror that in the details modal.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • Retry profile fetch: cold backend no longer sticks "not found" forever, retries first.
  • Trim SignUpDto: adminCreateUser only uses fields it needs now.
  • Reset isEditing: donation details modal clears edit state on close.
  • Protected routes marker: comment in app.tsx flags where protected routes start.
  • Search in filter dropdowns: manufacturer/pantry filters get search box (adminDonation, approveFoodManufacturers, approvePantries).
  • Hide edit/delete on reserved donations: donationDetailsModal hides edit/delete when items have reserved quantity.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 43 out of 44 changed files in this pull request and generated 3 comments.

Suppressed comments (1)

apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.ts:41

  • The updated validation copy here uses "Secondary phone contact…", but other updated DTOs in this PR use the shorter "Secondary phone…" phrasing. For consistency (and clearer UX), align this message with the others (e.g., "Secondary phone must be a valid US phone number.").
 @IsOptional()
@IsString()
@IsPhoneNumber('US', {
message: 'Secondary phone contact must be a valid US phone number.',
})

Comment threadapps/frontend/src/containers/profilePage.tsx Outdated
Comment on lines 301 to 309
<OrderDetailsModal
orderId={selectedOrderId}
isOpen={selectedOrderId !== null}
onClose={() => {
setSelectedOrderId(null);
navigate(ROUTES.ADMIN_ORDER_MANAGEMENT, { replace: true });
}}
onSuccess={fetchOrders}
/>
Comment threadapps/frontend/src/components/pagination.tsx
Yurika-Kanand others added 4 commits August 23, 2026 16:16
Alert state persisted across modal reopens since only isOpen was reset. clearAlert now runs on every close path (X, Cancel, backdrop, success/fail).
Long badge labels (e.g. "Food Manufacturer") could overflow past the
card's right edge on narrow cards since the header row never wrapped.
… disappears
selectedManufacturers never got reconciled against manufacturerOptions after
a refetch, so deleting a manufacturer's last donation left its name stuck in
the filter state with no visible checkbox to uncheck it, permanently showing
"No donations match the selected filter." Also reset the filter's search
text on close so it doesn't show a stale query with no results.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • stale manufacturer filter stuck showing "No donations match filter" after last matching donation deleted
  • Filter selection now prunes itself against live options on every refetch
  • Search box text now clears when filter dropdown closes

…ut safely
Address Copilot review comments: fetchOrders was resetting currentPages
to 1 on every call, bouncing admin back to page 1 after saving edits
in the order details modal. Also type retryTimeout as possibly
undefined to match how it's actually assigned.
The accepted Copilot autofix (cc953a8) left the closing tag missing
its '>', a JSX syntax error that would fail the build.

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Admin and Volunteer Food Request Management Filter still needs the search added to it, but aside from this looks great!!!

@jiang-h-yjiang-h-y left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! tested that the bugs we surfaced can no longer be reproduced

@Yurika-Kan
Yurika-Kan merged commit 279213a into mainAug 25, 2026
4 checks passed
@Yurika-Kan
Yurika-Kan deleted the yk/admin-bugbash branch August 25, 2026 03:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Yurika-Kan@dburkhart07@jiang-h-y
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Admin Bugbash Fixes - #209

Merged
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash
Aug 25, 2026
Merged

Admin Bugbash Fixes#209
Yurika-Kan merged 41 commits into
mainfrom
yk/admin-bugbash

Conversation

@Yurika-Kan

Copy link
Copy Markdown
Collaborator

📝 Description

  • Navbar clears the user only on unauthenticated, killing the load/refresh flicker; phone validation messages reworded.
  • Invalid ?donationId / ?orderId deep links show a "not found" error.
  • Donation Statistics totals fetch is independent of pagination, so "All Pantries" renders on every page.
  • Failed application fetches render an "Unable to Load Applications" error state.
  • Application Review "View Details" uses navigate() instead of href (SPA transition).
  • Cognito errors include the AWS reason and re-throw existing HttpExceptions.
  • Approve Food Manufacturers pagination arrows disable at first/last page.
  • Pantry assignee column checks for active volunteers before falling back to "No Volunteer".
  • User Management shows an "Admin" badge on admin rows.
  • Donation / Pantry / Manufacturer / Order Management show a "no results match filter" state.
  • Order Management table wrapped in overflowX="auto".
  • Removed dev-only "All Pages" nav link.
  • Donation details and delete modals hold the last donation in a ref while closing, fixing focus-trap errors.
  • Admin order table now refreshes auto after allocation edits.

CopilotAI lite review requested due to automatic review settings August 12, 2026 04:17

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR bundles a set of admin-facing UI/UX bug fixes across the frontend (empty/error states, pagination behavior, SPA navigation, table overflow, and modal stability) plus backend improvements to validation messages and Cognito error propagation, along with an auth endpoint audit document.

Changes:

  • Improve admin list pages: add “no matching results” / error states, fix pagination behaviors, and enhance navigation/labels.
  • Stabilize donation modals during close (avoid focus-trap/body-lock issues) and refresh admin orders after allocation edits.
  • Update backend phone validation messages and include underlying Cognito/AWS failure reasons in auth errors; add backend auth posture audit doc.

Reviewed changes

Copilot reviewed 19 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
apps/frontend/src/containers/userManagement.tsxAdds an “Admin” badge for admin rows in the volunteer table.
apps/frontend/src/containers/approvePantries.tsxAdds fetch error state UI and switches “View Details” to SPA navigation.
apps/frontend/src/containers/approveFoodManufacturers.tsxAdds fetch error UI, “no matching applications” empty state, SPA navigation, and disables pagination arrows at bounds.
apps/frontend/src/containers/adminPantryManagement.tsxAdds “no pantries / no matching pantries” empty state and refines assignee display to only consider active volunteers.
apps/frontend/src/containers/adminOrderManagement.tsxRefactors order fetch into a reusable callback, adds deep-link “not found” error, refreshes after edits, and adds horizontal overflow for the table.
apps/frontend/src/containers/adminDonationStats.tsxFetches total stats independent of pagination so “All Pantries” totals render on every page.
apps/frontend/src/containers/adminDonation.tsxAdds deep-link “donation not found” error, adds filtered empty state, and renders details modal in a way that supports stable closing.
apps/frontend/src/components/Navbar.tsxAvoids clearing current user during non-unauthenticated transitions; removes dev-only nav link; adjusts label text.
apps/frontend/src/components/forms/fmDeleteDonationModal.tsxHolds the last donation in a ref during close to prevent modal lock/focus issues.
apps/frontend/src/components/forms/donationDetailsModal.tsxHolds the last donation in a ref during close; updates header/details rendering accordingly.
apps/backend/src/users/dtos/userSchema.dto.tsUpdates phone validation message wording.
apps/backend/src/users/dtos/update-user-info.dto.tsUpdates phone validation message wording.
apps/backend/src/pantries/dtos/update-pantry-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/pantries/dtos/pantry-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.tsUpdates secondary contact phone validation message wording.
apps/backend/src/foodManufacturers/dtos/manufacturer-application.dto.tsUpdates phone and secondary contact phone validation message wording.
apps/backend/src/auth/dtos/sign-up.dto.tsUpdates phone validation message wording.
apps/backend/src/auth/auth.service.tsRe-throws existing HttpExceptions and appends underlying error “reason” to internal server errors.
apps/backend/src/auth/AUTH_AUDIT.mdAdds a living inventory of backend routes and their auth/guard posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx Outdated
Comment threadapps/frontend/src/containers/approvePantries.tsx
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one other thing: is the test.ico actually needed here?

Comment threadapps/backend/src/auth/AUTH_AUDIT.md Outdated
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts Outdated
Comment threadapps/backend/src/pantries/dtos/pantry-application.dto.ts
Comment threadapps/frontend/src/components/Navbar.tsx
Comment threadapps/frontend/src/containers/adminOrderManagement.tsx
Comment threadapps/frontend/src/containers/adminPantryManagement.tsx Outdated
Comment threadapps/frontend/src/containers/approveFoodManufacturers.tsx Outdated
Comment threadapps/frontend/src/containers/userManagement.tsx
Prevents "Donation #undefined" header flash during modal close animation.
Yurika-Kanand others added 2 commits August 14, 2026 18:11
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Yurika-Kan <148014074+Yurika-Kan@users.noreply.github.com>
Yurika-Kanand others added 3 commits August 14, 2026 18:19
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see a few slack questions in addition to this.

{
index: true,
element: <Homepage />,
element: <Navigate to={ROUTES.LOGIN} replace />,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have an issue that, if the user is already logged in, and is supposed to be brought straight to the profile page (one that depends entirely on backend data, unlike the homepage we used to have), itll take 30 seconds for the backend to startup before the user can actually see details on it (right now it just says No Profile Found until then). Im not sure if there is a workaround for this (or maybe its not a big deal since in theory the backend will be permanently running when its in production), but wanted to ask.

Comment threadapps/frontend/src/app.tsx
Comment threadapps/backend/src/auth/dtos/sign-up.dto.ts
Comment threadapps/frontend/src/components/forms/donationDetailsModal.tsx
@@ -35,8 +35,10 @@ const NewVolunteerModal: React.FC<NewVolunteerModalProps> = ({
const [isOpen, setIsOpen] = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found a new bug, where the alert state gets stale.

To reproduce:

  1. Open the "Add New User" modal.
  2. Enter a faulty name/email/phone number.
  3. Close the modal.
  4. Open the modal again, and the error message appears without filling in any fields.

@jiang-h-yjiang-h-y mentioned this pull request Aug 18, 2026
Yurika-Kanand others added 6 commits August 23, 2026 13:58
Drops password/phone (never used by admin-created users) and adds role
directly to the DTO instead of an ad-hoc Omit<> intersection type.
…n cold backend
Previously a single failed getMe() call (e.g. backend still starting up)
permanently showed "Profile not found", with no recovery short of a
manual refresh. Now retries every 3s while the backend is unreachable
(no HTTP response), only giving up on a real auth error response.
Closing via backdrop click or the X button left isEditing stuck true,
so reopening the modal showed the edit form instead of the details
view. Only the Cancel button reset it before. Now onOpenChange resets
isEditing whenever the dialog closes, matching Cancel's behavior.
Requested in review for readability now that public/protected routes
are interleaved without the old homepage route as a visual anchor.
Standardizes filter UX by adding search-to-filter inputs to
adminDonation, approveFoodManufacturers, and approvePantries, matching
the existing pattern in pantry/manufacturer management pages.
…ntity
Backend rejects edit/delete once a donation has reserved items even
while status is still AVAILABLE; mirror that in the details modal.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • Retry profile fetch: cold backend no longer sticks "not found" forever, retries first.
  • Trim SignUpDto: adminCreateUser only uses fields it needs now.
  • Reset isEditing: donation details modal clears edit state on close.
  • Protected routes marker: comment in app.tsx flags where protected routes start.
  • Search in filter dropdowns: manufacturer/pantry filters get search box (adminDonation, approveFoodManufacturers, approvePantries).
  • Hide edit/delete on reserved donations: donationDetailsModal hides edit/delete when items have reserved quantity.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 43 out of 44 changed files in this pull request and generated 3 comments.

Suppressed comments (1)

apps/backend/src/foodManufacturers/dtos/update-manufacturer-application.dto.ts:41

  • The updated validation copy here uses "Secondary phone contact…", but other updated DTOs in this PR use the shorter "Secondary phone…" phrasing. For consistency (and clearer UX), align this message with the others (e.g., "Secondary phone must be a valid US phone number.").
 @IsOptional()
@IsString()
@IsPhoneNumber('US', {
message: 'Secondary phone contact must be a valid US phone number.',
})

Comment threadapps/frontend/src/containers/profilePage.tsx Outdated
Comment on lines 301 to 309
<OrderDetailsModal
orderId={selectedOrderId}
isOpen={selectedOrderId !== null}
onClose={() => {
setSelectedOrderId(null);
navigate(ROUTES.ADMIN_ORDER_MANAGEMENT, { replace: true });
}}
onSuccess={fetchOrders}
/>
Comment threadapps/frontend/src/components/pagination.tsx
Yurika-Kanand others added 4 commits August 23, 2026 16:16
Alert state persisted across modal reopens since only isOpen was reset. clearAlert now runs on every close path (X, Cancel, backdrop, success/fail).
Long badge labels (e.g. "Food Manufacturer") could overflow past the
card's right edge on narrow cards since the header row never wrapped.
… disappears
selectedManufacturers never got reconciled against manufacturerOptions after
a refetch, so deleting a manufacturer's last donation left its name stuck in
the filter state with no visible checkbox to uncheck it, permanently showing
"No donations match the selected filter." Also reset the filter's search
text on close so it doesn't show a stale query with no results.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Yurika-Kan

Copy link
Copy Markdown
CollaboratorAuthor
  • stale manufacturer filter stuck showing "No donations match filter" after last matching donation deleted
  • Filter selection now prunes itself against live options on every refetch
  • Search box text now clears when filter dropdown closes

…ut safely
Address Copilot review comments: fetchOrders was resetting currentPages
to 1 on every call, bouncing admin back to page 1 after saving edits
in the order details modal. Also type retryTimeout as possibly
undefined to match how it's actually assigned.
The accepted Copilot autofix (cc953a8) left the closing tag missing
its '>', a JSX syntax error that would fail the build.

@dburkhart07dburkhart07 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Admin and Volunteer Food Request Management Filter still needs the search added to it, but aside from this looks great!!!

@jiang-h-yjiang-h-y left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! tested that the bugs we surfaced can no longer be reproduced

@Yurika-Kan
Yurika-Kan merged commit 279213a into mainAug 25, 2026
4 checks passed
@Yurika-Kan
Yurika-Kan deleted the yk/admin-bugbash branch August 25, 2026 03:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Yurika-Kan@dburkhart07@jiang-h-y