2013-01-28 20:18:50 +01:00
|
|
|
/**
|
|
|
|
* @provides javelin-behavior-pholio-mock-view
|
|
|
|
* @requires javelin-behavior
|
2013-02-23 15:28:34 +01:00
|
|
|
* javelin-util
|
2013-01-28 20:18:50 +01:00
|
|
|
* javelin-stratcom
|
2013-02-01 19:53:15 +01:00
|
|
|
* javelin-dom
|
|
|
|
* javelin-vector
|
2013-02-07 15:26:36 +01:00
|
|
|
* javelin-magical-init
|
|
|
|
* javelin-request
|
2013-03-05 03:43:29 +01:00
|
|
|
* javelin-history
|
2013-03-05 21:30:05 +01:00
|
|
|
* javelin-workflow
|
2013-03-05 21:30:58 +01:00
|
|
|
* javelin-mask
|
|
|
|
* javelin-behavior-device
|
2013-03-05 02:54:58 +01:00
|
|
|
* phabricator-keyboard-shortcut
|
2013-01-28 20:18:50 +01:00
|
|
|
*/
|
|
|
|
JX.behavior('pholio-mock-view', function(config) {
|
2013-02-01 19:53:15 +01:00
|
|
|
var is_dragging = false;
|
2013-02-22 15:39:08 +01:00
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
var drag_begin;
|
|
|
|
var drag_end;
|
2013-02-23 15:28:34 +01:00
|
|
|
var panel = JX.$(config.panelID);
|
|
|
|
var viewport = JX.$(config.viewportID);
|
2013-02-07 15:26:36 +01:00
|
|
|
|
|
|
|
var selection_border;
|
|
|
|
var selection_fill;
|
2013-02-22 19:34:32 +01:00
|
|
|
var active_image;
|
2013-02-01 19:53:15 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
var inline_comments = {};
|
|
|
|
|
2013-03-05 01:59:16 +01:00
|
|
|
|
|
|
|
/* -( Stage )-------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
var stage = (function() {
|
|
|
|
var loading = false;
|
|
|
|
var stageElement = JX.$(config.panelID);
|
|
|
|
var viewElement = JX.$(config.viewportID);
|
2013-03-05 21:29:39 +01:00
|
|
|
var gutterElement = JX.$('mock-inline-comments');
|
2013-03-05 01:59:16 +01:00
|
|
|
var reticles = [];
|
2013-03-05 21:29:39 +01:00
|
|
|
var cards = [];
|
|
|
|
var inline_phid_map = {};
|
2013-03-05 01:59:16 +01:00
|
|
|
|
|
|
|
function begin_load() {
|
|
|
|
if (loading) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
loading = true;
|
2013-03-05 21:29:39 +01:00
|
|
|
clear_stage();
|
2013-03-05 01:59:16 +01:00
|
|
|
draw_loading();
|
|
|
|
}
|
|
|
|
|
|
|
|
function end_load() {
|
|
|
|
if (!loading) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
loading = false;
|
|
|
|
draw_loading();
|
|
|
|
}
|
|
|
|
|
|
|
|
function draw_loading() {
|
|
|
|
JX.DOM.alterClass(stageElement, 'pholio-image-loading', loading);
|
|
|
|
}
|
|
|
|
|
2013-03-05 21:29:39 +01:00
|
|
|
function add_inline_node(node, phid) {
|
|
|
|
inline_phid_map[phid] = (inline_phid_map[phid] || []);
|
|
|
|
inline_phid_map[phid].push(node);
|
|
|
|
}
|
|
|
|
|
|
|
|
function add_reticle(reticle, phid) {
|
|
|
|
mark_ref(reticle, phid);
|
|
|
|
|
2013-03-05 01:59:16 +01:00
|
|
|
reticles.push(reticle);
|
2013-03-05 21:29:39 +01:00
|
|
|
add_inline_node(reticle, phid);
|
|
|
|
|
2013-03-05 01:59:16 +01:00
|
|
|
viewElement.appendChild(reticle);
|
|
|
|
}
|
|
|
|
|
2013-03-05 21:29:39 +01:00
|
|
|
function clear_stage() {
|
2013-03-05 01:59:16 +01:00
|
|
|
for (var ii = 0; ii < reticles.length; ii++) {
|
|
|
|
JX.DOM.remove(reticles[ii]);
|
|
|
|
}
|
2013-03-05 21:29:39 +01:00
|
|
|
for (var ii = 0; ii < cards.length; ii++) {
|
|
|
|
JX.DOM.remove(cards[ii]);
|
|
|
|
}
|
2013-03-05 01:59:16 +01:00
|
|
|
reticles = [];
|
2013-03-05 21:29:39 +01:00
|
|
|
cards = [];
|
|
|
|
inline_phid_map = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
function highlight_inline(phid, show) {
|
|
|
|
var nodes = inline_phid_map[phid] || [];
|
|
|
|
var cls = 'pholio-mock-inline-comment-highlight';
|
|
|
|
for (var ii = 0; ii < nodes.length; ii++) {
|
|
|
|
JX.DOM.alterClass(nodes[ii], cls, show);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function remove_inline(phid) {
|
|
|
|
var nodes = inline_phid_map[phid] || [];
|
|
|
|
for (var ii = 0; ii < nodes.length; ii++) {
|
|
|
|
JX.DOM.remove(nodes[ii]);
|
|
|
|
}
|
|
|
|
delete inline_phid_map[phid];
|
|
|
|
}
|
|
|
|
|
|
|
|
function mark_ref(node, phid) {
|
|
|
|
JX.Stratcom.addSigil(node, 'pholio-inline-ref');
|
|
|
|
JX.Stratcom.addData(node, {phid: phid});
|
|
|
|
}
|
|
|
|
|
|
|
|
function add_card(card, phid) {
|
|
|
|
mark_ref(card, phid);
|
|
|
|
|
|
|
|
cards.push(card);
|
|
|
|
add_inline_node(card, phid);
|
|
|
|
|
|
|
|
gutterElement.appendChild(card);
|
2013-03-05 01:59:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
beginLoad: begin_load,
|
|
|
|
endLoad: end_load,
|
|
|
|
addReticle: add_reticle,
|
2013-03-05 21:29:39 +01:00
|
|
|
clearStage: clear_stage,
|
|
|
|
highlightInline: highlight_inline,
|
|
|
|
removeInline: remove_inline,
|
|
|
|
addCard: add_card
|
2013-03-05 01:59:16 +01:00
|
|
|
};
|
|
|
|
})();
|
|
|
|
|
2013-03-05 02:54:58 +01:00
|
|
|
function get_image_index(id) {
|
2013-02-22 19:34:32 +01:00
|
|
|
for (var ii = 0; ii < config.images.length; ii++) {
|
|
|
|
if (config.images[ii].id == id) {
|
2013-03-05 02:54:58 +01:00
|
|
|
return ii;
|
2013-02-22 19:34:32 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2013-03-05 02:54:58 +01:00
|
|
|
function get_image(id) {
|
|
|
|
var idx = get_image_index(id);
|
|
|
|
if (idx === null) {
|
|
|
|
return idx;
|
|
|
|
}
|
|
|
|
return config.images[idx];
|
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:34 +01:00
|
|
|
function onload_image(id) {
|
|
|
|
if (active_image.id != id) {
|
|
|
|
// The user has clicked another image before this one loaded, so just
|
|
|
|
// bail.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:56 +01:00
|
|
|
active_image.tag = this;
|
|
|
|
redraw_image();
|
|
|
|
}
|
|
|
|
|
2013-03-05 02:54:58 +01:00
|
|
|
function switch_image(delta) {
|
|
|
|
if (!active_image) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var idx = get_image_index(active_image.id)
|
|
|
|
idx = (idx + delta + config.images.length) % config.images.length;
|
|
|
|
select_image(config.images[idx].id);
|
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:56 +01:00
|
|
|
function redraw_image() {
|
2013-03-05 21:31:30 +01:00
|
|
|
|
|
|
|
// Force the stage to scale as a function of the viewport size. Broadly,
|
|
|
|
// we make the stage 95% of the height of the viewport, then scale images
|
|
|
|
// to fit within it.
|
|
|
|
var new_y = (JX.Vector.getViewport().y * 0.90) - 150;
|
|
|
|
new_y = Math.max(320, new_y);
|
|
|
|
panel.style.height = new_y + 'px';
|
|
|
|
|
2013-02-23 15:28:56 +01:00
|
|
|
if (!active_image || !active_image.tag) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var tag = active_image.tag;
|
|
|
|
|
2013-03-05 21:31:30 +01:00
|
|
|
// If the image is too wide or tall for the viewport, scale it down so it
|
|
|
|
// fits.
|
2013-02-23 15:28:34 +01:00
|
|
|
var w = JX.Vector.getDim(panel);
|
|
|
|
w.x -= 40;
|
2013-03-05 21:31:30 +01:00
|
|
|
w.y -= 40;
|
|
|
|
var scale = 1;
|
2013-02-23 15:28:56 +01:00
|
|
|
if (w.x < tag.naturalWidth) {
|
2013-03-05 21:31:30 +01:00
|
|
|
scale = Math.min(scale, w.x / tag.naturalWidth);
|
|
|
|
}
|
|
|
|
if (w.y < tag.naturalHeight) {
|
|
|
|
scale = Math.min(scale, w.y / tag.naturalHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (scale < 1) {
|
2013-02-23 15:28:56 +01:00
|
|
|
tag.width = Math.floor(scale * tag.naturalWidth);
|
|
|
|
tag.height = Math.floor(scale * tag.naturalHeight);
|
|
|
|
} else {
|
|
|
|
tag.width = tag.naturalWidth;
|
|
|
|
tag.height = tag.naturalHeight;
|
2013-02-23 15:28:34 +01:00
|
|
|
}
|
2013-02-01 19:53:15 +01:00
|
|
|
|
2013-03-05 21:31:30 +01:00
|
|
|
viewport.style.top = Math.floor((new_y - tag.height) / 2) + 'px';
|
2013-02-23 15:28:34 +01:00
|
|
|
|
2013-03-05 01:59:16 +01:00
|
|
|
stage.endLoad();
|
|
|
|
|
2013-02-23 15:28:56 +01:00
|
|
|
JX.DOM.setContent(viewport, tag);
|
2013-02-23 15:28:34 +01:00
|
|
|
|
|
|
|
redraw_inlines(active_image.id);
|
|
|
|
}
|
|
|
|
|
|
|
|
function select_image(image_id) {
|
|
|
|
active_image = get_image(image_id);
|
|
|
|
active_image.tag = null;
|
2013-02-01 19:53:15 +01:00
|
|
|
|
2013-03-05 01:59:16 +01:00
|
|
|
stage.beginLoad();
|
|
|
|
|
2013-02-23 15:28:34 +01:00
|
|
|
var img = JX.$N('img', {className: 'pholio-mock-image'});
|
|
|
|
img.onload = JX.bind(img, onload_image, active_image.id);
|
|
|
|
img.src = active_image.fullURI;
|
2013-02-22 19:34:32 +01:00
|
|
|
|
2013-02-27 19:45:51 +01:00
|
|
|
var thumbs = JX.DOM.scry(
|
|
|
|
JX.$('pholio-mock-carousel'),
|
2013-03-05 21:30:39 +01:00
|
|
|
'a',
|
2013-02-27 19:45:51 +01:00
|
|
|
'mock-thumbnail');
|
|
|
|
|
|
|
|
for(var k in thumbs) {
|
|
|
|
var thumb_meta = JX.Stratcom.getData(thumbs[k]);
|
|
|
|
|
|
|
|
JX.DOM.alterClass(
|
|
|
|
thumbs[k],
|
|
|
|
'pholio-mock-carousel-thumb-current',
|
|
|
|
(active_image.id == thumb_meta.imageID));
|
|
|
|
}
|
|
|
|
|
2013-02-22 19:34:32 +01:00
|
|
|
load_inline_comments();
|
2013-03-05 03:43:29 +01:00
|
|
|
|
|
|
|
if (image_id != config.selectedID) {
|
|
|
|
JX.History.replace(active_image.pageURI);
|
|
|
|
}
|
2013-02-22 19:34:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
JX.Stratcom.listen(
|
2013-03-05 01:59:16 +01:00
|
|
|
['mousedown', 'click'],
|
2013-02-22 19:34:32 +01:00
|
|
|
'mock-thumbnail',
|
|
|
|
function(e) {
|
2013-03-05 01:59:16 +01:00
|
|
|
if (!e.isNormalMouseEvent()) {
|
|
|
|
return;
|
|
|
|
}
|
2013-02-22 19:34:32 +01:00
|
|
|
e.kill();
|
|
|
|
select_image(e.getNodeData('mock-thumbnail').imageID);
|
2013-02-01 19:53:15 +01:00
|
|
|
});
|
|
|
|
|
2013-03-05 03:43:29 +01:00
|
|
|
select_image(config.selectedID);
|
2013-02-22 19:34:32 +01:00
|
|
|
|
2013-03-05 21:29:03 +01:00
|
|
|
JX.Stratcom.listen('mousedown', 'mock-viewport', function(e) {
|
2013-02-01 19:53:15 +01:00
|
|
|
if (!e.isNormalMouseEvent()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-03-05 21:30:58 +01:00
|
|
|
if (JX.Device.getDevice() != 'desktop') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
if (drag_begin) {
|
|
|
|
return;
|
2013-02-22 15:39:08 +01:00
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
e.kill();
|
2013-02-01 19:53:15 +01:00
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
is_dragging = true;
|
|
|
|
drag_begin = get_image_xy(JX.$V(e));
|
|
|
|
drag_end = drag_begin;
|
2013-02-01 19:53:15 +01:00
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
redraw_selection();
|
2013-02-01 19:53:15 +01:00
|
|
|
});
|
|
|
|
|
2013-03-05 21:30:58 +01:00
|
|
|
|
2013-02-01 19:53:15 +01:00
|
|
|
JX.enableDispatch(document.body, 'mousemove');
|
2013-02-23 15:28:23 +01:00
|
|
|
JX.Stratcom.listen('mousemove', null, function(e) {
|
2013-02-01 19:53:15 +01:00
|
|
|
if (!is_dragging) {
|
|
|
|
return;
|
|
|
|
}
|
2013-02-23 15:28:23 +01:00
|
|
|
drag_end = get_image_xy(JX.$V(e));
|
|
|
|
redraw_selection();
|
2013-02-01 19:53:15 +01:00
|
|
|
});
|
|
|
|
|
2013-02-23 15:27:35 +01:00
|
|
|
JX.Stratcom.listen(
|
|
|
|
['mouseover', 'mouseout'],
|
2013-03-05 21:29:39 +01:00
|
|
|
'pholio-inline-ref',
|
2013-02-27 19:45:51 +01:00
|
|
|
function(e) {
|
2013-03-05 21:29:39 +01:00
|
|
|
var phid = e.getNodeData('pholio-inline-ref').phid;
|
|
|
|
var show = (e.getType() == 'mouseover');
|
|
|
|
stage.highlightInline(phid, show);
|
|
|
|
});
|
2013-02-27 19:45:51 +01:00
|
|
|
|
2013-02-01 19:53:15 +01:00
|
|
|
JX.Stratcom.listen(
|
|
|
|
'mouseup',
|
|
|
|
null,
|
|
|
|
function(e) {
|
|
|
|
if (!is_dragging) {
|
|
|
|
return;
|
|
|
|
}
|
2013-03-10 17:22:21 +01:00
|
|
|
|
2013-02-01 19:53:15 +01:00
|
|
|
is_dragging = false;
|
2013-03-07 22:02:36 +01:00
|
|
|
if (!config.loggedIn) {
|
|
|
|
new JX.Workflow(config.logInLink).start();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
drag_end = get_image_xy(JX.$V(e));
|
2013-02-01 19:53:15 +01:00
|
|
|
|
2013-03-10 17:22:21 +01:00
|
|
|
resize_selection(16);
|
|
|
|
|
2013-03-05 21:30:05 +01:00
|
|
|
var data = {mockID: config.mockID};
|
|
|
|
var handler = function(r) {
|
|
|
|
var dialog = JX.$H(r).getFragment().firstChild;
|
|
|
|
JX.DOM.appendContent(viewport, dialog);
|
2013-02-06 20:28:03 +01:00
|
|
|
|
2013-02-22 15:39:08 +01:00
|
|
|
JX.$V(
|
2013-03-05 21:30:05 +01:00
|
|
|
Math.min(drag_begin.x, drag_end.x),
|
|
|
|
Math.max(drag_begin.y, drag_end.y) + 4
|
2013-02-22 15:39:08 +01:00
|
|
|
).setPos(dialog);
|
|
|
|
|
2013-03-05 21:30:05 +01:00
|
|
|
JX.DOM.focus(JX.DOM.find(dialog, 'textarea'));
|
|
|
|
}
|
2013-02-06 20:28:03 +01:00
|
|
|
|
2013-03-05 21:30:05 +01:00
|
|
|
new JX.Workflow('/pholio/inline/save/', data)
|
|
|
|
.setHandler(handler)
|
|
|
|
.start();
|
2013-01-28 20:18:50 +01:00
|
|
|
});
|
2013-02-01 19:53:15 +01:00
|
|
|
|
2013-03-10 17:22:21 +01:00
|
|
|
function resize_selection(min_size) {
|
|
|
|
var start = {
|
|
|
|
x: Math.min(drag_begin.x, drag_end.x),
|
|
|
|
y: Math.min(drag_begin.y, drag_end.y)
|
|
|
|
};
|
|
|
|
var end = {
|
|
|
|
x: Math.max(drag_begin.x, drag_end.x),
|
|
|
|
y: Math.max(drag_begin.y, drag_end.y)
|
|
|
|
};
|
|
|
|
|
|
|
|
var width = end.x - start.x;
|
|
|
|
var height = end.y - start.y;
|
|
|
|
|
|
|
|
if (width < min_size) {
|
|
|
|
var addon = (min_size-width)/2;
|
|
|
|
|
|
|
|
start.x = Math.max(0, start.x - addon);
|
|
|
|
end.x = Math.min(active_image.tag.naturalWidth, end.x + addon);
|
|
|
|
|
|
|
|
if (start.x == 0) {
|
|
|
|
end.x = Math.min(min_size, active_image.tag.naturalWidth);
|
|
|
|
} else if (end.x == active_image.tag.naturalWidth) {
|
|
|
|
start.x = Math.max(0, active_image.tag.naturalWidth - min_size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (height < min_size) {
|
|
|
|
var addon = (min_size-height)/2;
|
|
|
|
|
|
|
|
start.y = Math.max(0, start.y - addon);
|
|
|
|
end.y = Math.min(active_image.tag.naturalHeight, end.y + addon);
|
|
|
|
|
|
|
|
if (start.y == 0) {
|
|
|
|
end.y = Math.min(min_size, active_image.tag.naturalHeight);
|
|
|
|
} else if (end.y == active_image.tag.naturalHeight) {
|
|
|
|
start.y = Math.max(0, active_image.tag.naturalHeight - min_size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
drag_begin = start;
|
|
|
|
drag_end = end;
|
|
|
|
redraw_selection();
|
|
|
|
}
|
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
function redraw_inlines(id) {
|
|
|
|
if (!active_image) {
|
|
|
|
return;
|
|
|
|
}
|
2013-02-08 16:24:17 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
if (active_image.id != id) {
|
|
|
|
return;
|
|
|
|
}
|
2013-02-08 16:24:17 +01:00
|
|
|
|
2013-03-05 21:29:39 +01:00
|
|
|
stage.clearStage();
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
var comment_holder = JX.$('mock-inline-comments');
|
2013-03-05 21:23:17 +01:00
|
|
|
JX.DOM.setContent(comment_holder, render_image_info(active_image));
|
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
var inlines = inline_comments[active_image.id];
|
|
|
|
if (!inlines || !inlines.length) {
|
|
|
|
return;
|
|
|
|
}
|
2013-02-13 16:10:14 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
for (var ii = 0; ii < inlines.length; ii++) {
|
|
|
|
var inline = inlines[ii];
|
2013-03-05 21:29:39 +01:00
|
|
|
var card = JX.$H(inline.contentHTML).getFragment().firstChild;
|
|
|
|
|
|
|
|
stage.addCard(card, inline.phid);
|
2013-02-23 15:28:34 +01:00
|
|
|
|
|
|
|
if (!active_image.tag) {
|
|
|
|
// The image itself hasn't loaded yet, so we can't draw the inline
|
|
|
|
// reticles.
|
|
|
|
continue;
|
|
|
|
}
|
2013-02-13 16:10:14 +01:00
|
|
|
|
2013-03-05 21:29:39 +01:00
|
|
|
var inline_selection = render_reticle_fill();
|
|
|
|
stage.addReticle(inline_selection, inline.phid);
|
|
|
|
position_inline_rectangle(inline, inline_selection);
|
2013-02-13 16:10:14 +01:00
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
if (!inline.transactionphid) {
|
2013-03-05 21:29:39 +01:00
|
|
|
var inline_draft = render_reticle_border();
|
|
|
|
stage.addReticle(inline_draft, inline.phid);
|
|
|
|
position_inline_rectangle(inline, inline_draft);
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
}
|
2013-02-08 16:24:17 +01:00
|
|
|
}
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
}
|
2013-02-08 16:24:17 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
function position_inline_rectangle(inline, rect) {
|
2013-02-23 15:28:34 +01:00
|
|
|
var scale = active_image.tag.width / active_image.tag.naturalWidth;
|
|
|
|
|
|
|
|
JX.$V(scale * inline.x, scale * inline.y).setPos(rect);
|
|
|
|
JX.$V(scale * inline.width, scale * inline.height).setDim(rect);
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
}
|
2013-02-22 15:39:08 +01:00
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
function get_image_xy(p) {
|
2013-02-23 15:28:34 +01:00
|
|
|
var img = active_image.tag;
|
|
|
|
var imgp = JX.$V(img);
|
|
|
|
|
|
|
|
var scale = 1 / get_image_scale();
|
2013-02-23 15:28:23 +01:00
|
|
|
|
2013-02-23 15:28:34 +01:00
|
|
|
var x = scale * Math.max(0, Math.min(p.x - imgp.x, img.width));
|
|
|
|
var y = scale * Math.max(0, Math.min(p.y - imgp.y, img.height));
|
2013-02-23 15:28:23 +01:00
|
|
|
|
|
|
|
return {
|
|
|
|
x: x,
|
|
|
|
y: y
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:34 +01:00
|
|
|
function get_image_scale() {
|
|
|
|
var img = active_image.tag;
|
|
|
|
return img.width / img.naturalWidth;
|
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
function redraw_selection() {
|
2013-03-05 21:29:39 +01:00
|
|
|
selection_border = selection_border || render_reticle_border();
|
|
|
|
selection_fill = selection_fill || render_reticle_fill();
|
2013-02-23 15:28:23 +01:00
|
|
|
|
|
|
|
var p = JX.$V(
|
|
|
|
Math.min(drag_begin.x, drag_end.x),
|
|
|
|
Math.min(drag_begin.y, drag_end.y));
|
|
|
|
|
|
|
|
var d = JX.$V(
|
|
|
|
Math.max(drag_begin.x, drag_end.x) - p.x,
|
|
|
|
Math.max(drag_begin.y, drag_end.y) - p.y);
|
|
|
|
|
2013-02-23 15:28:34 +01:00
|
|
|
var scale = get_image_scale();
|
|
|
|
|
|
|
|
p.x *= scale;
|
|
|
|
p.y *= scale;
|
|
|
|
d.x *= scale;
|
|
|
|
d.y *= scale;
|
|
|
|
|
2013-03-05 21:29:39 +01:00
|
|
|
var nodes = [selection_fill, selection_border];
|
2013-02-23 15:28:23 +01:00
|
|
|
for (var ii = 0; ii < nodes.length; ii++) {
|
|
|
|
var node = nodes[ii];
|
2013-02-23 15:28:34 +01:00
|
|
|
viewport.appendChild(node);
|
2013-02-23 15:28:23 +01:00
|
|
|
p.setPos(node);
|
|
|
|
d.setDim(node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function clear_selection() {
|
|
|
|
selection_fill && JX.DOM.remove(selection_fill);
|
|
|
|
selection_border && JX.DOM.remove(selection_border);
|
|
|
|
}
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
function load_inline_comments() {
|
|
|
|
var id = active_image.id;
|
|
|
|
var inline_comments_uri = "/pholio/inline/" + id + "/";
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
new JX.Request(inline_comments_uri, function(r) {
|
|
|
|
inline_comments[id] = r;
|
|
|
|
redraw_inlines(id);
|
|
|
|
}).send();
|
|
|
|
}
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
JX.Stratcom.listen(
|
|
|
|
'click',
|
|
|
|
'inline-delete',
|
|
|
|
function(e) {
|
|
|
|
var data = e.getNodeData('inline-delete');
|
|
|
|
e.kill();
|
|
|
|
interrupt_typing();
|
2013-02-22 15:39:08 +01:00
|
|
|
|
2013-03-05 21:29:39 +01:00
|
|
|
stage.removeInline(data.phid);
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
var deleteURI = '/pholio/inline/delete/' + data.id + '/';
|
|
|
|
var del = new JX.Request(deleteURI, function(r) {
|
2013-02-22 15:39:08 +01:00
|
|
|
|
|
|
|
});
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
del.send();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.Stratcom.listen(
|
|
|
|
'click',
|
|
|
|
'inline-edit',
|
|
|
|
function(e) {
|
|
|
|
var data = e.getNodeData('inline-edit');
|
|
|
|
e.kill();
|
|
|
|
|
|
|
|
interrupt_typing();
|
|
|
|
|
|
|
|
var editURI = "/pholio/inline/edit/" + data.id + '/';
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
var edit_dialog = new JX.Request(editURI, function(r) {
|
|
|
|
var dialog = JX.$N(
|
|
|
|
'div',
|
|
|
|
{
|
|
|
|
className: 'pholio-edit-inline-popup'
|
|
|
|
},
|
|
|
|
JX.$H(r));
|
|
|
|
|
|
|
|
JX.DOM.setContent(JX.$(data.phid + '_comment'), dialog);
|
2013-02-22 15:39:08 +01:00
|
|
|
});
|
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
edit_dialog.send();
|
2013-02-22 15:39:08 +01:00
|
|
|
});
|
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
JX.Stratcom.listen(
|
|
|
|
'click',
|
|
|
|
'inline-edit-cancel',
|
|
|
|
function(e) {
|
|
|
|
var data = e.getNodeData('inline-edit-cancel');
|
|
|
|
e.kill();
|
|
|
|
load_inline_comment(data.id);
|
|
|
|
});
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
JX.Stratcom.listen(
|
|
|
|
'click',
|
|
|
|
'inline-edit-submit',
|
|
|
|
function(e) {
|
|
|
|
var data = e.getNodeData('inline-edit-submit');
|
|
|
|
var editURI = "/pholio/inline/edit/" + data.id + '/';
|
|
|
|
e.kill();
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
var edit = new JX.Request(editURI, function(r) {
|
|
|
|
load_inline_comment(data.id);
|
|
|
|
});
|
|
|
|
edit.addData({
|
|
|
|
op: 'update',
|
|
|
|
content: JX.DOM.find(JX.$(data.phid + '_comment'), 'textarea').value
|
|
|
|
});
|
|
|
|
edit.send();
|
|
|
|
});
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
JX.Stratcom.listen(
|
|
|
|
'click',
|
|
|
|
'inline-save-cancel',
|
|
|
|
function(e) {
|
|
|
|
e.kill();
|
|
|
|
interrupt_typing();
|
|
|
|
}
|
|
|
|
);
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
JX.Stratcom.listen(
|
|
|
|
'click',
|
|
|
|
'inline-save-submit',
|
|
|
|
function(e) {
|
|
|
|
e.kill();
|
2013-02-22 15:39:08 +01:00
|
|
|
|
2013-03-05 21:30:05 +01:00
|
|
|
var form = JX.$('pholio-new-inline-comment-dialog');
|
|
|
|
var text = JX.DOM.find(form, 'textarea').value;
|
|
|
|
if (!text.length) {
|
|
|
|
interrupt_typing();
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
return;
|
|
|
|
}
|
2013-02-22 15:39:08 +01:00
|
|
|
|
2013-03-05 21:30:05 +01:00
|
|
|
var data = {
|
|
|
|
mockID: config.mockID,
|
|
|
|
imageID: active_image.id,
|
|
|
|
startX: Math.min(drag_begin.x, drag_end.x),
|
|
|
|
startY: Math.min(drag_begin.y, drag_end.y),
|
|
|
|
endX: Math.max(drag_begin.x, drag_end.x),
|
|
|
|
endY: Math.max(drag_begin.y, drag_end.y)
|
|
|
|
};
|
2013-02-22 15:39:08 +01:00
|
|
|
|
2013-03-05 21:30:05 +01:00
|
|
|
var handler = function(r) {
|
2013-02-23 15:28:23 +01:00
|
|
|
if (!inline_comments[active_image.id]) {
|
|
|
|
inline_comments[active_image.id] = [];
|
|
|
|
}
|
|
|
|
inline_comments[active_image.id].push(r);
|
2013-02-22 15:39:08 +01:00
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
interrupt_typing();
|
|
|
|
redraw_inlines(active_image.id);
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
};
|
2013-02-22 15:39:08 +01:00
|
|
|
|
2013-03-05 21:30:05 +01:00
|
|
|
JX.Workflow.newFromForm(form, data)
|
|
|
|
.setHandler(handler)
|
|
|
|
.start();
|
2013-02-22 15:39:08 +01:00
|
|
|
}
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
);
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
function load_inline_comment(id) {
|
|
|
|
var viewInlineURI = '/pholio/inline/view/' + id + '/';
|
|
|
|
var inline_comment = new JX.Request(viewInlineURI, function(r) {
|
|
|
|
JX.DOM.replace(JX.$(r.phid + '_comment'), JX.$H(r.contentHTML));
|
|
|
|
});
|
|
|
|
inline_comment.send();
|
|
|
|
}
|
|
|
|
|
|
|
|
function interrupt_typing() {
|
2013-02-23 15:28:23 +01:00
|
|
|
clear_selection();
|
|
|
|
|
|
|
|
try {
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
JX.DOM.remove(JX.$('pholio-new-inline-comment-dialog'));
|
2013-02-23 15:28:23 +01:00
|
|
|
} catch (x) {
|
|
|
|
// TODO: For now, ignore this.
|
2013-02-22 15:39:08 +01:00
|
|
|
}
|
2013-02-23 15:28:23 +01:00
|
|
|
|
|
|
|
drag_begin = null;
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
}
|
2013-02-22 15:39:08 +01:00
|
|
|
|
Separate loading inline comments from drawing inline comments
Summary:
Currently, we issue one Ajax request to get inline comments, and then draw them when they come back. This has some limitations:
- A user could quickly click image 1, and then click image 2. The request for image 1 may take longer to come back than image 2. In this case, we'd draw the image 2 inlines and then draw the image 1 inlines when that request arrived, resulting in image 2 shown with both image 1 and image 2 comments. This is hard to make happen in a sandbox because the requests are so fast, but prevent it by drawing only the currently visible image's inlines.
- Every time we want to draw inlines, we need to request them -- even if we've already loaded them! This allows us to draw them without reloading them (although we don't actually do this, yet). When we do, it will make it faster to switch between images you've aleady looked at (and we can do other optimizations).
Test Plan: Clicked between images, saw inlines draw correctly. Added a new inline. Moused over inlines.
Reviewers: chad, ljalonen
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D5083
2013-02-23 15:27:45 +01:00
|
|
|
load_inline_comments();
|
2013-02-23 15:28:34 +01:00
|
|
|
|
2013-02-23 15:28:56 +01:00
|
|
|
JX.Stratcom.listen('resize', null, redraw_image);
|
|
|
|
redraw_image();
|
|
|
|
|
2013-03-05 02:54:58 +01:00
|
|
|
|
2013-03-05 21:23:17 +01:00
|
|
|
/* -( Keyboard Shortcuts )------------------------------------------------- */
|
2013-03-05 02:54:58 +01:00
|
|
|
|
|
|
|
|
2013-03-09 06:19:24 +01:00
|
|
|
new JX.KeyboardShortcut(['j', 'right'], 'Show next image.')
|
2013-03-05 02:54:58 +01:00
|
|
|
.setHandler(function() {
|
|
|
|
switch_image(1);
|
|
|
|
})
|
|
|
|
.register();
|
|
|
|
|
2013-03-09 06:19:24 +01:00
|
|
|
new JX.KeyboardShortcut(['k', 'left'], 'Show previous image.')
|
2013-03-05 02:54:58 +01:00
|
|
|
.setHandler(function() {
|
|
|
|
switch_image(-1);
|
|
|
|
})
|
|
|
|
.register();
|
2013-03-05 21:23:17 +01:00
|
|
|
|
2013-03-09 22:53:32 +01:00
|
|
|
JX.DOM.listen(panel, 'gesture.swipe.end', null, function(e) {
|
|
|
|
var data = e.getData();
|
|
|
|
|
|
|
|
if (data.length <= (JX.Vector.getDim(panel) / 2)) {
|
|
|
|
// If the user didn't move their finger far enough, don't switch.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch_image(data.direction == 'right' ? -1 : 1);
|
|
|
|
});
|
2013-03-05 21:23:17 +01:00
|
|
|
|
|
|
|
/* -( Render )------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
function render_image_info(image) {
|
|
|
|
var info = [];
|
|
|
|
|
|
|
|
var title = JX.$N(
|
|
|
|
'div',
|
|
|
|
{className: 'pholio-image-title'},
|
|
|
|
image.title);
|
|
|
|
info.push(title);
|
|
|
|
|
|
|
|
var desc = JX.$N(
|
|
|
|
'div',
|
|
|
|
{className: 'pholio-image-description'},
|
|
|
|
image.desc);
|
|
|
|
info.push(desc);
|
|
|
|
|
2013-03-14 17:38:56 +01:00
|
|
|
var embed = JX.$N(
|
|
|
|
'div',
|
|
|
|
{className: 'pholio-image-embedding'},
|
|
|
|
JX.$H('Embed this image:<br />{M' + config.mockID +
|
|
|
|
', image=' + image.id + '}'));
|
|
|
|
info.push(embed);
|
|
|
|
|
2013-03-10 21:30:41 +01:00
|
|
|
// Render image dimensions and visible size. If we have this infomation
|
|
|
|
// from the server we can display some of it immediately; otherwise, we need
|
|
|
|
// to wait for the image to load so we can read dimension information from
|
|
|
|
// it.
|
|
|
|
|
|
|
|
var image_x = image.width;
|
|
|
|
var image_y = image.height;
|
|
|
|
var display_x = null;
|
2013-03-05 21:23:17 +01:00
|
|
|
if (image.tag) {
|
2013-03-10 21:30:41 +01:00
|
|
|
image_x = image.tag.naturalWidth;
|
|
|
|
image_y = image.tag.naturalHeight;
|
|
|
|
display_x = image.tag.width;
|
|
|
|
}
|
|
|
|
|
|
|
|
var visible = [];
|
|
|
|
if (image_x) {
|
|
|
|
visible.push([image_x, '\u00d7', image_y, 'px']);
|
|
|
|
if (display_x) {
|
|
|
|
var area = Math.round(100 * (display_x / image_x));
|
|
|
|
visible.push(' ');
|
|
|
|
visible.push(
|
|
|
|
JX.$N(
|
|
|
|
'span',
|
|
|
|
{className: 'pholio-visible-size'},
|
|
|
|
['(', area, '%', ')']));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (visible.length) {
|
|
|
|
info.push(visible);
|
2013-03-05 21:23:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
var full_link = JX.$N(
|
|
|
|
'a',
|
|
|
|
{href: image.fullURI, target: '_blank'},
|
|
|
|
'View Full Image');
|
|
|
|
info.push(full_link);
|
|
|
|
|
|
|
|
for (var ii = 0; ii < info.length; ii++) {
|
|
|
|
info[ii] = JX.$N('div', {className: 'pholio-image-info-item'}, info[ii]);
|
|
|
|
}
|
|
|
|
info = JX.$N('div', {className: 'pholio-image-info'}, info);
|
|
|
|
|
|
|
|
return info;
|
|
|
|
}
|
|
|
|
|
2013-03-05 21:29:39 +01:00
|
|
|
function render_reticle_border() {
|
|
|
|
return JX.$N(
|
|
|
|
'div',
|
|
|
|
{className: 'pholio-mock-select-border'});
|
|
|
|
}
|
|
|
|
|
|
|
|
function render_reticle_fill() {
|
|
|
|
return JX.$N(
|
|
|
|
'div',
|
|
|
|
{className: 'pholio-mock-select-fill'});
|
|
|
|
}
|
|
|
|
|
2013-03-05 21:30:58 +01:00
|
|
|
|
|
|
|
/* -( Device Lightbox )---------------------------------------------------- */
|
|
|
|
|
|
|
|
// On devices, we show images full-size when the user taps them instead of
|
|
|
|
// attempting to implement inlines.
|
|
|
|
|
|
|
|
var lightbox = null;
|
|
|
|
|
|
|
|
JX.Stratcom.listen('click', 'mock-viewport', function(e) {
|
|
|
|
if (!e.isNormalMouseEvent()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (JX.Device.getDevice() == 'desktop') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
lightbox_attach();
|
|
|
|
e.kill();
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.Stratcom.listen('click', 'pholio-device-lightbox', lightbox_detach);
|
|
|
|
JX.Stratcom.listen('resize', null, lightbox_resize);
|
|
|
|
|
|
|
|
function lightbox_attach() {
|
|
|
|
JX.DOM.alterClass(document.body, 'lightbox-attached', true);
|
|
|
|
JX.Mask.show('jx-dark-mask');
|
|
|
|
|
|
|
|
lightbox = lightbox_render();
|
|
|
|
var image = JX.$N('img');
|
|
|
|
image.onload = lightbox_loaded;
|
|
|
|
setTimeout(function() {
|
|
|
|
image.src = active_image.fullURI;
|
|
|
|
}, 1000);
|
|
|
|
JX.DOM.setContent(lightbox, image);
|
|
|
|
JX.DOM.alterClass(lightbox, 'pholio-device-lightbox-loading', true);
|
|
|
|
|
|
|
|
lightbox_resize();
|
|
|
|
|
|
|
|
document.body.appendChild(lightbox);
|
|
|
|
}
|
|
|
|
|
|
|
|
function lightbox_detach() {
|
|
|
|
JX.DOM.remove(lightbox);
|
|
|
|
JX.Mask.hide();
|
|
|
|
JX.DOM.alterClass(document.body, 'lightbox-attached', false);
|
|
|
|
lightbox = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
function lightbox_resize(e) {
|
|
|
|
if (!lightbox) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
JX.Vector.getScroll().setPos(lightbox);
|
|
|
|
JX.Vector.getViewport().setDim(lightbox);
|
|
|
|
}
|
|
|
|
|
|
|
|
function lightbox_loaded() {
|
|
|
|
JX.DOM.alterClass(lightbox, 'pholio-device-lightbox-loading', false);
|
|
|
|
}
|
|
|
|
|
|
|
|
function lightbox_render() {
|
|
|
|
var el = JX.$N('div', {className: 'pholio-device-lightbox'});
|
|
|
|
JX.Stratcom.addSigil(el, 'pholio-device-lightbox');
|
|
|
|
return el;
|
|
|
|
}
|
|
|
|
|
2013-03-10 21:30:41 +01:00
|
|
|
|
|
|
|
/* -( Preload )------------------------------------------------------------ */
|
|
|
|
|
|
|
|
var preload = [];
|
|
|
|
for (var ii = 0; ii < config.images.length; ii++) {
|
|
|
|
preload.push(config.images[ii].fullURI);
|
|
|
|
}
|
|
|
|
|
|
|
|
function preload_next() {
|
|
|
|
next_src = preload[0];
|
|
|
|
if (!next_src) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
preload.splice(0, 1);
|
|
|
|
|
|
|
|
var img = JX.$N('img');
|
|
|
|
img.onload = preload_next;
|
|
|
|
img.onerror = preload_next;
|
|
|
|
img.src = next_src;
|
|
|
|
}
|
|
|
|
|
|
|
|
preload_next();
|
|
|
|
|
|
|
|
|
2013-01-28 20:18:50 +01:00
|
|
|
});
|