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>
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>
- 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>