Подскажите как динамически делать пункт меню в "Действие" карточки в совмещенном режиме.

В обычном режиме все работает нормально.

attributes: {
	"IsCanVisaStatus": {
		dataValueType: Terrasoft.DataValueType.BOOLEAN,
		value: true,  // Значение по умолчанию которое передаеться при загрузке страницы на нашу кнопку
		dependencies: [{
			columns: ["KtState"], // Отслеживаем изменение поля состояния 
			methodName: "setCanVisaStatusContract" // и запускаем нашу функция если состояние изменчется
		}]
	}
},
methods: {
	onEntityInitialized: function() {
		this.callParent(arguments);
		this.setCanVisaStatusContract(); // Запускаем функцию при входе на страницу когда поля уже заполненны
	},
	getActions: function() {
		var actionMenuItems = this.callParent(arguments);
		actionMenuItems.addItem(this.getButtonMenuItem({
			Type: "Terrasoft.MenuSeparator",
			Caption: ""
		}));
		actionMenuItems.addItem(this.getButtonMenuItem({
			"Caption": VisaHelper.resources.localizableStrings.SendToVisaCaption,
			"Tag": VisaHelper.SendToVisaMenuItem.methodName,
			"Enabled": {"bindTo": "IsCanVisaStatus"} // мониторим через привязку состояние значения атрибута
		}));
		return actionMenuItems;
	},
	setCanVisaStatusContract: function(){
		var stateId = this.get("KtState").value; // Текущая стадия
		var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {  // Запрос к базе данных о том нужна ли кнопка отправки на визирования
			rootSchemaName: "KtContractKarTelState"
		});
		esq.addColumn("KtCanVisa", "KtCanVisa"); // Сама колонка указывающая что нужна кнопка
		esq.getEntity(stateId, function(result) {
			if (result.success) {
				if (result.entity.get("KtCanVisa") && this.canEntityBeOperated()) {   // this.canEntityBeOperated() - стандартный класс отвечает за то что если карточка на в режиме редактирования то false.
					this.set("IsCanVisaStatus", true);
				} else {									// Присваивает атрибуту значение true или false в зависимости от результата запроса
					this.set("IsCanVisaStatus", false);
				}
				
			}
		}, this);
	}
}

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

Нравится

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

Нужно использовать механизм сообщений. Вот пример. Моем случае бинд был на аттрибут (в странице редакирования) "Enabled": {"bindTo": "enabledPlanPaymentDate"}

В секции пишем

		messages: {
			"GetEnabledPlanPaymentDate": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
		attributes: {
			"enabledPlanPaymentDate": {
				"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"dataValueType": this.Terrasoft.DataValueType.BOOLEAN,
				"value": false
			}
		},
		methods: {
			init:function() {
				this.callParent(arguments);
				this.sandbox.subscribe("GetEnabledPlanPaymentDate",  function(args){this.$enabledPlanPaymentDate = args}, this, ["SectionModuleV2_InvoiceSectionV2"]);
			},
		}

В странице реадактирования:

		messages: {
			"GetEnabledPlanPaymentDate": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		},
 
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.sandbox.publish("GetEnabledPlanPaymentDate", this.checkEnabledChangePlanPaymentDate(), ["SectionModuleV2_InvoiceSectionV2"]);
			},
			checkEnabledChangePlanPaymentDate: function() {
				return this.$enabledPlanPaymentDate;
			}
}

 

Нужно использовать механизм сообщений. Вот пример. Моем случае бинд был на аттрибут (в странице редакирования) "Enabled": {"bindTo": "enabledPlanPaymentDate"}

В секции пишем

		messages: {
			"GetEnabledPlanPaymentDate": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
		attributes: {
			"enabledPlanPaymentDate": {
				"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"dataValueType": this.Terrasoft.DataValueType.BOOLEAN,
				"value": false
			}
		},
		methods: {
			init:function() {
				this.callParent(arguments);
				this.sandbox.subscribe("GetEnabledPlanPaymentDate",  function(args){this.$enabledPlanPaymentDate = args}, this, ["SectionModuleV2_InvoiceSectionV2"]);
			},
		}

В странице реадактирования:

		messages: {
			"GetEnabledPlanPaymentDate": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		},
 
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.sandbox.publish("GetEnabledPlanPaymentDate", this.checkEnabledChangePlanPaymentDate(), ["SectionModuleV2_InvoiceSectionV2"]);
			},
			checkEnabledChangePlanPaymentDate: function() {
				return this.$enabledPlanPaymentDate;
			}
}

 

