zhongrj
2025-11-25 b89962006164a462404b79a738bee8cbb6d7fe7e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import PropTypes from 'prop-types';
import { Component } from "react";
import { Modal, Button } from "react-bootstrap";
import Select from 'react-select';
import "./LibraryDialog.scss";
 
export default class LibraryDialog extends Component {
    static defaultProps = {
        platform: null,
    };
    static propTypes = {
        onHide: PropTypes.func.isRequired,
        onSubmit: PropTypes.func.isRequired,
        platform: PropTypes.object,
        apiURL: PropTypes.string.isRequired,
  }
 
  constructor(props){
    super(props);
 
    this.state = {
                availableFolders: [],
                selectedFolder: null,
                loadingFolders: true,
                error: "",
    };
  }
    
    componentDidUpdate(){
    if (this.props.platform !== null && this.props.platform.type == "library" && this.state.loadingFolders){
        $.get(`${this.props.apiURL}/cloudlibrary/${this.props.platform.name}/listfolders`)
        .done(result => {
          result.folders.forEach(album => {
            album.label = `${album.name} (${album.images_count} images)`;
            album.value = album.url;
          })
          this.setState({availableFolders: result.folders});
        })
        .fail((error) => {
            this.setState({loadingFolders: false, error: "Cannot load folders. Check your internet connection."});
        })
            .always(() => {
                this.setState({loadingFolders: false});
            });
    }
  }
    
    handleSelectFolder = (e) => this.setState({selectedFolder: e});
    handleSubmit = e => this.props.onSubmit(this.state.selectedFolder);
    
    render() {
        const {
            onHide,
            platform,
        } = this.props;
 
        const title = "Import from " + (platform !== null ? platform.name : "Platform");
        const isVisible = platform !== null && platform.type === "library";
        return (
            <Modal className={"folder-select"} onHide={onHide} show={isVisible}>
                <Modal.Header closeButton>
                    <Modal.Title>
                        {title}
                    </Modal.Title>
                </Modal.Header>
                <Modal.Body bsClass="my-modal">
                    <p>Import the images from your <a target="_blank" href={platform === null ? "" : platform.server_url}>{platform === null ? "" : platform.name} library</a> into a new task.</p>
                    <Select
                        className="basic-single"
                        classNamePrefix="select"
                        isLoading={this.state.loadingFolders}
                        isClearable={false}
                        isSearchable={true}
                        onChange={this.handleSelectFolder}
                        options={this.state.availableFolders}
                        placeholder={this.state.loadingFolders ? "Fetching Piwigo albums..." : "Please select a Piwigo album"}
                        name="options"
                    />
                </Modal.Body>
                <Modal.Footer>
                    <Button onClick={onHide}>Close</Button>
                    <Button
                        bsStyle="primary"
                        disabled={this.state.selectedFolder === null}
                        onClick={this.handleSubmit}
                    >
                        <i className={"fa fa-upload"} />
                        Import
                    </Button>
                </Modal.Footer>
            </Modal>
        );
    }
}