@spinnaker/docker
Version: 
118 lines • 5.36 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const React = require("react");
const ngimport_1 = require("ngimport");
const rxjs_1 = require("rxjs");
const core_1 = require("@spinnaker/core");
const DockerImageReader_1 = require("../../image/DockerImageReader");
class DockerTriggerTemplate extends React.Component {
    constructor(props) {
        super(props);
        this.queryStream = new rxjs_1.Subject();
        this.handleQuery = () => {
            const trigger = this.props.command.trigger;
            return rxjs_1.Observable.fromPromise(DockerImageReader_1.DockerImageReader.findTags({
                provider: 'dockerRegistry',
                account: trigger.account,
                repository: trigger.repository,
            }));
        };
        this.updateSelectedTag = (tag) => {
            const { command } = this.props;
            const trigger = command.trigger;
            command.extraFields.tag = tag;
            if (trigger && trigger.repository) {
                let imageName = '';
                if (trigger.registry) {
                    imageName += trigger.registry + '/';
                }
                imageName += trigger.repository;
                command.extraFields.artifacts = [
                    {
                        type: 'docker/image',
                        name: imageName,
                        version: tag,
                        reference: imageName + ':' + tag,
                    },
                ];
            }
            this.setState({ selectedTag: tag });
        };
        this.tagLoadSuccess = (tags) => {
            const { command } = this.props;
            const trigger = command.trigger;
            const newState = {};
            newState.tags = tags;
            if (newState.tags.length) {
                // default to what is supplied by the trigger if possible; otherwise, use the latest
                const defaultSelection = newState.tags.find(t => t === trigger.tag) || newState.tags[0];
                newState.selectedTag = defaultSelection;
                this.updateSelectedTag(defaultSelection);
            }
            newState.tagsLoading = false;
            this.setState(newState);
        };
        this.tagLoadFailure = () => {
            this.setState({
                tagsLoading: false,
                loadError: true,
            });
        };
        this.initialize = () => {
            const { command } = this.props;
            this.subscription = this.queryStream
                .debounceTime(250)
                .switchMap(this.handleQuery)
                .subscribe(this.tagLoadSuccess, this.tagLoadFailure);
            // These fields will be added to the trigger when the form is submitted
            command.extraFields = {};
            // cancel search stream if trigger has changed to some other type
            if (command.trigger.type !== 'docker') {
                this.subscription.unsubscribe();
                return;
            }
            this.searchTags();
        };
        this.searchTags = (query = '') => {
            this.setState({ tags: [`<span>Finding tags${query && ` matching ${query}`}...</span>`] });
            this.queryStream.next();
        };
        this.state = {
            tags: [],
            tagsLoading: true,
            loadError: false,
            selectedTag: '',
        };
    }
    static formatLabel(trigger) {
        return ngimport_1.$q.when(`(Docker Registry) ${trigger.account ? trigger.account + ':' : ''} ${trigger.repository || ''}`);
    }
    componentWillReceiveProps(nextProps) {
        if (nextProps.command !== this.props.command) {
            this.initialize();
        }
    }
    componentDidMount() {
        this.initialize();
    }
    render() {
        const { tags, tagsLoading, loadError, selectedTag } = this.state;
        const options = tags.map(tag => {
            return { value: tag };
        });
        return (React.createElement("div", { className: "form-group" },
            React.createElement("label", { className: "col-md-4 sm-label-right" }, "Tag"),
            tagsLoading && (React.createElement("div", { className: "col-md-6" },
                React.createElement("div", { className: "form-control-static text-center" },
                    React.createElement(core_1.Spinner, { size: 'small' })))),
            React.createElement("input", { type: "hidden", required: tagsLoading, value: selectedTag }),
            loadError && React.createElement("div", { className: "col-md-6" }, "Error loading tags!"),
            !tagsLoading && (React.createElement("div", { className: "col-md-6" },
                tags.length === 0 && (React.createElement("div", null,
                    React.createElement("p", { className: "form-control-static" }, "No tags found"))),
                tags.length > 0 && (React.createElement(core_1.TetheredSelect, { options: options, optionRenderer: o => React.createElement("span", null, o.value), clearable: false, value: selectedTag, valueRenderer: o => (React.createElement("span", null,
                        React.createElement("strong", null, o.value))), onChange: (o) => this.updateSelectedTag(o.value) }))))));
    }
}
exports.DockerTriggerTemplate = DockerTriggerTemplate;
//# sourceMappingURL=DockerTriggerTemplate.js.map