//атрибуты
"NrbContractNumber": {
    "contentType": this.Terrasoft.ContentType.SEARCHABLE_TEXT,
    "searchableTextConfig": {
        "listAttribute": "ContractNumberSearchList",
        "prepareListMethod": "prepareContractNumberSearchList",
        "listViewItemRenderMethod": "onContractNumberSearchListViewItemRender",
        "itemSelectedMethod": "onContractSearchItemSelected"
    },
},
"ContractNumberSearchList": {
    "dataValueType": Terrasoft.DataValueType.COLLECTION
},
 
//методы
init: function () {
    this.callParent(arguments);
    this.set("ContractNumberSearchList", new Terrasoft.Collection());
},
 
prepareContractNumberSearchList: function (filterValue) {
    if (filterValue.length >= 3) {
        this.searchContractByNumber(filterValue, this.loadSearchList, this);
    } else {
        this.clearSearchList("ContractNumberSearchList");
    }
},
 
searchContractByNumber: function (contractNumber, callback, scope) {
    const esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "NrbContract",
        rowCount: 10
    });
 
    esq.addColumn("Id", "Id");
    esq.addColumn("NrbNumber", "NrbNumber");
    esq.addColumn("NrbAccount.Id", "AccountId");
    esq.addColumn("NrbAccount.Name", "AccountName");
    esq.addColumn("NrbAccount.NrbKpp", "AccountKpp");
    esq.addColumn("NrbAccount.NrbTIN", "AccountTin");
    esq.addColumn("NrbAccount.NrbState.Name", "AccountState");
 
    esq.filters.addItem(Terrasoft.createColumnIsNotNullFilter("NrbAccount"));
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.START_WITH, "NrbNumber", contractNumber));
 
    esq.getEntityCollection(function (response) {
        Ext.callback(callback, scope, [response, "ContractNumberSearchList"]);
    }, scope || this);
},
 
loadSearchList: function (response, listName) {
    var list = this.get(listName);
    list.clear();
    list.loadAll(response.collection);
},
 
onContractNumberSearchListViewItemRender: function (item) {
    if (Ext.isEmpty(item)) {
        return;
    } 
    item.displayValue = item.values.NrbNumber;
    var itemValue = item.value = item.values.Id;
 
    var values = [
        item.values.NrbNumber,
        item.values.AccountName,
        item.values.AccountTin,
        item.values.AccountKpp,
        item.values.AccountState
    ].filter(function (item) {
        return !Ext.isEmpty(item);
    });
 
    var tpl = "<div	class=\"listview-item-info\" data-value=\"{0}\"> {1} </div>";
    item.customHtml = item.values.customHtml = this.Ext.String.format(tpl, itemValue, values.join(' | '));
},
 
onContractSearchItemSelected: function (contract) {
    if (Ext.isEmpty(contract)) {
        return;
    }
 
    this.loadLookupDisplayValue("Account", contract.values.AccountId);
    this.loadLookupDisplayValue("NrbContract", contract.values.Id);
    this.set("NrbName", contract.values.AccountName);
    this.set("NrbInn", contract.values.AccountTin);
    this.set("NrbKpp", contract.values.AccountKpp);
},

 

Нравится

Поделиться

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

а как это выглядит? :)

Присоединяюсь к вопросу выше)

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

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

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

Нравится

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

в diff

{

                "operation": "merge",

                "name": "AddTypedRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "controlConfig": {

                        "menu": {

                            "items": {"bindTo": "addMenuItems"}

                        }

                    },

                "visible": true,

                "enabled": true

                }

            },

methods

init: function() {

                this.callParent(arguments);

                this.initAddMenuItems();

            },

            initAddMenuItems: function() {

                var addMenuItems = Ext.create("Terrasoft.BaseViewModelCollection");

                addMenuItems.add("addContactItem", this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        "Caption": {"bindTo": "Resources.Strings.AddContactCaption"},

                        "Click": {"bindTo": "addRecipient"},

                        "Tag": "addContact"

                    }

                }));

                addMenuItems.add("addbytemplateItem", this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        "Caption": {"bindTo": "Resources.Strings.AddByTemplate"},

                        "Click": {"bindTo": "addRecipient"},

                        "Tag": "addbytemplate"

                    }

                }));

                this.set("addMenuItems", addMenuItems);

            },

 

