Задание и структура действия в Showcase

Материал из Course Orchestra
Перейти к: навигация, поиск
Showcase

Создание решений на КУРС:Showcase

Задание и структура действия

См. схему action.xsd

Важное замечание по схеме: элемент main_context является обязательным, если заданы datapanel или server, и должен в этом случае находиться на первом месте!

Все элементы (элементы навигатора и события, связанные с элементами инф. панели, описанные ниже) могут иметь тэг <action> , в котором прописываются действия при клике на элемент. Действие может содержать в себе несколько ссылок, по одной каждого типа:

  • на информационную панель
  • на навигатор

Ссылка на информационную панель служит для открытия заданной информационной панели справа от навигатора. В случае, если указана только ссылка на навигатор, выполняются два события: событие смены выделения элемента навигатора и событие связанное с данным элементом навигатора (открытие связанной с данным элементом информационной панели). В случае, если указаны и ссылка на навигатор и ссылка на информационную панель, ссылка на навигатор служит только для изменения выделения текущего элемента навигатора. Замечание: в первую очередь выполняется обновление навигатора.

Ниже приведен пример задания действия (начиная с версии 2.0.4):

<action show_in="MODAL_WINDOW" keep_user_settings="false" partial_update="false">
    <main_context>вместо атрибута datapanel</main_context>
    <navigator refresh="true" element="код элемента"/>
    <modalwindow caption="Заголовок модального окна" height="100" width="200" show_close_bottom_button="true" close_on_esc="false"/>
    <datapanel type="a.xml" tab="код вкладки"/>         
        <element id="код элемента">
             <add_context>
             вместо атрибута add_context у element
             </add_context>
        </element>
        <element id="код элемента">
             <add_context>
             вместо атрибута add_context у element
             </add_context>        
        </element>     
        <element id="код элемента" keep_user_settings="true" partial_update="true">
             <add_context>
             вместо атрибута add_context у element
             </add_context>        
        </element>             
    </datapanel>
    <client>
        <activity id="id" name="proc_name">
             <add_context>
             add_context для действия.
             </add_context>  
        </activity>     
    </client>
    <server>
        <activity id="id" name="proc_name">
             <add_context>
             add_context для действия
             </add_context>  
        </activity>             
    </server>
</action>
  • Атрибут show_in у action определяет где будет открыты элементы, на которые распространяется действие. Реализованы варианты PANEL (внутри вкладки панели, вариант по умолчанию) и MODAL_WINDOW (в модальном окне).
  • Атрибут refresh="true" у navigator указывает на то, что нужно заново загрузить данные в навигатор.
  • Атрибут keep_user_settings у действия и у отдельных элементов действия - указывает на то, что нужно сохранять пользовательские настройки всех или отдельных элементов панели. Если элемент отображается в первый раз - то признак игнорируется. Значение атрибута у действия перекрывается значениями атрибута элементов. Примечание: пользовательские настройки имеют не все типы элементов.
  • Атрибут partial_update у действия и у отдельных элементов действия - указывает на то, что нужно выполнить частичное обновление всех или отдельных элементов панели. Значение атрибута у действия перекрывается значениями атрибута элементов. Примечание: в настоящее время учитывается только для JS-гридов и плагинов, для остальных элементов игнорируется.
  • Элемент modalwindow содержит описание внешнего вида модального окна. Данный элемент имеет смысл только в случае show_in == MODAL_WINDOW. Описание атрибутов данного элемента: caption - заголовок модального окна, height и width - его высота и ширина (если все параметры (caption, widht, hight) не указаны, то модальное окно занимает всю область просмотра браузера), show_close_bottom_button - нужно или нет показывать кнопку "Закрыть" внизу модального окна, close_on_esc - будет ли модальное окно закрыто при нажатии кнопки ESC клавиатуры (по умолчанию - будет закрыто).
  • Элемент server является родительским для списка действий на сервере. Каждое действие на сервере описывается одним элементом activity. Имя процедуры или скрипта задается в атрибуте name. По наличию или отсутствию расширения в имени определяется тип действия. Обратите внимание, что начиная с версии Showcase 1.9.5 атрибут type убран. Начиная с версии 1.9.5 появилась возможность выполнять Jython скрипты на сервере. О создании Jython скриптов можно прочитать ниже. Действий на сервере может быть задано произвольное количество. Действие может содержать одновременно и действия на клиенте (обновление элементов на панели или обновление навигатора), так и серверные действия. При наличии серверных действий в первую очередь выполняются именно они, причем действия на клиенте будут выполнены только после успешного выполнения действий на сервере (т.е. синхронно).
  • Элемент client является родительским для списка действия на клиенте. Каждое действие на сервере описывается одним элементом activity. Действие может быть только одним - вызов JS процедуры с именем name. main, add и filter контексты, связанные с действием передаются этой процедуре как 3 строковых параметра. Наиболее полезным является параметр add_context, в котором рекомендуется задавать либо простые значения (число, строка) либо JSON-объект. Пример возможного значения в add_context - идентификатор элемента (ов), над которыми нужно выполнить действие.
  • В случае модального окна реализована возможность задания css-класса, с помощью которого можно будет настраивать свойства этого окна, в том числе его ширину и высоту. В действии атрибут, соответствующий этому классу, относится к элементу modalwindow и называется class_style.