Трефилов Павел Сергеевич,

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

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

Здравствуйте, коллеги!

Столкнулся с проблемой описанной здесь:

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

Статья, которой предлагали воспользоваться для решения проблемы недоступна. 

Также добавлял кнопку на страницу секции (ProductSectionV2) со свойством visible: false (так как на странице раздела она не должна быть видна), но при переходе на страницу товара (ProductPageV2) кнопка остается невидимой, хотя свойство visible: true.

Может кто-нибудь объяснит, в чем проблема. Заранее благодарен.

Нравится

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

Ну собственно, вам необходимо воспользоваться вот этими 2-мя статьями:

https://academy.terrasoft.ru/documents/technic-sdk/7-14/kak-dobavit-knopku-na-stranicu-redaktirovaniya-v-sovmeshchennom-rezhime

https://academy.terrasoft.ru/documents/technic-sdk/7-14/kak-dobavit-knopku-v-rezhime-dobavleniya-novoy-zapisi

Тогда она и не будет исчезать при обновлении страницы.

Ну собственно, вам необходимо воспользоваться вот этими 2-мя статьями:

https://academy.terrasoft.ru/documents/technic-sdk/7-14/kak-dobavit-knopku-na-stranicu-redaktirovaniya-v-sovmeshchennom-rezhime

https://academy.terrasoft.ru/documents/technic-sdk/7-14/kak-dobavit-knopku-v-rezhime-dobavleniya-novoy-zapisi

Тогда она и не будет исчезать при обновлении страницы.

ProductSectionV2 не означает что это раздел, он так же используется и при просмотре карточки, так что там тоже нужно кнопку делать

Здравствуйте, спасибо за ответ. А метод onClick этой кнопки тоже в обоих местах прописывать? Если да - в ProductSectionV2 не доступны необходимые мне поля/действия карточки (даже через getActiveRow. А если описать только в ProductPage то переходе в карточку из раздела кнопка не активна.

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

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

Спасибо за ответ. Ситуация такая: Если добавляю кнопку в схему карточки и, там же, её обработчик - после перехода в карточку со страницы раздела кнопки нет, но если обновить страницу карточки - кнопка есть и функционирует как надо.

По ответам выше я добавляю кнопку в схему раздела тоже. Тогда, если переходить в конкретную карточку с раздела, кнопка не работает (так как её обработчик на схеме карточки, а сама она подгрузилась видимо со схемы раздела).

Сама кнопка (Сохранить и отправить) должна сохранять и менять стадию продукта на другую. В схеме раздела я не знаю как получить доступ к атрибуту карточки Stage.

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

Решил проблему при помощи https://academy.terrasoft.ru/documents/technic-sdk/7-14/obmen-soobshcheniyami-mezhdu-modulyami-komponent-sandbox. Если кнопка рендерится со страницы раздела то при нажатии на нее отправляется сообщение на страницу карточки где запускается нужный обработчик кнопки. Параметры видимости кнопки также передаются по сообщению.

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

Здравствуйте! Столкнулся со следующей проблемой.
На страницу редактирования контакта добавляю кнопку(при нажатии выводится имя контакта) при помощи такого кода:

define("ContactPageV2", [], function() {
        return {
                entitySchemaName: "Contact",
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[
        {
                       
                        "operation": "insert",
                       
                        "parentName": "ActionButtonsContainer",
                       
                        "propertyName": "items",
                       
                        "name": "Name",
                       
                        "values": {
                               
                                itemType: Terrasoft.ViewItemType.BUTTON,
                               
                                caption: { bindTo: "Resources.Strings.Name"},
                                click: { bindTo: "getName"},
                               
                                "layout": {
                                        "column": 1,
                                        "row": 6,
                                        "colSpan": 1
                                },
                                style: "red"
                        }
        }
]/**SCHEMA_DIFF*/,
                methods: {
                        getName: function() {
                                var name = this.get("Name");
                                this.showInformationDialog(name);
                        }
                },
                rules: {}
        };
});

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

Может кто-нибудь объяснит в чем проблема. Заранее благодарен.

Нравится

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

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

Воспользуйтесь статьей https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-dobavit-knop….

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

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