Приветствую всех!

Возникла необходимость повесить проверку на кол-во символов в обычном и расширенном фильтрах раздела из-за большого объема результата выборки, который влияет на производительность. Нужно сделать только для одного раздела. 

Изображение удалено.



Мне надо повесить проверку для фильтра "Заголовок".

Если с обычным фильтром можно как-то решить вопрос через getFilter, то как стучать в расширенные?

 

Нравится

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

Здравствуйте Владислав,

 

С расширенными фильтрами так же само, как и с обычными: как только нажимается кнопка "Применить", чтобы применить расширенный фильтр, вызывается тот же метод getFilters из BaseDataView. То есть нужно смотреть как можно заменить логику этого метода.

 

С уважением,

Олег

Удалось достать значения фильтров, но понял что используя getFilter мою задачу реализовать не выйдет. Во-первых я никак не могу переопределить кнопку "применить" из схемы которая рисует и собирает конфиг расширенного фильтра - ExtendedFilterEditModelV2.

Во-вторых, как я понял, в коробке при инициализации раздела по дефолту применяется фильтрация из профайла текущего пользователя и метод getFilter при открытии раздела отрабатывает несколько раз.



Прикрепляю код переопределенной схемы раздела.

 

define("ActivitySectionV2", ["ExtendedFilterEditModelV2"], function(ExtendedFilterEditModelV2) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
 
            getFilters: function () {
                var filters = this.callParent(arguments);
                var customFilters = filters.contains("CustomFilters") ? filters.get("CustomFilters") : null;
                //debugger;
                var count = 0;
                for(var i in customFilters.collection.keys) { 
                    if(customFilters.collection.items[i].isEnabled && customFilters.collection.items[i].leftExpressionCaption == "Заголовок"){ 
                        var headerCaption = customFilters.collection.items[i].rightExpression.parameter.value; //rightExpression.parameter.value
                        if(headerCaption == null || headerCaption.length < 3) { 
                            this.showInformationDialog("WORKING");
                            //this.applyFilters();
                            return filters;
                        }
                    }
                }
                return filters;
            },
 
            applyButton: function() {
                this.showInformationDialog("btn handler works");
            },
        }
 
	};
});

По сути минимально хотелось бы достичь фикса кнопки applyButton, чтобы при apply отлавливать фильтрацию и отображать свое сообщение пользователю.

Буду благодарен за любую помощь.

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

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

 

Подскажите где можно ознакомится с исходным кодом данного окна?

Изображение удалено.

Нравится

1 комментарий
Лучший ответ

Добрый день!

Исходный код данного окна можно посмотреть в модуле ModalBox,

код наполнения окна в модулях StructureExploreModuleV2 и StructureExplorerUtilitiesV2

Добрый день!

Исходный код данного окна можно посмотреть в модуле ModalBox,

код наполнения окна в модулях StructureExploreModuleV2 и StructureExplorerUtilitiesV2

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

Подскажите, как в расширенном фильтре в условиях добавить сравнение двух полей?

Как пример вывести все записи где Создал != Ответственный

 

 

Нравится

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

На сколько я понял вопрос, то такой функции пока нет в creatio. 

“Oh, my sweet summer child...."

Вот тут. 1 же пункт. Но судя по всему реализации фичи будем ждать к 2030 году. lowcodenocode все дела)

Варфоломеев Данила,

Спасибо. Подозревал, что так и есть. Хотя зимы мы видели, да ещё какие :)

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

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

Например позволит просто определить находится ли отметка времени в прошлом или будущем.

Изображение удалено.

 

P.S.

Так же, в этом меню незаслуженно обделены Минуты, их часто не хватает для быстрых процессов.

1 комментарий

Добрый вечер!

 

На команду разработчиков уже зарегистрирована задача по реализации такой функциональности.

Разработчики рассмотрят ее в одной из будущих версий.

 

Спасибо, что делаете наш продукт лучше!

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

Имеется расширенный фильтр. Мне необходимо отобразить его лишь на чтение.

Изображение удалено.

Как скрыть кнопку удаления строки и добавления нового условия?

"Действия" скрываются путем передачи в модуль конфига с параметром actionsVisible: false.

В модуле FilterEditModule не нашел подобного функционала для добавления или удаления условий. 

Нашел в классе Terrasoft.controls.FilterEdit.Filter метод, возвращающий как раз таки права на удаление, выделение и т.д.

/**
	 * @inheritdoc Terrasoft.FilterEdit.Item#getAllowedManageOperations
	 * @protected
	 * @override
	 */
	getAllowedManageOperations: function() {
		var filterManager = this.filterManager;
		if (!filterManager) {
			return {
				canViewEnabled: true,
				canEditEnabled: true,
				canEditLeftExpression: true,
				canEditRightExpression: true,
				canEditComparisonType: true,
				canRemove: true,
				canSelect: true
			};
		}
		var filterManageOperations = filterManager.getAllowedFilterManageOperations(this.instance);
		var isEnableComparisonType = this._isEnableComparisonType();
		if (isEnableComparisonType !== undefined) {
			filterManageOperations.canEditComparisonType = isEnableComparisonType;
		}
		return filterManageOperations;
	},

