Здравствуйте.
Версия 7.9.2

Необходимо в карточке CallMessagePublisherPage отфильтровать поле Contact по Контрагенту и изменить тип поля на ENUM

Фильтр реализовал в lookupListConfig атрибута Contact:

"Contact": {
   "isLookup": true,
   "lookupListConfig": {
     "columns": ["Account"],
     "filter":  function() {
       var filters = Ext.create("Terrasoft.FilterGroup");
       var listenerInfo = this.getListenerRecordData();
       if (listenerInfo.relationSchemaName === "Account" &&
          !Ext.isEmpty(listenerInfo.relationSchemaRecordId)) {
            var accountFilter = this.Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL,
                "Account",
                listenerInfo.relationSchemaRecordId);
            filters.add("AccountFilter", accountFilter);
        }
       return filters;
     }
   }
}

При нажатии на "лупу" (Открытие окна выбора из справочника) справочник контактов отфильтрован корректно.
Однако, при смене contentType на ENUM или при нажатии клавиши "Вниз" стандартного справочного поля фильтрация значений не происходит, хотя указанный выше код так же отрабатывает.

В чем причина такого поведения?

Нравится

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

"Коновалов Игорь" написал:В чем причина такого поведения?

Попробовал на тестовой 7.9.1 - всё воспроизводится, проверил на 7.8.0 у клиента (мы там ему enum поле фильтровали в активности) - там всё идеально работает, фильтруется через lookupConfig.

Помнится когда начинал изучать bpm, то столкнулся с подобной проблемой. Спросил у ТП, ребята говорят: "переопределяйте change и prepareListConfig" при описании контрола (что дико неудобно)

Вывод: хрен знает как оно вообще работает ¯\_(ツ)_/¯

Вам стоит смотреть в сторону добавления свойства orders в lookupListConfig. К примеру:

"EmployeesNumber": {
	lookupListConfig: {
		orders: [{columnPath: "Position"}]
	}
}

"Мотков Илья" написал:

Вам стоит смотреть в сторону добавления свойства orders в lookupListConfig. К примеру:

"EmployeesNumber": {

        lookupListConfig: {

                orders: [{columnPath: "Position"}]

        }

}

Илья, здравствуйте.
Мне не нужна сортировка. Нужна фильтрация выпадающего списка.
Я использую стандартное свойство filter в lookupListConfig.

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

"Мотков Илья" написал:

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


Т.е. стандартная фильтрация для справочных полей при использовании выпадающих списков, начиная с 7.9, не работает?

Игорь, фильтрация выпадающих списков через lookupListConfig отрабатывает в 7.9.2. Проблема заключается в том, что логика работы с свойством filters прописана в BasePageV2(NUI). Схема CallMessagePublisherPage не наследуется от BasePageV2.

Вам стоит смотреть в сторону копирования части логики из BasePagev2 в Вашу схему.

Да, спасибо. Уже реализовал через prepareList

Показать все комментарии
При установке системной настройки [Тип сравнения для строковых колонок] = 1 хотелось бы, чтобы во всех lookup-полях это тоже работало бы без знака %.Иначе, пользователям всё равно приходится использовать знак %, что усложняет работу.
3 комментария

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

Для решения данного вопроса необходимо заместить схему LookupPageViewModuleGenerator. В данной схеме есть метод pushSelectFilters. Именно этот метод отвечает за тип поиска. В базовой версии тип поиска START_WITH. В замещающей схеме Вам необходимо заменить тип поиска на CONTAIN.

"Мотков Илья" написал:В замещающей схеме Вам необходимо заменить тип поиска на CONTAIN.

Уже хорошо! Спасибо!

"Мотков Илья" написал:Именно этот метод отвечает за тип поиска

Останется как нибудь забиндить тип поиска на системный параметр и будет вообще красиво все :)

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

Только начал изучать платформу, но не нашел информации по проблеме. Суть задачи: есть два поля: чекбокс и поле справочника. Нужно при установке галочки чекбокса устанавливать одно значение из справочника, при снятии второе. Проблема в том, как привязать чекбокс ко второму полю и как устанавливать значение поля из справочника.

Нравится

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