Вид процедуры:

function xyz(mainContext, addContext, filterContext)
{
	
}

Серверные действия

Серверные действия позволяют выполнить хранимую процедуру или jython скрипт на сервере. Функция, выполняющая действие, может не возвращать ничего, а может вернуть исключение или сообщение для пользователя.

Начиная с версии 2.0.4 в серверные действия передаются related context элемента, из которого было вызвано действие.

Хранимые процедуры в БД

Хранимая процедуры для вызова из действия должна иметь следующий вид:

CREATE PROCEDURE [dbo].[xxx]
	@main_context varchar(MAX)='',
        @add_context varchar(MAX)='',
	@filterinfo xml='',        
	@session_context xml='',	
	@error_mes varchar(MAX)='' output
AS
BEGIN
SET NOCOUNT ON;
#-
RETURN 0
END

Jython Server Activivty

Описание Jython вынесено в отдельный раздел Использование Jython в Showcase.

Серверное действие Celesta

Описание см. в статье Серверное действие с использованием Celesta

Примеры и ошибки

Примеры действий

Загрузить панель "a.xml", открыть на ней вкладку с идентификатором "2", отрисовав все элементы на ней с main_context="Производство" и элемент с идентификатором "01" с main_context="Производство" и add_context="Москва".

<action>
    <main_context>Производство</main_context>
    <datapanel type="a.xml" tab="2">
        <element id="01">
            <add_context>Москва</add_context>
        </element>
    </datapanel>
</action>

То же самое, но открыть первую по счету вкладку:

<action>
    <main_context>Производство</main_context>
    <datapanel type="a.xml">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>

Открыть вкладку с идентификатором "2" на текущей панели, отрисовав все элементы на ней с main_context="Производство" и элемент с идентификатором "01" с main_context="Производство" и add_context="Москва". Если вкладка уже открыта, все введенные пользователем данные должны быть сохранены.

<action>
    <main_context>Производство</main_context>
    <datapanel type="current" tab="2">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>

Открыть вкладку с идентификатором "2" на текущей панели, отрисовав все элементы на ней с main_context="Производство" и элемент с идентификатором "01" с main_context="Производство" и add_context="Москва". При этом все введенные пользователем данные должны быть сброшены.

<action keep_user_settings="false">
    <main_context>Производство</main_context>
    <datapanel type="current" tab="2">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>

Перегрузить элементы с идентификаторами "01" и "02" на текущей вкладке с main_context="Производство" и add_context="Москва". При этом все введенные пользователем данные в этих элементах должны быть сброшены.

<action>
    <main_context>Производство</main_context>
    <datapanel type="current" tab="current">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
        <element id="02">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>

