Jump to content

Очистка фильтров


zilav

Recommended Posts

Уважаемый Шерзод, есть пара вопросов. Я реализовал свои алгоритмы фильтрации в гриде, так как у тех же дат например есть готовые шаблоны типа "прошлый месяц" я убрал автоматическую фильтрацию и оставил включение фильтрации по нажатию Enter. На uniEdit выводится значок очистки, но он он только очищает значение контрола, а Enter приходится нажимать руками. Соответственно первый вопрос, как можно перехватить очистку контрола и сделать помимо очистки еще и принудительное нажатие Enter?

Вопрос второй, при наложении фильтра в гриде есть значок сброса фильтра, но он опять же только чистит значение контролов-фильтров, но при этом Enter опять же приходится нажимать самому. Как перехватить нажатие на эту очистку фильтров и тоже сделать нормальную полную автоматическую очистку фильтров?

2021-04-28_13-07-28.png.6851b4a1609a6730583b5a97ccd4bc49.png

Link to comment
Share on other sites

Нет, я сам себе написал универсальный хелпер к гриду, он позволяет цеплять вот типа таких фильтров на разные типы полей, там по идее даже смешнее есть фильтры на дату, "вчера", "прошлая неделя", "прошлый месяц" и т.д. Для нумерик полей поддерживается запись диапазонов тоже например "2-7,62" (от 2.00 до 7.62). Для чекбокс полей 2 тоже свой фильтр, позволяет задать значения которые будут отображаться в комбобоксе фильтра для true и false, ну или 0 и 1 (мало ли поле не типа ftBoolean).

Link to comment
Share on other sites

Сейчас вот сижу и думаю как бы на кнопку очистки еще и нажатие кнопки Enter сразу прибить, а то получается что я нажимаю кнопку очистки у контрола, но фильтр по факту не сбрасывается, а только очищается, для сброса приходится ставить курсор в контрол и руками Enter нажимать. 

Пока по форуму нашел либо вот этот вариант

UniEdit1.JSInterface.JSCode(#1'.plugins.forEach(function(p) {if (p.alias[0] == "plugin.clearbutton") {p.clearButtonEl.dom.click()}});');

либо вообще вешаться на триггер и делать уже на сервере, как описано тут

Trigger ClearButton - General - uniGUI Discussion Forums

но тут посути лишний раз сервер дергаться будет, поэтому первый вариант выполняющийся прямо на сервере предпочтительнее.

Link to comment
Share on other sites

2 minutes ago, zilav said:

Сейчас вот сижу и думаю как бы на кнопку очистки еще и нажатие кнопки Enter сразу прибить, а то получается что я нажимаю кнопку очистки у контрола, но фильтр по факту не сбрасывается, а только очищается, для сброса приходится ставить курсор в контрол и руками Enter нажимать. 

Здравствуйте,

Простите, уточните пожалуйста.

Link to comment
Share on other sites

1 minute ago, Sherzod said:

Здравствуйте,

Простите, уточните пожалуйста.

У TUniEdit контролов вставляемых в качестве фильтра я отключит автоматическую фильтрацию, так как пользователи не всегда сходу быстро способны набрать значения фильтров типа "прошлая неделя" или "01.01.2021-01.01.2021", ошибки нажатий и все такое. Именно поэтому автоматическая фильтрация в процессе набора строки фильтра отключена, и включается по четкому нажатию Enter.

Но при этом проявляется эффект при котором стандартная кнопка очистки фильтра просто очищает значение контрола, но так как фильтр начинает отрабатывать только после нажатия Enter, то визуально контрол фильтра очищен, но без нажатого Enter не включается. Поэтому и хочется чтобы стандартная кнопка очистки не только очищала контрол но и автоматом нажимала бы Enter для отработки фильтра.

Контролы для фильтров у меня создаются автоматом, например вот для даты

function TUniDbGridHelper.CreateFilter_Date(ParentPanel: TUniHiddenPanel; FieldName: string): TUniEdit;
var
  col: TUniBaseDbGridColumn;
  ds: TDataset;
begin
  col:= self.Columns.ColumnFromFieldName(FieldName);
  ds:= self.DataSource.DataSet;

  result := TUniEdit.Create(ParentPanel);
  Result.Name:= 'edtFilter_'+FieldName;
  result.Parent := ParentPanel;

  Result.CharEOL:= #13;
  result.ClearButton := True;

  col.Filtering.ChangeDelay:= 800;
  col.Filtering.Editor:= Result;
  col.Filtering.Enabled:= true;

end;

Вот этот самый Result.CharEOL:= :13 фактически отключает автофильтр и делает его включение строго на Enter

Link to comment
Share on other sites

55 minutes ago, zilav said:

но без нажатого Enter не включается.

Попробуйте такое решение:

UniDBGrid -> ClientEvents -> ExtEvents ->

function reconfigure(sender, store, columns, oldStore, oldColumns, eOpts) 
{
    columns.forEach(function(col) {
        if (col.fedit && col.fedit.getTriggers() && col.fedit.getTriggers().clear) {
            col.fedit.getTriggers().clear.el.addListener('click', function(event) {
                event.keyCode = 13;
                col.fedit.fireEvent('keydown', col.fedit, event);
            })
        }
    });
}

 

  • Like 1
Link to comment
Share on other sites

Шерзод, работает, огромное спасибо, пользователи начали лепить вашу скульптуру из папье-маше в натуральную величину :)

