кнопка
кнопка в карточке редактирования
новая кнопка
выпадающий список
service

Добрый день.

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

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

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

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

 

Пробовала делать следующим образом: в секции 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);

 

Показать все комментарии
Деталь
кнопка
Технические вопросы
7.x

Добрый день.
Подскажите как на кнопку детали свой метод сделать.
Смотрел деталь "график поставок" нашел как добавить свою кнопку...но как убрать стандартную?

Нравится

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

"Юсупов Марат" написал:Подскажите как на кнопку детали свой метод сделать.

переопределить метод addRecord
"Юсупов Марат" написал:но как убрать стандартную?

в диффе remove->addRecordButton

"Варфоломеев Данила" написал:Юсупов Марат пишет:

но как убрать стандартную?

в диффе remove->addRecordButton

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

"Назыров Михаил" написал:Хотелось бы добавить, что если по нажатию на плюс появляется несколько вариантов добавления записи

Юзкейз интересный, если найдете решение в каком либо виде - обязательно отпишитесь для страждующих.
От себя могу предложить "костыль" в виде:
замещаем стандартный AddRecord метод, в котором перед родительской логикой (callParent)
делаем openLookup (открываем окно выбора) наполняя его само собой своей коллекцией вариантов,
ну а далее в коллбеке реагируем, в каких-то случаях идем по callParent варианту, в каих-то по своему кастомному. Вот...

"Назыров Михаил" написал:Хотелось бы добавить, что если по нажатию на плюс появляется несколько вариантов добавления записи

Юзкейз интересный, если найдете решение в каком либо виде - обязательно отпишитесь для страждующих.
От себя могу предложить "костыль" в виде:
замещаем стандартный AddRecord метод, в котором перед родительской логикой (callParent)
делаем openLookup (открываем окно выбора) наполняя его само собой своей коллекцией вариантов,
ну а далее в коллбеке реагируем, в каких-то случаях идем по callParent варианту, в каих-то по своему кастомному. Вот...

"Назыров Михаил" написал:Хотелось бы добавить, что если по нажатию на плюс появляется несколько вариантов добавления

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

А в чём сложность-то? По кофигурации полно примеров.

{
	"operation": "merge",
	"name": "AddRecordButton",
	"values": {
		"click": Terrasoft.emptyFn, //перетираем стандартный обработчик клика
		"menu": {
			"items": [
				{
					"caption": "Нафига",
					"tag": "why",
					"click": {"bindTo": "onMyFuncClick"}
				},
				{
					"caption": "козе",
					"tag": "goat",
					"click": {"bindTo": "onMyFuncClick"}
				},
				{
					"caption": "баян?",
					"tag": "needs accordion",
					"click": {"bindTo": "onMyFuncClick"}
				}
			]
		}
	}
}

ну и дальше как угодно:
или биндим на каждый пункт свою функцию,
или делаем одну, отлавливаем tag через arguments,
или вообще items биндим на коллекцию и генерим её как делает террасофт с toolsMenu (+можно ещё присобачить bindConfig).
pic

"Варфоломеев Данила" написал:А в чём сложность-то? По конфигурации полно примеров.

Ну я просто не сталкивался с реализацией в UI, по этому не мог строить дедуктивное предположение о том, что это, где-то там есть, фактически я не знал что искать :) потому и не искал.
Спасибо, за пример - пригодиться.

Показать все комментарии
кнопка
совмещенный режим
Технические вопросы
7.x

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

var recId = this.get("Id");
var requestUrl = " CardModuleV2/LeadPageV2/edit/" + recId;
this.sandbox.publish("PushHistoryState", {
    hash: requestUrl
});

Нравится

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

Могу предположить что нужно посмотреть в исходных кодах базовой карточки или раздела, и искать в направлении historyStateInfo.workAreaMode === 2 (так выполняется проверка на совмещенный режим).

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

Не совсем понятно, что нужно конкретно.
Вы можете объявить в diff раздела и карточке, а сами функции, например, прописать в миксине, который подключите к разделу и карточке.
В этом миксине можете так же написать функцию, на проверку того в каком режиме открыта карточка, а в самой карточке вызывать эти функции.