Как я могу переопределить этот метод, если мне нужно расширить логику лишь для одного модуля, а не во всю систему.

 

Есть и обходной вариант - подгружать из базы значение фильтра из базы и ререндерить его, но в таком случае все равно пользователь может работать с фильтром.

Нравится

6 комментариев
Лучший ответ

У кейса есть 2 способа решения:

1) Расширить класс  BaseFilterProvider.

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

 

Пример расширенного модуля (комментарии для понимания разницы)

define("BpFilterReadonlyProvider", [],
	function() {
		/**
		 * @class Terrasoft.data.filters.FilterReadonlyProvider
		 * Readonly filters provider.
		 */
		Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", {
				extend: "Terrasoft.BaseFilterProvider",
			alternateClassName: "Terrasoft.FilterReadonlyProvider",
 
			rootSchemaName: "",
 
			canDisplayId: false,
 
			sandbox: null,
 
			// Управление операциями внутри фильтра (для каждого фильтра по отдельности).
			getAllowedFilterManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Возможность изменения левой части выражения.
					canEditLeftExpression: false,
					// Возможность изменения правой части выражения.
					canEditRightExpression: false,
					// Возможность изменения условия сравнения.
					canEditComparisonType: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбрать отдельный фильтр.
					canSelect: false
				};
			},
 
			// Управление группами фильтров.
			getAllowedFilterGroupManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Видимость типа группы ("И" / "ИЛИ").
					canViewGroupType: true,
					// Возможность редактирования типа группы.
					canEditGroupType: false,
					// Видимость кнопки "Добавить условие".
					canAddFilters: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбора группы фильтра.
					canSelect: false
				};
			}
 
		});
		return Terrasoft.FilterReadonlyProvider;
	}
);

 

Передача конфига модулю

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
        // Объект
	    rootSchemaName: "SxCandidate",
        // Колонка со значением фильтра
		filters: this.$RequirementFilterValue,
        // Видимость кнопки "Действия"
		actionsVisible: false,
        // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом)
		filterProviderClassName: "Terrasoft.FilterReadonlyProvider"
   };
}

 

2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.

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

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
	    rootSchemaName: "SxCandidate",
		filters: this.$RequirementFilterValue,
		actionsVisible: false,
        entitySchemaFilterProviderConfig: {
		    canDisplayId: true,
		    shouldHideLookupActions: true,
			isColumnSettingsHidden: true,
			getAllowedFilterManageOperations: function() {
			    return {
				    canViewEnabled: true,
					canEditEnabled: false,
					canEditLeftExpression: false,
					canEditRightExpression: false,
					canEditComparisonType: false,
					canRemove: false,
					canSelect: false
				};
			},
			getAllowedFilterGroupManageOperations: function() {
				return {
					canViewEnabled: true,
					canEditEnabled: false,
					canViewGroupType: true,
					canEditGroupType: false,
					canAddFilters: false,
					canRemove: false,
					canSelect: false
				};
			}
		}
   };
}

 

В обоих случаях результат будет идентичен.

Можно наложить фильтр в раздел и пользователь его вообще не увидит в расширенных фильтрах.

https://community.terrasoft.ru/questions/interesuet-kak-sozdat-filtr-v-…

https://community.terrasoft.ru/questions/vidimost-sotrudnikov-v-kontakt…

https://community.terrasoft.ru/questions/bystryy-filtr-po-celochislenno…

Полозюков Евгений Петрович,

задача в другом. Допустим, менеджер заполняет фильтрацию внутри карточки (аналогично фильтрам в карточке раздела "Модели машинного обучения"). Затем, этот фильтр мне нужно отобразить  оператору только для чтения уже в совершенно другом месте.

 

Фильтр корректно подтягиваю, скрываю кнопку "действия" в модуле. Но оператор может скрыть часть фильтров, случайно нажав на "Х". Этого и хочу избежать.

Подкопаев Михаил Олегович,

Скажите оператору чтобы не занимался ерундой. При разработке мы исходим из того что люди не злоумышленники и не собираются ломать систему. Исключение портальные пользователи.

У кейса есть 2 способа решения:

1) Расширить класс  BaseFilterProvider.

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

 

Пример расширенного модуля (комментарии для понимания разницы)

