var async = require('async'); var $ = require('jquery'); var assign = require('object-assign'); var React = require('react/addons'); var Modal = require('react-bootstrap').Modal; var OverlayTrigger = require('react-bootstrap'); var Popover = require('react-bootstrap/Popover'); var SplitButton = require('react-bootstrap/SplitButton'); var MenuItem = require('react-bootstrap/MenuItem'); var RetinaImage = require('react-retina-image'); var ContainerStore = require('./ContainerStore'); var OverlayTrigger = require('react-bootstrap/OverlayTrigger'); var Popover = require('react-bootstrap/Popover'); var ContainerModal = React.createClass({ _searchRequest: null, getInitialState: function () { return { query: '', results: ContainerStore.recommended(), loading: false, tags: {}, active: null, }; }, componentDidMount: function () { this.refs.searchInput.getDOMNode().focus(); ContainerStore.on(ContainerStore.CLIENT_RECOMMENDED_EVENT, this.update); }, update: function () { if (!this.state.query.length) { this.setState({ results: ContainerStore.recommended() }); } }, search: function (query) { if (this._searchRequest) { this._searchRequest.abort(); this._searchRequest = null; } this.setState({ loading: true }); var self = this; this._searchRequest = $.get('https://registry.hub.docker.com/v1/search?q=' + query, function (result) { self.setState({ query: query, loading: false }); self._searchRequest = null; if (self.isMounted()) { self.setState(result); } }); }, handleChange: function (e) { var query = e.target.value; if (query === this.state.query) { return; } clearTimeout(this.timeout); if (!query.length) { this.setState({ query: query, results: ContainerStore.recommended() }); } else { var self = this; this.timeout = setTimeout(function () { self.search(query); }, 200); } }, handleClick: function (name, event) { ContainerStore.create(name, 'latest', function (err, containerName) { this.props.onRequestHide(); }.bind(this)); }, handleTagClick: function (tag, name, event) { ContainerStore.create(name, tag, function (err, containerName) { this.props.onRequestHide(); }.bind(this)); }, handleDropdownClick: function (name, event) { this.setState({ active: name }); if (this.state.tags[name]) { return; } $.get('https://registry.hub.docker.com/v1/repositories/' + name + '/tags', function (result) { var res = {}; res[name] = result; console.log(assign(this.state.tags, res)); this.setState({ tags: assign(this.state.tags, res) }); }.bind(this)); }, handleModalClick: function (event) { if (!this.state.active) { return; } if (!$('.popover').is(event.target)) { this.setState({ active: null }); } }, componentDidUpdate: function () { if (!this.state.active) { return; } var $dropdown = $(this.getDOMNode()).find('[data-name="' + this.state.active + '"]'); var $popover = $(this.getDOMNode()).find('.popover'); $popover.offset({ top: $dropdown.offset().top + 32, left: $dropdown.offset().left - $popover.width() / 2 + 11 }); }, render: function () { var self = this; var data = this.state.results.slice(0, 7); var results; if (data.length) { var items = data.map(function (r) { var name; if (r.is_official) { name = {r.name}; } else { name = {r.name}; } return (
  • {name}
    {r.star_count}
  • ); }); results = (
    ); } else { results = (

    No Results

    ); } var title = this.state.query ? 'Results' : 'Recommended'; var loadingClasses = React.addons.classSet({ hidden: !this.state.loading, loading: true }); var magnifierClasses = React.addons.classSet({ hidden: this.state.loading, icon: true, 'icon-magnifier': true, 'search-icon': true }); var question = (
    An image is a template for a container.}> What's an image?
    ); var tagData = self.state.tags[this.state.active]; if (tagData) { var list = tagData.map(function (t) { return
  • {t.name}
  • ; }); tags = ( ); } else { tags = ; } var popoverClasses = React.addons.classSet({ popover: true, hidden: !this.state.active }); return (
    {question}
    {title}
    {results}
    {tags}
    ); } }); module.exports = ContainerModal;