в diff

{

                "operation": "merge",

                "name": "AddTypedRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "controlConfig": {

                        "menu": {

                            "items": {"bindTo": "addMenuItems"}

                        }

                    },

                "visible": true,

                "enabled": true

                }

            },

methods

init: function() {

                this.callParent(arguments);

                this.initAddMenuItems();

            },

            initAddMenuItems: function() {

                var addMenuItems = Ext.create("Terrasoft.BaseViewModelCollection");

                addMenuItems.add("addContactItem", this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        "Caption": {"bindTo": "Resources.Strings.AddContactCaption"},

                        "Click": {"bindTo": "addRecipient"},

                        "Tag": "addContact"

                    }

                }));

                addMenuItems.add("addbytemplateItem", this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        "Caption": {"bindTo": "Resources.Strings.AddByTemplate"},

                        "Click": {"bindTo": "addRecipient"},

                        "Tag": "addbytemplate"

                    }

                }));

                this.set("addMenuItems", addMenuItems);

            },

 

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

Добрый день!

Столкнулся с проблемой, поле справочника Состояние на детали графика оплат и поставок на вкладке Паспорт в заказе, в справочнике два значения (Выполнер/Не выполнен) и более не предвидится.

Хотелось бы переделать в выпадающий список, но у поля State замещающего объекта SupplyPaymentElement в пакете с моими доработками галка "Cписок" снята и задизейблена.

Как теперь это обойти?

Нравится

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

Добрый день, можете в замещающей схеме добавить метаданные, сохранить их и опубликовать:

+ MetaData.Schema.D2.["0a3324bb-55c8-4791-b51f-409cfedc6fe2"].E20 true

это добавит признак список к колонке UID которой указан в квадратных скобках

Добавьте нужные Вам значения в справочник 'Состояния элемента графика поставок и оплат'.

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

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

Борис Леонов,

Вы можете реализовать эту функциональность на уровне карточки редактирования:

                {

                    "operation": "insert",

                    "parentName": "Header",

                    "propertyName": "items",

                    "name": "State",

                    "values": {

                        "bindTo": "State",

                        "contentType": Terrasoft.ContentType.ENUM,

                        "layout": {"column": 12, "row": 3, "colSpan": 12}

                    }

                },

Или же создать не замещающий объект, а унаследованный от SupplyPaymentElement, тогда признак 'Список' у поля 'State' будет доступен.

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

У вас первый вариант прям получилось осуществить? Я сразу так сделал, только "operation" не "insert", а "merge", не работает на детали, действует только на карточку.

А второй как провернуть, что бы остальную логику не переделывать или обойтись минимальными доработками?

Борис Леонов,

Верно, первый вариант работает только для карточки редактирования - я так и написала.

А для отображения в виде списка в редактируемом реестре подойдет только второй вариант.

Как добавить унаследованный объект описано в статье, смотрите 'Создание пользовательской схемы объекта' и 'Указание родительского объекта'.

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

завтра попробую

Добрый день, можете в замещающей схеме добавить метаданные, сохранить их и опубликовать:

+ MetaData.Schema.D2.["0a3324bb-55c8-4791-b51f-409cfedc6fe2"].E20 true

это добавит признак список к колонке UID которой указан в квадратных скобках

Колодяжный Владислав Эдуардович,

добавление метаданных работает, спасибо!

Интересно, а в методе getCellControlsConfig это можно как то провернуть?

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

Благодарю!

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

Коллеги всем доброго времени суток!

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

Например: Есть справочники Tarifs в нем есть поле Position. И в зависимости от значения Position (1,2,3...)нужно сортировать выпадающий список.

Нравится

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

Это можно сделать при формировании запроса EntitySchemaQuery.

var sortPosition = esq.addColumn("Position");

sortPosition.orderDirection = Terrasoft.OrderDirection.ASC;

Я не уверен, что правильно понял кейс, но у меня, например, есть справочное поле "Рейтинг заявки", где значения от 1 до 10. И десятка идет сразу после единицы, так как оно сортируется как текст. Я на пейдже заявки создал атрибут, где указал сортировку по нужному мне целочисленному полю UsrNumber, которое я чуть ранее добавил в этот справочник.

