Question

Detail Filters

Hello all,

I am trying to save detail filters after crossing between sections. For example

I have set the details filters => the records have been filteres.  After that I entered into the other section and returned back. There aren't any filters.

What I have done:

For example, if we will do such actions on section,everything will be ok and filters will be saved. So I have write setFilters and saveFilters methods. I built upon these methods from section. In SysProfileData I have saved the KEY = AccountPageV2Schema11DetailFilters ( getFiltersKey method)

getFiltersKey: function() {
                    var cardName = this.values.CardPageName;
                    var schemaName = this.name;
                    return cardName + schemaName + "Filters";

}

But unfortunately, it doesn't work. How can I solve this problem ? Maybe I build incorrect template([PageName][SchemaDetail]Filters)? Thanks a lot!

Full code:

<pre>

define("BaseGridDetailV2", ["BaseGridDetailV2Resources", "ConfigurationEnums", "RightUtilities",
    "ProcessModuleUtilities", "GridUtilitiesV2", "WizardUtilities", "QuickFilterModuleV2", "ProcessEntryPointUtilities"
], function(resources, enums, RightUtilities) {
    return {
        messages: {},
        mixins: {},
        attributes: {
            // "ProfileFilters": {
            //         dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT
            //     }
        },
        methods: {
            // filterCurrentSection: function(args) {
            //         if (args.schemaName !== "" && args.schemaName !== this.entitySchema.name) {
            //             return false;
            //         }
            //         var column = {
            //             value: this.entitySchema.primaryDisplayColumn.name,
            //             displayValue: this.entitySchema.primaryDisplayColumn.caption,
            //             dataValueType: this.entitySchema.primaryDisplayColumn.dataValueType
            //         };
            //         var filters = [{
            //             value: args.value,
            //             column: column
            //         }];
            //         var quickFilterModuleId = this.getQuickFilterModuleId();
            //         this.sandbox.publish("SetCustomFilters", filters, [quickFilterModuleId]);
            //         return true;
            //     },
            subscribeSandboxEvents: function() {
                this.callParent(arguments);
                var editPages = this.getEditPages();
                editPages.each(function(editPage) {
                    var typeColumnValue = editPage.get("Tag");
                    var cardModuleId = this.getEditPageSandboxId(editPage);
                    this.sandbox.subscribe("getCardInfo", function() {
                        var detailInfo = this.getDetailInfo();
                        var cardInfo = {
                            valuePairs: detailInfo.defaultValues || []
                        };
                        var typeColumnName = this.get("TypeColumnName");
                        if (typeColumnName && typeColumnValue) {
                            cardInfo.typeColumnName = typeColumnName;
                            cardInfo.typeUId = typeColumnValue;
                        }
                        return cardInfo;
                    }, this, [cardModuleId]);
                }, this);
                this.sandbox.subscribe("CardSaved", this.onCardSaved, this, [this.sandbox.id]);
                //
                // this.initGetFiltersMessage();
                // var quickFilterModuleId = this.getQuickFilterModuleId();
                // this.sandbox.subscribe("CustomFilterExtendedMode", this.showCustomFilterExtendedMode, this,
                //         [quickFilterModuleId, folderManagerModuleId]);
                //
                this.subscribeGetModuleSchema();
                this.subscribeFiltersChanged();
                this.subscribeGetShortFilterFieldsVisible();
                this.sandbox.subscribe("GetRecordInfo", this.getRecordInfo, this,
                    [this.getRecordRightsSetupModuleId()]);
                this.sandbox.subscribe("GetExtendedFilterConfig", this.getExtendedFilterConfig, this,
                    [this.getQuickFilterModuleId()]);
            },

            init: function(callback, scope) {
                this.callParent([function() {
                    this.mixins.WizardUtilities.canUseWizard(function(result) {
                        this.set("IsDetailWizardAvailable", result);
                        callback.call(scope);
                    }, this);
                }, this]);
                this.registerMessages();
                this.initDetailFilterCollection(); // return this.set("DetailFilters", this.Ext.create("Terrasoft.FilterGroup"));
                this.initFilterVisibility();
                this.isFilterAdded();
                var sandboxId = this.getQuickFilterModuleId();
                this.sandbox.subscribe("InitFilterFromStorage", function() {
                    this.sandbox.publish("LoadedFiltersFromStorage", null, [sandboxId]);
                }, this, [sandboxId]);
            },
            initFilterVisibility: function() {
                this.set("IsDetailFilterVisible", true);
                this.set("IsFilterAdded", true);
            },
            setFilter: function(key, value, filtersValue) {
                var filters = this.get("DetailFilters");
                if (key) {
                    if (filters.find(key)) {
                        filters.remove(filters.get(key));
                    }
                    filters.add(key, value);
                    // 
                    this.saveFilter(key, filtersValue, value);
                    //
                } else if (value) {
                    value.each(function(filter) {
                        this.setFilter(filter.key, filter);
                    }, this);
                }
            },
            saveFilter: function(filterKey, filterValue, filter) {
                    if (!filterValue) {
                        return;
                    }
                    var sessionFilters = this.getSessionFilters();
                    var profileFilters = this.getProfileFilters();
                    var serializableFilter = this.getSerializableFilter(filter);
                    switch (filterKey) {
                        case "CustomFilters":
                            Terrasoft.each(filterValue, function(item) {
                                var f = item.filter = item.value || "";
                                var isSerializedFilter = (typeof f === "string" && f.indexOf("[") >= 0 && f.indexOf("]") >= 0 &&
                                    f.indexOf("{") >= 0 && f.indexOf("}") >= 0);
                                if (!isSerializedFilter) {
                                    item.filter = Terrasoft.encode(serializableFilter);
                                }
                            });
                            if (this.isNotEmpty(filterValue)) {
                                sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;
                            } else {
                                delete sessionFilters.CustomFilters;
                                delete profileFilters.CustomFilters;
                            }
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            this.set("ProfileFilters", profileFilters);
                            // sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;
                            // Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            // this.set("ProfileFilters", profileFilters);
                            break;
                        case "FolderFilters":
                            sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            this.set("ProfileFilters", profileFilters);
                            break;
                        case "FixedFilters":
                            filterValue.filter = Terrasoft.encode(serializableFilter);
                            profileFilters[filterKey] = {Fixed: filterValue};
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            this.set("ProfileFilters", profileFilters);
                            break;
                        case "TagFilters":
                            serializableFilter.tags = filterValue;
                            profileFilters[filterKey] = [serializableFilter];
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            this.set("ProfileFilters", profileFilters);
                            break;
                        default:
                            sessionFilters[filterKey] = profileFilters[filterKey] = [
                                {
                                    filter: filter.serialize()
                                }
                            ];
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                    }
            },
            getSessionFilters: function() {
                var storage = Terrasoft.configuration.Storage.Filters = Terrasoft.configuration.Storage.Filters || {};
                var sessionFilters = storage[this.name] = storage[this.name] || {};
                return sessionFilters;
            },
            getProfileFilters: function() {
                    return this.get("ProfileFilters") || {};
            },
            getSerializableFilter: function(filter) {
                    filter.serializationInfo = {serializeFilterManagerInfo: true};
                    var serializableFilter = {};
                    filter.getSerializableObject(serializableFilter, filter.serializationInfo);
                    return serializableFilter;
            },
            getFiltersKey: function() {
                    var cardName = this.values.CardPageName;
                    var schemaName = this.name;
                    //return cardName + schemaName + "Filters";
                    return schemaName + "Filters";
            }
        },
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});
 

</pre>

Like

6 comments

HI,

There is no built-in functionality for saving detail filters. Visit BaseGridDetailV2 schema and explore its functionality. As a workaround you can save your filters to cache and use load them from there when open the detail again

Peter Vdovukhin writes:

HI,

There is no built-in functionality for saving detail filters. Visit BaseGridDetailV2 schema and explore its functionality. As a workaround you can save your filters to cache and use load them from there when open the detail again

 

Thanks, I have already done it => these methods are in my replaced BaseGridDetailV2. About cache... so is saving data in SysProfileData  senselessly? To tell the truth, I Understand the main idea,but i don't know the alternative way to solve this problem. So as I Understand SysProfileData is senselessly and i should to find other way?

Somehow didn't see full code in your question. Your case is not about saving filter and setting right [key] for SysProfileData. It is about automatic loading your filters from the profile. In BaseSectionV2 you have loadProfileFilters() function that loads filters by key from storage, but you don't have a similar function in BaseGridDetail. If you want such functionality you should write it.

Peter Vdovukhin,Oh ok, thanks!

Peter Vdovukhin writes:

Somehow didn't see full code in your question. Your case is not about saving filter and setting right [key] for SysProfileData. It is about automatic loading your filters from the profile. In BaseSectionV2 you have loadProfileFilters() function that loads filters by key from storage, but you don't have a similar function in BaseGridDetail. If you want such functionality you should write it.

Excuse me,I have been written logic from Section on my BaseGridDetailV2 module; Here is a code

define("BaseGridDetailV2", ["BaseGridDetailV2Resources", "ConfigurationEnums", "RightUtilities","TagConstantsV2",
    "ProcessModuleUtilities", "GridUtilitiesV2", "WizardUtilities", "QuickFilterModuleV2", "ProcessEntryPointUtilities"
], function(resources, enums, RightUtilities, TagConstantsV2) {
    return {
        messages: {},
        mixins: {},
        attributes: {
            "ProfileFilters": {
                    dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT
            },
            "IsDetailFiltersLoaded": {
                    dataValueType: Terrasoft.DataValueType.BOOLEAN,
                    value: false
            },
            "DetailFilters": {
                    dataValueType: Terrasoft.DataValueType.COLLECTION
            }
        },
        methods: {
            subscribeSandboxEvents: function() {
                this.callParent(arguments);
                var editPages = this.getEditPages();
                editPages.each(function(editPage) {
                    var typeColumnValue = editPage.get("Tag");
                    var cardModuleId = this.getEditPageSandboxId(editPage);
                    this.sandbox.subscribe("getCardInfo", function() {
                        var detailInfo = this.getDetailInfo();
                        var cardInfo = {
                            valuePairs: detailInfo.defaultValues || []
                        };
                        var typeColumnName = this.get("TypeColumnName");
                        if (typeColumnName && typeColumnValue) {
                            cardInfo.typeColumnName = typeColumnName;
                            cardInfo.typeUId = typeColumnValue;
                        }
                        return cardInfo;
                    }, this, [cardModuleId]);
                }, this);
                this.sandbox.subscribe("CardSaved", this.onCardSaved, this, [this.sandbox.id]);
                this.subscribeGetModuleSchema();
                this.subscribeFiltersChanged();
                this.subscribeGetShortFilterFieldsVisible();
                this.sandbox.subscribe("GetRecordInfo", this.getRecordInfo, this,
                    [this.getRecordRightsSetupModuleId()]);
                this.sandbox.subscribe("GetExtendedFilterConfig", this.getExtendedFilterConfig, this,
                    [this.getQuickFilterModuleId()]);
            },

            init: function(callback, scope) {
                this.callParent([function() {
                    this.mixins.WizardUtilities.canUseWizard(function(result) {
                        this.set("IsDetailWizardAvailable", result);
                        callback.call(scope);
                    }, this);
                }, this]);
                this.registerMessages();
                this.initDetailFilterCollection();
                //
                //this.initDetailFiltersCollection();
                this.loadProfileFilters();
                //
                this.initFilterVisibility();
                this.isFilterAdded();
                var sandboxId = this.getQuickFilterModuleId();
                this.sandbox.subscribe("InitFilterFromStorage", function() {
                    this.sandbox.publish("LoadedFiltersFromStorage", null, [sandboxId]);
                }, this, [sandboxId]);
            },
            loadProfileFilters: function(callback, scope) {
                    var isDetailFiltersLoaded = this.get("IsDetailFiltersLoaded");
                    if (isDetailFiltersLoaded) {
                        Ext.callback(callback, scope);
                        return;
                    }
                    var profileKey = Ext.String.format("profile!{0}", this.getFiltersKey());
                    Terrasoft.require([profileKey], function(profile) {
                        this.onLoadProfileFilters(callback, scope, profile);
                    }, this);
            },
            onLoadProfileFilters: function(callback, scope, profile) {
                    this.loadFiltersContainersVisibility(profile);
                    this.initFilterAttributes(profile);
                    this.set("IsDetailFiltersLoaded", true);
                    Ext.callback(callback, scope);
            },
            loadFiltersContainersVisibility: function(profile) {
                    if (profile) {
                        if (Ext.isDefined(profile.isFoldersContainerExpanded)) {
                            this.set("IsFoldersVisible", profile.isFoldersContainerExpanded);
                        }
                        if (Ext.isDefined(profile.isExtendedFiltersContainerExpanded)) {
                            this.set("IsExtendedFiltersVisible", profile.isExtendedFiltersContainerExpanded);
                        }
                    }
            },
            initFilterAttributes: function(profile) {
                    var sessionFilters = this.getSessionFilters();
                    this.set("SessionFilters", sessionFilters);
                    var profileFilters = Terrasoft.deepClone(profile);
                    var fixedSessionFilters = this._getFixedSessionFilters();
                    Terrasoft.each(profileFilters, this.applyFilters, this);
                    Terrasoft.each(fixedSessionFilters, this.applyFilters, this);
                    this.set("ProfileFilters", profileFilters);
            },
            _getFixedSessionFilters: function() {
                    var sessionFilters = this.getSessionFilters();
                    var primaryDisplayColumn = this.entitySchema.primaryDisplayColumn;
                    var customFilters = sessionFilters.CustomFilters;
                    var customFiltersPrimaryDisplayColumn = customFilters && customFilters.primaryDisplayColumn;
                    if (customFiltersPrimaryDisplayColumn && primaryDisplayColumn) {
                        var sessionFiltersFixed = {};
                        sessionFiltersFixed.CustomFilters = {};
                        sessionFiltersFixed.CustomFilters[primaryDisplayColumn.name] = customFilters;
                        sessionFilters = sessionFiltersFixed;
                    }
                    return sessionFilters;
            },
            applyFilters: function(filterValue, key) {
                    if (key.match(/filters/i) && !this.isNotEmpty(filterValue)) {
                        return;
                    }
                    var detailFiltersValue = this.get("DetailFiltersValue");
                    if (!Ext.isString(filterValue)) {
                        detailFiltersValue.removeByKey(key);
                        this._chooseFilterProccesing(filterValue, key);
                    }
                    if (key !== "FixedFilters") {
                        detailFiltersValue.add(key, filterValue);
                    }
            },
            initDetailFiltersCollection : function(){
                    this.set("ProfileFilters", {});
                    this.set("DetailFilters", this.Ext.create("Terrasoft.FilterGroup"));
                    this.set("DetailFiltersValue", this.Ext.create("Terrasoft.Collection"));
            },
            _chooseFilterProccesing: function(filterValue, key) {
                    var detailFilters = this.get("DetailFilters");
                    Terrasoft.each(filterValue, function(item, propName) {
                        if (item.key === TagConstantsV2.TagFilterKey || key === TagConstantsV2.TagFilterKey) {
                            this.applyTagFilter(key, item);
                        }
                        if (propName === "Fixed") {
                            this._applyFixedFilter(key, item);
                        }
                        if (item.filter) {
                            var filter = Terrasoft.deserialize(item.filter);
                            if (!detailFilters.contains(key)) {
                                detailFilters.add(key, filter);
                            }
                        } else if (item.primaryDisplayColumn) {
                            this.applyPrimaryColumnFilter(key, item);
                        } else if (item.folderInfo || item.folderType) {
                            this.applyFolderFilter(key, item);
                        }
                    }, this);
            },
            //
            initFilterFromStorage: function() {
                    this.loadProfileFilters(function() {
                        this.sandbox.publish("LoadedFiltersFromStorage", null, this.getFilterModulesIds());
                    }, this);
            },
            initFilterVisibility: function() {
                this.set("IsDetailFilterVisible", true);
                this.set("IsFilterAdded", true);
            },
            setFilter: function(key, value, filtersValue) {
                var filters = this.get("DetailFilters");
                if (key) {
                    if (filters.find(key)) {
                        filters.remove(filters.get(key));
                    }
                    filters.add(key, value);
                    // 
                    this.saveFilter(key, filtersValue, value);
                    //
                } else if (value) {
                    value.each(function(filter) {
                        this.setFilter(filter.key, filter);
                    }, this);
                }
            },
            saveFilter: function(filterKey, filterValue, filter) {
                    if (!filterValue) {
                        return;
                    }
                    var sessionFilters = this.getSessionFilters();
                    var profileFilters = this.getProfileFilters();
                    var serializableFilter = this.getSerializableFilter(filter);
                    switch (filterKey) {
                        case "CustomFilters":
                            Terrasoft.each(filterValue, function(item) {
                                var f = item.filter = item.value || "";
                                var isSerializedFilter = (typeof f === "string" && f.indexOf("[") >= 0 && f.indexOf("]") >= 0 &&
                                    f.indexOf("{") >= 0 && f.indexOf("}") >= 0);
                                if (!isSerializedFilter) {
                                    item.filter = Terrasoft.encode(serializableFilter);
                                }
                            });
                            if (this.isNotEmpty(filterValue)) {
                                sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;
                            } else {
                                delete sessionFilters.CustomFilters;
                                delete profileFilters.CustomFilters;
                            }
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            this.set("ProfileFilters", profileFilters);
                            break;
                        case "FolderFilters":
                            sessionFilters[filterKey] = profileFilters[filterKey] = filterValue;
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            this.set("ProfileFilters", profileFilters);
                            break;
                        case "FixedFilters":
                            filterValue.filter = Terrasoft.encode(serializableFilter);
                            profileFilters[filterKey] = {Fixed: filterValue};
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            this.set("ProfileFilters", profileFilters);
                            break;
                        case "TagFilters":
                            serializableFilter.tags = filterValue;
                            profileFilters[filterKey] = [serializableFilter];
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                            this.set("ProfileFilters", profileFilters);
                            break;
                        default:
                            sessionFilters[filterKey] = profileFilters[filterKey] = [
                                {
                                    filter: filter.serialize()
                                }
                            ];
                            Terrasoft.saveUserProfile(this.getFiltersKey(), profileFilters, false);
                    }
            },
            getSessionFilters: function() {
                var storage = Terrasoft.configuration.Storage.Filters = Terrasoft.configuration.Storage.Filters || {};
                var sessionFilters = storage[this.name] = storage[this.name] || {};
                return sessionFilters;
            },
            getProfileFilters: function() {
                    return this.get("ProfileFilters") || {};
            },
            getSerializableFilter: function(filter) {
                    filter.serializationInfo = {serializeFilterManagerInfo: true};
                    var serializableFilter = {};
                    filter.getSerializableObject(serializableFilter, filter.serializationInfo);
                    return serializableFilter;
            },
            getFiltersKey: function() {
                    var cardName = this.values.CardPageName;
                    var schemaName = this.name;
                    return cardName + schemaName + "Filters";
            }
        },
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});
 

But Terrasoft.configuration.Storage.Filters has got on my detail object - it is empty and there are not any properties with filters. How can I fill it in Storage?

 

 

Hi, Nikita.

Check loadProfileFilters function. Compare calling it from a section to calling from a detail. Especially check what profile is used and how it is stored in a database

 

Log in or register to comment