import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react'; import Dashboard from '../../scripts/clientUtils'; import globalize from '../../scripts/globalize'; import LibraryMenu from '../../scripts/libraryMenu'; import { appRouter } from '../appRouter'; import ButtonElement from '../dashboard/users/ButtonElement'; import CheckBoxElement from '../dashboard/users/CheckBoxElement'; import CheckBoxListItem from '../dashboard/users/CheckBoxListItem'; import InputElement from '../dashboard/users/InputElement'; import LinkEditUserPreferences from '../dashboard/users/LinkEditUserPreferences'; import SectionTitleLinkElement from '../dashboard/users/SectionTitleLinkElement'; import SelectElement from '../dashboard/users/SelectElement'; import SelectSyncPlayAccessElement from '../dashboard/users/SelectSyncPlayAccessElement'; import SectionTabs from '../dashboard/users/SectionTabs'; import loading from '../loading/loading'; import toast from '../toast/toast'; type ItemsArr = { Name?: string; Id?: string; checkedAttribute: string } const UserEditPage: FunctionComponent = () => { const [ userName, setUserName ] = useState(''); const [ deleteFoldersAccess, setDeleteFoldersAccess ] = useState([]); const [ authProviders, setAuthProviders ] = useState([]); const [ passwordResetProviders, setPasswordResetProviders ] = useState([]); const [ authenticationProviderId, setAuthenticationProviderId ] = useState(''); const [ passwordResetProviderId, setPasswordResetProviderId ] = useState(''); const element = useRef(null); const triggerChange = (select) => { const evt = document.createEvent('HTMLEvents'); evt.initEvent('change', false, true); select.dispatchEvent(evt); }; const getUser = () => { const userId = appRouter.param('userId'); return window.ApiClient.getUser(userId); }; const loadAuthProviders = useCallback((user, providers) => { const fldSelectLoginProvider = element?.current?.querySelector('.fldSelectLoginProvider'); providers.length > 1 ? fldSelectLoginProvider.classList.remove('hide') : fldSelectLoginProvider.classList.add('hide'); setAuthProviders(providers); const currentProviderId = user.Policy.AuthenticationProviderId; setAuthenticationProviderId(currentProviderId); }, []); const loadPasswordResetProviders = useCallback((user, providers) => { const fldSelectPasswordResetProvider = element?.current?.querySelector('.fldSelectPasswordResetProvider'); providers.length > 1 ? fldSelectPasswordResetProvider.classList.remove('hide') : fldSelectPasswordResetProvider.classList.add('hide'); setPasswordResetProviders(providers); const currentProviderId = user.Policy.PasswordResetProviderId; setPasswordResetProviderId(currentProviderId); }, []); const loadDeleteFolders = useCallback((user, mediaFolders) => { window.ApiClient.getJSON(window.ApiClient.getUrl('Channels', { SupportsMediaDeletion: true })).then(function (channelsResult) { let isChecked; let checkedAttribute; const itemsArr: ItemsArr[] = []; for (const folder of mediaFolders) { isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1; checkedAttribute = isChecked ? ' checked="checked"' : ''; itemsArr.push({ Id: folder.Id, Name: folder.Name, checkedAttribute: checkedAttribute }); } for (const folder of channelsResult.Items) { isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1; checkedAttribute = isChecked ? ' checked="checked"' : ''; itemsArr.push({ Id: folder.Id, Name: folder.Name, checkedAttribute: checkedAttribute }); } setDeleteFoldersAccess(itemsArr); const chkEnableDeleteAllFolders = element.current.querySelector('.chkEnableDeleteAllFolders'); chkEnableDeleteAllFolders.checked = user.Policy.EnableContentDeletion; triggerChange(chkEnableDeleteAllFolders); }); }, []); const loadUser = useCallback((user) => { window.ApiClient.getJSON(window.ApiClient.getUrl('Auth/Providers')).then(function (providers) { loadAuthProviders(user, providers); }); window.ApiClient.getJSON(window.ApiClient.getUrl('Auth/PasswordResetProviders')).then(function (providers) { loadPasswordResetProviders(user, providers); }); window.ApiClient.getJSON(window.ApiClient.getUrl('Library/MediaFolders', { IsHidden: false })).then(function (folders) { loadDeleteFolders(user, folders.Items); }); const disabledUserBanner = element?.current?.querySelector('.disabledUserBanner'); user.Policy.IsDisabled ? disabledUserBanner.classList.remove('hide') : disabledUserBanner.classList.add('hide'); const txtUserName = element?.current?.querySelector('#txtUserName'); txtUserName.disabled = ''; txtUserName.removeAttribute('disabled'); const lnkEditUserPreferences = element?.current?.querySelector('.lnkEditUserPreferences'); lnkEditUserPreferences.setAttribute('href', 'mypreferencesmenu.html?userId=' + user.Id); LibraryMenu.setTitle(user.Name); setUserName(user.Name); element.current.querySelector('#txtUserName').value = user.Name; element.current.querySelector('.chkIsAdmin').checked = user.Policy.IsAdministrator; element.current.querySelector('.chkDisabled').checked = user.Policy.IsDisabled; element.current.querySelector('.chkIsHidden').checked = user.Policy.IsHidden; element.current.querySelector('.chkRemoteControlSharedDevices').checked = user.Policy.EnableSharedDeviceControl; element.current.querySelector('.chkEnableRemoteControlOtherUsers').checked = user.Policy.EnableRemoteControlOfOtherUsers; element.current.querySelector('.chkEnableDownloading').checked = user.Policy.EnableContentDownloading; element.current.querySelector('.chkManageLiveTv').checked = user.Policy.EnableLiveTvManagement; element.current.querySelector('.chkEnableLiveTvAccess').checked = user.Policy.EnableLiveTvAccess; element.current.querySelector('.chkEnableMediaPlayback').checked = user.Policy.EnableMediaPlayback; element.current.querySelector('.chkEnableAudioPlaybackTranscoding').checked = user.Policy.EnableAudioPlaybackTranscoding; element.current.querySelector('.chkEnableVideoPlaybackTranscoding').checked = user.Policy.EnableVideoPlaybackTranscoding; element.current.querySelector('.chkEnableVideoPlaybackRemuxing').checked = user.Policy.EnablePlaybackRemuxing; element.current.querySelector('.chkForceRemoteSourceTranscoding').checked = user.Policy.ForceRemoteSourceTranscoding; element.current.querySelector('.chkRemoteAccess').checked = user.Policy.EnableRemoteAccess == null || user.Policy.EnableRemoteAccess; element.current.querySelector('#txtRemoteClientBitrateLimit').value = user.Policy.RemoteClientBitrateLimit / 1e6 || ''; element.current.querySelector('#txtLoginAttemptsBeforeLockout').value = user.Policy.LoginAttemptsBeforeLockout || '0'; element.current.querySelector('#txtMaxActiveSessions').value = user.Policy.MaxActiveSessions || '0'; if (window.ApiClient.isMinServerVersion('10.6.0')) { element.current.querySelector('#selectSyncPlayAccess').value = user.Policy.SyncPlayAccess; } loading.hide(); }, [loadAuthProviders, loadPasswordResetProviders, loadDeleteFolders ]); const loadData = useCallback(() => { loading.show(); getUser().then(function (user) { loadUser(user); }); }, [loadUser]); useEffect(() => { loadData(); function onSaveComplete() { Dashboard.navigate('userprofiles.html'); loading.hide(); toast(globalize.translate('SettingsSaved')); } const saveUser = (user) => { user.Name = element?.current?.querySelector('#txtUserName').value; user.Policy.IsAdministrator = element?.current?.querySelector('.chkIsAdmin').checked; user.Policy.IsHidden = element?.current?.querySelector('.chkIsHidden').checked; user.Policy.IsDisabled = element?.current?.querySelector('.chkDisabled').checked; user.Policy.EnableRemoteControlOfOtherUsers = element?.current?.querySelector('.chkEnableRemoteControlOtherUsers').checked; user.Policy.EnableLiveTvManagement = element?.current?.querySelector('.chkManageLiveTv').checked; user.Policy.EnableLiveTvAccess = element?.current?.querySelector('.chkEnableLiveTvAccess').checked; user.Policy.EnableSharedDeviceControl = element?.current?.querySelector('.chkRemoteControlSharedDevices').checked; user.Policy.EnableMediaPlayback = element?.current?.querySelector('.chkEnableMediaPlayback').checked; user.Policy.EnableAudioPlaybackTranscoding = element?.current?.querySelector('.chkEnableAudioPlaybackTranscoding').checked; user.Policy.EnableVideoPlaybackTranscoding = element?.current?.querySelector('.chkEnableVideoPlaybackTranscoding').checked; user.Policy.EnablePlaybackRemuxing = element?.current?.querySelector('.chkEnableVideoPlaybackRemuxing').checked; user.Policy.ForceRemoteSourceTranscoding = element?.current?.querySelector('.chkForceRemoteSourceTranscoding').checked; user.Policy.EnableContentDownloading = element?.current?.querySelector('.chkEnableDownloading').checked; user.Policy.EnableRemoteAccess = element?.current?.querySelector('.chkRemoteAccess').checked; user.Policy.RemoteClientBitrateLimit = Math.floor(1e6 * parseFloat(element?.current?.querySelector('#txtRemoteClientBitrateLimit').value || '0')); user.Policy.LoginAttemptsBeforeLockout = parseInt(element?.current?.querySelector('#txtLoginAttemptsBeforeLockout').value || '0'); user.Policy.MaxActiveSessions = parseInt(element?.current?.querySelector('#txtMaxActiveSessions').value || '0'); user.Policy.AuthenticationProviderId = element?.current?.querySelector('.selectLoginProvider').value; user.Policy.PasswordResetProviderId = element?.current?.querySelector('.selectPasswordResetProvider').value; user.Policy.EnableContentDeletion = element?.current?.querySelector('.chkEnableDeleteAllFolders').checked; user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : Array.prototype.filter.call(element?.current?.querySelectorAll('.chkFolder'), function (c) { return c.checked; }).map(function (c) { return c.getAttribute('data-id'); }); if (window.ApiClient.isMinServerVersion('10.6.0')) { user.Policy.SyncPlayAccess = element?.current?.querySelector('#selectSyncPlayAccess').value; } window.ApiClient.updateUser(user).then(function () { window.ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { onSaveComplete(); }); }); }; const onSubmit = (e) => { loading.show(); getUser().then(function (result) { saveUser(result); }); e.preventDefault(); e.stopPropagation(); return false; }; element?.current?.querySelector('.chkEnableDeleteAllFolders').addEventListener('change', function (this: HTMLInputElement) { if (this.checked) { element?.current?.querySelector('.deleteAccess').classList.add('hide'); } else { element?.current?.querySelector('.deleteAccess').classList.remove('hide'); } }); window.ApiClient.getServerConfiguration().then(function (config) { const fldRemoteAccess = element?.current?.querySelector('.fldRemoteAccess'); config.EnableRemoteAccess ? fldRemoteAccess.classList.remove('hide') : fldRemoteAccess.classList.add('hide'); }); element?.current?.querySelector('.editUserProfileForm').addEventListener('submit', onSubmit); element?.current?.querySelector('.button-cancel').addEventListener('click', function() { window.history.back(); }); }, [loadData]); return (

