Xpages как да получите CSJS потвърждение в SSJS

Имам контрола за повторение, която съдържа бутон, който ще обработва документите, които потребителят избира. Първият ми случай на употреба е за изтривания. Откривам дали потребителят избира поне един документ и публикувам съобщение за грешка, ако не го направи, като използвам view.postScript.

Искам да добавя диалогов прозорец за потвърждение, потвърждаващ, че потребителят иска да предприеме действието върху документите (като изтриването им), но не може да намери начин да го направи.

В идеалния случай искам да направя всичко това в текущия си SSJS.

Моят код е по-долу, с мъниче за мястото, където искам да помоля потребителя за потвърждение.

Всяка помощ ще бъде високо оценена.

//Did the user select a document
var hasSelected:Boolean = false;
for (var id in SelectedDocs.getSelectedIDs()) {     
        hasSelected = true;
        break
}

//If false then set a warning
if (hasSelected == false)
{
x="alert('Error\\n\\nPlease select one or more documents to delete.\\n\\n');";
view.postScript(x)
return
}

//If true then ask confirmation
if (hasSelected == true)
{
}

var rspView:NotesView = database.getView("(dbAllRpPCTasks)")

for (var id in SelectedDocs.getSelectedIDs()) {     

        //Get each selected doc
        var doc:NotesDocument = database.getDocumentByID(id);

        //Get child docs and delete them
        var key:String = doc.getItemValueString("ID");
        var dc:NotesDocumentCollection = rspView.getAllDocumentsByKey(key);
        if (dc.getCount() != 0) 
            {dc.removeAll(true);}

        //Delete the selected doc
        doc.remove(true)
        doc.recycle();
        SelectedDocs.setSelectedState(id,false);
}

Благодаря за всички предложения. Отговарям на отговора на Франк. Опитвате се да напишете CSJS, който ще определи дали потребителят е избрал документи и след това ще продължи или не.

В събитието при щракване на моя бутон в CSJS имам следното:

var dtList = document.getElementsByName("#{id:dataView1.getSelectedIds()}");
confirm("What is the length?" + dtList.length);
confirm("Can I get an item?" + dtList.item(0));

Връща дължина нула и елементът е недефиниран.


person Bryan Schmiedeler    schedule 28.04.2015    source източник
comment
Браян - не си приел никакъв отговор. Някое от тези работи ли за вас?   -  person David Leedy    schedule 30.04.2015


Отговори (3)


За разлика от LotusScript, кодът на XPages не може да чака въвеждане от потребителя. Мислете за това като да извикате агент, който да работи на сървъра и да добавите UIWorkspace.prompt() там (което ще изведе грешка, тъй като взаимодействието с потребителя не е разрешено).

Най-добрата препоръка би била да добавите подканата за потвърждение като CSJS към бутона, който потребителите първоначално щракват, напр.

return confirm("Are you sure?");

Ако са избрали документи, ще бъдат подканени, преди да продължат. Ако не са, това може да подкани някои потребители да изберат документите въпреки това. Трудно е да имаш съчувствие към оплаквания от потребител, който не е избрал никакви документи, щракнал е, че иска да продължи, след което се оплаква, че получава друг диалогов прозорец.

person Paul Stephen Withers    schedule 28.04.2015
comment
Бонус точки: използвайте XSP.confirm(...) за по-добро поведение, в случай че приложението ви се окаже в XPiNC или други бъдещи подобрения. - person Jesse Gallagher; 28.04.2015
comment
Всъщност приложението ми е в XPiNC. Все пак бих искал да поставя потвърждението точно в SSJS. Мога ли да направя това с XSP.confirm? - person Bryan Schmiedeler; 28.04.2015
comment
Не. SSJS трябва да работи докрай на сървъра. Целият SSJS се изпълнява във фазата на извикване на приложение и view.postScript добавя CSJS към изгледа на Java обекта и този код след това се взима по време на фазата на изобразяване на отговор, за да бъде написан в HTML, публикуван обратно на сървъра. - person Paul Stephen Withers; 28.04.2015

Опитахте ли да използвате Simple Actions за бутоните? Използвам Confirm Action, за да проверя дали потребителят не е натиснал случайно бутон (често срещан проблем за съжаление). След това проверявам моя формуляр и показвам всички съобщения в персонализирана област за съобщения (Благодарение на Томи Валанд), но можете да използвате нормална област за съобщения.

