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 запускается на этапе Invoke Application, а view.postScript добавляет CSJS к объекту Java представления, а затем этот код извлекается на этапе Render Response для записи в HTML-коде, отправляемом обратно на сервер. - person Paul Stephen Withers; 28.04.2015

Вы пробовали использовать простые действия для кнопок? Я использую Confirm Action, чтобы убедиться, что пользователь не нажал кнопку случайно (к сожалению, распространенная проблема). Затем я проверяю свою форму и отображаю все сообщения в настраиваемой области сообщений (Спасибо Томми Валанду), но вы можете использовать обычную область сообщений.

Создайте группу действий и поместите свое выражение SSJS (или EL) для условного выполнения. Отображать сообщение на странице вместо всплывающего окна.

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

person Eric Tomenga    schedule 29.04.2015

Немного теории — каждое действие может иметь следующие комбинации:

  • CSJS
  • КСЖС + ССЖС
  • CSJS + SSJS + CSJS
  • SSJS
  • SSJS + CSJS

Таким образом, вы должны объединить одно или несколько действий, чтобы выполнить то, что вы хотите сделать. Методы, используемые для цепочки вызовов:

  • XSP.partialRefreshGet/Post
  • 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, но это все. Он показывает нулевую длину. Мне, конечно, нужны строки и, в конечном итоге, selectedID. Но я продолжаю получать длину 0 и никаких элементов. Я вставил код обратно в свои исходные вопросы. - person Bryan Schmiedeler; 06.05.2015