Возьмите за пример событие dlDataOnDatasetDataChange для поля AccountID, источника данных dlData, окна редактирования wnd_ContactEdit. В событии происходит вызов функции FillInformationBySelectedItem - которая заполняет поля по определенному правилу (фильтру).

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

Здравствуйте!
Есть задача добавить поле с выпадающим списком(наполнение справочника), значение которого будет является быстрым фильтром для реестра справочников.
Отображаться данная страница справочника будет всего в одном месте (в процессе).
Также необходимо добавить некоторую логику на возможность выбора/отмены выбора значений в реестре справочника и кастомные стили.

Подскажите пожалуйста, как лучше реализовать данную задачу?

Нравится

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

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

Данную задачу Вы можете решить, используя автогенерируемую страницу.

Здравствуйте. Насколько мне известно у автогенерируемых страниц весьма урезанный функционал.
Поле добавить можно, но вот расширить функционал LookupPage - нет.

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

Также при изменении типа должна отрабатывать фильтрация.

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

В таком случае Вам необходимо использовать элемент "Преднастроенная страница".

Естественно, страницу, ссылающуюся на города, придется создать.

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

Здравствуйте! Пример создание преднастроенной страницы для процесса описан

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

Вам необходимо
1) создать страницу редактирования
2) унаследоваться от LookupPageV2
3) добавить на страницу поле "Тип продукта", которое будет смотреть в соответствующий справочник
4) добавить фильтрацию по значению в этом поле (для отображения записей, соответствующих значению в этом поле)
5) добавить мультивыбор. Пример реализации рекомендую посмотреть ActivityParticipantDetailV2, метод openContactLookup (выбор контакта) и addCallBack (добавления выбранных записей на деталь. В Вашей задачи решение, скорее всего будет другим, например, запись в параметр страницы).
6) Обработка заданного параметра дальнейшими элементами процесса.

Показать все комментарии
По аналогии с подсказками можно сделать всплывающее описание в полях и колонках Lookup (с возможностью кастомизировать). Таким образом без перехода по карточкам можно будет видеть основную информацию по связанным объектам, что ускорит и упростит работу с системой
7 комментариев

т.е. мини карточки? :smile:

"Андросов Дмитрий" написал:т.е. мини карточки?

о, а где это?

Упс, видимо, именно там, где искал, этого нет - в поле "заказ" :)

Добрый день!

Спасибо за идею.
Данная функциональность уже запланирована для реализации в последующих версиях. Функционал будет доступен уже в версии 7.9, и по возможности, даже уже в 7.8.

"Адасюк Валерий Викторович" написал:Данная функциональность уже запланирована

я надеюсь это будет настраиваться где-нибудь в diff'ах или lookupConfig'ах

"Андросов Дмитрий" написал:я надеюсь это будет настраиваться где-нибудь в diff'ах или lookupConfig'ах

Лучше один раз настроить для раздела, чем для каждого поля в каждой карточке отдельно

"Владимир Соколов" написал:Лучше один раз настроить для раздела, чем для каждого поля в каждой карточке отдельно

одно другому не мешает)

Показать все комментарии
Идея
Реализована

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

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

а зачем добавлять из поля, когда мы еще не знаем - нашли или нет?

Дмитрий, Вы тоже можете пойти дальше и предложить реализацию)) Тем более, исходники контролов открыты (лежат по пути ..\Terrasoft.WebApp\Resources\ui\Terrasoft\controls\) и в конфигурации можно создавать свои контролы на основе существующих. Если надо - могу поделиться примерчиком.

"Андрей Каспаревич" написал:конфигурации можно создавать свои контролы на основе существующих

еще не дошел до этих задач, но в планах есть. Примеры были бы кстати))

"Владимир Соколов" написал:а зачем добавлять из поля, когда мы еще не знаем - нашли или нет

а если знаем? иногда это известно заранее (например, звонит клиент, по телефону не нашелся и на вопрос "вы к нам обращаетесь впервые" отвечает да)

Дмитрий, прилагаю пример. Это контрол с маской ввода, основанный на TextEdit. Не скажу, что он отлично работает, но в качестве примера подойдет.
tsc.multimaskedit.zip
Использование:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "merge",
		"name": "MobilePhone",
		"values": {
			"controlConfig": {
				"className": "Terrasoft.MultiMaskEdit",
				"mask": {
					"bindTo": "getPhoneMask"
				},
				onBeforePasteFormatValue: this.getDigitsFromString
			}
		}
	}
]/**SCHEMA_DIFF*/,
methods:
{
	getDigitsFromString: function(value) {
		return value.replace(/\D/g, "");
	},
	getPhoneMask: function() {
		return {
			formats: ["+7(999)999-99-99"]
		}
	}
}

