====== Декларативное описание экранной формы ======
[[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"
          action="1|0"
          
          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|list|report (возможно, в будущем будет реализован card)
  * **waitanimate**="0|1" - отображать ожидание загрузки анимированным gif
  * **noheader** - не показывать заголовки 0|1
  * **noselect** - не показывать текущую строку 0|1
  * **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 ====
Эта панель используется в главной экранной форме приложения. В ней размещаются (сменяя друг друга) динамически формируемые в процессе работы приложения экранные формы. 
Такая панель должна быть одна, иначе все запутается.