Решено Поиск в окне выбора

  • Автор темы beloff
  • Дата начала

Darkhan

Green Team
14.12.2012
99
2
BIT
0
VladSh, для того, чтобы событие Onchange (Exiting) у листбокса отрабатывал "как надо", необходимо в свойствах поля поставить галку "Call Onchange/Exiting after value change"
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Darkhan
Я его потому и снял, что оно было бесполезно для этого. Зато ненужные обновления поубирал.
 
A

alexas

...Только Exiting отрабатывает как-то странно, - только по клику выше поля ввода или сразу же ниже листбокса
Так и должно быть - когда уходишь из поля, курсор должен куда-то встать, тогда и возникает событие, а ниже Listbox нет ни Exiting полей ни Hotspot. Поэтому и отрабатывает по клику выше поля - там кнопка JS, уберешь - выше поля срабатывать не будет. Я в таких случаях перед и после нужного поля вставляю пустые Hotspot-ы на один пробел без рамки. Т.е. перед-после "enterField".
Про Down еще решения нет, думаю...

Если "$hd_choisesField" =
@If(@Trim(enterField) = "";@Return("");"");
@Trim(@Transform(" "+initField; "t"; @If(@Contains(@LowerCase(t); @LowerCase(" "+@Trim(enterField))); t; "")))
то поиск в предложениях только с начала слов (игнорируя куски в середине слова:
в списке - "Билялетдинов - полузащитник":"...":"..."
"полу" - выберет - "Билялетдинов - полузащитник"
"защитник" - ничего не выберет)
 
A

alexas

Дополнительный ComboBox с вариантами поведения напрашивается :)

Не, не Combo, а Check. Вот так:

CheckBox "SearchOption" со значением - "Нечеткий поиск" | 1
"$hd_choisesField" =
sOpt := @if( SearchOption = "1"; "" ; " ");
@If(@Trim(enterField) = "";@Return("");"");
@Trim(@Transform(sOpt + initField; "t"; @If(@Contains(@LowerCase(t); @LowerCase(sOpt + @Trim(enterField))); t; "")))

По поводу Down так:
1. В Combo и Field As Native OS style не работает Down, что логично. Значит надо использовать Notes style.
2. Тогда для "enterField" не будет работать OnChange. Значит для обновления ListBox надо после ввода каждой буквы надо самостоятельно рефрешить дос.
Это легко - в OnFocus вызывать функцию из JS Header, котрая будет нажимать кнопку "RefreshFields".
3. Для "enterField" в OnExit - сделать GoToField("choisesField"), а то на поле в леере не перейдет по Down (проследить, что-бы оно было видимым) и выбрать первое значение списка.
4. И до кучи, раз уж лезем в JS Header, обработать Enter (ловить перевод строки в "enterField", убрать его в enterField.Value и перезаписать поле)

Будет уже почти хорошо.

Еще останется момент преодоления ограничения в 32К что налукапили в "$hd_choisesField" и можно будет менять диалоги выбора из плоских (а может и не только плоских, надо подумать) View в своих проектах.

Если появится время - в течении дня сделаю.

P.S. Еще надо-бы паралельно с "$hd_choisesField" сделать список UNIDов доков откуда лукапили, для полного функционала.
Хороший интерфейс получается.
 
A

alexas

Вот такая бета получилась.
Четкий - нечеткий поиск.
Выбор из списка - на леере. Переход на список - клавишами-стрелочками (правда двойное нажатие, ну так получилось :mellow: ).
EnterField - простое поле. Обрабатывается нажатие ENTER - убирается перевод строки.
И еще одна мысль (на формочке :rolleyes: ).

VladSh еще раз спасибо за идею про леер. Теперь уйду от убогих Нотусевых модальных окошек вообще!
VladSh, если будет желание и время, optimize please.
 
B

beloff

alexas
у меня при попытке открыть пишет Attempted encrypted operation is not supported by this version of Notes
 
