Клиника — фронтенд на «Глаголе»

Всё, что ниже в рамке, нарисовано кодом, скомпилированным из «Глагола» в JavaScript (архитектура Elm: состояние → вид → обновление). Ни строчки рукописного JS — только рантайм rt.js, который исполняет наши данные. Список тянется с сервера через /api/клиника/владельцы.

Загрузка…
БЭКЕНД · сервер остаётся на Java/Spring + JPA (H2) — его исходник и полноценный CRUD смотрите на странице «демо-приложение (бэкенд)». Здесь мы заменили только переднюю часть.

ФРОНТЕНД · браузер · Глагол→JS

Исходник фронтенда — целиком на «Глаголе» (файл клиника-фронт.гл). Сервер транспилирует его в JavaScript при старте и отдаёт как /front.js:

прим Фронтенд «Клиники» — на самом Глаголе (архитектура Elm: состояние → вид → обновление).
прим Отрисовку в DOM и запросы к серверу даёт рантайм rt.js; здесь — только чистые данные и функции.

прим --- элементы интерфейса (обычные данные-АТД; строит их rt.js) ---
тип элемент:
    столбец (дети)
    строка (дети)
    заголовок (текст)
    текст (значение)
    кнопка (метка, сигнал)
    сырой (тег, дети)

прим --- владелец, пришедший с сервера ---
тип владелец:
    влад (ид, имя, фамилия, город, телефон)

прим --- сигналы (события); их шлёт rt.js по кликам ---
тип сигнал:
    загрузить
    показать (список)

прим --- задания (эффекты); их исполняет rt.js ---
тип задание:
    ничего
    запрос (адрес, вид, поля, ответ)

прим --- состояние экрана ---
тип картина:
    экран (владельцы)

прим --- пара «состояние и задание» (обновление с эффектом; дуалис → пара) ---
тип двойка:
    пара (состояние, задание)

прим поля владельца в JSON — в порядке конструктора «влад»
поляВладельца -- это всё: "ид", "имя", "фамилия", "город", "телефон"

прим команда загрузки всех владельцев с сервера
загрузка -- это запрос("/api/клиника/владельцы", "влад", поляВладельца, показать)

прим начальное состояние — пустой экран
начало -- это экран(пустой список)

прим === БИЗНЕС-ЛОГИКА: чистые доменные правила над данными (не отрисовка и не запросы) ===

прим агрегат: сколько владельцев в списке — свёртка рекурсией
число владельцев -- это если владельцы пусты, то 0, иначе 1 плюс (число (хвост владельцев))

прим доменное правило: у владельца без телефона — пометка (правило над данными, не вёрстка)
отметка телефона -- это если (длина телефон) равно 0, то "    ⚠ нет телефона", иначе ""

прим --- карточка одного владельца (здесь применяется бизнес-правило отметки) ---
карточка владельца -- это выбор владельца:
    влад(ид, имя, фамилия, город, телефон), то
        текст (соедини фамилия с ", " с имя с "    город: " с город с "    тел: " с телефон с (отметка телефон))

прим --- список карточек (рекурсия = цикл по владельцам) ---
карточки владельцев -- это если владельцы пусты, то пустой список,
    иначе добавить (карточка (первый владельцев)) к (карточки (хвост владельцев))

прим --- обработка «пусто/сервер недоступен»: показать понятное сообщение вместо белого экрана ---
содержимое владельцев -- это если владельцы пусты,
    то (всё: (текст «Список пуст или сервер недоступен. Нажмите «Обновить список».»)),
    иначе карточки владельцев

прим --- ВИД: чистая функция состояние → дерево элементов ---
вид картины -- это выбор картины:
    экран(владельцы), то столбец(всё:
        (заголовок «Владельцы клиники — фронтенд на Глаголе»),
        (текст (соедини "Всего владельцев: " с (число владельцев))),
        (строка(всё: (кнопка «Обновить список» загрузить))),
        (сырой("div", содержимое владельцев)))

прим --- ОБНОВЛЕНИЕ: чистая функция (состояние, сигнал) → новое состояние [или пара с заданием] ---
обновление картины с сигналом -- это выбор сигнала:
    загрузить, то пара(картина, загрузка)
    показать(список), то экран(список)

прим проверки чистой логики (без браузера) — прогоняются через Node
проверь: (обновление (экран(пустой список)) с (показать(пустой список))) должно равняться (экран(пустой список))
проверь: (карточки (пустой список)) должно равняться пустой список
прим проверки БИЗНЕС-ЛОГИКИ (агрегат и доменное правило — чисто, без браузера):
проверь: (число (пустой список)) должно равняться 0
проверь: (число (всё: 1, 2, 3)) должно равняться 3
проверь: (отметка "") должно равняться "    ⚠ нет телефона"
проверь: (отметка "555-01") должно равняться ""

прим --- запуск приложения (rt.js рисует и слушает); 4-й аргумент — стартовая команда ---
запусти вид обновление начало загрузка