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

Формирование фильтров выполняется следующим кодом, который указан в свойстве страницы "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
28.11.2017, 10:23
    #39560363
blkangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая установка фильтров в Interactive Grid
Ну тут на лицо распространненая ошибка. Вы забыли что асинхроность. Именно поэтому вручную у вас работает, а автоматически нет.
По просту говоря, прежде чем установить новый фильтр, вы должны дождаться выполнения удаления фильтров.
...
Рейтинг: 0 / 0
28.11.2017, 11:21
    #39560408
DevOps
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая установка фильтров в Interactive Grid
blkangel,
А где вы здесь увидели асинхронность? Что-то не могу найти
...
Рейтинг: 0 / 0
28.11.2017, 14:03
    #39560553
blkangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая установка фильтров в Interactive Grid
DevOpsblkangel,
А где вы здесь увидели асинхронность? Что-то не могу найти
В том то и дело, что автор этого не учел, поэтому и не видите.
...
Рейтинг: 0 / 0
28.11.2017, 14:20
    #39560567
S-V-E
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая установка фильтров в Interactive Grid
blkangel,
получается, что действия по очистке фильтров и их установке нужно разнести по отдельным асинхронным функциям, так? Подскажите, в каком направлении копать. Просто в JS и APEX буквально месяц-полтора.
...
Рейтинг: 0 / 0
28.11.2017, 14:25
    #39560571
DevOps
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая установка фильтров в Interactive Grid
blkangel,
Какие то функции у APEX API асинхронные что ли?
...
Рейтинг: 0 / 0
28.11.2017, 15:22
    #39560625
blkangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая установка фильтров в Interactive Grid
Очистка фильтра и установка фильтра это асинхронные Ajax вызовы. Результат возрата этих функий полная перерисовка региона. Кстати пользователь это будет видеть, что сначала регион очистился от фильтров, потом фильтр установил, поэтому если есть API то и удаление и установку надо делать одним вызовом.

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

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

P.S.S. В Вашем скрипте я вижу очистку фильтров в двух местах, возможно так и надо...
...
Рейтинг: 0 / 0
01.12.2017, 19:36
    #39562834
S-V-E
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая установка фильтров в Interactive Grid
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
02.12.2017, 11:13
    #39562951
non-apexoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая установка фильтров в Interactive Grid
S-V-E, widget.interactiveGrid.js можно найти почти там же, что и сжатый вариант. Например, для публичного хостинга от Oracle это https://apex.oracle.com/i/libraries/apex/widget.interactiveGrid.js Ну и в каталоге инсталляции Apex apex/images/libraries/apex, если таковой доступен вам.
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Динамическая установка фильтров в Interactive Grid / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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