0

У меня проблема с элементом управления SharePoint PeoplePicker. Когда диалог Modal открыт и в режиме редактирования, можно использовать встроенную функцию SP.UI.ModalDialog.RefreshPage (SP.UI.DialogResult.OK), чтобы обновить страницу без потери изменений в данных. Такие поля, как текст, заметка, выбор, дата и т. Д., Отлично работают, и их изменения не теряются при установке SP.UI.ModalDialog.RefreshPage (SP.UI.DialogResult.OK). Но PeoplePicker поля к сожалению теряют свои данные!Поля PeoplePicker в диалоговом окне SharePoint Модальные, теряет данные с помощью SP.UI.ModalDialog.RefreshPage

Действия по воспроизведению

  1. Создать простой элемент с полем пользователя
  2. элемент
  3. Make открыть в диалоговом окне (Параметры списка - Дополнительно - Запуск формы в диалоговом окне)
  4. Создать элемент
  5. Откройте EditForm элемента
  6. Обновление списка выбора людей
  7. Выполнение SP.UI.ModalDialog.RefreshPage (SP.UI.DialogResult.OK) в консоль

ответ

0

Сделано исправление путем сохранения значений PeoplePicker в sessionStorage после RefreshPage() и перезагрузить их впоследствии.

машинопись 1,8

// FIX for SPClientPeoplePicker not preserving state afre SP.UI.ModalDialog.RefreshPage... 
export class ClientPeoplePickerFix { 
    static getPplPickerElementsInForm =(): Array<HTMLInputElement> => { 
     var result = new Array<HTMLInputElement>(); 
     var elements = document.getElementsByTagName("form")[0].elements; 

     for (var i = 0; i < elements.length; i++) { 
      var currentEl = (<HTMLInputElement>elements[i]); 

      if (currentEl.name.indexOf("$ClientPeoplePicker_HiddenInput") > -1) { 
       result.push(currentEl); 
      } 
     } 

     return result; 
    } 

    static storePeoplePickerValues =(): void => { 
     var elements = ClientPeoplePickerFix.getPplPickerElementsInForm(); 

     for (var i = 0; i < elements.length; i++) { 
      var currentEl = elements[i]; 

      var pplPicker = SPClientPeoplePicker.PickerObjectFromSubElement(currentEl); 
      var currentUserInfo = pplPicker.GetAllUserInfo(); 

      if (currentUserInfo.length > 0) { 
       sessionStorage.setItem(currentEl.name, JSON.stringify(currentUserInfo)); 
      } 
     } 
    } 

    static restorePeoplePickerValues =(): void => { 
     var elements = ClientPeoplePickerFix.getPplPickerElementsInForm(); 

     for (var i = 0; i < elements.length; i++) { 
      var currentEl = elements[i]; 

      var currentUserInfoSerialized = sessionStorage.getItem(currentEl.name); 

      if (currentUserInfoSerialized) { 
       var pplPicker = SPClientPeoplePicker.PickerObjectFromSubElement(currentEl); 
       var currentUserInfo = JSON.parse(currentUserInfoSerialized); 

       currentUserInfo.forEach((user) => { 
        pplPicker.AddProcessedUser(user, true); 
       }); 

       sessionStorage.removeItem(currentEl.name); 
      } 
     } 
    } 

    static overrideRefreshPage =(): void => { 
     var _refreshPage = SP.UI.ModalDialog.RefreshPage; 

     SP.UI.ModalDialog.RefreshPage = function() { 
      if (arguments && arguments.length > 0 && arguments[0] === SP.UI.DialogResult.OK) { 
       ClientPeoplePickerFix.storePeoplePickerValues(); 
      } 

      _refreshPage.apply(this, arguments); 
     } 
    } 
} 


// Override SP.UI.Modal.Dialog.RefreshPage 
// Store values from all SPClientPeoplePickers in sessionStorage when SP.UI.Modal.Dialog.RefreshPage is called 
SP.SOD.executeOrDelayUntilScriptLoaded(() => { 
    ClientPeoplePickerFix.overrideRefreshPage(); 
}, "sp.ui.dialog.js"); 

// On page load 
// Restore SPClientPeoplePicker values from sessionStorage and add in appropriate controls 
SP.SOD.executeOrDelayUntilScriptLoaded(() => { 
    ClientPeoplePickerFix.restorePeoplePickerValues(); 
}, "sp.core.js"); 
Смежные вопросы