A

alexas

This database has local access protection...
Pardon Me
P.S. поправил Баг
Убрал кнопку "OK". Список с выбором теперь закрывается при потери фокуса на леере (Табом, как все привыкли, или мышкой)
Все, это релиз :rolleyes: . Больше ничего делать не буду.
 

Вложения

  • hAutocompleteBeta2.zip
    38 КБ · Просмотры: 359

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
alexas
Спасибо, что продолжаешь эту нелёгкую работу)
Добро, только наверное уже в свободное время, а это скорее всего будет на выходных.
 
A

alexas

Все-таки еще микро-релиз:
устранил досадные интерфейсные баги и добавил чуть-чуть функционала.
Получился полноценный LiveSearch, который во многих случаях может заменить стандартный Нотусовый выбор данных или документов
(получает UNID дока соответствующий выбранной строке).

Плюсы:
на мой взгляд - удобно, работает шустро, поставил похожий вариант на рабочую базу - юзера довольны
нетрудно модифицировать, что-бы искать сразу в нескольких View или последовательно (например не нашел в стандартном месте -
автоматом производится поиск в архиве)
Минусы:
ограничение 32К в поисковом поле (решаемо)
получаемый для выбора список должен содержать уникальные значения (решаемо)
некоторая громоздкость - но зато можно сделать красивый и функциональный интерфейс
неплохо-бы завершить поиск нажатием "Enter" в окне выбора (на данный момент просто никаких мыслей)
 

Вложения

  • LiveSearch_notWEB.zip
    35,5 КБ · Просмотры: 341

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
Если в кнопке "RefreshField" поставить код:
Код:
	Dim ws As New NotesUIWorkspace
Set nuidCurrent = ws.CurrentDocument
Call nuidCurrent.Refresh
Call nuidCurrent.RefreshHideFormulas
то можно открывать через DialogBox.
А в поле InitField записать значения до открытия DilogBox.
Тогда по нажатию Enter можно записывать значение поля и обрабатывать после закрытия диалога.

Добавлено: Мне для выбора города в зависимости от страны очень подходит.
Еще раз спасибо.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
Обращение к модераторам. Закрепить куда-нибудь тему.
Вещь очень полезная.
 
A

afest

тема классная... но вот можно ли обойтись без JS? вообще есть идейки, но пока слишком сырые и не уверен в действенности
 
A

afest

и еще один вопрос... можно ли данные получать не из текстового поля, а из вьюхи? сам в принципе, могу сделать, но время поджимает...
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
Самое просто перед открытием формы заполнить поле initField значениями, которые нужны.
Как ты эти значения получишь -не важно.
 
A

afest

т.е. обрабатывать QueryOpen? и туда закидывать данные из вьюхи? тогда я столкнусь с траблой 32к
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
Смотря что искать, на мой взгляд такой механизм удобен не для поиска документов по базе, а для выбора справочных значений.
Города, страны, коды ОКВЭД, статьи расходов и так далее, то что не может стать более 32к записей.
Все остальное - pickList по вьюхе.
 
A

alexas

... можно ли данные получать не из текстового поля, а из вьюхи?....
Это и предполагается. То текстовое поле, о котором идет речь, это просто буфер (для удобства), который надо наполнить нужными данными.
Если данных меньше 32К - то initField можно заполнить в PostOpen формы (из вьюшки или откуда хочешь).
Если данных много - заполнять initField после ввода в enterField 1,2...n символов и использовать введенные в enterField символы как ключ для отбора данных (GetAllDocumentsByKey или что душе угодно)
Например :
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">делать проверку в кнопке RefeshField</div></div><div class="sp-body"><div class="sp-content">Sub Click(Source As Button)
If Len(nuidCurrent.document.enterField(0)) = 3 Then 'грузим данные, если ввели 3 символа
'............ подгружаем данные ..........
End If
....................
Или @DBLookup в function checkField () (JS Header)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!