Упорядочение пунктов меню печати

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

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

Заранее спасибо!

Нравится

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

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

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

Алексей, спасибо за ответ! Не могли бы вы привести пример? Или хотя бы ссылку на документацию по методам PrintReportUtilites?

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

Могу ответить точечно, но не по всему миксину:smile:

Рекомендую посмотреть тему http://www.community.terrasoft.ru/blogs/15581

Алексей, премного благодарен!

Для тех, у кого возникнет такая необходимость, привожу код функции.

initSectionPrintForms: function(callback, scope) {
	var reportsEsq = this.getModulePrintFormsESQ();
	reportsEsq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
			"ShowInSection", true));
	reportsEsq.getEntityCollection(function(result) {
 
		if (result.success && !result.collection.isEmpty()) {
			// Коллекция пунктов меню
			var printFormsMenuCollection = result.collection;
 
			/* Тут можно анализировать свои «условия» и удалять те или иные элементы printFormsMenuCollection */
			printFormsMenuCollection.collection.items = printFormsMenuCollection.collection.items.sort(
				function(item1, item2) {
					if (item1.values.Caption > item2.values.Caption) {
						return 1;
					}
					if (item1.values.Caption < item2.values.Caption) {
						return -1;
					}
					return 0;
				});
 
			this.preparePrintFormsMenuCollection(printFormsMenuCollection);
			printFormsMenuCollection.each(function(item) {
				item.set("Click", {bindTo: "generateSectionPrintForm"});
			}, this);
			var printMenuItems = this.preparePrintButtonCollection(this.moduleSectionPrintFormsCollectionName);
			printMenuItems.loadAll(printFormsMenuCollection);
			this.set(this.moduleSectionPrintFormsCollectionName, printMenuItems);
			this.getSectionPrintButtonVisible();
		}
 
		if (callback) {
			callback.call(scope || this);
		}
	}, this);
}

Добрый день! Заметил баг при работе данного кода: если я перехожу в карточку Заказа из раздела, то список пунктов меню отображается без сортировки. Стоит мне обновить страницу, находясь в карточке, сортировка срабатывает. Причем код выполняется в обоих случаях, однако результат разный. В чем может быть проблема?

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

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

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

Здравствуйте, почему вы говорите о том, как ведет себя сортировка в карточке, и после обновления карточки. Если пишите метод «initSectionPrintForms». Так еще и речь заходит за написание этого кода в схеме секции.
Дело в том что, я было подумал что вы столкнулись с разницей работы кода в комбинированном режиме (когда слева видна часть секции, либо она спрятана за стрелочкой), и чистом режиме карточки (в который как раз можно попасть по F5).
Но метод initCardPrintForms, (CardPrint!) написанный в схеме страницы, отрабатывает как в комбинированном режиме, так и в чистом режиме карточки.
Вот к примеру чуть подправив ваш метод сортировки, написал его в initCardPrintForms, и в обоих режимах карточки, обратная сортировка работает:
Изначальный код метода брать необходимо из "PrintReportUtilities" т.к. от версии к версии он может разнится.

define("OpportunityPageV2", ["OpportunityPageV2Resources", "GeneralDetails", "StorageUtilities"],
function(resources, GeneralDetails, StorageUtilities) {
	return {
		entitySchemaName: "Opportunity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {
			initCardPrintForms: function(callback, scope) {
				var reportsEsq = this.getModulePrintFormsESQ();
				var entitySchemaName = this.getEntitySchemaName();
				reportsEsq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
					"ShowInCard", true));
				StorageUtilities.GetESQResultByKey({
					esq: reportsEsq,
					key: "ShowInCard_PrintForm_" + entitySchemaName,
					callback: function(result) {
						if (this.destroyed) {
							return;
						}
						if (result.success && !result.collection.isEmpty()) {
							var printFormsMenuCollection = result.collection;
 
							printFormsMenuCollection.collection.items = printFormsMenuCollection.collection.items.sort(
								function(item1, item2) {
									if (item1.values.Caption > item2.values.Caption) {
										return -1;
									}
									if (item1.values.Caption < item2.values.Caption) {
										return 1;
									}
									return 0;
								}
							);
 
							this.preparePrintFormsMenuCollection(printFormsMenuCollection);
							printFormsMenuCollection.each(function(item) {
								item.set("Click", {bindTo: "generateCardPrintForm"});
							}, this);
							var printMenuItems = this.preparePrintButtonCollection(this.moduleCardPrintFormsCollectionName);
							printMenuItems.loadAll(printFormsMenuCollection);
							this.set(this.moduleCardPrintFormsCollectionName, printMenuItems);
							this.getCardPrintButtonVisible();
						}
						if (callback) {
							callback.call(scope || this);
						}
					},
					scope: this
				});
			}
		},
		rules: {},
		userCode: {}
	};
});

В крайнем случае всегда можно поставить точку останова в замещенных методах и посмотреть что пошло не так как задумывалось.

Максим, прошу прощения за двусмысленность. Я привел код initSectionPrintForms секции, но вел речь о методе initCardPrintForms.

Ваш код я попробовал, результат тот же. Может, причина в различиях версии продукта (у нас BMP'Online Sales 7.7.0.2293)?

Скажите, а где я могу посмотреть код PrintReportUtilities?

Как ни странно, но в схеме PrintReportUtilities. :smile:

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

Всем спасибо за помощь! Решил проблему добавлением логики сортировки нужной колонки при составлении запроса к базе, переопределив метод getModulePrintFormsESQ() в OrderPageV2:

/**
 * Возвращает клиентский запрос для получения печатных форм.
 */
getModulePrintFormsESQ: function() {
	var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchema: SysModuleReport,
		isDistinct: true,
		rowViewModelClassName: "Terrasoft.BasePrintFormViewModel"
	});
	esq.addColumn(SysModuleReport.primaryColumnName);
	var captionColumn = esq.addColumn("Caption", "NonLocalizedCaption");
 
	// Устанавливает порядок сортировки колонки
	captionColumn.orderPosition = 0;
	captionColumn.orderDirection = Terrasoft.OrderDirection.ASC;
	...
	return esq;
}

То же самое сделал в методе getModulePrintFormsESQ() в OrderSectionV2 для раздела.

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