Диалог с предолжением сохранить изменения при переходе между сущностями

Доброго дня!

BPM 7.5. Сценарий - кто то открыл одну из вакансий, заполнил пару полей, перешел на другую - изменения не сохранились без нажатия кнопки Save. Поступило требование реализовать функциональность, чтобы при переходе между сущностями появлялся диалог с просьбой сохранить изменения, если они конечно были. Есть стандартный способ это реализовать?

Спасибо

Нравится

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

Данную функциональность возможно реализовать переопределив метод onGridRowChanged базового модуля BasePageV2 в пользовательском пакете.
Добавив туда логику в начало метода:
1. на проверку изменений if this.isChanged()
2. задать вопрос с помощью showConfirmationDialog
3. если ответ положительный сохранить this.save();

Спасибо, Валерий, попробую, обязательно отпишусь!

Добавил код ниже в клиенсткий код страницы UsrVacanciesPage. Работает.
Но есть пару вопросов:
1. Я добавил это лишь в UsrVacanciesPage. Возможно, это нужно будет добавить в базовую страницу BasePageV2 , чтобы это было унифицированно для всех страниц. Я так понимаю, её нужно "заместить", "унаследоваться", и переопределить под себя. Однако я еще не пробовал делать этого. Вы не подскажите алгоритм и ньюансы?
2. Диалог появляется уже тогда, когда выбрана другая сущность в списке и отображаются её детали., дальше диалог блокирует ввод пользователя. Возможно ли сделать так, чтобы диалог появлялся ДО того, как происходит переход на другую сущность, чтобы пользователь видел текущую сущность и её детали, и лишь после нажатия кнопки на диалоге переходил на слудующую?
3. Как мне сделать, чтобы кнпока "Yes" называлась скажем "Save changes" и "No" - "Discard changes"?
4. Может есть какая-то документация?

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

По пунктам:
1. Вы правильно думаете, что необходимо расширить страницу BasePageV2, тогда все внесенные изменения распространяться на все страницы.
Расширение страницу BasePageV2 необходимо делать в пользовательском модуле, и таким образом все страницы унаследованные от BasePageV2 получат новую логику автоматически.

2. К сожалению нет возможности реализовать предложенный Вами функционал, так как даже то, что Вы реализовали является не стандартным функционалом. Ваше предложение будет рассмотрено нашими аналитиками и возможно будет реализовано в будущих версиях.

3. Это возможно сделать. Ниже приведен пример из модуля OrderPageV2:

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

4. К сожалению документации нет.

"Вильшанский Дмитрий" написал:1. Вы правильно думаете, что необходимо расширить страницу BasePageV2, тогда все внесенные изменения распространяться на все страницы.
Расширение страницу BasePageV2 необходимо делать в пользовательском модуле, и таким образом все страницы унаследованные от BasePageV2 получат новую логику автоматически.

Спасибо за ответ!
А вы не могли бы по шагам в обзорном виде расписать как правильно замещать страницы? Никогда этого не делал, боюсь что-то поломать. Нужно ли копировать полный код замещаемого модуля? Если не нужно, то какой минимальный скрипт дожен быть скопирован? Как правильно в этом скрипте заместить метод, может какой то особый синтаксис?

Код копировать не надо, нужно указать в качестве родителя BasePageV2, особого синтаксиса нет.
Минимальный код нового модуля:

define("BasePageV2", [],
                function() {
                               return {
                                               diff:  []
                               };
                });

Замещение метода происходит путем вставки нужного кода в метод, который имеет такое же название как родитель.
Если необходимо добавить вызов код родительского метода это делается строкой:
this.callParent(arguments);

Пример двух методов из страницы ActivityPageV2

                methods: {
                /**
                * Получает признак отображения меню добавления.
                * @overridden
                * @return {Boolean}
*/
                getAddButtonMenuVisible: function() {
                                return true;
                },
 
                /**
                * Инициализирует контекстную справку
                * @overridden
                */
                                initContextHelp: function() {
                                this.set("ContextHelpId", 1010);
                                this.callParent(arguments);
                },

Здесь ссылка на видео, где это объясняется подробней

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 пишет:

К сожалению нет возможности реализовать предложенный Вами функционал, так как даже то, что Вы реализовали является не стандартным функционалом. Ваше предложение будет рассмотрено нашими аналитиками и возможно будет реализовано в будущих версиях.

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

Заказчикам не очень нравится, что диалог появляется только после перехода на след сущность. Думаю, действительно, неплохо было бы реализовать такой функционал в будущих версиях. Тем более, это распространённая функциональность во многих продуктах.

Мне нужно создавать что-то в "Идеях", чтобы это было рассмотрено?

Спасибо!

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

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