powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Динамическая установка фильтров в Interactive Grid
9 сообщений из 9, страница 1 из 1
Динамическая установка фильтров в Interactive Grid
    #39560317
S-V-E
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Задача состоит в том, чтобы фильтровать содержимое грида, перемещаясь по другим элементам страницы. Фильтрация происходит только в соответствующем режиме, который переключается кнопкой на тулбаре грида. Сам набор данных (запрос), на котором основан грид, не надо фильтровать, т.е. имеется в виду что запрос будет без всяких параметров (переменных привязки). Нужно чтобы фильтры формировались самим гридом, чтобы пользователь видел, как отфильтрованы данные и мог этот фильтр поменять или отключить. При включении режима "связки" фильтры, которые были установлены ранее, должны переформировываться согласно текущим данным на странице.

Формирование фильтров выполняется следующим кодом, который указан в свойстве страницы "Function and Global Variable Declaration":
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var relGrid = false;

function setFilterToGrid (col, val) {
    if (relGrid) {
        var columnID, 
            filterID,
            cols = apex.region("EMP").widget().interactiveGrid("getViews","grid").view$.grid("getColumns");
            filters = apex.region("EMP").widget().interactiveGrid("getFilters");
        for (i = 0; i < cols.length; i++) {
            if (cols[i].name == col) { columnID = cols[i].id; }
        }
        for (i = 0; i < filters.length; i++) {
            if (filters[i].columnId == columnID) { filterID = filters[i].id; }
        }
        if (val) {
            var newFilter = {columnId:columnID, columnType:"column", isEnabled:true, type:"column"};
            if (filterID) apex.region("EMP").widget().interactiveGrid("deleteFilter", filterID);
            newFilter.operator = "EQ";
            newFilter.value = val;
            apex.region("EMP").widget().interactiveGrid("addFilter", newFilter);
        } else {
            if (filterID) apex.region("EMP").widget().interactiveGrid("deleteFilter", filterID);
        }
    }
}



relGrid - означает включен режим связи или нет. Вот код добавления в тулбар грида кнопки, которая управляет этим режимом:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
function (config) {
    var $ = apex.jQuery,
        newToolbarData = $.apex.interactiveGrid.copyDefaultToolbar(),
        newToolbarGroup = newToolbarData.toolbarFind("actions1"); 
    
    newToolbarGroup.controls.push( {
        type: "TOGGLE",
        //type: "BUTTON",
        action: "set-relation"
    });    
    config.toolbarData = newToolbarData;

    config.initActions = function (actions) {
        actions.add( {
            name: "set-relation",
            labelKey: "Set relation with charts",
            set: function () {
                    // если есть значения фильтров - спросим, применять ли их
                    if (!relGrid) {
                        if ($v("P1_DEP") || $v("P1_JOB")) {
                            if (confirm("Внимание! Фильтры графиков перезапишут фильтры в таблице. Продолжить?")) {
                                relGrid = !relGrid;
                                var filters = apex.region("EMP").widget().interactiveGrid("getFilters");
                                for (i = 0; i < filters.length; i++) {
                                    apex.region("EMP").widget().interactiveGrid("deleteFilter", filters[i].id);
                                }
                                //apex.region("EMP").widget().interactiveGrid("getActions").invoke("reset-report");
                                if ($v("P1_DEP")) setFilterToGrid("DNAME", $v("P1_DEP"));
                                if ($v("P1_JOB")) setFilterToGrid("JOB", $v("P1_JOB"));
                            }
                        } else relGrid = !relGrid;
                    } else relGrid = !relGrid;
                 },
            get: function () { return relGrid; }
            //action: function () { relGrid = !relGrid; }
        } );
    }
    
    return config;
}



Проблема заключается в том, что когда повторно включаешь фильтрацию этот код вместо того, чтобы удалить все предыдущие фильтры дублирует их. Какие-то он удаляет и перезаписывает, но в большинстве случаев просто добавляет новые. Складывается такое впечатление, что программа не ждет удаления или вовсе его не выполняет. Хотя при работе "вручную" - при изменении элементов страницы - все происходит как надо.

Вот набросал пример иллюстрирующий данную проблему. Логин/пароль - test/test. Выбор данных в графике выполняется двойным кликом.
...
Рейтинг: 0 / 0
Динамическая установка фильтров в Interactive Grid
    #39560363
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну тут на лицо распространненая ошибка. Вы забыли что асинхроность. Именно поэтому вручную у вас работает, а автоматически нет.
По просту говоря, прежде чем установить новый фильтр, вы должны дождаться выполнения удаления фильтров.
...
Рейтинг: 0 / 0
Динамическая установка фильтров в Interactive Grid
    #39560408
DevOps
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangel,
А где вы здесь увидели асинхронность? Что-то не могу найти
...
Рейтинг: 0 / 0
Динамическая установка фильтров в Interactive Grid
    #39560553
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DevOpsblkangel,
А где вы здесь увидели асинхронность? Что-то не могу найти
В том то и дело, что автор этого не учел, поэтому и не видите.
...
Рейтинг: 0 / 0
Динамическая установка фильтров в Interactive Grid
    #39560567
