XPages View - фильтр и поиск одновременно
Привет программисты Domino!
Я работаю с приложением Xpages и столкнулся со следующей проблемой:
У меня есть много элементов управления представлением Xpages, которые фильтруются по имени пользователя. Недавно мне пришлось добавить полный поиск к существующим представлениям. Опция "Поиск в результатах просмотра" переопределяет опцию "Фильтровать по значению столбца", поэтому я могу четко видеть документы других пользователей.
Я могу подумать о добавлении в запрос дополнительного условия, чтобы отфильтровать результаты поиска, но так ли это?
Любая помощь будет оценена.
1 ответ
Хорошо, вот как я подошел к этому вопросу. Я использую представление данных только с простым старым источником данных представления.
Я хотел одно поле поиска, если вы просто напишите что-то в поле, оно использует свойство startKeys для перехода к нужной записи. В поле поиска есть событие onFocus, которое устанавливает логическое значение "viewMoveTo" в значение true. Вы можете хранить это значение в bean-компоненте или sessionScope или где угодно, не имеет значения. Есть еще одно событие onKeyUp, которое просто частично обновляет представление данных.
Если вы нажмете кнопку поиска, она выполнит поиск FT, используя свойство "search" в представлении данных. В событии onClick кнопки поиска я установил значение "viewMoveTo" в false.
Вот мой код для поля:
<xp:inputText
id="viewSearchField1"
value="#{UserProfile.viewSearchStr}"
styleClass="form-control rpdViewSearchField">
<xp:this.attrs>
<xp:attr name="placeHolder" value="Search"></xp:attr>
</xp:this.attrs>
<xp:eventHandler
event="onfocus"
submit="true"
refreshMode="norefresh"
action="#{javascript:UserProfile.setViewMoveTo(true);}">
</xp:eventHandler>
<xp:eventHandler
event="onkeyup"
submit="true"
refreshMode="partial"
refreshId="dataView1">
</xp:eventHandler>
</xp:inputText>
Вот код для кнопки поиска:
<xp:link id="link2" title="Perform Search">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="partial"
refreshId="dataView1"
action="#{javascript:UserProfile.setViewMoveTo(false);}">
</xp:eventHandler>
<i class="fa fa-search" />
</xp:link>
И, наконец, вот исходный код данных для представления данных:
<xe:this.data>
<xp:dominoView
var="currentView"
expandLevel="1"
viewName="#{javascript:return PortalContext.getCollection() != null ? PortalContext.getCollection().getViewName() : null;}"
databaseName="#{javascript:return DesktopContext.getCurrentContainer().getFilePath();}">
<xp:this.startKeys><![CDATA[#{javascript:var returnVal = UserProfile.getViewSearchStr();
if (!UserProfile.getViewFTSearch()) {
returnVal = null;
}
return returnVal;}]]></xp:this.startKeys>
<xp:this.search><![CDATA[#{javascript:var returnVal = UserProfile.getViewSearchStr();
if (UserProfile.getViewFTSearch()) {
returnVal = null;
}
return returnVal;}]]></xp:this.search>
</xp:dominoView>
</xe:this.data>
Итак, пройдя через это... пользователь помещает свой курсор в поле поиска, а переменная "viewMoveTo" устанавливается равной true через событие onFocus. Свойство "startKeys" источника данных проверяет, имеет ли значение "viewMoveTo" значение "ложь", а если НЕТ, то возвращает значение поля поиска в качестве ключа для перехода. Если значения viewMoveTo IS ложны, то он возвращает нулевое значение. В событии onKeyUp мы частично обновляем представление данных.
Кнопка поиска делает только наоборот. Он устанавливает значение "viewMoveTo" в false. Свойство "поиск" источника данных проверяет, является ли "viewMoveTo" истинным, если оно НЕ, то оно возвращает значение поля поиска в качестве значения для поиска. Если значение viewMoveTo равно true, тогда оно возвращает нулевое значение. Наконец, событие onclick частично обновляет представление данных.