Вопрос

Автозаполнение текстового поля

Добрый день. Нужна помощь в следующей задаче:

1) имеются сервисы с текстовым многострочным полем, куда записывается информация

2) эту информацию необходимо показывать на карточке обращения во время выбора того или иного сервиса

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

Нравится

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

1. В карточку обращения в блок attributes добавляете аттрибут. Например:

"MDPStatus": {

                "dataValueType": Terrasoft.DataValueType.LOOKUP,

                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                "value": null,

                "referenceSchemaName": "MDPStatus"

            }

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

2. Потом в блок diff в нужное место добавляете контрол и связываете его с этим аттрибутом:

            {

                "operation": "insert",

                "name": "MDPStatus",

                "values": {

                    "layout": {

                        "colSpan": 8,

                        "rowSpan": 1,

                        "column": 4,

                        "row": 8,

                        "layoutName": "Header"

                    },

                    "bindTo": "MDPStatus",

                    "caption": {

                        "bindTo": "Resources.Strings.MDPStatusCaption"

                    },

                    "enabled": false

                },

                "parentName": "Header",

                "propertyName": "items",

                "index": 17

            }

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

3. В methods реализуете свой метод, в котором из сервиса вычитывается нужная текстовая информация и помещается в объявленный ранее аттрибут.

4. Для своего аттрибута добавляете dependencies от поля 'Cервис' и указываете метод, который реализовали в п.3.

5. Также, чтобы обеспечить отображение этой информации при открытии карточки обращения для редактирования при уже заполненном сервисе, метод, реализованный в п.3, нужно вызвать на onEntityInitialized. Например:

onEntityInitialized: function() {

                this.callParent(arguments);

                if (!this.isNew) {

                    /** вызов метода из п.3*/

                }

            },

 

1. В карточку обращения в блок attributes добавляете аттрибут. Например:

"MDPStatus": {

                "dataValueType": Terrasoft.DataValueType.LOOKUP,

                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                "value": null,

                "referenceSchemaName": "MDPStatus"

            }

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

2. Потом в блок diff в нужное место добавляете контрол и связываете его с этим аттрибутом:

            {

                "operation": "insert",

                "name": "MDPStatus",

                "values": {

                    "layout": {

                        "colSpan": 8,

                        "rowSpan": 1,

                        "column": 4,

                        "row": 8,

                        "layoutName": "Header"

                    },

                    "bindTo": "MDPStatus",

                    "caption": {

                        "bindTo": "Resources.Strings.MDPStatusCaption"

                    },

                    "enabled": false

                },

                "parentName": "Header",

                "propertyName": "items",

                "index": 17

            }

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

3. В methods реализуете свой метод, в котором из сервиса вычитывается нужная текстовая информация и помещается в объявленный ранее аттрибут.

4. Для своего аттрибута добавляете dependencies от поля 'Cервис' и указываете метод, который реализовали в п.3.

5. Также, чтобы обеспечить отображение этой информации при открытии карточки обращения для редактирования при уже заполненном сервисе, метод, реализованный в п.3, нужно вызвать на onEntityInitialized. Например:

onEntityInitialized: function() {

                this.callParent(arguments);

                if (!this.isNew) {

                    /** вызов метода из п.3*/

                }

            },

 

Спасибо, помогло разобраться. Еще взял для примера статью из академии и совсем все стало понятно: https://academy.terrasoft.ru/documents/technic-sdk/7-12/dobavlenie-vych…

По сути, поле я добавил мастером, и мне пришлось только докрутить атрибут и метод:

 

attributes: {
	"UsrServiceHelp": {
		dataValueType: Terrasoft.DataValueType.TEXT,
		dependencies: [
			{
				columns: ["UsrObrUsluga"],
				methodName: "helping"
			}
		]
	}
},
methods: {
	onEntityInitialized: function() {
		this.callParent(arguments);
		this.helping();
	},
	helping: function() {
		if (this.get("UsrObrUsluga") != null) {
			var service = this.get("UsrObrUsluga");
			var recordId = service.value;
			var esqCase = Ext.create("Terrasoft.EntitySchemaQuery", {
			    rootSchemaName: "ServiceItem"
		    });
		    esqCase.addColumn("UsrServiceHelp");
			esqCase.getEntity(recordId, function(result) {
				if (result.success) {
					var help = result.entity.get("UsrServiceHelp");
					this.set("UsrServiceHelp", help);
				}
			}, this);
		}
},

Это работает как надо и не выдает ошибок, возможно можно как-то оптимизировать, но буду решать по мере появления задач

Быстров Сергей,

Я бы ещё в методе 'helping' добавила обработку кейса, когда поле "UsrObrUsluga" незаполненное, если оно не обязательное для заполнения в карточке.

Так как при очистке этого поля, значение в поле "UsrServiceHelp" тоже должно очиститься.

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