Спасибо, Александр!

Виноват) перепутал
Спасибо Андрей!

Так то))

Андрей Каспаревич, Большое спасибо!

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

Посоветуйте, как ускорить выбор справочника при создании нового поля в объекте? Ждать почти минуту - это расточительство

Нравится

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

это скорее в идеи)
"почти минута" это как-то очень медленно, у меня первая загрузка занимает секунд 25 на он-деманд (на он-сайт 5сек)

видимо, "он-деманд" "он-деманду" рознь.

Но в мастере список справочников открывается быстро

Действительно, есть такая проблема. Решение в разработке.

Показать все комментарии
Предлагаю позволить устанавливать в качестве отображаемого значения DisplayValue справочника.На данный момент использую событие на onSaved и дополнительную колонку DisplayColumn, в которую записываю значения из справочника. Крайне неудобно каждый раз, если в объекте отсутствует строка создавать дополнительный обработчик события для создания отображаемого значения.
4 комментария

Ну, или хотя бы создать базовый класс с уже таким действием

Здравствуйте, Александр!

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

Приятного дня!

"Пащенко Александр Сергеевич" написал:На данный момент использую событие на onSaved

А можете привести пример кода на OnSaved?

Владимир, добрый день!

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

Например, если стоит задача установить отображаемое значение для детали Продукты в карточке продажи, это можно сделать следующим образом: в коде схемы OpportunityProductDetailV2 находим блок diff и добавляем в него значение PrimaryDisplayColumnName, как в примере ниже.

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "merge",
		"name": "DataGrid",
		"values": {
			"type": "listed",
 
			// установка отображаемого значения для детали
			"primaryDisplayColumnName": "Product.Name",
			//
 
			"listedConfig": {
				// конфигурация колонок списочного реестра
			},
			"tiledConfig": {
				// конфигурация колонок плиточного реестра
			}
		}
	}
]/**SCHEMA_DIFF*/

Что касается примера Александра, думаю, имелось в виду следующее (если продолжать аналогию с продуктами в продажах):

1) добавляем в схему детали OpportunityProduct дополнительную текстовую колонку ProductName;
2) указываем эту колонку в качестве отображаемой для схемы OpportunityProduct;
3) в коде карточки редактирования детали (OpportunityProductPageV2) переопределяем обработчик onSaved;
4) добавляем в этот обработчик примерно такой код:

onSaved: function() {
	var product = this.get("Product");
	if (product && product.displayValue) {
		this.set("ProductName", product.displayValue);
	}
	this.callParent(arguments);
}
Показать все комментарии

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

inputMessage:function () {
                var callback = function(returnCode, controlData) {
                    if (returnCode === 'ok' && controlData.StartDate.value) {
                        debugger;
                        var StartDate = controlData.StartDate.value;
                    }
                };
                var config= {
                    warehouse: {
                        dataValueType: Terrasoft.DataValueType.LOOKUP,
                        caption:'Для филиала', //resources.localizableStrings.GroupNameInputTitle,
                        entitySchemaName:'SxWarehouses',
                        ReferenceSchemaName:'SxWarehouses',
                        isRequired:true,
                        values: {
                            ReferenceSchemaName:'SxWarehouses',
                            isRequired:true,
                            entitySchemaName:'SxWarehouses'
                        }

                        //value: 0
                    },
                    StartDate: {
                        dataValueType: Terrasoft.DataValueType.DATE,
                        caption:'Дата начала', //resources.localizableStrings.GroupNameInputTitle,
                        isRequired:true
                        //value: 0
                    },
                    DueDate: {
                        dataValueType: Terrasoft.DataValueType.DATE,
                        caption:'Дата завершения', //resources.localizableStrings.GroupNameInputTitle,
                        isRequired:true
                        //value:
                    }

                };
                var caption = 'Отчет';
                //inNew ? resources.localizableStrings.NewGroupInputBoxCaption :
                //  resources.localizableStrings.ExistingGroupInputBoxCaption;
                Terrasoft.utils.inputBox(
                    caption,
                    callback,
                    ['ok', 'cancel'],
                    this,
                    config,
                    {
                        defaultButton: 0,
                        classes: {
                            coverClass: ['cover-calss1', 'cover-calss2'],
                            captionClass: ['caption-calss1', 'caption-calss2']
                        }
                    }
                );
            },

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

