2021-11-06 21:02:59 +03:00
|
|
|
import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react';
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2022-04-10 02:22:13 -04:00
|
|
|
import Dashboard from '../../utils/dashboard';
|
2021-10-02 18:10:14 +03:00
|
|
|
import globalize from '../../scripts/globalize';
|
|
|
|
import loading from '../loading/loading';
|
|
|
|
import toast from '../toast/toast';
|
2022-01-05 21:53:15 +03:00
|
|
|
import SectionTitleContainer from '../dashboard/users/SectionTitleContainer';
|
2021-10-19 19:19:28 +03:00
|
|
|
import InputElement from '../dashboard/users/InputElement';
|
|
|
|
import CheckBoxElement from '../dashboard/users/CheckBoxElement';
|
2021-10-09 19:35:10 +03:00
|
|
|
import CheckBoxListItem from '../dashboard/users/CheckBoxListItem';
|
2021-10-19 19:19:28 +03:00
|
|
|
import ButtonElement from '../dashboard/users/ButtonElement';
|
2021-10-02 18:10:14 +03:00
|
|
|
|
|
|
|
type userInput = {
|
|
|
|
Name?: string;
|
|
|
|
Password?: string;
|
|
|
|
}
|
|
|
|
|
2021-10-09 19:35:10 +03:00
|
|
|
type ItemsArr = {
|
|
|
|
Name?: string;
|
|
|
|
Id?: string;
|
|
|
|
}
|
|
|
|
|
2021-10-02 18:10:14 +03:00
|
|
|
const NewUserPage: FunctionComponent = () => {
|
2022-02-15 23:49:46 +03:00
|
|
|
const [ channelsItems, setChannelsItems ] = useState<ItemsArr[]>([]);
|
|
|
|
const [ mediaFoldersItems, setMediaFoldersItems ] = useState<ItemsArr[]>([]);
|
2022-02-15 23:47:59 +03:00
|
|
|
const element = useRef<HTMLDivElement>(null);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
const getItemsResult = (items: ItemsArr[]) => {
|
|
|
|
return items.map(item =>
|
|
|
|
({
|
|
|
|
Id: item.Id,
|
|
|
|
Name: item.Name
|
|
|
|
})
|
|
|
|
);
|
|
|
|
};
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
const loadMediaFolders = useCallback((result) => {
|
2022-02-16 00:37:06 +03:00
|
|
|
const page = element.current;
|
|
|
|
|
|
|
|
if (!page) {
|
|
|
|
console.error('Unexpected null reference');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
const mediaFolders = getItemsResult(result);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
setMediaFoldersItems(mediaFolders);
|
2021-10-09 21:29:30 +03:00
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
const folderAccess = page.querySelector('.folderAccess') as HTMLDivElement;
|
2021-11-06 21:02:59 +03:00
|
|
|
folderAccess.dispatchEvent(new CustomEvent('create'));
|
2021-10-09 19:35:10 +03:00
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
(page.querySelector('.chkEnableAllFolders') as HTMLInputElement).checked = false;
|
2021-11-06 21:02:59 +03:00
|
|
|
}, []);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
const loadChannels = useCallback((result) => {
|
2022-02-16 00:37:06 +03:00
|
|
|
const page = element.current;
|
|
|
|
|
|
|
|
if (!page) {
|
|
|
|
console.error('Unexpected null reference');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
const channels = getItemsResult(result);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
setChannelsItems(channels);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
const channelAccess = page.querySelector('.channelAccess') as HTMLDivElement;
|
2021-11-06 21:02:59 +03:00
|
|
|
channelAccess.dispatchEvent(new CustomEvent('create'));
|
2021-10-09 19:35:10 +03:00
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
const channelAccessContainer = page.querySelector('.channelAccessContainer') as HTMLDivElement;
|
2021-11-06 21:02:59 +03:00
|
|
|
channels.length ? channelAccessContainer.classList.remove('hide') : channelAccessContainer.classList.add('hide');
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
(page.querySelector('.chkEnableAllChannels') as HTMLInputElement).checked = false;
|
2021-11-06 21:02:59 +03:00
|
|
|
}, []);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
const loadUser = useCallback(() => {
|
2022-02-16 00:37:06 +03:00
|
|
|
const page = element.current;
|
|
|
|
|
|
|
|
if (!page) {
|
|
|
|
console.error('Unexpected null reference');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
(page.querySelector('#txtUsername') as HTMLInputElement).value = '';
|
|
|
|
(page.querySelector('#txtPassword') as HTMLInputElement).value = '';
|
2021-11-06 21:02:59 +03:00
|
|
|
loading.show();
|
|
|
|
const promiseFolders = window.ApiClient.getJSON(window.ApiClient.getUrl('Library/MediaFolders', {
|
|
|
|
IsHidden: false
|
|
|
|
}));
|
|
|
|
const promiseChannels = window.ApiClient.getJSON(window.ApiClient.getUrl('Channels'));
|
|
|
|
Promise.all([promiseFolders, promiseChannels]).then(function (responses) {
|
|
|
|
loadMediaFolders(responses[0].Items);
|
|
|
|
loadChannels(responses[1].Items);
|
|
|
|
loading.hide();
|
|
|
|
});
|
|
|
|
}, [loadChannels, loadMediaFolders]);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
useEffect(() => {
|
2022-02-16 00:37:06 +03:00
|
|
|
const page = element.current;
|
|
|
|
|
|
|
|
if (!page) {
|
|
|
|
console.error('Unexpected null reference');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-06 21:02:59 +03:00
|
|
|
loadUser();
|
2021-10-02 18:10:14 +03:00
|
|
|
|
|
|
|
const saveUser = () => {
|
|
|
|
const userInput: userInput = {};
|
2022-02-16 22:01:13 +03:00
|
|
|
userInput.Name = (page.querySelector('#txtUsername') as HTMLInputElement).value;
|
|
|
|
userInput.Password = (page.querySelector('#txtPassword') as HTMLInputElement).value;
|
2021-10-02 18:10:14 +03:00
|
|
|
window.ApiClient.createUser(userInput).then(function (user) {
|
2022-02-18 13:08:44 +03:00
|
|
|
if (!user.Id) {
|
|
|
|
throw new Error('Unexpected null user.Id');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!user.Policy) {
|
|
|
|
throw new Error('Unexpected null user.Policy');
|
|
|
|
}
|
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
user.Policy.EnableAllFolders = (page.querySelector('.chkEnableAllFolders') as HTMLInputElement).checked;
|
2021-10-02 18:10:14 +03:00
|
|
|
user.Policy.EnabledFolders = [];
|
|
|
|
|
|
|
|
if (!user.Policy.EnableAllFolders) {
|
2022-02-16 00:37:06 +03:00
|
|
|
user.Policy.EnabledFolders = Array.prototype.filter.call(page.querySelectorAll('.chkFolder'), function (i) {
|
2021-10-02 18:10:14 +03:00
|
|
|
return i.checked;
|
|
|
|
}).map(function (i) {
|
|
|
|
return i.getAttribute('data-id');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
user.Policy.EnableAllChannels = (page.querySelector('.chkEnableAllChannels') as HTMLInputElement).checked;
|
2021-10-02 18:10:14 +03:00
|
|
|
user.Policy.EnabledChannels = [];
|
|
|
|
|
|
|
|
if (!user.Policy.EnableAllChannels) {
|
2022-02-16 00:37:06 +03:00
|
|
|
user.Policy.EnabledChannels = Array.prototype.filter.call(page.querySelectorAll('.chkChannel'), function (i) {
|
2021-10-02 18:10:14 +03:00
|
|
|
return i.checked;
|
|
|
|
}).map(function (i) {
|
|
|
|
return i.getAttribute('data-id');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
window.ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () {
|
|
|
|
Dashboard.navigate('useredit.html?userId=' + user.Id);
|
|
|
|
});
|
|
|
|
}, function () {
|
|
|
|
toast(globalize.translate('ErrorDefault'));
|
|
|
|
loading.hide();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2022-02-18 14:27:39 +03:00
|
|
|
const onSubmit = (e: Event) => {
|
2021-10-02 18:10:14 +03:00
|
|
|
loading.show();
|
|
|
|
saveUser();
|
|
|
|
e.preventDefault();
|
|
|
|
e.stopPropagation();
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
(page.querySelector('.chkEnableAllChannels') as HTMLInputElement).addEventListener('change', function (this: HTMLInputElement) {
|
|
|
|
const channelAccessListContainer = page.querySelector('.channelAccessListContainer') as HTMLDivElement;
|
2021-10-09 23:00:04 +03:00
|
|
|
this.checked ? channelAccessListContainer.classList.add('hide') : channelAccessListContainer.classList.remove('hide');
|
2021-10-02 18:10:14 +03:00
|
|
|
});
|
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
(page.querySelector('.chkEnableAllFolders') as HTMLInputElement).addEventListener('change', function (this: HTMLInputElement) {
|
|
|
|
const folderAccessListContainer = page.querySelector('.folderAccessListContainer') as HTMLDivElement;
|
2021-10-09 23:00:04 +03:00
|
|
|
this.checked ? folderAccessListContainer.classList.add('hide') : folderAccessListContainer.classList.remove('hide');
|
2021-10-02 18:10:14 +03:00
|
|
|
});
|
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
(page.querySelector('.newUserProfileForm') as HTMLFormElement).addEventListener('submit', onSubmit);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
2022-02-16 22:01:13 +03:00
|
|
|
(page.querySelector('.button-cancel') as HTMLButtonElement).addEventListener('click', function() {
|
2021-10-02 18:10:14 +03:00
|
|
|
window.history.back();
|
|
|
|
});
|
2021-11-06 21:02:59 +03:00
|
|
|
}, [loadUser]);
|
2021-10-02 18:10:14 +03:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div ref={element}>
|
|
|
|
<div className='content-primary'>
|
2022-01-05 21:53:15 +03:00
|
|
|
<SectionTitleContainer title={globalize.translate('ButtonAddUser')}/>
|
2021-10-02 18:10:14 +03:00
|
|
|
<form className='newUserProfileForm'>
|
|
|
|
<div className='inputContainer'>
|
|
|
|
<InputElement
|
|
|
|
type='text'
|
|
|
|
id='txtUsername'
|
|
|
|
label='LabelName'
|
|
|
|
options={'required'}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div className='inputContainer'>
|
|
|
|
<InputElement
|
|
|
|
type='password'
|
|
|
|
id='txtPassword'
|
|
|
|
label='LabelPassword'
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className='folderAccessContainer'>
|
|
|
|
<h2>{globalize.translate('HeaderLibraryAccess')}</h2>
|
|
|
|
<CheckBoxElement
|
|
|
|
type='checkbox'
|
|
|
|
className='chkEnableAllFolders'
|
|
|
|
title='OptionEnableAccessToAllLibraries'
|
|
|
|
/>
|
|
|
|
<div className='folderAccessListContainer'>
|
|
|
|
<div className='folderAccess'>
|
|
|
|
<h3 className='checkboxListLabel'>
|
|
|
|
{globalize.translate('HeaderLibraries')}
|
|
|
|
</h3>
|
|
|
|
<div className='checkboxList paperList' style={{padding: '.5em 1em'}}>
|
2021-10-09 19:35:10 +03:00
|
|
|
{mediaFoldersItems.map(Item => (
|
|
|
|
<CheckBoxListItem
|
|
|
|
key={Item.Id}
|
|
|
|
className='chkFolder'
|
|
|
|
Id={Item.Id}
|
|
|
|
Name={Item.Name}
|
2021-10-15 23:38:03 +03:00
|
|
|
checkedAttribute=''
|
2021-10-02 18:10:14 +03:00
|
|
|
/>
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className='fieldDescription'>
|
|
|
|
{globalize.translate('LibraryAccessHelp')}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className='channelAccessContainer verticalSection-extrabottompadding hide'>
|
|
|
|
<h2>{globalize.translate('HeaderChannelAccess')}</h2>
|
|
|
|
<CheckBoxElement
|
|
|
|
type='checkbox'
|
|
|
|
className='chkEnableAllChannels'
|
|
|
|
title='OptionEnableAccessToAllChannels'
|
|
|
|
/>
|
|
|
|
<div className='channelAccessListContainer'>
|
|
|
|
<div className='channelAccess'>
|
|
|
|
<h3 className='checkboxListLabel'>
|
|
|
|
{globalize.translate('Channels')}
|
|
|
|
</h3>
|
|
|
|
<div className='checkboxList paperList' style={{padding: '.5em 1em'}}>
|
2021-10-09 19:35:10 +03:00
|
|
|
{channelsItems.map(Item => (
|
|
|
|
<CheckBoxListItem
|
|
|
|
key={Item.Id}
|
|
|
|
className='chkChannel'
|
|
|
|
Id={Item.Id}
|
|
|
|
Name={Item.Name}
|
2021-10-15 23:38:03 +03:00
|
|
|
checkedAttribute=''
|
2021-10-02 18:10:14 +03:00
|
|
|
/>
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className='fieldDescription'>
|
|
|
|
{globalize.translate('ChannelAccessHelp')}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<ButtonElement
|
|
|
|
type='submit'
|
|
|
|
className='raised button-submit block'
|
|
|
|
title='Save'
|
|
|
|
/>
|
|
|
|
<ButtonElement
|
|
|
|
type='button'
|
|
|
|
className='raised button-cancel block btnCancel'
|
|
|
|
title='ButtonCancel'
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default NewUserPage;
|