Перегрузить элементы с идентификаторами "01" и "02" на текущей вкладке с main_context="Производство" и add_context="Москва". При этом введенные пользователем данные в элементе "01" должны быть сброшены, а в элементе "02" - сохранены.

<action>
    <main_context>Производство</main_context>
    <datapanel type="current" tab="current">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
        <element id="02" keep_user_settings="true">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>

Открыть вкладку с идентификатором "2" на текущей панели, отрисовав все элементы на ней с main_context="Производство", и сменить активный элемент в навигаторе на элемент с идентификатором "3":

<action>
    <main_context>Производство</main_context>
    <navigator element="3"/>
    <datapanel type="current" tab="2"/>
</action>

Cменить активный элемент в навигаторе на элемент с идентификатором "3" и открыть панель xx.xml на вкладке "2", отрисовав все элементы на ней с main_context="Производство", а элемент "grid" - c add_context="select_second_record":

<action>
    <main_context>Производство</main_context>
    <navigator element="3"/>
    <datapanel type="xx.xml" tab="2">
        <element id="grid">
            <add_context>select_second_record</add_context>
        </element> 
    </datapanel>
</action>

Обновить содержимое навигатора:

<action>
    <navigator refresh="true"/>
</action>

Сменить активный элемент в навигаторе на элемент с идентификатором "3" и выполнить связанное с ним действие (открыть определенную вкладку на определенной панели):

<action>
    <navigator element="3"/>
</action>

Сменить активный элемент в навигаторе на элемент с идентификатором "3" и выполнить связанное с ним действие, отрисовав все элементы на ней с main_context="new_main_context":

<action>
    <main_context>new_main_context</main_context> 
    <navigator element="3"/>
</action>


Работа с карточкой

Открытая карточка может быть закрыта (без каких-либо действий) с помощью кнопки Esc (работает по умолчанию, но если установить свойство close_on_esc="false", то срабатывать не будет). Это действие аналогично кнопке "Закрыть" и кнопке с крестиком у вехнего края модального окна.

Открыть элемент с идентификатором "01" в модальном окне с main_context="Производство" и add_context="Москва":

<action show_in="MODAL_WINDOW">
    <main_context>Производство</main_context>
    <datapanel type="current" tab="current">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>

То же самое, но с заданием размеров окна, его заголовка и кнопки «Закрыть» у нижнего края окна:

<action show_in="MODAL_WINDOW">
    <main_context>Производство</main_context>
    <modalwindow caption="Редактирование Москвы по собянински" width="100" height="100" show_close_bottom_button="true"/>
    <datapanel type="current" tab="current">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>

То же самое, но с заданием размеров окна, его заголовка и отключением закрытия карточки при нажатии кнопки ESC клавиатуры:

<action show_in="MODAL_WINDOW">
    <main_context>Производство</main_context>
    <modalwindow caption="Редактирование Москвы по собянински" width="100" height="100" close_on_esc="false"/>
    <datapanel type="current" tab="current">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>


Обновить элемент с идентификатором "01", уже открытый в модальном окне (это может происходить при нажатии кнопки "Новый" в карточке):

<action show_in="MODAL_WINDOW"> 
    <main_context>Производство</main_context>
    <datapanel type="current" tab="current">
        <element id="01">
            <add_context>add или любой другой признак</add_context>
        </element>        
    </datapanel>
</action>

Закрыть модальное окно и обновить вкладку, не сбросив введенные в фильтре данные, наложенный фильтр и настройки грида:

<action>
    <main_context>Производство</main_context>
    <datapanel type="current" tab="2">
    </datapanel>
</action>

Закрыть модальное окно и обновить только один конкретный грид с идентификатором "01" не сбросив наложенный на него фильтр:

<action>
    <main_context>Производство</main_context>
    <datapanel type="current" tab="current">
        <element id="01">
            <add_context>Москва</add_context>
        </element>        
    </datapanel>
</action>