Вопрос

Фильтр детали

Добрый час суток. Когда на секции задаются фильтры - то соответственно появляется запись в таблице SysProfileData и при переходах по разделам и т.д. после захода вновь на эту секцию фильтры остаются - всё ок. Нужно реализовать "сохранение" фильтров на детали,чтобы при переходах они соответственно не терялись,а сохранялись. Переопределил setFilter и переписал метод saveFilter для BaseGridDetailV2. Запись теперь появляется в SysProfileData(когда ставишь фильтры на детали,до этого не появлялась). И поле Key = Имеет структуру [Имя_страницы][Имя_детали]+"Filters". Как следствие - фильтры все так же не появляются. Правильно ли формируется для этого Key? или нужно другой шаблон/способ? Может не только 1 запись должа вставляться в таблицу а какая то вспомогательная?

Переписанное на BaseGridDetailV2 имеет вид:

methods: {

            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 schemaName = this.name;

                    var cardName = this.values.CardPageName;

                    return cardName + schemaName + "Filters";

            }

        },

Нравится

2 комментария

как я понимаю фильтры должны подгружаться со Storage - вот весь код функционал перенес и метод loadProfileFilters в котором идет заргрузка со Storage

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*/

    };

});

 

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

Главное чтобы вы брали фильтр по тому ключу, который сформировали.

При отладке фильтр возвращается? Где именно ошибка возникает?

Показать все комментарии