763 lines
30 KiB
JavaScript
763 lines
30 KiB
JavaScript
/*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: notes.js
|
|
Description: clientside functions for shared/notes.inc
|
|
*/
|
|
|
|
function init_note(pnote_key)
|
|
{
|
|
window.noteediting = false;
|
|
if (pnote_key > -1 && FcltMgr.startEdit(window))
|
|
{
|
|
window.noteediting = true;
|
|
var textarea_elem = document.getElementById("note");
|
|
textarea_elem.focus();
|
|
textarea_elem.setSelectionRange(textarea_elem.value.length, textarea_elem.value.length);
|
|
}
|
|
|
|
$("#note").autogrow();
|
|
|
|
$(window).on("beforeunload", function() {
|
|
$(window.document).off("scroll");
|
|
if (window.noteediting)
|
|
{
|
|
FcltMgr.stopEdit(window);
|
|
}
|
|
});
|
|
|
|
if (pnote_key == -1 && $("#note").val() == "" && !window.noteediting) {
|
|
validateTextarea(false);
|
|
}
|
|
|
|
$("#note").on("keyup", function (e)
|
|
{
|
|
if (pnote_key == -1 && $("#note").val() == "" && window.noteediting)
|
|
{
|
|
if (FcltMgr.stopEdit(window))
|
|
{
|
|
window.noteediting = false;
|
|
validateTextarea(false);
|
|
lock_warning(false);
|
|
}
|
|
}
|
|
else if (!window.noteediting && (pnote_key > -1 || $("#note").val() != ""))
|
|
{
|
|
if (FcltMgr.startEdit(window))
|
|
{
|
|
window.noteediting = true;
|
|
validateTextarea(true);
|
|
lock_warning(true);
|
|
}
|
|
}
|
|
});
|
|
|
|
$("#note").on("input", function (e)
|
|
{
|
|
if (typeof sgMention9999 !== "undefined" && e.originalEvent.data === "@")
|
|
startMention();
|
|
});
|
|
|
|
$(".note-icon").on("keyup", function (e)
|
|
{
|
|
if (e.keyCode === 13) { /* Enter */
|
|
$(".note-icon").trigger("click");
|
|
}
|
|
});
|
|
|
|
$(".reply-container").on("click", function ()
|
|
{
|
|
var target = document.getElementById($(this).find(".reply-body").attr("data-target"));
|
|
if (!target || $(target).data("transitioning")) // Mogelijk bij een hidden & ge-quote notitie bijvoorbeeld
|
|
return;
|
|
$(target).data("transitioning", true);
|
|
var scrollTop = $(target).offset().top // Notitie-offset met top vd pagina
|
|
- (document.documentElement.clientHeight / 2) // Helft v/d notitie-pagina hoogte (zodat notitie in het midden komt)
|
|
+ (target.clientHeight / 2); // Helft v/d notitie-hoogte (zodat notitie exact in het midden komt)
|
|
|
|
$(document.documentElement).animate({ scrollTop: scrollTop }, 250, function () {
|
|
var $lowlight = $("<div class='lowlight-overlay'></div>");
|
|
$(target).find(".note-container").prepend($lowlight); // Dit is de *tijdelijke* lowlight overlay
|
|
$lowlight.one("animationend", function() {
|
|
$(this).remove(); // En hier is die weer weg
|
|
$(target).data("transitioning", false);
|
|
});
|
|
});
|
|
});
|
|
|
|
function triggerKeyup()
|
|
{
|
|
$("#note").keyup();
|
|
}
|
|
|
|
function triggerKeyupAfterPaste()
|
|
{
|
|
setTimeout( triggerKeyup )
|
|
}
|
|
$("#note").on("paste", triggerKeyupAfterPaste);
|
|
$(".note-toggler").on("click", toggleNotes);
|
|
|
|
function toggleNotes(event)
|
|
{
|
|
var $note_text = $(this).prev(".note-text");
|
|
$note_text.one("transitionend", function() { FcltMgr.resized(); });
|
|
|
|
if ($note_text.hasClass("note-autocollapse") || $note_text.hasClass("note-collapsed"))
|
|
{
|
|
$note_text.removeClass("note-autocollapse note-collapsed");
|
|
$(this).html(L("lcl_rs_truncate"));
|
|
}
|
|
else
|
|
{
|
|
$note_text.addClass("note-collapsed");
|
|
$(this).html(L("lcl_rs_truncated"));
|
|
}
|
|
}
|
|
|
|
function delayed(delay, fn)
|
|
{
|
|
if (window.timerID)
|
|
clearTimeout(window.timerID);
|
|
window.timerID = setTimeout(fn, delay);
|
|
}
|
|
|
|
if ($(".btn-group").length)
|
|
init_detailToggle(pnote_key);
|
|
|
|
$(window.document).on("scroll", function () { delayed(50, function() {
|
|
if ($(this).scrollTop() > 100)
|
|
$(".note-top-button").fadeIn(50).css("display", "flex");
|
|
else
|
|
$(".note-top-button").fadeOut(50);
|
|
})});
|
|
|
|
if (pnote_key > -1) {
|
|
// Potentieel toggles disablen als deze notitie op een verborgen notitie replied
|
|
var $currentReply = $(".note-textarea.note-edit .reply-body");
|
|
if ($currentReply.length) { // Ik bevat momenteel een reply
|
|
var replyFlag = $("#" + $currentReply.attr("data-target")).find(".note-container").attr("data-flag");
|
|
_disableToggles(replyFlag);
|
|
}
|
|
}
|
|
}
|
|
|
|
function init_detailToggle(pnote_key)
|
|
{
|
|
var toggle_selectors = { "notes": ".note-container:not(.note-type-tracking, .note-fe-hidden)",
|
|
"tracking": ".note-type-tracking",
|
|
"fehidden": ".note-fe-hidden" };
|
|
|
|
// var hasNotes = $(toggle_selectors["notes"]).length ? 1 : 0;
|
|
var hasTracking = $(toggle_selectors["tracking"]).length ? 1 : 0;
|
|
var hasMoreToggle = $(".note-toggler").length ? 1 : 0;
|
|
var hasHiddenNotes = $(toggle_selectors["fehidden"]).length ? 1 : 0;
|
|
var nf_arr = (window.localStorage.getItem("notitiefilter") || "").split(",");
|
|
|
|
// if (true) // Anders valt er niets te togglen, *edit; altijd relevante toggles tonen zodat je bijv. default tracking altijd kan onderdrukken
|
|
{
|
|
//if (false && hasMultipleToggles && hasNotes) // Vooralsnog uitgeschakeld
|
|
// $(".btn-group").append("<button id='notes-toggle-button' class='button selected' title='" + L("lcl_mld_frame_notes") + "'>" + I("fa-comment-alt-lines") + "</button>");
|
|
|
|
if (hasTracking)
|
|
$(".btn-group").append("<button id='tracking-toggle-button' class='button selected' title='" + L("fac_tracking") + "'>" + I("fa-clipboard-list") + "</button>");
|
|
|
|
if (hasMoreToggle)
|
|
{
|
|
var hasOnlyOneOpenNote = $(".note-toggler").prev(".note-text:not(.note-collapsed, .note-autocollapse)").length == $(".note-toggler").length;
|
|
$(".btn-group").append("<button id='more-toggle-button' title='" + L("lcl_rs_trunc_both") + "' class='button" + (hasOnlyOneOpenNote ? " selected" : "") + "'>" + I("fa-ellipsis-h") + "</button>");
|
|
}
|
|
if (hasHiddenNotes)
|
|
$(".btn-group").append("<button id='fehidden-toggle-button' title='" + L("lcl_mld_verborgen_FE") + "' class='button selected'>" + I("fa-lock") + "</button>");
|
|
|
|
/* Detailniveaus
|
|
0: toggle notities (niet fe_hidden)
|
|
1: toggle tracking
|
|
2: toggle ...Meer/...minder
|
|
3: toggle fe_hidden notes
|
|
*/
|
|
|
|
var doAnimation = false;
|
|
$(".btn-group > button").on("click", function () { detailToggleClickHandler.call(this, doAnimation); });
|
|
|
|
// Toepassen van de laatst gebruikte toestand van notitiefilter
|
|
// Initieel zijn alle buttons op 'selected' gezet en 'more' op ''.
|
|
// Als laatst gebruikte toestand afwijkt van de initiele toestand dan wordt dat hier gewijzigd.
|
|
//if (false && hasNotes && nf_arr[0] == "s") // Vooralsnog deze niet onload weg togglen, te hoog risico op misverstanden
|
|
// $(".btn-group > button#notes-toggle-button").click();
|
|
|
|
if (hasTracking && nf_arr[1] == "s")
|
|
$(".btn-group > button#tracking-toggle-button").click();
|
|
|
|
if (hasMoreToggle && !hasOnlyOneOpenNote && nf_arr[2] == "S")
|
|
$(".btn-group > button#more-toggle-button").click();
|
|
|
|
if (hasHiddenNotes && nf_arr[3] == "s")
|
|
$(".btn-group > button#fehidden-toggle-button").click();
|
|
|
|
doAnimation = true;
|
|
}
|
|
}
|
|
|
|
// Disabled de submit button als je nog niet mag submitten
|
|
function validateTextarea(valid) {
|
|
if (typeof valid === "undefined") {
|
|
valid = window.noteediting || $("#note").val() != "";
|
|
}
|
|
$(".note-icon.submit").toggleClass("disabled", !valid);
|
|
}
|
|
|
|
function lock_warning(set_lock)
|
|
{ // Alleen voor modules MLD en niet meer voor CNT
|
|
var module = $("#module").val();
|
|
if (module == "mld" /* || module == "cnt" */)
|
|
{
|
|
if (!set_lock)
|
|
{
|
|
$("#lock-warning").empty().hide();
|
|
}
|
|
else
|
|
{
|
|
var data = { req_info: "locked"
|
|
, module_key: $("#" + module + "_key").val()
|
|
};
|
|
var url = "./get_" + module + "_info_ajax.asp?req_info=locked";
|
|
$.post( url
|
|
, data
|
|
, function(d)
|
|
{
|
|
if (d.locked)
|
|
{
|
|
var tekst = I("fa-exclamation-triangle") + " "
|
|
+ safe.html(L("lcl_mld_melding_locked").format(d.locked_name, d.locked_date));
|
|
$("#lock-warning").show().html(tekst);
|
|
FcltMgr.resized();
|
|
}
|
|
else
|
|
{
|
|
switch (module)
|
|
{
|
|
case "cnt": var data = { cnt_key: $("#" + module + "_key").val() }; break;
|
|
case "mld": var data = { mld_key: $("#" + module + "_key").val() }; break;
|
|
}
|
|
protectRequest.dataToken(data);
|
|
$.post( "./" + module + "_lock.asp"
|
|
, data
|
|
, FcltCallback
|
|
, "json"
|
|
);
|
|
}
|
|
}
|
|
, "json"
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
function startMention()
|
|
{
|
|
var i = $("#note").prop("selectionStart");
|
|
if ($("#note").hasClass("mentioning") || // Ik ben al bezig
|
|
(i !== 1 && !/\s/.test($("#note").val().substring(i - 2, i - 1)))) { // Geen teken voor de '@' behalve spatie (of begin vd notitie)
|
|
return;
|
|
}
|
|
$("#mention_key_show").attr("sgCurrentValue", ""); // Om (huidige waarde) niet te tonen die achter is gebleven van de vorige mention
|
|
$("#note").data("start-index", i);
|
|
$("#note").addClass("mentioning");
|
|
$("#note").on("keydown.mention", navigateMention); // Voor desktop
|
|
$("#note").on("beforeinput.mention", changeMention); // Voor desktop & mobile (captured alleen echte input, en geen toetsaanslagen die niets doen, zoals Escape)
|
|
$("#note").on("input.mention", mention);
|
|
$("#note").on("blur.mention", stopMention);
|
|
$("#note").trigger("input.mention");
|
|
}
|
|
|
|
function stopMention()
|
|
{
|
|
if (!$("#note").hasClass("mentioning"))
|
|
return;
|
|
$("#note").data("start-index", 0);
|
|
$("#note").removeClass("mentioning");
|
|
$("#note").off(".mention"); // Alle eventhandlers in de 'mention'-namespace
|
|
|
|
$("#mention_key_show")[0].value = "";
|
|
|
|
var sgEvent = $.Event("keydown");
|
|
sgEvent.keyCode = -2; // Custom voor de mentions in suggest.js
|
|
$("#mention_key_show").trigger(sgEvent);
|
|
}
|
|
|
|
function navigateMention(event) {
|
|
if (event.keyCode == 27) {
|
|
stopMention();
|
|
} else if ([9, 13, 33, 34, 38, 40].indexOf(event.keyCode) != -1) { // = Speciale key met betekenis in suggest.js
|
|
$("#mention_key_show").trigger(event);
|
|
FcltMgr.stopPropagation(event);
|
|
if (event.keyCode == 9) {
|
|
event.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function changeMention(event)
|
|
{
|
|
if (event.originalEvent && event.originalEvent.data) {
|
|
let key = event.originalEvent.data;
|
|
let keyCode = key.charCodeAt(0);
|
|
if (keyCode == 32 || key == ".") { // Spatie / Punt
|
|
stopMention();
|
|
} else if (keyCode == 8) { // Backspace
|
|
mention(event);
|
|
}
|
|
}
|
|
}
|
|
|
|
function mention(event)
|
|
{
|
|
let startIndex = $("#note").data("start-index");
|
|
let searchStr = "";
|
|
let key;
|
|
let keyCode;
|
|
|
|
if (event.originalEvent)
|
|
{
|
|
let e = event.originalEvent;
|
|
if (e.inputType === "insertText" || e.inputType === "insertCompositionText") {
|
|
key = event.originalEvent.data;
|
|
keyCode = key.charCodeAt(0);
|
|
} else if (e.inputType === "deleteContentBackward") {
|
|
key = "Backspace";
|
|
keyCode = 8;
|
|
} else if (e.inputType === "insertLineBreak") {
|
|
key = "Enter";
|
|
keyCode = 13;
|
|
} else if (e.inputType === "insertFromPaste") {
|
|
key = "Dummy";
|
|
keyCode = 999;
|
|
} else { // De rest wordt niet ondersteund
|
|
return;
|
|
}
|
|
|
|
if (key == "Enter"
|
|
|| (startIndex !== undefined && $("#note").val().substring(startIndex - 1, startIndex) != "@") // De '@' is weggehaald
|
|
|| (keyCode == 8 && $("#note").prop("selectionStart") == startIndex) // De '@' is weggehaald met een backspace
|
|
|| $("#note").prop("selectionStart") < startIndex) // Er is een teken getypt voor de '@'
|
|
{
|
|
stopMention();
|
|
if (key == "@")
|
|
startMention();
|
|
return;
|
|
}
|
|
let stopIndex = $("#note").prop("selectionStart");
|
|
searchStr = $("#note").val().substring(startIndex, stopIndex);
|
|
}
|
|
if (searchStr === "")
|
|
searchStr = "*";
|
|
|
|
$("#mention_key_show")[0].value = searchStr;
|
|
|
|
let sgEvent = $.Event("keydown");
|
|
sgEvent.keyCode = keyCode;
|
|
$("#mention_key_show").trigger(sgEvent);
|
|
}
|
|
|
|
function mentionCallback(sgKey, sgShow, sgFld)
|
|
{
|
|
var startIndex = $("#note").data("start-index") || 0;
|
|
if (sgKey == -1 || startIndex == -1)
|
|
return false;
|
|
var note = $("#note").val();
|
|
var stopIndex = $("#note").prop("selectionStart");
|
|
var newCaretIndex = String(note.substr(0, startIndex - 1) + "[mention]" + sgKey + "|" + sgShow + "[/mention]").length;
|
|
stopMention();
|
|
note = note.substr(0, startIndex - 1)
|
|
+ "[mention]" + sgKey + "|" + sgShow + "[/mention]"
|
|
+ note.substr(stopIndex);
|
|
window.setTimeout(function () {
|
|
$("#note").val(note);
|
|
$("#note")[0].selectionStart = newCaretIndex;
|
|
$("#note")[0].selectionEnd = newCaretIndex;
|
|
$("#note")[0].focus();
|
|
}, 0); // Anders komt dit nog voor de #note-blur omdat je op de autocompletediv klikt
|
|
}
|
|
|
|
function detailToggleClickHandler(doAnimation)
|
|
{
|
|
var ANIMATION_DURATION = 100;
|
|
|
|
var toggle_subject = $(this).attr("id").replace("-toggle-button", "");
|
|
var toggle_selectors = { "notes": ".note-container:not(.note-type-tracking, .note-fe-hidden)",
|
|
"tracking": ".note-type-tracking",
|
|
"fehidden": ".note-fe-hidden" };
|
|
|
|
var $noteDiv = $(".notes-wrapper");
|
|
doAnimation = typeof doAnimation === "undefined" ? true : doAnimation; // default true
|
|
|
|
// 1 Animation at a time
|
|
if (doAnimation && toggle_subject in toggle_selectors && $noteDiv.children(":has(" + toggle_selectors[toggle_subject] + ")").is(":animated"))
|
|
return;
|
|
|
|
var animatie_tijd = (doAnimation ? ANIMATION_DURATION : 0);
|
|
$(this).toggleClass("selected").blur();
|
|
|
|
/* Deze functie is bedoeld om naast de 'selector' notes ook de overbodige datum wrappers te togglen */
|
|
function _toggleThese(selector) { // Werkt alleen voor selectors op de note-container
|
|
var $filtered_notes = $noteDiv.find(selector).parent(".note-wrapper");
|
|
if (!$filtered_notes.length)
|
|
return;
|
|
|
|
var currentlyVisible = $filtered_notes.is(":visible"); // allen of 1 maakt niet echt uit
|
|
var $toggle_these = $([]); // Lege start-set
|
|
|
|
var $dates = $noteDiv.children(".note-date-wrapper");
|
|
var $temp;
|
|
$dates.each(function(i, elem) {
|
|
|
|
$temp = $([]); // Empty set
|
|
$elem = $(elem);
|
|
if (i < $dates.length - 1)
|
|
$temp = $elem.nextUntil($dates.eq(i+1)); /* Verzamel alle notes tussen datum i en i+1 */
|
|
else // of alles na de laatste datum
|
|
{
|
|
$temp = $elem.nextUntil($noteDiv.children(".note-wrapper").last());
|
|
$temp = $temp.add($noteDiv.children(".note-wrapper").last()); /* inclusief de laatste */
|
|
}
|
|
// $temp is hier een jQuery collectie van alle divjes die tussen datum i en datum i+1 zitten
|
|
// if:
|
|
// Ik ben nu zichtbaar && mijn datum ook && ik heb geen notities van een ander type dan die ik toggle die zichtbaar zijn.
|
|
// of; ik ben nu niet zichtbaar && mijn datum ook niet && ik heb wel notities die ik aan toggle
|
|
if ((currentlyVisible && $elem.is(":visible") && !$temp.not(":has("+selector+")").is(":visible")) || // mijn typ
|
|
(!currentlyVisible && !$elem.is(":visible") && $temp.has(selector).length)) // Alles in de $temp zijn notes die voldoen aan 'selector'
|
|
{
|
|
$toggle_these = $toggle_these.add($elem); // Dan kan de datum ook togglen
|
|
}
|
|
$toggle_these = $toggle_these.add($temp.has(selector));
|
|
|
|
});
|
|
$toggle_these.animate({ height: "toggle" }, animatie_tijd);
|
|
}
|
|
|
|
var selected = $(this).hasClass("selected"); /* if selected => show */
|
|
var note_filter = selected ? "S" : "s";
|
|
var nf_arr = (window.localStorage.getItem("notitiefilter") || "").split(",");
|
|
|
|
switch (toggle_subject)
|
|
{
|
|
case "notes":
|
|
_toggleThese(toggle_selectors["notes"]);
|
|
nf_arr[0] = note_filter;
|
|
break;
|
|
case "tracking":
|
|
_toggleThese(toggle_selectors["tracking"]);
|
|
nf_arr[1] = note_filter;
|
|
break;
|
|
case "more":
|
|
if (!doAnimation) /* Remove transition if !doAnimation */
|
|
$noteDiv.find(".note-text").addClass("notransition");
|
|
if (selected)
|
|
$noteDiv.find(".note-collapsed, .note_autocollapse").next(".note-toggler").trigger("click");
|
|
else
|
|
$noteDiv.find(".note-text").not(".note-collapsed, .note_autocollapse").next(".note-toggler").trigger("click");
|
|
if (!doAnimation)
|
|
$(".notransition").each(function () { $(this).get(0).offsetHeight; /* Trigger a reflow, flushing the CSS changes */
|
|
$(this).removeClass("notransition"); });
|
|
nf_arr[2] = note_filter;
|
|
break;
|
|
case "fehidden":
|
|
_toggleThese(toggle_selectors["fehidden"]);
|
|
nf_arr[3] = note_filter;
|
|
break;
|
|
}
|
|
window.localStorage.setItem("notitiefilter", nf_arr.join(","));
|
|
|
|
setTimeout(function() {
|
|
FcltMgr.resized();
|
|
}, animatie_tijd+25);
|
|
|
|
}
|
|
|
|
async function note_submit(formid)
|
|
{
|
|
if ($("#note").prop("disabled") || $("#note").val().trim() == "")
|
|
return false;
|
|
|
|
validateTextarea(false);
|
|
|
|
if (iface.uploads.length) {
|
|
await Promise.all(iface.uploads);
|
|
}
|
|
|
|
var $form = formid
|
|
? $("form#" + formid)
|
|
: $("form[name=u2]");
|
|
var url = $form[0].action;
|
|
|
|
// Als ik naar de opdracht toe moet, submit dan naar opdr_edit_note_save.asp
|
|
if ($("#module").val() === "mld") { // Dat hoeft alleen aangepast te worden als we bij een melding zitten
|
|
if ($("[data-toggle-subject-role='4'] [data-toggle-type='8'].on").length === 1) { // Er is een uitvoerder aangevinkt
|
|
url = "opdr_edit_note_save.asp"
|
|
+ "?opdr_key=" + $("[data-toggle-subject-role='4']").has("[data-toggle-type='8'].on").data("opdr-key")
|
|
+ "¬e_key=" + $("#note_key").val();
|
|
} else if ($(".reply-wrapper[data-module='opdr']").length === 1) { // Er is gereplied op een opdracht-notitie (bij de melding dus)
|
|
url = "opdr_edit_note_save.asp"
|
|
+ "?opdr_key=" + $(".reply-wrapper[data-module='opdr']").data("module_key")
|
|
+ "¬e_key=" + $("#note_key").val();
|
|
}
|
|
}
|
|
|
|
$.post(url,
|
|
$form.serialize(),
|
|
FcltCallbackAndThen(note_submit_callback),
|
|
"json");
|
|
}
|
|
|
|
function cancel_note_edit() {
|
|
$("#note").prop("disabled", true); /* Om te voorkomen dat een nieuwe keyup het scherm weer in edit mode zet */
|
|
note_submit_callback({});
|
|
}
|
|
|
|
function doPrint(pkey, pmodule, urole)
|
|
{
|
|
var nf_arr = (window.localStorage.getItem("notitiefilter") || "").split(",");
|
|
var tracking = (nf_arr[1] == "S" ? 1 : 0);
|
|
|
|
if (!$("#tracking-toggle-button").length || $("#tracking-toggle-button:not(.selected)").length) // Geen tracking-toggle, of hij staat uit
|
|
tracking = 0;
|
|
|
|
FcltMgr.windowopen("./" + pmodule.toLowerCase() + "_show_note.asp?" + pmodule.toLowerCase() + "_key=" + pkey + "&outputmode=1" + (urole? "&urole=" + urole : "") + "&tracking=" + tracking, "printNotes" + pkey, "noopener,noreferrer");
|
|
}
|
|
|
|
function Upload(purl)
|
|
{
|
|
var params = {callback: UploadCallback};
|
|
FcltMgr.openModalDetail(purl, L("lcl_appendixes"), params );
|
|
}
|
|
function UploadCallback()
|
|
{
|
|
var params = {};
|
|
if ($("#note").val() != "")
|
|
params.appendurl = "tmp_note=" + encodeURIComponent($("#note").val()) + "&parent_reload=1";
|
|
FcltMgr.reload(params);
|
|
}
|
|
|
|
function persoonDetails(evt, perslid_key)
|
|
{
|
|
FcltMgr.stopPropagation(evt);
|
|
FcltMgr.openDetail("appl/fac/fac_user.asp?prs_key=" + perslid_key);
|
|
}
|
|
|
|
function notechange(purl)
|
|
{
|
|
if (FcltMgr.mayEdit(window))
|
|
{
|
|
window.location.href = purl;
|
|
}
|
|
}
|
|
|
|
function removeReply()
|
|
{
|
|
FcltMgr.stopPropagation();
|
|
$(".note-textarea .reply-wrapper").remove();
|
|
$(".note-option-group").find("[data-toggle-type], .name").removeClass("disabled");
|
|
$("#parent_key").val(-1);
|
|
$("textarea#note").blur().focus().trigger("keyup");
|
|
}
|
|
|
|
function _disableToggles(flag) {
|
|
for (let i = 1; i <= 4; i = i << 1) { // Itereert over de rollen (1, 2 & 4)
|
|
if (!(flag & i) && i !== 2) { // Ben ik zichtbaar voor deze partij? (FOBO ziet altijd alles)
|
|
let $wrapper = $(".note-option-group").filter("[data-toggle-subject-role=" + i + "]");
|
|
let $toggles = $wrapper.find("[data-toggle-type], .name") // Alle types, dus Zichtbaarheid, Notificeren (+ kindermeldingen) & Actie
|
|
.filter((S_mld_note_hidden_action2FE === 1 ? ":not([data-toggle-type=8])" : "*")); // Dan mag deze nog wel
|
|
$toggles.filter(".on").trigger("click"); // Uitzetten (functioneel)
|
|
$toggles.addClass("disabled"); // Uitzetten (visueel)
|
|
}
|
|
}
|
|
}
|
|
|
|
function noteReply(note_key, module_key, type)
|
|
{
|
|
type = type.toLowerCase();
|
|
|
|
// Oude opschonen
|
|
removeReply();
|
|
|
|
// Vink ook de 'actie bij uitvoerder' van de juiste uitvoerder aan
|
|
if ($("#module").val() == "mld" && type === "opdr") {
|
|
$("[data-toggle-subject-role='4']").filter("[data-opdr-key='" + module_key + "']").find("[data-toggle-type='8'].off").trigger("click", true);
|
|
}
|
|
|
|
if (note_key > 0) // Ik reply op een specifieke notitie
|
|
{
|
|
var infix = type == "mld" ? 1 : (type == "opdr" ? 2 : "");
|
|
var $thisNote = $("#note-" + infix + note_key);
|
|
|
|
/* Disabled de toggles voor elke geadresseerde waarvoor de note waarop word ge-replied onzichtbaar is */
|
|
_disableToggles($thisNote.find(".note-container").data("flag"));
|
|
|
|
$("#parent_key").val(note_key);
|
|
|
|
if (!$(".note-textarea > .reply-wrapper").length) {
|
|
var $reply = $("<div class='reply-wrapper'>\
|
|
<div class='reply-container'>\
|
|
<div class='reply-header'></div>\
|
|
<span class='reply-body'></span>\
|
|
</div>\
|
|
</div>");
|
|
$("textarea#note").before($reply);
|
|
}
|
|
$(".note-textarea > .reply-wrapper").attr("data-module", type)
|
|
.attr("data-module_key", module_key);
|
|
var $close_icon = $("<span class='default-clickable-icon' onClick='removeReply()'>" + I("fa-times", { fastyle: "fal" }) + "</span>");
|
|
var authorNode = $thisNote.find(".note-author")[0].cloneNode(true);
|
|
if ($thisNote.hasClass("note-type-self"))
|
|
authorNode.innerText = L("lcl_You");
|
|
$(".note-textarea div.reply-header").empty().append(authorNode).append($close_icon);
|
|
|
|
var org_note = $thisNote.find(".note-body").find(".note-text").text();
|
|
|
|
$(".note-textarea .reply-body").html(safe.html(org_note));
|
|
}
|
|
|
|
$("textarea#note").blur().focus().trigger("keyup");
|
|
}
|
|
|
|
function noteToggleHandler(e, firstClick) {
|
|
const SUBJECT_ROLE = {
|
|
0: "EXT",
|
|
1: "FE",
|
|
2: "BO",
|
|
4: "UITV"
|
|
};
|
|
FcltMgr.stopPropagation(e);
|
|
if ($(this).hasClass("disabled")) {
|
|
e.preventDefault(); // Door het [for]-attribuut wordt anders alsnog de checkbox getoggled
|
|
return;
|
|
}
|
|
var $wrapper = $(this).closest(".note-option-group"); // De toggles horende bij de persoon waarvoor getoggled wordt
|
|
$(this).toggleClass("on off");
|
|
var subject_role = $wrapper.attr("data-toggle-subject-role");
|
|
var noteToggleSubject = SUBJECT_ROLE[subject_role];
|
|
|
|
var newState = $(this).hasClass("on") ? "on" : "off";
|
|
var anySelected = $(this).siblings().addBack().filter(".on:not(.hidden)").length > 0;
|
|
var type = parseInt($(this).attr("data-toggle-type"));
|
|
|
|
if (noteToggleSubject == "FE" && type == 8 && e.originalEvent && anySelected && S_mld_note_hidden_action2FE == 1) {
|
|
// In deze uitzondering hoeven we het oogje niet mee te vinken
|
|
} else if (noteToggleSubject != "BO" && (e.originalEvent || firstClick) && anySelected) { // *iets* aangevinkt? Dan ook zichtbaar
|
|
$(this).siblings("[data-toggle-type='1'].off").trigger("click");
|
|
} else if (noteToggleSubject != "BO" && !anySelected) {
|
|
$(this).siblings("[data-toggle-type='1'].on.hidden").trigger("click"); // *alles* uitgevinkt? Dan ook onzichtbaar
|
|
}
|
|
|
|
var visible = type == 1 ? newState : $wrapper.find("[data-toggle-type=1].on").length === 1;
|
|
$wrapper.toggleClass("anySelected", visible);
|
|
|
|
switch (type) {
|
|
case 1: /* Zichtbaarheid */
|
|
if (newState === "off") { // Als ik zichtbaarheid uitschakel ..
|
|
$(this).nextAll("[data-toggle-type][data-toggle-type!=8].on").trigger("click"); // .. schakel dan ook de notificaties uit (alles behalve actie)
|
|
if (S_mld_note_hidden_action2FE == 0) {
|
|
$wrapper.find("[data-toggle-type=8].on").trigger("click"); // .. schakel dan ook het actie vinkje uit
|
|
}
|
|
|
|
// Schakel "externe notificeren" ook uit
|
|
$("[data-toggle-subject-role='0']").find("[data-toggle-type='2'].on").trigger("click");
|
|
}
|
|
break;
|
|
case 2: /* Notificeren */
|
|
if (newState === "on" && noteToggleSubject == "EXT") { // Externe melder notificeren? -> dan ook zichtbaarFE aan
|
|
var $wrapperFE = $("[data-toggle-subject-role='1']");
|
|
$wrapperFE.find("[data-toggle-type='1'].off").trigger("click");
|
|
}
|
|
if (newState === "off") { // Als ik 'notificeren' uitschakel ..
|
|
if (noteToggleSubject == "FE" && S_mld_note_hidden_action2FE == 1) {
|
|
/* Uitzondering; je mag zonder zichtbaarheid/notificatie toch de actie zetten */
|
|
} else {
|
|
$wrapper.find("[data-toggle-type='8'].on").trigger("click"); // .. dan ook de 'actie bij' uitvinken
|
|
}
|
|
}
|
|
break;
|
|
case 8: /* Actie ! */
|
|
if (newState === "on") { // Als ik de actie zet ..
|
|
if (noteToggleSubject == "FE" && S_mld_note_hidden_action2FE == 1) {
|
|
/* Uitzondering; je mag zonder zichtbaarheid/notificatie toch de actie zetten */
|
|
} else {
|
|
$wrapper.find("[data-toggle-type='2'], [data-toggle-type='4']").filter(".off").trigger("click"); // .. dan ook "melder notificeren" & "melders kindermeldingen notificeren" aanzetten
|
|
}
|
|
}
|
|
|
|
// Deze is type radio (max 1 actief), dus schakel anderen (BO uitgezonderd) uit
|
|
if (noteToggleSubject == "UITV" && newState === "on") {
|
|
$wrapper.siblings(":not([data-toggle-subject-role='2'])").find("[data-toggle-type='8'].on").trigger("click");
|
|
}
|
|
|
|
if ($("#module").val() == "mld" && noteToggleSubject == "UITV")
|
|
{ // Hier de toggle die de reactie op een opdr geeft
|
|
if (newState == "on" && e.originalEvent) {
|
|
noteReply(0, $wrapper.attr("data-opdr-key"), "OPDR");
|
|
} else {
|
|
removeReply();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
$(function()
|
|
{
|
|
/* Notitie-optie toggles */
|
|
$(".note-option-group").on("click", function (e)
|
|
{
|
|
FcltMgr.stopPropagation(e);
|
|
|
|
// Is het niet 1 van deze? Dan is er een specifiek icoontje geklikt en hoeven we hier niets te doen
|
|
if (e.target === e.currentTarget || $(e.target).is("span.name"))
|
|
{ // Click het 'zichtbaarheid'-icoon aan als die zichtbaar & enabled is
|
|
$(this).find("[data-toggle-type=1]:not(.hidden, .disabled)").trigger("click", true);
|
|
}
|
|
});
|
|
|
|
/* (Individuele) notitie-optie toggles */
|
|
$("[data-toggle-type]").on("click", noteToggleHandler);
|
|
|
|
$(".bb-image").on("click", e => {
|
|
if (e.currentTarget.src) {
|
|
iface.fullscreen_image(e.currentTarget.src);
|
|
}
|
|
}).on("mouseenter", (e) => {
|
|
if (e.target.width === e.target.naturalWidth && e.target.height === e.target.naturalHeight) {
|
|
$(e.target).css("cursor", "pointer");
|
|
} else {
|
|
$(e.target).css("cursor", "zoom-in");
|
|
}
|
|
});
|
|
|
|
/* Klik op de filenaam om de bb-code in te voegen, of op het kruisje om de bijlage te verwijderen */
|
|
$(".edit-note .note-attachments").on("click", (e) => {
|
|
if ($(e.target).hasClass("note-attachment-image")) {
|
|
iface._insert_bb_code("note", "img", e.target.innerText);
|
|
} else if ($(e.target).hasClass("note-attachment-delete")) {
|
|
let fileName = $(e.target).prev(".note-attachment-name").text();
|
|
let url = e.target.getAttribute("data-delete-url");
|
|
FcltMgr.confirm(
|
|
L("lcl_delete") + " " + fileName + "?",
|
|
function() {
|
|
let data = {};
|
|
protectRequest.dataToken(data);
|
|
$.post(
|
|
url,
|
|
data,
|
|
FcltCallbackAndThen(function () {
|
|
let note = $("#note").val();
|
|
$("#note").val(note.split("[img]" + fileName + "[/img]").join(""));
|
|
$(e.target).parent(".note-attachment").remove();
|
|
$("#note").trigger("keyup");
|
|
validateTextarea();
|
|
})
|
|
);
|
|
}
|
|
);
|
|
}
|
|
});
|
|
}); |