Зал: выбор мест
Схема зала, в которой посетитель выбирает места пальцем: кино, театр, площадка.

Блок «Зал» рисует схему кресел и даёт посетителю выбрать места нажатием. Собирать его из кнопок не нужно: ряд на четырнадцать мест — это четырнадцать кнопок с четырнадцатью действиями, а зал на сто мест после этого нельзя поправить.
Зал описывается текстом — строка на ряд. Это же и есть способ нарисовать проходы и назначить цены:
Партер
A: 1-12
B: 1-6, 8-14
C: 1-10 11-20 (800, VIP)- Метка ряда — до двоеточия. Что угодно:
A,1,Балкон. - Пропущенный номер — это проход. В
B: 1-6, 8-14на месте седьмого будет дыра: проход задаётся той же нумерацией, которая у зала и так есть. - Разрыв без запятой — тоже проход.
C: 1-10 11-20ставит проход посередине, хотя нумерация сплошная и дыру взять неоткуда. Так же читаются1-10 | 11-20и[1-10][11-20], и проходов в ряду может быть сколько угодно. Запомнить надо одно: запятая ряд продолжает, всё остальное — разрывает. - Сколько пробелов — столько пустых мест.
C: 1-10 11-20— проход шириной в три кресла. Так проход из одного ряда встаёт на ту же вертикаль, что и в соседнем: зал с широким проходом посередине пишется пробелами, а не подгонкой номеров. Со знаком (|,/,[]) проход остаётся в одну клетку — пробелы вокруг знака считаются оформлением. - Пустая строка — поперечный проход между блоками рядов.
- Строка без двоеточия — заголовок сектора:
Партер,Балкон,Амфитеатр. Подпись встаёт поперёк зала над своими рядами. - В скобках — цена и категория:
(800),(800, VIP). Цена стоит у ряда — значит и «ряды по разной цене» пишутся здесь же:1: 1-20 (2000),2: 1-20 (1500). Цена нужна, чтобы выбранные места складывались в сумму сами.
Зал шире экрана телефона возят пальцем вбок, а открывается он серединой, а не левым краем. Если мест много, кресла ужимаются и номера на них пропадают — тогда над залом появляются «+» и «−», и то же самое делает щипок двумя пальцами: приблизили — номера вернулись. Метки рядов при этом держатся у краёв экрана и уезжать вместе с залом не умеют, так что ряд видно всегда. Кнопки можно убрать: «Вид» → «Кнопки масштаба».
Выбранные места ложатся в список в памяти приложения — тот же, с которым работает корзина. Поэтому «Итого», форма заявки и оплата читают их без единой настройки: {{seats.count}} — сколько мест, {{seats.sum.price}} — на какую сумму, {{seats.join.code}} — сами места одной строкой, «A-5, A-6».
Занятые места зал берёт из таблицы: укажите её в «Какие места уже заняты», назовите столбец с кодом места и — если в таблице лежат билеты на все сеансы сразу — отбор по сеансу. Отбор пишется так же, как у списка. В столбце может лежать и несколько мест через запятую: заказ на три кресла — это одна строка.
Рядом с отбором стоит «Не продавать место дважды». Включите — и одно кресло на один сеанс достанется тому, кто нажал первым: сервер занимает места вместе с заявкой, а второму отвечает отказом и называет занятые кресла. На схеме они у него перекрашиваются в занятые сразу, и из выбранного пропадают сами — считать заново «Итого» не нужно.
Если за место платят внутри приложения, поставьте рядом «Держать место до оплаты, мин» — 10–20 обычно достаточно. Тогда бронь получает срок: не оплатили — кресло вернулось в зал само, и разбирать брошенные заявки руками не нужно. Оплата снимает срок совсем: заказ становится билетом, и место закреплено навсегда. Отменённый платёж возвращает кресло сразу, не дожидаясь конца срока.
Пока бронь ждёт оплаты, у её строки есть {{item.__holdUntil}} — момент, до которого место закреплено. Из него получается честная строка на экране оплаты: «Держим места до 19:45».
Несколько залов — одна схема на зал. Над текстом зала переключатель «Своя схема / Из таблицы». Заведите таблицу «Залы» со столбцом типа «Схема зала», у сеансов — связь с залом, а выбранный сеанс запоминайте переменной «строка из таблицы». В режиме «Из таблицы» панель сама предложит путь к схеме — например «session → Зал → Схема», то есть {{session.hall.layout}}, — и покажет, на сколько мест рисуется зал. Занятые места отбирайте по тому же сеансу: столбец «Сеанс» в билетах и значение {{session.id}}.
Где: Палитра блоков → «Коммерция» → «Зал». Готовый экран целиком — «Экраны» → «Выбор мест»: в нём уже связаны «Залы», «Сеансы» и «Билеты», и выбор сеанса меняет зал.