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
|
|
|
*/
|
2015-05-06 01:18:54 +02:00
|
|
|
JX.behavior('pholio-mock-view', function(config, statics) {
|
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-07 15:26:36 +01:00
|
|
|
|
2014-06-15 03:40:52 +02:00
|
|
|
var selection_reticle;
|
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 02:54:58 +01:00
|
|
|
function get_image_index(id) {
|
2015-05-06 01:18:54 +02:00
|
|
|
for (var ii = 0; ii < statics.images.length; ii++) {
|
|
|
|
if (statics.images[ii].id == id) {
|
2013-03-05 02:54:58 +01:00
|
|
|
return ii;
|
2013-02-22 19:34:32 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2014-06-15 06:12:19 +02:00
|
|
|
function get_image_navindex(id) {
|
2015-05-06 01:18:54 +02:00
|
|
|
for (var ii = 0; ii < statics.navsequence.length; ii++) {
|
|
|
|
if (statics.navsequence[ii] == id) {
|
2014-06-15 06:12:19 +02:00
|
|
|
return ii;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|
2015-05-06 01:18:54 +02:00
|
|
|
return statics.images[idx];
|
2013-03-05 02:54:58 +01:00
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
}
|
2014-06-15 06:12:19 +02:00
|
|
|
var idx = get_image_navindex(active_image.id);
|
|
|
|
if (idx === null) {
|
|
|
|
return;
|
|
|
|
}
|
2015-05-06 01:18:54 +02:00
|
|
|
idx = (idx + delta + statics.navsequence.length) %
|
|
|
|
statics.navsequence.length;
|
|
|
|
select_image(statics.navsequence[idx]);
|
2013-03-05 02:54:58 +01:00
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:56 +01:00
|
|
|
function redraw_image() {
|
2015-05-06 01:18:54 +02:00
|
|
|
if (!statics.enabled) {
|
|
|
|
return;
|
|
|
|
}
|
2014-06-15 04:23:21 +02:00
|
|
|
var new_y;
|
2013-03-05 21:31:30 +01:00
|
|
|
|
2014-06-15 04:23:21 +02:00
|
|
|
// If we don't have an image yet, just scale the stage relative to the
|
|
|
|
// entire viewport height so the jump isn't too jumpy when the image loads.
|
2013-02-23 15:28:56 +01:00
|
|
|
if (!active_image || !active_image.tag) {
|
2014-06-15 04:23:21 +02:00
|
|
|
new_y = (JX.Vector.getViewport().y * 0.80);
|
|
|
|
new_y = Math.max(320, new_y);
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.panel.style.height = new_y + 'px';
|
2014-06-15 04:23:21 +02:00
|
|
|
|
2013-02-23 15:28:56 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var tag = active_image.tag;
|
|
|
|
|
2014-06-15 04:23:21 +02:00
|
|
|
// If the image is too wide for the viewport, scale it down so it fits.
|
|
|
|
// If it is too tall, just let the viewport scroll.
|
2015-05-06 01:18:54 +02:00
|
|
|
var w = JX.Vector.getDim(statics.panel);
|
2014-06-15 04:23:21 +02:00
|
|
|
|
|
|
|
// Leave 24px margins on either side of the image.
|
2014-06-15 04:23:04 +02:00
|
|
|
w.x -= 48;
|
|
|
|
|
2013-03-05 21:31:30 +01:00
|
|
|
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 (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
|
|
|
|
2014-06-15 04:23:21 +02:00
|
|
|
// Scale the viewport's vertical size to the image's adjusted size.
|
|
|
|
new_y = Math.max(320, tag.height + 48);
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.panel.style.height = new_y + 'px';
|
2014-06-15 04:23:21 +02:00
|
|
|
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.viewport.style.top = Math.floor((new_y - tag.height) / 2) + 'px';
|
2013-02-23 15:28:34 +01:00
|
|
|
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.stage.endLoad();
|
2013-03-05 01:59:16 +01:00
|
|
|
|
2015-05-06 01:18:54 +02:00
|
|
|
JX.DOM.setContent(statics.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
|
|
|
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.stage.beginLoad();
|
2013-03-05 01:59:16 +01:00
|
|
|
|
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);
|
2014-06-15 17:03:04 +02:00
|
|
|
img.src = active_image.stageURI;
|
2013-02-22 19:34:32 +01:00
|
|
|
|
2013-02-27 19:45:51 +01:00
|
|
|
var thumbs = JX.DOM.scry(
|
2014-06-15 06:12:19 +02:00
|
|
|
JX.$('pholio-mock-thumb-grid'),
|
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],
|
2014-06-15 06:12:19 +02:00
|
|
|
'pholio-mock-thumb-grid-current',
|
2013-02-27 19:45:51 +01:00
|
|
|
(active_image.id == thumb_meta.imageID));
|
|
|
|
}
|
|
|
|
|
2013-02-22 19:34:32 +01:00
|
|
|
load_inline_comments();
|
2015-05-06 01:18:54 +02:00
|
|
|
if (image_id != statics.selectedID) {
|
2013-03-05 03:43:29 +01:00
|
|
|
JX.History.replace(active_image.pageURI);
|
|
|
|
}
|
2013-02-22 19:34:32 +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;
|
2013-05-19 02:04:22 +02:00
|
|
|
var addon;
|
2013-03-10 17:22:21 +01:00
|
|
|
|
|
|
|
if (width < min_size) {
|
2013-05-19 02:04:22 +02:00
|
|
|
addon = (min_size-width)/2;
|
2013-03-10 17:22:21 +01:00
|
|
|
|
|
|
|
start.x = Math.max(0, start.x - addon);
|
|
|
|
end.x = Math.min(active_image.tag.naturalWidth, end.x + addon);
|
|
|
|
|
2013-05-19 02:04:22 +02:00
|
|
|
if (start.x === 0) {
|
2013-03-10 17:22:21 +01:00
|
|
|
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) {
|
2013-05-19 02:04:22 +02:00
|
|
|
addon = (min_size-height)/2;
|
2013-03-10 17:22:21 +01:00
|
|
|
|
|
|
|
start.y = Math.max(0, start.y - addon);
|
|
|
|
end.y = Math.min(active_image.tag.naturalHeight, end.y + addon);
|
|
|
|
|
2013-05-19 02:04:22 +02:00
|
|
|
if (start.y === 0) {
|
2013-03-10 17:22:21 +01:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2014-06-15 04:23:04 +02:00
|
|
|
function render_image_header(image) {
|
|
|
|
// 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;
|
|
|
|
if (image.tag) {
|
|
|
|
image_x = image.tag.naturalWidth;
|
|
|
|
image_y = image.tag.naturalHeight;
|
|
|
|
display_x = image.tag.width;
|
|
|
|
}
|
|
|
|
|
|
|
|
var visible = [];
|
|
|
|
if (image_x) {
|
|
|
|
if (display_x) {
|
|
|
|
var area = Math.round(100 * (display_x / image_x));
|
|
|
|
visible.push(
|
|
|
|
JX.$N(
|
|
|
|
'span',
|
|
|
|
{className: 'pholio-visible-size'},
|
|
|
|
[area, '%']));
|
|
|
|
visible.push(' ');
|
|
|
|
}
|
|
|
|
visible.push(['(', image_x, ' \u00d7 ', image_y, ')']);
|
|
|
|
}
|
|
|
|
|
|
|
|
return visible;
|
|
|
|
}
|
|
|
|
|
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) {
|
Quicksand and Pholio - make mock edit work
Summary: Fixes T8036. In addition to making the mock edit work, this tightens quicksand code such that the correct page id is returned even if start() has not been called yet. It also tightens mock view where some functions should respect statics.enabled a bit more.
Test Plan:
clicked edit mock, mock crumb, edit mock, mock crum, edit mock, made edits and they worked! clicked edit mock, mock crumb, edit mock, mock crumb, edit mock, profile icon, hit browser back to edit mock, made edits and they worked!
also observed mock view page not occasionally wigging out from image_onload race not having statics.enabled respect during the above
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T8036
Differential Revision: https://secure.phabricator.com/D12739
2015-05-07 19:42:07 +02:00
|
|
|
if (!statics.enabled) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
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) {
|
|
|
|
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
|
|
|
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.stage.clearStage();
|
2014-06-16 06:10:12 +02:00
|
|
|
var comment_holder = JX.$('mock-image-description');
|
2013-03-05 21:23:17 +01:00
|
|
|
JX.DOM.setContent(comment_holder, render_image_info(active_image));
|
|
|
|
|
2014-06-15 04:23:04 +02:00
|
|
|
var image_header = JX.$('mock-image-header');
|
|
|
|
JX.DOM.setContent(image_header, render_image_header(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-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
|
|
|
|
2014-06-15 03:40:52 +02:00
|
|
|
var classes = [];
|
2014-06-15 03:41:45 +02:00
|
|
|
if (!inline.transactionPHID) {
|
2014-06-19 20:28:01 +02:00
|
|
|
classes.push('pholio-mock-reticle-draft');
|
2014-06-15 03:40:52 +02:00
|
|
|
} else {
|
2014-06-19 20:28:01 +02:00
|
|
|
classes.push('pholio-mock-reticle-final');
|
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
|
|
|
}
|
2014-06-15 03:40:52 +02:00
|
|
|
|
2014-06-19 20:28:01 +02:00
|
|
|
var inline_selection = render_reticle(classes,
|
|
|
|
'pholio-mock-comment-icon phui-font-fa fa-comment');
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.stage.addReticle(inline_selection, inline.id);
|
2014-06-15 03:40:52 +02:00
|
|
|
position_inline_rectangle(inline, inline_selection);
|
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-07-11 00:17:10 +02:00
|
|
|
var scale = get_image_scale();
|
2013-02-23 15:28:34 +01:00
|
|
|
|
|
|
|
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;
|
2013-07-11 00:17:10 +02:00
|
|
|
return Math.min(
|
|
|
|
img.width / img.naturalWidth,
|
|
|
|
img.height / img.naturalHeight);
|
2013-02-23 15:28:34 +01:00
|
|
|
}
|
|
|
|
|
2013-02-23 15:28:23 +01:00
|
|
|
function redraw_selection() {
|
Quicksand and Pholio - make mock edit work
Summary: Fixes T8036. In addition to making the mock edit work, this tightens quicksand code such that the correct page id is returned even if start() has not been called yet. It also tightens mock view where some functions should respect statics.enabled a bit more.
Test Plan:
clicked edit mock, mock crumb, edit mock, mock crum, edit mock, made edits and they worked! clicked edit mock, mock crumb, edit mock, mock crumb, edit mock, profile icon, hit browser back to edit mock, made edits and they worked!
also observed mock view page not occasionally wigging out from image_onload race not having statics.enabled respect during the above
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin, epriestley
Maniphest Tasks: T8036
Differential Revision: https://secure.phabricator.com/D12739
2015-05-07 19:42:07 +02:00
|
|
|
if (!statics.enabled) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-06-15 03:40:52 +02:00
|
|
|
var classes = ['pholio-mock-reticle-selection'];
|
2014-06-19 20:28:01 +02:00
|
|
|
selection_reticle = selection_reticle || render_reticle(classes, '');
|
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;
|
|
|
|
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.viewport.appendChild(selection_reticle);
|
2014-06-15 03:40:52 +02:00
|
|
|
p.setPos(selection_reticle);
|
|
|
|
d.setDim(selection_reticle);
|
2013-02-23 15:28:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function clear_selection() {
|
2014-06-15 03:40:52 +02:00
|
|
|
selection_reticle && JX.DOM.remove(selection_reticle);
|
|
|
|
selection_reticle = null;
|
2013-02-23 15:28:23 +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_comments() {
|
|
|
|
var id = active_image.id;
|
2014-06-15 03:41:45 +02:00
|
|
|
var inline_comments_uri = '/pholio/inline/list/' + 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
|
|
|
|
2013-03-05 21:23:17 +01:00
|
|
|
|
|
|
|
/* -( Render )------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
function render_image_info(image) {
|
|
|
|
var info = [];
|
|
|
|
|
2014-06-15 17:03:04 +02:00
|
|
|
var buttons = [];
|
|
|
|
|
2014-06-16 18:15:25 +02:00
|
|
|
var classes = ['pholio-image-button'];
|
|
|
|
|
|
|
|
if (image.isViewable) {
|
|
|
|
classes.push('pholio-image-button-active');
|
|
|
|
} else {
|
|
|
|
classes.push('pholio-image-button-disabled');
|
|
|
|
}
|
|
|
|
|
2014-06-15 17:03:04 +02:00
|
|
|
buttons.push(
|
|
|
|
JX.$N(
|
|
|
|
'div',
|
|
|
|
{
|
2014-06-16 18:15:25 +02:00
|
|
|
className: classes.join(' ')
|
2014-06-15 17:03:04 +02:00
|
|
|
},
|
|
|
|
JX.$N(
|
|
|
|
image.isViewable ? 'a' : 'span',
|
|
|
|
{
|
|
|
|
href: image.fullURI,
|
|
|
|
target: '_blank',
|
|
|
|
className: 'pholio-image-button-link'
|
|
|
|
},
|
2015-05-06 01:18:54 +02:00
|
|
|
JX.$H(statics.fullIcon))));
|
2014-06-15 17:03:04 +02:00
|
|
|
|
2014-06-16 18:15:25 +02:00
|
|
|
classes = ['pholio-image-button', 'pholio-image-button-active'];
|
|
|
|
|
2014-06-15 17:03:04 +02:00
|
|
|
buttons.push(
|
|
|
|
JX.$N(
|
2014-06-16 18:15:25 +02:00
|
|
|
'form',
|
2014-06-15 17:03:04 +02:00
|
|
|
{
|
2014-06-16 18:15:25 +02:00
|
|
|
className: classes.join(' '),
|
|
|
|
action: image.downloadURI,
|
|
|
|
method: 'POST',
|
|
|
|
sigil: 'download'
|
2014-06-15 17:03:04 +02:00
|
|
|
},
|
|
|
|
JX.$N(
|
2014-06-16 18:15:25 +02:00
|
|
|
'button',
|
2014-06-15 17:03:04 +02:00
|
|
|
{
|
|
|
|
href: image.downloadURI,
|
|
|
|
className: 'pholio-image-button-link'
|
|
|
|
},
|
2015-05-06 01:18:54 +02:00
|
|
|
JX.$H(statics.downloadIcon))));
|
2014-06-15 17:03:04 +02:00
|
|
|
|
2014-06-16 20:48:54 +02:00
|
|
|
if (image.title === '') {
|
|
|
|
image.title = 'Untitled Masterpiece';
|
|
|
|
}
|
2013-03-05 21:23:17 +01:00
|
|
|
var title = JX.$N(
|
|
|
|
'div',
|
|
|
|
{className: 'pholio-image-title'},
|
|
|
|
image.title);
|
|
|
|
info.push(title);
|
|
|
|
|
2013-08-01 22:59:37 +02:00
|
|
|
if (!image.isObsolete) {
|
2015-05-06 01:18:54 +02:00
|
|
|
var img_len = statics.currentSetSize;
|
2014-06-22 20:09:05 +02:00
|
|
|
var rev = JX.$N(
|
2013-08-01 22:59:37 +02:00
|
|
|
'div',
|
2014-06-22 20:09:05 +02:00
|
|
|
{className: 'pholio-image-revision'},
|
|
|
|
JX.$H('Current Revision (' + img_len + ' images)'));
|
|
|
|
info.push(rev);
|
|
|
|
} else {
|
|
|
|
var prev = JX.$N(
|
|
|
|
'div',
|
|
|
|
{className: 'pholio-image-revision'},
|
|
|
|
JX.$H('(Previous Revision)'));
|
|
|
|
info.push(prev);
|
2013-08-01 22:59:37 +02:00
|
|
|
}
|
2013-03-14 17:38:56 +01:00
|
|
|
|
2013-03-05 21:23:17 +01:00
|
|
|
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);
|
|
|
|
|
2014-06-17 19:11:29 +02:00
|
|
|
if (image.descriptionMarkup === '') {
|
|
|
|
return [buttons, info];
|
|
|
|
} else {
|
|
|
|
var desc = JX.$N(
|
|
|
|
'div',
|
|
|
|
{className: 'pholio-image-description'},
|
|
|
|
JX.$H(image.descriptionMarkup));
|
|
|
|
return [buttons, info, desc];
|
|
|
|
}
|
2013-03-05 21:23:17 +01:00
|
|
|
}
|
|
|
|
|
2014-06-19 20:28:01 +02:00
|
|
|
function render_reticle(classes, inner_classes) {
|
|
|
|
var inner = JX.$N('div', {className: inner_classes});
|
|
|
|
var outer = JX.$N(
|
2013-03-05 21:29:39 +01:00
|
|
|
'div',
|
2014-06-19 20:28:01 +02:00
|
|
|
{className: ['pholio-mock-reticle'].concat(classes).join(' ')}, inner);
|
|
|
|
return outer;
|
2013-03-05 21:29:39 +01:00
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
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() {
|
2014-06-15 17:03:04 +02:00
|
|
|
image.src = active_image.stageURI;
|
2013-03-05 21:30:58 +01:00
|
|
|
}, 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;
|
|
|
|
}
|
|
|
|
|
2014-06-23 19:27:47 +02:00
|
|
|
function lightbox_resize() {
|
2015-05-06 01:18:54 +02:00
|
|
|
if (!statics.enabled) {
|
|
|
|
return;
|
|
|
|
}
|
2013-03-05 21:30:58 +01:00
|
|
|
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 )------------------------------------------------------------ */
|
|
|
|
|
|
|
|
|
|
|
|
function preload_next() {
|
2015-05-06 01:18:54 +02:00
|
|
|
var next_src = statics.preload[0];
|
2013-03-10 21:30:41 +01:00
|
|
|
if (!next_src) {
|
|
|
|
return;
|
|
|
|
}
|
2015-05-06 01:18:54 +02:00
|
|
|
statics.preload.splice(0, 1);
|
2013-03-10 21:30:41 +01:00
|
|
|
|
|
|
|
var img = JX.$N('img');
|
|
|
|
img.onload = preload_next;
|
|
|
|
img.onerror = preload_next;
|
|
|
|
img.src = next_src;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-05-06 01:18:54 +02:00
|
|
|
/* -( Installaton )-------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
function update_statics(data) {
|
|
|
|
statics.enabled = true;
|
|
|
|
|
|
|
|
statics.mockID = data.mockID;
|
|
|
|
statics.commentFormID = data.commentFormID;
|
|
|
|
statics.images = data.images;
|
|
|
|
statics.selectedID = data.selectedID;
|
|
|
|
statics.loggedIn = data.loggedIn;
|
|
|
|
statics.logInLink = data.logInLink;
|
|
|
|
statics.navsequence = data.navsequence;
|
|
|
|
statics.downloadIcon = data.downloadIcon;
|
|
|
|
statics.fullIcon = data.fullIcon;
|
|
|
|
statics.currentSetSize = data.currentSetSize;
|
|
|
|
|
|
|
|
statics.stage = (function() {
|
|
|
|
var loading = false;
|
|
|
|
var stageElement = JX.$(data.panelID);
|
|
|
|
var viewElement = JX.$(data.viewportID);
|
|
|
|
var reticles = [];
|
|
|
|
|
|
|
|
function begin_load() {
|
|
|
|
if (loading) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
loading = true;
|
|
|
|
clear_stage();
|
|
|
|
draw_loading();
|
|
|
|
}
|
|
|
|
|
|
|
|
function end_load() {
|
|
|
|
if (!loading) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
loading = false;
|
|
|
|
draw_loading();
|
|
|
|
}
|
|
|
|
|
|
|
|
function draw_loading() {
|
|
|
|
JX.DOM.alterClass(stageElement, 'pholio-image-loading', loading);
|
|
|
|
}
|
|
|
|
|
|
|
|
function add_reticle(reticle, id) {
|
|
|
|
mark_ref(reticle, id);
|
|
|
|
reticles.push(reticle);
|
|
|
|
viewElement.appendChild(reticle);
|
|
|
|
}
|
|
|
|
|
|
|
|
function clear_stage() {
|
|
|
|
var ii;
|
|
|
|
for (ii = 0; ii < reticles.length; ii++) {
|
|
|
|
JX.DOM.remove(reticles[ii]);
|
|
|
|
}
|
|
|
|
reticles = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
function mark_ref(node, id) {
|
|
|
|
JX.Stratcom.addSigil(node, 'pholio-inline-ref');
|
|
|
|
JX.Stratcom.addData(node, {inlineID: id});
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
beginLoad: begin_load,
|
|
|
|
endLoad: end_load,
|
|
|
|
addReticle: add_reticle,
|
|
|
|
clearStage: clear_stage
|
|
|
|
};
|
|
|
|
})();
|
|
|
|
|
|
|
|
statics.panel = JX.$(data.panelID);
|
|
|
|
statics.viewport = JX.$(data.viewportID);
|
|
|
|
|
|
|
|
select_image(data.selectedID);
|
|
|
|
|
|
|
|
load_inline_comments();
|
|
|
|
if (data.loggedIn && data.commentFormID) {
|
|
|
|
JX.DOM.invoke(JX.$(data.commentFormID), 'shouldRefresh');
|
|
|
|
}
|
|
|
|
redraw_image();
|
|
|
|
|
|
|
|
statics.preload = [];
|
|
|
|
for (var ii = 0; ii < data.images.length; ii++) {
|
|
|
|
statics.preload.push(data.images[ii].stageURI);
|
|
|
|
}
|
|
|
|
|
|
|
|
preload_next();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_extra_listeners() {
|
|
|
|
JX.DOM.listen(statics.panel, 'gesture.swipe.end', null, function(e) {
|
|
|
|
var data = e.getData();
|
|
|
|
|
|
|
|
if (data.length <= (JX.Vector.getDim(statics.panel) / 2)) {
|
|
|
|
// If the user didn't move their finger far enough, don't switch.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
switch_image(data.direction == 'right' ? -1 : 1);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_mock_view() {
|
|
|
|
JX.enableDispatch(document.body, 'mouseenter');
|
|
|
|
JX.enableDispatch(document.body, 'mouseleave');
|
|
|
|
|
|
|
|
JX.Stratcom.listen(
|
|
|
|
['mouseenter', 'mouseover'],
|
|
|
|
'mock-panel',
|
|
|
|
function(e) {
|
|
|
|
JX.DOM.alterClass(e.getNode('mock-panel'), 'mock-has-cursor', true);
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.Stratcom.listen('mouseleave', 'mock-panel', function(e) {
|
|
|
|
var node = e.getNode('mock-panel');
|
|
|
|
if (e.getTarget() == node) {
|
|
|
|
JX.DOM.alterClass(node, 'mock-has-cursor', false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.Stratcom.listen(
|
|
|
|
'click',
|
|
|
|
'mock-thumbnail',
|
|
|
|
function(e) {
|
|
|
|
if (!e.isNormalMouseEvent()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
e.kill();
|
|
|
|
select_image(e.getNodeData('mock-thumbnail').imageID);
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.Stratcom.listen('mousedown', 'mock-viewport', function(e) {
|
|
|
|
if (!e.isNormalMouseEvent()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (JX.Device.getDevice() != 'desktop') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (JX.Stratcom.pass()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_dragging) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
e.kill();
|
|
|
|
|
|
|
|
if (!active_image.isImage) {
|
|
|
|
// If this is a PDF or something like that, we eat the event but we
|
|
|
|
// don't let users add inlines to the thumbnail.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
is_dragging = true;
|
|
|
|
drag_begin = get_image_xy(JX.$V(e));
|
|
|
|
drag_end = drag_begin;
|
|
|
|
|
|
|
|
redraw_selection();
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.enableDispatch(document.body, 'mousemove');
|
|
|
|
JX.Stratcom.listen('mousemove', null, function(e) {
|
|
|
|
if (!statics.enabled) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!is_dragging) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
drag_end = get_image_xy(JX.$V(e));
|
|
|
|
redraw_selection();
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.Stratcom.listen(
|
|
|
|
'mousedown',
|
|
|
|
'pholio-inline-ref',
|
|
|
|
function(e) {
|
|
|
|
e.kill();
|
|
|
|
|
|
|
|
var id = e.getNodeData('pholio-inline-ref').inlineID;
|
|
|
|
|
|
|
|
var active_id = active_image.id;
|
|
|
|
var handler = function(r) {
|
|
|
|
var inlines = inline_comments[active_id];
|
|
|
|
|
|
|
|
for (var ii = 0; ii < inlines.length; ii++) {
|
|
|
|
if (inlines[ii].id == id) {
|
|
|
|
if (r.id) {
|
|
|
|
inlines[ii] = r;
|
|
|
|
} else {
|
|
|
|
inlines.splice(ii, 1);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
redraw_inlines(active_id);
|
|
|
|
JX.DOM.invoke(JX.$(statics.commentFormID), 'shouldRefresh');
|
|
|
|
};
|
|
|
|
|
|
|
|
new JX.Workflow('/pholio/inline/' + id + '/')
|
|
|
|
.setHandler(handler)
|
|
|
|
.start();
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.Stratcom.listen(
|
|
|
|
'mouseup',
|
|
|
|
null,
|
|
|
|
function(e) {
|
|
|
|
if (!statics.enabled) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!is_dragging) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
is_dragging = false;
|
|
|
|
if (!statics.loggedIn) {
|
|
|
|
new JX.Workflow(statics.logInLink).start();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
drag_end = get_image_xy(JX.$V(e));
|
|
|
|
|
|
|
|
resize_selection(16);
|
|
|
|
|
|
|
|
var data = {
|
|
|
|
mockID: statics.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)
|
|
|
|
};
|
|
|
|
|
|
|
|
var handler = function(r) {
|
|
|
|
if (!inline_comments[active_image.id]) {
|
|
|
|
inline_comments[active_image.id] = [];
|
|
|
|
}
|
|
|
|
inline_comments[active_image.id].push(r);
|
|
|
|
|
|
|
|
redraw_inlines(active_image.id);
|
|
|
|
JX.DOM.invoke(JX.$(statics.commentFormID), 'shouldRefresh');
|
|
|
|
};
|
|
|
|
|
|
|
|
clear_selection();
|
|
|
|
|
|
|
|
new JX.Workflow('/pholio/inline/', data)
|
|
|
|
.setHandler(handler)
|
|
|
|
.start();
|
|
|
|
});
|
|
|
|
|
|
|
|
JX.Stratcom.listen('resize', null, redraw_image);
|
|
|
|
|
|
|
|
|
|
|
|
/* Keyboard Shortcuts */
|
|
|
|
new JX.KeyboardShortcut(['j', 'right'], 'Show next image.')
|
|
|
|
.setHandler(function() {
|
|
|
|
switch_image(1);
|
|
|
|
})
|
|
|
|
.register();
|
|
|
|
|
|
|
|
new JX.KeyboardShortcut(['k', 'left'], 'Show previous image.')
|
|
|
|
.setHandler(function() {
|
|
|
|
switch_image(-1);
|
|
|
|
})
|
|
|
|
.register();
|
|
|
|
|
|
|
|
|
|
|
|
/* Lightbox listeners */
|
|
|
|
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);
|
|
|
|
|
|
|
|
JX.Stratcom.listen(
|
|
|
|
'quicksand-redraw',
|
|
|
|
null,
|
|
|
|
function (e) {
|
|
|
|
var data = e.getData();
|
|
|
|
var new_config;
|
|
|
|
if (!data.newResponse.mockViewConfig) {
|
|
|
|
statics.enabled = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (data.fromServer) {
|
|
|
|
new_config = data.newResponse.mockViewConfig;
|
|
|
|
} else {
|
|
|
|
new_config = statics.mockViewConfigCache[data.newResponseID];
|
|
|
|
}
|
|
|
|
update_statics(new_config);
|
|
|
|
if (data.fromServer) {
|
|
|
|
install_extra_listeners();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!statics.installed) {
|
|
|
|
var current_page_id = JX.Quicksand.getCurrentPageID();
|
|
|
|
statics.mockViewConfigCache = {};
|
|
|
|
statics.mockViewConfigCache[current_page_id] = config;
|
|
|
|
update_statics(config);
|
|
|
|
|
|
|
|
statics.installed = install_mock_view();
|
|
|
|
install_extra_listeners();
|
|
|
|
}
|
2013-03-10 21:30:41 +01:00
|
|
|
|
2013-01-28 20:18:50 +01:00
|
|
|
});
|