"UsrRate": {
    lookupListConfig: {
	    orders: [
			{
			    columnPath: "UsrNumber", 
				direction: Terrasoft.OrderDirection.ASC
			}
		]
	}
}

 

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

Добрый день.

Возникла потребность реализовать кнопку, аналогичную кнопке со стадиями в разделе Обращения:

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

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

Коллеги, был ли у кого-то опыт реализации данной задачи?

 

Пробовала делать следующим образом: в секции diff прописала

{
	"operation": "insert",
	"parentName": "ActionButtonsContainer",
	"propertyName": "items",
	"name": "TestButton1",
	"values": {
		"itemType": this.Terrasoft.ViewItemType.BUTTON,
		"style": this.Terrasoft.controls.ButtonEnums.style.GREEN,
		"caption": "Test!!!!!!",
		"click": {"bindTo": "onResolvedButtonTest"},
		"classes": {
			"textClass": ["actions-button-margin-right"],
			"wrapperClass": ["actions-button-margin-right"]
		},
		"menu": {
			"items": {"bindTo": "ButtonMenu"}
		}
	}
}

В секции attributes прописала:

"ButtonMenu": {
	dataValueType: this.Terrasoft.DataValueType.COLLECTION
}

Но я не совсем понимаю как мне наполнить коллекцию ButtonMenu значениями, которые должны отображаться в выпадающем списке на кнопке?

 

Нравится

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

Вообще добавление подменю выглядит так:

var MenueItems = this.Ext.create("Terrasoft.BaseViewModelCollection");
this.getButtonMenuItem({
	"Click": { "bindTo": "ClickEvent" },
	"Tag": tag,
	"Caption": caption,
	"Enabled": true,
	"Visible": true
})
this.set("ButtonMenu", MenueItems);

 

В моём случае я заполнял выпадающий список значениями справочника по этому добавил функцию initMenueItems в init страницы

initMenueItems:function(){
	var self = this;
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "SchemaName"
	});
	esq.addColumn("Name", "Name");
	esq.addColumn("Id", "Id");
	esq.filters.add("Type", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Type", "{TypeId}"));
	esq.getEntityCollection(function (response) {
		if (!response.success) return;
		var data = response.collection;
		var MenueItems = self.Ext.create("Terrasoft.BaseViewModelCollection");
		data.collection.items.forEach(function (item) {
			MenueItems.addItem(self.getButtonMenuItem({
				"Click": { "bindTo": "ClickEvent" },
				"Tag": item.values.Id,
				"Caption": item.values.Name,
				"Enabled": true,
				"Visible": true
			}));
		});
		self.set("ButtonMenu", MenueItems);
	});
}

 

Если вопрос еще актуален, статично можно добавить так:

{

                "operation": "insert",

                "parentName": "OpportunityPageOfferTabContentGroup",

                "propertyName": "items",

                "name": "getOfferEngButton",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    //"classes": {textClass: "actions-button-margin-right"},

                    "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                    "caption": {bindTo: "Resources.Strings.UsrGetOfferButtonCaption"},

                    "menu": {

                        "items": [{

                            "caption": {"bindTo": "Resources.Strings.UsrGetOfferEngButtonCaption"},

                            "click": {"bindTo": "getOfferEng"}

                        }, {

                            "caption": {"bindTo": "Resources.Strings.UsrGetOfferRusButtonCaption"},

                            "click": {"bindTo": "getOfferRus"}

                        }]

                    }

                }

            },

Спасибо. Попробовала сделать обоими способами, все получилось!

Всё можно сделать еще прозаичнее, к обычной кнопке в diff добавляем свойство 

"menu": {
	"items": {"bindTo": "ButtonMenuItems"}
},

где ButtonMenuItems это атрибут 

attributes: {
	"ButtonMenuItems": {
		dataValueType: this.Terrasoft.DataValueType.COLLECTION
	}
},

куда в свою очередь, необходимо добавлять через метод addItem, элементы вот как-то так

var collection = this.get("ButtonMenuItems");
var menuItem = this.Ext.create("Terrasoft.BaseViewModel", {
	values: {
		"Caption": "Заголовок пункта меню",
		"Click": {bindTo: "actionMethod"}
	}
});
collection.addItem(menuItem);

 

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

Добрый день!

Кто может подсказать как работать с выпадающим списком типа ILookupDataControl.
Например есть dataset ds_Offering (там есть поле ID и допустим Name).