Спасибо за помощь :smile:
Суть в том, что есть кнопка удаления в разделе карточки, которая прописана в LeadSectionV2, использующая стандартную функцию deleteRecords из GridUtilitiesV2 и работает в совмещенном режим, но если перейти из контакта в лид или просто перезагрузить страницу, то карточка открывается в раздельном режиме и уже кнопка берется из LeadPageV2, и deleteRecords не срабатывает корректно. В соседней теме советовали использовать deleteQuery, но она не отображает связанные записи и не выполняет каскадное удаление. Поэтому хотели попробовать сделать, чтобы по нажатию кнопки из раздельного режима выполнялся переход в совмещенный и сразу запускалась необходимая функция из LeadSectionV2.

Сам лично не сталкивался с подобным кейсом.
Значит всё же вам по исходным кода javascript надо искать логику открытия страницы в совмещенном режиме и копировать её в LeadPageV2.
Моё мнение.
Либо нужно сделать миксин и логику кнопки из LeadSection копировать в миксин, заранее немного пересмотрев логику удаления связей.

Так же, можете переходить в секцию публикуя сообщение PushHistoryState передавая в него Id текущей записи. В секции проверять наличие атрибута с Id записи (в onEntityInialized). Если атрибут есть - выполнять удаление.

Спасибо, попробовали с помощью PushHistoryState передавать Id.
В LeadPageV2 прописали :

		methods: {
		        delete: function() {
		            var recId = this.get("Id");
 
		            this.sandbox.publish("GetRecordId", this.get("Id"), [this.sandbox.id]);
		            console.log(this.sandbox.id);
 
		            var requestUrl = "SectionModuleV2/LeadSectionV2/";
		            this.sandbox.publish("PushHistoryState", {
		                hash: requestUrl
		            });
 
		        }
 
		    },
		    messages: {
		        "GetRecordId": {
		            mode: Terrasoft.MessageMode.PTP,
		            direction: Terrasoft.MessageDirectionType.PUBLISH
		        }
 
		    }

,а в LeadSectionV2 :

            onEntityInialized: function() {
                this.callParent(arguments);
 
                var recId2 = this.sandbox.id;
                this.sandbox.subscribe("GetRecordId", function() {
                    alert("check")
                }, [this.sandbox.id]);
 
                if (recId2) {
 
                    var activeRow = this.getActiveRow();
                    if (activeRow && activeRow.isNew) {
                        this.removeGridRecords([activeRow.recId2]);
                    } else {
                        var items = this.getSelectedItems();
                        if (!items || !items.length) {
                            return;
                        }
                        this.checkCanDelete(items, this.checkCanDeleteCallback, this);
                    }
                }
            }
 
 
            },
 
            messages: {
                "GetRecordId": {
                    mode: Terrasoft.MessageMode.PTP,
                    direction: Terrasoft.MessageDirectionType.SUBSCRIBE
                }
            }

Но в консоли пишет ошибку:  message direction set as publish
И не передается Id, подскажите, пожалуйста в чем может быть ошибка?

Хм, а вы точно уверены что в месте подписки [this.sanbox.id] идентичный с [this.sanbox.id] в месте отправки?
Добавлю работающий пример передачи значений c детали в карточку через песочницу.
Так же могу предположить, что массив messages нужно было объявить до methods, но скорее всего это не имеет значения.

За это отвечает свойство конфигурационного объекта workAreaMode и соответствующее значение ConfigurationEnums.WorkAreaMode.COMBINED
пример для PushHistoryState

this.sandbox.publish("PushHistoryState", {
	hash: this.Terrasoft.combinePath("SectionModuleV2", "SysAdminUnitSectionV2",
		pageName, "edit", primaryColumnValue),
	stateObj: {
		module: "SectionModuleV2",
		operation: "edit",
		primaryColumnValue: primaryColumnValue,
		schemas: [
			"SysAdminUnitSectionV2",
			pageName
		],
		workAreaMode: ConfigurationEnums.WorkAreaMode.COMBINED,
		moduleId: this.sandbox.id,
		UsersActiveRow: this.get("ActiveRow"),
		FuncRolesActiveRow: this.get("FuncRolesActiveRow"),
		OrgRolesActiveRow: this.get("OrganizationalRolesActiveRow")
	}
});

