mirror of https://github.com/docker/docs.git
Tooltips and redesigned image cards.
This commit is contained in:
parent
1c2c597c87
commit
61289f706c
|
@ -4,6 +4,8 @@ var Router = require('react-router');
|
||||||
var remote = require('remote');
|
var remote = require('remote');
|
||||||
var dialog = remote.require('dialog');
|
var dialog = remote.require('dialog');
|
||||||
var ContainerStore = require('./ContainerStore');
|
var ContainerStore = require('./ContainerStore');
|
||||||
|
var OverlayTrigger = require('react-bootstrap').OverlayTrigger;
|
||||||
|
var Tooltip = require('react-bootstrap').Tooltip;
|
||||||
|
|
||||||
var ContainerListItem = React.createClass({
|
var ContainerListItem = React.createClass({
|
||||||
handleItemMouseEnter: function () {
|
handleItemMouseEnter: function () {
|
||||||
|
@ -43,18 +45,43 @@ var ContainerListItem = React.createClass({
|
||||||
|
|
||||||
var state;
|
var state;
|
||||||
if (container.State.Downloading) {
|
if (container.State.Downloading) {
|
||||||
state = <div className="state state-downloading"><div style={style} className="downloading-arrow"></div></div>;
|
state = (
|
||||||
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>Downloading</Tooltip>}>
|
||||||
|
<div className="state state-downloading">
|
||||||
|
<div style={style} className="downloading-arrow"></div>
|
||||||
|
</div>
|
||||||
|
</OverlayTrigger>
|
||||||
|
);
|
||||||
} else if (container.State.Running && !container.State.Paused) {
|
} else if (container.State.Running && !container.State.Paused) {
|
||||||
state = <div className="state state-running"><div style={style} className="runningwave"></div></div>;
|
state = (
|
||||||
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>Running</Tooltip>}>
|
||||||
|
<div className="state state-running"><div style={style} className="runningwave"></div></div>
|
||||||
|
</OverlayTrigger>
|
||||||
|
);
|
||||||
} else if (container.State.Restarting) {
|
} else if (container.State.Restarting) {
|
||||||
state = <div className="state state-restarting" style={style}></div>;
|
state = (
|
||||||
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>Restarting</Tooltip>}>
|
||||||
|
<div className="state state-restarting" style={style}></div>
|
||||||
|
</OverlayTrigger>
|
||||||
|
);
|
||||||
} else if (container.State.Paused) {
|
} else if (container.State.Paused) {
|
||||||
state = <div className="state state-paused"></div>;
|
state = (
|
||||||
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>Paused</Tooltip>}>
|
||||||
|
<div className="state state-paused"></div>
|
||||||
|
</OverlayTrigger>
|
||||||
|
);
|
||||||
} else if (container.State.ExitCode) {
|
} else if (container.State.ExitCode) {
|
||||||
// state = <div className="state state-error"></div>;
|
state = (
|
||||||
state = <div className="state state-stopped"></div>;
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>Stopped</Tooltip>}>
|
||||||
|
<div className="state state-stopped"></div>
|
||||||
|
</OverlayTrigger>
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
state = <div className="state state-stopped"></div>;
|
state = (
|
||||||
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>Stopped</Tooltip>}>
|
||||||
|
<div className="state state-stopped"></div>
|
||||||
|
</OverlayTrigger>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -2,6 +2,8 @@ var $ = require('jquery');
|
||||||
var React = require('react/addons');
|
var React = require('react/addons');
|
||||||
var RetinaImage = require('react-retina-image');
|
var RetinaImage = require('react-retina-image');
|
||||||
var ContainerStore = require('./ContainerStore');
|
var ContainerStore = require('./ContainerStore');
|
||||||
|
var OverlayTrigger = require('react-bootstrap').OverlayTrigger;
|
||||||
|
var Tooltip = require('react-bootstrap').Tooltip;
|
||||||
|
|
||||||
var ImageCard = React.createClass({
|
var ImageCard = React.createClass({
|
||||||
getInitialState: function () {
|
getInitialState: function () {
|
||||||
|
@ -42,10 +44,34 @@ var ImageCard = React.createClass({
|
||||||
render: function () {
|
render: function () {
|
||||||
var self = this;
|
var self = this;
|
||||||
var name;
|
var name;
|
||||||
if (this.props.image.is_official) {
|
var imageNameTokens = this.props.image.name.split('/');
|
||||||
name = <span><RetinaImage src="official.png"/>{this.props.image.name}</span>;
|
var namespace;
|
||||||
|
var repo;
|
||||||
|
if (imageNameTokens.length > 1) {
|
||||||
|
namespace = imageNameTokens[0];
|
||||||
|
repo = imageNameTokens[1];
|
||||||
} else {
|
} else {
|
||||||
name = <span>{this.props.image.name}</span>;
|
namespace = "official";
|
||||||
|
repo = imageNameTokens[0];
|
||||||
|
}
|
||||||
|
if (this.props.image.is_official) {
|
||||||
|
name = (
|
||||||
|
<div>
|
||||||
|
<div className="namespace official">{namespace}</div>
|
||||||
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>{this.props.image.name}</Tooltip>}>
|
||||||
|
<span className="repo">{repo}</span>
|
||||||
|
</OverlayTrigger>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
name = (
|
||||||
|
<div>
|
||||||
|
<div className="namespace">{namespace}</div>
|
||||||
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>{this.props.image.name}</Tooltip>}>
|
||||||
|
<span className="repo">{repo}</span>
|
||||||
|
</OverlayTrigger>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
var description;
|
var description;
|
||||||
if (this.props.image.description) {
|
if (this.props.image.description) {
|
||||||
|
@ -75,6 +101,12 @@ var ImageCard = React.createClass({
|
||||||
} else {
|
} else {
|
||||||
tags = <RetinaImage className="tags-loading" src="loading-white.png"/>;
|
tags = <RetinaImage className="tags-loading" src="loading-white.png"/>;
|
||||||
}
|
}
|
||||||
|
var officialBadge;
|
||||||
|
if (this.props.image.is_official) {
|
||||||
|
officialBadge = (
|
||||||
|
<RetinaImage src="official.png" />
|
||||||
|
);
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<div className="image-item">
|
<div className="image-item">
|
||||||
<div className="tag-overlay" onClick={self.handleCloseTagOverlay}>
|
<div className="tag-overlay" onClick={self.handleCloseTagOverlay}>
|
||||||
|
@ -84,6 +116,9 @@ var ImageCard = React.createClass({
|
||||||
<RetinaImage src={imgsrc}/>
|
<RetinaImage src={imgsrc}/>
|
||||||
</div>
|
</div>
|
||||||
<div className="card">
|
<div className="card">
|
||||||
|
<div className="badges">
|
||||||
|
{officialBadge}
|
||||||
|
</div>
|
||||||
<div className="name">
|
<div className="name">
|
||||||
{name}
|
{name}
|
||||||
</div>
|
</div>
|
||||||
|
@ -91,14 +126,18 @@ var ImageCard = React.createClass({
|
||||||
{description}
|
{description}
|
||||||
</div>
|
</div>
|
||||||
<div className="actions">
|
<div className="actions">
|
||||||
<div className="stars">
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>Favorites</Tooltip>}>
|
||||||
<span className="icon icon-star-9"></span>
|
<div className="stars">
|
||||||
<span className="text">{this.props.image.star_count}</span>
|
<span className="icon icon-star-9"></span>
|
||||||
</div>
|
<span className="text">{this.props.image.star_count}</span>
|
||||||
<div className="tags">
|
</div>
|
||||||
<span className="icon icon-tag-1"></span>
|
</OverlayTrigger>
|
||||||
<span className="text" onClick={self.handleTagOverlayClick.bind(self, this.props.image.name)} data-name={this.props.image.name}>{this.state.chosenTag}</span>
|
<OverlayTrigger placement="bottom" overlay={<Tooltip>Change Tag</Tooltip>}>
|
||||||
</div>
|
<div className="tags">
|
||||||
|
<span className="icon icon-tag-1"></span>
|
||||||
|
<span className="text" onClick={self.handleTagOverlayClick.bind(self, this.props.image.name)} data-name={this.props.image.name}>{this.state.chosenTag}</span>
|
||||||
|
</div>
|
||||||
|
</OverlayTrigger>
|
||||||
<div className="action">
|
<div className="action">
|
||||||
<a className="btn btn-action" onClick={self.handleClick.bind(self, this.props.image.name)}>Create</a>
|
<a className="btn btn-action" onClick={self.handleClick.bind(self, this.props.image.name)}>Create</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -156,6 +156,12 @@
|
||||||
}
|
}
|
||||||
.card {
|
.card {
|
||||||
padding: 10px 20px 10px 20px;
|
padding: 10px 20px 10px 20px;
|
||||||
|
position: relative;
|
||||||
|
.badges {
|
||||||
|
position: absolute;
|
||||||
|
right: 15px;
|
||||||
|
top: 8px;
|
||||||
|
}
|
||||||
.name {
|
.name {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
color: @gray-darkest;
|
color: @gray-darkest;
|
||||||
|
@ -164,26 +170,31 @@
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
img {
|
margin-bottom: 10px;
|
||||||
margin-right: 7px;
|
.namespace {
|
||||||
position: relative;
|
font-size: 11px;
|
||||||
top: -1px;
|
color: @gray-lighter;
|
||||||
|
margin-bottom: -3px;
|
||||||
|
&.official {
|
||||||
|
color: @brand-action;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.description {
|
.description {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: @gray-normal;
|
color: @gray-normal;
|
||||||
height: 65px;
|
height: 50px;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
-webkit-line-clamp: 4;
|
-webkit-line-clamp: 3;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
.actions {
|
.actions {
|
||||||
width: 190px;
|
width: 190px;
|
||||||
padding-top: 25px;
|
position: absolute;
|
||||||
|
bottom: 8px;
|
||||||
.stars {
|
.stars {
|
||||||
height: 15px;
|
height: 15px;
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
|
@ -237,8 +248,6 @@
|
||||||
}
|
}
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direaction: row;
|
flex-direaction: row;
|
||||||
position: relative;
|
|
||||||
bottom: 0px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,3 +201,10 @@ input[type="text"] {
|
||||||
.btn-info { .btn-styles(@btn-info-bg); }
|
.btn-info { .btn-styles(@btn-info-bg); }
|
||||||
.btn-warning { .btn-styles(@btn-warning-bg); }
|
.btn-warning { .btn-styles(@btn-warning-bg); }
|
||||||
.btn-danger { .btn-styles(@btn-danger-bg); }
|
.btn-danger { .btn-styles(@btn-danger-bg); }
|
||||||
|
|
||||||
|
.tooltip {
|
||||||
|
.tooltip-inner {
|
||||||
|
font-size: 10px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue