Microsoft добавила возможность открывать записи в модальных диалогах с помощью JavaScript как часть Dynamics 365 Release Wave 1 для 2020 года. Я создал сценарий, который вы можете применить к любой редактируемой подсетке (это должна быть редактируемая сетка), и он при нажатии открывает записи в модальном диалоге. Вы можете использовать аналогичный подход, чтобы открывать их и для полей поиска, но в этой статье я продемонстрирую подсетки.

Этапы реализации

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

  1. Зарегистрируйте скрипт (скопируйте его из следующего раздела) как JavaScript WebResource (Вам нужно сделать это только один раз для каждой среды)
  2. Добавьте в форму вложенную сетку (Предполагая, что вы не редактируете существующую).
  3. Отредактируйте свойства подсетки, перейдите на вкладку «Элементы управления» и добавьте элемент управления «Редактируемая сетка». Убедитесь, что вы выбрали использование для «Интернета». Появится вкладка «Событие».
  4. Перейдите на вкладку событий и добавьте созданный ранее веб-ресурс в библиотеки форм.
  5. В обработчиках событий перейдите к событию onRecordSelect, выберите веб-ресурс, который вы добавили в форму, а в разделе функций введите «Utility.Grid.onSelectOfRecord». Убедитесь, что вы отметили «Передать контекст выполнения в качестве первого параметра».
  6. Сохранить и опубликовать

Готово!

Сценарий

Скопируйте это в новый веб-ресурс JavaScript.

// Feel free to change the namespaces
var Utility;
(function (Utility) {
var Grid;
(function (Grid) {
// Register this event onRecordSelect of an Editable Grid.
function onSelectOfRecord(context) {
// When we select a line, lock its attributes to ensure no changes can be made.
lockGridColumns(context);
// Retrieve the record that was selected
var selectedRecord = context.getFormContext().data.entity;
// Open the selected record in a popup
openRecordInPopup(selectedRecord);
// We need to refresh the subgrid/parent grid to ensure we deselect the element to stop weird behaviours with the opening.
Xrm.Utility.refreshParentGrid(selectedRecord.getEntityReference());
}
Grid.onSelectOfRecord = onSelectOfRecord;
function openRecordInPopup(selectedRecord) {
var Id = selectedRecord.getId();
var pageInput = {
pageType: "entityrecord",
entityName: selectedRecord.getEntityName(),
entityId: Id
};
var navigationOptions = {
target: 2,
height: { value: 100, unit: "%" },
width: { value: 100, unit: "%" },
position: 1
};
Xrm.Navigation.navigateTo(pageInput, navigationOptions).then(function success() { }, function error() { });
}
function lockGridColumns(context) {
context.getFormContext().data.entity.attributes.forEach(function (attr) {
attr.controls.forEach(function (c) {
c.setDisabled(true);
});
});
}
})(Grid = Utility.Grid || (Utility.Grid = {}));
})(Utility|| (Utility = {}));

Гайки и болты

Пространство имен

Не стесняйтесь изменить пространство имен «Utility.Grid.onSelectOfRecord» на что-нибудь более подходящее.

перейдите к

В основе этого решения лежит функция navigateTo: https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/xrm-navigation/navigateto

В приведенном здесь примере форма в центре экрана откроется в виде диалога, но вы можете настроить другие параметры. Например: значение 1 для navigationOptions откроет экран в центре, а значение 2 откроет форму с правой стороны, как готовую форму быстрого создания! Это позволяет при желании создать форму «Быстрого редактирования».

Почему редактируемые сетки?

Редактируемые сетки содержат события JavaScript. Обычные старые подсетки, доступные только для чтения, их не имеют. Поскольку мы полагаемся на событие «onRecordSelect», требуется редактируемая сетка.

Делаем редактируемые строки доступными только для чтения

Этот сценарий блокирует редактируемые строки сетки для редактирования, чтобы предотвратить нежелательное взаимодействие с пользователем. Эта функция позаботится о том, чтобы:

function lockGridColumns(context) {
context.getFormContext().data.entity.attributes.forEach(function (attr) {
attr.controls.forEach(function (c) {
c.setDisabled(true);
});
});
}

Это обеспечивает немедленную блокировку строки, выбранной в сетке. Мы просто вызываем это как часть функции onSelectOfRecord в скрипте, которая является функцией, которую мы вызываем в Dynamics.

Обновление сетки

Другой ключевой элемент этого скрипта - гарантировать, что любая выбранная запись будет снята с выбора после того, как мы загрузим модальную всплывающую форму. Почему? Рассмотрим этот сценарий:

Пользователь выбирает строку в редактируемой сетке ›форма открывается для выбранной записи› пользователь обновляет данные в записи ›пользователь закрывает всплывающую форму.

Когда пользователь вернется в подсетку, выбранная им запись все равно будет выбрана. Если бы они затем захотели снова выбрать ту же самую запись, им пришлось бы сначала отменить выбор, чтобы вызвать событие «onRecordSelect».

Чтобы обойти это, мы используем следующую строку кода:

Xrm.Utility.refreshParentGrid(selectedRecord.getEntityReference());

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

Известные проблемы

К сожалению, есть несколько проблем, которые мы немного не контролируем, поскольку они связаны с тем, как событие onRecordSelect вызывается в редактируемой таблице.

  • Такой подход лишает редактируемую сетку возможности редактирования. Это компромисс, который вам нужно будет рассмотреть для вашего конкретного сценария.
  • Если вы установите флажок в левой части редактируемой сетки, форма откроется дважды (друг над другом).
  • Если пользователь выбирает все записи в редактируемой сетке, а затем снимает выделение со всех записей, кроме одной, он все равно откроет форму.

Резюме

Надеюсь, этот сценарий окажется для вас полезным. Не стесняйтесь использовать его, вносить изменения, играть и предлагать улучшения в комментариях!

Набирает сотрудников Capgemini Microsoft Apps and Cloud Engineering Team. Хотите работать с Dynamics 365 над новыми интересными проектами?

Ознакомьтесь с нашими открытыми ролями и подайте заявку сегодня.