implement full load of videos and startdata
modify api where necessary
This commit is contained in:
		@@ -45,14 +45,16 @@ class App extends React.Component<{}, state> {
 | 
			
		||||
            // set theme
 | 
			
		||||
            GlobalInfos.enableDarkTheme(result.DarkMode);
 | 
			
		||||
 | 
			
		||||
            GlobalInfos.setVideoPath(result.VideoPath);
 | 
			
		||||
 | 
			
		||||
            this.setState({
 | 
			
		||||
                generalSettingsLoaded: true,
 | 
			
		||||
                passwordsupport: result.passwordEnabled,
 | 
			
		||||
                mediacentername: result.mediacenter_name,
 | 
			
		||||
                passwordsupport: result.Password,
 | 
			
		||||
                mediacentername: result.Mediacenter_name,
 | 
			
		||||
                onapierror: false
 | 
			
		||||
            });
 | 
			
		||||
            // set tab title to received mediacenter name
 | 
			
		||||
            document.title = result.mediacenter_name;
 | 
			
		||||
            document.title = result.Mediacenter_name;
 | 
			
		||||
        }, error => {
 | 
			
		||||
            this.setState({onapierror: true});
 | 
			
		||||
        });
 | 
			
		||||
 
 | 
			
		||||
@@ -4,13 +4,13 @@ import ActorTile from './ActorTile';
 | 
			
		||||
 | 
			
		||||