define("BpFilterReadonlyProvider", [],
	function() {
		/**
		 * @class Terrasoft.data.filters.FilterReadonlyProvider
		 * Readonly filters provider.
		 */
		Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", {
				extend: "Terrasoft.BaseFilterProvider",
			alternateClassName: "Terrasoft.FilterReadonlyProvider",
 
			rootSchemaName: "",
 
			canDisplayId: false,
 
			sandbox: null,
 
			// Управление операциями внутри фильтра (для каждого фильтра по отдельности).
			getAllowedFilterManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Возможность изменения левой части выражения.
					canEditLeftExpression: false,
					// Возможность изменения правой части выражения.
					canEditRightExpression: false,
					// Возможность изменения условия сравнения.
					canEditComparisonType: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбрать отдельный фильтр.
					canSelect: false
				};
			},
 
			// Управление группами фильтров.
			getAllowedFilterGroupManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Видимость типа группы ("И" / "ИЛИ").
					canViewGroupType: true,
					// Возможность редактирования типа группы.
					canEditGroupType: false,
					// Видимость кнопки "Добавить условие".
					canAddFilters: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбора группы фильтра.
					canSelect: false
				};
			}
 
		});
		return Terrasoft.FilterReadonlyProvider;
	}
);

 

Передача конфига модулю

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
        // Объект
	    rootSchemaName: "SxCandidate",
        // Колонка со значением фильтра
		filters: this.$RequirementFilterValue,
        // Видимость кнопки "Действия"
		actionsVisible: false,
        // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом)
		filterProviderClassName: "Terrasoft.FilterReadonlyProvider"
   };
}

 

2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.

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

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
	    rootSchemaName: "SxCandidate",
		filters: this.$RequirementFilterValue,
		actionsVisible: false,
        entitySchemaFilterProviderConfig: {
		    canDisplayId: true,
		    shouldHideLookupActions: true,
			isColumnSettingsHidden: true,
			getAllowedFilterManageOperations: function() {
			    return {
				    canViewEnabled: true,
					canEditEnabled: false,
					canEditLeftExpression: false,
					canEditRightExpression: false,
					canEditComparisonType: false,
					canRemove: false,
					canSelect: false
				};
			},
			getAllowedFilterGroupManageOperations: function() {
				return {
					canViewEnabled: true,
					canEditEnabled: false,
					canViewGroupType: true,
					canEditGroupType: false,
					canAddFilters: false,
					canRemove: false,
					canSelect: false
				};
			}
		}
   };
}

 

В обоих случаях результат будет идентичен.

У вас настройка фильтра хранится в поле? Может, можно закрыть оператору доступ к данному полю на уровне прав доступа?

Владимир Соколов,

настройка фильтра да, хранится в поле. Пример использования есть в разделе "Модели машинного обучения" в карточке записи.

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

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

Есть справочник "Стадия", по нему нужно сделать быстрый фильтр по типу как в расширенном фильтре(т.е с множественным выбором). Как это можно реализовать?

 

Изображение удалено.

Изображение удалено.

Нравится

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

Гусейн, судя по одинаковой иконке, Вы добавили логику для справочника стадий по аналогии с выбором ответственного тут же левее. Так там уже есть множественный выбор, только добавлять ответственных нужно по одному:

Если для стадий реализовали аналогично, там тоже должно такое работать.

 

Идея в быстром фильтре добавить возможность множественного выбора значений уже зарегистрирована.

Зверев Александр,

Да, добавил по типу как с ответственным, но если так делать все работает криво(не подстраивается под нужный справочник). Нужен именно множественный выбор с галками и тд.

Атамогланов Гусейн пишет:

все работает криво(не подстраивается под нужный справочник)

Нужно смотреть, как именно доработали в OpportunitySectionV2, что в результате не так отрабатывает для функций из FixedFilterViewV2 и FixedFilterViewModelV2.

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

Добрый день, помогите пожалуйста, при попытке добавить новые столбцы в расширенный

фильтр из детали, указывается лишь кол-во и датаИзображение удалено.

как добавить в фильтрации и другие колонки из этой таблицы? Нужно вывести информацию взаимосвязи по контрагентам и контактам.

Изображение удалено.

Нравится

8 комментариев
Лучший ответ

Доброе утро.

Все верно, так и должно быть.

В колонке выбираете количество, после этого в самой области фильтра 'количество' можно сменить на 'существует' или 'не существует' и в области подфильтра уже работать с табличкой детали и настраивать нужные фильтры.

Более подробно о том, как построить exist-фильтр можно почитать на Академии по ссылке (подтема 'Установка агрегирующего фильтра').

Доброе утро.

Все верно, так и должно быть.

В колонке выбираете количество, после этого в самой области фильтра 'количество' можно сменить на 'существует' или 'не существует' и в области подфильтра уже работать с табличкой детали и настраивать нужные фильтры.

Более подробно о том, как построить exist-фильтр можно почитать на Академии по ссылке (подтема 'Установка агрегирующего фильтра').

Алла Савельева,