Пара доп. вопросов если можно:

  1. Работает при задании в дизайн-тайме, перевешивание на добавление в рантайме к сожалению сходу не работает, это вообще возможно технически?
  2. Очистка работает на каждой колонке отдельно, но есть еще кнопка полной очистки фильтров, появляющаяся при включенном фильтре, на ней все осталось по-старому, очищаются только сами контролы фильтров, без отработки нажатия Enter, туда встроить нажатие можно?
Link to comment
Share on other sites

5 minutes ago, zilav said:

Работает при задании в дизайн-тайме, перевешивание на добавление в рантайме к сожалению сходу не работает, это вообще возможно технически?

Должно работать.

5 minutes ago, zilav said:

Очистка работает на каждой колонке отдельно, но есть еще кнопка полной очистки фильтров, появляющаяся при включенном фильтре, на ней все осталось по-старому, очищаются только сами контролы фильтров, без отработки нажатия Enter, туда встроить нажатие можно?

Я проанализирую.

6 minutes ago, zilav said:

пользователи начали лепить вашу скульптуру из папье-маше в натуральную величину :)

😂

Link to comment
Share on other sites

3 minutes ago, Sherzod said:
10 minutes ago, zilav said:

пользователи начали лепить вашу скульптуру из папье-маше в натуральную величину :)

😂

Я бы сильно не рассчитывал, меня они тоже начинали так лепить, а сейчас смотрю на столах только мои куклы вуду, утыканные острыми предметами :)

Link to comment
Share on other sites

10 minutes ago, zilav said:

Очистка работает на каждой колонке отдельно, но есть еще кнопка полной очистки фильтров, появляющаяся при включенном фильтре, на ней все осталось по-старому, очищаются только сами контролы фильтров, без отработки нажатия Enter, туда встроить нажатие можно?

Вы должны обработать это событие, примерно как в демо:

procedure TMainForm.UniDBGrid1ClearFilters(Sender: TObject);
var
  I : Integer;
begin
  if UniMainModule.ADOQuery1.Active then
  begin
    for I := 0 to UniMainModule.ADOQuery1.Parameters.Count-1 do
      UniMainModule.ADOQuery1.Parameters[I].Value:='%%';

    UniMainModule.ADOQuery1.Requery;
  end;
end;

 

Link to comment
Share on other sites