пример для OpenCardInChain (В сути оберткой над PushHistoryState)

this.openCardInChain({
	"schemaName": "ServiceModelPage",
	"moduleId": this.sandbox.id + "_ServiceModelPage",
	"isSeparateMode": false,
	"defaultValues": defaultValues,
	"workAreaMode": ConfigurationEnums.WorkAreaMode.COMBINED
});

Огромное спасибо, получилось переключать режим по нажатию кнопки. :smile:
Не подскажите, пожалуйста, в чем может быть причина, что при переходе напрямую из раздела в карточку кастомная кнопка работает, а если перейти в совмещенный режим используя код выше, то кнопка не откликается на нажатие, и ошибки в консоли отсутствуют.

"Maria H" написал:ошибки в консоли отсутствуют.

А что за кнопка? Вероятно кнопка ищет реализацию метода в карточке секции, т.к. совмещенный режим обрабатывается секцией.

Показать все комментарии
инициализация
кнопка
печать
Технические вопросы
7.x

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

Нравится

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

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

Видимость кнопки печать определяется значением параметра IsCardPrintButtonVisible. Этот параметр задается в методе getCardPrintButtonVisible().

Вам необходимо переопределить указанный метод.

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

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

Видимость кнопки печать определяется значением параметра IsCardPrintButtonVisible. Этот параметр задается в методе getCardPrintButtonVisible().

Вам необходимо переопределить указанный метод.


А можно пример пожалуйста? Кусок кода если Вас не затруднит.

Добрый день, Максим!
Код данного метода приведен ниже. Свою логику можете указать любую, вплоть до return true;

getCardPrintButtonVisible: function() {
  var cardPrintFormsCollection = this.get(this.moduleCardPrintFormsCollectionName);
  var result = MenuUtilities.getMenuVisible(cardPrintFormsCollection, this);
  this.set("IsCardPrintButtonVisible", result);
  return result;
}

"Мотков Илья" написал:getCardPrintButtonVisible: function() {
  var cardPrintFormsCollection = this.get(this.moduleCardPrintFormsCollectionName);
  var result = MenuUtilities.getMenuVisible(cardPrintFormsCollection, this);
  this.set("IsCardPrintButtonVisible", result);
  return result;
}

Большое Вам спасибо. :-)

Показать все комментарии
бизнес-процесс
квалифицировать
кнопка
Технические вопросы
7.x

Добрый день!
Подскажите, пожалуйста, как назначить на кнопку "Квалифицировать" в разделе Лиды собственный бизнес-процесс?

Нравится

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

Кирилл,
Кнопка "Квалифицировать" запускает процесс, который указан в системной настройке "Процесс управления лидом". Можете заменить значение настройки на пользовательский процесс.
Елси потребуется запускать БП из клиентского модуля - примеры можно найти на академии или community:
https://academy.terrasoft.ua/documents/technic-sdk/7-8/zapusk-processa-…

Показать все комментарии
кнопка
Планирования Визитов
продажи
раздел
раздел Продажи
Технические вопросы
7.x

Подскажите, пожалуйста, как можно реализовать кнопку и вкладку в разделе Контакты, аналогичные вкладке "Планирование визитов" в разделе Активности

Нравится

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

Добрый день!

Вам нужно сделать новое представление для раздела "Контакты". Пример реализации нового представления смотрите в схеме ActivitySectionV2 пакета FieldForce.

"Мария Ватулина" написал:

Добрый день!

Вам нужно сделать новое представление для раздела "Контакты". Пример реализации нового представления смотрите в схеме ActivitySectionV2 пакета FieldForce.

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

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

Доброго времени суток!

Имеется деталь-реестр, реестр состоит из 2 справочников (значение 1 из них заблокировано).
А так же имеется кнопка, при нажатии на которую необходимо добавить в реестр все значения, доступные в справочнике (2-е поле реестра). Работа с кнопкой мне понятна, она у меня создана, работает.
Искал подобные статьи в академии, на форуме, не нашел.
Подскажите пожалуйста (или поделитесь ссылкой на материал), как наполнить реестр данными по нажатии на кнопку.

