@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator

Allow Pholio mocks to be created and edited without drag-and-drop

Summary: Ref T6523. Allows you to click stuff instead of using drag-and-drop.

Test Plan: On iOS simulator, created and updated a mock.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T6523

Differential Revision: https://secure.phabricator.com/D16088

+97 -38
+14 -14
resources/celerity/map.php
··· 82 82 'rsrc/css/application/paste/paste.css' => '1898e534', 83 83 'rsrc/css/application/people/people-profile.css' => '2473d929', 84 84 'rsrc/css/application/phame/phame.css' => '7448a969', 85 - 'rsrc/css/application/pholio/pholio-edit.css' => 'b15fec4a', 85 + 'rsrc/css/application/pholio/pholio-edit.css' => '07676f51', 86 86 'rsrc/css/application/pholio/pholio-inline-comments.css' => '8e545e49', 87 87 'rsrc/css/application/pholio/pholio.css' => 'ca89d380', 88 88 'rsrc/css/application/phortune/phortune-credit-card-form.css' => '8391eb02', ··· 414 414 'rsrc/js/application/owners/OwnersPathEditor.js' => 'aa1733d0', 415 415 'rsrc/js/application/owners/owners-path-editor.js' => '7a68dda3', 416 416 'rsrc/js/application/passphrase/passphrase-credential-control.js' => '3cb0b2fc', 417 - 'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '246dc085', 417 + 'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => 'bee502c8', 418 418 'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => 'fbe497e7', 419 419 'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '3f5d6dbf', 420 420 'rsrc/js/application/phortune/behavior-test-payment-form.js' => 'fc91ab6c', ··· 666 666 'javelin-behavior-phabricator-transaction-comment-form' => 'b23b49e6', 667 667 'javelin-behavior-phabricator-transaction-list' => '13c739ea', 668 668 'javelin-behavior-phabricator-watch-anchor' => '9f36c42d', 669 - 'javelin-behavior-pholio-mock-edit' => '246dc085', 669 + 'javelin-behavior-pholio-mock-edit' => 'bee502c8', 670 670 'javelin-behavior-pholio-mock-view' => 'fbe497e7', 671 671 'javelin-behavior-phui-dropdown-menu' => '54733475', 672 672 'javelin-behavior-phui-file-upload' => 'b003d4fb', ··· 810 810 'phabricator-zindex-css' => '5b6fcf3f', 811 811 'phame-css' => '7448a969', 812 812 'pholio-css' => 'ca89d380', 813 - 'pholio-edit-css' => 'b15fec4a', 813 + 'pholio-edit-css' => '07676f51', 814 814 'pholio-inline-comments-css' => '8e545e49', 815 815 'phortune-credit-card-form' => '2290aeef', 816 816 'phortune-credit-card-form-css' => '8391eb02', ··· 1092 1092 'javelin-workflow', 1093 1093 'javelin-util', 1094 1094 ), 1095 - '246dc085' => array( 1096 - 'javelin-behavior', 1097 - 'javelin-stratcom', 1098 - 'javelin-dom', 1099 - 'javelin-workflow', 1100 - 'javelin-quicksand', 1101 - 'phabricator-phtize', 1102 - 'phabricator-drag-and-drop-file-upload', 1103 - 'phabricator-draggable-list', 1104 - ), 1105 1095 '2926fff2' => array( 1106 1096 'javelin-behavior', 1107 1097 'javelin-dom', ··· 1870 1860 'javelin-dom', 1871 1861 'javelin-util', 1872 1862 'javelin-request', 1863 + ), 1864 + 'bee502c8' => array( 1865 + 'javelin-behavior', 1866 + 'javelin-stratcom', 1867 + 'javelin-dom', 1868 + 'javelin-workflow', 1869 + 'javelin-quicksand', 1870 + 'phabricator-phtize', 1871 + 'phabricator-drag-and-drop-file-upload', 1872 + 'phabricator-draggable-list', 1873 1873 ), 1874 1874 'bf5374ef' => array( 1875 1875 'javelin-behavior',
+2 -1
src/applications/files/application/PhabricatorFilesApplication.php
··· 81 81 'proxy/' => 'PhabricatorFileProxyController', 82 82 'transforms/(?P<id>[1-9]\d*)/' => 83 83 'PhabricatorFileTransformListController', 84 - 'uploaddialog/' => 'PhabricatorFileUploadDialogController', 84 + 'uploaddialog/(?P<single>single/)?' 85 + => 'PhabricatorFileUploadDialogController', 85 86 'download/(?P<phid>[^/]+)/' => 'PhabricatorFileDialogController', 86 87 'iconset/(?P<key>[^/]+)/' => array( 87 88 'select/' => 'PhabricatorFileIconSetSelectController',
+7 -1
src/applications/files/controller/PhabricatorFileUploadDialogController.php
··· 37 37 } 38 38 } 39 39 40 + if ($request->getURIData('single')) { 41 + $allow_multiple = false; 42 + } else { 43 + $allow_multiple = true; 44 + } 45 + 40 46 $form = id(new AphrontFormView()) 41 47 ->appendChild( 42 48 id(new PHUIFormFileControl()) 43 49 ->setName('filePHIDs') 44 50 ->setLabel(pht('Upload File')) 45 - ->setAllowMultiple(true) 51 + ->setAllowMultiple($allow_multiple) 46 52 ->setError($e_file)); 47 53 48 54 return $this->newDialog()
+2 -2
src/applications/pholio/controller/PholioMockEditController.php
··· 267 267 $image_elements); 268 268 269 269 $drop_control = phutil_tag( 270 - 'div', 270 + 'a', 271 271 array( 272 272 'id' => $drop_id, 273 273 'class' => 'pholio-edit-drop', 274 274 ), 275 - pht('Drag and drop images here to add them to the mock.')); 275 + pht('Click here, or drag and drop images to add them to the mock.')); 276 276 277 277 $order_control = phutil_tag( 278 278 'input',
+2 -1
src/applications/pholio/view/PholioUploadedImageView.php
··· 42 42 PhabricatorFileThumbnailTransform::TRANSFORM_PINBOARD); 43 43 $thumbnail_uri = $file->getURIForTransform($xform); 44 44 45 - $thumb_img = phutil_tag( 45 + $thumb_img = javelin_tag( 46 46 'img', 47 47 array( 48 48 'class' => 'pholio-thumb-img', 49 49 'src' => $thumbnail_uri, 50 + 'sigil' => 'pholio-uploaded-thumb', 50 51 )); 51 52 52 53 $thumb_frame = phutil_tag(
+5 -5
webroot/rsrc/css/application/pholio/pholio-edit.css
··· 44 44 padding: 8px; 45 45 } 46 46 47 + .pholio-uploaded-image .pholio-thumb-img { 48 + cursor: pointer; 49 + } 50 + 47 51 .pholio-thumb-frame { 48 52 background: url('/rsrc/image/checker_lighter.png'); 49 53 } ··· 102 106 } 103 107 104 108 .pholio-edit-drop { 109 + display: block; 105 110 border-width: 1px; 106 111 border-style: dashed; 107 112 border-color: {$lightgreytext}; 108 113 text-align: center; 109 114 padding: 16px; 110 115 color: {$greytext}; 111 - } 112 - 113 - .device .pholio-edit-drop { 114 - /* For now, no uploading from devices. */ 115 - display: none; 116 116 } 117 117 118 118 .pholio-uploaded-image.pholio-drop-active,
+65 -14
webroot/rsrc/js/application/pholio/behavior-pholio-mock-edit.js
··· 106 106 } 107 107 } 108 108 109 - JX.DOM.setContent(node, pht('uploaded')); 109 + render_upload(node, file); 110 + }); 110 111 111 - new JX.Workflow(config.renderURI, {filePHID: file.getPHID()}) 112 + drop.start(); 113 + 114 + JX.DOM.listen(add_node, 'click', null, function(e) { 115 + e.kill(); 116 + 117 + new JX.Workflow('/file/uploaddialog/') 112 118 .setHandler(function(response) { 113 - var new_node = JX.$H(response.markup).getFragment().firstChild; 114 - build_update_control(new_node); 119 + var files = response.files; 120 + for (var ii = 0; ii < files.length; ii++) { 121 + var file = files[ii]; 115 122 116 - JX.DOM.replace(node, new_node); 117 - synchronize_order(); 123 + var upload = new JX.PhabricatorFileUpload() 124 + .setID(file.id) 125 + .setPHID(file.phid) 126 + .setURI(file.uri); 127 + 128 + var node = render_uploading(); 129 + statics.nodes.list.appendChild(node); 130 + 131 + render_upload(node, upload); 132 + } 118 133 }) 119 134 .start(); 120 135 }); 136 + }; 121 137 122 - drop.start(); 138 + var render_upload = function(node, file) { 139 + JX.DOM.setContent(node, pht('uploaded')); 140 + 141 + new JX.Workflow(config.renderURI, {filePHID: file.getPHID()}) 142 + .setHandler(function(response) { 143 + var new_node = JX.$H(response.markup).getFragment().firstChild; 144 + build_update_control(new_node); 145 + 146 + JX.DOM.replace(node, new_node); 147 + synchronize_order(); 148 + }) 149 + .start(); 123 150 }; 124 151 125 152 var build_list_controls = function(list_node) { ··· 130 157 }; 131 158 132 159 var build_update_control = function(node) { 133 - var drop = build_drop_upload(node); 134 - 135 - drop.listen('willUpload', function() { 136 - JX.DOM.alterClass(node, 'pholio-replacing', true); 137 - }); 138 - 139 - drop.listen('didUpload', function(file) { 160 + var did_upload = function(node, file) { 140 161 var node_data = JX.Stratcom.getData(node); 141 162 142 163 var data = { ··· 156 177 synchronize_order(); 157 178 }) 158 179 .start(); 180 + }; 181 + 182 + var drop = build_drop_upload(node); 183 + 184 + drop.listen('willUpload', function() { 185 + JX.DOM.alterClass(node, 'pholio-replacing', true); 186 + }); 187 + 188 + drop.listen('didUpload', function(file) { 189 + did_upload(node, file); 159 190 }); 160 191 161 192 drop.start(); 193 + 194 + JX.DOM.listen(node, 'click', 'pholio-uploaded-thumb', function(e) { 195 + e.kill(); 196 + 197 + new JX.Workflow('/file/uploaddialog/single/') 198 + .setHandler(function(response) { 199 + var files = response.files; 200 + for (var ii = 0; ii < files.length; ii++) { 201 + var file = files[ii]; 202 + 203 + var upload = new JX.PhabricatorFileUpload() 204 + .setID(file.id) 205 + .setPHID(file.phid) 206 + .setURI(file.uri); 207 + 208 + did_upload(node, upload); 209 + } 210 + }) 211 + .start(); 212 + }); 162 213 }; 163 214 164 215