import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react'; import loading from '../loading/loading'; import libraryMenu from '../../scripts/libraryMenu'; import globalize from '../../scripts/globalize'; import toast from '../toast/toast'; import { appRouter } from '../appRouter'; import SectionTitleLinkElement from '../dashboard/users/SectionTitleLinkElement'; import SectionTabs from '../dashboard/users/SectionTabs'; import CheckBoxElement from '../dashboard/users/CheckBoxElement'; import CheckBoxListItem from '../dashboard/users/CheckBoxListItem'; import ButtonElement from '../dashboard/users/ButtonElement'; type ItemsArr = { Name?: string; Id?: string; AppName?: string; checkedAttribute?: string } const UserLibraryAccessPage: FunctionComponent = () => { const [ userName, setUserName ] = useState(''); const [channelsItems, setChannelsItems] = useState([]); const [mediaFoldersItems, setMediaFoldersItems] = useState([]); const [devicesItems, setDevicesItems] = useState([]); const element = useRef(null); const triggerChange = (select) => { const evt = document.createEvent('HTMLEvents'); evt.initEvent('change', false, true); select.dispatchEvent(evt); }; const loadMediaFolders = useCallback((user, mediaFolders) => { const itemsArr: ItemsArr[] = []; for (const folder of mediaFolders) { const isChecked = user.Policy.EnableAllFolders || user.Policy.EnabledFolders.indexOf(folder.Id) != -1; const checkedAttribute = isChecked ? ' checked="checked"' : ''; itemsArr.push({ Id: folder.Id, Name: folder.Name, checkedAttribute: checkedAttribute }); } setMediaFoldersItems(itemsArr); const chkEnableAllFolders = element.current.querySelector('.chkEnableAllFolders'); chkEnableAllFolders.checked = user.Policy.EnableAllFolders; triggerChange(chkEnableAllFolders); }, []); const loadChannels = useCallback((user, channels) => { const itemsArr: ItemsArr[] = []; for (const folder of channels) { const isChecked = user.Policy.EnableAllChannels || user.Policy.EnabledChannels.indexOf(folder.Id) != -1; const checkedAttribute = isChecked ? ' checked="checked"' : ''; itemsArr.push({ Id: folder.Id, Name: folder.Name, checkedAttribute: checkedAttribute }); } setChannelsItems(itemsArr); if (channels.length) { element?.current?.querySelector('.channelAccessContainer').classList.remove('hide'); } else { element?.current?.querySelector('.channelAccessContainer').classList.add('hide'); } const chkEnableAllChannels = element.current.querySelector('.chkEnableAllChannels'); chkEnableAllChannels.checked = user.Policy.EnableAllChannels; triggerChange(chkEnableAllChannels); }, []); const loadDevices = useCallback((user, devices) => { const itemsArr: ItemsArr[] = []; for (const device of devices) { const isChecked = user.Policy.EnableAllDevices || user.Policy.EnabledDevices.indexOf(device.Id) != -1; const checkedAttribute = isChecked ? ' checked="checked"' : ''; itemsArr.push({ Id: device.Id, Name: device.Name, AppName : device.AppName, checkedAttribute: checkedAttribute }); } setDevicesItems(itemsArr); const chkEnableAllDevices = element.current.querySelector('.chkEnableAllDevices'); chkEnableAllDevices.checked = user.Policy.EnableAllDevices; triggerChange(chkEnableAllDevices); if (user.Policy.IsAdministrator) { element?.current?.querySelector('.deviceAccessContainer').classList.add('hide'); } else { element?.current?.querySelector('.deviceAccessContainer').classList.remove('hide'); } }, []); const loadUser = useCallback((user, mediaFolders, channels, devices) => { setUserName(user.Name); libraryMenu.setTitle(user.Name); loadChannels(user, channels); loadMediaFolders(user, mediaFolders); loadDevices(user, devices); loading.hide(); }, [loadChannels, loadDevices, loadMediaFolders]); const loadData = useCallback(() => { loading.show(); const userId = appRouter.param('userId'); const promise1 = userId ? window.ApiClient.getUser(userId) : Promise.resolve({ Configuration: {} }); const promise2 = window.ApiClient.getJSON(window.ApiClient.getUrl('Library/MediaFolders', { IsHidden: false })); const promise3 = window.ApiClient.getJSON(window.ApiClient.getUrl('Channels')); const promise4 = window.ApiClient.getJSON(window.ApiClient.getUrl('Devices')); Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) { loadUser(responses[0], responses[1].Items, responses[2].Items, responses[3].Items); }); }, [loadUser]); useEffect(() => { loadData(); const onSubmit = (e) => { loading.show(); const userId = appRouter.param('userId'); window.ApiClient.getUser(userId).then(function (result) { saveUser(result); }); e.preventDefault(); e.stopPropagation(); return false; }; const saveUser = (user) => { user.Policy.EnableAllFolders = element?.current?.querySelector('.chkEnableAllFolders').checked; user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : Array.prototype.filter.call(element?.current?.querySelectorAll('.chkFolder'), function (c) { return c.checked; }).map(function (c) { return c.getAttribute('data-id'); }); user.Policy.EnableAllChannels = element?.current?.querySelector('.chkEnableAllChannels').checked; user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : Array.prototype.filter.call(element?.current?.querySelectorAll('.chkChannel'), function (c) { return c.checked; }).map(function (c) { return c.getAttribute('data-id'); }); user.Policy.EnableAllDevices = element?.current?.querySelector('.chkEnableAllDevices').checked; user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : Array.prototype.filter.call(element?.current?.querySelectorAll('.chkDevice'), function (c) { return c.checked; }).map(function (c) { return c.getAttribute('data-id'); }); user.Policy.BlockedChannels = null; user.Policy.BlockedMediaFolders = null; window.ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { onSaveComplete(); }); }; const onSaveComplete = () => { loading.hide(); toast(globalize.translate('SettingsSaved')); }; element?.current?.querySelector('.chkEnableAllDevices').addEventListener('change', function (this: HTMLInputElement) { element?.current?.querySelector('.deviceAccessListContainer').classList.toggle('hide', this.checked); }); element?.current?.querySelector('.chkEnableAllChannels').addEventListener('change', function (this: HTMLInputElement) { element?.current?.querySelector('.channelAccessListContainer').classList.toggle('hide', this.checked); }); element?.current?.querySelector('.chkEnableAllFolders').addEventListener('change', function (this: HTMLInputElement) { element?.current?.querySelector('.folderAccessListContainer').classList.toggle('hide', this.checked); }); element?.current?.querySelector('.userLibraryAccessForm').addEventListener('submit', onSubmit); }, [loadData]); return (

{userName}

{globalize.translate('HeaderLibraryAccess')}

{globalize.translate('HeaderLibraries')}

{mediaFoldersItems.map(Item => { return ( ); })}
{globalize.translate('LibraryAccessHelp')}

{globalize.translate('HeaderChannelAccess')}

{globalize.translate('Channels')}

{channelsItems.map(Item => ( ))}
{globalize.translate('ChannelAccessHelp')}

{globalize.translate('HeaderDeviceAccess')}

{globalize.translate('HeaderDevices')}

{devicesItems.map(Item => ( ))}
{globalize.translate('DeviceAccessHelp')}


); }; export default UserLibraryAccessPage;