Модальные Диалоги

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#1
Всем привет!
Вот действительно насущная задача... как организовать диалог при помощи Extention Library, который будет ожидать реакции пользователя?
Т.е. не станет выполнять код, следующий после вызова диалога.

Просто хочется использовать один Custom Control диалога для всех страниц, а не хардкодить постоянно.
 

KingGLEB

Active member
08.05.2008
30
0
#2
Я вот сделал так. И работает без ExtLib.
Создал custom control "dialogSelect". В нем:
Код:
<xp:this.resources>
<xp:dojoModule name="dijit.Dialog"></xp:dojoModule>
</xp:this.resources>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[XSP.addOnLoad(function(){dialog_create("dialogSelect","Выберите")})]]></xp:this.value>
</xp:scriptBlock>
<div id="dialogSelect" style="display:none" class="lotusDialogWrapper">
// сама форма
</div>
Создал еще custom control "SubForm" с кнопкой.
Код:
<xp:button id="button1" value="ВызватьДиалог">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[dijit.byId("dialogSelect").show()]]></xp:this.script>
</xp:eventHandler>
</xp:button>
Теперь везде вставляю "SubForm" и всё.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#3
Я вот сделал так. И работает без ExtLib.
Создал custom control "dialogSelect". В нем:
Код:
<xp:this.resources>
<xp:dojoModule name="dijit.Dialog"></xp:dojoModule>
</xp:this.resources>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[XSP.addOnLoad(function(){dialog_create("dialogSelect","Выберите")})]]></xp:this.value>
</xp:scriptBlock>
<div id="dialogSelect" style="display:none" class="lotusDialogWrapper">
// сама форма
</div>
Создал еще custom control "SubForm" с кнопкой.
Код:
<xp:button id="button1" value="ВызватьДиалог">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[dijit.byId("dialogSelect").show()]]></xp:this.script>
</xp:eventHandler>
</xp:button>
Теперь везде вставляю "SubForm" и всё.
Покажи код вызова этого диалога. Больше чем уверен, что все закачивается dialog.show()
А всю остальную обработку ты ведешь именно в диалоге.
Такое мне не подходит

Проблема таких диалогов - они не ждут реакции пользователя
 

KingGLEB

Active member
08.05.2008
30
0
#4
Покажи код вызова этого диалога. Больше чем уверен, что все закачивается dialog.show()
А всю остальную обработку ты ведешь именно в диалоге.
Такое мне не подходит

Проблема таких диалогов - они не ждут реакции пользователя
Да, кнопка с show(). А что они делают? Получается модальное окно в котором есть, например, две кнопки "ОК" "Отмена" и юзер никуда из него не денется. Или хочется модальное окно для всего браузера?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#5
Хочется чтоб после dialog.show() код не выполнялся, пока пользователь не нажмет кнопочку по аналогии с LotusScript
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#6
Сегодня малость поигрался. Удалось организовать подобие.
Что сделал... На основной странице форма документа и кнопка "Сохранить" (Submit)
В диалоге 2 кнопки Ок (Submit) и Cancel (Button). На обеих один обработчик function DialogRresult( key: int ), где key - код кнопки по аналогии с MessageBox LS. В этой процедуре обрабатываю что нажал пользователь в диалоге и собственно дальнейшую обработку документа.
В кнопке "Сохранить" - первичная проверка документа и вызов диалога и отмена Submit:
<!--shcode--><pre><code class='js'>if(getComponent("untitled1").value != "" ){
MessageBox( "Сохранить?", 1, 32, "TEST");
false
}[/CODE]
 

KingGLEB

Active member
08.05.2008
30
0
#7
Подойдет, но немного допилить. Если результаты диалога надо записывать в разные поля (диалог универсальный), то обработчик надо расширить параметрами.
Код:
function DialogRresult ( key, typesave ) {
if (key==1) {
if (typesave=="Fields1") {
doc.replaceItemValue("Field1", "1");
doc.replaceItemValue("Field1_1", "1_1")
} else if (typesave=="Fields2") {
doc.replaceItemValue("Field2", "2");
doc.replaceItemValue("Field2_1", "2_1")
}
} else if (key==2) {
// ...
}
}
В документе на кнопке 1 пишем:
Код:
(Server)
viewScope.typesave="Fields1"
(Client)
dijit.byId("dialog1").show()
В документе на кнопке 2 пишем:
Код:
(Server)
viewScope.typesave="Fields2"
(Client)
[code]dijit.byId("dialog1").show()
В диалоге на кнопке 1:
Код:
DialogRresult( 1, viewScope.typesave)
На кнопке 2:
Код:
DialogRresult( 2, viewScope.typesave)
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#8
Я не сохраняю результат.
Просто нужно знать действие пользователя
 

Zeka

Well-known member
01.09.2009
219
0
#9
как организовать диалог при помощи Extention Library, который будет ожидать реакции пользователя?
Т.е. не станет выполнять код, следующий после вызова диалога.
Чего толкового сказать не могу, так просто поразглогольствую... :)
...в xPages другие принципы работы, неже ли в лотусе. Если ты будешь открывать диалок явой (SSJS) то твой код должен дойти до конца, что бы сервер смог построить всё дерево компонентов и вернуть html клиенту. Он не может "подвиснуть" где-то по середине и дождаться ответа клиента.

Если же ты открываешь диалог при помощи CSJS, то опять таки, код зависящий от ответа пользователя должен писаться не в следующих за dijit.byId("dialog1").show() строчках, а передоваться в допиленный диалог как callback function