Версия 7.Х.

Нравится

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

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

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

Заполнить лукапное поле можно следующим кодом:

this.set("Имя лукапного поля", { value: "Id записи", displayValue: "значение для отображения"});

Так же, вы можете при нажатии на кнопку записать значения напрямую в базу данных используя класс Terrasoft.InsertQuery, а затем вызвать в схеме карточки метод this.updateDetails() для обновления всех деталей.

Для общения схемы детали (если кнопка добавлена в схеме детали) и карточки раздела (для обновления деталей) - Вам необходимо воспользоваться sandbox. Подробное описания использования sandbox, Вы найдете тут.

Показать все комментарии
GUI
кнопка
контролы
обработчик
переопределить
событие
форма
Технические вопросы
7.x

Добрый день!

Подскажите, каким образом можно найти и переопределить обработчики событий стандартных контролов(например, кнопки Сохранить)?
Возможно ли изменить их стиль?

Спасибо!

Нравится

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

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

По сути это две задачи:
1) Изменить стиль (BasePageV2CSS)
2) Изменить обработчики (метод onCardAction, который вызывается при нажатии на кнопку "Сохранить")

Показать все комментарии
видимость
грид
кнопка
реестр
Технические вопросы
7.x

Коллеги, доброго дня!
Возможно, кто-то сталкивался с необходимостью скрывать/отображать кнопки в реестре по условию? Пример из документации SDK не получилось адаптировать:

isCategory: function() {
        var activeRow = this.get("ActiveRow");
        if (activeRow)
                    {
                        var cat = this.get("GridData").get(activeRow).get("Category");
                        return (cat == "ID_нужной_категории") ? true : false;
                    }
       return false;
}

Необходимо в зависимости от категории и состояния Активности скрывать и отображать различные кнопки

Нравится

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

Антон, у Вас в в переменной cat хранится объект с value и displayValue.
Для сравнения с "ID_нужной_категории" нужно брать cat.value.
Также важно, что если у вас не будет выведена колонка в реестр, то вы не сможете получить ее значение.
Для того, чтобы необходимая колонка всегда тянулась в ActiveRow можете переопределить следующий метод:

getGridDataColumns: function(){
                var gridDataColumns = this.callParent(arguments);
                gridDataColumns.Category= gridDataColumns.Category|| {path: "Category"};
                return gridDataColumns;
            }

Александр, спасибо, однако это не помогло, к сожалению. Как только делаю привязку свойства visible к функции isComplectationCategory, так сразу кнопка пропадает независимо от категории выбранной активности. Изменение условия проверки (с "==" на "!=") не помогает, кнопка в любом случае скрыта.

Вот полный код ActivitySectionV2:

define("ActivitySectionV2", ['ConfigurationConstants', 'ProcessModuleUtilities'],
	function(ConfigurationConstants, ProcessModuleUtilities) {
		return {
			entitySchemaName: "Activity",
			methods: {
						// добавляем новые пункты в меню "Действия"
				getSectionActions: function() {
					var actionMenuItems = this.callParent(arguments);
					actionMenuItems.addItem(this.getButtonMenuItem({
						Type: "Terrasoft.MenuSeparator",
						Caption: "Задачи на комплектацию"
					}));
					actionMenuItems.addItem(this.getActionsMenuItem({
						Caption: "Взять в работу",
						Click: {bindTo: "Get2Work"}
				}));
					return actionMenuItems;
				},
						// отработка нажатия пункта "Взять в работу" в "Действиях"
				Get2Work: function() {
					debugger;
					var processArgs = {
						sysProcessName: "UsrProcessGet2Work",
							parameters: {
							IncomingActivitiesList: this.getSelectedItems()
								}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// выбор функций для отработки нажатий кнопок в реестре
				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "ComplectationFinished":
							this.ComplectationFinishedProcess(primaryColumnValue);
							break;
						case "Sended":
							this.SendedProcess(primaryColumnValue);
							break;
						case "SamplesReceived":
							this.SamplesReceivedProcess(primaryColumnValue);
							break;
						default:
							this.callParent(arguments);
							break;
					}
				},
						// отработка кнопки "Скомплектовано"
				ComplectationFinishedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrComplectationFinishedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// отработка кнопки "Отправлено"
				SendedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrSendedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// отработка кнопки "Образцы получены"
				SamplesReceivedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrSamplesReceivedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// установка видимости кнопки "Скомплектовано", если категория активности == "Комплектация"
				isComplectationCategory: function() {
					var activeRow = this.get("ActiveRow");
					if (activeRow) {
						var cat = this.get("GridData").get(activeRow).get("ActivityCategory");
						return (cat.value != "4b9497c0-e794-40bc-81e0-5f46c9bde343") ? true : false;	// 4b9497c0-e794-40bc-81e0-5f46c9bde343 категория "Комплектация"
					}
					return false;
				},
				getGridDataColumns: function() {
					var gridDataColumns = this.callParent(arguments);
					gridDataColumns.ActivityCategory= gridDataColumns.ActivityCategory|| { path: "ActivityCategory" };
					return gridDataColumns;
				}
			},
			diff: /**SCHEMA_DIFF*/[
						// вставка кнопки "Скомплектовано"
				{ 
					"operation": "insert",
					"name": "ComplectationFinishedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Скомплектовано",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "ComplectationFinished",
						"visible": {"bindTo": "isComplectationCategory"}
					}
				},
						// ставка кнпоки "Отправлено"
				{ 
					"operation": "insert",
					"name": "SendedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Отправлено",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "Sended"
					}
				},
						// вставка кнопки "Образцы отправлены"
				{ 
					"operation": "insert",
					"name": "SamplesReceivedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Образцы получены",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "SamplesReceived"
					}
				}
			]/**SCHEMA_DIFF*/
		};
	}
);

При установке внутрь функции isComplectationCategory точек остановки или уведомлений ничего не происходит - ощущение, что при выборе текущей строки реестра эта функция не срабатывает. Может, что-то ещё упустил в коде?

И ещё бы весьма признателен за подсказку, как скрыть стандартные кнопки в реестре

Попробуйте создать атрибут и забиндить видимость на него. Изменять состояние атрибута можно при изменении активного столбца, например.
А какие именно стандартные кнопки нужно скрыть? Они либо в diff по названию удаляются,либо методы, которые их формируют нужно сделать пустыми.
В этой теме есть пример:
http://www.community.terrasoft.ru/forum/topic/15106

Снова не помогло:

