From 6c5185080f0653f417fc59b06ded2959a49f8874 Mon Sep 17 00:00:00 2001 From: Awakich Date: Thu, 7 May 2026 13:48:02 +0300 Subject: [PATCH 01/24] Add docs/PROJECT.md: workspace overview (stack, sub-projects, path aliases, application layering, cross-cutting blocks, environments, prod/dev-stage cookie isolation, build/CI, routing entry points, kanban-disabled note, planned per-module docs index). - Replace root README stub (Angular CLI 13 leftover) with a short pointer to docs/. --- README.md | 29 ++---- docs/PROJECT.md | 255 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 263 insertions(+), 21 deletions(-) create mode 100644 docs/PROJECT.md diff --git a/README.md b/README.md index ba7fb963d..96ca2a929 100644 --- a/README.md +++ b/README.md @@ -2,28 +2,15 @@ # Procollab -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.3.5. +Frontend-монорепозиторий для социальной платформы Procollab: Angular 17 приложение (`social_platform`) плюс две разделяемые библиотеки (`core`, `ui`). -## Development server +📖 **Вся документация лежит в [`docs/`](docs/).** Начни с [`docs/PROJECT.md`](docs/PROJECT.md) — там обзор воркспейса (стек, под-проекты, слои, окружения, build/CI), а дальше иди по модулям в [`docs/modules/`](docs/modules/). -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. +## Быстрый старт -## Code scaffolding +```bash +npm ci +npm run start:social # ng serve social_platform --open +``` -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. +Полный список скриптов и команд — в [`docs/PROJECT.md`](docs/PROJECT.md). diff --git a/docs/PROJECT.md b/docs/PROJECT.md new file mode 100644 index 000000000..db3426120 --- /dev/null +++ b/docs/PROJECT.md @@ -0,0 +1,255 @@ + + +# Procollab — фронтенд-воркспейс + +Angular-монорепозиторий из трёх под-проектов: приложения `social_platform` и двух разделяемых библиотек (`core`, `ui`). Приложение деплоится в две среды: prod (с ветки `master`) и dev-stage (с ветки `dev`). + +> Документация по конкретным модулям лежит в [`docs/modules/`](modules/), документация по слоям приложения — в [`docs/social-platform/`](social-platform/), документация по библиотеке `core` — в [`docs/core/`](core/), по библиотеке `ui` — в [`docs/uilib.md`](uilib.md). Этот файл — общая карта воркспейса. + +--- + +## Стек + +| Область | Технология | +| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Framework | Angular 17 (standalone components, signals, control-flow `@if/@for`) | +| Язык | TypeScript 5.2 (`strict`, `noImplicitOverride`, `noPropertyAccessFromIndexSignature`, `strictTemplates`, `useDefineForClassFields: false`) | +| Состояние | Signals + собственный дискриминатор `AsyncState` (`initial` / `loading` / `success` / `failure`) | +| Async | RxJS 7.5 | +| HTTP | `ApiService` поверх `HttpClient` + `BearerTokenInterceptor` + `CamelCaseInterceptor` + `LoggingInterceptor` | +| Auth | JWT в cookies через `TokenService`; имена cookie-ключей переключаются между `accessToken`/`refreshToken` и `devAccessToken`/`devRefreshToken` в зависимости от hostname | +| WebSocket | `WebsocketService` с reconnect interval / max attempts из `environment` | +| UI primitives | `@angular/cdk` 16, `@angular/material` 16 (выборочные модули) | +| Стили | SCSS + миксины из `styles/_responsive.scss` (`apply-desktop` ≥ 1000px, `apply-tablet` 750–999px, `apply-tablet-and-above` ≥ 750px) | +| Errors / observability | Sentry (`environment.sentryDns`), `LoggerService` (уровень + timestamp), `GlobalErrorHandler`, `LoggingInterceptor`, `EventBus` для domain-событий | +| Сборка | Angular CLI 17, ng-packagr 17 для библиотек | +| Тесты | Karma + Jasmine 4 (`karma.conf.js`) | +| Lint / format | ESLint, Stylelint, Prettier; `precommit` запускает `lint:scss` и `lint:ts` | +| SVG-спрайт | `svg-sprite` собирает `assets/icons/symbol/svg/sprite.css.svg` из всех файлов в `assets/icons/svg/**/*.svg` | +| Сторонние пакеты | `dayjs`, `class-transformer`, `js-cookie`, `linkifyjs`, `nanoid`, `ng-click-outside`, `ngx-mask`, `ngx-image-cropper`, `ngx-autosize`, `file-saver`, `fuse.js`, `js-base64`, `camelcase-keys`, `snakecase-keys` | +| Node | `~18.16` (CI ставит `18.13` / `18.x`) | + +--- + +## Под-проекты (`angular.json` → `projects`) + +| Проект | Тип | Source root | Назначение | +| ----------------- | ----------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `social_platform` | application | `projects/social_platform/src` | Веб-приложение для пользователей. Содержит всё, что лежит в `app/`: `domain`, `api`, `infrastructure`, `ui`, `utils`, плюс ассеты в `assets/` и шрифты. Это единственный application-проект; library-проекты собираются отдельно через `ng-packagr`. | +| `core` | library | `projects/core/src` | Базовые сервисы и утилиты, которые в принципе могут переехать в любое Angular-приложение: `ApiService`, `TokenService`, HTTP-интерсепторы, пайпы, `LoggerService`, `GlobalErrorHandler`, `ValidationService`, `WebsocketService`, провайдеры (`PRODUCTION`, `API_URL`, `SKILLS_API_URL`), guards (`auth-required`, `projects-edit`, `profile-edit`). Публичный API — `core/src/public-api.ts`, импортируется как `@corelib`. Константы (списки, навигация) лежат отдельно в `core/src/consts/`. | +| `ui` | library | `projects/ui/src` | Layout-компоненты, которые шарятся между приложениями (sidebar, header, profile-info, profile-control-panel, invite-manage-card, subscription-plans), плюс маленький набор примитивов (`avatar`, `back`, `icon`). Публичный API — `ui/src/public-api.ts`, импортируется как `@uilib`; модели — через `uilib/models`. | + +> Большинство UI-примитивов и виджетов (input, modal, dropdown, tag, news-card, detail и т. д.) живёт **внутри** `social_platform` (`app/ui/primitives/*`, `app/ui/widgets/*`), а не в библиотеке `ui`. Туда выносится только то, что переиспользуется между разными приложениями. + +--- + +## TypeScript path aliases (`tsconfig.json` → `compilerOptions.paths`) + +| Alias | Указывает на | +| ------------------- | ---------------------------------------------------------- | +| `@core/*` | `projects/core/src/*` | +| `@corelib` | `projects/core/src/public-api.ts` | +| `@uilib` | `projects/ui/src/public-api.ts` | +| `uilib/models` | `projects/ui/src/models/*` | +| `@domain/*` | `projects/social_platform/src/app/domain/*` | +| `@infrastructure/*` | `projects/social_platform/src/app/infrastructure/*` | +| `@api/*` | `projects/social_platform/src/app/api/*` | +| `@ui/*` | `projects/social_platform/src/app/ui/*` | +| `@pages/*` | `projects/social_platform/src/app/ui/pages/*` | +| `@utils/*` | `projects/social_platform/src/app/utils/*` | +| `@environment` | `projects/social_platform/src/environments/environment.ts` | +| `core` / `ui` | `dist/core` / `dist/ui` (сборочные артефакты библиотек) | + +> Используй aliases в импортах. Глубокие относительные пути через границу проекта (`../../../../core/src/...`) — архитектурный запах: он обходит `public-api.ts` библиотеки и крепит файлы напрямую к её внутренней структуре. + +--- + +## Слои приложения (`projects/social_platform/src/app/`) + +``` +domain/ чистые типы, модели, repository ports, domain events +api/ use-cases (одна операция = один класс) + facades + UI-info services +infrastructure/ реализации репозиториев (HTTP), DTO ↔ domain adapters, DI providers +ui/ routes, pages, widgets, primitives, ui-services (loading/snackbar/nav/notification) +utils/ маленькие чистые хелперы (валидаторы, форматтеры, file-export и т. п.) +``` + +Правила зависимостей: + +``` +ui ─┬──▶ api ──▶ domain ◀── infrastructure + └────────────▶ domain (только для типов) +``` + +Никто не импортирует `infrastructure` напрямую — он подключается DI-провайдерами (`infrastructure/di/.providers.ts`), которые биндят порт к реализации. + +### Подробнее по слоям + +- **`domain/`** — каркас. На каждый домен (auth, project, vacancy, courses, …) есть папка с: + + - `*.model.ts` — TypeScript-интерфейсы и классы доменной модели; + - `ports/*.repository.port.ts` — абстрактные классы (используются как DI-токены) с контрактом репозитория; + - `events/*` — domain events (если используется EventBus); + - `commands/`, `results/` — отдельные структуры команд/результатов use-case'ов в новых модулях. + +- **`api/`** — оркестрация. На каждый домен: + + - `use-cases/..use-case.ts` — один класс на одну операцию, инжектит `*RepositoryPort`, возвращает `Observable` или `Observable>`; + - `facades/*.service.ts` — фасады для UI: хранят `signal>`, вызывают use-case'ы, обрабатывают результат; + - `facades/ui/*.service.ts` — UI-info-сервисы: composed `computed` сигналы поверх фасадов (готовые boolean'ы для `*ngIf`, отфильтрованные списки, форматированные тексты и т. п.). + +- **`infrastructure/`**: + + - `repository//*` — реализации портов, делают HTTP через `ApiService`, держат `EntityCache` где нужно; + - `adapters/*` — трансформации DTO ↔ domain; + - `di/.providers.ts` — `Provider[]` массив, который биндит каждый порт к его реализации (`{ provide: XRepositoryPort, useExisting: XRepository }`). + +- **`ui/`**: + - `routes//*.routes.ts` — лениво подгружаемые группы роутов; + - `pages//...` — страницы (smart-компоненты), потребляют фасады; + - `widgets/*` — переиспользуемые блоки внутри `social_platform` (виджет ≈ используется в одном-двух местах); + - `primitives/*` — атомы (input, button, modal, dropdown, …) — используются повсеместно; + - `services/` — runtime-сервисы UI: `LoadingService`, `SnackbarService`, `NavService`, `NotificationService`. + +### Cross-cutting блоки + +| Блок | Где | Что | +| -------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `AsyncState` | `domain/shared/async-state.ts` | Дискриминатор `{ status: "initial" \| "loading" \| "success" \| "failure" }` с хелперами `initial`, `loading`, `success`, `failure`, `isSuccess`, `isLoading`, `isFailure`. Единый источник правды для состояния асинхронных операций в фасадах. | +| `Result` | `domain/shared/result.type.ts` | `ok(data)` / `fail(error)` для возврата из use-case'ов. Use-case никогда не бросает — всё через `Result`. | +| `EventBus` + domain events | `domain//events/*` + `infrastructure` listeners | Репозитории слушают доменные события и инвалидируют свой `EntityCache`. Развязывает модули между собой. | +| `EntityCache` | `infrastructure/repository/...` | Простой in-memory cache без TTL, инвалидируется через `EventBus` (или вручную). Прикручен к Project, Vacancy, Program репозиториям (см. коммит `49e26046`). | +| `LoggingInterceptor` + `LoggerService` | `core/lib/interceptors`, `core/lib/services/logger` | Структурированные логи с timestamp и уровнем; DEBUG только не в проде. | +| `GlobalErrorHandler` | `core/lib/services/error` | Перехватывает все необработанные ошибки, отдаёт в Sentry + `LoggerService`, показывает дружелюбное сообщение пользователю. | + +--- + +## Окружения + +`fileReplacements` в `angular.json` подменяет `environment.ts` → `environment.prod.ts` для конфигурации `production`. + +| Ключ | dev (`environment.ts`) | prod (`environment.prod.ts`) | +| ---------------------------------- | --------------------------------- | --------------------------------- | +| `production` | `false` | `true` | +| `apiUrl` | `https://dev.procollab.ru` | `https://api.procollab.ru` | +| `skillsApiUrl` | `https://skills.dev.procollab.ru` | `https://api.skills.procollab.ru` | +| `websocketUrl` | `wss://dev.procollab.ru/ws` | `wss://api.procollab.ru/ws` | +| `websocketReconnectionInterval` | `500` мс | `5000` мс | +| `websocketReconnectionMaxAttempts` | `5` | `5` | +| `sentryDns` | общий DSN | общий DSN | + +> На dev-окружении в `environment.ts` есть пометки `// TODO: change it before merge` рядом с `apiUrl` и `websocketUrl` — оставлены сознательно, потому что dev-stage именно с `dev.procollab.ru` и работает. + +### Изоляция cookies между prod и dev-stage + +`TokenService` (`projects/core/src/lib/services/tokens/token.service.ts`) выбирает имена cookie-ключей по hostname: + +| Hostname | Access cookie | Refresh cookie | +| ------------------ | ---------------- | ----------------- | +| `dev.procollab.ru` | `devAccessToken` | `devRefreshToken` | +| Любой другой | `accessToken` | `refreshToken` | + +Это позволяет одному разработчику быть залогиненным одновременно в prod и dev-stage в одном браузере без коллизий по cookie-куки. Прод-cookies дополнительно имеют `domain: ".procollab.ru"`, `secure: true`, `sameSite: "None"` и `expires` через 30 дней (см. `getCookieOptions()`); в dev cookies остаются на текущем хосте с дефолтами браузера. + +--- + +## Сборка, запуск, тесты + +```bash +npm run start:social # ng serve social_platform --open +npm run build:social:dev # build:sprite + ng build social_platform --configuration=development +npm run build:social:prod # build:sprite + ng build social_platform --configuration=production +npm run build:pr # alias для build:social:dev (используется CI для dev-stage) +npm run build:prod # alias для build:social:prod (используется CI для prod) +npm run watch # ng build --watch development + +npm run test # ng test (Karma + Jasmine, headed Chrome) +npm run test:ci # ng test --browsers=Headless --no-watch + +npm run lint:ts # ESLint поверх projects/**/*.ts +npm run lint:scss # Stylelint поверх projects/**/*.scss --fix +npm run format # Prettier write +npm run format:check # Prettier check + +npm run build:sprite # SVG-спрайт из src/assets/icons/svg/**/*.svg +npm run docs:json # Compodoc JSON dump (legacy) +``` + +`precommit` (через пакет `pre-commit`): `lint:scss`, `lint:ts`. Hooks **не пропускаем** через `--no-verify` — если линтер падает, чиним причину. + +`build:sprite` обязательный шаг перед сборкой: он собирает `assets/icons/symbol/svg/sprite.css.svg`, на который завязан `IconComponent` (через ``). + +--- + +## CI/CD + +Два workflow в `.github/workflows/`: + +| Файл | Триггер | Что делает | +| ---------------- | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `deploy.yml` | `push` в `master` (или ручной `workflow_dispatch`) | `npm ci` → `format:check` → `lint:ts` → `build:prod` → `rsync` дистрибутива в `app.procollab.ru:/home/gh_deploy` (секрет `DEPLOY_KEY`). | +| `deploy-dev.yml` | `push` в `dev` | `npm ci` → `format:check` → `lint:ts` → `build:pr` → `rsync` дистрибутива в `dev.procollab.ru:/home/front/app` (секрет `DEPLOY_KEY_FRONT_DEV`). | + +Отдельного PR-preview workflow нет — раньше был `pull_request.yml` с Netlify-превью, на ветке `dev` он удалён. + +Если ломается `format:check` или `lint:ts` — деплой не пойдёт. Перед пушем в `dev` или PR в `master` локально гонять: + +```bash +npm run format:check && npm run lint:ts && npm run build:pr +``` + +--- + +## Точки входа в роутинг + +`projects/social_platform/src/app/app.routes.ts` — корневой `Routes` массив. Лениво подгружаемые группы лежат под `ui/routes//`: + +- **`auth`** — публичные экраны (`ui/routes/auth/`): login, register, email verification, password reset. +- **`office`** — закрытый shell после логина (`ui/routes/office/`). Дочерние роуты: + - `feed` — глобальная лента; + - `members` — список участников платформы; + - `vacancies` — список вакансий, детальная страница; + - `chats` — список чатов и детальные чаты (личные + проектные); + - `projects` — `all`/`my` списки + детальная страница с детьми: `info`, `vacancies`, `team`, `work-section`, `chat`; + - `program` — `list`, `detail/main`, `detail/list` (projects / projects-rating / members), `register`; + - `courses` — `list`, детальная страница с детьми: `info`, `lesson` (и дальнейшие lesson-children); + - `onboarding` — flow первого захода (привязан к office shell, но грузится по своему пути). +- **`error`** — `404` и общая страница ошибки. + +> **Канбан-роуты закомментированы.** `projects/social_platform/src/app/ui/routes/kanban/{kanban,kanban-detail}.routes.ts` и блок `path: "kanban"` внутри `ui/routes/projects/detail.routes.ts` отключены, ссылка «открыть доску задач» в `ui/pages/projects/detail/work-section/work-section.component.html` тоже закомменчена. Код канбана под `domain/kanban`, `api/kanban`, `ui/pages/projects/detail/kanban` и `core/lib/guards/kanban` физически остаётся в репозитории, но в runtime недостижим. Канбан исключён из этой документации. + +--- + +## Карта документации + +Документация по модулям лежит в [`docs/modules/.md`](modules/) по строгому Swagger-подобному шаблону: назначение / domain models / repository ports + impls / use-cases / facades + UI-info / HTTP endpoints / routes / consumers / known issues. Cross-cutting утилиты и маленькие `api/*` пакеты без отдельного домена документируются в [`docs/cross-cutting.md`](cross-cutting.md). + +| Документ | Статус | +| --------------------------------------- | ------- | +| `docs/PROJECT.md` (этот файл) | done | +| `docs/core/services.md` | planned | +| `docs/core/interceptors.md` | planned | +| `docs/core/pipes.md` | planned | +| `docs/core/guards-models.md` | planned | +| `docs/core/consts.md` | planned | +| `docs/uilib.md` | planned | +| `docs/social-platform/architecture.md` | planned | +| `docs/social-platform/shared.md` | planned | +| `docs/social-platform/ui-primitives.md` | planned | +| `docs/social-platform/ui-widgets.md` | planned | +| `docs/modules/auth.md` | planned | +| `docs/modules/profile.md` | planned | +| `docs/modules/skills.md` | planned | +| `docs/modules/specializations.md` | planned | +| `docs/modules/industry.md` | planned | +| `docs/modules/member.md` | planned | +| `docs/modules/project.md` | planned | +| `docs/modules/vacancy.md` | planned | +| `docs/modules/invite.md` | planned | +| `docs/modules/program.md` | planned | +| `docs/modules/courses.md` | planned | +| `docs/modules/news.md` | planned | +| `docs/modules/feed.md` | planned | +| `docs/modules/chat.md` | planned | +| `docs/modules/office-shell.md` | planned | +| `docs/cross-cutting.md` | planned | From 1510a2d472d5abecefdcb3ce08f6f42876c4bc30 Mon Sep 17 00:00:00 2001 From: Awakich Date: Thu, 7 May 2026 14:05:27 +0300 Subject: [PATCH 02/24] docs(core): document the entire core library + drop README stubs Add docs/core/ with five files covering all of projects/core/src: - services.md: 11 services with full method tables, behaviour notes, known bugs (LoggerService PRODUCTION DI token mismatch, ErrorService throwNotFount typo, unused deps in GlobalErrorHandlerService) and architectural debt (core depends on social_platform). - interceptors-providers.md: BearerToken (refresh flow, blob handling, parallel-401 dedup), Camelcase (FormData passthrough), Logging; the three InjectionTokens; missing WEBSOCKET_* tokens. - pipes.md: 16 pipes in one table; DayjsPipe action types; pipes/index.ts gaps. - guards-models.md: 3 active guards (kanban guard noted as disabled); ErrorCode, ErrorMessage (full text table), ApiError, subscription models. - consts.md: folder layout, naming rules (moved from deleted README), every list/filter/navigation/other constant tabulated with kanban-only tags; "how to add a new constant" guide. Mark the five core/ docs as done in docs/PROJECT.md index. Drop README stubs: - projects/core/README.md (superseded by docs/core/*) - projects/core/src/consts/README.md (naming rules folded into docs/core/consts.md) No source changes. JSDoc/inline comments will be a separate phase. --- docs/PROJECT.md | 10 +- docs/core/consts.md | 125 ++++++++++++ docs/core/guards-models.md | 142 +++++++++++++ docs/core/interceptors-providers.md | 104 ++++++++++ docs/core/pipes.md | 58 ++++++ docs/core/services.md | 297 ++++++++++++++++++++++++++++ projects/core/README.md | 234 ---------------------- projects/core/src/consts/README.md | 34 ---- 8 files changed, 731 insertions(+), 273 deletions(-) create mode 100644 docs/core/consts.md create mode 100644 docs/core/guards-models.md create mode 100644 docs/core/interceptors-providers.md create mode 100644 docs/core/pipes.md create mode 100644 docs/core/services.md delete mode 100644 projects/core/README.md delete mode 100644 projects/core/src/consts/README.md diff --git a/docs/PROJECT.md b/docs/PROJECT.md index db3426120..4b9000f50 100644 --- a/docs/PROJECT.md +++ b/docs/PROJECT.md @@ -227,11 +227,11 @@ npm run format:check && npm run lint:ts && npm run build:pr | Документ | Статус | | --------------------------------------- | ------- | | `docs/PROJECT.md` (этот файл) | done | -| `docs/core/services.md` | planned | -| `docs/core/interceptors.md` | planned | -| `docs/core/pipes.md` | planned | -| `docs/core/guards-models.md` | planned | -| `docs/core/consts.md` | planned | +| `docs/core/services.md` | done | +| `docs/core/interceptors-providers.md` | done | +| `docs/core/pipes.md` | done | +| `docs/core/guards-models.md` | done | +| `docs/core/consts.md` | done | | `docs/uilib.md` | planned | | `docs/social-platform/architecture.md` | planned | | `docs/social-platform/shared.md` | planned | diff --git a/docs/core/consts.md b/docs/core/consts.md new file mode 100644 index 000000000..839eeb6ac --- /dev/null +++ b/docs/core/consts.md @@ -0,0 +1,125 @@ + + +# `@corelib` — consts + +Все константы лежат в `projects/core/src/consts/` (вне `lib/`, отдельная иерархия). Не реэкспортируются из `core/src/public-api.ts` — потребители импортируют их через `@core/consts/...` (alias `@core/*` указывает на `projects/core/src/*`). + +## Структура папок + +``` +core/src/consts/ + filters/ # массивы для фильтров (feed, vacancies, ratings) — value/label/id + lists/ # справочники для select-полей (educations, languages, etc.) + navigation/ # элементы боковой/верхней навигации + other/ # всё, что не попало в другие группы (цвета, иконки, profile-fields, kanban-* — см. ниже) +``` + +--- + +## Правила нейминга + +(Сохранено из удалённого `projects/core/src/consts/README.md`.) + +### Имена файлов + +- Формат: `feature.const.ts` +- Стиль: **kebab-case** +- Примеры: `navigation.const.ts`, `selects.const.ts`, `permissions.const.ts` + +### Имена переменных + +- Стиль: **camelCase** +- Если переменная — список, имя во **множественном числе** +- Имя отражает назначение +- Экспорт только через `export const` + +```ts +export const navItems = [...]; +``` + +> На практике это правило соблюдается с отклонениями: исторически встречаются `QuickAnswers`, `KanbanIcons` (PascalCase), `actiionTypeList` (опечатка в имени файла — `actiion-type-list.const.ts` → переменная `actionTypeList`), `workScheludeList` (опечатка `Schelude` вместо `Schedule`). Менять не стоит — это сломает все потребители; помечать как технический долг. + +--- + +## `consts/lists/` — справочники для `` + +Формат каждой константы: `{ id: number, value: string, label: string }[]` (иногда + дополнительные поля). + +| Файл | Экспорт | Где используется | +| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | +| `actiion-type-list.const.ts` | `actionTypeList` (3 элемента: action/call/meet) | Канбан task-detail (выбор типа задачи). | +| `direction-project-list.const.ts` | `directionProjectList` (8 направлений: Технология, IT, Транспорт, Хим Био, Дизайн, Мультимедиа, СоцТех, Урбанистика) | Создание/редактирование проекта. | +| `education-info-list.const.ts` | `educationUserType` (3) + `educationUserLevel` (5) | Profile edit — образование. | +| `language-info-list.const.ts` | `languageNamesList` | Profile edit — языки. | +| `mock-months-list.const.ts` | `mockMonthsList` | Месяцы для дат рождения и т. п. | +| `priority-info-list.const.ts` | `priorityInfoList` (6 приоритетов: бэклог/в ближайшие часы/высокий/средний/низкий/улучшение, с цветом и `priorityType` для бэка) | Канбан task-detail (выбор приоритета). | +| `resource-options-list.const.ts` | `resourceOptionsList` | Project edit — типы ресурсов. | +| `roles-members-list.const.ts` | `rolesMembersList` | Members filters / project team. | +| `track-project-list.const.ts` | `trackProjectList` | Программные треки. | +| `work-experience-list.const.ts` | `workExperienceList` | Vacancy / profile (опыт работы). | +| `work-format-list.const.ts` | `workFormatList` | Vacancy (формат работы — онлайн/гибрид/офис). | +| `work-schelude-list.const.ts` | `workScheludeList` (опечатка) | Vacancy (график). | + +--- + +## `consts/filters/` — конфигурации фильтров + +| Файл | Экспорт | +| --------------------------------- | ---------------------- | +| `feed-filter.const.ts` | `feedFilter` | +| `rating-filter.const.ts` | `ratingFilters` | +| `tags-filter.const.ts` | `tagsFilter` | +| `work-experience-filter.const.ts` | `workExperienceFilter` | +| `work-format-filter.const.ts` | `workFormatFilter` | +| `work-schedule-filter.const.ts` | `workScheduleFilter` | + +Используются виджетами `widgets/feed-filter`, `widgets/projects-filter`, `widgets/vacancy-filter`. Структура — массив групп с фильтрами. + +--- + +## `consts/navigation/` — элементы пошагового редактирования + +| Файл | Экспорт | Что | +| ---------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `nav-profile-items.const.ts` | `navProfileItems` | Шаги редактирования профиля (`main` / `education` / `experience` / `achievements` / `additional`), каждый шаг → `{ step: EditStep, src: iconName, label: string }`. | +| `nav-project-items.const.ts` | `navProjectItems` | Шаги редактирования проекта (`main` / `contacts` / `achievements` / `vacancies` / `team` / `additional`). | + +Тип `EditStep` импортируется из `projects/social_platform/src/app/api/project/project-step.service` — это ещё одна зависимость `core` → `social_platform`. + +--- + +## `consts/other/` + +| Файл | Экспорт | Что | Статус | +| ----------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | +| `profile-fields.const.ts` | `profileFields` | Конфигурация полей профиля: `{ key, type: "array" \| "string" }[]`. Используется при сериализации формы edit. | актив | +| `quick-answers.const.ts` | `QuickAnswers` (PascalCase) | 5 готовых причин отказа от выполнения канбан-задачи. | **используется только канбаном** — модуль отключён | +| `tag-colors.const.ts` | `tagColors` | 10+ цветов для UI-тегов: `{ id, name: string, color: hex }`. | актив (используется в ``) | +| `trajectory-more.const.ts` | `trajectoryMore` | Items для меню "ещё" в траектории курсов. | актив | +| `kanban-column-info.const.ts` | `kanbanColumnInfo` | Опции dropdown для колонки канбана. | **kanban-only**, модуль отключён | +| `kanban-icons.const.ts` | `KanbanIcons` (PascalCase) | Иконки досок канбана. | **kanban-only**, модуль отключён | + +> Канбан-константы (`quick-answers`, `kanban-column-info`, `kanban-icons`) физически остаются в репо вместе с остальной канбан-инфраструктурой — см. [`docs/PROJECT.md` → kanban-disabled](../PROJECT.md#точки-входа-в-роутинг). Импортировать их вне канбан-кода — нет смысла, можно снести вместе с канбаном или дождаться возобновления модуля. + +--- + +## Как добавлять новую константу + +1. Создать `.const.ts` в подходящей папке (`lists/` для справочников `