Path: blob/master/webroot/rsrc/js/application/pholio/behavior-pholio-mock-edit.js
12241 views
/**1* @provides javelin-behavior-pholio-mock-edit2* @requires javelin-behavior3* javelin-stratcom4* javelin-dom5* javelin-workflow6* javelin-quicksand7* phabricator-phtize8* phabricator-drag-and-drop-file-upload9* phabricator-draggable-list10*/11JX.behavior('pholio-mock-edit', function(config, statics) {12var pht = JX.phtize(config.pht);13var uploading = [];141516/* -( Deleting Images )---------------------------------------------------- */171819// When the user clicks the "X" on an image, we replace it with a "click to20// undo" element. If they click to undo, we put the original node back in the21// DOM.22var pholio_drop_remove = function(e) {23e.kill();2425var node = e.getNode('pholio-drop-image');26var undo = render_undo();2728JX.DOM.listen(undo, 'click', 'pholio-drop-undo', function(e) {29e.kill();30JX.DOM.replace(undo, node);31synchronize_order();32});3334JX.DOM.replace(node, undo);35synchronize_order();36};373839/* -( Reordering Images )-------------------------------------------------- */404142// Reflect the display order in a hidden input.43var synchronize_order = function() {44var items = statics.draglist.findItems();45var order = [];46for (var ii = 0; ii < items.length; ii++) {47order.push(JX.Stratcom.getData(items[ii]).filePHID);48}49statics.nodes.order.value = order.join(',');50};515253var build_draglist = function(node) {54var draglist = new JX.DraggableList('pholio-drop-image', node)55.setGhostNode(JX.$N('div', {className: 'drag-ghost'}))56.setFindItemsHandler(function() {57return JX.DOM.scry(node, 'div', 'pholio-drop-image');58});5960// Only let the user drag images by the handle, not the whole entry.61draglist.listen('shouldBeginDrag', function(e) {62if (!e.getNode('pholio-drag-handle')) {63JX.Stratcom.context().prevent();64}65});66draglist.listen('didDrop', synchronize_order);67return draglist;68};697071/* -( Build )-------------------------------------------------------------- */727374var build_drop_upload = function(node) {75var drop = new JX.PhabricatorDragAndDropFileUpload(node)76.setURI(config.uploadURI);7778drop.listen('didBeginDrag', function() {79JX.DOM.alterClass(node, 'pholio-drop-active', true);80});8182drop.listen('didEndDrag', function() {83JX.DOM.alterClass(node, 'pholio-drop-active', false);84});8586return drop;87};8889var build_add_control = function(add_node) {90var drop = build_drop_upload(add_node);9192drop.listen('willUpload', function(file) {93var node = render_uploading();94uploading.push({node: node, file: file});95statics.nodes.list.appendChild(node);96});9798drop.listen('didUpload', function(file) {99var node;100for (var ii = 0; ii < uploading.length; ii++) {101if (uploading[ii].file === file) {102node = uploading[ii].node;103uploading.splice(ii, 1);104break;105}106}107108render_upload(node, file);109});110111drop.start();112113JX.DOM.listen(add_node, 'click', null, function(e) {114e.kill();115116new JX.Workflow('/file/uploaddialog/')117.setHandler(function(response) {118var files = response.files;119for (var ii = 0; ii < files.length; ii++) {120var file = files[ii];121122var upload = new JX.PhabricatorFileUpload()123.setID(file.id)124.setPHID(file.phid)125.setURI(file.uri);126127var node = render_uploading();128statics.nodes.list.appendChild(node);129130render_upload(node, upload);131}132})133.start();134});135};136137var render_upload = function(node, file) {138JX.DOM.setContent(node, pht('uploaded'));139140new JX.Workflow(config.renderURI, {filePHID: file.getPHID()})141.setHandler(function(response) {142var new_node = JX.$H(response.markup).getFragment().firstChild;143build_update_control(new_node);144145JX.DOM.replace(node, new_node);146synchronize_order();147})148.start();149};150151var build_list_controls = function(list_node) {152var nodes = JX.DOM.scry(list_node, 'div', 'pholio-drop-image');153for (var ii = 0; ii < nodes.length; ii++) {154build_update_control(nodes[ii]);155}156};157158var build_update_control = function(node) {159var did_upload = function(node, file) {160var node_data = JX.Stratcom.getData(node);161162var data = {163filePHID: file.getPHID(),164replacesPHID: node_data.replacesPHID || node_data.filePHID || null,165title: JX.DOM.find(node, 'input', 'image-title').value,166description: JX.DOM.find(node, 'textarea', 'image-description').value167};168169new JX.Workflow(config.renderURI, data)170.setHandler(function(response) {171var new_node = JX.$H(response.markup).getFragment().firstChild;172build_update_control(new_node);173174JX.DOM.replace(node, new_node);175JX.DOM.alterClass(node, 'pholio-replacing', false);176synchronize_order();177})178.start();179};180181var drop = build_drop_upload(node);182183drop.listen('willUpload', function() {184JX.DOM.alterClass(node, 'pholio-replacing', true);185});186187drop.listen('didUpload', function(file) {188did_upload(node, file);189});190191drop.start();192193JX.DOM.listen(node, 'click', 'pholio-uploaded-thumb', function(e) {194e.kill();195196new JX.Workflow('/file/uploaddialog/single/')197.setHandler(function(response) {198var files = response.files;199for (var ii = 0; ii < files.length; ii++) {200var file = files[ii];201202var upload = new JX.PhabricatorFileUpload()203.setID(file.id)204.setPHID(file.phid)205.setURI(file.uri);206207did_upload(node, upload);208}209})210.start();211});212};213214215/* -( Rendering )---------------------------------------------------------- */216217218var render_uploading = function() {219return JX.$N(220'div',221{className: 'pholio-drop-uploading'},222pht('uploading'));223};224225var render_undo = function() {226var link = JX.$N(227'a',228{href: '#', sigil: 'pholio-drop-undo'},229pht('undo'));230231return JX.$N(232'div',233{className: 'pholio-drop-undo'},234[pht('removed'), ' ', link]);235};236237238/* -( Init )--------------------------------------------------------------- */239240241function update_statics(data, page_id, no_build) {242statics.nodes = {243list: JX.$(data.listID),244drop: JX.$(data.dropID),245order: JX.$(data.orderID)246};247248if (!statics.mockEditCache[page_id]) {249statics.mockEditCache[page_id] = {};250}251statics.mockEditCache[page_id].config = config;252statics.mockEditCache[page_id].nodes = statics.nodes;253254if (no_build !== true) {255build_add_control(statics.nodes.drop);256build_list_controls(statics.nodes.list);257statics.draglist = build_draglist(statics.nodes.list);258statics.mockEditCache[page_id].draglist = statics.draglist;259} else {260statics.draglist = statics.mockEditCache[page_id].draglist;261}262synchronize_order();263}264265function install() {266statics.mockEditCache = {};267JX.Stratcom.listen('click', 'pholio-drop-remove', pholio_drop_remove);268JX.Stratcom.listen(269'quicksand-redraw',270null,271function (e) {272e.kill();273274var data = e.getData();275if (!data.newResponse.mockEditConfig) {276return;277}278if (data.fromServer) {279// we ran update_statics(config) below already280} else {281var page_id = data.newResponseID;282var new_config = statics.mockEditCache[page_id].config;283update_statics(new_config, page_id, true);284}285});286return true;287}288289statics.installed = statics.installed || install();290update_statics(config, JX.Quicksand.getCurrentPageID(), false);291});292293294