define("ActivitySectionV2", ['ConfigurationConstants', 'ProcessModuleUtilities'],
	function(ConfigurationConstants, ProcessModuleUtilities) {
		return {
			entitySchemaName: "Activity",
			attributes: {
				'isComplectationCategoryAttribut': {
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					dependencies: [{
						columns: ["ActivityCategory"],
						methodName: "isComplectationCategoryAttributSet"
					}]
				}
			},
			methods: {
						// добавляем новые пункты в меню "Действия"
				getSectionActions: function() {
					var actionMenuItems = this.callParent(arguments);
					actionMenuItems.addItem(this.getButtonMenuItem({
						Type: "Terrasoft.MenuSeparator",
						Caption: "Задачи на комплектацию"
					}));
					actionMenuItems.addItem(this.getActionsMenuItem({
						Caption: "Взять в работу",
						Click: {bindTo: "Get2Work"}
				}));
					return actionMenuItems;
				},
				isComplectationCategoryAttributSet: function() {
					var activeRow = this.get("ActiveRow");
					var cat = this.get("GridData").get(activeRow).get("ActivityCategory");
					this.set('isComplectationCategoryAttribut', cat.value === "4b9497c0-e794-40bc-81e0-5f46c9bde343")
					return true;	// 4b9497c0-e794-40bc-81e0-5f46c9bde343 категория "Комплектация"
				},
						// отработка нажатия пункта "Взять в работу" в "Действиях"
				Get2Work: function() {
					debugger;
					var processArgs = {
						sysProcessName: "UsrProcessGet2Work",
							parameters: {
							IncomingActivitiesList: this.getSelectedItems()
								}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// выбор функций для отработки нажатий кнопок в реестре
				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "ComplectationFinished":
							this.ComplectationFinishedProcess(primaryColumnValue);
							break;
						case "Sended":
							this.SendedProcess(primaryColumnValue);
							break;
						case "SamplesReceived":
							this.SamplesReceivedProcess(primaryColumnValue);
							break;
						default:
							this.callParent(arguments);
							break;
					}
				},
						// отработка кнопки "Скомплектовано"
				ComplectationFinishedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrComplectationFinishedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// отработка кнопки "Отправлено"
				SendedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrSendedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// отработка кнопки "Образцы получены"
				SamplesReceivedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrSamplesReceivedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// установка видимости кнопки "Скомплектовано", если категория активности == "Комплектация"
				/*isComplectationCategory: function() {
					debugger;
					var activeRow = this.get("ActiveRow");
					debugger;
					if (activeRow) {
						var cat = this.get("GridData").get(activeRow).get("ActivityCategory");
						debugger;
						return (cat.value === "4b9497c0-e794-40bc-81e0-5f46c9bde343") ? true : false;	// 4b9497c0-e794-40bc-81e0-5f46c9bde343 категория "Комплектация"
					}
					return false;
				},*/
				getGridDataColumns: function() {
					var gridDataColumns = this.callParent(arguments);
					gridDataColumns.ActivityCategory= gridDataColumns.ActivityCategory|| { path: "ActivityCategory" };
					return gridDataColumns;
				}
			},
			diff: /**SCHEMA_DIFF*/[
						// вставка кнопки "Скомплектовано"
				{ 
					"operation": "insert",
					"name": "ComplectationFinishedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Скомплектовано",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "ComplectationFinished",
						"visible": {"bindTo": "isComplectationCategoryAttribut"}
					}
				},
						// ставка кнпоки "Отправлено"
				{ 
					"operation": "insert",
					"name": "SendedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Отправлено",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "Sended"
					}
				},
						// вставка кнопки "Образцы отправлены"
				{ 
					"operation": "insert",
					"name": "SamplesReceivedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Образцы получены",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "SamplesReceived"
					}
				}
			]/**SCHEMA_DIFF*/
		};
	}
);

Кнопка теперь всегда скрыта. Подозреваю, что для Section некорректно писать type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, или вообще где-то глобально ошибаюсь?

с удалением стандартных кнопок разобрался, достаточно в diff добавить код:

{
				"operation": "remove",
				"name": "DataGridActiveRowDeleteAction"
}

где "DataGridActiveRowDeleteAction" это название кнопки, взятое из BaseSectionV2

Антон, для наглядности оставил только 1 кнопку и соответствующие методы.
Обратите внимание на метод addColumnLink. Без него зависимость видимости не срабатывает.
Пример найден в LeadSectionV2.