Нравится

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

Здравствуйте, Александр!

"Пащенко Александр Сергеевич" написал:Здравствуйте, нужно отобразить сообщение с полями ввода.

Можете, пожалуйста, уточнить где хотите отображать сообщение? В зависимости от сущности, реализация будет разной.

При наступлении определенного события нужно запросить у пользователя данные следующего вида

для этого вызывается метод inputMessage()
Проблема заключается в том, что поле типа lookup не привязано к объекту, следовательно страница справочника не открывается

Здравствуйте, Александр!

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

Возможно ли как-то отловить событие клика на лукап? или как-то передать правильный конфиг для лукапа?
Если нет, то как ещё можно решить данную задачу?

Здравствуйте, Александр!

В InputBox не получится работать с лукапом. Рекомендую Вам посмотреть, как пример, работу страницы SimpleTaskAddModule. Вызывается при работе с представлением "Расписание", в разделе "Активности".

Не очень правильный но самый простой вариант. Отловить событие нажатия на лупу и открыть нужный справочник.

$('.base-edit-right-icon-wrapper').click(function(){
	self.openLookup(configLookup, function(response) {
		// Тут записать данные выбранные из справочника в поле лукапа и в переменную.
	});
	$('.ts-modalbox').css('z-index','3000'); //эта строчка нужна чтобы окно справочника было поверх inputBox
});

А в коллбеке получать выбранное значение из переменной.

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

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

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

prepareOpenLookup:function () {

                    var addParams = this.get('addParams');
                    //Строим ExistsFilter
                     var filterValue = this.get("MasterRecordId");
                     var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                     rootSchemaName: this.entitySchemaName
                     });
                     esq.addColumn("Id");
                     esq.addColumn(addParams.item1 + '.Id');
                     esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
                     esq.filters.add("filterChild", Terrasoft.createColumnFilterWithParameter(
                     this.Terrasoft.ComparisonType.EQUAL, addParams.item2, filterValue));

                     esq.getEntityCollection(function(result) {
                        var existsContactsCollection = [];
                         if (result.success) {
                            result.collection.each(function(item) {
                                existsContactsCollection.push(item.get(addParams.item1 + '.Id'));
                            });
                        }
                        //config открытия справочника
                         var config = {
                            entitySchemaName: addParams.parentTable,
                            multiSelect: true,
                            columns: addParams.columns,
                            filters:(Terrasoft.createColumnFilterWithParameter(
                                Terrasoft.ComparisonType.EQUAL, "SxRequest", addParams.ParentId))
                         };
                     if (existsContactsCollection.length > 0) {
                         var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
                         existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
                         existsFilter.Name = "existsFilter";
                         var filterGroup = Terrasoft.createFilterGroup();
                         filterGroup.logicalComparisonTypes = Terrasoft.LogicalOperatorType.AND;


                        var requestFilter=Terrasoft.createColumnFilterWithParameter(
                             Terrasoft.ComparisonType.EQUAL, "SxRequest", addParams.ParentId)
                         requestFilter.Name = "requestFilter";
                         requestFilter.comparisonType = Terrasoft.ComparisonType.EQUAL;
                         //Добавляем фильтр по заявке
                         filterGroup.add(requestFilter);

                         //Добавляем existsFilter
                         filterGroup.add(existsFilter);
                         //Устанавливаем фильтрацию для справочника
                         config.filters = filterGroup;
                     }
                     this.openLookup(config, this.addCallBack, this);
                     }, this);
                },

Проблема в том, что из filterGroup отрабатывает только последний добавленный фильтр. (порядок значения не имеет, отрабатывает все-равно последний)
Как можно решить данную проблему?

Нравится

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

Выяснил в чем проблема filterGroup.add(ИМЯ,Filter) принимает 2 параметра.
а я использовал
filterGroup.add(requestFilter);

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