====== Декларативное описание экранной формы ======
[[start:|lss]]
===== Введение =====
[[form-definition]] - XML описание, по которому строится экранная форма
Работа экранного интерфейса [[Viewer]] грубо выглядит так:
* [[Viewer]] посылает [[Request|запрос]] на сервер
* В [[Response|ответ]] получает описание экранной формы
* По описанию экранная форма отображается и начинает работать
Описание экранной формы декларативно и статично. Оно не меняется в процессе работы формы. Оно практически не содержит программного кода (за исключением динамически вычисляемых выражений), все нестандартное поведение обеспечивается обращением к серверным скриптам.
===== Формат описания экранной формы =====
Описание экранной формы состоит из следующих крупных разделов:
==== Заголовок описания экранной формы ====
* [[form-definition-header | Подробное описание заголовка]]
==== Секция описания наборов строк ====
Изменения в описании источника данных по сравнению с контекстно независимым описанием
Список дочерних наборов строк
...
[[form-definition-rowsets]]
==== Секция описания запросов уровня формы ====
...
...
* [[form-definition-requests | Подробное описание секции запросов]]
==== Секция описания скриптов JavaScript ====
[[form-definition-scripts]]
==== Секция описания начальных значений данных формы ====
==== Секция описания панелей ====
Список полей источника данных
"
mode="<подрежим запроса>"
rowset="<имя набора строк>|#this|#parent|#focus|#form"
caption="<текст>"
description="<подробное описание>"
confirm="<текст>"
lock="0|1"
icon="<иконка>"
enabled="1|0"
js_enabled="<выражение>"
js_visible="<выражение>"
js_confirm="<выражение>"
js_caption="<выражение>"
js_icon="<выражение>"
style="icon|text|icontext"
save="0|1"
close="0|1"
form="<имя формы для запроса form>"
modal="0|1" - для запроса form модальность запускаемой формы
closable="1|0"
width="<ширина>"
height="<высота>"
>
...
...
...
...
...
...
...
[[form-definition-panels]]
==== Секция ====
Содержит описания панелей, из которых собирается экранный интерфейс формы.
=== Полезные атрибуты ===
* **type** - тип панели, в настоящий момент реализованы типы: **panel**, **tab**, **accordion**, **grid**
* **align** - выравнивание: center, left, right, top, bottom
* **rowset** - имя набора строк
=== Дочерние узлы ===
* panels, panel - внутри панели могут содержаться дочерние панели, их описание может группироваться внутри узла , а может лежать непосредственно внутри родительского узла
===== Виды панелей =====
==== panel ====
Панель - контейнер, дочерние панели могут размещаться как:
* align="top" - должна быть понятна высота панели
* align="bottom" - должна быть понятна высота панели
* align="left" - должна быть понятна ширина панели
* align="right" - должна быть понятна ширина панели
* align="center" - должны быть понятны ширина и высота панели
* align=""
==== scroll ====
Панель - контейнер, все дочерние панели размещаются как при align="top". Если суммарная высота дочерних панелей превышает высоту родительской панели, появляется прокрутка
==== tab ====
Контейнер дочерних панелей, в виде TabFrame
* атрибут **bestchild**=1 - отображать только одну (первую подходящую) дочернюю панель. Анализируется row.type и js_visible
* возможность динамически определять **текущую панель** при **смене строки**
* привязать к панели **rowset**, смена строки в котором вызывает смену текущей панели
* у дочерних панелей атрибуты **best**, **js_best** - если у текущей панели признак best, то она остается текущей, иначе первая с признаком best
==== accordion ====
Контейнер дочерних панелей в виде аккордеона
* атрибут **bestchild**=1 - отображать только одну (первую подходящую) дочернюю панель. Анализируется row.type и js_visible
==== grid ====
дополнительные признаки панели
* **style**=grid|report|card
* **waitanimate**="0|1" - отображать ожидание загрузки анимированным gif
* **noheader** - не показывать заголовки 0|1
* **noselect** - не показывать текущую строку 0|1
* **color.readonly**=gray|white
* **mark.icon**=mark|check
дополнительные признаки полей
* **noscroll** - включить поле в непрокручиваемую область слева 0|1
* **clipboard** - возможность выделения текста для переноса в буфер обмена 0|1
* **align** - left|right|center
* **lightclick** - 0|1 обработка легкого нажатия мышки (как для пометки mark), имеет смысл для check и icons
дополнительный тип поля
* type=html - содержимое интерпретируется как HTML, реализована CSS поддержка таблиц для таких полей:
==== tree ====
Панель дерева. Источник данных древовидный. Особым образом обрабатываются атрибуты row:
* **row.type** - тип узла, если дерево состоит из разнородных узлов
* **row.icon** - иконка, если поля нет, то из id.treetype, иначе стандартная
* **row.final** - не может быть дочерних элементов
* **row.empty** - нет дочерних элементов (но могут быть)
Следующие данные берутся из полей, в качестве имен можно использовать стандартные имена, или переопределять их в секции **fields** набора строк. Если набор строк разнородный, и содержит разные описатели fields для разных типов узлов, то для разных типов узлов можно задать разные имена полей
* **name** - поле, из которого брать текст метки, можно переопределить в fields как name="имя поля"
* **description** - поле, из которого брать всплывающую подсказку, можно переопределить в fields как description="имя поля"
дополнительные признаки панели
* **mark.icon**=mark|check
==== treemenu ====
Реализует древовидное меню, умеющее по DblClick запускать экранные формы. Панель аналогична панели **tree**, но использует дополнительный параметр **collapse**, означающий необходимость свернуть панель при запуске экранной формы, и развернуть при получении фокуса ввода на панель:
Особым образом интерпретируются следующие поля набора строк:
* **form** - поле, содержащие имя запускаемой формы, может быть переопределено в секции fields treemenu.form="имя поля"
* **params** - поле, содержащие параметры запускаемой формы, может быть переопределено в секции fields treemenu.params="имя поля"
==== fields ====
Панель позволяет совместно разместить несколько полей набора строк
...
Дополнительные параметры полей:
* line - разные поля, имеющие одинаковые значения этого параметра размещаются вместе в одной строке. Поля, для которых параметр не задан, размещаются с новой строки.
* column - поля, размещенные в разных строках, с одинаковым значением параметра column, совместно выравниваются по левому краю. По умолчанию, первые в колонке поля имеют одинаковое значение этого параметра, и соответственно, совместно выравниваются.
* len - длина содержимого поля в символах
* stretch - расширять
==== attribute ====
Панель атрибутов построена на базе панели **fields**, однако описания и значения полей берутся из таблицы, каждая строка - поле панели attribute. При перечитке таблицы панель перерисовывается, и отображает другие поля.
Для корректной работы, у источника данных панели должны быть следующие поля:
* **caption** - название атрибута
* **type** - тип атрибута: string|num|date|list|radio|memo|ref|caption
* **len** - длина, обычно если не задана, то stretch=1
* **dec** - имеет смысл для атрибутов типа num, знаков после запятой
* **list** - имеет смысл для атрибутов list и radio, значения через ;
* **action** - имя запроса, который надо выполнить по клику
* **line** - имя строки, элементы с одинаковым значениям этого поля размещаются в одной строке
* **value** - значение атрибута
* Значение **row.readonly** строки интерпретируется как readonly поля
Работа справочника type=ref реализована кривовато, но работает. На все атрибуты используется один и тот-же справочник. Это может быть специально сделанный на сервере источник данных справочника, который по полученным параметрам понимает, что надо возвращать для текущего атрибута.
У источника данных панели должно быть 2 поля:
* **valueid** - поле type="ref", с прописанным вызовом общего для всех атрибутов справочника
* **valuename** - поле refid="valueid" - корректно описанное поле refname, может называться как угодно, лишь бы ссылалось на valueid. Имеет смысл организовать источник данных на сервере так, что бы это поле было виртуальным, а значение его было привязано к полю value.
==== html ====
Панель может отображать произвольный HTML текст по шаблону с макроподстановками или текст заголовка
Макроподстановки
* %%CAPTION%% - текст параметра caption
* %%LOGIN%% - элемент с именем текущего пользователя (из параметра login) по клику запрос disconnect
* %%выражение%% - см [[lssformat]] - как для подстановки в функцию get
Стили
* caption - стиль заголовка панели, вариант medium и large позволяет увеличить размер. Внутри стиля caption доступен стиль params для таблицы параметров:
Имя параметра | значение параметра |
Имя параметра | значение параметра |
==== htmllist ====
Панель для отображения списка, сформированного по произвольным HTML шаблонам
=== Примеры ===
Горизонтально расположенные элементы, вроде закладок панелей:
Вертикальный список элементов
Вертикальный список элементов, визуально похожий на url ссылки
Макроподстановки
* выражение - см [[lssformat]] - как для подстановки в функцию get
==== list ====
Панель для отображения вертикального списка
==== tablist ====
==== multi ====
Панель для списка множественного выбора
Простое описание, поле должно быть refid
Сложное описание, актуально для style=check с изменяющимся составом доступных галочек
==== webbrowser ====
Эта панель в IFRAME отображает содержимое адреса
...
* атрибут **url** задает адрес отображаемой в панели страницы
* атрибут **field** задает имя поля, содержащего адрес отображаемой в панели страницы
* атрибут **noscript** запрещает выполнение javascript в отображаемой в панели страницы
* атрибут **repaint**
* **auto** по умолчанию, перечитка при любом изменении url, вызывается изменениями в связанном источнике данных
* **manual** имеет смысл только для фильтра, перечитка при вызове запросов refresh или refreshrow, если задан параметр default, то перед первой перечиткой отображается его содержимое
* атрибут **progress** включает отображение индикатора прогресса загрузки содержимого iframe
* параметры param пополняют адрес передаваемыми через url параметрами
* параметр **http.url** позволяет задать url через параметры, как в запросах httpget или httpput
Особая обработка запроса panel:
* panel.print - распечатать содержимое
* panel.refresh - принудительно перечитать
==== extcontrol ====
Панель позволяет подключить к экранной форме внешний HTML документ, с привязкой к среде разработки. В HTML документе, отображаемом внутри панели должна быть объявлена функция doLssRepaint(params), которая будет автоматически вызываться при перерисовке источника данных. В params передаются: источник данных, значения параметров, режим перерисовки (все, одна строка)
...
==== img ====
Эта панель отображает картинку, size="" - исходный размер
...
==== memo ====
Эта панель отображает текстовое memo поле с возможностью редактирования
* readonly="manual" - в самом поле править нельзя, но в диалоге просмотра можно
==== allicons ====
Эта панель отображает все зарегистрированные в проекте иконки
==== chart ====
Эта панель отображает графики и диаграммы
...
==== separator ====
Это панель разделитель. Отображается как разделительная линия. Например, можно с помощью ее отделять друг от друга панели fields
==== form ====
Эта панель используется в главной экранной форме приложения. В ней размещаются (сменяя друг друга) динамически формируемые в процессе работы приложения экранные формы.
Такая панель должна быть одна, иначе все запутается.