Доброго дня!
BPM 7.5. Сценарий - кто то открыл одну из вакансий, заполнил пару полей, перешел на другую - изменения не сохранились без нажатия кнопки Save. Поступило требование реализовать функциональность, чтобы при переходе между сущностями появлялся диалог с просьбой сохранить изменения, если они конечно были. Есть стандартный способ это реализовать?
Спасибо
Нравится
Данную функциональность возможно реализовать переопределив метод onGridRowChanged базового модуля BasePageV2 в пользовательском пакете.
Добавив туда логику в начало метода:
1. на проверку изменений if this.isChanged()
2. задать вопрос с помощью showConfirmationDialog
3. если ответ положительный сохранить this.save();
Добавил код ниже в клиенсткий код страницы UsrVacanciesPage. Работает.
Но есть пару вопросов:
1. Я добавил это лишь в UsrVacanciesPage. Возможно, это нужно будет добавить в базовую страницу BasePageV2 , чтобы это было унифицированно для всех страниц. Я так понимаю, её нужно "заместить", "унаследоваться", и переопределить под себя. Однако я еще не пробовал делать этого. Вы не подскажите алгоритм и ньюансы?
2. Диалог появляется уже тогда, когда выбрана другая сущность в списке и отображаются её детали., дальше диалог блокирует ввод пользователя. Возможно ли сделать так, чтобы диалог появлялся ДО того, как происходит переход на другую сущность, чтобы пользователь видел текущую сущность и её детали, и лишь после нажатия кнопки на диалоге переходил на слудующую?
3. Как мне сделать, чтобы кнпока "Yes" называлась скажем "Save changes" и "No" - "Discard changes"?
4. Может есть какая-то документация?
[javascript]
onGridRowChanged: function()
{
if (this.isChanged())
{
var cfg = {
style: Terrasoft.MessageBoxStyles.BLUE
};
var changedEntityPrimaryColumnValue = this.get(this.primaryDisplayColumnName);
this.showConfirmationDialog(
"You have unsaved changes on the the '" + changedEntityPrimaryColumnValue + ' page. Do you want to save changes?",
function getSelectedButton(returnCode)
{
if (returnCode === Terrasoft.MessageBoxButtons.YES.returnCode)
{
this.save();
}
}, ['yes', 'no'], cfg
);
}
},
[/javascript]
По пунктам:
1. Вы правильно думаете, что необходимо расширить страницу BasePageV2, тогда все внесенные изменения распространяться на все страницы.
Расширение страницу BasePageV2 необходимо делать в пользовательском модуле, и таким образом все страницы унаследованные от BasePageV2 получат новую логику автоматически.
2. К сожалению нет возможности реализовать предложенный Вами функционал, так как даже то, что Вы реализовали является не стандартным функционалом. Ваше предложение будет рассмотрено нашими аналитиками и возможно будет реализовано в будущих версиях.
3. Это возможно сделать. Ниже приведен пример из модуля OrderPageV2:
[javascript]
this.Terrasoft.utils.showMessage({
caption: this.get("Resources.Strings.LinkProductCaption"),
buttons: [{
className: "Terrasoft.Button",
returnCode: "ButtonAll",
style: "blue",
caption: this.get("Resources.Strings.QuestionAllCaption"),
markerValue: this.get("Resources.Strings.QuestionAllCaption")
}, {
className: "Terrasoft.Button",
returnCode: "ButtonChoice",
style: this.Terrasoft.controls.ButtonEnums.style.GREY,
caption: this.get("Resources.Strings.QuestionChoiceCaption"),
markerValue: this.get("Resources.Strings.QuestionChoiceCaption")
}, "cancel"],
defaultButton: 0,
style: this.Terrasoft.MessageBoxStyles.BLUE,
handler: function(buttonCode) {
if (buttonCode === "ButtonAll") {
this.connectProducts(contractId);
}
if (buttonCode === "ButtonChoice") {
this.openProductLookupToLink(contractId);
}
if (buttonCode === "cancel") {
this.openContractPage(contractId);
}
},
scope: this
});
[/javascript]
4. К сожалению документации нет.
"Вильшанский Дмитрий" написал:1. Вы правильно думаете, что необходимо расширить страницу BasePageV2, тогда все внесенные изменения распространяться на все страницы.
Расширение страницу BasePageV2 необходимо делать в пользовательском модуле, и таким образом все страницы унаследованные от BasePageV2 получат новую логику автоматически.
Спасибо за ответ!
А вы не могли бы по шагам в обзорном виде расписать как правильно замещать страницы? Никогда этого не делал, боюсь что-то поломать. Нужно ли копировать полный код замещаемого модуля? Если не нужно, то какой минимальный скрипт дожен быть скопирован? Как правильно в этом скрипте заместить метод, может какой то особый синтаксис?
Код копировать не надо, нужно указать в качестве родителя BasePageV2, особого синтаксиса нет.
Минимальный код нового модуля:
[javascript]
define("BasePageV2", [],
function() {
return {
diff: []
};
});
[/javascript]
Замещение метода происходит путем вставки нужного кода в метод, который имеет такое же название как родитель.
Если необходимо добавить вызов код родительского метода это делается строкой:
this.callParent(arguments);
Пример двух методов из страницы ActivityPageV2
[javascript]
methods: {
/**
* Получает признак отображения меню добавления.
* @overridden
* @return {Boolean}
*/
getAddButtonMenuVisible: function() {
return true;
},
/**
* Инициализирует контекстную справку
* @overridden
*/
initContextHelp: function() {
this.set("ContextHelpId", 1010);
this.callParent(arguments);
},
[/javascript]
Здесь ссылка на видео, где это объясняется подробней
https://www.youtube.com/watch?v=T5uciYziKxY&feature=youtu.be&t=1h5m7s
Также прикрепляю файл "Требования к формату схемы, необходимые для корректной работы мастеров", в котором описано какие маркерные комментарии необходимы при создании страницы
trebovaniyakformatushemyneobhodimyedlyakorrektnoyrabotymasterov.doc
Спасибо, Дмитрий, всё получилось!
Также я нагуглил вот такое, может кому пригодится
http://www.community.terrasoft.ru/system/files/bocu/rasshirenie_i_zames…
Еще вопрос - а что такое "markerValue" ?
"trickbz" написал:К сожалению нет возможности реализовать предложенный Вами функционал, так как даже то, что Вы реализовали является не стандартным функционалом. Ваше предложение будет рассмотрено нашими аналитиками и возможно будет реализовано в будущих версиях.
Заказчикам не очень нравится, что диалог появляется только после перехода на след сущность. Думаю, действительно, неплохо было бы реализовать такой функционал в будущих версиях. Тем более, это распространённая функциональность во многих продуктах.
Мне нужно создавать что-то в "Идеях", чтобы это было рассмотрено?
Спасибо!
MarkerValue это способ находить элемент в DOM'e. Можно находить по ID, а можно находить по MarkerValue. Например если ID автогенерируемый, а Вам необходимо с данным контроллером проделать конкретные действия, то для этого можно использовать MarkerValue.
"trickbz" написал:
trickbz пишет:
К сожалению нет возможности реализовать предложенный Вами функционал, так как даже то, что Вы реализовали является не стандартным функционалом. Ваше предложение будет рассмотрено нашими аналитиками и возможно будет реализовано в будущих версиях.
Данная идея будет зарегистрирована как пожелания и будет рассмотрена департаментом разработки для реализации подобного функционала в будущих версиях.
Спасибо!Заказчикам не очень нравится, что диалог появляется только после перехода на след сущность. Думаю, действительно, неплохо было бы реализовать такой функционал в будущих версиях. Тем более, это распространённая функциональность во многих продуктах.
Мне нужно создавать что-то в "Идеях", чтобы это было рассмотрено?
Спасибо!
Данная идея будет зарегистрирована как пожелания и будет рассмотрена департаментом разработки для реализации подобного функционала в будущих версиях.