import React, { FunctionComponent, 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 TabLinkElement from '../dashboard/users/TabLinkElement'; import CheckBoxElement from '../dashboard/users/CheckBoxElement'; import CheckBoxListItem from '../dashboard/users/CheckBoxListItem'; import ButtonElement from '../dashboard/users/ButtonElement'; import Dashboard from '../../scripts/clientUtils'; 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); useEffect(() => { const loadData = () => { loading.show(); const userId = appRouter.param('userId'); // eslint-disable-next-line compat/compat 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')); // eslint-disable-next-line compat/compat Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) { loadUser(responses[0], responses[1].Items, responses[2].Items, responses[3].Items); }); }; loadData(); const loadUser = (user, mediaFolders, channels, devices) => { setUserName(user.Name); libraryMenu.setTitle(user.Name); loadChannels(user, channels); loadMediaFolders(user, mediaFolders); loadDevices(user, devices); loading.hide(); }; const loadMediaFolders = (user, mediaFolders) => { const itemsArr: ItemsArr[] = []; for (const folder of mediaFolders) { console.log('EnableAllFolders', user.Policy.EnableAllFolders); 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 = (user, channels) => { const itemsArr: ItemsArr[] = []; for (const folder of channels) { console.log('EnableAllChannels', user.Policy.EnableAllChannels); 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 = (user, devices) => { const itemsArr: ItemsArr[] = []; for (const device of devices) { console.log('EnableAllDevices', user.Policy.EnableAllDevices); 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 triggerChange = (select) => { const evt = document.createEvent('HTMLEvents'); evt.initEvent('change', false, true); select.dispatchEvent(evt); }; 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) { if (this.checked) { element?.current?.querySelector('.deviceAccessListContainer').classList.add('hide'); } else { element?.current?.querySelector('.deviceAccessListContainer').classList.remove('hide'); } }); element?.current?.querySelector('.chkEnableAllChannels').addEventListener('change', function (this: HTMLInputElement) { if (this.checked) { element?.current?.querySelector('.channelAccessListContainer').classList.add('hide'); } else { element?.current?.querySelector('.channelAccessListContainer').classList.remove('hide'); } }); element?.current?.querySelector('.chkEnableAllFolders').addEventListener('change', function (this: HTMLInputElement) { if (this.checked) { element?.current?.querySelector('.folderAccessListContainer').classList.add('hide'); } else { element?.current?.querySelector('.folderAccessListContainer').classList.remove('hide'); } }); element?.current?.querySelector('.userLibraryAccessForm').addEventListener('submit', onSubmit); }, []); return (