mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-11-04 05:27:04 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			163 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import React from 'react';
 | 
						|
import { FormBuilder, Icon, Input } from "../../components/";
 | 
						|
import { Backend, Config } from "../../model/";
 | 
						|
import { FormObjToJSON, notify, format, createFormBackend } from "../../helpers/";
 | 
						|
 | 
						|
import "./dashboard.scss";
 | 
						|
 | 
						|
export class DashboardPage extends React.Component {
 | 
						|
    constructor(props){
 | 
						|
        super(props);
 | 
						|
        this.state = {
 | 
						|
            backend_enabled: [],
 | 
						|
            backend_available: [],
 | 
						|
            config: null
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    componentWillMount(){
 | 
						|
        Promise.all([
 | 
						|
            Backend.all(),
 | 
						|
            Config.all()
 | 
						|
        ]).then((data) => {
 | 
						|
            let [backend, config] = data;
 | 
						|
            this.setState({
 | 
						|
                backend_available: backend,
 | 
						|
                backend_enabled: window.CONFIG["connections"].map((conn) => {
 | 
						|
                    return createFormBackend(backend, conn);
 | 
						|
                }),
 | 
						|
                config: config
 | 
						|
            });
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    onChange(e){
 | 
						|
        this.setState({refresh: Math.random()}); // refresh the screen to refresh the mutation
 | 
						|
                                                 // that have happenned down the stack
 | 
						|
 | 
						|
        let json = FormObjToJSON(this.state.config);
 | 
						|
        json.connections = this.state.backend_enabled.map((backend) => {
 | 
						|
            let data = FormObjToJSON(backend, (obj, key) => {
 | 
						|
                if(obj[key].enabled === true){
 | 
						|
                    obj[key] = obj[key].value || obj[key].default;
 | 
						|
                } else {
 | 
						|
                    delete obj[key];
 | 
						|
                }
 | 
						|
            });
 | 
						|
            const key = Object.keys(data)[0];
 | 
						|
            return data[key];
 | 
						|
        });
 | 
						|
 | 
						|
        // persist config object in the backend
 | 
						|
        Config.save(json, true, () => {
 | 
						|
            this.componentWillMount();
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    addBackend(backend_id){
 | 
						|
        this.setState({
 | 
						|
            backend_enabled: this.state.backend_enabled.concat(
 | 
						|
                createFormBackend(this.state.backend_available, {
 | 
						|
                    type: backend_id,
 | 
						|
                    label: backend_id.toUpperCase()
 | 
						|
                })
 | 
						|
            )
 | 
						|
        }, this.onChange.bind(this));
 | 
						|
    }
 | 
						|
 | 
						|
    removeBackend(n){
 | 
						|
        this.setState({
 | 
						|
            backend_enabled: this.state.backend_enabled.filter((_, i) => i !== n)
 | 
						|
        }, this.onChange.bind(this));
 | 
						|
    }
 | 
						|
 | 
						|
    render(){
 | 
						|
        const update = (value, struct) => {
 | 
						|
            struct.enabled = value;
 | 
						|
            this.setState({refresh: Math.random()});
 | 
						|
            if(value === false){
 | 
						|
                struct.value = null;
 | 
						|
            }
 | 
						|
            return;
 | 
						|
        };
 | 
						|
 | 
						|
        const enable = (struct) => {
 | 
						|
            if(typeof struct.value === "string"){
 | 
						|
                struct.enabled = true;
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
            return !!struct.enabled;
 | 
						|
        };
 | 
						|
 | 
						|
        return (
 | 
						|
            <div className="component_dashboard">
 | 
						|
              <h2>Dashboard</h2>
 | 
						|
              <div className="box-element">
 | 
						|
                {
 | 
						|
                    Object.keys(this.state.backend_available).sort((a, b) => a > b).map((backend_available, index) => {
 | 
						|
                        return (
 | 
						|
                            <div key={index} className="backend">
 | 
						|
                              <div>
 | 
						|
                                {backend_available}
 | 
						|
                                <span className="no-select" onClick={this.addBackend.bind(this, backend_available)}>
 | 
						|
                                  +
 | 
						|
                                </span>
 | 
						|
                              </div>
 | 
						|
                            </div>
 | 
						|
                        );
 | 
						|
                    })
 | 
						|
                }
 | 
						|
              </div>
 | 
						|
              <form>
 | 
						|
                {
 | 
						|
                    this.state.backend_enabled.map((backend_enable, index) => {
 | 
						|
                        return (
 | 
						|
                            <div key={index}>
 | 
						|
                              <div className="icons no-select" onClick={this.removeBackend.bind(this, index)}>
 | 
						|
                                <Icon name="delete" />
 | 
						|
                              </div>
 | 
						|
                              <FormBuilder onChange={this.onChange.bind(this)} idx={index} key={index}
 | 
						|
                                           form={{"": backend_enable}}
 | 
						|
                                           render={ ($input, props, struct, onChange) => {
 | 
						|
                                               let $checkbox = (
 | 
						|
                                                   <Input type="checkbox" style={{width: "inherit", marginRight: '6px', top: '6px'}}
 | 
						|
                                                          checked={enable(struct)} onChange={(e) => onChange(update.bind(this, e.target.checked))}/>
 | 
						|
                                               );
 | 
						|
                                               if(struct.label === "label"){
 | 
						|
                                                   $checkbox = null;
 | 
						|
                                               } else if(struct.readonly === true) {
 | 
						|
                                                   $checkbox = null;
 | 
						|
                                               }
 | 
						|
                                               return (
 | 
						|
                                                   <label className={"no-select input_type_" + props.params["type"]}>
 | 
						|
                                                     <div>
 | 
						|
                                                       <span>
 | 
						|
                                                         { $checkbox }
 | 
						|
                                                         { format(struct.label) }:
 | 
						|
                                                       </span>
 | 
						|
                                                       <div style={{width: '100%'}}>
 | 
						|
                                                         { $input }
 | 
						|
                                                       </div>
 | 
						|
                                                     </div>
 | 
						|
                                                     <div>
 | 
						|
                                                       <span className="nothing"></span>
 | 
						|
                                                       <div style={{width: '100%'}}>
 | 
						|
                                                         {
 | 
						|
                                                             struct.description ? (<div className="description">{struct.description}</div>) : null
 | 
						|
                                                         }
 | 
						|
                                                       </div>
 | 
						|
                                                     </div>
 | 
						|
                                                   </label>
 | 
						|
                                               );
 | 
						|
                                           }} />
 | 
						|
                            </div>
 | 
						|
                        );
 | 
						|
                    })
 | 
						|
                }
 | 
						|
              </form>
 | 
						|
            </div>
 | 
						|
        );
 | 
						|
    }
 | 
						|
}
 |