import { SyncPlayUserAccessType, UserDto } from '@thornbill/jellyfin-sdk/dist/generated-client'; import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react'; import Dashboard from '../../utils/dashboard'; 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: HTMLInputElement) => { 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 page = element.current; if (!page) { console.error('Unexpected null reference'); return; } const fldSelectLoginProvider = page.querySelector('.fldSelectLoginProvider') as HTMLDivElement; 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 page = element.current; if (!page) { console.error('Unexpected null reference'); return; } const fldSelectPasswordResetProvider = page.querySelector('.fldSelectPasswordResetProvider') as HTMLDivElement; 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) => { const page = element.current; if (!page) { console.error('Unexpected null reference'); return; } 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 = page.querySelector('.chkEnableDeleteAllFolders') as HTMLInputElement; chkEnableDeleteAllFolders.checked = user.Policy.EnableContentDeletion; triggerChange(chkEnableDeleteAllFolders); }); }, []); const loadUser = useCallback((user) => { const page = element.current; if (!page) { console.error('Unexpected null reference'); return; } 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 = page.querySelector('.disabledUserBanner') as HTMLDivElement; user.Policy.IsDisabled ? disabledUserBanner.classList.remove('hide') : disabledUserBanner.classList.add('hide'); const txtUserName = page.querySelector('#txtUserName') as HTMLInputElement; txtUserName.disabled = false; txtUserName.removeAttribute('disabled'); const lnkEditUserPreferences = page.querySelector('.lnkEditUserPreferences') as HTMLDivElement; lnkEditUserPreferences.setAttribute('href', 'mypreferencesmenu.html?userId=' + user.Id); LibraryMenu.setTitle(user.Name); setUserName(user.Name); (page.querySelector('#txtUserName') as HTMLInputElement).value = user.Name; (page.querySelector('.chkIsAdmin') as HTMLInputElement).checked = user.Policy.IsAdministrator; (page.querySelector('.chkDisabled') as HTMLInputElement).checked = user.Policy.IsDisabled; (page.querySelector('.chkIsHidden') as HTMLInputElement).checked = user.Policy.IsHidden; (page.querySelector('.chkRemoteControlSharedDevices') as HTMLInputElement).checked = user.Policy.EnableSharedDeviceControl; (page.querySelector('.chkEnableRemoteControlOtherUsers') as HTMLInputElement).checked = user.Policy.EnableRemoteControlOfOtherUsers; (page.querySelector('.chkEnableDownloading') as HTMLInputElement).checked = user.Policy.EnableContentDownloading; (page.querySelector('.chkManageLiveTv') as HTMLInputElement).checked = user.Policy.EnableLiveTvManagement; (page.querySelector('.chkEnableLiveTvAccess') as HTMLInputElement).checked = user.Policy.EnableLiveTvAccess; (page.querySelector('.chkEnableMediaPlayback') as HTMLInputElement).checked = user.Policy.EnableMediaPlayback; (page.querySelector('.chkEnableAudioPlaybackTranscoding') as HTMLInputElement).checked = user.Policy.EnableAudioPlaybackTranscoding; (page.querySelector('.chkEnableVideoPlaybackTranscoding') as HTMLInputElement).checked = user.Policy.EnableVideoPlaybackTranscoding; (page.querySelector('.chkEnableVideoPlaybackRemuxing') as HTMLInputElement).checked = user.Policy.EnablePlaybackRemuxing; (page.querySelector('.chkForceRemoteSourceTranscoding') as HTMLInputElement).checked = user.Policy.ForceRemoteSourceTranscoding; (page.querySelector('.chkRemoteAccess') as HTMLInputElement).checked = user.Policy.EnableRemoteAccess == null || user.Policy.EnableRemoteAccess; (page.querySelector('#txtRemoteClientBitrateLimit') as HTMLInputElement).value = user.Policy.RemoteClientBitrateLimit > 0 ? (user.Policy.RemoteClientBitrateLimit / 1e6).toLocaleString(undefined, {maximumFractionDigits: 6}) : ''; (page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = user.Policy.LoginAttemptsBeforeLockout || '0'; (page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = user.Policy.MaxActiveSessions || '0'; if (window.ApiClient.isMinServerVersion('10.6.0')) { (page.querySelector('#selectSyncPlayAccess') as HTMLInputElement).value = user.Policy.SyncPlayAccess; } loading.hide(); }, [loadAuthProviders, loadPasswordResetProviders, loadDeleteFolders ]); const loadData = useCallback(() => { loading.show(); getUser().then(function (user) { loadUser(user); }); }, [loadUser]); useEffect(() => { const page = element.current; if (!page) { console.error('Unexpected null reference'); return; } loadData(); function onSaveComplete() { Dashboard.navigate('userprofiles.html'); loading.hide(); toast(globalize.translate('SettingsSaved')); } const saveUser = (user: UserDto) => { if (!user.Id) { throw new Error('Unexpected null user.Id'); } if (!user.Policy) { throw new Error('Unexpected null user.Policy'); } user.Name = (page.querySelector('#txtUserName') as HTMLInputElement).value; user.Policy.IsAdministrator = (page.querySelector('.chkIsAdmin') as HTMLInputElement).checked; user.Policy.IsHidden = (page.querySelector('.chkIsHidden') as HTMLInputElement).checked; user.Policy.IsDisabled = (page.querySelector('.chkDisabled') as HTMLInputElement).checked; user.Policy.EnableRemoteControlOfOtherUsers = (page.querySelector('.chkEnableRemoteControlOtherUsers') as HTMLInputElement).checked; user.Policy.EnableLiveTvManagement = (page.querySelector('.chkManageLiveTv') as HTMLInputElement).checked; user.Policy.EnableLiveTvAccess = (page.querySelector('.chkEnableLiveTvAccess') as HTMLInputElement).checked; user.Policy.EnableSharedDeviceControl = (page.querySelector('.chkRemoteControlSharedDevices') as HTMLInputElement).checked; user.Policy.EnableMediaPlayback = (page.querySelector('.chkEnableMediaPlayback') as HTMLInputElement).checked; user.Policy.EnableAudioPlaybackTranscoding = (page.querySelector('.chkEnableAudioPlaybackTranscoding') as HTMLInputElement).checked; user.Policy.EnableVideoPlaybackTranscoding = (page.querySelector('.chkEnableVideoPlaybackTranscoding') as HTMLInputElement).checked; user.Policy.EnablePlaybackRemuxing = (page.querySelector('.chkEnableVideoPlaybackRemuxing') as HTMLInputElement).checked; user.Policy.ForceRemoteSourceTranscoding = (page.querySelector('.chkForceRemoteSourceTranscoding') as HTMLInputElement).checked; user.Policy.EnableContentDownloading = (page.querySelector('.chkEnableDownloading') as HTMLInputElement).checked; user.Policy.EnableRemoteAccess = (page.querySelector('.chkRemoteAccess') as HTMLInputElement).checked; user.Policy.RemoteClientBitrateLimit = Math.floor(1e6 * parseFloat((page.querySelector('#txtRemoteClientBitrateLimit') as HTMLInputElement).value || '0')); user.Policy.LoginAttemptsBeforeLockout = parseInt((page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value || '0'); user.Policy.MaxActiveSessions = parseInt((page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value || '0'); user.Policy.AuthenticationProviderId = (page.querySelector('.selectLoginProvider') as HTMLInputElement).value; user.Policy.PasswordResetProviderId = (page.querySelector('.selectPasswordResetProvider') as HTMLInputElement).value; user.Policy.EnableContentDeletion = (page.querySelector('.chkEnableDeleteAllFolders') as HTMLInputElement).checked; user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : Array.prototype.filter.call(page.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 = (page.querySelector('#selectSyncPlayAccess') as HTMLInputElement).value as SyncPlayUserAccessType; } window.ApiClient.updateUser(user).then(function () { window.ApiClient.updateUserPolicy(user.Id || '', user.Policy || {}).then(function () { onSaveComplete(); }); }); }; const onSubmit = (e: Event) => { loading.show(); getUser().then(function (result) { saveUser(result); }); e.preventDefault(); e.stopPropagation(); return false; }; (page.querySelector('.chkEnableDeleteAllFolders') as HTMLInputElement).addEventListener('change', function (this: HTMLInputElement) { if (this.checked) { (page.querySelector('.deleteAccess') as HTMLDivElement).classList.add('hide'); } else { (page.querySelector('.deleteAccess') as HTMLDivElement).classList.remove('hide'); } }); window.ApiClient.getServerConfiguration().then(function (config) { const fldRemoteAccess = page.querySelector('.fldRemoteAccess') as HTMLDivElement; config.EnableRemoteAccess ? fldRemoteAccess.classList.remove('hide') : fldRemoteAccess.classList.add('hide'); }); (page.querySelector('.editUserProfileForm') as HTMLFormElement).addEventListener('submit', onSubmit); (page.querySelector('.button-cancel') as HTMLButtonElement).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;