Почтовый кабинет: регистрация, папки, черновики, вложения, грид @jambotron/aria-grid, интерфейс по synthwave-шаблону

Бэкенд: регистрация со входом сразу и /api/config, профиль и смена пароля, свои папки, PATCH письма
(прочитано, флажок, перенос; Спам ставит отметку), корзина и очистка, черновики, несколько адресатов и копия,
вложения черновика уходят с письмом, вложения и заголовки To/Cc входящих сохраняются, письма заблокированных —
в Спам. Исправлено: загрузка файла (415), колонка content_id (500 на любых вложениях), SPA-маршрут с точкой.
Фронтенд переписан: все таблицы — грид, оформление — шаблон synthwave-design-showcase.html.

α
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 16:41:29 +01:00
parent f605fbfd85
commit 29b1beabe0
70 changed files with 3468 additions and 1737 deletions
+15 -35
View File
@@ -1,43 +1,23 @@
import { Routes } from '@angular/router';
import { authGuard, guestGuard } from './core/auth';
export const routes: Routes = [
{
path: 'login',
loadComponent: () => import('./components/login/login.component'),
},
{
path: 'register',
loadComponent: () => import('./components/register/register.component'),
},
{ path: 'login', canActivate: [guestGuard], loadComponent: () => import('./pages/auth/login.page').then(m => m.LoginPage) },
{ path: 'register', canActivate: [guestGuard], loadComponent: () => import('./pages/auth/register.page').then(m => m.RegisterPage) },
{
path: '',
loadComponent: () => import('./components/layout/layout.component'),
canActivate: [authGuard],
loadComponent: () => import('./pages/shell/shell.component').then(m => m.ShellComponent),
children: [
{
path: 'inbox',
loadComponent: () => import('./components/inbox/inbox.component'),
},
{
path: 'compose',
loadComponent: () => import('./components/compose/compose.component'),
},
{
path: 'message/:id',
loadComponent: () => import('./components/message-detail/message-detail.component'),
},
{
path: 'contacts',
loadComponent: () => import('./components/contacts/contacts.component'),
},
{
path: '',
redirectTo: 'inbox',
pathMatch: 'full',
},
],
},
{
path: '**',
redirectTo: 'login',
{ path: '', pathMatch: 'full', loadComponent: () => import('./pages/inbox-redirect').then(m => m.InboxRedirect) },
{ path: 'folder/:id', loadComponent: () => import('./pages/folder/folder.page').then(m => m.FolderPage) },
{ path: 'message/:id', loadComponent: () => import('./pages/message/message.page').then(m => m.MessagePage) },
{ path: 'compose', loadComponent: () => import('./pages/compose/compose.page').then(m => m.ComposePage) },
{ path: 'contacts', loadComponent: () => import('./pages/contacts/contacts.page').then(m => m.ContactsPage) },
{ path: 'blocked', loadComponent: () => import('./pages/blocked/blocked.page').then(m => m.BlockedPage) },
{ path: 'settings', loadComponent: () => import('./pages/settings/settings.page').then(m => m.SettingsPage) }
]
},
{ path: '**', redirectTo: '' }
];