В карточке детали, есть справочное поле: UsrParametr (который строится к справочнику: UsrRefParameter, с полями: Name, Description и UsrStatus из справочника UsrRefStatus, с полями: Name, Description).

Как отфильтровать поле UsrParametr, по имени статуса, т.е. по полю UsrStatus из Справочника UsrRefStatus.

Так же, если можно, объясните сам процесс построения запросов, если не затруднит, прокомментируйте построчно приведенный ниже код, а так же, хотелось бы подробного объяснения, для чего используется в запросе " : " и для чего " . "
Заранее спасибо.
Код:

"ActivityCategory": {
     dataValueType: Terrasoft.DataValueType.LOOKUP,
     dependencies: [
      {
       columns: ["ActivityCategory"],
       methodName: "onActivityCategoryChange"
      }
     ]
    },
    "Result": {
     lookupListConfig: {
      filters: [
       function() {
        var type = this.get("ActivityCategory");
        var filterGroup = Ext.create("Terrasoft.FilterGroup");
        filterGroup.add("ActivityCategory",
         Terrasoft.createColumnFilterWithParameter(
          Terrasoft.ComparisonType.EQUAL,
          "[ActivityCategoryResultEntry:ActivityResult].ActivityCategory",
          type.value));
        filterGroup.add("BusinessProcessOnly",
         Terrasoft.createColumnFilterWithParameter(
          Terrasoft.ComparisonType.EQUAL,
          "BusinessProcessOnly",
          0));
        return filterGroup;
       }
      ]
     }
    },

Нравится

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

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

Детализирую:

"ActivityCategory": {
     dataValueType: Terrasoft.DataValueType.LOOKUP,
     dependencies: [
      {
       columns: ["ActivityCategory"],
       methodName: "onActivityCategoryChange"
      }
     ]
    },

При изменении значения в поле ActivityCategory вызывается метод onActivityCategoryChange. Реализация этого метода:

onActivityCategoryChange: function() {
	var activityCategory = this.get("ActivityCategory");
	if (activityCategory && activityCategory.value === ConfigurationConstants.Activity.ActivityCategory.Meeting) {
		this.set("ShowInScheduler", true);
	}
}

Согласно этому методу в поле ShowInScheduler (Отображать в расписании) устанавливается значение true, если выбранная категория - встреча.

