# Доработки модуля ввода данных

### Бизнес-требования

- Пользователь должен видеть корректную подпись и форматирование строки итогов, без схлопывания текста и с явным словом «Итого»; ввод и отображение должны соответствовать типу данных полей.
- После удаления строк идентификаторы строк должны оставаться последовательными и предсказуемыми для ссылок, формул и интеграций.
- Наличие комментария к ячейке должно быть заметно в интерфейсе без открытия каждой ячейки.
- Ограничения видимости столбцов формы, заданные в DIS для пользователя, не должны обходиться при открытии той же формы во Fastboard: пользователь не видит столбцы, которые ему запрещены.
- В модальных окнах со длинными списками выбора должен быть быстрый поиск по списку.
- В базовом и режиме редактирования доступность элементов настройки и работы с формой должна соответствовать правилам: выражение настраивается только в режиме редактирования; строка итогов доступна всегда; бизнес-процесс виден в режиме редактирования, но не настраивается; консолидация работает в штатном режиме без лишних ограничений.

### Решение

#### Строка итогов

##### Пользовательский интерфейс

Расположение:

- Модуль ввода данных → ПКМ по форме → Добавить/редактировать строку итогов → Модальное окно редактирования строки итогов

Изменения:

- Добавить чекбокс "Показывать подпись «Итого» в первом столбце", по умолчанию не выбран 
    - Если выбран чекбокс "Показывать подпись «Итого» в первом столбце", то для первого столбца в блоке выбора операции агрегирования будет недоступен раскрывающийся список
- В раскрывающихся списках для выбора агрегации недоступны варианты, которые не применимы для типа данных столбца: функции СУММ, СРЗНАЧ, ПРОИЗВЕД, МАКС, МИН не работают на столбцах с НЕ числовым типом данных

##### Системная логика – фронтенд

- Если выбран чекбокс "Показывать подпись «Итого» в первом столбце", то блокируется возможность подсчета итогов по этому столбцу, в этом столбце в строке итогов пишется "Итого"+
- В раскрывающихся списках для каждого столбца должны быть только те варианты агрегации, которые доступны для указанного типа: 
    - Для типов "Целое число" и "Дробное число" – все варианты агрегации
    - Для остальных типов – варианты агрегации НЕ СЧИТАТЬ, СЧЁТ, СЧЁТЗ

#### Пересчёт идентификаторов строк при удалении

##### Системная логика – бэкенд

При выполнении запроса на удаление (table/{tableId}/batch с передачей в теле запроса непустого массива delete) пересчитывать идентификаторы в системном столбце id заново, начиная с 1 по порядку без пропусков и возвращать на фронт

#### Визуальная индикация комментария к ячейке

##### Пользовательский интерфейс

Расположение:

- Модуль ввода данных → ячейки формы

Изменения:

- Ячейка с комментарием отличается от ячейки без комментария: добавляется маркер угла
- При наведении на ячейку с маркером комментария доступен просмотр текста комментария.

##### Системная логика – бэкенд

- Возвращать на фронт вместе с данными ячеек метку hasComments логического типа для каждой ячейки формы: True, если есть хотя бы один комментарий, False, если нет ни одного комментария
- Возвращать на фронт вместе с меткой комментария список комментов массивом объектов: 
    - каждый объект включает в себя текст комментария, автора, дату и время создания,
    - отдельный массив для каждой ячейки с комментариями

##### Системная логика – фронтенд

- При наличии комментария у ячейки (hasComments = "True") рисовать маркер на углу ячейки
- При наведении курсора на ячейку с комментариями показывать во всплывающем окне комментарии списком в формате: 
    - Блок первого комментария: 
        - Автор + дата/время
        - Комментарий
        - Строка отступа
    - Блок второго комментария
    - и т.д. для всех комментариев
- Если комментариев больше 5, то показывать последние 5

#### Согласованность ограничений видимости столбцов МВД и Fastboard (CLS)

Краткий сценарий:

- МВД отдает в FB список в формате: юзер айди в FB: список запрещенных столбцов
- Бэк FB создает таблицу-связь между юзерами и источниками-МВД
- В этой таблице-связи указываются userId, sourceId, bannedColumns – запрещенные колонки
- Фронт запрашивает file\_preview от имени юзера. Бэк отдает только те колонки, которых нет в bannedColumns
- При вызове запроса на формирование скрипта с колонкой, которая недоступна пользователю (например, при вызове script/{id}/table/without-save) не пропускать такие запросы с возвратом ошибки
- Если есть возможность, контролировать загрузку данных из таких источников: например, устанавливать constraint для столбцов для определенных юзеров

##### Системная логика – бэкенд МВД

- При получении запроса PUT table/{tableId}/access/columns на обновление прав доступа к таблице передавать в Fastboard тело запроса с фронта: 
    - Заменяя user\_id на user\_id в Fastboard
    - Добавляя table\_id той формы, из которой пришли изменения
    - Оставляя только can\_read, игнорируя can\_edit

