From dcf3b4d322996a2202cc69ce0897bd121bf38f75 Mon Sep 17 00:00:00 2001 From: epriestley Date: Sun, 15 Jun 2014 08:03:04 -0700 Subject: [PATCH] Reduce Pholio brokenness for non-image files Summary: Ref T5359. When users upload non-image file types (PDFs, text files, whatever), Pholio currently chokes in a few places. Make most of these behaviors more reasonable: - Provide thumbs in the required sizes. - Predict the thumb size of these files correctly. - Disable inline comments. - Make "View Fullsize" and "Download" into buttons. These mostly-work. Download should probaly really download, but CSRF on forms is a bit of a pain right now. Test Plan: See screenshots. Reviewers: chad Reviewed By: chad Subscribers: epriestley Maniphest Tasks: T5359 Differential Revision: https://secure.phabricator.com/D9548 --- resources/celerity/map.php | 60 ++++++++++-------- .../PhabricatorFileTransformController.php | 11 ++-- .../files/storage/PhabricatorFile.php | 6 -- .../pholio/view/PholioMockImagesView.php | 13 ++++ .../pholio/view/PholioMockThumbGridView.php | 15 ++++- src/infrastructure/celerity/api.php | 11 ++-- .../pholio/pholio-inline-comments.css | 1 + .../rsrc/css/application/pholio/pholio.css | 33 ++++++++++ .../icon/fatcow/thumbnails/default.p100.png | Bin 0 -> 1720 bytes .../icon/fatcow/thumbnails/default280x210.png | Bin 0 -> 2123 bytes .../icon/fatcow/thumbnails/image.p100.png | Bin 0 -> 2167 bytes .../icon/fatcow/thumbnails/image280x210.png | Bin 0 -> 2600 bytes .../image/icon/fatcow/thumbnails/pdf.p100.png | Bin 0 -> 2363 bytes .../icon/fatcow/thumbnails/pdf280x210.png | Bin 0 -> 2824 bytes .../image/icon/fatcow/thumbnails/zip.p100.png | Bin 0 -> 2067 bytes .../icon/fatcow/thumbnails/zip280x210.png | Bin 0 -> 2511 bytes .../pholio/behavior-pholio-mock-view.js | 53 +++++++++++++--- 17 files changed, 147 insertions(+), 56 deletions(-) create mode 100644 webroot/rsrc/image/icon/fatcow/thumbnails/default.p100.png create mode 100644 webroot/rsrc/image/icon/fatcow/thumbnails/default280x210.png create mode 100644 webroot/rsrc/image/icon/fatcow/thumbnails/image.p100.png create mode 100644 webroot/rsrc/image/icon/fatcow/thumbnails/image280x210.png create mode 100644 webroot/rsrc/image/icon/fatcow/thumbnails/pdf.p100.png create mode 100644 webroot/rsrc/image/icon/fatcow/thumbnails/pdf280x210.png create mode 100644 webroot/rsrc/image/icon/fatcow/thumbnails/zip.p100.png create mode 100644 webroot/rsrc/image/icon/fatcow/thumbnails/zip280x210.png diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 3bb43e9922..5ff684d7e7 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -80,8 +80,8 @@ return array( 'rsrc/css/application/people/people-profile.css' => 'ba7b2762', 'rsrc/css/application/phame/phame.css' => '19ecc703', 'rsrc/css/application/pholio/pholio-edit.css' => 'b9e59b6d', - 'rsrc/css/application/pholio/pholio-inline-comments.css' => '609c3320', - 'rsrc/css/application/pholio/pholio.css' => '72af321e', + 'rsrc/css/application/pholio/pholio-inline-comments.css' => '3d5a5590', + 'rsrc/css/application/pholio/pholio.css' => '344c1440', 'rsrc/css/application/phortune/phortune-credit-card-form.css' => 'b25b4beb', 'rsrc/css/application/phrequent/phrequent.css' => 'ffc185ad', 'rsrc/css/application/phriction/phriction-document-css.css' => '7d7f0071', @@ -261,13 +261,21 @@ return array( 'rsrc/image/icon/fatcow/source/mobile.png' => 'f1321264', 'rsrc/image/icon/fatcow/source/tablet.png' => '49396799', 'rsrc/image/icon/fatcow/source/web.png' => '136ccb5d', + 'rsrc/image/icon/fatcow/thumbnails/default.p100.png' => '7d490b01', 'rsrc/image/icon/fatcow/thumbnails/default160x120.png' => 'f2e8a2eb', + 'rsrc/image/icon/fatcow/thumbnails/default280x210.png' => '43e8926a', 'rsrc/image/icon/fatcow/thumbnails/default60x45.png' => '0118abed', + 'rsrc/image/icon/fatcow/thumbnails/image.p100.png' => 'da23cf97', 'rsrc/image/icon/fatcow/thumbnails/image160x120.png' => '79bb556a', + 'rsrc/image/icon/fatcow/thumbnails/image280x210.png' => '91ae054a', 'rsrc/image/icon/fatcow/thumbnails/image60x45.png' => 'c5e1685e', + 'rsrc/image/icon/fatcow/thumbnails/pdf.p100.png' => '87d5e065', 'rsrc/image/icon/fatcow/thumbnails/pdf160x120.png' => 'ac9edbf5', + 'rsrc/image/icon/fatcow/thumbnails/pdf280x210.png' => '1c585653', 'rsrc/image/icon/fatcow/thumbnails/pdf60x45.png' => 'c0db4143', + 'rsrc/image/icon/fatcow/thumbnails/zip.p100.png' => '6ea5aae4', 'rsrc/image/icon/fatcow/thumbnails/zip160x120.png' => '75f9cd0f', + 'rsrc/image/icon/fatcow/thumbnails/zip280x210.png' => 'dfda5b8e', 'rsrc/image/icon/fatcow/thumbnails/zip60x45.png' => 'af11bf3e', 'rsrc/image/icon/lightbox/close-2.png' => 'cc40e7c8', 'rsrc/image/icon/lightbox/close-hover-2.png' => 'fb5d6d9e', @@ -390,7 +398,7 @@ return array( 'rsrc/js/application/passphrase/phame-credential-control.js' => '1e1c8a59', 'rsrc/js/application/phame/phame-post-preview.js' => '61d927ec', 'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '1e1e8bb0', - 'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => '09c4fe2d', + 'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => 'd7f9b108', 'rsrc/js/application/phortune/behavior-balanced-payment-form.js' => '3b3e1664', 'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '1693a296', 'rsrc/js/application/phortune/behavior-test-payment-form.js' => 'b3e5ee60', @@ -614,7 +622,7 @@ return array( 'javelin-behavior-phabricator-watch-anchor' => '06e05112', 'javelin-behavior-phame-post-preview' => '61d927ec', 'javelin-behavior-pholio-mock-edit' => '1e1e8bb0', - 'javelin-behavior-pholio-mock-view' => '09c4fe2d', + 'javelin-behavior-pholio-mock-view' => 'd7f9b108', 'javelin-behavior-phui-object-box-tabs' => 'a3e2244e', 'javelin-behavior-phui-timeline-dropdown-menu' => '4d94d9c3', 'javelin-behavior-policy-control' => 'f3fef818', @@ -740,9 +748,9 @@ return array( 'phabricator-uiexample-reactor-sendproperties' => '551add57', 'phabricator-zindex-css' => 'efb673ac', 'phame-css' => '19ecc703', - 'pholio-css' => '72af321e', + 'pholio-css' => '344c1440', 'pholio-edit-css' => 'b9e59b6d', - 'pholio-inline-comments-css' => '609c3320', + 'pholio-inline-comments-css' => '3d5a5590', 'phortune-credit-card-form' => '2290aeef', 'phortune-credit-card-form-css' => 'b25b4beb', 'phrequent-css' => 'ffc185ad', @@ -875,21 +883,6 @@ return array( 7 => 'javelin-uri', 8 => 'javelin-routable', ), - '09c4fe2d' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', - 4 => 'javelin-vector', - 5 => 'javelin-magical-init', - 6 => 'javelin-request', - 7 => 'javelin-history', - 8 => 'javelin-workflow', - 9 => 'javelin-mask', - 10 => 'javelin-behavior-device', - 11 => 'phabricator-keyboard-shortcut', - ), '0a3f3021' => array( 0 => 'javelin-behavior', @@ -1270,6 +1263,11 @@ return array( 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), + '7319e029' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-dom', + ), '62e18640' => array( 0 => 'javelin-install', @@ -1342,11 +1340,6 @@ return array( 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), - '7319e029' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - ), '76f4ebed' => array( 0 => 'javelin-install', @@ -1875,6 +1868,21 @@ return array( 3 => 'javelin-dom', 4 => 'phabricator-keyboard-shortcut', ), + 'd7f9b108' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-util', + 2 => 'javelin-stratcom', + 3 => 'javelin-dom', + 4 => 'javelin-vector', + 5 => 'javelin-magical-init', + 6 => 'javelin-request', + 7 => 'javelin-history', + 8 => 'javelin-workflow', + 9 => 'javelin-mask', + 10 => 'javelin-behavior-device', + 11 => 'phabricator-keyboard-shortcut', + ), 'd83a949c' => array( 0 => 'javelin-behavior', diff --git a/src/applications/files/controller/PhabricatorFileTransformController.php b/src/applications/files/controller/PhabricatorFileTransformController.php index 6e1002c514..51b5773bde 100644 --- a/src/applications/files/controller/PhabricatorFileTransformController.php +++ b/src/applications/files/controller/PhabricatorFileTransformController.php @@ -68,9 +68,6 @@ final class PhabricatorFileTransformController case 'preview-100': $xformed_file = $this->executePreviewTransform($file, 100); break; - case 'preview-140': - $xformed_file = $this->executePreviewTransform($file, 140); - break; case 'preview-220': $xformed_file = $this->executePreviewTransform($file, 220); break; @@ -115,18 +112,24 @@ final class PhabricatorFileTransformController } switch ($this->transform) { + case 'thumb-280x210': + $suffix = '280x210'; + break; case 'thumb-160x120': $suffix = '160x120'; break; case 'thumb-60x45': $suffix = '60x45'; break; + case 'preview-100': + $suffix = '.p100'; + break; default: throw new Exception('Unsupported transformation type!'); } $path = celerity_get_resource_uri( - "/rsrc/image/icon/fatcow/thumbnails/{$prefix}{$suffix}.png"); + "rsrc/image/icon/fatcow/thumbnails/{$prefix}{$suffix}.png"); return id(new AphrontRedirectResponse()) ->setURI($path); diff --git a/src/applications/files/storage/PhabricatorFile.php b/src/applications/files/storage/PhabricatorFile.php index 8aa4b94c26..df8b005d1d 100644 --- a/src/applications/files/storage/PhabricatorFile.php +++ b/src/applications/files/storage/PhabricatorFile.php @@ -544,12 +544,6 @@ final class PhabricatorFile extends PhabricatorFileDAO return PhabricatorEnv::getCDNURI($path); } - public function getPreview140URI() { - $path = '/file/xform/preview-140/'.$this->getPHID().'/' - .$this->getSecretKey().'/'; - return PhabricatorEnv::getCDNURI($path); - } - public function getPreview220URI() { $path = '/file/xform/preview-220/'.$this->getPHID().'/' .$this->getSecretKey().'/'; diff --git a/src/applications/pholio/view/PholioMockImagesView.php b/src/applications/pholio/view/PholioMockImagesView.php index ba980e1580..fcdbc2d4b2 100644 --- a/src/applications/pholio/view/PholioMockImagesView.php +++ b/src/applications/pholio/view/PholioMockImagesView.php @@ -62,6 +62,11 @@ final class PholioMockImagesView extends AphrontView { $selected_id = head_key($ids); } + // TODO: We could maybe do a better job with tailoring this, which is the + // image shown on the review stage. + $nonimage_uri = celerity_get_resource_uri( + 'rsrc/image/icon/fatcow/thumbnails/default.p100.png'); + foreach ($mock->getAllImages() as $image) { $file = $image->getFile(); $metadata = $file->getMetadata(); @@ -72,13 +77,19 @@ final class PholioMockImagesView extends AphrontView { $images[] = array( 'id' => $image->getID(), 'fullURI' => $file->getBestURI(), + 'stageURI' => ($file->isViewableImage() + ? $file->getBestURI() + : $nonimage_uri), 'pageURI' => $this->getImagePageURI($image, $mock), + 'downloadURI' => $file->getInfoURI(), 'historyURI' => $history_uri, 'width' => $x, 'height' => $y, 'title' => $image->getName(), 'desc' => $image->getDescription(), 'isObsolete' => (bool)$image->getIsObsolete(), + 'isImage' => $file->isViewableImage(), + 'isViewable' => $file->isViewableInBrowser(), ); } @@ -99,6 +110,8 @@ final class PholioMockImagesView extends AphrontView { 'loggedIn' => $this->getUser()->isLoggedIn(), 'logInLink' => (string) $login_uri, 'navsequence' => $navsequence, + 'fullIcon' => id(new PHUIIconView())->setIconFont('fa-arrows-alt'), + 'downloadIcon' => id(new PHUIIconView())->setIconFont('fa-download'), ); Javelin::initBehavior('pholio-mock-view', $config); diff --git a/src/applications/pholio/view/PholioMockThumbGridView.php b/src/applications/pholio/view/PholioMockThumbGridView.php index ced0fe73b0..9ca35cb58c 100644 --- a/src/applications/pholio/view/PholioMockThumbGridView.php +++ b/src/applications/pholio/view/PholioMockThumbGridView.php @@ -101,9 +101,18 @@ final class PholioMockThumbGridView extends AphrontView { private function renderThumbnail(PholioImage $image) { $thumbfile = $image->getFile(); - $dimensions = PhabricatorImageTransformer::getPreviewDimensions( - $thumbfile, - 100); + if ($image->getFile()->isViewableImage()) { + $dimensions = PhabricatorImageTransformer::getPreviewDimensions( + $thumbfile, + 100); + } else { + // If this is a PDF or a text file or something, we'll end up using a + // generic thumbnail which is always sized correctly. + $dimensions = array( + 'sdx' => 100, + 'sdy' => 100, + ); + } $tag = phutil_tag( 'img', diff --git a/src/infrastructure/celerity/api.php b/src/infrastructure/celerity/api.php index c10b7a1d40..6c51f6beec 100644 --- a/src/infrastructure/celerity/api.php +++ b/src/infrastructure/celerity/api.php @@ -50,12 +50,9 @@ function celerity_generate_unique_node_id() { * @group celerity */ function celerity_get_resource_uri($resource, $source = 'phabricator') { + $resource = ltrim($resource, '/'); + $map = CelerityResourceMap::getNamedInstance($source); - - $uri = $map->getURIForName($resource); - if ($uri) { - return $uri; - } - - return $resource; + $response = CelerityAPI::getStaticResourceResponse(); + return $response->getURI($map, $resource); } diff --git a/webroot/rsrc/css/application/pholio/pholio-inline-comments.css b/webroot/rsrc/css/application/pholio/pholio-inline-comments.css index b79ff02a45..b419c394a2 100644 --- a/webroot/rsrc/css/application/pholio/pholio-inline-comments.css +++ b/webroot/rsrc/css/application/pholio/pholio-inline-comments.css @@ -11,6 +11,7 @@ background: #fff; border-top: 1px solid {$thinblueborder}; text-align: left; + overflow: hidden; } .pholio-mock-inline-comments a { diff --git a/webroot/rsrc/css/application/pholio/pholio.css b/webroot/rsrc/css/application/pholio/pholio.css index 5efdd987bd..4fb8802188 100644 --- a/webroot/rsrc/css/application/pholio/pholio.css +++ b/webroot/rsrc/css/application/pholio/pholio.css @@ -167,3 +167,36 @@ text-decoration: none; background: {$indigo}; } + +.pholio-image-button { + float: right; + margin-left: 2px; +} + +.pholio-image-button-link { + width: 56px; + height: 56px; + overflow: hidden; + display: block; + position: relative; + background: {$lightgreybackground}; + text-align: center; + line-height: 56px; + font-size: 24px; +} + +a.pholio-image-button-link:hover { + background: {$darkgreybackground}; +} + +span.pholio-image-button-link .phui-icon-view { + color: {$darkgreybackground}; +} + +a.pholio-image-button-link .phui-icon-view { + color: {$lightgreytext}; +} + +.device-desktop a.pholio-image-button-link:hover .phui-icon-view { + color: {$sky}; +} diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/default.p100.png b/webroot/rsrc/image/icon/fatcow/thumbnails/default.p100.png new file mode 100644 index 0000000000000000000000000000000000000000..f713c2398bafd8dad1d22b179532f0c3920c7dd6 GIT binary patch literal 1720 zcmaJ?3s4hR6kUQKVg($r6rr%hKQ=!C!K?`o5|U61B1FNdErw(RF=RLHE=>@plR9cs zrlW|ltwoJcu+$F}jG`cZriujx3LT`t08<470b8lqDyZG?vz?Ld?CyK-zH`pK@4d6L zpU1^Y7Pu~P1pr_{v{V#NwkrGM;!M8v_YTX+#+!&rA`(zFVNhT&AW)$xFc_^GWfX&UKH3{Kb?D_8E+D!D3Zco@htLZpBWCKRAimyY0&kx!k_g~+}=%%Fl3 z5JJnRP8O9Uivxuy27@7VHciQ7u|N)o&I%6Ua9HnwK}=QtI;Xpy5;M7GW zvtcSV6fY7_FwhNbI*O$-SX?gGt`QVOBM~$_6Co5v8iFsKRuI9s z64U4j4T^wvMMVmlLGY<$rISn0>1SjSd}^D>4PzJ;dIpQmv@dBID3kp^RHvIk<3v3C zy52VmB%!r3^Gy_wT2d7?YPo;;17_1;rOpc=I)4Ld#h7u^AhU!6K0tZ|rQz$iv zJ+OL$A(KJT2u>&vB^)i{Q%McFMx%lR;^0uWK+KI2MhaN0DE8X5kwT$>$z+MxOkoHo zc$zChl^Hr1A*Q*i*IdD@T)P=`dNQ*J#xx(pDlvxYz==gen%Qd!omFp&tD3!*wX<>= zWHAi;(f;eGr$eNF?A;mTl7kuR!wBhjj5K!n_xMKgdkKsd3FOB1q4qN5mpIRw$630S z!GU|!z+%zdq*d$F-=eK62Bk5Eh&$$a&dWSfls!&Hllf<=LyXm7bD?WMnT_JG_vG34 z&GnZq9NJ60S0lLf@YU&(g5nbG*aN&|_=b3+%6vR20thexk$}S6PWJ=dHuOU#uQ56oZvdD(B^S83bj51%3G74BZnQG7GwY~W!3$<6armij!; zqD*Ba9naqGc^>Q>^iOWsWw>d93m0YE7>&NCAF&s;WZOy?;2*WO-mAw)+pG6FZHeq1 z_f9L#iD)o}=68fGta8G15BHQ+So6C4E0gyrcuf`6%~6?&2g}@kqCZ;s+-b)=`1%2D zUf;m@5#x|0_MO&l7qIH6u-s%UAKI?%ICBQQ)zY*k$2Rx)vEq!5{7r2OpCp>SD)Q4M zjW2hg$rg#|`2&ycJ`9pT^9#PFt?~D8l+u0rmk+OW_n0pYTTC$*tP^(obX7WdZ*yx~ zv-*y2t|V;>w;{k(e98TBZeFFYI^zS=)9?HWhaxW4#pgWfr&Yi547b)T&6l?i4SahF zru6#Nruq&z)_fW$VnW|o1K%!!+qyRRX$#<9y}MV@frh!IImN&R8>RmIL0{=#oyV?Q zTULP28K#!qmgZZJ5@X->uB)s7YQJo{W^)TOR$m^JGH88=Q2C;awiOR5g^ bRRE4ajngUZZ?=_SxAIrW3reaf?x$- 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 NV0-$rYCU4I{tE^`U)BHs literal 0 HcmV?d00001 diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/image280x210.png b/webroot/rsrc/image/icon/fatcow/thumbnails/image280x210.png new file mode 100644 index 0000000000000000000000000000000000000000..efdf733f8eeb118cb36403c6cb9a741d0ded879f GIT binary patch literal 2600 zcmbtWYfw{X8jg^n%VJxmD&b;1h7Ls`$q9r6f`Nu4+%yR$P+&ls5DpL_7m`2{5HNP@ zQV=d7t;0fV`M5v1TsA{9!$3_?&NB;gR? zBjQIv9EcyGj_ZbwAP|OM2>pW;LCj-hfkcGm>tnDgkrZYl5J%iqQobMtQUKvllu%4T zPd7B90bv9M9q7aanNk`QE%Z*5LEJ=^zaTM2;1Yp$cLR>7$gqG2Qt$zlC{`>dt0?FV zT{67ZALG!#Mu;MYf_`f%i0KE=Br*ta!a8CEARZ48iC8?riAcoT0}deG0SCe_5rZd? zorq)y67cRp!`WmJkz@|t^Ia}@M?ps`6jCw{r&KDjN=K|j7KOvRxVY#w92_uk1V*kF zEBGpmSZ=+kK!@Z4nNX?_O2mL(ksmIJS5VNf)3+svq+7CL`MWm34a2GUQXC!&>Py-T zWHSGMs7SOGEmv@$|N4Eeu-soQg>W25E{T^3;ERj2)~Aw^X)=hfkjVTclGx2I`bA3= z5_z;l3edPjz?R7u2*vt?LmLbxlk6jwEBImoV>%mj-^2s~-lD6wXYCWWod}!c!&@0UJe= zh41k~BYAib9h`^^ng{j$UfyyeKIp}R@j)***bGj8wf}R~n@8~c=$BiA3vaeY9}>g! zE`tZVn?$;UKp5rw(5e2afyrkNGpzb7T7Ii3ElzTDjUu%X%PNDzMTmed`yHRtO1(Eeh_4nnhfPxv>RnsV} zH|3K(CweGc!yjJc$yrKvplHyjC9I^-;42*4 z7V|EYmRji6R~mGWstfG)F)N~)qx`jHoSNyz`QIrERicL1KmXaJ^-gO3i`gZvvOPAZ z>7+b9VP2A` z$3L#sS~b0y=&Ja8qhI;h0n3rj!KpWYGk%=fW2P&z?_}^$OAJ3R^QzwQYG3PYuffi6 z${P1`*Zno^5BiQacf9;$nG-)aTWeBq^mNdTS;F9A^MVUPs*}_FglbKnTQ^^J%yPG z#_qd~x(9%C(wJ?GojR)mm+8C~_s}jbLBVZ%x&S>`UTj+Fug!j-vckKrdfE?E1rcKK zx|JiPzm7u4%5%pC57fk^GjmXXF#O^*-PRY>1F6fu+$y@)S$Wwv@dn?T9y5Be%*&w$WfBS}g zI3|DbYk#}sxbk*1Gqd^${%L)Qy_Vds7lRrphT^t?2d z^{D;w!lOLQ^yu=eAif!ODZ9qXoR4h%YPkH=GhhE@fx}eTF>Tm2V|9KdIV{t4DiPo&lrZEL655s zGfK5@+D}z9oN`+m^ClF8jC`bqCOMzxA05S0{$P z1eePS_}YT;SL4@k+<>C=`<<4-r%h4Cr^~^RK765gK~smEWB9XmK?%i{6>05Rwm;NZ z^cFEZctN*v31y3OkrtPF^Qxm|WhB=hm64$au3eNF$B; zosn?y+HxJvEhSOA{&L|;s*~iE@CyyUzq+7*p1rrkgpcevg!*@H^kOllM^rJ0FTpmZ zbEA=G53UVs&7Ou#toKY)d8o8*-&ia4n=#Ew9V4lX#Tf!FzIY-oTve*5)1X)PKlj#Z zSlOj^Jr94Y+<)$FGCO>2&v~wJnS3I~O~vG)ym=ktk*S||P0rlDZ`S|y05O?Z)q%IU0 literal 0 HcmV?d00001 diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/pdf.p100.png b/webroot/rsrc/image/icon/fatcow/thumbnails/pdf.p100.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3a39b490701b073d84d8e84756782481356adf GIT binary patch literal 2363 zcmaJ@X;f3!7LLp_5n;(BTmlLTAqgZ5fgl+TLL@>cgCbbRMa2(?z;C3`+VQG_c?p7v+noIRVysb z9L-=bm}LZ=5~J;Ty3fQ&+e-TOv9z57L`{HV#p@wCTMEL6JTV6ZB82QTFa~7vvNK!3 zP#8?#gU?EU5*Sf0(>!8TtEQE2k=8<{7`7^8-T=M@wfoIUm)<|L1?{6 zdF$~p6xs)0+8F_{0fHoW6iP0a`^x=&#nLnsCO9})r{U*^)FP0wY!Sp(AVo6wIRy$R z<4XAwh%XiaIz=`|oCOgO+DPATK`8ksE0TRUChdWt6l@6!{C}uW_z^9G zV!%)FeoX<+$l0Qh#|3TgIEHPV*>y$ z2Aj(l=?qKXF&GSdgh&RlMO-j~LO^IWeEEDHo*YOb1^8jfR5FQ(!BG8!f=FaC5sk)B z{Ly4w0CtW`5p%PIpa`1d@;-4XU*+nGK`7CBrhroZMvzC7iiN4rh=oYQ2Kp0e zw6E%Y;PSo@%R4R!js7YZr40t9OYLW=o-=9dM>qUfxZ26b(g#J_dY5Vo`|U*OY8cG$ zOaz69}jBY)#6`G#cZc+D89Jsyb^y;-AS$ zH+){r?%7kKz8_MeY6^aNNR~$Xv);0epb0WCAk8;XG7U(8trBiR1$5K*?PtbMOCOAL zcwFxI#X(L1{K%cDDXWIMwt64llyHAK@|fwoTUhI`l;mWjHAOQtSpIX%?dFTkC&xYD zx#f=b_Ge4iBz5<{n#gd{-_;&^$F*rq$Hd_{mpwNN&yO83+|XTTJe;1+j7xl#5gXb5 zTbAH%bd+%W zTTa(k`rQ9xu;QM2;A->bCMJtjFs{*@$TPN@0L^XV^;>WEjlZ(!pPn)Gir%}=E;72+ z%&Xe)#BjQ!&0wjoO+#^YF5F}q;~5x;$&1^&e_?yU-}ybq6>H_xnqy%z)zO2ix7Vx0 zHxbxpz2=z34)r{6}Ca{W+mKH#+T=A-`RiZ!Zzh(t<~vevQVRCi#GOX=y%Fhegd1MgG>DVDpdI=!rwy6a(tdQ z0=xe@P^+mXauSOZ&cTB+Z8#Y|W*+N;%=AjOE{)s;Ch-pr)k)@ccIn>>5GQRW2)N=)@fC#@ zyKxPCE!{Ml9cy#ZQ={LHq#qnpy>iS)i7qKx$>{j7t#*$dJvn+|+Nt;1jeY%_h&|mk z4?FH3Zp$|D=+f+U&IqxyNR}JTwmn9UHKkY&zw|eG`qsI~H9B0~wCErGALdU(6_2QW zjog;pXZjQ7heE=FyYJW?nLZQNB&i$uEwbA~sXl47`f_kR&t`O#cxn*#re`R1@(AtU zhpGx5Y!>dn?sEAq7}*(DQ#II?f5kKYpBE_(HEI#%C}2ac(u-DIl-yYMltnKxL3rk3 z8Y*3~kw-6GcwBO_qHY21SLoDpz>(}uDBR+{0-nb#3#Z(hc$vKL_W7li{BbIUpEm&C zG`jfVSf+w!(coecr993nI5Z)T>fU{h$iJ!~SqueA;XN*b;U_IJmkX;V;ilL8Ec(|y zxqj6(@4MK^Qsyt2-v64GIFVAa+Sr!=**0)@5{lj8l5O z3~DcOz|FSl7y`Z{+@t^j*E?=f5bmYt2Dh5`+4VMe1%CA+tgC7=w1>GrJ4hd5QPjHM NnF#7CN;N4p|9?z`!d(CW literal 0 HcmV?d00001 diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/pdf280x210.png b/webroot/rsrc/image/icon/fatcow/thumbnails/pdf280x210.png new file mode 100644 index 0000000000000000000000000000000000000000..8036981aca18575e4fed1ebfa343188e5fed852c GIT binary patch literal 2824 zcmbtWc~p~E7LQUD1$EHMsuE)@D3FDO2!RkVVTmP(ka0i(2_b<1SxABj2}{K(03_q})S?{}AX&%IxQ zo2%32P5PSv0KjIvGtM0VSfi_4cdD;fe$x_%UMhti*TIwP!K89|BsK+LAHejd0P%EE zAjO?R3Wx~1Pq6_2)V`q+J-MC)7ZjOE2a{AfU_PCtL<0ae7(RbO`^oLWP1UDd-$)*4;z;H7%6b1t#kzg3Y0*Qo~0?nZ?a|l%VBF$h3 zlm!xHeh~Qa0V%Dq1E?r>oa0AZ${iXM#O1P35D1UQ1M}cuCOZ%Uv$C>MahRK%DK*SE z5ezPgZ^q#4U1h*gIAk`B#icPBKouj&pBc_YgOr~B5dxj{iI&0nm?mYyAbb)F0s}); zA+0JB2>)A^PXDCM;kr})^!L9KbBGZv3dEhlVTQBG%8R4!RheR;uxtv6%VZOo%+S>= zx&<-0OimD!1;lzFfyM+9nZ{5Z>|a3;2q-**!zD4u6g&nY!Kja_C$W4Y=9oWleeq>?U3x*;N*Zsm3EPDtnPLXL-CJA1;epAhfW&r5YrK( z?gfcIyB(j@IOCk%4XR5!1U#NUV$dcc2#&@B>7qv)=q?-0jwW8mpE$55aON_hlvn+# zRpwJu?VE001PQ zrnLU@9Ysa|hr%8!!Mh-vD&EwaK8q0B3`Hpz>e4g(m-2!K4a>5#TO{cl0_8Iqp_0Za zudj1%Gm@>(#`%vW?#LUcq4%d)_uTYC=QKa^J-o#}r`_Ag^?P@*E-l+P%q8?hjh&n? zn@gCOno7NR<_vGizo)pT^jganv$gj|$K17&m);&G`&au*BK03X+2Q2$K~F>5G=8k* zlG)P|&T~?ly2 zqUW9mc@OB|j~v0(?w&W0vlUa3zcu!1Rj%)PZDg0;N*}#_Q+P*2?!6|8e8>Y$zDz<$ z+R(Q3nsLkg_1nGt{HMCKctt6mR&K39AW77&LGd{~%`Ua`)YJRh*!czB@`!+GsN!uw zH%BK16K1ESdlj5URqW0T8gMv#37oM zM)!FA-3WH>?zV*eG51>cZ7L|QJVz8x3>(KNiYGjUPQ=AaxcS$R=Y~Zom2L(@?L#Nj zHMOL?=n_XpWt3 zD$(t)FcIYJl`dD;_8D3_PL%L@m%XNcx;`{5uAFbpvShb~A1S!lK6n%7^MooL zc38HogylW699fGsz?bn6zkHp6F!N{2>lQ`RirJ32{-3U+7iM%9?`foYFUp-UET4Bv zTr#W$AHC?^x;VIX#Ch8+(0NqQ9hg#T z==9z&zHdDDXavg#v88V3KyRn9m^fI|@|*28iC(3xeDmO)`NAkgUQL1dvWbzwtfFHf z&ib^LZePBsbo2h&d5=fuMR24x8L~TR=6!K$M1S-)pF#{=+CnhRO7!Z;3J$%IYx7Uq z=qS8nVMJ_WO5P$^3`@K1v;4c!z~L+N*yLWzrC=g+*}b9bp_7x7;C^L8e&y(cTO+4t zUxe;#X>vxU1d7J5=iGe+-kwRFc_*#rJv6BsWKU~;tKlN@P8sY;Z8#hAu8dDp)RxGu zY#4cuiG&7A2G3Lc5zEs9-?b+u##oDYWQ5+ceC2#w5i$Nov6v=T`N+mdRWy7`@Y> za_JDcFC*Hz=c_omx=ZxkaNqK}`IrTBE6kqpyqh(`p^3i^%nm)dk#j6pKwq3o4@BP1 zGLXVE61f7Y!7jCzgjMwj|2STcrHXiC>(~XO zHby%|dZ=a{Go4es@jphx7q$4cYG2&qm2*ZlAyzv5|0kAC&Se190KZG}4f=hzW`(Ui{k(Q literal 0 HcmV?d00001 diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/zip.p100.png b/webroot/rsrc/image/icon/fatcow/thumbnails/zip.p100.png new file mode 100644 index 0000000000000000000000000000000000000000..86fa739b3b5bcbbafabf59b4aa990df899d2f954 GIT binary patch literal 2067 zcmaJ?c~lcu7awpbv>!@qL5kRpF)E5#Nuo&!TY?ZFDTYMhpkhcSFpbH?WPq?FSfp%H zsu*f*1xf*n3q{hZCn!?o6p^6f!Xm{}DisltPgyF^5BMf3=pUtXX5M@EzTfY6@4N4w zGufenK!>+o-v$7{ffvLTVzbQp*)7CI_5A`7Hhq8wgri}I98HjDAiz(CL_;7?DT#rE zkVKZa=PKj{0Q2y$C>#yvhp?oGk|?oah&rVjV*`Mfk4`O-Dj*b$hGJk98~5MybvO`~ zv2okzd@^6nfnwpHBn=dnBoIlH6jG)P=i?1}=~$S65<(@QPPtp9W$Dyc)FeEz>fmC9MP z78OFT^ZiF*tte3qk%W*IiPK22i<7UkhElUQ8c2d78WDo*o~dGJEP^81SVRqS!Wf`C zUm}H7R>#^G3_hR5Q)y9&N(%9~Y#gRRgkc$rv%%k=L8X%eIR1VVN`U9ajs6^tADK+y zdXhPG25pARMWk^`NQKUDWv{uEIl0zmP^z)WTu1}QL$Xa8LSIn^%Lnj2aX0S zmTYT&HaV76YRWsTG#X;9}*9&P(bT`M z7iLsPSN9d0(I*adJ8{J4Dn(=eDMND9h4n3#%O@9lTu9>oTKy&3-LgV+H!Nc)ah<`% zQ~JF}eZBFjtnX=_^6u@WRkg7T7cgZR#V1`u@NU`6ys((AE0g0>2KzlmDY;e459&EP z0;ko~)VMUYb@*0$AGgRX_~2!b`J%UW=hV;xpU+MwUd8Kok@^P*^Bj!fK=xVS7O>Cp ziH|N+z|f0V9U69jkVtnAj8|DSf@;^CQC~a_u5`^U{R-CFrqO>XvDjY;xy)#kn!dyg0fYv_vDzJBqEoolOBuX=W| zHW{wRB``lC%9Gy$rh{DEK0XY9r8iT4+Td~!qX-Clx3t$}Yhe9`c|$bMIXZR2`P z5GU28Xs9G}U@@CJu{t&72V{5apWga+JI;88je2|3pBZIxw{~sm4Q=V2NOQyOa(lGR zk2#Rhd*_3*g3i7brVq_jvhRo6gu>Fu}h)e+xr z{7sWl?l%49$u^91j97GcIs-fa z*soD@d9$L1Ip8$h_voh>dF6_8e{8%|JrWqTWP7IDE!)L#-=XwtMdXP;?U#QXZ)~fI zw2+H#*PeeKdt>k(?bjYtZ&qpa`8Zq&jG{(oVqaO$8o@VP^UCYS+i}A z(<~Y6Z#)S12Ck2W*GgzSE;rC=Uiv!4U-=I8jmzDO#x@@^5Q@H&_bP!~ zX$Qo^#)@nHtrxl%9JqV1qTp<0XL+SfwM*_9-;tkVmR3&575j_#hrd(SY##4z%%Xl7 z89C~ Nc>x0MkN&&T{tqesJH-G1 literal 0 HcmV?d00001 diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/zip280x210.png b/webroot/rsrc/image/icon/fatcow/thumbnails/zip280x210.png new file mode 100644 index 0000000000000000000000000000000000000000..8db127b282c1ea95127548ba0022eabd8475315a GIT binary patch literal 2511 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 I9$_c`4M=*qd;kCd literal 0 HcmV?d00001 diff --git a/webroot/rsrc/js/application/pholio/behavior-pholio-mock-view.js b/webroot/rsrc/js/application/pholio/behavior-pholio-mock-view.js index 916a33071b..adc077ce98 100644 --- a/webroot/rsrc/js/application/pholio/behavior-pholio-mock-view.js +++ b/webroot/rsrc/js/application/pholio/behavior-pholio-mock-view.js @@ -206,7 +206,7 @@ JX.behavior('pholio-mock-view', function(config) { var img = JX.$N('img', {className: 'pholio-mock-image'}); img.onload = JX.bind(img, onload_image, active_image.id); - img.src = active_image.fullURI; + img.src = active_image.stageURI; var thumbs = JX.DOM.scry( JX.$('pholio-mock-thumb-grid'), @@ -260,6 +260,12 @@ JX.behavior('pholio-mock-view', function(config) { 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; @@ -583,6 +589,39 @@ JX.behavior('pholio-mock-view', function(config) { function render_image_info(image) { var info = []; + var buttons = []; + + buttons.push( + JX.$N( + 'div', + { + className: 'pholio-image-button' + }, + JX.$N( + image.isViewable ? 'a' : 'span', + { + href: image.fullURI, + target: '_blank', + className: 'pholio-image-button-link' + }, + JX.$H(config.fullIcon)))); + + // TODO: This should be a form which performs the download; for now, it + // just takes the user to the info page. + buttons.push( + JX.$N( + 'div', + { + className: 'pholio-image-button' + }, + JX.$N( + 'a', + { + href: image.downloadURI, + className: 'pholio-image-button-link' + }, + JX.$H(config.downloadIcon)))); + var title = JX.$N( 'div', {className: 'pholio-image-title'}, @@ -604,18 +643,12 @@ JX.behavior('pholio-mock-view', function(config) { info.push(embed); } - 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; + return [buttons, info]; } function render_reticle(classes) { @@ -654,7 +687,7 @@ JX.behavior('pholio-mock-view', function(config) { var image = JX.$N('img'); image.onload = lightbox_loaded; setTimeout(function() { - image.src = active_image.fullURI; + image.src = active_image.stageURI; }, 1000); JX.DOM.setContent(lightbox, image); JX.DOM.alterClass(lightbox, 'pholio-device-lightbox-loading', true); @@ -694,7 +727,7 @@ JX.behavior('pholio-mock-view', function(config) { var preload = []; for (var ii = 0; ii < config.images.length; ii++) { - preload.push(config.images[ii].fullURI); + preload.push(config.images[ii].stageURI); } function preload_next() {