Диалог с предолжением сохранить изменения при переходе между сущностями
Доброго дня!
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. Может есть какая-то документация?
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 пишет:
К сожалению нет возможности реализовать предложенный Вами функционал, так как даже то, что Вы реализовали является не стандартным функционалом. Ваше предложение будет рассмотрено нашими аналитиками и возможно будет реализовано в будущих версиях.
Данная идея будет зарегистрирована как пожелания и будет рассмотрена департаментом разработки для реализации подобного функционала в будущих версиях.
Спасибо!Заказчикам не очень нравится, что диалог появляется только после перехода на след сущность. Думаю, действительно, неплохо было бы реализовать такой функционал в будущих версиях. Тем более, это распространённая функциональность во многих продуктах.
Мне нужно создавать что-то в "Идеях", чтобы это было рассмотрено?
Спасибо!
Данная идея будет зарегистрирована как пожелания и будет рассмотрена департаментом разработки для реализации подобного функционала в будущих версиях.