/** * @provides javelin-behavior-differential-feedback-preview * @requires javelin-behavior * javelin-stratcom * javelin-dom * javelin-request * javelin-util * phabricator-shaped-request */ JX.behavior('differential-feedback-preview', function(config) { var action = JX.$(config.action); var content = JX.$(config.content); var previewTokenizers = {}; var field; for (field in config.previewTokenizers) { var tokenizer = JX.$(config.previewTokenizers[field]); previewTokenizers[field] = JX.Stratcom.getData(tokenizer).tokenizer; } var callback = function(r) { var preview = JX.$(config.preview); var data = getdata(); var hide = true; for (var field in data) { if (field == 'action') { continue; } if (data[field]) { hide = false; } } if (hide) { JX.DOM.hide(preview); } else { JX.DOM.setContent(preview, JX.$H(r)); JX.Stratcom.invoke('differential-preview-update', null, { container: preview }); JX.DOM.show(preview); } }; var getdata = function() { var data = { content : content.value, action : action.value }; for (var field in previewTokenizers) { data[field] = JX.keys(previewTokenizers[field].getTokens()).join(','); } return data; }; var request = new JX.PhabricatorShapedRequest(config.uri, callback, getdata); var trigger = JX.bind(request, request.trigger); JX.DOM.listen(content, 'keydown', null, trigger); JX.DOM.listen(action, 'change', null, trigger); for (field in previewTokenizers) { previewTokenizers[field].listen('change', trigger); } request.start(); function refreshInlinePreview() { new JX.Request(config.inlineuri, function(r) { var inline = JX.$(config.inline); JX.DOM.setContent(inline, JX.$H(r)); JX.Stratcom.invoke('differential-preview-update', null, { container: inline }); updateLinks(); }) .setTimeout(5000) .send(); } function updateLinks() { var inline = JX.$(config.inline); var links = JX.DOM.scry( inline, 'a', 'differential-inline-preview-jump'); for (var ii = 0; ii < links.length; ii++) { var data = JX.Stratcom.getData(links[ii]); try { JX.$(data.anchor); links[ii].href = '#' + data.anchor; JX.DOM.setContent(links[ii], 'View'); } catch (ignored) { // This inline comment isn't visible, e.g. on some other diff. } } } JX.Stratcom.listen( 'differential-inline-comment-update', null, refreshInlinePreview); JX.Stratcom.listen( 'differential-inline-comment-refresh', null, updateLinks); refreshInlinePreview(); });