Преднастроенные фильтры

Доброго времени суток,
Появилась необходимость поместить 5-6 преднастроенных фильтров на страницу. Пролистал SDK, а там только фильтры с ответственным и датой. Есть ли примеры фильтров по названию и по справочным значениям (целочисленным, от и до)?

Нравится

13 комментариев

И еще было бы интересно фильтр по номеру средства связи, чтобы ввести любое (телефон, e-mail, skype) и найти контрагента или контакта

"Владимир Соколов" написал:

И еще было бы интересно фильтр по номеру средства связи, чтобы ввести любое (телефон, e-mail, skype) и найти контрагента или контакта


Владимир, если Вы помните, то в целом фильтрация строится по колонкам объкта, деталь "Средства связи" это другой объект.

"Мотков Илья" написал:Владимир, если Вы помните, то в целом фильтрация строится по колонкам объкта, деталь "Средства связи" это другой объект.

Да, поэтому пользователям очень сложно по одному из средств связи определить, что это за контакт (нужно строить довольно сложный для них фильтр). Хотелось бы упростить эту задачу

"Владимир Соколов" написал:
Мотков Илья пишет:

Владимир, если Вы помните, то в целом фильтрация строится по колонкам объкта, деталь "Средства связи" это другой объект.

Да, поэтому пользователям очень сложно по одному из средств связи определить, что это за контакт (нужно строить довольно сложный для них фильтр). Хотелось бы упростить эту задачу

Вы можете добавить быстрый поиск в раздел "Контакты" (по аналогии с быстрым фильтром "Ответственный" в разделе "Активности").
Фильтрация будет осуществляться по полю Номер (Number) объекта Средство связи контакта (Contact communication).

"Демьяник Алексей" написал:Вы можете добавить быстрый поиск в раздел "Контакты" (по аналогии с быстрым фильтром "Ответственный" в разделе "Активности").

Попробовали, не получилось...

filter

Посмотрели внутри кода инициализации фильтров, создаётся впечатление, что фильтр можно построить только по Lookup или дате:

function prepareFilters() {
...
if (filterConfig.dataValueType === Terrasoft.DataValueType.DATE) {
...
} else {
      var entityColumn = this.entitySchema.getColumnByName(filterConfig.columnName);
      filterInfo.columnName = filterConfig.columnName;
      filterInfo.isLookup = entityColumn.isLookup;
      if (entityColumn) {
       if (entityColumn.isLookup) {
... }
...
}

Разработчики закрыли возможность создания других фильтров?

Вот пример нашего кода (не работающего):

initFixedFiltersConfig: function() {
	var fixedFilterConfig = {
		entitySchema: this.entitySchema,
		filters: [
	            {
			name: "Email",
			caption: this.get("Resources.Strings.UsrCommunicationFilterCaption"),
			columnName: "Email",
			defValue: "",
			dataValueType: this.Terrasoft.DataValueType.TEXT,
			filter: function(filterInfo) {
				 debugger;
				var filter;
				if (filterInfo.value && filterInfo.value.length > 0) {
					filter = Terrasoft.createColumnInFilterWithParameters(
						"[ContactCommunication:Contact].SearchNumber", filterInfo.value);
				}
				return filter;
			}
		}
	]
   };
   this.set("FixedFilterConfig", fixedFilterConfig);
}

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

В системе фильтр по полю с типом "Строка" Вы можете найти в схеме ProductSelectionModule.

*del*

"Владимир Соколов" написал:Разработчики закрыли возможность создания других фильтров?

"Варфоломеев Данила Викторович" написал:Есть ли примеры фильтров по названию и по справочным значениям (целочисленным, от и до)?

Воспользоваться “initFixedFiltersConfig” действительно не получится, их вью заточено под определенные типы, и их расширение на данный момент выглядит затруднительным.
Но вы можете переопределить “initQueryFilters” и добавлять или убирать фильтры на основании данных своих атрибутов. В одном атрибуте хранить “активность” фильтра, в другом “поисковую строку”. И по нажатию кнопки или галочки применения фильтрации, инициировать метод обновления списка “this.reloadGridData();”.
В этот момент сработает “initQueryFilters” анализируя ваши новые значения атрибутов.

Ниже привожу листинг когда, где я по нажатию кнопки включаю и выключаю фильтрацию по значению средства связи (связанная таблица) контакта, в секции контактов.

define("ContactSectionV2", ["GridUtilitiesV2", "GoogleIntegrationUtilities", "RightUtilities",
		"ConfigurationConstants", "GoogleIntegrationUtilitiesV2"],
	function(gridUtilitiesV2, GoogleUtilities, RightUtilities, ConfigurationConstants) {
		return {
			entitySchemaName: "Contact",
			attributes: {
				"TestAttr": {
					dataValueType: Terrasoft.DataValueType.TEXT
				},
				"IsActiveTestAttr": {
					dataValueType: Terrasoft.DataValueType.TEXT
				}
			},
			messages: {
			},
			mixins: {
			},
			methods: {
				filterOn: function() {
					this.set("TestAttr", "123-123-123");
					this.set("IsActiveTestAttr", true);
					this.reloadGridData();
				},
				filterOff: function() {
					this.set("TestAttr", "");
					this.set("IsActiveTestAttr", false);
					this.reloadGridData();
				},
				initQueryFilters: function(esq) {
					this.callParent(arguments);
 
var testAttr = this.get("TestAttr");
var isActive = this.get("IsActiveTestAttr");
 
if (!isActive) {
   esq.filters.removeByKey("FilterContactCommunication");
} else {
   esq.filters.add("FilterContactCommunication", this.Terrasoft.createColumnFilterWithParameter(
   this.Terrasoft.ComparisonType.CONTAIN, "[ContactCommunication:Contact:Id].Number", testAttr));
 
					}
				}
			},
			diff: /**SCHEMA_DIFF*/ [
				{
					"operation": "insert",
					"parentName": "SeparateModeActionButtonsLeftContainer",
					"propertyName": "items",
					"name": "FilterOn",
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "filter on",
						"click": {
							"bindTo": "filterOn"
						}
					}
				},
				{
					"operation": "insert",
					"parentName": "SeparateModeActionButtonsLeftContainer",
					"propertyName": "items",
					"name": "FilterOff",
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "filter off",
						"click": {
							"bindTo": "filterOff"
						}
					}
				}
			] /**SCHEMA_DIFF*/
		};
	});

Останется только где-то разместить эдит, в который вы будете принимать от пользователя “поисковую строку”, будь то прямо на форме, или в модальном окне.

Подобным образом работает фильтрация в продукте ITIL, в секции обращений по закрытым и открытым обращениям.

Спасибо! Почти получилось.

Но есть вопрос - в чем смысл того, что в базе в поле ContactCommunication.SearchNumber строка записана в обратном порядке?
Например, если телефон +123 45678, то в SearchNumber будет 876543321

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

Это сделано специально, и часто используется в логике приложений, определяющих номер телефона абонента. Суть в том, что один и тот же телефонный номер может быть записан или определятся абсолютно по разному. Например в международном формате (+7 123 4567890, 007 123 4567890) или, если звонить внутри страны это 8 123 4567890. Если искать по первым цифрам это будут 2 разных номера, если взять первые N цифр начиная с последней, определение произойдет успешно.

Еще один вопрос - как не сделать свой новый блок фильтров (как это описано в SDK), а добавить к существующему блоку еще один фильтр?

Владимир, данная тема подробно обсуждалась по этой ссылке.

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