- Replace CDN bootstrap with local /lib/bootstrap/ - CDN SRI hash was
mismatching and blocking the script entirely (no Bootstrap = no modals)
- Fix addEventListener null error: script runs before @section FormActions
renders the button, so use document-level event delegation instead
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Razor section forwarding across nested layouts is unreliable.
Modal div and script are now directly in Edit.cshtml body (not in
any section) so they are always in the DOM when the page renders.
Button uses addEventListener instead of inline onclick to decouple
from layout rendering order.
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Views are now recompiled on request without needing a full rebuild.
This makes .cshtml changes take effect immediately during development.
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
autocomplete=off is ignored by Chrome/Firefox when a password field is
present - they clear the username value after page load. Use
autocomplete=new-password on both fields to signal a new-credential
context and prevent autofill interference.
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Use AsNoTracking() on all EmailChannelRepository read methods to prevent
EF identity conflict when Update() attaches a new entity with same key
- Move test modal to @section Scripts rendered at end of <body> so
bootstrap.Modal is available and modal is not nested inside card DOM
- Add @RenderSection('Scripts') forwarding in _EditorLayout to bubble
child scripts sections up to _Layout
- Switch Test button to programmatic bootstrap.Modal() open instead of
data-bs-toggle (more reliable across layout section boundaries)
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The development static web assets manifest embedded a stale C:\src\ path,
crashing the app on startup via UseStaticWebAssets(). Disabling the manifest
is correct for a containerized service — wwwroot files are still copied to
bin output and served normally via UseStaticFiles().
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- POST /admin/channels/{id}/test — direct SMTP send via MailKit
- Test button shown only on existing channels (not create)
- Bootstrap modal with recipient email input and spinner
- Inline success/error result inside the modal
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- _EditorLayout renders FormActions section outside <form> in the DOM
- Added id='templateForm' to form, form='templateForm' to submit button (HTML5 form association)
- Added migrator env override in docker-compose.Development.yml so connection string is not read from \
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Base compose has no ports (env overrides define them)
- Dev override maps api to 5200:8080
- Web Dockerfile updated to reference .Web project name
Ref: IT-628
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- wwwroot was missing, causing UseStaticFiles warning on startup
- appsettings.Development.json now overrides port to 5433 (Docker dev mapping)
Ref: IT-634
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>