describe('<ActorTile/>', function () {
 | 
			
		||||
    it('renders without crashing ', function () {
 | 
			
		||||
        const wrapper = shallow(<ActorTile actor={{thumbnail: '-1', name: 'testname', id: 3}}/>);
 | 
			
		||||
        const wrapper = shallow(<ActorTile actor={{Thumbnail: '-1', Name: 'testname', id: 3}}/>);
 | 
			
		||||
        wrapper.unmount();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('simulate click with custom handler', function () {
 | 
			
		||||
        const func = jest.fn((_) => {});
 | 
			
		||||
        const wrapper = shallow(<ActorTile actor={{thumbnail: '-1', name: 'testname', id: 3}} onClick={() => func()}/>);
 | 
			
		||||
        const wrapper = shallow(<ActorTile actor={{Thumbnail: '-1', Name: 'testname', id: 3}} onClick={() => func()}/>);
 | 
			
		||||
 | 
			
		||||
        const func1 = jest.fn();
 | 
			
		||||
        prepareViewBinding(func1);
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ class ActorTile extends React.Component<props> {
 | 
			
		||||
            return this.renderActorTile(this.props.onClick);
 | 
			
		||||
        } else {
 | 
			
		||||
            return (
 | 
			
		||||
                <Link to={{pathname: '/actors/' + this.props.actor.actor_id}}>
 | 
			
		||||
                <Link to={{pathname: '/actors/' + this.props.actor.ActorId}}>
 | 
			
		||||
                    {this.renderActorTile(() => {
 | 
			
		||||
                    })}
 | 
			
		||||
                </Link>
 | 
			
		||||
@@ -34,11 +34,11 @@ class ActorTile extends React.Component<props> {
 | 
			
		||||
        return (
 | 
			
		||||
            <div className={style.actortile} onClick={(): void => customclickhandler(this.props.actor)}>
 | 
			
		||||
                <div className={style.actortile_thumbnail}>
 | 
			
		||||
                    {this.props.actor.thumbnail === null ? <FontAwesomeIcon style={{
 | 
			
		||||
                    {this.props.actor.Thumbnail === '' ? <FontAwesomeIcon style={{
 | 
			
		||||
                        lineHeight: '130px'
 | 
			
		||||
                    }} icon={faUser} size='5x'/> : 'dfdf' /* todo render picture provided here! */}
 | 
			
		||||
                </div>
 | 
			
		||||
                <div className={style.actortile_name}>{this.props.actor.name}</div>
 | 
			
		||||
                <div className={style.actortile_name}>{this.props.actor.Name}</div>
 | 
			
		||||
            </div>
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ describe('<AddActorPopup/>', function () {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('test api call and insertion of actor tiles', function () {
 | 
			
		||||
        global.callAPIMock([{id: 1, name: 'test'}, {id: 2, name: 'test2'}]);
 | 
			
		||||
        global.callAPIMock([{Id: 1, Name: 'test'}, {Id: 2, Name: 'test2'}]);
 | 
			
		||||
 | 
			
		||||
        const wrapper = shallow(<AddActorPopup/>);
 | 
			
		||||
 | 
			
		||||
@@ -44,7 +44,7 @@ describe('<AddActorPopup/>', function () {
 | 
			
		||||
 | 
			
		||||
        global.callAPIMock({result: 'success'});
 | 
			
		||||
 | 
			
		||||
        wrapper.setState({actors: [{actor_id: 1, name: 'test'}]}, () => {
 | 
			
		||||
        wrapper.setState({actors: [{ActorId: 1, Name: 'test'}]}, () => {
 | 
			
		||||
            wrapper.find('ActorTile').dive().simulate('click');
 | 
			
		||||
 | 
			
		||||
            expect(callAPI).toHaveBeenCalledTimes(1);
 | 
			
		||||
@@ -59,7 +59,7 @@ describe('<AddActorPopup/>', function () {
 | 
			
		||||
 | 
			
		||||
        global.callAPIMock({result: 'nosuccess'});
 | 
			
		||||
 | 
			
		||||
        wrapper.setState({actors: [{actor_id: 1, name: 'test'}]}, () => {
 | 
			
		||||
        wrapper.setState({actors: [{ActorId: 1, Name: 'test'}]}, () => {
 | 
			
		||||
            wrapper.find('ActorTile').dive().simulate('click');
 | 
			
		||||
 | 
			
		||||
            expect(callAPI).toHaveBeenCalledTimes(1);
 | 
			
		||||
@@ -80,7 +80,7 @@ describe('<AddActorPopup/>', function () {
 | 
			
		||||
 | 
			
		||||
        callAPIMock({});
 | 
			
		||||
 | 
			
		||||
        wrapper.setState({actors: [{name: 'test', actor_id: 1}]});
 | 
			
		||||
        wrapper.setState({actors: [{Name: 'test', ActorId: 1}]});
 | 
			
		||||
 | 
			
		||||
        wrapper.find('PopupBase').props().ParentSubmit();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -134,8 +134,8 @@ class AddActorPopup extends React.Component<props, state> {
 | 
			
		||||
        // fetch the available actors
 | 
			
		||||
        callAPI<GeneralSuccess>(APINode.Actor, {
 | 
			
		||||
            action: 'addActorToVideo',
 | 
			
		||||
            actorid: actor.actor_id,
 | 
			
		||||
            videoid: this.props.movie_id
 | 
			
		||||
            ActorId: actor.ActorId,
 | 
			
		||||
            MovieId: this.props.movie_id
 | 
			
		||||
        }, result => {
 | 
			
		||||
            if (result.result === 'success') {
 | 
			
		||||
                // return back to player page
 | 
			
		||||
@@ -170,7 +170,7 @@ class AddActorPopup extends React.Component<props, state> {
 | 
			
		||||
     * @param actor
 | 
			
		||||
     */
 | 
			
		||||
    private filterSearch(actor: ActorType): boolean {
 | 
			
		||||
        return actor.name.toLowerCase().includes(this.state.filter.toLowerCase());
 | 
			
		||||
        return actor.Name.toLowerCase().includes(this.state.filter.toLowerCase());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ describe('<AddTagPopup/>', function () {
 | 
			
		||||
    it('test tag insertion', function () {
 | 
			
		||||
        const wrapper = shallow(<AddTagPopup/>);
 | 
			
		||||
        wrapper.setState({
 | 
			
		||||
            items: [{tag_id: 1, tag_name: 'test'}, {tag_id: 2, tag_name: 'ee'}]
 | 
			
		||||
            items: [{TagId: 1, TagName: 'test'}, {TagId: 2, TagName: 'ee'}]
 | 
			
		||||
        }, () => {
 | 
			
		||||
            expect(wrapper.find('Tag')).toHaveLength(2);
 | 
			
		||||
            expect(wrapper.find('Tag').first().dive().text()).toBe('test');
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ class AddTagPopup extends React.Component<props, state> {
 | 
			
		||||
                    this.state.items.map((i) => (
 | 
			
		||||
                        <Tag tagInfo={i}
 | 
			
		||||
                             onclick={(): void => {
 | 
			
		||||
                                 this.props.submit(i.tag_id, i.tag_name);
 | 
			
		||||
                                 this.props.submit(i.TagId, i.TagName);
 | 
			
		||||
                                 this.props.onHide();
 | 
			
		||||
                             }}/>
 | 
			
		||||
                    )) : null}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ class NewTagPopup extends React.Component<props> {
 | 
			
		||||
     * store the filled in form to the backend
 | 
			
		||||
     */
 | 
			
		||||
    storeselection(): void {
 | 
			
		||||
        callAPI(APINode.Tags, {action: 'createTag', tagname: this.value}, (result: GeneralSuccess) => {
 | 
			
		||||
        callAPI(APINode.Tags, {action: 'createTag', TagName: this.value}, (result: GeneralSuccess) => {
 | 
			
		||||
            if (result.result !== 'success') {
 | 
			
		||||
                console.log('error occured while writing to db -- todo error handling');
 | 
			
		||||
                console.log(result.result);
 | 
			
		||||
 
 | 
			
		||||
@@ -6,12 +6,12 @@ import {shallow} from 'enzyme';
 | 
			
		||||
 | 
			
		||||
describe('<Tag/>', function () {
 | 
			
		||||
    it('renders without crashing ', function () {
 | 
			
		||||
        const wrapper = shallow(<Tag tagInfo={{tag_name: 'testname', tag_id: 1}}/>);
 | 
			
		||||
        const wrapper = shallow(<Tag tagInfo={{TagName: 'testname', TagId: 1}}/>);
 | 
			
		||||
        wrapper.unmount();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('renders childs correctly', function () {
 | 
			
		||||
        const wrapper = shallow(<Tag tagInfo={{tag_name: 'test', tag_id: 1}}/>);
 | 
			
		||||
        const wrapper = shallow(<Tag tagInfo={{TagName: 'test', TagId: 1}}/>);
 | 
			
		||||
        expect(wrapper.children().text()).toBe('test');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
@@ -19,7 +19,7 @@ describe('<Tag/>', function () {
 | 
			
		||||
        const func = jest.fn();
 | 
			
		||||
 | 
			
		||||
        const wrapper = shallow(<Tag
 | 
			
		||||
            tagInfo={{tag_name: 'test', tag_id: 1}}
 | 
			
		||||
            tagInfo={{TagName: 'test', TagId: 1}}
 | 
			
		||||
            onclick={() => {func();}}>test</Tag>);
 | 
			
		||||
 | 
			
		||||
        expect(func).toBeCalledTimes(0);
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ class Tag extends React.Component<props> {
 | 
			
		||||
            return this.renderButton();
 | 
			
		||||
        } else {
 | 
			
		||||
            return (
 | 
			
		||||
                <Link to={'/categories/' + this.props.tagInfo.tag_id}>
 | 
			
		||||
                <Link to={'/categories/' + this.props.tagInfo.TagId}>
 | 
			
		||||
                    {this.renderButton()}
 | 
			
		||||
                </Link>
 | 
			
		||||
            );
 | 
			
		||||
@@ -28,7 +28,7 @@ class Tag extends React.Component<props> {
 | 
			
		||||
    renderButton(): JSX.Element {
 | 
			
		||||
        return (
 | 
			
		||||
            <button className={styles.tagbtn} onClick={(): void => this.TagClick()}
 | 
			
		||||
                    data-testid='Test-Tag'>{this.props.tagInfo.tag_name}</button>
 | 
			
		||||
                    data-testid='Test-Tag'>{this.props.tagInfo.TagName}</button>
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -38,7 +38,7 @@ class Tag extends React.Component<props> {
 | 
			
		||||
    TagClick(): void {
 | 
			
		||||
        if (this.props.onclick) {
 | 
			
		||||
            // call custom onclick handling
 | 
			
		||||
            this.props.onclick(this.props.tagInfo.tag_name); // todo check if param is neccessary
 | 
			
		||||
            this.props.onclick(this.props.tagInfo.TagName); // todo check if param is neccessary
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -40,9 +40,9 @@ class VideoContainer extends React.Component<props, state> {
 | 
			
		||||
            <div className={style.maincontent}>
 | 
			
		||||
                {this.state.loadeditems.map(elem => (
 | 
			
		||||
                    <Preview
 | 
			
		||||
                        key={elem.movie_id}
 | 
			
		||||
                        name={elem.movie_name}
 | 
			
		||||
                        movie_id={elem.movie_id}/>
 | 
			
		||||
                        key={elem.MovieId}
 | 
			
		||||
                        name={elem.MovieName}
 | 
			
		||||
                        movie_id={elem.MovieId}/>
 | 
			
		||||
                ))}
 | 
			
		||||
                {/*todo css for no items to show*/}
 | 
			
		||||
                {this.state.loadeditems.length === 0 ?
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ class ActorOverviewPage extends React.Component<props, state> {
 | 
			
		||||
                    <Button title='Add Actor' onClick={(): void => this.setState({NActorPopupVisible: true})}/>
 | 
			
		||||
                </SideBar>
 | 
			
		||||
                <div className={style.container}>
 | 
			
		||||
                    {this.state.actors.map((el) => (<ActorTile key={el.actor_id} actor={el}/>))}
 | 
			
		||||
                    {this.state.actors.map((el) => (<ActorTile key={el.ActorId} actor={el}/>))}
 | 
			
		||||
                </div>
 | 
			
		||||
                {this.state.NActorPopupVisible ?
 | 
			
		||||
                    <NewActorPopup onHide={(): void => {
 | 
			
		||||
 
 | 
			
		||||
@@ -10,13 +10,13 @@ describe('<ActorPage/>', function () {
 | 
			
		||||
 | 
			
		||||
    it('fetch infos', function () {
 | 
			
		||||
        callAPIMock({
 | 
			
		||||
            videos: [{
 | 
			
		||||
                movie_id: 0,
 | 
			
		||||
                movie_name: 'test'
 | 
			
		||||
            }], info: {
 | 
			
		||||
                thumbnail: '',
 | 
			
		||||
                name: '',
 | 
			
		||||
                actor_id: 0
 | 
			
		||||
            Videos: [{
 | 
			
		||||
                MovieId: 0,
 | 
			
		||||
                MovieName: 'test'
 | 
			
		||||
            }], Info: {
 | 
			
		||||
                Thumbnail: '',
 | 
			
		||||
                Name: '',
 | 
			
		||||
                ActorId: 0
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,13 +31,13 @@ export class ActorPage extends React.Component<props, state> {
 | 
			
		||||
    constructor(props: props) {
 | 
			
		||||
        super(props);
 | 
			
		||||
 | 
			
		||||
        this.state = {data: [], actor: {actor_id: 0, name: '', thumbnail: ''}};
 | 
			
		||||
        this.state = {data: [], actor: {ActorId: 0, Name: '', Thumbnail: ''}};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    render(): JSX.Element {
 | 
			
		||||
        return (
 | 
			
		||||
            <>
 | 
			
		||||
                <PageTitle title={this.state.actor.name} subtitle={this.state.data ? this.state.data.length + ' videos' : null}>
 | 
			
		||||
                <PageTitle title={this.state.actor.Name} subtitle={this.state.data ? this.state.data.length + ' videos' : null}>
 | 
			
		||||
                    <span className={style.overviewbutton}>
 | 
			
		||||
                        <Link to='/actors'>
 | 
			
		||||
                            <Button onClick={(): void => {}} title='Go to Actor overview'/>
 | 
			
		||||
@@ -68,11 +68,11 @@ export class ActorPage extends React.Component<props, state> {
 | 
			
		||||
    getActorInfo(): void {
 | 
			
		||||
        callAPI(APINode.Actor, {
 | 
			
		||||
            action: 'getActorInfo',
 | 
			
		||||
            actorid: this.props.match.params.id
 | 
			
		||||
            ActorId: parseInt(this.props.match.params.id)
 | 
			
		||||
        }, (result: ActorTypes.videofetchresult) => {
 | 
			
		||||
            this.setState({
 | 
			
		||||
                data: result.videos ? result.videos : [],
 | 
			
		||||
                actor: result.info
 | 
			
		||||
                data: result.Videos ? result.Videos : [],
 | 
			
		||||
                actor: result.Info
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -103,8 +103,8 @@ export class CategoryView extends React.Component<CategoryViewProps, CategoryVie
 | 
			
		||||
    private deleteTag(force: boolean): void {
 | 
			
		||||
        callAPI<GeneralSuccess>(APINode.Tags, {
 | 
			
		||||
            action: 'deleteTag',
 | 
			
		||||
            tagId: parseInt(this.props.match.params.id),
 | 
			
		||||
            force: force
 | 
			
		||||
            TagId: parseInt(this.props.match.params.id),
 | 
			
		||||
            Force: force
 | 
			
		||||
        }, result => {
 | 
			
		||||
            console.log(result.result);
 | 
			
		||||
            if (result.result === 'success') {
 | 
			
		||||
 
 | 
			
		||||
@@ -54,8 +54,8 @@ class TagView extends React.Component<props, TagViewState> {
 | 
			
		||||
                <div className={videocontainerstyle.maincontent}>
 | 
			
		||||
                    {this.state.loadedtags ?
 | 
			
		||||
                        this.state.loadedtags.map((m) => (
 | 
			
		||||
                            <Link to={'/categories/' + m.tag_id} key={m.tag_id}>
 | 
			
		||||
                                <TagPreview name={m.tag_name}/></Link>
 | 
			
		||||
                            <Link to={'/categories/' + m.TagId} key={m.TagId}>
 | 
			
		||||
                                <TagPreview name={m.TagName}/></Link>
 | 
			
		||||
                        )) :
 | 
			
		||||
                        'loading'}
 | 
			
		||||
                </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,17 +10,12 @@ import {Route, Switch, withRouter} from 'react-router-dom';
 | 
			
		||||
import {RouteComponentProps} from 'react-router';
 | 
			
		||||
import SearchHandling from './SearchHandling';
 | 
			
		||||
import {VideoTypes} from '../../types/ApiTypes';
 | 
			
		||||
import {DefaultTags} from "../../types/GeneralTypes";
 | 
			
		||||
 | 
			
		||||
interface props extends RouteComponentProps {}
 | 
			
		||||
 | 
			
		||||
interface state {
 | 
			
		||||
    sideinfo: {
 | 
			
		||||
        videonr: number,
 | 
			
		||||
        fullhdvideonr: number,
 | 
			
		||||
        hdvideonr: number,
 | 
			
		||||
        sdvideonr: number,
 | 
			
		||||
        tagnr: number
 | 
			
		||||
    },
 | 
			
		||||
    sideinfo: VideoTypes.startDataType
 | 
			
		||||
    subtitle: string,
 | 
			
		||||
    data: VideoTypes.VideoUnloadedType[],
 | 
			
		||||
    selectionnr: number
 | 
			
		||||
@@ -38,11 +33,12 @@ export class HomePage extends React.Component<props, state> {
 | 
			
		||||
 | 
			
		||||
        this.state = {
 | 
			
		||||
            sideinfo: {
 | 
			
		||||
                videonr: 0,
 | 
			
		||||
                fullhdvideonr: 0,
 | 
			
		||||
                hdvideonr: 0,
 | 
			
		||||
                sdvideonr: 0,
 | 
			
		||||
                tagnr: 0
 | 
			
		||||
                VideoNr: 0,
 | 
			
		||||
                FullHdNr: 0,
 | 
			
		||||
                HDNr: 0,
 | 
			
		||||
                SDNr: 0,
 | 
			
		||||
                DifferentTags: 0,
 | 
			
		||||
                Tagged: 0,
 | 
			
		||||
            },
 | 
			
		||||
            subtitle: 'All Videos',
 | 
			
		||||
            data: [],
 | 
			
		||||
@@ -52,7 +48,7 @@ export class HomePage extends React.Component<props, state> {
 | 
			
		||||
 | 
			
		||||
    componentDidMount(): void {
 | 
			
		||||
        // initial get of all videos
 | 
			
		||||
        this.fetchVideoData('All');
 | 
			
		||||
        this.fetchVideoData(DefaultTags.all.TagId);
 | 
			
		||||
        this.fetchStartData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -62,7 +58,7 @@ export class HomePage extends React.Component<props, state> {
 | 
			
		||||
     *
 | 
			
		||||
     * @param tag tag to fetch videos
 | 
			
		||||
     */
 | 
			
		||||
    fetchVideoData(tag: string): void {
 | 
			
		||||
    fetchVideoData(tag: number): void {
 | 
			
		||||
        callAPI(APINode.Video, {action: 'getMovies', tag: tag}, (result: VideoTypes.VideoUnloadedType[]) => {
 | 
			
		||||
            this.setState({
 | 
			
		||||
                data: []
 | 
			
		||||
@@ -70,7 +66,6 @@ export class HomePage extends React.Component<props, state> {
 | 
			
		||||
            this.setState({
 | 
			
		||||
                data: result,
 | 
			
		||||
                selectionnr: result.length,
 | 
			
		||||
                subtitle: `${tag} Videos`
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -80,15 +75,7 @@ export class HomePage extends React.Component<props, state> {
 | 
			
		||||
     */
 | 
			
		||||
    fetchStartData(): void {
 | 
			
		||||
        callAPI(APINode.Video, {action: 'getStartData'}, (result: VideoTypes.startDataType) => {
 | 
			
		||||
            this.setState({
 | 
			
		||||
                sideinfo: {
 | 
			
		||||
                    videonr: result['total'],
 | 
			
		||||
                    fullhdvideonr: result['fullhd'],
 | 
			
		||||
                    hdvideonr: result['hd'],
 | 
			
		||||
                    sdvideonr: result['sd'],
 | 
			
		||||
                    tagnr: result['tags']
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            this.setState({sideinfo: result});
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -119,17 +106,30 @@ export class HomePage extends React.Component<props, state> {
 | 
			
		||||
                        <SideBar>
 | 
			
		||||
                            <SideBarTitle>Infos:</SideBarTitle>
 | 
			
		||||
                            <Line/>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.videonr}</b> Videos Total!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.fullhdvideonr}</b> FULL-HD Videos!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.hdvideonr}</b> HD Videos!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.sdvideonr}</b> SD Videos!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.tagnr}</b> different Tags!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.VideoNr}</b> Videos Total!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.FullHdNr}</b> FULL-HD Videos!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.HDNr}</b> HD Videos!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.SDNr}</b> SD Videos!</SideBarItem>
 | 
			
		||||
                            <SideBarItem><b>{this.state.sideinfo.DifferentTags}</b> different Tags!</SideBarItem>
 | 
			
		||||
                            <Line/>
 | 
			
		||||
                            <SideBarTitle>Default Tags:</SideBarTitle>
 | 
			
		||||
                            <Tag tagInfo={{tag_name: 'All', tag_id: -1}} onclick={(): void => this.fetchVideoData('All')}/>
 | 
			
		||||
                            <Tag tagInfo={{tag_name: 'FullHd', tag_id: -1}} onclick={(): void => this.fetchVideoData('FullHd')}/>
 | 
			
		||||
                            <Tag tagInfo={{tag_name: 'LowQuality', tag_id: -1}} onclick={(): void => this.fetchVideoData('LowQuality')}/>
 | 
			
		||||
                            <Tag tagInfo={{tag_name: 'HD', tag_id: -1}} onclick={(): void => this.fetchVideoData('HD')}/>
 | 
			
		||||
                            <Tag tagInfo={{TagName: 'All', TagId: DefaultTags.all.TagId}} onclick={(): void => {
 | 
			
		||||
                                this.fetchVideoData(DefaultTags.all.TagId);
 | 
			
		||||
                                this.setState({subtitle: `All Videos`});
 | 
			
		||||
                            }}/>
 | 
			
		||||
                            <Tag tagInfo={{TagName: 'Full Hd', TagId: DefaultTags.fullhd.TagId}} onclick={(): void => {
 | 
			
		||||
                                this.fetchVideoData(DefaultTags.fullhd.TagId);
 | 
			
		||||
                                this.setState({subtitle: `Full Hd Videos`});
 | 
			
		||||
                            }}/>
 | 
			
		||||
                            <Tag tagInfo={{TagName: 'Low Quality', TagId: DefaultTags.lowq.TagId}}
 | 
			
		||||
                                 onclick={(): void => {
 | 
			
		||||
                                     this.fetchVideoData(DefaultTags.lowq.TagId);
 | 
			
		||||
                                     this.setState({subtitle: `Low Quality Videos`});
 | 
			
		||||
                                 }}/>
 | 
			
		||||
                            <Tag tagInfo={{TagName: 'HD', TagId: DefaultTags.hd.TagId}} onclick={(): void => {
 | 
			
		||||
                                this.fetchVideoData(DefaultTags.hd.TagId);
 | 
			
		||||
                                this.setState({subtitle: `HD Videos`});
 | 
			
		||||
                            }}/>
 | 
			
		||||
                        </SideBar>
 | 
			
		||||
                        {this.state.data.length !== 0 ?
 | 
			
		||||
                            <VideoContainer
 | 
			
		||||
 
 | 
			
		||||
@@ -190,15 +190,15 @@ describe('<Player/>', function () {
 | 
			
		||||
        const wrapper = instance();
 | 
			
		||||
        global.callAPIMock({result: 'success'});
 | 
			
		||||
 | 
			
		||||
        wrapper.setState({suggesttag: [{tag_name: 'test', tag_id: 1}]}, () => {
 | 
			
		||||
        wrapper.setState({suggesttag: [{TagName: 'test', TagId: 1}]}, () => {
 | 
			
		||||
            // mock funtion should have not been called
 | 
			
		||||
            expect(callAPI).toBeCalledTimes(0);
 | 
			
		||||
            wrapper.find('Tag').findWhere(p => p.props().tagInfo.tag_name === 'test').dive().simulate('click');
 | 
			
		||||
            wrapper.find('Tag').findWhere(p => p.props().tagInfo.TagName === 'test').dive().simulate('click');
 | 
			
		||||
            // mock function should have been called once
 | 
			
		||||
            expect(callAPI).toBeCalledTimes(1);
 | 
			
		||||
 | 
			
		||||
            // expect tag added to video tags
 | 
			
		||||
            expect(wrapper.state().tags).toMatchObject([{tag_name: 'test'}]);
 | 
			
		||||
            expect(wrapper.state().tags).toMatchObject([{TagName: 'test'}]);
 | 
			
		||||
            // expect tag to be removed from tag suggestions
 | 
			
		||||
            expect(wrapper.state().suggesttag).toHaveLength(0);
 | 
			
		||||
        });
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@ import {ActorType, TagType} from '../../types/VideoTypes';
 | 
			
		||||
import PlyrJS from 'plyr';
 | 
			
		||||
import {Button} from '../../elements/GPElements/Button';
 | 
			
		||||
import {VideoTypes} from '../../types/ApiTypes';
 | 
			
		||||
import GlobalInfos from "../../utils/GlobalInfos";
 | 
			
		||||
 | 
			
		||||
interface myprops extends RouteComponentProps<{ id: string }> {}
 | 
			
		||||
 | 
			
		||||
@@ -131,16 +132,16 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
                <Line/>
 | 
			
		||||
                <SideBarTitle>Tags:</SideBarTitle>
 | 
			
		||||
                {this.state.tags.map((m: TagType) => (
 | 
			
		||||
                    <Tag key={m.tag_id} tagInfo={m}/>
 | 
			
		||||
                    <Tag key={m.TagId} tagInfo={m}/>
 | 
			
		||||
                ))}
 | 
			
		||||
                <Line/>
 | 
			
		||||
                <SideBarTitle>Tag Quickadd:</SideBarTitle>
 | 
			
		||||
                {this.state.suggesttag.map((m: TagType) => (
 | 
			
		||||
                    <Tag
 | 
			
		||||
                        tagInfo={m}
 | 
			
		||||
                        key={m.tag_name}
 | 
			
		||||
                        key={m.TagName}
 | 
			
		||||
                        onclick={(): void => {
 | 
			
		||||
                            this.quickAddTag(m.tag_id, m.tag_name);
 | 
			
		||||
                            this.quickAddTag(m.TagId, m.TagName);
 | 
			
		||||
                        }}/>
 | 
			
		||||
                ))}
 | 
			
		||||
            </SideBar>
 | 
			
		||||
@@ -155,7 +156,7 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
            <div className={style.actorcontainer}>
 | 
			
		||||
                {this.state.actors ?
 | 
			
		||||
                    this.state.actors.map((actr: ActorType) => (
 | 
			
		||||
                        <ActorTile key={actr.actor_id} actor={actr}/>
 | 
			
		||||
                        <ActorTile key={actr.ActorId} actor={actr}/>
 | 
			
		||||
                    )) : <></>
 | 
			
		||||
                }
 | 
			
		||||
                <div className={style.actorAddTile} onClick={(): void => {
 | 
			
		||||
@@ -207,8 +208,8 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
    quickAddTag(tagId: number, tagName: string): void {
 | 
			
		||||
        callAPI(APINode.Tags, {
 | 
			
		||||
            action: 'addTag',
 | 
			
		||||
            id: tagId,
 | 
			
		||||
            movieid: this.props.match.params.id
 | 
			
		||||
            TagId: tagId,
 | 
			
		||||
            MovieId: parseInt(this.props.match.params.id)
 | 
			
		||||
        }, (result: GeneralSuccess) => {
 | 
			
		||||
            if (result.result !== 'success') {
 | 
			
		||||
                console.error('error occured while writing to db -- todo error handling');
 | 
			
		||||
@@ -216,7 +217,7 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
            } else {
 | 
			
		||||
                // check if tag has already been added
 | 
			
		||||
                const tagIndex = this.state.tags.map(function (e: TagType) {
 | 
			
		||||
                    return e.tag_name;
 | 
			
		||||
                    return e.TagName;
 | 
			
		||||
                }).indexOf(tagName);
 | 
			
		||||
 | 
			
		||||
                // only add tag if it isn't already there
 | 
			
		||||
@@ -224,7 +225,7 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
                    // update tags if successful
 | 
			
		||||
                    let array = [...this.state.suggesttag]; // make a separate copy of the array (because of setState)
 | 
			
		||||
                    const quickaddindex = this.state.suggesttag.map(function (e: TagType) {
 | 
			
		||||
                        return e.tag_id;
 | 
			
		||||
                        return e.TagId;
 | 
			
		||||
                    }).indexOf(tagId);
 | 
			
		||||
 | 
			
		||||
                    // check if tag is available in quickadds
 | 
			
		||||
@@ -232,12 +233,12 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
                        array.splice(quickaddindex, 1);
 | 
			
		||||
 | 
			
		||||
                        this.setState({
 | 
			
		||||
                            tags: [...this.state.tags, {tag_name: tagName, tag_id: tagId}],
 | 
			
		||||
                            tags: [...this.state.tags, {TagName: tagName, TagId: tagId}],
 | 
			
		||||
                            suggesttag: array
 | 
			
		||||
                        });
 | 
			
		||||
                    } else {
 | 
			
		||||
                        this.setState({
 | 
			
		||||
                            tags: [...this.state.tags, {tag_name: tagName, tag_id: tagId}]
 | 
			
		||||
                            tags: [...this.state.tags, {TagName: tagName, TagId: tagId}]
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -249,27 +250,28 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
     * fetch all the required infos of a video from backend
 | 
			
		||||
     */
 | 
			
		||||
    fetchMovieData(): void {
 | 
			
		||||
        callAPI(APINode.Video, {action: 'loadVideo', movieid: this.props.match.params.id}, (result: VideoTypes.loadVideoType) => {
 | 
			
		||||
        callAPI(APINode.Video, {action: 'loadVideo', MovieId: parseInt(this.props.match.params.id)}, (result: VideoTypes.loadVideoType) => {
 | 
			
		||||
            console.log(result)
 | 
			
		||||
            this.setState({
 | 
			
		||||
                sources: {
 | 
			
		||||
                    type: 'video',
 | 
			
		||||
                    sources: [
 | 
			
		||||
                        {
 | 
			
		||||
                            src: getBackendDomain() + result.movie_url,
 | 
			
		||||
                            src: getBackendDomain() + GlobalInfos.getVideoPath() + result.MovieUrl,
 | 
			
		||||
                            type: 'video/mp4',
 | 
			
		||||
                            size: 1080
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    poster: result.thumbnail
 | 
			
		||||
                    poster: result.Poster
 | 
			
		||||
                },
 | 
			
		||||
                movie_id: result.movie_id,
 | 
			
		||||
                movie_name: result.movie_name,
 | 
			
		||||
                likes: result.likes,
 | 
			
		||||
                quality: result.quality,
 | 
			
		||||
                length: result.length,
 | 
			
		||||
                tags: result.tags,
 | 
			
		||||
                suggesttag: result.suggesttag,
 | 
			
		||||
                actors: result.actors
 | 
			
		||||
                movie_id: result.MovieId,
 | 
			
		||||
                movie_name: result.MovieName,
 | 
			
		||||
                likes: result.Likes,
 | 
			
		||||
                quality: result.Quality,
 | 
			
		||||
                length: result.Length,
 | 
			
		||||
                tags: result.Tags,
 | 
			
		||||
                suggesttag: result.SuggestedTag,
 | 
			
		||||
                actors: result.Actors
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -279,7 +281,7 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
     * click handler for the like btn
 | 
			
		||||
     */
 | 
			
		||||
    likebtn(): void {
 | 
			
		||||
        callAPI(APINode.Video, {action: 'addLike', movieid: this.props.match.params.id}, (result: GeneralSuccess) => {
 | 
			
		||||
        callAPI(APINode.Video, {action: 'addLike', MovieId: parseInt(this.props.match.params.id)}, (result: GeneralSuccess) => {
 | 
			
		||||
            if (result.result === 'success') {
 | 
			
		||||
                // likes +1 --> avoid reload of all data
 | 
			
		||||
                this.setState({likes: this.state.likes + 1});
 | 
			
		||||
@@ -302,7 +304,7 @@ export class Player extends React.Component<myprops, mystate> {
 | 
			
		||||
     * delete the current video and return to last page
 | 
			
		||||
     */
 | 
			
		||||
    deleteVideo(): void {
 | 
			
		||||
        callAPI(APINode.Video, {action: 'deleteVideo', movieid: this.props.match.params.id}, (result: GeneralSuccess) => {
 | 
			
		||||
        callAPI(APINode.Video, {action: 'deleteVideo', MovieId: parseInt(this.props.match.params.id)}, (result: GeneralSuccess) => {
 | 
			
		||||
            if (result.result === 'success') {
 | 
			
		||||
                // return to last element if successful
 | 
			
		||||
                this.props.history.goBack();
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@ describe('<RandomPage/>', function () {
 | 
			
		||||
 | 
			
		||||
        shallow(<RandomPage/>);
 | 
			
		||||
 | 
			
		||||
        callAPIMock({rows: [], tags: []});
 | 
			
		||||
        callAPIMock({Videos: [], Tags: []});
 | 
			
		||||
 | 
			
		||||
        // trigger the keypress event
 | 
			
		||||
        events.keyup({key: 's'});
 | 
			
		||||
 
 | 
			
		||||
@@ -15,8 +15,8 @@ interface state {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface GetRandomMoviesType {
 | 
			
		||||
    rows: VideoTypes.VideoUnloadedType[];
 | 
			
		||||
    tags: TagType[];
 | 
			
		||||
    Videos: VideoTypes.VideoUnloadedType[];
 | 
			
		||||
    Tags: TagType[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -53,7 +53,7 @@ class RandomPage extends React.Component<{}, state> {
 | 
			
		||||
                <SideBar>
 | 
			
		||||
                    <SideBarTitle>Visible Tags:</SideBarTitle>
 | 
			
		||||
                    {this.state.tags.map((m) => (
 | 
			
		||||
                        <Tag key={m.tag_id} tagInfo={m}/>
 | 
			
		||||
                        <Tag key={m.TagId} tagInfo={m}/>
 | 
			
		||||
                    ))}
 | 
			
		||||
                </SideBar>
 | 
			
		||||
 | 
			
		||||
@@ -84,10 +84,11 @@ class RandomPage extends React.Component<{}, state> {
 | 
			
		||||
     */
 | 
			
		||||
    loadShuffledvideos(nr: number): void {
 | 
			
		||||
        callAPI<GetRandomMoviesType>(APINode.Video, {action: 'getRandomMovies', number: nr}, result => {
 | 
			
		||||
            console.log(result)
 | 
			
		||||
            this.setState({videos: []}); // needed to trigger rerender of main videoview
 | 
			
		||||
            this.setState({
 | 
			
		||||
                videos: result.rows,
 | 
			
		||||
                tags: result.tags
 | 
			
		||||
                videos: result.Videos,
 | 
			
		||||
                tags: result.Tags
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -80,48 +80,48 @@ describe('<GeneralSettings/>', function () {
 | 
			
		||||
    it('test videopath change event', function () {
 | 
			
		||||
        const wrapper = shallow(<GeneralSettings/>);
 | 
			
		||||
 | 
			
		||||
        expect(wrapper.state().videopath).not.toBe('test');
 | 
			
		||||
        expect(wrapper.state().generalSettings.VideoPath).not.toBe('test');
 | 
			
		||||
 | 
			
		||||
        const event = {target: {name: 'pollName', value: 'test'}};
 | 
			
		||||
        wrapper.find('[data-testid=\'videpathform\']').find('FormControl').simulate('change', event);
 | 
			
		||||
        expect(wrapper.state().videopath).toBe('test');
 | 
			
		||||
        expect(wrapper.state().generalSettings.VideoPath).toBe('test');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('test tvshowpath change event', function () {
 | 
			
		||||
        const wrapper = shallow(<GeneralSettings/>);
 | 
			
		||||
 | 
			
		||||
        const event = {target: {name: 'pollName', value: 'test'}};
 | 
			
		||||
        expect(wrapper.state().tvshowpath).not.toBe('test');
 | 
			
		||||
        expect(wrapper.state().generalSettings.EpisodePath).not.toBe('test');
 | 
			
		||||
        wrapper.find('[data-testid=\'tvshowpath\']').find('FormControl').simulate('change', event);
 | 
			
		||||
        expect(wrapper.state().tvshowpath).toBe('test');
 | 
			
		||||
        expect(wrapper.state().generalSettings.EpisodePath).toBe('test');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('test mediacentername-form change event', function () {
 | 
			
		||||
        const wrapper = shallow(<GeneralSettings/>);
 | 
			
		||||
 | 
			
		||||
        const event = {target: {name: 'pollName', value: 'test'}};
 | 
			
		||||
        expect(wrapper.state().mediacentername).not.toBe('test');
 | 
			
		||||
        expect(wrapper.state().generalSettings.MediacenterName).not.toBe('test');
 | 
			
		||||
        wrapper.find('[data-testid=\'nameform\']').find('FormControl').simulate('change', event);
 | 
			
		||||
        expect(wrapper.state().mediacentername).toBe('test');
 | 
			
		||||
        expect(wrapper.state().generalSettings.MediacenterName).toBe('test');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('test password-form change event', function () {
 | 
			
		||||
        const wrapper = shallow(<GeneralSettings/>);
 | 
			
		||||
        wrapper.setState({passwordsupport: true});
 | 
			
		||||
        wrapper.setState({generalSettings : {PasswordEnabled: true}});
 | 
			
		||||
 | 
			
		||||
        const event = {target: {name: 'pollName', value: 'test'}};
 | 
			
		||||
        expect(wrapper.state().password).not.toBe('test');
 | 
			
		||||
        expect(wrapper.state().generalSettings.Password).not.toBe('test');
 | 
			
		||||
        wrapper.find('[data-testid=\'passwordfield\']').find('FormControl').simulate('change', event);
 | 
			
		||||
        expect(wrapper.state().password).toBe('test');
 | 
			
		||||
        expect(wrapper.state().generalSettings.Password).toBe('test');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('test tmdbsupport change event', function () {
 | 
			
		||||
        const wrapper = shallow(<GeneralSettings/>);
 | 
			
		||||
        wrapper.setState({tmdbsupport: true});
 | 
			
		||||
        wrapper.setState({generalSettings : {TMDBGrabbing: true}});
 | 
			
		||||
 | 
			
		||||
        expect(wrapper.state().tmdbsupport).toBe(true);
 | 
			
		||||
        expect(wrapper.state().generalSettings.TMDBGrabbing).toBe(true);
 | 
			
		||||
        wrapper.find('[data-testid=\'tmdb-switch\']').simulate('change');
 | 
			
		||||
        expect(wrapper.state().tmdbsupport).toBe(false);
 | 
			
		||||
        expect(wrapper.state().generalSettings.TMDBGrabbing).toBe(false);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('test insertion of 4 infoheaderitems', function () {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,23 +11,13 @@ import {SettingsTypes} from '../../types/ApiTypes';
 | 
			
		||||
import {GeneralSuccess} from '../../types/GeneralTypes';
 | 
			
		||||
 | 
			
		||||
interface state {
 | 
			
		||||
    passwordsupport: boolean,
 | 
			
		||||
    tmdbsupport: boolean,
 | 
			
		||||
    customapi: boolean,
 | 
			
		||||
 | 
			
		||||
    videopath: string,
 | 
			
		||||
    tvshowpath: string,
 | 
			
		||||
    mediacentername: string,
 | 
			
		||||
    password: string,
 | 
			
		||||
    apipath: string,
 | 
			
		||||
 | 
			
		||||
    videonr: number,
 | 
			
		||||
    dbsize: number,
 | 
			
		||||
    difftagnr: number,
 | 
			
		||||
    tagsadded: number
 | 
			
		||||
    customapi: boolean
 | 
			
		||||
    apipath: string
 | 
			
		||||
    generalSettings: SettingsTypes.loadGeneralSettingsType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface props {}
 | 
			
		||||
interface props {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Component for Generalsettings tag on Settingspage
 | 
			
		||||
@@ -38,20 +28,21 @@ class GeneralSettings extends React.Component<props, state> {
 | 
			
		||||
        super(props);
 | 
			
		||||
 | 
			
		||||
        this.state = {
 | 
			
		||||
            passwordsupport: false,
 | 
			
		||||
            tmdbsupport: false,
 | 
			
		||||
            customapi: false,
 | 
			
		||||
 | 
			
		||||
            videopath: '',
 | 
			
		||||
            tvshowpath: '',
 | 
			
		||||
            mediacentername: '',
 | 
			
		||||
            password: '',
 | 
			
		||||
            apipath: '',
 | 
			
		||||
 | 
			
		||||
            videonr: 0,
 | 
			
		||||
            dbsize: 0,
 | 
			
		||||
            difftagnr: 0,
 | 
			
		||||
            tagsadded: 0
 | 
			
		||||
            generalSettings: {
 | 
			
		||||
                DarkMode: true,
 | 
			
		||||
                DBSize: 0,
 | 
			
		||||
                DifferentTags: 0,
 | 
			
		||||
                EpisodePath: "",
 | 
			
		||||
                MediacenterName: "",
 | 
			
		||||
                Password: "",
 | 
			
		||||
                PasswordEnabled: false,
 | 
			
		||||
                TagsAdded: 0,
 | 
			
		||||
                TMDBGrabbing: false,
 | 
			
		||||
                VideoNr: 0,
 | 
			
		||||
                VideoPath: ""
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -65,19 +56,19 @@ class GeneralSettings extends React.Component<props, state> {
 | 
			
		||||
            <>
 | 
			
		||||
                <div className={style.infoheader}>
 | 
			
		||||
                    <InfoHeaderItem backColor='lightblue'
 | 
			
		||||
                                    text={this.state.videonr}
 | 
			
		||||
                                    text={this.state.generalSettings.VideoNr}
 | 
			
		||||
                                    subtext='Videos in Gravity'
 | 
			
		||||
                                    icon={faArchive}/>
 | 
			
		||||
                    <InfoHeaderItem backColor='yellow'
 | 
			
		||||
                                    text={this.state.dbsize !== undefined ? this.state.dbsize + ' MB' : ''}
 | 
			
		||||
                                    text={this.state.generalSettings.DBSize + ' MB'}
 | 
			
		||||
                                    subtext='Database size'
 | 
			
		||||
                                    icon={faRulerVertical}/>
 | 
			
		||||
                    <InfoHeaderItem backColor='green'
 | 
			
		||||
                                    text={this.state.difftagnr}
 | 
			
		||||
                                    text={this.state.generalSettings.DifferentTags}
 | 
			
		||||
                                    subtext='different Tags'
 | 
			
		||||
                                    icon={faAddressCard}/>
 | 
			
		||||
                    <InfoHeaderItem backColor='orange'
 | 
			
		||||
                                    text={this.state.tagsadded}
 | 
			
		||||
                                    text={this.state.generalSettings.TagsAdded}
 | 
			
		||||
                                    subtext='tags added'
 | 
			
		||||
                                    icon={faBalanceScaleLeft}/>
 | 
			
		||||
                </div>
 | 
			
		||||
@@ -89,15 +80,26 @@ class GeneralSettings extends React.Component<props, state> {
 | 
			
		||||
                        <Form.Row>
 | 
			
		||||
                            <Form.Group as={Col} data-testid='videpathform'>
 | 
			
		||||
                                <Form.Label>Video Path</Form.Label>
 | 
			
		||||
                                <Form.Control type='text' placeholder='/var/www/html/video' value={this.state.videopath}
 | 
			
		||||
                                              onChange={(ee): void => this.setState({videopath: ee.target.value})}/>
 | 
			
		||||
                                <Form.Control type='text' placeholder='/var/www/html/video'
 | 
			
		||||
                                              value={this.state.generalSettings.VideoPath}
 | 
			
		||||
                                              onChange={(ee): void => this.setState({
 | 
			
		||||
                                                  generalSettings: {
 | 
			
		||||
                                                      ...this.state.generalSettings,
 | 
			
		||||
                                                      VideoPath: ee.target.value
 | 
			
		||||
                                                  }
 | 
			
		||||
                                              })}/>
 | 
			
		||||
                            </Form.Group>
 | 
			
		||||
 | 
			
		||||
                            <Form.Group as={Col} data-testid='tvshowpath'>
 | 
			
		||||
                                <Form.Label>TV Show Path</Form.Label>
 | 
			
		||||
                                <Form.Control type='text' placeholder='/var/www/html/tvshow'
 | 
			
		||||
                                              value={this.state.tvshowpath}
 | 
			
		||||
                                              onChange={(e): void => this.setState({tvshowpath: e.target.value})}/>
 | 
			
		||||
                                              value={this.state.generalSettings.EpisodePath}
 | 
			
		||||
                                              onChange={(e): void => this.setState({
 | 
			
		||||
                                                  generalSettings: {
 | 
			
		||||
                                                      ...this.state.generalSettings,
 | 
			
		||||
                                                      EpisodePath: e.target.value
 | 
			
		||||
                                                  }
 | 
			
		||||
                                              })}/>
 | 
			
		||||
                            </Form.Group>
 | 
			
		||||
                        </Form.Row>
 | 
			
		||||
 | 
			
		||||
@@ -131,17 +133,28 @@ class GeneralSettings extends React.Component<props, state> {
 | 
			
		||||
                            id='custom-switch'
 | 
			
		||||
                            data-testid='passwordswitch'
 | 
			
		||||
                            label='Enable Password support'
 | 
			
		||||
                            checked={this.state.passwordsupport}
 | 
			
		||||
                            checked={this.state.generalSettings.PasswordEnabled}
 | 
			
		||||
                            onChange={(): void => {
 | 
			
		||||
                                this.setState({passwordsupport: !this.state.passwordsupport});
 | 
			
		||||
                                this.setState({
 | 
			
		||||
                                    generalSettings: {
 | 
			
		||||
                                        ...this.state.generalSettings,
 | 
			
		||||
                                        PasswordEnabled: !this.state.generalSettings.PasswordEnabled
 | 
			
		||||
                                    }
 | 
			
		||||
                                });
 | 
			
		||||
                            }}
 | 
			
		||||
                        />
 | 
			
		||||
 | 
			
		||||
                        {this.state.passwordsupport ?
 | 
			
		||||
                        {this.state.generalSettings.PasswordEnabled ?
 | 
			
		||||
                            <Form.Group data-testid='passwordfield'>
 | 
			
		||||
                                <Form.Label>Password</Form.Label>
 | 
			
		||||
                                <Form.Control type='password' placeholder='**********' value={this.state.password}
 | 
			
		||||
                                              onChange={(e): void => this.setState({password: e.target.value})}/>
 | 
			
		||||
                                <Form.Control type='password' placeholder='**********'
 | 
			
		||||
                                              value={this.state.generalSettings.Password}
 | 
			
		||||
                                              onChange={(e): void => this.setState({
 | 
			
		||||
                                                  generalSettings: {
 | 
			
		||||
                                                      ...this.state.generalSettings,
 | 
			
		||||
                                                      Password: e.target.value
 | 
			
		||||
                                                  }
 | 
			
		||||
                                              })}/>
 | 
			
		||||
                            </Form.Group> : null
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
@@ -150,9 +163,14 @@ class GeneralSettings extends React.Component<props, state> {
 | 
			
		||||
                            id='custom-switch-2'
 | 
			
		||||
                            data-testid='tmdb-switch'
 | 
			
		||||
                            label='Enable TMDB video grabbing support'
 | 
			
		||||
                            checked={this.state.tmdbsupport}
 | 
			
		||||
                            checked={this.state.generalSettings.TMDBGrabbing}
 | 
			
		||||
                            onChange={(): void => {
 | 
			
		||||
                                this.setState({tmdbsupport: !this.state.tmdbsupport});
 | 
			
		||||
                                this.setState({
 | 
			
		||||
                                    generalSettings: {
 | 
			
		||||
                                        ...this.state.generalSettings,
 | 
			
		||||
                                        TMDBGrabbing: !this.state.generalSettings.TMDBGrabbing
 | 
			
		||||
                                    }
 | 
			
		||||
                                });
 | 
			
		||||
                            }}
 | 
			
		||||
                        />
 | 
			
		||||
 | 
			
		||||
@@ -171,8 +189,14 @@ class GeneralSettings extends React.Component<props, state> {
 | 
			
		||||
 | 
			
		||||
                        <Form.Group className={style.mediacenternameform} data-testid='nameform'>
 | 
			
		||||
                            <Form.Label>The name of the Mediacenter</Form.Label>
 | 
			
		||||
                            <Form.Control type='text' placeholder='Mediacentername' value={this.state.mediacentername}
 | 
			
		||||
                                          onChange={(e): void => this.setState({mediacentername: e.target.value})}/>
 | 
			
		||||
                            <Form.Control type='text' placeholder='Mediacentername'
 | 
			
		||||
                                          value={this.state.generalSettings.MediacenterName}
 | 
			
		||||
                                          onChange={(e): void => this.setState({
 | 
			
		||||
                                              generalSettings: {
 | 
			
		||||
                                                  ...this.state.generalSettings,
 | 
			
		||||
                                                  MediacenterName: e.target.value
 | 
			
		||||
                                              }
 | 
			
		||||
                                          })}/>
 | 
			
		||||
                        </Form.Group>
 | 
			
		||||
 | 
			
		||||
                        <Button variant='primary' type='submit'>
 | 
			
		||||
@@ -192,19 +216,7 @@ class GeneralSettings extends React.Component<props, state> {
 | 
			
		||||
     */
 | 
			
		||||
    loadSettings(): void {
 | 
			
		||||
        callAPI(APINode.Settings, {action: 'loadGeneralSettings'}, (result: SettingsTypes.loadGeneralSettingsType) => {
 | 
			
		||||
            this.setState({
 | 
			
		||||
                videopath: result.video_path,
 | 
			
		||||
                tvshowpath: result.episode_path,
 | 
			
		||||
                mediacentername: result.mediacenter_name,
 | 
			
		||||
                password: result.password,
 | 
			
		||||
                passwordsupport: result.passwordEnabled,
 | 
			
		||||
                tmdbsupport: result.TMDB_grabbing,
 | 
			
		||||
 | 
			
		||||
                videonr: result.videonr,
 | 
			
		||||
                dbsize: result.dbsize,
 | 
			
		||||
                difftagnr: result.difftagnr,
 | 
			
		||||
                tagsadded: result.tagsadded
 | 
			
		||||
            });
 | 
			
		||||
            this.setState({generalSettings: result});
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -212,14 +224,15 @@ class GeneralSettings extends React.Component<props, state> {
 | 
			
		||||
     * save the selected and typed settings to the backend
 | 
			
		||||
     */
 | 
			
		||||
    saveSettings(): void {
 | 
			
		||||
        let settings = this.state.generalSettings;
 | 
			
		||||
        if(!this.state.generalSettings.PasswordEnabled){
 | 
			
		||||
            settings.Password = '-1';
 | 
			
		||||
        }
 | 
			
		||||
        settings.DarkMode = GlobalInfos.isDarkTheme()
 | 
			
		||||
 | 
			
		||||
        callAPI(APINode.Settings, {
 | 
			
		||||
            action: 'saveGeneralSettings',
 | 
			
		||||
            password: this.state.passwordsupport ? this.state.password : '-1',
 | 
			
		||||
            videopath: this.state.videopath,
 | 
			
		||||
            tvshowpath: this.state.tvshowpath,
 | 
			
		||||
            mediacentername: this.state.mediacentername,
 | 
			
		||||
            tmdbsupport: this.state.tmdbsupport,
 | 
			
		||||
            darkmodeenabled: GlobalInfos.isDarkTheme().toString()
 | 
			
		||||
            Settings: settings
 | 
			
		||||
        }, (result: GeneralSuccess) => {
 | 
			
		||||
            if (result.result) {
 | 
			
		||||
                console.log('successfully saved settings');
 | 
			
		||||
 
 | 
			
		||||
@@ -52,10 +52,9 @@ describe('<MovieSettings/>', function () {
 | 
			
		||||
 | 
			
		||||
    it('content available received and in state', () => {
 | 
			
		||||
        const wrapper = shallow(<MovieSettings/>);
 | 
			
		||||
 | 
			
		||||
        callAPIMock({
 | 
			
		||||
            contentAvailable: true,
 | 
			
		||||
            message: 'firstline\nsecondline'
 | 
			
		||||
            ContentAvailable: true,
 | 
			
		||||
            Messages: ['firstline', 'secondline']
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        wrapper.instance().updateStatus();
 | 
			
		||||
@@ -70,7 +69,8 @@ describe('<MovieSettings/>', function () {
 | 
			
		||||
 | 
			
		||||
    it('test reindex with no content available', () => {
 | 
			
		||||
        callAPIMock({
 | 
			
		||||
            contentAvailable: false
 | 
			
		||||
            Messages: [],
 | 
			
		||||
            ContentAvailable: false
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        global.clearInterval = jest.fn();
 | 
			
		||||
@@ -99,12 +99,12 @@ describe('<MovieSettings/>', function () {
 | 
			
		||||
        expect(wrapper.instance().setState).toBeCalledTimes(1);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('test no textDiv insertion if string is empty', function () {
 | 
			
		||||
    it('expect insertion before existing ones', function () {
 | 
			
		||||
        const wrapper = shallow(<MovieSettings/>);
 | 
			
		||||
 | 
			
		||||
        callAPIMock({
 | 
			
		||||
            contentAvailable: true,
 | 
			
		||||
            message: 'test'
 | 
			
		||||
            ContentAvailable: true,
 | 
			
		||||
            Messages: ['test']
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        wrapper.instance().updateStatus();
 | 
			
		||||
@@ -115,14 +115,14 @@ describe('<MovieSettings/>', function () {
 | 
			
		||||
 | 
			
		||||
        // expect an untouched state if we try to add an empty string...
 | 
			
		||||
        callAPIMock({
 | 
			
		||||
            contentAvailable: true,
 | 
			
		||||
            message: ''
 | 
			
		||||
            ContentAvailable: true,
 | 
			
		||||
            Messages: ['']
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        wrapper.instance().updateStatus();
 | 
			
		||||
 | 
			
		||||
        expect(wrapper.state()).toMatchObject({
 | 
			
		||||
            text: ['test']
 | 
			
		||||
            text: ['', 'test']
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -58,11 +58,7 @@ class MovieSettings extends React.Component<props, state> {
 | 
			
		||||
     */
 | 
			
		||||
    startReindex(): void {
 | 
			
		||||
        // clear output text before start
 | 
			
		||||
        this.setState({text: []});
 | 
			
		||||
 | 
			
		||||
        this.setState({startbtnDisabled: true});
 | 
			
		||||
 | 
			
		||||
        console.log('starting');
 | 
			
		||||
        this.setState({text: [], startbtnDisabled: true});
 | 
			
		||||
 | 
			
		||||
        callAPI(APINode.Settings, {action: 'startReindex'}, (result: GeneralSuccess): void => {
 | 
			
		||||
            console.log(result);
 | 
			
		||||
@@ -85,18 +81,12 @@ class MovieSettings extends React.Component<props, state> {
 | 
			
		||||
     */
 | 
			
		||||
    updateStatus = (): void => {
 | 
			
		||||
        callAPI(APINode.Settings, {action: 'getStatusMessage'}, (result: SettingsTypes.getStatusMessageType) => {
 | 
			
		||||
            if (result.contentAvailable) {
 | 
			
		||||
                // ignore if message is empty
 | 
			
		||||
                console.log(result);
 | 
			
		||||
                if(result.message === '') return;
 | 
			
		||||
 | 
			
		||||
                // todo 2020-07-4: scroll to bottom of div here
 | 
			
		||||
                this.setState({
 | 
			
		||||
                    // insert a string for each line
 | 
			
		||||
                    text: [...result.message.split('\n'),
 | 
			
		||||
                        ...this.state.text]
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
            this.setState({
 | 
			
		||||
                // insert a string for each line
 | 
			
		||||
                text: [...result.Messages, ...this.state.text]
 | 
			
		||||
            });
 | 
			
		||||
            // todo 2020-07-4: scroll to bottom of div here
 | 
			
		||||
            if (!result.ContentAvailable) {
 | 
			
		||||
                // clear refresh interval if no content available
 | 
			
		||||
                clearInterval(this.myinterval);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,56 +2,59 @@ import {ActorType, TagType} from './VideoTypes';
 | 
			
		||||
 | 
			
		||||
export namespace VideoTypes {
 | 
			
		||||
    export interface loadVideoType {
 | 
			
		||||
        movie_url: string
 | 
			
		||||
        thumbnail: string
 | 
			
		||||
        movie_id: number
 | 
			
		||||
        movie_name: string
 | 
			
		||||
        likes: number
 | 
			
		||||
        quality: number
 | 
			
		||||
        length: number
 | 
			
		||||
        tags: TagType[]
 | 
			
		||||
        suggesttag: TagType[]
 | 
			
		||||
        actors: ActorType[]
 | 
			
		||||
        MovieUrl: string
 | 
			
		||||
        Poster: string
 | 
			
		||||
        MovieId: number
 | 
			
		||||
        MovieName: string
 | 
			
		||||
        Likes: number
 | 
			
		||||
        Quality: number
 | 
			
		||||
        Length: number
 | 
			
		||||
        Tags: TagType[]
 | 
			
		||||
        SuggestedTag: TagType[]
 | 
			
		||||
        Actors: ActorType[]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export interface startDataType {
 | 
			
		||||
        total: number;
 | 
			
		||||
        fullhd: number;
 | 
			
		||||
        hd: number;
 | 
			
		||||
        sd: number;
 | 
			
		||||
        tags: number;
 | 
			
		||||
        VideoNr: number;
 | 
			
		||||
        FullHdNr: number;
 | 
			
		||||
        HDNr: number;
 | 
			
		||||
        SDNr: number;
 | 
			
		||||
        DifferentTags: number;
 | 
			
		||||
        Tagged: number;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export interface VideoUnloadedType {
 | 
			
		||||
        movie_id: number;
 | 
			
		||||
        movie_name: string
 | 
			
		||||
        MovieId: number;
 | 
			
		||||
        MovieName: string
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export namespace SettingsTypes {
 | 
			
		||||
    export interface initialApiCallData {
 | 
			
		||||
        DarkMode: boolean;
 | 
			
		||||
        passwordEnabled: boolean;
 | 
			
		||||
        mediacenter_name: string;
 | 
			
		||||
        Password: boolean;
 | 
			
		||||
        Mediacenter_name: string;
 | 
			
		||||
        VideoPath: string;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export interface loadGeneralSettingsType {
 | 
			
		||||
        video_path: string,
 | 
			
		||||
        episode_path: string,
 | 
			
		||||
        mediacenter_name: string,
 | 
			
		||||
        password: string,
 | 
			
		||||
        passwordEnabled: boolean,
 | 
			
		||||
        TMDB_grabbing: boolean,
 | 
			
		||||
        VideoPath: string,
 | 
			
		||||
        EpisodePath: string,
 | 
			
		||||
        MediacenterName: string,
 | 
			
		||||
        Password: string,
 | 
			
		||||
        PasswordEnabled: boolean,
 | 
			
		||||
        TMDBGrabbing: boolean,
 | 
			
		||||
        DarkMode: boolean,
 | 
			
		||||
 | 
			
		||||
        videonr: number,
 | 
			
		||||
        dbsize: number,
 | 
			
		||||
        difftagnr: number,
 | 
			
		||||
        tagsadded: number
 | 
			
		||||
        VideoNr: number,
 | 
			
		||||
        DBSize: number,
 | 
			
		||||
        DifferentTags: number,
 | 
			
		||||
        TagsAdded: number
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export interface getStatusMessageType {
 | 
			
		||||
        contentAvailable: boolean;
 | 
			
		||||
        message: string;
 | 
			
		||||
        ContentAvailable: boolean;
 | 
			
		||||
        Messages: string[];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -60,7 +63,7 @@ export namespace ActorTypes {
 | 
			
		||||
     * result of actor fetch
 | 
			
		||||
     */
 | 
			
		||||
    export interface videofetchresult {
 | 
			
		||||
        videos: VideoTypes.VideoUnloadedType[];
 | 
			
		||||
        info: ActorType;
 | 
			
		||||
        Videos: VideoTypes.VideoUnloadedType[];
 | 
			
		||||
        Info: ActorType;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,8 @@ interface TagarrayType {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const DefaultTags: TagarrayType = {
 | 
			
		||||
    all: {tag_id: 1, tag_name: 'all'},
 | 
			
		||||
    fullhd: {tag_id: 2, tag_name: 'fullhd'},
 | 
			
		||||
    lowq: {tag_id: 3, tag_name: 'lowquality'},
 | 
			
		||||
    hd: {tag_id: 4, tag_name: 'hd'}
 | 
			
		||||
    all: {TagId: 1, TagName: 'all'},
 | 
			
		||||
    fullhd: {TagId: 2, TagName: 'fullhd'},
 | 
			
		||||
    lowq: {TagId: 3, TagName: 'lowquality'},
 | 
			
		||||
    hd: {TagId: 4, TagName: 'hd'}
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,12 @@
 | 
			
		||||
 * type accepted by Tag component
 | 
			
		||||
 */
 | 
			
		||||
export interface TagType {
 | 
			
		||||
    tag_name: string
 | 
			
		||||
    tag_id: number
 | 
			
		||||
    TagName: string
 | 
			
		||||
    TagId: number
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ActorType {
 | 
			
		||||
    thumbnail: string;
 | 
			
		||||
    name: string;
 | 
			
		||||
    actor_id: number;
 | 
			
		||||
    Thumbnail: string;
 | 
			
		||||
    Name: string;
 | 
			
		||||
    ActorId: number;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -40,20 +40,7 @@ function getAPIDomain(): string {
 | 
			
		||||
interface ApiBaseRequest {
 | 
			
		||||
    action: string | number,
 | 
			
		||||
 | 
			
		||||
    [_: string]: string | number | boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * helper function to build a formdata for requesting post data correctly
 | 
			
		||||
 * @param args api request object
 | 
			
		||||
 */
 | 
			
		||||
function buildFormData(args: ApiBaseRequest): FormData {
 | 
			
		||||
    const req = new FormData();
 | 
			
		||||
 | 
			
		||||
    for (const i in args) {
 | 
			
		||||
        req.append(i, (args[i].toString()));
 | 
			
		||||
    }
 | 
			
		||||
    return req;
 | 
			
		||||
    [_: string]: string | number | boolean | object
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -64,7 +51,7 @@ function buildFormData(args: ApiBaseRequest): FormData {
 | 
			
		||||
 * @param errorcallback a optional callback if an error occured
 | 
			
		||||
 */
 | 
			
		||||
export function callAPI<T>(apinode: APINode, fd: ApiBaseRequest, callback: (_: T) => void, errorcallback: (_: string) => void = (_: string): void => {}): void {
 | 
			
		||||
    fetch(getAPIDomain() + apinode, {method: 'POST', body: buildFormData(fd)})
 | 
			
		||||
    fetch(getAPIDomain() + apinode, {method: 'POST', body: JSON.stringify(fd)})
 | 
			
		||||
        .then((response) => response.json()
 | 
			
		||||
            .then((result) => {
 | 
			
		||||
                callback(result);
 | 
			
		||||
@@ -78,7 +65,7 @@ export function callAPI<T>(apinode: APINode, fd: ApiBaseRequest, callback: (_: T
 | 
			
		||||
 * @param callback the callback with PLAIN text reply from backend
 | 
			
		||||
 */
 | 
			
		||||
export function callAPIPlain(apinode: APINode, fd: ApiBaseRequest, callback: (_: string) => void): void {
 | 
			
		||||
    fetch(getAPIDomain() + apinode, {method: 'POST', body: buildFormData(fd)})
 | 
			
		||||
    fetch(getAPIDomain() + apinode, {method: 'POST', body: JSON.stringify(fd)})
 | 
			
		||||
        .then((response) => response.text()
 | 
			
		||||
            .then((result) => {
 | 
			
		||||
                callback(result);
 | 
			
		||||
@@ -90,8 +77,8 @@ export function callAPIPlain(apinode: APINode, fd: ApiBaseRequest, callback: (_:
 | 
			
		||||
 * API nodes definitions
 | 
			
		||||
 */
 | 
			
		||||
export enum APINode {
 | 
			
		||||
    Settings = 'settings.php',
 | 
			
		||||
    Tags = 'tags.php',
 | 
			
		||||
    Actor = 'actor.php',
 | 
			
		||||
    Video = 'video.php'
 | 
			
		||||
    Settings = 'settings',
 | 
			
		||||
    Tags = 'tags',
 | 
			
		||||
    Actor = 'actor',
 | 
			
		||||
    Video = 'video'
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,31 +6,47 @@ import lighttheme from '../AppLightTheme.module.css';
 | 
			
		||||
 * it contains general infos about app - like theme
 | 
			
		||||
 */
 | 
			
		||||
class StaticInfos {
 | 
			
		||||
    #darktheme = true;
 | 
			
		||||
    private darktheme: boolean = true;
 | 
			
		||||
    private videopath: string = ""
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * check if the current theme is the dark theme
 | 
			
		||||
     * @returns {boolean} is dark theme?
 | 
			
		||||
     */
 | 
			
		||||
    isDarkTheme() {
 | 
			
		||||
        return this.#darktheme;
 | 
			
		||||
    isDarkTheme(): boolean {
 | 
			
		||||
        return this.darktheme;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setter to enable or disable the dark or light theme
 | 
			
		||||
     * @param enable enable the dark theme?
 | 
			
		||||
     */
 | 
			
		||||
    enableDarkTheme(enable = true) {
 | 
			
		||||
        this.#darktheme = enable;
 | 
			
		||||
    enableDarkTheme(enable = true): void {
 | 
			
		||||
        this.darktheme = enable;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * get the currently selected theme stylesheet
 | 
			
		||||
     * @returns {*} the style object of the current active theme
 | 
			
		||||
     */
 | 
			
		||||
    getThemeStyle() {
 | 
			
		||||
    getThemeStyle(): { [_: string]: string } {
 | 
			
		||||
        return this.isDarkTheme() ? darktheme : lighttheme;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * set the current videopath
 | 
			
		||||
     * @param vidpath videopath with beginning and ending slash
 | 
			
		||||
     */
 | 
			
		||||
    setVideoPath(vidpath: string): void {
 | 
			
		||||
        this.videopath = vidpath;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * return the current videopath
 | 
			
		||||
     */
 | 
			
		||||
    getVideoPath(): string {
 | 
			
		||||
        return this.videopath;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const GlobalInfos = new StaticInfos();
 | 
			
		||||
		Reference in New Issue
	
	Block a user