import { UserDto } from '@thornbill/jellyfin-sdk/dist/generated-client'; 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: 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'); 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'); 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'); 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'); user.Policy.IsDisabled ? disabledUserBanner.classList.remove('hide') : disabledUserBanner.classList.add('hide'); const txtUserName = page.querySelector('#txtUserName'); txtUserName.disabled = ''; txtUserName.removeAttribute('disabled'); const lnkEditUserPreferences = page.querySelector('.lnkEditUserPreferences'); lnkEditUserPreferences.setAttribute('href', 'mypreferencesmenu.html?userId=' + user.Id); LibraryMenu.setTitle(user.Name); setUserName(user.Name); page.querySelector('#txtUserName').value = user.Name; page.querySelector('.chkIsAdmin').checked = user.Policy.IsAdministrator; page.querySelector('.chkDisabled').checked = user.Policy.IsDisabled; page.querySelector('.chkIsHidden').checked = user.Policy.IsHidden; page.querySelector('.chkRemoteControlSharedDevices').checked = user.Policy.EnableSharedDeviceControl; page.querySelector('.chkEnableRemoteControlOtherUsers').checked = user.Policy.EnableRemoteControlOfOtherUsers; page.querySelector('.chkEnableDownloading').checked = user.Policy.EnableContentDownloading; page.querySelector('.chkManageLiveTv').checked = user.Policy.EnableLiveTvManagement; page.querySelector('.chkEnableLiveTvAccess').checked = user.Policy.EnableLiveTvAccess; page.querySelector('.chkEnableMediaPlayback').checked = user.Policy.EnableMediaPlayback; page.querySelector('.chkEnableAudioPlaybackTranscoding').checked = user.Policy.EnableAudioPlaybackTranscoding; page.querySelector('.chkEnableVideoPlaybackTranscoding').checked = user.Policy.EnableVideoPlaybackTranscoding; page.querySelector('.chkEnableVideoPlaybackRemuxing').checked = user.Policy.EnablePlaybackRemuxing; page.querySelector('.chkForceRemoteSourceTranscoding').checked = user.Policy.ForceRemoteSourceTranscoding; page.querySelector('.chkRemoteAccess').checked = user.Policy.EnableRemoteAccess == null || user.Policy.EnableRemoteAccess; page.querySelector('#txtRemoteClientBitrateLimit').value = user.Policy.RemoteClientBitrateLimit / 1e6 || ''; page.querySelector('#txtLoginAttemptsBeforeLockout').value = user.Policy.LoginAttemptsBeforeLockout || '0'; page.querySelector('#txtMaxActiveSessions').value = user.Policy.MaxActiveSessions || '0'; if (window.ApiClient.isMinServerVersion('10.6.0')) { page.querySelector('#selectSyncPlayAccess').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').value; user.Policy.IsAdministrator = page.querySelector('.chkIsAdmin').checked; user.Policy.IsHidden = page.querySelector('.chkIsHidden').checked; user.Policy.IsDisabled = page.querySelector('.chkDisabled').checked; user.Policy.EnableRemoteControlOfOtherUsers = page.querySelector('.chkEnableRemoteControlOtherUsers').checked; user.Policy.EnableLiveTvManagement = page.querySelector('.chkManageLiveTv').checked; user.Policy.EnableLiveTvAccess = page.querySelector('.chkEnableLiveTvAccess').checked; user.Policy.EnableSharedDeviceControl = page.querySelector('.chkRemoteControlSharedDevices').checked; user.Policy.EnableMediaPlayback = page.querySelector('.chkEnableMediaPlayback').checked; user.Policy.EnableAudioPlaybackTranscoding = page.querySelector('.chkEnableAudioPlaybackTranscoding').checked; user.Policy.EnableVideoPlaybackTranscoding = page.querySelector('.chkEnableVideoPlaybackTranscoding').checked; user.Policy.EnablePlaybackRemuxing = page.querySelector('.chkEnableVideoPlaybackRemuxing').checked; user.Policy.ForceRemoteSourceTranscoding = page.querySelector('.chkForceRemoteSourceTranscoding').checked; user.Policy.EnableContentDownloading = page.querySelector('.chkEnableDownloading').checked; user.Policy.EnableRemoteAccess = page.querySelector('.chkRemoteAccess').checked; user.Policy.RemoteClientBitrateLimit = Math.floor(1e6 * parseFloat(page.querySelector('#txtRemoteClientBitrateLimit').value || '0')); user.Policy.LoginAttemptsBeforeLockout = parseInt(page.querySelector('#txtLoginAttemptsBeforeLockout').value || '0'); user.Policy.MaxActiveSessions = parseInt(page.querySelector('#txtMaxActiveSessions').value || '0'); user.Policy.AuthenticationProviderId = page.querySelector('.selectLoginProvider').value; user.Policy.PasswordResetProviderId = page.querySelector('.selectPasswordResetProvider').value; user.Policy.EnableContentDeletion = page.querySelector('.chkEnableDeleteAllFolders').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').value; } 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').addEventListener('change', function (this: HTMLInputElement) { if (this.checked) { page.querySelector('.deleteAccess').classList.add('hide'); } else { page.querySelector('.deleteAccess').classList.remove('hide'); } }); window.ApiClient.getServerConfiguration().then(function (config) { const fldRemoteAccess = page.querySelector('.fldRemoteAccess'); config.EnableRemoteAccess ? fldRemoteAccess.classList.remove('hide') : fldRemoteAccess.classList.add('hide'); }); page.querySelector('.editUserProfileForm').addEventListener('submit', onSubmit); page.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;