```json
{
  "table_id": "id",
  [
      {
          "column_name": "string",
          "permissions": [
              {
                  "user_id": "id",
                  "can_read": "boolean"
              }
          ]
      },
      {
          "column_name": "string",
          "permissions": []
      }
  ]
}

```

##### Системная логика – бэкенд Fastboard

- Требуется таблица-связь пользователей с источниками, необходимо, чтобы в этой таблице было поле bannedColumns (запрещенные столбцы)
- Настроить получение от МВД запросов на ограничение доступов к столбцам определенных источников, определенных пользователей: 
    - Если для user\_id и table\_id приходит column\_name с permission.can\_read = "False", то в таблицу-связь этого юзера и этой таблицы источника-МВД добавляется значение column\_name в bannedColumns
- При любых запросах с фронта к этой таблице возвращать только те столбцы, которых нет в bannedColumns (например, в запросе file\_preview)
- При вызове запроса на формирование скрипта с колонкой, которая недоступна пользователю (например, при вызове script/{id}/table/without-save) не пропускать такие запросы с возвратом ошибки
- Если есть возможность, контролировать загрузку данных из таких источников: например, устанавливать constraint для столбцов таблиц для определенных юзеров 
    - Если такой возможности нет, написать об этом в таске

#### Поиск по спискам в модальных окнах

Проблема: во многих полях ввода есть шеврон для раскрытия списка, но самого списка, по сути, нет – система отдает в формате подсказки возможные варианты. Некоторые списки некорректны, так как вызываются из окна одной таблицы, а должны ссылаться на другую таблицу

##### Пользовательский интерфейс

Расположение полей без списков:

- МВД → ПКМ по ячейке таблицы → 
    - Настроить выражение → Добавить правило → Целевая колонка
    - Консолидация → Добавить источник → 
        - Таблица источник
        - Добавить сопоставление ключей → 
            - Исходный ключ
            - Ключевая колонка текущей таблицы
        - Добавить сопоставление значений → 
            - Исходное значение
            - Колонка текущей таблицы

Расположение списков с лишним значением:

- МВД → ПКМ по ячейке таблицы → Настроить бизнес-процесс → Включить → 
    - Начальный статус
    - Переходы между статусами → 
        - Из статуса
        - В статус
- Фильтры → Выберите колонку

**Изменения**:

- Для полей без списков – заменить на раскрывающиеся списки
- Для списков с лишними значениями – убрать дефолтное значение из списка, по умолчанию подставляется первое значение из набора данных

##### Системная логика – фронтенд

- Реализовать в указанных в пользовательском интерфейсе местах раскрывающиеся списки
- Во всех списках по умолчанию стоит первое из доступных значений
- Свободный ввод (как в поле ввода) запрещён
- Подтягивать в эти списки значения: 
    - В целевую колонку бизнес-правил – все колонки открытой таблицы
    - В таблицу-источник в консолидации – все таблицы всех доступных проектов, первыми в списке идут таблицы текущего проекта, если имеются (кроме той таблицы, из которой вызвана консолидация)
    - В исходный ключи и исходное значение консолидации: 
        - При наличии выбранной таблицы-источника – поля выбранной таблицы-источника
        - При отсутствии выбранной таблицы-источника – ничего
    - В ключевую колонку текущей таблицы и колонку текущей таблицы консолидации – поля из текущей таблицы
- Удалить первое значение в указанных в пользовательском интерфейсе раскрывающихся списках

##### Системная логика – бэкенд

Возвращать в ответ на запрос search не только проекты и таблицы, но и столбцы всех этих таблиц

#### Режим редактирования

##### Пользовательский интерфейс

Контекстное меню ячейки в режиме редактирования (с максимальным уровнем прав):

- Консолидация
- Настроить выражение
- Массовая операция по подмножеству
- Добавить строку итогов
- ———————————
- Добавить строку ниже
- Добавить строку выше
- Удалить строку

Контекстное меню ячейки в базовом режиме (с максимальным уровнем прав):

- Режим редактирования
- Редактировать форму
- Настроить права доступа
- ———————————
- Консолидация
- Настроить бизнес-процесс
- Добавить строку итогов
- Показать ID
- ———————————
- Импорт из Excel
- Экспорт в Excel
- ———————————
- Комментарий ячейки
- История ячейки

##### Системная логика – фронтенд