Теперь по второй части кода:

    "Result": {
     lookupListConfig: {
      filters: [
       function() {
        var type = this.get("ActivityCategory");
        var filterGroup = Ext.create("Terrasoft.FilterGroup");
        filterGroup.add("ActivityCategory",
         Terrasoft.createColumnFilterWithParameter(
          Terrasoft.ComparisonType.EQUAL,
          "[ActivityCategoryResultEntry:ActivityResult].ActivityCategory",
          type.value));
        filterGroup.add("BusinessProcessOnly",
         Terrasoft.createColumnFilterWithParameter(
          Terrasoft.ComparisonType.EQUAL,
          "BusinessProcessOnly",
          0));
        return filterGroup;
       }
      ]
     }

Данный код фильтрует значения в поле "Результат". Для выбора доступны значения, для которых:

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

Благодарю.

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

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

Нравится

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

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

Вы можете реализовать быстрые фильтры в разделе Контакты средствами разработки.

Пример реализации можно посмотреть в схеме ActivitySectionV2.

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

Нужно создать новый фильтр в расписании - рабочая неделя.
насколько я разобрался изменения нужно вносить в в замещающие модули FixedFilterViewModelV2 и FixedFilterViewV2, полностью скопировал код из родителей, дописал новый фильтр и сохранил. После обновления страницы в списку появился новый фильтр но пропали все другие, пустые строки, но когда на них нажимать фильтрование происходит. Также пропали иконки текущего дня, тек недели и месяца. Остался только выпадающий список с пустыми строками среди которых мой фильтр. Как сделать что бы все старое осталось и был мой новый фильтр?о

Нравится

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

в модуль перенести все ресурсы

Так они переносятся при указании поля родительский объект

"Радчук Виталий Владимирович" написал:Так они переносятся при указании поля родительский объект

Поверьте мне, нет. С модулями все очень плохо на текущий момент.

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

И еще один болезненный вопрос. Как заставить бпм отобразить изменения? код сохраняю, компилирую все, обновляю с очисткой кеша, удаляю кеш цклинером - бесполезно, 0 реакции...

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

А где изображения взять то? с родителя не скачаеш...

"Максим Шевченко" написал:А если посмотреть код схемы в браузере, ваши изменения находит?

нет
"Максим Шевченко" написал:Если переоткрыть схему в конфигурации снова, ваши изменения остались в ней?

да

"Радчук Виталий Владимирович" написал:А где изображения взять то? с родителя не скачаеш...

Откатите изменения, удалив данную схему замещения, после этого внесите любые изменения в любую другую js схему, сохраните, после чего почистите кеш браузера и перезайдите на сайт. И inspect-ом браузера найдите и скачайте все картинки что у Вас пропали после замещения.

"Радчук Виталий Владимирович" написал:Если переоткрыть схему в конфигурации снова, ваши изменения остались в ней?
да

Значит изменения сохранились. Почистите кеш браузера что бы увидеть их в браузере.

"Максим Шевченко" написал:Значит изменения сохранились. Почистите кеш браузера что бы увидеть их в браузере.

чистил, не помогало
"Максим Шевченко" написал:после этого внесите любые изменения в любую другую js схему, сохраните

по этой схеме иногда работает... крутая схема...

"Радчук Виталий Владимирович" написал:чистил, не помогало

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

"Радчук Виталий Владимирович" написал:по этой схеме иногда работает... крутая схема...

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

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

Здравствуйте, необходимо в разделах в фильтрах сделать так чтобы отображались только несколько полей для фильтрации а не все которые есть у объекта(например из всего списка оставить только название, ответственный и дата создания) как это можно реализовать?

Нравится

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

Насколько я помню за это отвечает getSimpleFilterColumnList в CustomFilterViewModelV2.
Там все колонки заносятся в коллекцию:

Terrasoft.each(columns, function(column) {
if (column.dataValueType !== Terrasoft.DataValueType.GUID &&....)  //тут стоят фильтры террасофта (а-ля не пихать в коллекцию блобы, гуиды и т.п). сюда же можно надобавлять своих
{
columnNames.push({
	name: column.name,
	caption: column.caption
});
}
})

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

Чтобы не заморачиваться с кодом, то можно:
1) настроить страницу редактирования раздела
2) настроить реестр
3) перейти в конфигурацию и полям, которые не нужно отображать в реестре, установить в поле "Режим использования" значение "Никогда", опубликовать объект.

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

"Демьяник Алексей" написал:"Режим использования" значение "Никогда"

Вопрос на засыпку: чем вообще отличаются режимы использования поля в объекте?

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

Режим использования "Никогда" - колонка будет видна в конфигурации как системная и будет недоступна для использования в системе.
Режим использования "Расширенный" колонка будет видна как системная.
Режим использования "Обычный" - стандартный для колонок в системе.

Разница между "Расширенный" и "Обычный" на уровне раздела ничем не отличается. Поле будет доступно в фильтре, а также при настройке реестра/страницы редактирования.
Отличие есть только на уровне объекта - поле со свойством "Расширенный" не будет отображаться при открытии объекта. Для его отображения необходимо будет включить в настройках "Показывать системные колонки".

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

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

Используется BPMonline sales comerce версии 7.6.
В разделе продажи есть стандартные фильтры, при изменении которых фильтруются вывод продаж в гриде, что и сразу отображается. Так же есть в этом разделе кнопка аналитика, где строятся графики и можно писать свои виджеты. Я написал виджет который рисует таблицу с нужными полями. Хочется также применять стандартные фильтры для отображения данных в моей таблице. Собственно вопрос, как получить значения этих фильтров и как правильно обрабатывать событие изменения фильтров для перерисовки моей таблици???

Пример клиентсткого модуля для виджета, который рисует таблицу:

define('SxClientUnitTable', ['ext-base', 'terrasoft', 'sandbox', 'SxClientUnitTableResources', "ChartModuleHelper", "css!SxClientUnitTableCss", "ServiceHelper"],
        function(Ext, Terrasoft, sandbox, resources, ChartModuleHelper, css, ServiceHelper, ConfigurationConstants) {
                function getViewModel() {
                                        return Ext.create('Terrasoft.BaseViewModel', {
                                //todo SysModuleAnalyticsChart deleted
                                                entitySchema: 'Order',
                                                methods: {
                                                        getChart: function(key) {
                                                                sandbox.publish('GenerateChart', key);
                                                        },
                                                        load: function() {

                                                        }
                                                }
                                        });
                                };
                var result = "";
                function generateMainView(renderTo) {
                       
                        var resultConfig = Ext.create('Terrasoft.Container', {
                                id: 'tableOtchetMetkiParamContainer',
                                selectors: {
                                        wrapEl: '#tableOtchetMetkiParamContainer'
                                },
                                renderTo: renderTo
                        });
                        return resultConfig;
                }
                function getInfoMetki(parameters) {

                        var serviceData = {
                                site: parameters[0].toString(),
                                ownerId: parameters[1].toString(),
                                startDate: parameters[2].toString(),
                                dueDate: parameters[3].toString(),
                                countryId: parameters[4].toString()
                        };
                       
                        ServiceHelper.callService("UsrOtchetMetkiGetCollectionConfigurationService", "GetCollectionOtchetMetki",
                                function (response) {
                                debugger
                                        if (response.status == 404) {
                                                this.showInformationDialog("\t Error: \n" + response.message);
                                        }
                                        else if(response.GetCollectionOtchetMetkiResult.length > 0){
                                                result = response.GetCollectionOtchetMetkiResult;
                                                var arrR = result.split(":");
                                                var htmlAdded = ""
МеткаКоличество заказовНа уточнении% уточн.Подтвержденные% Подтв.Завершенные% Заверш.Отмены% Отм.
;
                                                for(var i = 0; i arrR.length - 1; i++){
                                                        //get items
                                                        var strArr = arrR[i].split(" ");
                                                        var metkaOne = strArr[0].replace("{","");
                                                        var metka = metkaOne.replace("}","");
                                                       
                                                        htmlAdded += "" + metka + "" + strArr[1].toString() + ""  + strArr[2].toString() + "" + strArr[3].toString() + "" + strArr[4].toString() + "" + strArr[5].toString() + "" + strArr[6].toString() + "" + strArr[7].toString() + ""  + strArr[8].toString() + "" + strArr[9].toString() + "";
                                                }
                                                //end table
                                                htmlAdded += "";
                                                var el = Ext.get('tableOtchetMetkiParamContainer').setHTML(htmlAdded);
                                                var elemV = Ext.get('Module1');
                                                elemV.toggleCls('my-table');
                                        }
                                        else
                                                result = null;
                                }, serviceData, this);
                }

                var render = function(renderTo) {
                        var viewConfig = generateMainView(renderTo);
                        var viewModel = getViewModel();
                        var filters = getFilteres();
                        var ar = [];
                        ar.push("all");
                        ar.push("all");
                        ar.push("2016-05-01");
                        ar.push("2016-07-04");
                        ar.push("a570b005-e8bb-df11-b00f-001d60e938c6");
                        getInfoMetki(ar);
                       
                       
                        viewConfig.bind(viewModel);
                };
                return {
                        schema: 'Order',
                        methods: {
                               
                                getOrdersForFilter: function(){
                                        var items = [];
                                        var selOrders = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "Order"
                                        });
                                        selOrders.addColumn("SxMark.Name");
                                        selOrders.addColumn("SxCountry.Name");
                                        var filterByUser = Terrasoft.createColumnFilterWithParameter(
                                        Terrasoft.ComparisonType.EQUAL, "SxCountry.Name", "Россия");
                                        selOrders.filters.addItem(filterByUser);
                                        selOrders.getEntityCollection(function (response) {
                                        debugger
                                                if (response.collection.collection.length > 0)
                                                        items = result.collection.getItems();
                                                else
                                                        items = null;
                                        }, this);
                                        return items;
                                },
                                filterChanged: function( filter, eOpts ){
                                        debugger
                                        var c = [];
                                }
                        },
                        userCode: function() {
                               
                        },
                        init: function() {
                                debugger

                        },
                        render: render
                };
        }
)
;