- Добавляю элемент ILookupDataControl на форму
- Добавляю DatasetLink cо свойством Name = ds_Offering
- В свойствах ILookupDataControl, в DatasetLink выбираю добавленный DatasetLink (ds_Offering)
- В свойстве DataFieldName нет ни ID, ни Name

По какому принципу выпадающий список (ILookupDataControl) вообще работает? И как его правильно настроить?

Нравится

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

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

Если Вы хотите добавить на форму поле со списком, то в Вашей таблице с полями Id, Name Вы должны добавить еще одно поле, к примеру ElementID, в которм будет храниться ID выбранного значения с этого списка. Сам список - это еще одна отдельная таблица(справочник) - Element.

Т.к. в итоге у Вас должно быть две таблицы: tbl_Element (Id, Name) и tbl_MyTable (Id, Name, ElementId). После этого в сервисе выборки данных (select query), кроме поля tbl_MyTable.ElementId, Вы должны добавить поле tbl_Element.Name, перед этим связав эти две таблицы в блоке "FROM" по tbl_Element.Id = tbl_MyTable.ElementId. Т.е. в итоге у Вас должно "выбираться" четыре поля:

Id (tbl_MyTable.Id),
Name (tbl_MyTable.Name),
ElementId (tbl_MyTable.ElementId),
ElementName (tbl_Element.Name)

После этого в сервис датасета необходимо добавить поле с типом справочник. Только такие поля можно выбирать в качестве связки с контролом LookupDataControl. В свойсвах этого поля необходимо указать колонку - ElementId, и поле для отображения - ElementName, а также указать датасет таблицы tbl_Element (к примеру ds_Element), и не забыть отметить признак "списком", если необходимо.
После этого в форму окна добавляете LookupDataControl, привязываете DatasetLink, и в свойстве DatasetField появится поле ElementId.
В Вашем же примере поля не отображались, т.к. поле Name - текстовое. Оно отобразиться в этом свойстве лишь для котрола соответсвующего типа - TextDataControl.
Также прилагаю ссылку на ILookupDataControl в SDK;

Если будут дополнительные вопросы - обращайтесь.

А есть ли возможность задавать параметры DatasetLink и DataFieldName программно (например при создании окна) ?

И еще, как можно реализовать ILookupDataControl для "Контрагентов", в котором бы выводился список всех контрагентов (но с определенным фильтром). Обычный способ не работает.

Александр,
1. Да, можно. Есть множество примеров в базовой конфигурации.
2. Что значит "обычный способ"? Фильтры накладываются функцией ApplyDatasetFilter() в обработчике события OnPrepareSelectWindow. Опять же, в базовой конфигурации есть много примеров.

Обычный способ в моем понимании.
У менять есть карточка "контрагенты" (ds_Accounts), я добавляю поле HoldingID в таблицу, запрос и датасет. (Источник данных для справочника тот же ds_Accounts, поле для отображения Name, Отображать как выпадающий список - активно). Далее настраиваю LookupDataControl.

Однако на форме, при изменении поля HoldingID изменяется поле Name. Т.е. они взаимосвязаны, есть предположение, что "указатель" на два ds_Accounts одинаковый.

Здравствуйте, Александр!
В Вашем случае, судя по всему, поле ссылается на ту же таблицу, в которой используется, что не есть правильно.
Как делать правильно можно посмотреть на примере поля "Ответственный" в контакте.

И в настройках лукап-поля "Поле для отображения" должно быть не "Name", "OwnerName" в данном примере.

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

А есть ли для ComboBoxEdit аналог старого доброго метода UnprepareDropDownList() (из Terrasoft 3.x) для того, чтобы «перефильтровать» выпадающий список динамически, при изменении значения во влияющем поле?
Для LookupEdit метод PrepareLookupFilter срабатывает каждый раз при открытии справочника как положено, хотелось бы получить аналогичный результат для списка в ComboBoxEdit…

Нравится

3 комментария
Page.MyComboBoxEdit.ListPrepared = false;

Александр, спасибо! все получилось:twisted:
Я вот даже спрашивать боюсь, откуда ж этот реквизит найти можно было, с учетом отсутствия нормального более-менее подробного SDK...

Александр, SDK в процессе написания. Вы же нашли способ его узнать :)

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