да, reconfigure нормально задал в рантайме, изначально неверно завал. Надо было через AddPair

    reconfigure:=
    'function reconfigure(sender, store, columns, oldStore, oldColumns, eOpts)'+
    '{'+
    '    columns.forEach(function(col) {'+
    '        if (col.fedit && col.fedit.getTriggers() && col.fedit.getTriggers().clear) {'+
    '            col.fedit.getTriggers().clear.el.addListener(''click'', function(event) {'+
    '                event.keyCode = 13;'+
    '                col.fedit.fireEvent(''keydown'', col.fedit, event);'+
    '            })'+
    '        }'+
    '    });'+
    '}';

  Self.ClientEvents.ExtEvents.AddPair('reconfigure',reconfigure);

 

Link to comment
Share on other sites

33 minutes ago, zilav said:

Я бы сильно не рассчитывал, меня они тоже начинали так лепить, а сейчас смотрю на столах только мои куклы вуду, утыканные острыми предметами :)

:)

Link to comment
Share on other sites

22 hours ago, zilav said:

Нет, я сам себе написал универсальный хелпер к гриду, он позволяет цеплять вот типа таких фильтров на разные типы полей, там по идее даже смешнее есть фильтры на дату, "вчера", "прошлая неделя", "прошлый месяц" и т.д. Для нумерик полей поддерживается запись диапазонов тоже например "2-7,62" (от 2.00 до 7.62). Для чекбокс полей 2 тоже свой фильтр, позволяет задать значения которые будут отображаться в комбобоксе фильтра для true и false, ну или 0 и 1 (мало ли поле не типа ftBoolean).

какая красота :) может быть есть возможность/желание оформить паком код на продажу? приобрели бы за какие-то разумные деньги. да и, думаю, было бы интересно многим

Link to comment
Share on other sites

Да ладно, я и так поделюсь, только чур не смеяться, код писался под себя и по качеству ближе всего находится к понятию "гов...код" :) Доделать под себя никаких проблем нет, я там старался как можно проще в лоб все решать, да и доделал еще только вчера. В общем кину в личку, вроде тут очереди особой нет, а мне по идее все равно стыдно. Там попутно в хелпере еще пара функций для сохранения/восстановления настроек колонок в json.

Использовать так, в создание формы пишем

  grd.InstallFilters;
  grd.CreateFilter_String(hidden,'fldString'); // просто TUniEdit с поиском вхождения подстроки
  grd.CreateFilter_Combobox(hidden,'fldCombobox'); // TUniCombobox, заполняется содержимым самого поля
  grd.CreateFilter_Date(hidden,'fldDateTime'); // TUniEdit с поддержкой диапазона дат и значений: сегодня, вчера, завтра, текущая неделя, прошлая неделя, следующая неделя, прошлый месяц, текущий месяц, следующий месяц, текущий год, прошлый год + дописать любые обработчики типа тех же кварталов никаких проблем нет
  grd.CreateFilter_Float(hidden,'fldFloat'); // TUniEdit с поддержкой диапазона, т.е можно написать и 2.34 и 2-10.34
  grd.CreateFilter_Boolean(hidden,'fldBool','Нет','Да'); // TUniCombobox с 2 значениями для true и false, поле должно быть типа ftBoolean
  grd.CreateFilter_Boolean(hidden,'fldBoolInt','-','+'); // посути предыдущий фильтр но работает с ftInteger 0/1


Так же гриду добавляется свойство JSON, соответственно чтение/запись настроек колонок

На уничтожение формы просто добавляем  

grd.RemoveFilters;

 

 

Link to comment
Share on other sites

Планирую добавить еще пару типов фильтров

1) фильтр TUniCombobox с поддержкой заполнения из другого датасета для работы на лукап полях

2) фильтр для чекбоксов, но чтобы значения анализировались не из текущего поля, а из другого поля датасета, а то у меня есть поля в одном из которых нормально 0/1, а поле которое отображается в самом гриде, представляет собой сформированный html с иконками

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...