UNPKG

@spinnaker/docker

Version:

118 lines 5.36 kB
"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