{userName}

{globalize.translate('HeaderThisUserIsCurrentlyDisabled')}
{globalize.translate('MessageReenableUser')}
{globalize.translate('AuthProviderHelp')}
{globalize.translate('PasswordResetProviderHelp')}
{globalize.translate('AllowRemoteAccessHelp')}

{globalize.translate('HeaderFeatureAccess')}

{globalize.translate('HeaderPlayback')}

{globalize.translate('OptionAllowMediaPlaybackTranscodingHelp')}

{globalize.translate('LabelRemoteClientBitrateLimitHelp')}
{globalize.translate('LabelUserRemoteClientBitrateLimitHelp')}
{globalize.translate('SyncPlayAccessHelp')}

{globalize.translate('HeaderAllowMediaDeletionFrom')}

{deleteFoldersAccess.map(Item => ( ))}

{globalize.translate('HeaderRemoteControl')}

{globalize.translate('OptionAllowRemoteSharedDevicesHelp')}

{globalize.translate('Other')}

{globalize.translate('OptionAllowContentDownloadHelp')}
{globalize.translate('OptionDisableUserHelp')}
{globalize.translate('OptionHideUserFromLoginHelp')}

{globalize.translate('OptionLoginAttemptsBeforeLockout')}
{globalize.translate('OptionLoginAttemptsBeforeLockoutHelp')}

{globalize.translate('OptionMaxActiveSessions')}
{globalize.translate('OptionMaxActiveSessionsHelp')}

); }; export default UserEditPage;