Създайте група за действие и поставете своя SSJS израз (или EL), за да се изпълни условно. Показване на съобщението в рамките на страницата вместо изскачащ прозорец.

Примерна настройка на група за действие

person Eric Tomenga    schedule 29.04.2015

Малко теория - всяко действие може да има следните комбинации:

  • CSJS
  • CSJS + SSJS
  • CSJS + SSJS + CSJS
  • SSJS
  • SSJS + CSJS

Така че трябва да комбинирате едно или повече действия, за да постигнете това, което искате да направите. Техники, които могат да се използват за верижни повиквания:

  • XSP.partialRefreshGet/Публикуване
  • view.postscript (в комбинация с горното)
  • свойството на събитието onComplete
  • вграден CSJS, изчислен във фаза на изобразяване
  • скрит бутон, иницииран от CSJS (postscript/onComplete)
  • ExtLib RPC повикване

Моят съвет към вашия случай на употреба е да откриете в CSJS на събитието (преди изпълнение) дали потребителят е избрал някакъв документ (DOM операции). Ако не, използвайте return false;, за да спрете изпълнението на събитието (с подходящо обяснение в подканата на CSJS).

Редактиране: точен случай на употреба Разделете вашите случаи на употреба на два проблема: условие и изпълнение.

1. Състоянието

НАИСТИНА ли трябва да се обадите на SSJS, за да получите тази информация? Зависи какво използвате за избор на документи - какъв е вашият SelectedDocs обект? В някои случаи можете да изобразите (буквално) брой избрани документи в DOM (ако приемем, че селекцията задейства частично/пълно опресняване) и да го използвате в CSSJ, преди да бъде извикан SSJS. Така че преосмислете вашите нужди/подход.

2. Изпълнението

Наистина ли трябва да е комбинация от SSJS + CSJS + SSJS? Съмнявам се.

Ето пример за вашия случай на употреба, базиран на SSJS(+CSJS). Той симулира шанс 50:50 за показване на подканата или изтриване на документи. Разбирате идеята, просто актуализирайте първата група за действие, за да получите избрания брой.

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xp_1="http://www.ibm.com/xsp/coreex">
    <xp:button
        value="Label"
        id="button1">
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="partial" refreshId="button1">
            <xp:this.action>
                <xp:actionGroup>
                    <xp:actionGroup>
                        <xp:executeScript
                            script="#{javascript:requestScope.docnum = @Integer( @Random() * 2 );}">
                        </xp:executeScript>
                    </xp:actionGroup>
                    <xp:actionGroup
                        condition="#{javascript:requestScope.docnum == 0;}">
                        <xp:executeScript>
                            <xp:this.script><![CDATA[#{javascript:view.postScript('alert("No documents selected...");');}]]></xp:this.script>
                        </xp:executeScript>
                    </xp:actionGroup>
                    <xp:actionGroup
                        condition="#{javascript:requestScope.docnum != 0;}">
                        <xp:executeScript
                            script="#{javascript:// delete documents}">
                        </xp:executeScript>
                    </xp:actionGroup>
                </xp:actionGroup>
            </xp:this.action>
        </xp:eventHandler>
    </xp:button>
</xp:view>
person Frantisek Kossuth    schedule 28.04.2015
comment
Франтишек, опитвам се да приложа предложеното от теб решение, като напиша CSJS, който ще открие дали потребителят е избрал документ или не и след това ще спре изпълнението с предупреждение, ако не е, или ще продължи, ако е избрал. - person Bryan Schmiedeler; 06.05.2015
comment
Франтишек, опитвам се да приложа предложеното от теб решение, като напиша CSJS, който ще открие дали потребителят е избрал документ или не и след това ще спре изпълнението с предупреждение, ако не е, или ще продължи, ако е избрал. Точно това искам да направя, тъй като това решение ще се прилага за много много други случаи на употреба, които имам. Успях да се справя с dataView в моя CSJS, но това е всичко. Показва дължина нула. Разбира се, имам нужда от редовете и евентуално избраните идентификатори. Но продължавам да получавам дължина 0 и никакви елементи. Поставих кода обратно в първоначалните си въпроси. - person Bryan Schmiedeler; 06.05.2015