Добрый день.
Необходимо создать деталь для стандартного раздела. Но есть определенные требования к функционалу детали:
1. У детали нет страницы редактирования
2. Объект детали хранит следующие связи: Поле1 - связь с объектом стандартного раздела, Поле2 - связь с объектом из справочника "Продукты"
3. У объекта стандартного раздела есть ряд полей: Категория продукта, Тип продукта, Вид продукта.
4. При выборе действия "Добавить" у детали необходимо открыть страницу выбора продуктов, отфильтрованных в соответствии со значениями из п. 3 И после выбора некоего продукта добавить его в реестр детали.
Посдкажите, пожалуйста - в какую сторону смотреть.
Нравится
Первым приходит на ум такой алгоритм:
1. У детали таки есть страница редактирования, но она выполняет функцию "страницы выбора продуктов". С одним лукапом, и лейблом с подсказкой пользователю.
2. Необходимые для фильтрации данные из страницы, на деталь, для анализа и фильтрации лукапа, необходимо получать сообщениями(песочница, sandbox) при init детали, и записывать в невидимые поля детали, или атрибуты.
держите :wink:
[javascript]
define('AnPlaceInOpportunityDetail', ['terrasoft', 'AnPlaceInOpportunityDetailResources',"ConfigurationConstants", 'ConfigurationEnums', "RightUtilities"],
function(Terrasoft, Resources, ConfigurationConstants, enums, RightUtilities) {
return {
//entitySchemaName: 'AnPlaceInOpportunity',
mixins: {},
attributes: {},
diff: /**SCHEMA_DIFF*/[
{
//заменяем обработчик нажатия на +
"operation": "merge",
"name": "AddRecordButton",
"values": {
"click": {bindTo: "onAddRecordButtonClick"},
"menu": []
}
}
]/**SCHEMA_DIFF*/,
methods: {
onAddRecordButtonClick: function() {
//сначала сохраняем основную карточку, если это добавление/копирование
var cardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
var isNew = (cardState.state === enums.CardStateV2.ADD ||
cardState.state === enums.CardStateV2.COPY);
if (isNew) {
var args = {
isSilent: true,
messageTags: [this.sandbox.id]
};
this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
return;
}
this.prepareLookupConfig();
},
prepareLookupConfig: function() {
var filters = Ext.create("Terrasoft.FilterGroup");
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "AnPlace"
});
var IdsExists = [];
esq.addColumn("Id");
esq.addColumn("AnName");
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[AnPlaceInOpportunity:AnPlace:Id].AnOpportunity",this.get("MasterRecordId")));
esq.getEntityCollection(function(result) { //выбираем те записи, что уже были добавлены, что не показывать их в справочнике
if (result.success) {
var existFilter = Ext.create("Terrasoft.FilterGroup");
var notExistFilter = Ext.create("Terrasoft.FilterGroup");
if (result.collection.getItems().length > 0) {
// перебираем уже добавленные записи и добавляем их в фильтр
// на самом деле, вместо запроса и перебора надо просто придумать какой-то зубодробительный фильтр
var IdsExists = result.collection.getItems();
var placesId = [];
Terrasoft.each(IdsExists, function(item) {
if (item.get("Id")) {
placesId.push(item.get("Id"));
}
}, this);
existFilter.addItem(Terrasoft.createColumnInFilterWithParameters("Id", placesId));
notExistFilter = Terrasoft.createNotExistsFilter("Id", existFilter);
}
var config = { // конфиг для справочника
entitySchemaName: "AnPlace", // объект справочника
multiSelect: true, // множественный выбор в справочнике
columns: ["AnName"], // отображаемые колонки на странице справочника
hideActions: true // скрываем действия Добавить, изменить и т.д. в окне справочника
};
config.filters = notExistFilter;
this.openLookup(//открываем справочник
config,
this.addCallback, // функция-обработчик ответа от окна справочника
this // контекст для функции-обработчика
);
}
}, this);
},
addCallback: function(args){
this.showBodyMask();
var Ids = args.selectedRows.getKeys(); // получаем массив ИД выбранных записей
//var startDate = '';
//this.sandbox.subscribe("StartDate", function() {
//},this,null);
var bq = Ext.create("Terrasoft.BatchQuery"); // пакетный запрос
this.Terrasoft.each(Ids, function(item) { // перебираем выбранные записи - для каждой создает Insert и добавляем в BatchQuery
var insert = Ext.create("Terrasoft.InsertQuery", {
rootSchemaName: "AnPlaceInOpportunity"
});
var newGuid = Terrasoft.generateGUID();
var opportunity = this.get("MasterRecordId");
insert.setParameterValue("Id", newGuid , Terrasoft.DataValueType.GUID);
insert.setParameterValue("AnOpportunity", opportunity, Terrasoft.DataValueType.GUID);// значения по-умолчанию для добавляемых записей
insert.setParameterValue("AnPlace", item, Terrasoft.DataValueType.GUID);
bq.add(insert);
}, this);
// выполняем запрос
bq.execute(function(result) { // обработчик
if (result.success) {
this.hideBodyMask(); // скрыть иконку загрузки
this.reloadGridData(); // обнвоить деталь, чтобы добавленные записи отобразились
} else console.log("error");
}, this);
},
addRecordOperationsMenuItems: function(toolsButtonMenu) { // убираем действия Копировать и Изменить, оставляем Удалить
/*var copyRecordMenuItem = this.getCopyRecordMenuItem();
if (copyRecordMenuItem) {
toolsButtonMenu.addItem(copyRecordMenuItem);
}
var editRecordMenuItem = this.getEditRecordMenuItem();
if (editRecordMenuItem) {
toolsButtonMenu.addItem(editRecordMenuItem);
}*/
var deleteRecordMenuItem = this.getDeleteRecordMenuItem();
if (deleteRecordMenuItem) {
toolsButtonMenu.addItem(deleteRecordMenuItem);
}
}
},
messages: {}
};
});
[/javascript]
Прощу прощения, на радостях не обратил внимания, что приведенный код для версии 7.6
У нас версия 7.2 и данный код не работает. И вообще возникла проблема с элементарным обменом сообщениями между деталью и основной карточкой.
Простая задача: в зависимости от чекбокса на основной карточке разрешить или запретить добавление элементов в деталь.
1. В коде основной карточки:
добавим чекбокс на страницу
[javascript]
{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'IsProductChoose',
columnPath: 'IsProductChoose',
dataValueType: Terrasoft.DataValueType.BOOLEAN,
visible: true,
customConfig: {
click: {
bindTo: "IsProductChooseClicked"
}
}
}
[/javascript]
обработчик изменения чекбокса
[javascript]
this.methods.IsProductChooseClicked = function() {
var args = {
param: this.get("IsProductChoose")
};
sandbox.publish(
"IsProductChooseChanged",
args,
[sandbox.id]
);
};
[/javascript]
2. В коде детали:
изменим конфиг выпадающего меню
[javascript]
this.modifyUtilsButton = function(utilsButton) {
var utilsMenuItems = utilsButton.menu.items;
utilsMenuItems[1].caption = "Выбрать продукты";
utilsMenuItems[1].enabled = {bindTo: "isProductChooseForSelection"};
return utilsButton;
};
[/javascript]
обработчик "включить/выключить пункт меню"
[javascript]
this.methods.isProductChooseForSelection = function() {
this.sandbox.subscribe("IsProductChooseChanged", function(arg) {
console.log(arg);
}, this, [this.getSenderSandboxId()]);
};
this.methods.getSenderSandboxId = function() {
return this.sandbox.id.replace('_detail_SynchronizedProduct', '');
};
[/javascript]
Однако при открытии карточки получаю ошибку в консоли браузера:
Uncaught Terrasoft.UnsupportedTypeException: Message IsProductChooseChanged is not defined in undefined module
К сожалению в документации не описано как работать с событиями через sandbox.
Буду благодарен за консультацию.