Клиника — фронтенд на «Глаголе»
Всё, что ниже в рамке, нарисовано кодом, скомпилированным из «Глагола» в 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-й аргумент — стартовая команда ---
запусти вид обновление начало загрузка