### Компонент периода повторения {#repeat}

Компонент формы "Период повторения" позволяет задавать 
период повторения.

В режиме редактирования представляет собой 
[выпадающий список](#combobox) с вариантами периода:

*   Нет
*   По дням недели
*   По дням месяца
*   Ежегодно

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

Содержимое экрана зависит от того, какой выбран вариант 
периода повторения.

**Общее для всех вариантов экранов**

Во всех экранах заголовок содержит название варианта 
периода повторения. Кнопка "Готово" имеет фиксированное 
положение. Вся остальная область экрана прокручиваема.

Выбор значений в экране не является обязательным - 
проверка на обязательность заполнения данного 
компонента осуществляется на этапе сохранения формы 
либо переключении режима формы.

При открытии экрана в нем уже являются выделенными 
плашки / ячейки только тех значений, что сохранены в 
форме. Т.е. выбранные, но еще не сохраненные в форме, 
значения при переключении вариантов периода обнулятся.

Все варианты периода повторения поддерживают 
множественный выбор путем выделения (действие tap) 
соответствующих значений.

**По дням недели.**

![По дням недели](resources/img/forms/repeat_week.png)

![По дням недели](resources/img/forms/iOS/repeat_week_ios.png)

+---------------------+-------------------------+------------------------------+
| Элемент управления  | Расположение на экране  | Описание                     |
+=====================+=========================+==============================+
| По дням недели      | Верхняя панель          | Заголовок экрана             |
+---------------------+-------------------------+------------------------------+
| %сетка_дней_недели% | Вверху основной области | Панель с днями недели        |
+---------------------+-------------------------+------------------------------+
| Готово              | Внизу                   | Кнопка                       |
+---------------------+-------------------------+------------------------------+

Панель содержит список дней недели:

*   `Понедельник`
*   `Вторник`
*   `Среда`
*   `Четверг`
*   `Пятница`
*   `Суббота`
*   `Воскресенье`

В правой части каждого элемента списка находится 
флажок, показывающий, выбран данный день недели или 
нет. Нажатие по любой области плашки включает / 
выключает данный флажок.

**По дням месяца.**

![По дням месяца](resources/img/forms/repeat_month.png)

![По дням месяца](resources/img/forms/iOS/repeat_month_ios.png)

+---------------------+-------------------------+------------------------------+
| Элемент управления  | Расположение на экране  | Описание                     |
+=====================+=========================+==============================+
| По дням месяца      | Верхняя панель          | Заголовок экрана             |
+---------------------+-------------------------+------------------------------+
| %сетка_31_дня%      | Вверху основной области | Панель с 31 календарными     |
|                     |                         | днями                        |
+---------------------+-------------------------+------------------------------+
| Готово              | Внизу                   | Кнопка                       |
+---------------------+-------------------------+------------------------------+

Панель содержит календарные дни с `1` по `31`. 
Разделение на дни недели отсутствует, сетка всегда 
заполнена строго от верхнего левого угла панели.

Выделение и выбор дня месяца осуществляется нажатием 
на число (действие tap), соответствующая ячейка сетки 
выделяется фоном. Повторное выделение снимает этот 
выбор.

**Ежегодно.**

![Ежегодно](resources/img/forms/repeat_year.png)

![Ежегодно](resources/img/forms/iOS/repeat_year_ios.png)

+---------------------+-------------------------+------------------------------+
| Элемент управления  | Расположение на экране  | Описание                     |
+=====================+=========================+==============================+
| Ежегодно            | Верхняя панель          | Заголовок экрана             |
+---------------------+-------------------------+------------------------------+
| `<`                 | Вверху основной области | Кнопка перехода к            |
|                     | (слева)                 | предыдущему месяцу           |
+---------------------+-------------------------+------------------------------+
| %название_месяца%   | Вверху основной области | Выпадающий список месяцев    |
+---------------------+-------------------------+------------------------------+
| `>`                 | Вверху основной области | Кнопка перехода к следующему |
|                     | (справа)                | месяцу                       |
+---------------------+-------------------------+------------------------------+
| %сетка_дней_месяца% | После месяца            | Панель с днями выбранного    |
|                     |                         | месяца                       |
+---------------------+-------------------------+------------------------------+
| Выбрано:            | После панели с днями    | Список выбранных дней (в     |
|                     |                         | виде тегов)                  |
+---------------------+-------------------------+------------------------------+
| Готово              | Внизу                   | Кнопка                       |
+---------------------+-------------------------+------------------------------+

Панель содержит календарные дни выбранного месяца. 
Выбор месяца осуществляется несколькими способами:

*   при каждом открытии экрана в нем, по умолчанию, 
    выбран текущий месяц на сервере;

*   [выпадающий список](#combobox) над панелью 
    отображает текущий выбранный месяц, по его 
    нажатию можно выбрать другой месяц:
    
    *   `Январь`
    *   `Февраль`
    *   `Март`
    *   `Апрель`
    *   `Май`
    *   `Июнь`
    *   `Июль`
    *   `Август`
    *   `Сентябрь`
    *   `Октябрь`
    *   `Ноябрь`
    *   `Декабрь`

*   возможно переключение на предыдущий месяц 
    (относительно выбранного) с помощью кнопки 
    ![](resources/img/forms/elements/prev_month.png) 
    либо свайпом слева направо;

*   аналогично, возможно переключение на следующий 
    месяц (относительно выбранного) с помощью кнопки 
    ![](resources/img/forms/elements/next_month.png) 
    либо свайпом справа налево;

*   прокрутка вкладок циклическая: если выбрать 
    месяц декабрь и переключиться на следующий месяц, 
    то отобразится январь, и наоборот.

Разделение на дни недели отсутствует, сетка всегда 
заполнена строго от верхнего левого угла панели. 
Количество дней зависит от месяца (при этом февраль 
всегда содержит 29 дней).

Выделение и выбор дня месяца осуществляется нажатием 
на число (действие tap): соответствующая ячейка сетки 
выделяется фоном, в список выбранных добавляется тег, 
при этом фокус остается на панели (это актуально для 
случая, когда количество тегов таково, что экран 
прокручивается). Повторное выделение снимает этот 
выбор, а также удаляет тег. Смена месяца не отменяет 
предыдущий выбор в других месяцах.

Надпись "Выбрано:" отображается только в том случае, 
когда выбрано хотя бы одно значение в сетке (иначе 
отсутствует вовсе). Каждому выбранному значению 
соответствует тег в данном списке в формате:

`%день_(простой_формат)%  %мес%`

где простой формат означает использование числа 1 
вместо 01, а `%мес%` - это первые три буквы месяца.

Все теги имеют одинаковую ширину: такую, чтобы на 
одну строку поместилось 4 тега. Они сортируются в 
порядке возрастания даты на календаре. Например, 
`1 мар` будет расположено левее и/или выше `1 апр`.

> Примечание.
> 
> Таким образом, выделение новых значений компонента 
> может добавлять тег не только в конец списка, но и 
> в его начало и/или середину, и это не является
> ошибкой платформы или мобильного клиента.

По нажатию на тег необходимо выдавать системное 
диалоговое окно подтверждения его удаления:

`Вы действительно хотите удалить тег %тег%?`

Утвердительный ответ удаляет тег и снимает 
соответствующее выделение в сетке календаря.

