define('jira/wikipreview/wiki-preview', ['jira/util/formatter', 'wrm/context-path', 'jquery'], function (formatter, contextPath, jQuery) {
/**
* @typedef {Object} ScrollSaver
* @memberof module:jira/wikipreview/wiki-preview
* @property {Function} show - reveals scrollSaver
* @property {Function} hide - hides scrollSaver
*/
/**
* @exports jira/wikipreview/wiki-preview
* @param {Object} prefs
* @param {HTMLElement=} [ctx]
* @returns WikiPreviewControl
*/
return function wikiPreview(prefs, ctx) {
var field;
var editField;
var trigger;
var inPreviewMode = false;
var origText;
/**
* Gets and sets fields as jQuery objects
* @private
*/
var setFields = function setFields() {
field = jQuery("#" + prefs.fieldId, ctx);
editField = jQuery("#" + prefs.fieldId + "-wiki-edit", ctx);
trigger = jQuery("#" + prefs.trigger, ctx);
};
/**
* Prevents scroll flicker from happending when at the bottom of the page
*
* @private
* @return {ScrollSaver}
*/
var scrollSaver = function () {
var elem;
return {
show: function show() {
if (!elem) {
elem = jQuery("
").html(" ").css({ height: "300px" }).insertBefore(editField);
}
elem.css({ display: "block" });
},
hide: function hide() {
elem.css({ display: "none" });
}
};
}();
/**
*
* If preview not present, uses REST to get preview of rendered wiki markup. Otherwise restores original state.
* @private
*/
var toggleRenderPreview = function toggleRenderPreview() {
if (!inPreviewMode) {
editField.find(".content-inner").css({
maxHeight: field.css("maxHeight")
});
this.showPreview();
} else {
editField.find(".content-inner").css({
maxHeight: ""
});
this.showInput();
}
};
/**
* This function replaces the input with the rendered content.
*
* @param {String} data from the AJAX call
*/
var renderData = function renderData(data) {
editField.originalHeight = editField.height();
scrollSaver.show();
editField.addClass("previewClass");
origText = field.val();
field.hide();
trigger.removeClass("loading").addClass("selected");
changePreviewAccessibleTextTo(formatter.I18n.getText('renderer.preview.close', prefs.fieldId));
editField.find(".content-inner").html(data);
scrollSaver.hide();
inPreviewMode = true;
jQuery(document).trigger("showWikiPreview", [editField]);
// IE!!! - I will get to the bottom of this one day but for now work around.
setTimeout(function () {
trigger.focus();
}, 0);
};
var handleError = function handleError(previewer) {
return function (XMLHttpRequest, textStatus, errorThrown) {
trigger.removeClass("loading");
origText = field.val();
/* [alert] */
if (textStatus) {
alert(textStatus);
}
if (errorThrown) {
alert(errorThrown);
}
/* [alert] end */
previewer.showInput();
};
};
var changePreviewAccessibleTextTo = function changePreviewAccessibleTextTo(accessibleText) {
trigger.find('.wiki-renderer-icon').text(accessibleText);
};
/**
* @name WikiPreviewControl
* @inner
*/
return {
/**
* Make a request using the textarea/input value and displays the response (rendered wiki content)
* @memberof WikiPreviewControl
*/
showPreview: function showPreview() {
var that = this;
var pid = jQuery("#pid", ctx).val();
var issueType = jQuery("#issuetype", ctx).val();
// Handle case where project is a frother control
if (jQuery.isArray(pid)) {
pid = pid[0];
}
// Handle case where issue type is a frother control
if (jQuery.isArray(issueType)) {
issueType = issueType[0];
}
jQuery("#" + prefs.trigger, ctx).addClass("loading");
jQuery.ajax({
url: contextPath() + "/rest/api/1.0/render",
contentType: "application/json",
type: 'POST',
data: JSON.stringify({
rendererType: prefs.rendererType,
unrenderedMarkup: field.val(),
issueKey: prefs.issueKey,
projectId: pid,
issueType: issueType
}),
dataType: "html",
success: renderData,
error: handleError(that)
});
},
/**
* This restores the input field to allow the user to enter wiki text.
* @memberof WikiPreviewControl
*/
showInput: function showInput(e) {
if (editField) {
scrollSaver.show();
// clear the height before we reset
editField.css({ height: "" });
editField.removeClass("previewClass").find(".content-inner").empty();
field = jQuery("#" + prefs.fieldId, ctx);
field.val(origText);
field.show();
field.focus();
trigger.removeClass("selected");
changePreviewAccessibleTextTo(formatter.I18n.getText('renderer.preview', prefs.fieldId));
scrollSaver.hide();
inPreviewMode = false;
jQuery(document).trigger("showWikiInput", [editField]);
}
},
/**
* Applies click handler to trigger and associated behaviour.
* @memberof WikiPreviewControl
*/
init: function init() {
var that = this;
var $trigger;
if (prefs instanceof jQuery) {
prefs = jQuery.readData(prefs);
}
$trigger = jQuery("#" + prefs.trigger, ctx);
$trigger.click(function (e) {
if (!$trigger.hasClass("loading")) {
setFields();
toggleRenderPreview.call(that);
}
e.preventDefault();
});
}
};
};
});
/** Preserve legacy namespace
@deprecated jira.app.wikiPreview */
AJS.namespace("jira.app.wikiPreview", null, require('jira/wikipreview/wiki-preview'));
AJS.namespace('JIRA.wikiPreview', null, require('jira/wikipreview/wiki-preview'));