Диалоговые окна
Возможности ViewManager
«Точки входа»
IViewManager позволяет показывать предопределённый набор встроенных в iikoFront диалоговых окон. Эта возможность доступна плагину, когда iikoFront в рамках модальной операции передаёт ему управление, вызывая соответствующий метод и передавая в него одним из аргументов экземпляр IViewManager. Данный объект актуален только в рамках метода, в который он приходит, и будет уничтожен, когда плагин вернёт управление из этого метода.
Примеры модальных операций:
- Вызов обработчика нажатия на кнопку, добавленную плагином в меню «Дополнения».
- Взаимодействие с реализованным в плагине типом оплаты: процесс сбора данных, проведения и возврата оплаты (см. IExternalPaymentProcessor) (см. статью про API внешних типов оплаты)
Общий принцип
Плагин вызывает метод  и обрабатывает результат: var result = viewManager.ShowSomething(...). В зависимости от сигнатуры конкретного метода плагин получит либо переменную примитивного типа (bool, int, string), либо экземпляр одной из реализаций IInputDialogResult, в зависимости от семантики.
Если бизнес-логика требует валидации введенного значения (например, при вводе номера гостиничной комнаты нужно проверить, что такой номер есть в гостинице), то правильный подход такой:
- пользователь закрывает диалоговое окно,
- плагин валидирует результат,
- если валидация не проходит, диалоговое окно показывается вновь.

Для уведомлений, не требующих явной реакции пользователя, рекомендуется использовать немодальные всплывающие окна (см. notification, warning,  error), они не требуют экземпляра IViewManager, поэтому их можно показать в любой момент.
Описание доступных возможностей
Диалог с одной кнопкой
ShowOkPopup() показывает диалоговое окно с заголовком, текстом и кнопкой «OK», закрывающей диалог.

ShowErrorPopup() показывает диалоговое окно с заголовком «Ошибка», текстом и кнопкой «Закрыть».

Диалог с двумя кнопками «Да»/«Нет»
ShowYesNoPopup() показывает диалоговое окно с заголовком, текстом и двумя кнопками и возвращает true, если нажали «Да».

Диалог выбора элемента из списка
ShowChooserPopup() в качестве параметров принимает список строк и опционально индекс выбранного по умолчанию элемента, а возвращает индекс выбранного пользователем элемента. Имеет обёртку, принимающую список объектов и функцию получения текстового представления объекта Func<T, string> , опционально выбранный по умолчанию элемент, а возвращает выбранный пользователем элемент. Если элемент не был выбран пользователем (нажата «Отмена»), возвращается -1 или null. Необязательным параметром можно задать ширину кнопок в списке. Чем у́же одна кнопка, тем больше колонок с кнопками влезет на одну страницу. По умолчанию, кнопки имеют ширину ButtonWidth.Normal.

Диалог ввода произвольных строк
ShowKeyboard() показывает диалоговое окно с экранной клавиатурой. Можно задать следующие параметры:
- начальный текст
- допускается ли многострочный ввод
- ограничение по длине вводимой строки
- нужно ли превращать первые буквы каждого вводимого слова в заглавные (удобно для ввода имён собственных)
- маскировать ли ввод (если подразумевается ввод пароля)

Диалог ввода чисел
Для ввода числа можно использовать ShowInputDialog() с параметром type = InputTypes.Number и опциональным параметром initialValue – начальное значение. Чтобы интерпретировать результат ввода, нужно привести возвращаемый IInputDialogResult к NumberInputDialogResult.

Диалог ввода числовых строк
Кроме упомянутого выше метода, есть ShowExtendedInputDialog(). Одним из его параметров является класс настроек ExtendedInputDialogSettings. Если в нём задать ExtendedInputDialogSettings.EnableNumericString = true то пользователю будет предложено ввести цифры. Совместно с данной настройкой можно задать и поясняющий текст ExtendedInputDialogSettings.TabTitleNumericString. В отличие от упомянутого выше способа ввода, тут введённые данные представляют собой строку, что позволяет вводить «ведущие нули», а также большие числа, превышающие int. Чтобы интерпретировать результат ввода, нужно привести возвращаемый IInputDialogResult к NumericStringInputDialogResult.

Пример:
var settings = new ExtendedInputDialogSettings
{
    EnableNumericString = true,
    TabTitleNumericString = "Заголовок вкладки для ввода числа"
}
var dialogResult = viewManager.ShowExtendedInputDialog(
                "Заголовок окна", 
                "Подзаголовок, поясняющий что именно нужно ввести пользователю.",
                settings) 
    as NumericStringInputDialogResult;
if (dialogResult == null)
    return;
// analyze result
Диалог ввода штрихкодов
Метод ShowExtendedInputDialog() может быть вызван с настройкой ExtendedInputDialogSettings.EnableBarcode = true, которая идёт совместно с ExtendedInputDialogSettings.TabTitleBarcode. Чтобы интерпретировать результат ввода, нужно привести возвращаемый IInputDialogResult к BarcodeInputDialogResult.
Диалог ввода номеров телефонов
Ещё одна настройка для ShowExtendedInputDialog() — это ExtendedInputDialogSettings.EnablePhone = true, которая идёт совместно с ExtendedInputDialogSettings.TabTitlePhone. В этом случае валидация вводимых пользователем данных будет происходить в соответствии с настройками в системе для телефонных номеров, в поле ввода будет маска с кодом страны. Пока введенные данные не будут валидными, нажать «OK» будет невозможно. Чтобы интерпретировать результат ввода, нужно привести возвращаемый IInputDialogResult к PhoneInputDialogResult.

Диалоги с возможностью прокатки карт
Прокатку карт можно включить и в ShowInputDialog(), и в ShowExtendedInputDialog(). В первом случае нужно указать 
type = InputTypes.Card, во втором – ExtendedInputDialogSettings.EnableCardSlider = true. В обоих случаях, чтобы интерпретировать результат ввода, нужно привести возвращаемый IInputDialogResult к CardInputDialogResult.
Дополнительно
Способы ввода в ShowInputDialog() и ShowExtendedInputDialog() можно комбинировать путём сочетания доступных настроек. Например, можно просить пользователя ввести номер или прокатать карту. В этом случае возвращаемый результат нужно будет пытаться приводить к каждому из ожидаемых типов результатов.
Пример 1 (код):
var result = viewManager.ShowInputDialog(
    "Введите номер комнаты или прокатайте карту",
    InputDialogTypes.Number | InputDialogTypes.Card);
if (result is NumberInputDialogResult numeric)
    Operations.AddNotificationMessage($"Ввели номер {numeric.Number}", "SamplePlugin");
if (result is CardInputDialogResult card)
    Operations.AddNotificationMessage($"Карта с треком {card.FullCardTrack}", "SamplePlugin");
Пример 2 (возможный внешний вид и настройки):

var settings = new ExtendedInputDialogSettings
{
    EnableBarcode = true,
    TabTitleBarcode = "Заголовок вкладки штрихкодов",
    EnableCardSlider = true,
    EnableNumericString = true,
    TabTitleNumericString = "Заголовок вкладки для ввода числа", 
    EnablePhone = true,
    TabTitlePhone = "Ваш поясняющий текст телефону"
};
var dialogResult = viewManager.ShowExtendedInputDialog(
    "Заголовок окна", 
    "Подзаголовок, поясняющий что именно нужно ввести пользователю.",
    settings);
Ещё кое-что о UI
Плагин может показывать свои собственные диалоговые окна, но это уже не является частью iikoFront API. На эту тему есть отдельная статья.