S-V-E
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangel,
получается, что действия по очистке фильтров и их установке нужно разнести по отдельным асинхронным функциям, так? Подскажите, в каком направлении копать. Просто в JS и APEX буквально месяц-полтора.
...
Рейтинг: 0 / 0
Динамическая установка фильтров в Interactive Grid
    #39560571
DevOps
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangel,
Какие то функции у APEX API асинхронные что ли?
...
Рейтинг: 0 / 0
Динамическая установка фильтров в Interactive Grid
    #39560625
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очистка фильтра и установка фильтра это асинхронные Ajax вызовы. Результат возрата этих функий полная перерисовка региона. Кстати пользователь это будет видеть, что сначала регион очистился от фильтров, потом фильтр установил, поэтому если есть API то и удаление и установку надо делать одним вызовом.

Если такой возможности нет. то после удаления фильтров необходимо дождается его выполения и на событие "apexafterrefresh" запустить функцию установки фильтра.

P.S. Выполнение функции на событие надо очишать, иначе она будет срабатывать и при установки фильтра пользователем.

P.S.S. В Вашем скрипте я вижу очистку фильтров в двух местах, возможно так и надо...
...
Рейтинг: 0 / 0
Динамическая установка фильтров в Interactive Grid
    #39562834
S-V-E
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangel,
спасибо за советы, особенно про API. Это еще раз заставило меня открыть interactiveGrid.min.js, собственно где я и нашел функции addFilter/deleteFilter, и еще раз прошерстить его по слову "Filter" :) Таким образом я нашел место где эти функции вызываются с параметром в виде объекта:
Код: javascript
1.
2.
3.
4.
5.
{
  save: !1,
  refreshData: !1,
  skipNoChangesCheck: !0
}


Его значения и управляют перерисовкой грида. Вот как я это применил в атрибутах самого грида:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
function (config) {
    var $ = apex.jQuery,
        newToolbarData = $.apex.interactiveGrid.copyDefaultToolbar(),
        newToolbarGroup = newToolbarData.toolbarFind("actions1"); 
    
    newToolbarGroup.controls.push( {
        type: "TOGGLE",
        action: "set-relation"
    });    
    config.toolbarData = newToolbarData;

    config.initActions = function (actions) {
        actions.add( {
            name: "set-relation",
            labelKey: "Set relation with charts",
            set: function () {
                    // если есть значения фильтров - спросим, применять ли их
                    if (!relGrid) {
                        if ($v("P1_DEP") || $v("P1_JOB")) {
                            if (confirm("Внимание! Фильтры графиков перезапишут фильтры в таблице. Продолжить?")) {
                                relGrid = !relGrid;
                                var filters = apex.region("EMP").widget().interactiveGrid("getFilters");
                                for (i = 0; i < filters.length; i++) {
                                    apex.region("EMP").widget().interactiveGrid("deleteFilter", filters[i].id, {save: false, refreshData: false, skipNoChangesCheck: true});
                                }
                                if ($v("P1_DEP")) setFilterToGrid("DNAME", $v("P1_DEP"), {save: false, refreshData: false, skipNoChangesCheck: true});
                                if ($v("P1_JOB")) setFilterToGrid("JOB", $v("P1_JOB"), {save: true, refreshData: true, skipNoChangesCheck: true});
                            }
                        } else relGrid = !relGrid;
                    } else relGrid = !relGrid;
                 },
            get: function () { return relGrid; }
        } );
    }

    return config;
}


Главное, чтобы в последней команде управления фильтрами свойства save и refreshData были true . Код добавления/обновления фильтров:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
var relGrid = false;

function setFilterToGrid (col, val, par) {
    if (relGrid) {
        var columnID, 
            filterID,
            cols = apex.region("EMP").widget().interactiveGrid("option").config.columns,
            filters = apex.region("EMP").widget().interactiveGrid("getFilters"),
            params = par || {save: true, refreshData: true, skipNoChangesCheck: true};
        for (i = 0; i < cols.length; i++) {
            if (cols[i].name == col) { columnID = cols[i].id; }
        }
        for (i = 0; i < filters.length; i++) {
            if (filters[i].columnId == columnID) { filterID = filters[i].id; }
        }
        if (val) {
            var newFilter = {columnId:columnID, columnType:"column", isEnabled:true, type:"column"};
            newFilter.operator = "EQ";
            newFilter.value = val;
            if (filterID) {
                apex.region("EMP").widget().interactiveGrid("updateFilter", filterID, newFilter, params);
            } else {            
                apex.region("EMP").widget().interactiveGrid("addFilter", newFilter, params);
            }
        } else {
            if (filterID) apex.region("EMP").widget().interactiveGrid("deleteFilter", filterID, params);
        }
    }
}



Работу всего этого вживую можно увидеть в том же примере из моего первого поста. Кстати, кто-нибудь знает где найти файл interactiveGrid.js ?
...
Рейтинг: 0 / 0
Динамическая установка фильтров в Interactive Grid
    #39562951
non-apexoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S-V-E, widget.interactiveGrid.js можно найти почти там же, что и сжатый вариант. Например, для публичного хостинга от Oracle это https://apex.oracle.com/i/libraries/apex/widget.interactiveGrid.js Ну и в каталоге инсталляции Apex apex/images/libraries/apex, если таковой доступен вам.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Динамическая установка фильтров в Interactive Grid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]