Нравится

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

Скорее всего вам поможет SDK
https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/rabota-s-filtr…
Есть несколько примеров

К сожалению, ширина сайта не позволяет увидеть страницу целиком :(, поэтому скопируйте все содержимое, например в MSWord

Я решил данную задачу при помощи sandbox. Стандартные (Fixed и Custom) фильтры прикреплены к OrderSectionV2 и работать с ними (afterFiltersUpdated - переопределить метод изменение фильтров) только в этой схеме.

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

Доброго времени суток!
Стоит задача настраивать права доступа к записям раздела с помощью фильтров. Есть карточка со справочным полем "Раздел". Необходимо отобразить фильтры записей для данного раздела, чтобы в дальнейшем запускать БП, настраивающий права доступа к отфильтрованным записям выбранного раздела.
Вопроса два:
1. Как можно хранить значения фильтров в колонке, чтоб потом использовать в БП при раздаче прав?
2. Как отобразить фильтры на карточке? Я создаю контейнер по аналогии с BaseSection, и использую sandbox.loadModule. Ошибок не выдает, как и сами фильтры.

diff:

{
        "operation": "insert",
        "name": "ExtendedFiltersContainer",
        "parentName": "Header",
        "propertyName": "items",
        "values": {
                "id": "ExtendedFiltersContainer",
                "selectors": {"wrapEl": "#ExtendedFiltersContainer"},
                "itemType": Terrasoft.ViewItemType.CONTAINER,
                "controlConfig": {"visible": {"bindTo": "IsExtendedFiltersVisible"}},
                "wrapClass": ["extended-filters-container-wrapClass", "left-inner-el"],
                "items": []
        }
}

methods:
init: function() {
        this.callParent(arguments);
        var extendedFilterModuleId = this.getExtendedFilterEditModuleId();
        this.sandbox.loadModule("ExtendedFilterEditModuleV2", {
                renderTo: "ExtendedFiltersContainer",
                id: extendedFilterModuleId
        });
}

Нравится

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

Здравствуйте, на данный момент, в системе не предусмотрено возможности использовать контролл фильтрации, который вы видите на странице секции, на пользовательских страницах другого типа.
Но если Вам необходимо собирать информацию по примененным фильтрам в разделе, а потом их куда-нибудь сохранять, и использовать в тех или иных целях.
Вы можете добавить в действия секции кнопку, которую будет видеть, к примеру, только администратор системы. Перед нажатием применять к разделу фильтрацию. И использовать метод секции «getFilters()» который вернет вам объект, всех, примененных к разделу фильтров.
Как с ним поступать далее, решать вам.
Так же, объект фильтров поддерживает сериализацию и десереализацию.
Ниже прилагаю небольшой пример по получению и сериализации объекта всех примененных к разделу фильтров:

define("OrderSectionV2", [], function() {
	return {
		entitySchemaName: "Order",
		attributes: {
		},
		methods: {
			getSectionActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getActionsMenuItem({
					"Type": "Terrasoft.MenuSeparator",
					"Caption": ""
				}));
				actionMenuItems.addItem(this.getActionsMenuItem({
					"Caption": "testFilters",
					"Click": { "bindTo": "testFilters" }
				}));
				return actionMenuItems;
			},
			testFilters: function() {
				var filters = this.getFilters();
 
				var serializationInfo = filters.getDefSerializationInfo();
				serializationInfo.serializeFilterManagerInfo = true;
 
				var filtersJson = filters.serialize(serializationInfo);
				this.Terrasoft.showInformation(filtersJson);
			}
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

простой вариант:

сделайте справочное поле со ссылкой на объект нужных вам фильтров (Например ContactFolder/Группа контакта) и выбирайте нужную группу. В таблицах групп есть поле SearchData - это сохраненные фильтры (для клиентской стороны). В базе они выглядят так:

Перед использованием их значение надо десериализовать:

Terrasoft.deserialize(SearchData)

После этого можете их добавлять в качестве фильтров в запросы:

var searchData = Terrasoft.deserialize(contactGroup.getByIndex(0).SearchData);
config.filters.addItem(searchData);
...
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: "Contact"
});
esq.addColumn("Id");
esq.filters = config.filters;
esq.getEntityCollection(function(result) {
	if (result.success) {
		...
	}
}, this);

Тут есть две проблемы:
1) Группа уже должна быть создана и настроена (это не всегда плохо, но в половине случаев - точно)
2) Если вам надо выбирать из фильтров разных разделов, надо будет сделать переключение схем в зависимости от выбранного раздела ,само справочное поле групп - виртуальным, а фильтры сохранять в другом, скрытом

