Skip to content
Snippets Groups Projects
spaceselect.tsx 1.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { ChangeEvent } from "react";
    
    import { ReactNode } from "react";
    
    import { listAllSpaces } from "../../../datasets";
    import "./spaceselect.css";
    
    type propTypes = {
        onLoadSpace: (spaceId: string) => boolean;
    };
    
    type stateTypes = {
        spaces: string[];
    };
    
    export class SpaceSelect extends React.Component<propTypes, stateTypes> {
        constructor(props: propTypes) {
            super(props);
            this.state = {
                spaces: [],
            };
    
            this.handleSelectChange = this.handleSelectChange.bind(this);
            this.updateSpaceList = this.updateSpaceList.bind(this);
    
            listAllSpaces().then(this.updateSpaceList);
        }
    
    
        /**
         * Render list of spaces as available options.
         * @param spaceList Array containing all available space names.
         */
    
        updateSpaceList(spaceList: string[]) {
            this.setState({
                spaces: spaceList,
            });
        }
    
    
        /**
         * Triggered when another option (space) is selected. Calls given function to load specified space.
         * @param e Select-event that references the select element and allows to access the new value (space).
         */
    
        handleSelectChange(e: ChangeEvent<HTMLSelectElement>) {
            const success = this.props.onLoadSpace(e.target.value);
    
            if (!success) {
                alert("Failed to load space with id [" + e.target.value + "]");
            }
        }
    
    
        render(): ReactNode {
            return (
    
                <div id="spaceselect">
    
                    <select onChange={this.handleSelectChange}>
                        {this.state.spaces.map((spaceName: string) => (
                            <option key={spaceName} value={spaceName}>
                                {spaceName}
                            </option>
                        ))}
    
                    </select>