Добрый день.

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

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

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

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

 

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

 

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

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

Нравится

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, по этому не мог строить дедуктивное предположение о том, что это, где-то там есть, фактически я не знал что искать :) потому и не искал.
Спасибо, за пример - пригодиться.

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

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

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" написал:ошибки в консоли отсутствуют.

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

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

Доброго времени суток!
Возникла потребность в зависимости от одного из полей на странице редактирования скрывать кнопку "Печать". подозреваю что стоит это делать на этапе инициализации, с помощью изменения свойства 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;
}

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

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

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

Нравится

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

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

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

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

Нравится

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

Добрый день!

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

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

Добрый день!

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

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

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

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

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

Версия 7.Х.

Нравится

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

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

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

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

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

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

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

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

Добрый день!

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

Спасибо!

Нравится

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

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

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

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

Коллеги, доброго дня!
Возможно, кто-то сталкивался с необходимостью скрывать/отображать кнопки в реестре по условию? Пример из документации 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*/
        };
    }
);

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

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

Добрый день.

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

Нравится

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);
				}
			}
		};
});

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

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

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