- Перегруппировать контекстные меню (см. порядок в пользовательском интерфейсе)
- Добавить разделители в контекстные меню (см. порядок в пользовательском интерфейсе)
- Изменить доступность кнопок: 
    - Настроить выражение: настройка доступна только при включённом режиме редактирования; в базовом режиме недоступна.
    - Массовая операция по подмножеству: только в режиме редактирования
    - Строка итогов: работает всегда, вне зависимости от режима.
    - Настроить бизнес-процесс: в режиме редактирования отображается только интерфейсная часть текущего процесса, элементы настройки привязки и параметров недоступны
    - Настроить права доступа: только в базовом режиме
    - Консолидация: работает всегда, вне зависимости от режима.

### Критерии приёмки

Строка итогов:

- Открыть модальное окно добавления или редактирования строки итогов (ПКМ по форме → Добавить/редактировать строку итогов) – отображается чекбокс «Показывать подпись «Итого» в первом столбце», по умолчанию не выбран.
- Включить чекбокс, сохранить настройки и открыть форму – в строке итогов в первом столбце отображается «Итого»; при повторном открытии модального окна для первого столбца список операций агрегирования недоступен.
- Открыть список агрегации для столбца типа «Целое число» или «Дробное число» – в списке доступны все операции, включая СУММ, СРЗНАЧ, ПРОИЗВЕД, МАКС, МИН.
- Открыть список агрегации для столбца с любым другим типом – доступны только НЕ СЧИТАТЬ, СЧЁТ, СЧЁТЗ; СУММ, СРЗНАЧ, ПРОИЗВЕД, МАКС, МИН отсутствуют или недоступны.

Пересчёт идентификаторов строк при удалении:

- Включить «Показать ID», зафиксировать номера в столбце id – номера отображаются.
- Удалить одну или несколько строк из середины таблицы – в столбце id остаётся непрерывная нумерация с 1 без пропусков; оставшиеся строки редактируются и сохраняются без ошибок.

Визуальная индикация комментария к ячейке:

- Добавить комментарий к ячейке и сохранить – у ячейки появляется маркер в углу.
- Просмотреть таблицу после добавления комментариев в разные ячейки – ячейки с комментариями отличаются маркером, ячейки без комментариев – без маркера.
- Навести курсор на ячейку с одним или несколькими комментариями – во всплывающем окне для каждого комментария отображаются автор, дата и время, текст.
- Добавить в одну ячейку более пяти комментариев, навести курсор – во всплывающем окне отображаются пять последних комментариев с автором, датой и текстом.

Согласованность ограничений видимости столбцов МВД и Fastboard (CLS):

- В МВД запретить тестовому пользователю чтение одного или нескольких столбцов формы – права сохранены.
- Открыть ту же форму во Fastboard под этим пользователем – запрещённых столбцов нет в таблице и при предпросмотре.
- Под пользователем с запретом выполнить действие с недоступным столбцом (например формирование скрипта) – операция не выполняется, отображается понятная ошибка.
- Открыть форму во Fastboard под пользователем с полным доступом – отображаются все столбцы формы.

Раскрывающиеся списки в модальных окнах и полях настройки:

- Открыть настройку выражения, консолидации, бизнес-процесса или фильтр в перечисленных в ТЗ полях – вместо свободного ввода отображается раскрывающийся список, произвольный текст ввести нельзя.
- Открыть любое из этих окон без предварительного выбора – в каждом списке по умолчанию выбрано первое доступное значение, пустая строка не подставлена.
- Открыть «Целевую колонку» в правиле выражения – в списке только колонки открытой таблицы.
- Открыть «Таблицу-источник» в консолидации – в списке таблицы доступных проектов, таблицы текущего проекта в начале; таблица, из которой открыта консолидация, отсутствует.
- Открыть консолидацию без выбранной таблицы-источника – списки «Исходный ключ» и «Исходное значение» пусты; выбрать таблицу-источник – в списках появляются поля выбранной таблицы.
- Открыть настройку бизнес-процесса или фильтр – в списках «Начальный статус», «Из статуса», «В статус», «Выберите колонку» нет пустого значения по умолчанию, сразу доступны реальные статусы или колонки.

Режим редактирования:

- Открыть контекстное меню ячейки в базовом режиме (максимальный уровень прав) – порядок пунктов и разделители соответствуют ТЗ; пунктов «Настроить выражение» и «Массовая операция по подмножеству» нет.
- Включить режим редактирования, открыть контекстное меню – порядок пунктов и разделители соответствуют ТЗ; пункта «Настроить права доступа» нет.
- В базовом режиме вызвать «Добавить строку итогов» и «Консолидация» – окна открываются; повторить в режиме редактирования – окна также открываются.
- В режиме редактирования вызвать «Настроить выражение» и «Массовая операция по подмножеству» – функции доступны; в базовом режиме эти пункты в меню отсутствуют или недоступны.
- В базовом режиме вызвать «Настроить права доступа» – окно открывается; в режиме редактирования пункта в меню нет.
- В режиме редактирования открыть «Настроить бизнес-процесс» – текущий процесс на форме виден, элементы настройки привязки и параметров недоступны для изменения.