Сложный вариант:
1) Сделать модуль для настройки и фильтров через интерфейс. Тут логичнее использовать схемы тех разделов, которые будут фильтроваться - так пользователь сможет сразу увидеть результат фильтрации. Но их придется обернуть в отдельный модуль, который будет загружать нужный раздел поверх открытой карточки и иметь как минимум две кнопки - ОК/Отмена - а из схемы раздела надо будет убрать весь остальной функционал (фактически - создать дочернюю схему, например, от contactSectionV2, на которой скрыть все ненужные элементы). Загружать модуль тогда надо будет как-то так

this.sandbox.loadModule("ReportModule", {
	id: reportModuleId,
	renderTo: this.renderTo,
	keepAlive: true
});

2) наладить сообщение между модулями карточки и только что созданным для обмена фильтрами

Еще один простой вариант:
создавать вашу сущность с того раздела, который собираетесь фильтровать - открываете Контакты, настраиваете фильтрацию в расширенном режиме и выбрав действие "Создать [Что-то]" передаете туда сразу и раздел и фильтры (их надо будет сначала считать в схеме раздела).

А вот как потом использовать эти фильтры в БП - это вопрос)).
Возможно будет проще сохранять не фильтрацию, а набор ИД отфильтрованных записей. Это простая деталь и в БП проблем особо не будет.

Пример добавления записей по преднастроенному фильтру:

define("SfTestTeamDetail", ["terrasoft", "SfTestTeamDetailResources","ConfigurationConstants", "ConfigurationEnums", "SferaConstants", 'TestingConstants'],
	function(Terrasoft, resources, ConfigurationConstants, enums, SferaConstants, TestingConstants) {
		return {
            entitySchemaName: "SfTestTeam",
			attributes: {},
			messages: {
                "GetTargetGroup": {
                    mode: Terrasoft.MessageMode.PTP,
                    direction: Terrasoft.MessageDirectionType.PUBLISH
                }
            },
			methods: {
                initData: function() {
                    this.callParent(arguments);
                },
				onAddButtonClick: function() {
					var cardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
					var isNew = (cardState.state === enums.CardStateV2.ADD ||
					    cardState.state === enums.CardStateV2.COPY);
					if (isNew) {
						var args = {
							isSilent: true,
							messageTags: [this.sandbox.id]
						};
						this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
						return;
					}
                    var SfTargetGroup = this.sandbox.publish("GetTargetGroup", null, [this.sandbox.id]).targetGroup;
                    this.set("SfTargetGroup", SfTargetGroup);
                    this.addContactToTeam(arguments[3] === "byGroup");
				},
                addContactToTeam: function(byGroup) {
                    if(byGroup) {
                        this.getGroupList();
                    } else {
                        this.getUsersList();
                    }
                },
				getUsersList: function() {
					/*var scope = this;
					var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
						rootSchemaName: "SfTestTemplate"
					});
					esq.addColumn("SfTargetGroup");
					esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", this.get("MasterRecordId")));
					esq.getEntityCollection(function(result) {
						if (result.success && result.collection.getItems().length>0) {
							scope.prepareLookupConfig(result.collection.getItems()[0].get("SfTargetGroup").value);
						}
					}, scope);*/
                    this.Terrasoft.chain(
                            function(next) {
                                this.getContactLookupConfig(function() {
                                    next();
                                }, this);
                            },
                            function(next) {
                                this.openContactLookup(function() {
                                    next();
                                }, this);
                            },
                            function(next) {
                                this.addContactCallback(function() {
                                    next();
                                }, this);
                            },
                            function(next) {
                                this.reloadGridData();
                                next();
                            },
                            this);
            	},
                getGroupList: function() {
                    this.Terrasoft.chain(
                            function(next) {
                                this.getContactGroupLookupConfig(function() {
                                    next();
                                }, this);
                            },
                            function(next) {
                                this.openContactGroupLookup(function() {
                                    next();
                                }, this);
                            },
                            function(next) {
                                this.getContactLookupConfig(function() {
                                    next();
                                }, this);
                            },
                            function(next) {
                                this.getSelectedGroupFilter(function() {
                                    next();
                                }, this);
                            },
                            function(next) {
                                this.getFilteredContacts(function() {
                                    next();
                                }, this);
                            },function(next) {
                                this.addContactCallback(function() {
                                    next();
                                }, this);
                            },
                            function(next) {
                                this.reloadGridData();
                                next();
                            },
                            this);
                },
                getContactLookupConfig: function(callback) {
                    var SfTargetGroup = this.get("SfTargetGroup");
                    var templateId = this.get("MasterRecordId");
                    var filters = this.Ext.create("Terrasoft.FilterGroup");
                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                        rootSchemaName: "SfTestTeam",
                        isDistinct: true
                    });
                    var IdsExists = [];
                    esq.addColumn("SfContact");
                    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "SfTestTemplate",
                            templateId));
                    esq.getEntityCollection(function(result) {
                        if (result.success) {
                            var items = result.collection.getItems();
                            IdsExists = [];
                            Terrasoft.each(items, function(item) {
                                var contact = item.get("SfContact");
                                if (contact && contact.value) {
                                    IdsExists.push(contact.value);
                                }
                            }, this);
                            var contactType = SferaConstants.ContactType.Employee.value;
                            if (SfTargetGroup && SfTargetGroup.value) {
                                if (SfTargetGroup.value == TestingConstants.TargetGroupType.Doctor.value) {
                                    contactType = SferaConstants.ContactType.Doctor.value;
                                }
                                filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Type",
                                        contactType));
                            }
                            filters.addItem(this.getNotExistsInTeamFilter(IdsExists));
                            var config = {
                                entitySchemaName: "Contact",
                                multiSelect: true,
                                columns: ["Name"],
                                hideActions: true
                            };
                            config.filters = filters;
                            this.set("ContactLookupConfig", config);
                            if (this.Ext.isFunction(callback)) {
                                callback.call(this);
                            }
                        }
                    }, this);
                },
                getContactGroupLookupConfig: function(callback) {
                    var config = {
                        entitySchemaName: "ContactFolder",
                        //multiSelect: true,
                        columns: ["Id", "Name", "SearchData"],
                        hideActions: true
                    };
                    var filters = this.Terrasoft.createFilterGroup();
 
                    //todo use configconstants
                    filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "FolderType.Id",
                            "65ca0946-0084-4874-b117-c13199af3b95"));//dynamic
                    config.filters = filters;
                    this.set("ContactGroupLookupConfig", config);
                    if (this.Ext.isFunction(callback)) {
                        callback.call(this);
                    }
                },
                openContactGroupLookup: function(callback) {
                    var config = this.get("ContactGroupLookupConfig");
                    this.openLookup(config, function(args) {
                        this.set("SelectedContactGroup", args.selectedRows);
                        if (this.Ext.isFunction(callback)) {
                            callback.call(this);
                        }
                    }, this);
                },
                getSelectedGroupFilter: function(callback) {
                    // todo учеть возможность множественного выбора групп
                    var contactGroup = this.get("SelectedContactGroup");
                    var config = this.get("ContactLookupConfig");
                    if (contactGroup.getCount()) {
                        var searchData = Terrasoft.deserialize(contactGroup.getByIndex(0).SearchData);
                        config.filters.addItem(searchData);
                    }
                    this.set("ContactLookupConfig", config);
                    if (this.Ext.isFunction(callback)) {
                        callback.call(this);
                    }
                },
                openContactLookup: function(callback) {
                    var config = this.get("ContactLookupConfig");
                    this.openLookup(config, function(args) {
                        this.set("SelectedContacts", args.selectedRows);
                        if (this.Ext.isFunction(callback)) {
                            callback.call(this);
                        }
                    }, this);
				},
                getFilteredContacts: function(callback) {
                    var ContactLookupConfig = this.get("ContactLookupConfig");
                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                        rootSchemaName: "Contact"
                    });
                    esq.addColumn("Id");
                    esq.filters = ContactLookupConfig.filters;
                    esq.getEntityCollection(function(result) {
                        if (result.success) {
                            //Ids = result.collection.getKeys();
 
                            this.set("SelectedContacts", result.collection);
                            if (this.Ext.isFunction(callback)) {
                                callback.call(this);
                            }
                        }
                    }, this);
                },
                addContactCallback: function(callback){
                    this.showBodyMask();
                    var Ids = this.get("SelectedContacts").getKeys();
                    var bq = this.Ext.create("Terrasoft.BatchQuery");
                    this.Terrasoft.each(Ids, function(item) {
                        var insert = this.Ext.create("Terrasoft.InsertQuery", {
                            rootSchemaName: "SfTestTeam"
                        });
                        var newGuid = Terrasoft.generateGUID();
                        var testTemplate = this.get("MasterRecordId");
                        insert.setParameterValue("Id", newGuid , Terrasoft.DataValueType.GUID);
                        insert.setParameterValue("SfContact", item, Terrasoft.DataValueType.GUID);
                        insert.setParameterValue("SfTestTemplate", testTemplate, Terrasoft.DataValueType.GUID);
                        bq.add(insert);
                    }, this);
                    bq.execute(function(result) {
                        this.hideBodyMask();
                        if (result.success) {
                            if (this.Ext.isFunction(callback)) {
                                callback.call(this);
                            }
                        } else console.log("error");
                    }, this);
                },
                getNotExistsInTeamFilter: function(IdsExists) {
                    var existsFilter = this.Terrasoft.createNotExistsFilter("[SfTestTeam:SfContact:Id].SfContact");
                    var subFilter = this.Terrasoft.createColumnInFilterWithParameters(
                            "SfContact", IdsExists);
                    existsFilter.subFilters.addItem(subFilter);
                    existsFilter.subFilters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "SfTestTemplate",
                            this.get("MasterRecordId")));
                    return existsFilter;
                }
            },
			diff: /**SCHEMA_DIFF*/[
 
				{
					"operation": "merge",
					"name": "AddRecordButton",
					"values": {
						"click": {bindTo: "onAddButtonClick"},
						"menu": [],
                        "tag": "single"
					}
				},
				{
					"operation": "remove",
					"name": "AddTypedRecordButton"
				},
				{
					"operation": "remove",
					"name": "EditRecordMenu"
				},
				{
					"operation": "remove",
					"name": "CopyRecordMenu"
				},
                {
                    "operation": "insert",
                    "name": "AddTargetGroupButton",
                    "parentName": "Detail",
                    "propertyName": "tools",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.BUTTON,
                        "click": {"bindTo": "onAddButtonClick"},
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "caption": {"bindTo": "Resources.Strings.AddTargetGroupButtonCaption"},
                        "tag": "byGroup"
                    },
                    "index": 1
                }
			]/**SCHEMA_DIFF*/
		};
	}
);