define("ActivitySectionV2", ["terrasoft",'ConfigurationConstants', 'ProcessModuleUtilities'],
    function(Terrasoft,ConfigurationConstants, ProcessModuleUtilities) {
        return {
            entitySchemaName: "Activity",
            attributes: {},
            methods: {
 
                addColumnLink: function(item) {
                    var self = this;
                    item.isComplectationCategoryAttributSet= function() {
                        return self.isComplectationCategoryAttributSet.call(self, this.get(this.primaryColumnName));
                    };
                    return this.callParent(arguments);
                },
 
                isComplectationCategoryAttributSet: function(activeRow) {
                    if (!activeRow) return true;
                    var cat = this.get("GridData").get(activeRow).get("ActivityCategory");
                    return cat&&cat.value === "f51c4643-58e6-df11-971b-001d60e938c6"; //категория = выполнить. Для теста
                    //return cat&&cat.value === "4b9497c0-e794-40bc-81e0-5f46c9bde343"; //категория "Комплектация"
 
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "name": "ComplectationFinishedAction",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "caption": "Скомплектовано",
                        "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                        "tag": "ComplectationFinished",
                        "visible": {"bindTo": "isComplectationCategoryAttributSet"}
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

Александр, прекрасно! Ваше решение работает, большое спасибо

Показать все комментарии
кнопка
реестр
Технические вопросы
7.x

Добрый день.

У меня есть раздел "Материалов" в котором есть числовое поле "Количество пустых", его заполнение происходит через БП.
Иногда требуется обнуление поля "Количество пустых" для всех записей.
Я хочу добавить кнопку которая будет выполнять очистку данных, с подтверждением своего намерения очистить, дабы избежать случайного нажатия.
Подскажите, пожалуйста, как лучше реализовать эту задачу.

Нравится

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

Попыталась создать кнопку по статье http://www.community.terrasoft.ru/forum/topic/13848 , но у меня не получилось.
Делаю первый раз и потому не знаю как решить это, буду рада если подскажите как исправить и где можно еще почитать информацию.

define("UsrConsumablesSection1", ["GridUtilitiesV2"],
function() {
	return {
		entitySchemaName: "UsrConsumables",
		contextHelpId: "1001",
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "UsrConsumable",
				"propertyName": "items",
				"name": "ResetSectionButton",
				"values": {
						itemType: Terrasoft.ViewItemType.BUTTON,
						caption: {bindTo: "Resources.Strings.ClearQuantityEmptyButtonCaption"},
						click: {bindTo: "onClearQuantityEmptyClick"},
						enabled: {bindTo: "isUsrConsumablesUsrQuantityEmpty"},
						"layout": {
							"column": 1,
							"row": 6,
							"colSpan": 1
						}
					}
				}
			]/**SCHEMA_DIFF*/,
			messages: {},
			methods: {
				onClearQuantityEmptyClick: function() {
					var activeRow = this.get("ActiveRow");
					if (activeRow) {
						var primaryID = this.get("GridData").get(activeRow).get("UsrConsumables").value;
					}
				},
				isUsrConsumablesUsrQuantityEmpty: function() {
					var activeRow = this.get("ActiveRow");
					if (activeRow) {
						var pc = this.get("GridDate").get(activeRow).get("UsrQuantityEmpty");
						return (pc || pc !== "") ? true : false;
					}
					return false,
					Page.UsrQuantityEmpty.Clear();
				}
			}
		};
});

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

Самый простой способ - через БП.
Реализация:
1) Начальный элемент - простой
2) Вопрос пользователю:
"Вы уверены, что хотите очистить значение поля для всех записей"
Ответ:
- Не очень. Отменить.
- Just do it!

Если выбран ответ "Не очень...", то идем на конец процесса.
Иначе:

3) Изменить данные в объекте UsrConsumable (указать надо его название) с фильтром Id заполнено (то есть всем записям).
Необходимо задать полю UsrQuantityEmpty значение default(int)

4) Конец процесса.

В свойствах процесса в блоке "Доступен в разделах" выберите нужный раздел.

ЗЫ. Page.UsrQuantityEmpty.Clear() не обращается к БД, поэтому очистка не происходит.

Добрый день.
Создала БП, в странице схемы прописала код, но возникла такая проблема, если я делаю замещающую сраницу с этим кодом (код ниже), страница раздела у меня не прорисовывается. Что мне нужно сделать, что бы исправить это?
Пример запуска БП брала из http://www.community.terrasoft.ru/forum/topic/10554#comment-47944 .

define("UsrConsumablesSection1", ["GridUtilitiesV2"],
function() {
	return {
		entitySchemaName: "UsrConsumables",
		contextHelpId: "1001",
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "UsrConsumable",
				"propertyName": "items",
				"name": "ResetSectionButton",
				"values": {
						itemType: Terrasoft.ViewItemType.BUTTON,
						caption: {bindTo: "Resources.Strings.ClearQuantityEmptyButtonCaption"},
						click: {bindTo: "onClearQuantityEmptyClick"},
						enabled: {bindTo: "isUsrConsumablesUsrQuantityEmpty"},
						"layout": {
							"column": 1,
							"row": 6,
							"colSpan": 1
						}
					}
				}
			]/**SCHEMA_DIFF*/,
			messages: {},
			methods: {
				onClearQuantityEmptyClick: function() {
					var url = "https://" + document.domain + "/0/ServiceModel/ProcessEngineService.svc/UsrProcessEmpty";
					var request = null;
					request = new XMLHttpRequest();
					request.open("GET", url, true);
					request.send(null);
				}
			}
		};
});

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

Обратитесь к службе поддержки. Листинг кода корректный.

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