Дело в том, что при такой фильтрации невозможно отобразить данное поле в таблице поиска для дальнейшего экспорта в отчетКак можно добавить в настройки колонок тип взаимосвязи? что бы не отображалось количеством, а данными из этой таблицы. Данном случае бывший работодатель

Касымов Сакен,

в данном случае, у вас никак не получится - т.к. это деталь, то бывших работодателей может быть неограниченное количество, а колонку таблицы вы можете добавить только одно значение. В вашем случае это нужно делать средствами разработки, как мне кажется.

Нашел другой способ, создал вьюшку в БД и объект, поставил галочку в "Представление в БД"в этой вьюшке есть есть значения с "NULL" (это не проблема?)

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

Касымов Сакен,

А какой график нужно получить в итоге?

Возможно, неправильно сделали представление.

Посмотрите в SQL Management Studio, какие данные возвращает Ваше представление.

Может быть, дело в том, что в созданном view не уникальный Id, которые есть в каждой обычной таблице и которые может пытаться использовать движок графиков.

Превратить Null в пустую или какую угодно строку можно функцией IsNull со вторым параметром.

Также при создании пользовательских представлений для корректной их работы необходимо наследование от схемы BaseEntity, где есть стандартные колонки. 

Зверев Александр пишет:

Также при создании пользовательских представлений для корректной их работы необходимо наследование от схемы BaseEntity, где есть стандартные колонки

Не согласна с этим утверждением.

Все зависит от того для реализации какой функциональности создается то или другое представление. 

Алла, можно и не наследоваться, но тогда при необходимости сразу создавать колонки, если они окажутся нужными в стандартной логике разных механизмов системы. Как минимум, должен быть уникальный Id и настроенное текстовое первичное поле для отображения.

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

Неоднократно задавал тут вопрос: возможно ли применить функционал расширенного фильтра к объекту "справочник".

Официальный ответ саппорта - нет не возможно, но пожелание адресовали разработчикам для возможности реализации этого в будущих релизах.

на самом деле мне удалось этого добиться, правда не совсем стандартным способом...

  1. Создал раздел внутренними механизмами BPM
  2. Дропнул тейбл раздела в БД
  3. Создал представление (с inner join из 2 таблиц) с таким же названием в БД из п.2.
  4. Внес изменения в объект в БПМ - создал columns точь-в-точь как в представлении + установил признак "представление БД" (!)
  5. Закастомил страницу реестра.

Правда теперь не понимаю может ли эти изменения как-то негативно повлиять на работу приложения в целом?

Нравится

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

Использовать схемы на основе view вполне допустимо, парой сообщений ниже Алла Савельева как раз предлагает такое для решения вопроса с графиком.

Только обычно создают в обратном порядке: сначала — схему с установленной галкой, потом — view в базе с такими же полями. Таблицы при этом не создаётся.

Обычно в названии объекта для ясности вначале пишут Vw, можете посмотреть такие в стандартной системе.

По поводу негативного влияния, всё зависит от кода view. Если он содержит ошибки или при наложении каких-то фильтров получится очень тяжёлый запрос на выборку, то база может «задуматься».

Зверев Александр,

ключевое слово - расширенный фильтр.

К справочнику его не применить.

Соответственно создал раздел, (руками его создавать - неблагодарное дело). А уже потом ахалай-махалай с Vw...

Случайно обнаружил: подобное действие с разделом привело к ошибке (см. принт-скрин).

  УРЛ https://[url_app]/0/ServiceModel/EntityDataService.svc/ для меня крайне важен...

Значит, у нового раздела на основе view получилось совпадающее с существующим значение названия или чего-подобного. В результате при попытке системы построить список объектов, доступных по OData натыкается на пару дублей и не может однозначно выбрать.

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

Добрый вечер!

Вопрос такой, нужно в разделе "Контрагенты" сформировать список клиентов, у которых в "фактическом" адресе указан город Москва (с чем я разобрался) и присутствует также "юридический" адрес. Не могу понять, как включить в выборку условие с "юридическим" адресом?



Изображение удалено.

 

Нравится

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

Вот пример Как я его понял исходя из условий Задачи

Михаил, не уверен, что получится именно то, что хочет автор. У Вас найдёт где есть или тот, или тот тип адреса.

Лучше так:

 

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

Добрый день, коллеги, поделитесь решением вопроса:

  1. Создал справочник 
  2. Создал модуль унаследованный от "Конфигурационный раздел базового справочника ( UIv2 )"
  3. Удалил унаследованный грид, и определил грид "зебра".
  4. Добавил фильтр по датам, по аналогии как в активностях

Вопрос: подскажите, метод добавления расширенного фильтра, по аналогии как и в разделах?

Нравится

1 комментарий

Тут похожий вопрос решается созданием страницы, унаследованной от страницы раздела с некоторыми доработками.

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