https://youtu.be/WlaJY3duIJY

Спасибо огромное за идеи! Взяв понемногу из каждой у меня нарисовался алгоритм.
Остается только одна задача: я передаю в бп коллекцию записей, UId схемы раздела и объект администрирования. Не могу понять как правильно их передать в элемент "изменить права доступа". Подскажите, пожалуйста, как правильно реализовать данную задачу.

Уже не нужно, разобрался

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

Встречайте новый видеурок по работе с группами в bpm'online!

Узнайте, как сформировать в bpm'online дерево групп, распределить права доступа к группам и работать с ними. В видеоуроке демонстрируется, как создать структуру групп и настроить необходимые условия фильтрации, от простых к сложным.

Видео доступно по ссылке: Работа с группами в bpm'online

Больше видеоуроков смотрите на сайте академии Terrasoft.

Нравится

Поделиться

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

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

Столкнулись с задачей, когда необходимо переделать базовую фильтрацию "FixedFilters" для расписания. Идея в том, чтобы вместо кнопок "Сегодня" и "Текущая неделя" сделать 4 кнопки, которые будут показывать определенные недели в году (например кнопка "1" будет показывать неделю, по которой была зарегистрирована 1ая запись для данного объекта). Подскажите, пожалуйста, как лучше всего будет организовать подобное?

