friendica/view/theme/frio/js/textedit.js
Jakobus Schürz 67a6899ed7 send on ctrl+enter
in
* comments
* prv_messages
* composer
* jot
2023-10-11 04:09:44 +02:00

367 lines
9.2 KiB
JavaScript

// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPLv3-or-later
/*
* The file contains functions for text editing and commenting
*/
// Lifted from https://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input/
jQuery.fn.putCursorAtEnd = function () {
return this.each(function () {
// Cache references
var $el = $(this),
el = this;
// Only focus if input isn't already
if (!$el.is(":focus")) {
$el.focus();
}
// If this function exists... (IE 9+)
if (el.setSelectionRange) {
// Double the length because Opera is inconsistent about whether a carriage return is one character or two.
var len = $el.val().length * 2;
// Timeout seems to be required for Blink
setTimeout(function () {
el.setSelectionRange(len, len);
}, 1);
} else {
// As a fallback, replace the contents with itself
// Doesn't work in Chrome, but Chrome supports setSelectionRange
$el.val($el.val());
}
// Scroll to the bottom, in case we're in a tall textarea
// (Necessary for Firefox and Chrome)
this.scrollTop = 999999;
});
};
function commentGetLink(id, prompttext) {
reply = prompt(prompttext);
if (reply && reply.length) {
reply = bin2hex(reply);
$.get("parseurl?noAttachment=1&binurl=" + reply, function (data) {
addCommentText(data, id);
});
}
}
function addCommentText(data, id) {
// get the textfield
var textfield = document.getElementById("comment-edit-text-" + id);
// check if the textfield does have the default-value
commentOpenUI(textfield, id);
// save already existent content
var currentText = $("#comment-edit-text-" + id).val();
//insert the data as new value
textfield.value = currentText + data;
autosize.update($("#comment-edit-text-" + id));
}
function commentLinkDrop(event, id) {
var reply = event.dataTransfer.getData("text/uri-list");
event.target.textContent = reply;
event.preventDefault();
if (reply && reply.length) {
reply = bin2hex(reply);
$.get("parseurl?noAttachment=1&binurl=" + reply, function (data) {
addCommentText(data, id);
});
}
}
function commentLinkDropper(event) {
var linkFound = event.dataTransfer.types.contains("text/uri-list");
if (linkFound) {
event.preventDefault();
}
}
function insertFormattingToPost(BBCode) {
textarea = document.getElementById("profile-jot-text");
insertBBCodeInTextarea(BBCode, textarea);
return true;
}
function showThread(id) {
$("#collapsed-comments-" + id).show();
$("#collapsed-comments-" + id + " .collapsed-comments").show();
}
function hideThread(id) {
$("#collapsed-comments-" + id).hide();
$("#collapsed-comments-" + id + " .collapsed-comments").hide();
}
function cmtBbOpen(id) {
$("#comment-edit-bb-" + id).show();
}
function cmtBbClose(id) {
$("#comment-edit-bb-" + id).hide();
}
function commentExpand(id) {
$("#mod-cmnt-wrap-" + id).show();
closeMenu("comment-fake-form-" + id);
openMenu("item-comments-" + id);
$("#comment-edit-text-" + id)
.keydown(function (e) {
if ((e.ctrlKey || e.metaKey) && (e.keyCode == 13 || e.keyCode == 10)) {
$("#comment-edit-submit-" + id).trigger('click');
}
})
.putCursorAtEnd()
.addClass("comment-edit-text-full")
.removeClass("comment-edit-text-empty");
return true;
}
function commentClose(obj, id) {
if (obj.value === "" || obj.value === obj.dataset.default) {
$("#comment-edit-text-" + id)
.removeClass("comment-edit-text-full")
.addClass("comment-edit-text-empty");
$("#mod-cmnt-wrap-" + id).hide();
openMenu("comment-fake-form-" + id);
closeMenu("item-comments-" + id);
return true;
}
return false;
}
function showHideCommentBox(id) {
var $el = $("#comment-edit-form-" + id);
if ($el.is(":visible")) {
$el.hide();
} else {
$el.show();
}
}
function commentOpenUI(obj, id) {
closeMenu("comment-fake-form-" + id);
openMenu("item-comments-" + id);
$("#comment-edit-text-" + id)
.putCursorAtEnd()
.addClass("comment-edit-text-full")
.removeClass("comment-edit-text-empty")
.attr("tabindex", "9"); // Choose an arbitrary tab index that's greater than what we're using in jot (3 of them)
$("#comment-edit-submit-" + id).attr("tabindex", "10"); // The submit button gets tabindex + 1
// initialize autosize for this comment
autosize($("#comment-edit-text-" + id + ".text-autosize"));
}
function commentCloseUI(obj, id) {
if (obj.value === "" || obj.value === obj.dataset.default) {
$("#comment-edit-text-" + id)
.removeClass("comment-edit-text-full")
.addClass("comment-edit-text-empty")
.removeAttr("tabindex");
$("#comment-edit-submit-" + id).removeAttr("tabindex");
openMenu("comment-fake-form-" + id);
closeMenu("item-comments-" + id);
// destroy the automatic textarea resizing
autosize.destroy($("#comment-edit-text-" + id + ".text-autosize"));
}
}
function jotTextOpenUI(obj) {
if (obj.value === "" || obj.value === obj.dataset.default) {
var $el = $(".modal-body #profile-jot-text");
$el.addClass("profile-jot-text-full").removeClass("profile-jot-text-empty");
// initiale autosize for the jot
autosize($el);
}
}
function jotTextCloseUI(obj) {
if (obj.value === "" || obj.value === obj.dataset.default) {
var $el = $(".modal-body #profile-jot-text");
$el.removeClass("profile-jot-text-full").addClass("profile-jot-text-empty");
// destroy the automatic textarea resizing
autosize.destroy($el);
}
}
function commentOpen(obj, id) {
if (obj.value === "" || obj.value === obj.dataset.default) {
$("#comment-edit-text-" + id)
.putCursorAtEnd()
.addClass("comment-edit-text-full")
.removeClass("comment-edit-text-empty");
$("#mod-cmnt-wrap-" + id).show();
closeMenu("comment-fake-form-" + id);
openMenu("item-comments-" + id);
return true;
}
return false;
}
function confirmDelete() {
return confirm(aStr.delitem);
}
function confirmBlock() {
return confirm(aStr.blockAuthor);
}
function confirmIgnore() {
return confirm(aStr.ignoreAuthor);
}
function confirmCollapse() {
return confirm(aStr.collapseAuthor);
}
function confirmIgnoreServer() {
return confirm(aStr.ignoreServer + "\n" + aStr.ignoreServerDesc);
}
/**
* Hide and removes an item element from the DOM after the deletion url is
* successful, restore it else.
*
* @param {string} url The item removal URL
* @param {string} elementId The DOM id of the item element
* @returns {undefined}
*/
function dropItem(url, elementId) {
if (confirmDelete()) {
$("body").css("cursor", "wait");
var $el = $(document.getElementById(elementId));
$el.fadeTo('fast', 0.33, function () {
$.get(url).then(function() {
$el.remove();
}).fail(function() {
// @todo Show related error message
$el.show();
}).always(function() {
$("body").css('cursor', 'auto');
});
});
}
}
/**
* Blocks an author and hide and removes an item element from the DOM after the block is
* successful, restore it else.
*
* @param {string} url The item removal URL
* @param {string} elementId The DOM id of the item element
* @returns {undefined}
*/
function blockAuthor(url, elementId) {
if (confirmBlock()) {
$("body").css("cursor", "wait");
var $el = $(document.getElementById(elementId));
$el.fadeTo("fast", 0.33, function () {
$.get(url)
.then(function () {
$el.remove();
})
.fail(function () {
// @todo Show related error message
$el.show();
})
.always(function () {
$("body").css("cursor", "auto");
});
});
}
}
/**
* Ignored an author and hide and removes an item element from the DOM after the block is
* successful, restore it else.
*
* @param {string} url The item removal URL
* @param {string} elementId The DOM id of the item element
* @returns {undefined}
*/
function ignoreAuthor(url, elementId) {
if (confirmIgnore()) {
$("body").css("cursor", "wait");
var $el = $(document.getElementById(elementId));
$el.fadeTo("fast", 0.33, function () {
$.get(url)
.then(function () {
$el.remove();
})
.fail(function () {
// @todo Show related error message
$el.show();
})
.always(function () {
$("body").css("cursor", "auto");
});
});
}
}
/**
* Collapse author posts
*
* @param {string} url The item collapse URL
* @param {string} elementId The DOM id of the item element
* @returns {undefined}
*/
function collapseAuthor(url, elementId) {
if (confirmCollapse()) {
$("body").css("cursor", "wait");
var $el = $(document.getElementById(elementId));
$el.fadeTo("fast", 0.33, function () {
$.get(url)
.then(function () {
//$el.remove();
})
.fail(function () {
// @todo Show related error message
$el.show();
})
.always(function () {
$("body").css("cursor", "auto");
});
});
}
}
/**
* Ignore author server
*
* @param {string} url The server ignore URL
* @param {string} elementId The DOM id of the item element
* @returns {undefined}
*/
function ignoreServer(url, elementId) {
if (confirmIgnoreServer()) {
$("body").css("cursor", "wait");
var $el = $(document.getElementById(elementId));
$el.fadeTo("fast", 0.33, function () {
$.post(url)
.then(function () {
$el.remove();
})
.fail(function () {
// @todo Show related error message
$el.fadeTo("fast", 1);
})
.always(function () {
$("body").css("cursor", "auto");
});
});
}
}
// @license-end