Пространства: бизнес-логика¶
Обзор¶
spaces -- подсистема статей и баз знаний (wiki) в SPA. Пространство -- это категория специального типа (IsWikiSubcat = 1), внутри которой пользователи читают и редактируют статьи. Статья -- задача с контентом в формате EditorJS.
Модель данных (маппинг на сущности системы)¶
| Бизнес-сущность | Сущность в системе | Ключевой признак |
|---|---|---|
| Пространство | Subcategory | IsWikiSubcat = 1 |
| Статья | Task в этой подкатегории | Наличие ExtParam (Content) |
| Контент статьи | ExtParamValues | JSON в формате EditorJS |
| Иерархия (родитель) | ExtParamValues | TaskID родительской статьи |
| Обложка | ExtParamValues | Файл |
| Превью обложки | ExtParamValues | Файл |
| Доп. информация | ExtParamValues | Текст без форматирования |
| Спецраздел | ExtParamValues | "Архив" / "Корзина" / "Вне меню" |
Основные сущности¶
Пространство¶
Контейнер для статей, отображаемый в отдельном блоке меню сервисов. Технически -- подкатегория с флагом IsWikiSubcat.
Все пространства объединены под корневой категорией RootCatId = 3021 ("Пространства").
Статья пространства¶
Контентная запись в пространстве. Каждая статья -- задача со следующими системными полями:
| Поле | Тип | Описание |
|---|---|---|
| Содержимое страницы | TextArea (EditorJS) | Основной контент |
| Дополнительная информация | TextareaWOFormat | Доп. текст |
| Обложка | File | Файл обложки |
| Превью обложки | File | Миниатюра |
| Родительский элемент | NumericValue | TaskID родителя |
| Спецраздел | Select | Архив / Корзина / Вне меню |
Иерархия статей¶
Статьи образуют дерево через ДП "Родительский элемент":
Пространство (SubcatID, IsWikiSubcat=1)
└── Корневая статья (Parent = null, обычная статья)
├── Дочерняя статья (Parent = TaskID корневой)
│ └── Глубже вложенная
└── Дочерняя статья 2
Спецразделы¶
Статьи могут быть помечены спецразделом: - Архив -- не отображается в основном дереве, но доступна по прямой ссылке - Корзина -- "удалённые" статьи (мягкое удаление) - Вне меню -- доступна по ссылке, не в навигации
Ключевые правила¶
- Доступность блока "Пространства" на фронте зависит от настройки рабочего места группы (
SpacesVisible). - Глобально пространства включаются/отключаются через
SpaceSettings.IsActive. - Доступ к отдельным пространствам определяется правами на подкатегории.
- Контент хранится в формате EditorJS (блоки: paragraph, header, code, list, table, image).
- При открытии статьи фиксируется аудит-лог (SpaceService).
- При сохранении статьи фиксируется аудит-лог редактирования.
- Из других подсистем возможны переходы в пространства: из соцсети, из избранного, из оргструктуры, через портальные элементы.
Пользовательские сценарии¶
- Открыть список пространств из меню сервисов.
- Перейти в конкретное пространство, увидеть дерево статей.
- Открыть статью (в полном или коротком режиме).
- Редактировать статью (EditorJS-редактор).
- Создать новую статью в пространстве.
- Перейти по ссылке на статью из избранного/портала/соцсети.
- Посмотреть историю просмотренных/отредактированных статей.
Интерфейс пространств¶
Переход к пространствам — из меню сервисов в панели навигации. В разделе показываются только категории, настроенные как пространства (видимость зависит от прав пользователя).
Экран пространства состоит из двух областей:
- Слева — дерево разделов и статей. Уровень вложенности не ограничен, одна статья не может находиться сразу в нескольких разделах. При открытии статьи дерево подсвечивает её положение.
- Справа — рабочая область с вкладками:
| Вкладка | Что отображается |
|---|---|
| Избранные | Статьи, добавленные в избранное (в порядке добавления) |
| Автор | Статьи, где пользователь — автор (заказчик); сортировка по дате последнего изменения |
| Ответственный | Статьи, где пользователь отмечен как «Ответственный» в поле «Контакты» |
| Подписка | Статьи, где пользователь добавлен в контакты (подписчик) |
Внутри раздела статьи отсортированы по дате создания. По умолчанию статьи пространства не попадают в блок избранного «Мои задачи».
Поиск и номер статьи¶
Кнопка лупы в правом верхнем углу раскрывает поисковую строку. Поиск идёт по содержанию доступных пользователю статей без учёта вкладок. Поиск по названиям пространств выполняется через главный поиск.
В шапке открытой статьи рядом с хлебными крошками отображается её номер (формат #1777172). При наведении появляется иконка копирования: номер копируется с символом #, но в главном поиске находится и без него.
Для возврата к списку всех пространств используется кнопка «Все пространства» в верхней части экрана.
Создание статьи¶
Кнопка "Добавить" доступна пользователю только при наличии права на создание статей в текущем пространстве. Если в пространстве уже есть статьи, новая страница создаётся как подстраница через действие в дереве при наведении на пространство.
Форма создания статьи использует ту же модель, что и задача:
| Поле страницы | Бизнес-смысл |
|---|---|
| Название страницы | Заголовок статьи в дереве и на странице |
| Автор | По умолчанию пользователь, создавший статью; может быть изменён |
| Контакты | Пользователи, отвечающие за статью |
| Содержание | EditorJS-контент статьи |
Обложка статьи загружается отдельным файлом в формате JPG или PNG и отображается в шапке статьи. Удаление обложки выполняется в режиме редактирования через контекстное меню по обложке.
Содержание статьи¶
Контент статьи собирается из блоков EditorJS. Пользователь может добавлять:
| Блок | Правило поведения |
|---|---|
| Параграф | Основной текст; выбран по умолчанию, можно сразу вводить текст |
| Заголовок | Поддерживает 6 уровней, где 1 -- самый крупный |
| Таблица | Поддерживает добавление и удаление строк/колонок, ширину 100%, large, XL, опциональный заголовок |
| Разделитель | Использует символы *** |
| Список | По умолчанию маркированный; может переключаться в нумерованный |
| Изображение | Поддерживает подпись, рамку, растяжение и фон |
| Вложения | Файлы из текста статьи также отображаются в файловом блоке статьи |
| Чеклист | Список пунктов с отметками |
| Цитата | Основной текст цитаты и отдельное поле автора |
| Код | Блок для программного кода |
| Виджет | Встраивает настроенный портальный блок с размером auto, sm, md или lg |
Форматирование доступно для текста внутри большинства блоков: ссылка, жирный, курсив, зачёркивание, подчёркивание, код, цвет текста и фон. Для ссылки поддерживаются горячие клавиши cmd + K / Ctrl + K, для жирного -- cmd + B / Ctrl + B, для курсива -- cmd + I / Ctrl + I.
⚠️ На одном фрагменте текста применяется либо цвет текста, либо цвет фона. При установке одного оформления ранее заданное альтернативное оформление снимается.
Ссылки на видеоконференции и видео автоматически преобразуются в интерактивный блок предпросмотра или встроенный видеоблок.
Редактирование и аудит изменений¶
Кнопка "Редактировать" доступна только пользователю с правом "Администратор задач" в текущем пространстве. В режиме редактирования можно менять содержание, автора, контакты, обложку, полезные ссылки и раздел статьи.
После сохранения в статье отображается время последнего изменения. При наведении на это время показывается пользователь, который последним редактировал статью.
⚠️ Для отображения автора последнего изменения у параметра категории "Пространство - Содержимое страницы" должна быть включена настройка сохранения истории изменений ДП. Административные настройки пространств описаны в admin.md.
Навигация, полезные ссылки и избранное¶
В статье доступны кнопки перехода к предыдущей и следующей странице пространства. На первой странице показывается только переход к следующей статье, на последней -- только переход к предыдущей.
Полезные ссылки используются для второстепенных ссылок, связанных с контекстом статьи: страницы портала, задачи, внешние URL. Важные ссылки рекомендуется размещать в основном содержании статьи, а не только в блоке полезных ссылок.
Статью можно добавить в избранное с выбором цвета и одной или нескольких папок избранного. После добавления статья отображается во вкладке "Избранное" внутри пространства и в общем блоке избранного бокового меню. Настройка видимости блоков рабочего места относится к разделу пользователи и группы.
Действия со статьёй¶
Стандартные действия доступны в меню "Больше действий". Набор действий зависит от прав пользователя:
| Действие | Правило |
|---|---|
| Копировать номер статьи | Копирует идентификатор статьи в буфер обмена |
| Поделиться | Открывает окно с ссылкой на статью |
| Связана | Позволяет связать статью с задачей |
| Переместить | Перемещает статью в текущем пространстве или в другое доступное пространство |
| Дублировать | Создаёт копию текущей страницы со всем содержимым |
| Архивировать | Перемещает страницу в спецраздел "Архив" |
| Удалить | Перемещает страницу в спецраздел "Корзина" |
⚠️ Действия "Переместить", "Дублировать", "Архивировать" и "Удалить" доступны только пользователю с правом "Администратор задач" в текущем пространстве.
Перемещение внутри текущего пространства требует права "Администратор задач". Перемещение в другое пространство требует права "Пакетная обработка" в текущей и целевой категории, а также права создавать задачи в целевом пространстве.
Архив и корзина являются мягкими спецразделами. Чтобы окончательно убрать статью из корзины, её открывают как задачу из дерева категорий и завершают; возврат задачи в активный статус снова делает статью доступной из корзины.
Служебные разделы и дополнительные действия¶
Служебные разделы "Вне меню", "Архив" и "Корзина" видны в списке пространств администраторам и пользователям с правом создавать задачи в категории. В режиме редактирования пользователь может изменить раздел статьи, включая служебные разделы.
Для отдельных пространств администратор может настроить дополнительные действия над статьёй. Они отображаются ниже стандартных действий, отделяются горизонтальной чертой и могут быть сгруппированы в пункт "Другие действия".
Файлы в статье¶
В статью можно вставлять изображения, документы, архивы, видео и аудио. По клику файл открывается в режиме просмотра с информацией и скачиванием; архивы и файлы с неизвестным расширением скачиваются сразу.
Если в файловом блоке нет файлов, блок не отображается при просмотре статьи. В режиме редактирования блок "Файлы" становится видимым, чтобы пользователь мог добавить вложение.
Перекрестные зависимости¶
| Домен | Зависимость |
|---|---|
categories |
тип категории "Пространство" (IsWikiSubcat), права, системные ДП |
ext-params |
6 системных ExtParams, хранение контента, EditorJS |
files |
вложения, изображения и файловый блок внутри статьи |
social-network |
создание статей из формы публикации (ArticlesSubcatId) |
portal |
переходы и отображение контента через блоки |
users-and-groups |
видимость блока пространств, права групп |
tasks |
статья = задача, Tasks API для получения контента |