Нравится

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

Никита, добрый день!

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

Как пример, можете посмотреть реализованный функционал (фиксированный фильтр по ответственному и фиксированный фильтр по периоду) в базовой версии и сделать по на подобии:

this.fixedFilterConfig = {
entitySchema: Activity,
filters: [
{
	  name: 'PeriodFilter',
	  caption: resources.localizableStrings.PeriodFilterCaption,
	  dataValueType: Terrasoft.DataValueType.DATE,
	  startDate: {
			   columnName: 'StartDate',
			   defValue: Terrasoft.startOfWeek(new Date())
	  },
	  dueDate: {
			   columnName: 'DueDate',
			   defValue: Terrasoft.endOfWeek(new Date())
	  }
},
{
	  name: 'Owner',
	  caption: resources.localizableStrings.OwnerFilterCaption,
	  columnName: 'Owner',
	  defValue: Terrasoft.SysValue.CURRENT_USER_CONTACT,
	  dataValueType: Terrasoft.DataValueType.LOOKUP,
	  filter: BaseFiltersGenerateModule.OwnerFilter,
	  appendFilter: function(filterInfo) {
			   var filter;
			   if (filterInfo.value && filterInfo.value.length > 0) {
						 filter = Terrasoft.createColumnInFilterWithParameters(
								  '[ActivityParticipant:Activity].Participant',
								  filterInfo.value);
			   }
			   return filter;
	  }
}
]
};

Дмитрий, спасибо за совет! Попробуем на основе этого что-то придумать.

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

Добрый день!
В расширенном режиме фильтрации есть возможность группировки фильтров - зажимаем кнопку Ctrl и щелкаем мышкой рядом с фильтрами, которые хотим сгруппировать, но при этом эти фильтры никак не подсвечиваются и не выделяются. То есть не очень понятно, то ли выделил их пользователь для группировки, то ли нет.
Было бы неплохо, если бы фильтры, "прощелкнутые" для последующей группировки, как-то выделялись, затемнялись (пример - когда мы встаем мышкой на какую-то запись в разделе, она затемняется)

Нравится

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

Господа, прошу руку помощи.

Возможно ли фильтровать mds_Dataset, если да, то каким образом?

С уважением
Егор

Нравится

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

Егор, добрый день.

Нет, но тут немного другой подход. Дело в том, что mds заполняется каждый раз на OnDatasetAfterOpen(Dataset) теми данными, которые укажите Вы. Соответственно фильтровать нужно именно эти данные. Ну к примеру, в датасете у нас фрукты (яблоки, груши), в реестре добавляем кнопку "показать только яблоки":

function btnShowApplesOnly(Control) {
     var mds = dlData.Dataset;
     mds.Attributes('IsApplesOnly') = true;
     mds.Close();
     mds.Open();
}
 
function OnDatasetAfterOpen(Dataset) {
      if(Dataset.Attributes('IsApplesOnly')) {
             Dataset.Append();
             //только яблоки
             Dataset.Post();
      } else {
             Dataset.Append();
             //все фрукты
             Dataset.Post();
      } 
}

Дмитрий, спасибо огромное! Разобрался.

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