2015-04-28 3 views
1

У меня есть элемент управления повтора, который содержит кнопку, которая будет обрабатывать документы, которые пользователь выбирает. Мой первый вариант использования - для удаления. Я определяю, выбирает ли пользователь хотя бы один документ и отправляет сообщение об ошибке, если они этого не делают, используя view.postScript.Xpages как получить подтверждение CSJS в SSJS

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

В идеале я хочу сделать все это в своем текущем 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)); 

Он возвращает нулевую длину, и элемент не определен.

+1

Bryan - вы не приняли никакого ответа. Кто-нибудь из них работает на вас? –

ответ

1

В отличие от LotusScript, код XPages не может ждать ввода пользователя. Подумайте, как вызвать агента для запуска на сервере и добавления там UIWorkspace.prompt() (что вызовет ошибку, поскольку взаимодействие с пользователем не разрешено).

Лучшей рекомендацией было бы добавить подсказку подтверждения как CSJS к кнопке, которую пользователи нажимают первоначально, например.

return confirm("Are you sure?"); 

Если они выбрали документы, они будут предложены до их продолжения. Если они этого не сделали, это может побудить некоторых пользователей выбирать документы в любом случае. Трудно сочувствовать жалобам от пользователя, который не выбирал какие-либо документы, щелкал, что они хотели продолжить, а затем жалуется на получение другого диалога.

+1

Бонусные баллы: используйте XSP.confirm («...») для лучшего поведения, если ваше приложение попадет в XPiNC или другие улучшения в будущем. –

+0

На самом деле мое приложение находится в XPiNC. Я все еще хотел бы подтвердить это право в SSJS. Могу ли я сделать это с помощью XSP.confirm? –

+1

№ SSJS должен выполняться до завершения на сервере. Весь SSJS запускается на фазе Invoke Application, а view.postScript добавляет CSJS к объекту Java «view», и этот код затем выбирается во время фазы ответа Render, который должен быть записан в HTML, отправленном обратно на сервер. –

0

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

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

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

  • XSP.partialRefreshGet/Post
  • вид.Постскриптум (в сочетании с выше) свойство
  • OnComplete мероприятия
  • инлайн CSJS вычисленных при визуализации фазы
  • скрытая кнопка инициирована CSJS (приписка/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> 
+0

Frantisek, я пытаюсь реализовать предлагаемое решение, написав CSJS, который будет определять, выбрал ли пользователь документ или нет, а затем либо прекратить выполнение с предупреждением, если они этого не сделали, либо продолжить, если они это сделают. –

+0

Frantisek, я пытаюсь реализовать предлагаемое решение, написав CSJS, который будет определять, выбрал ли пользователь документ или нет, а затем либо прекратить выполнение с предупреждением, если они этого не сделали, либо продолжить, если они это сделают. Это именно то, что я хочу сделать, поскольку это решение будет применяться ко многим другим случаям использования, которые у меня есть. Мне удалось обработать dataView в моем CSJS, но это все. Он показывает длину нуля. Мне нужно, конечно, строки и в конечном итоге выбранные идентификаторы.Но я продолжаю получать 0 и нет предметов. Я вставил код обратно в мои оригинальные вопросы. –

0

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

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

Example Action Group Setup

Смежные вопросы