var timer; var siteRoot = location.protocol + '//' + location.host; var dtLastActivity; var saveButton; var deleteButton; var editButton; var canEnabledDelBtn; var errorPlaceholder; var checking; var updating; var dataIsEdited; var dataEditedText = "Sorry, this {entity} is being edited by {username}. Please, try to refresh the page a little bit later."; var timedInactivityText = "Sorry, you have exceeded the period of inactivity and we cannot save your changes now. Please reload the page to try edit this object again."; var UserFinishedEditing = "{entity} is now available for editing. Refresh the page to load latest changes and start editing"; var serverErrorText = "Server is not responding"; var dataEditedPopover = "{entity} is being edited by {username}. Please, try again later."; var serverError404Text = "It seems like the connection to the server was lost and server considered you left the edit page."; var serverError401Text = "You are not authorized to edit the {entity}. Please, sign in and try to edit the {entity} again"; // call it when click on the link before redirect to locked page function CheckLock(buttonId, tableId, fieldId) { var request = { 'tableId': tableId, 'fieldId': fieldId }; var result = false; $.ajax({ type: "post", url: siteRoot + "/ContentLockerApi/IsLock", data: request, async: false, error: function (response) { ShowPopover(buttonId, serverErrorText); result = false; }, success: function (response) { if (response.Status == true) { ShowPopover(buttonId, dataEditedPopover.replace(/\{username\}/g, response.LockedBy).replace(/\{entity\}/g, response.EntityTitle)); result = false; } else { result = true; } } }); return result; } function CheckingLocks(tableId, fieldId, externalReferencesCount, editButtonId, deleteButtonId, erorPlaceholderId) { checking = true; deleteButton = deleteButtonId; editButton = editButtonId; errorPlaceholder = erorPlaceholderId; dataIsEdited = false; if (externalReferencesCount > 0) { canEnabledDelBtn = false; } else { canEnabledDelBtn = true; } var request = { 'tableId': tableId, 'fieldId': fieldId }; IsLock(request); } // call it on the edit page to lock the object function StartEdit(tableId, fieldId, deleteButtonId, saveButtonId, erorPlaceholderId) { updating = true; errorPlaceholder = erorPlaceholderId; deleteButton = deleteButtonId; saveButton = saveButtonId; var request = { 'tableId': tableId, 'fieldId': fieldId }; $('#danger').hide(); AddLock(request); $(window).on('unload', function () { RemoveLock(request.tableId, request.fieldId); }); $("#lnkLogout").click(function () { RemoveLock(request.tableId, request.fieldId); }); } // call it on the details (always) and edit page (if content is locked by someone else) function IsLock(request) { if(!checking) return; var canGoOn = true; $.ajax({ type: "post", url: siteRoot + "/ContentLockerApi/IsLock", data: request, error: function(response) { $(editButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); RemoveErrorMessage(); if (response.status != null) { if (response.status == 401) ShowErrorMessage(serverError401Text.replace(/\{entity\}/g, response.EntityTitle), true); else ShowErrorMessage(serverErrorText, true); } else ShowErrorMessage(serverErrorText, true); }, success: function(response) { if (response == null || response.Status == null) { $(editButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); RemoveErrorMessage(); ShowErrorMessage(serverErrorText, true); } else { if (response.Status == true) { $(editButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); ShowErrorMessage(dataEditedText.replace(/\{username\}/g, response.LockedBy).replace(/\{entity\}/g, response.EntityTitle), false); dataIsEdited = true; } else { if (dataIsEdited) { RemoveErrorMessage(); canGoOn = false; ShowErrorMessage(UserFinishedEditing.replace(/\{entity\}/g, response.EntityTitle, false), true); } dataIsEdited = false; //$(editButton).removeClass("disabled"); ///UnlockTabElements(); //if (canEnabledDelBtn) { // $(deleteButton).removeClass("disabled"); //} } if (canGoOn) { setTimeout(IsLock, _isLockCheckIntervalMs, request); } } } }); } // call it to send lock ajax request to the server function AddLock(request) { $.ajax({ type: "post", url: siteRoot + "/ContentLockerApi/AddLock", data: request, error: function(response) { $(saveButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); ShowErrorMessage(serverErrorText, true); }, success: function (response) { if (response == null || response.Status == null) { $(saveButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); ShowErrorMessage(serverErrorText, true); } else { if (response.Status == true) { dtLastActivity = new Date().getTime(); setTimeout(UpdateLock, _isLockCheckIntervalMs, request); } else { $(saveButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); ShowErrorMessage(dataEditedText.replace(/\{username\}/g, response.LockedBy).replace(/\{entity\}/g, response.EntityTitle), false); CheckingLocks(request.tableId, request.fieldId, 0, saveButton, deleteButton, errorPlaceholder); } } } }); } // automatically called every X seconds to extend locked period function UpdateLock(request) { if (!updating) return; $.ajax({ type: "post", url: siteRoot + "/ContentLockerApi/UpdateLock", data: request, error: function(returnval) { $(saveButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); ShowErrorMessage(serverErrorText, true); }, success: function(returnval) { if (returnval == true) { if (new Date().getTime() < dtLastActivity + _periodOfInactivity*1000) { setTimeout(UpdateLock, _isLockCheckIntervalMs, request); } else { $(saveButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); ShowErrorMessage(timedInactivityText, true); RemoveLock(request.tableId, request.fieldId); } } else { $(saveButton).addClass("disabled"); LockTabElements(); $(deleteButton).addClass("disabled"); ShowErrorMessage(serverErrorText, true); } } }); } // call it if user leave the edit page or no activity for a long time function RemoveLock(tableId, fieldId) { var request = { 'tableId': tableId, 'fieldId': fieldId }; $.ajax({ type: "post", async: false, url: siteRoot + "/ContentLockerApi/RemoveLock", data: request }); } // reset timer of inactivity function ResetInactivePeriod() { dtLastActivity = new Date().getTime(); } function ShowErrorMessage(errorText, enabledReloadLink) { if (document.getElementById(errorPlaceholder).childElementCount == 0) { var alertMsg = document.createElement('div'); alertMsg.className = "alert alert-danger"; var erormsg = document.createElement('span'); $(erormsg).html(errorText); alertMsg.appendChild(erormsg); if (enabledReloadLink) { var linkPlaceholder = document.createElement('span'); $(linkPlaceholder).css('float','right'); var link = document.createElement('a'); link.href = document.location.href; $(link).text("Reload"); linkPlaceholder.appendChild(link); alertMsg.appendChild(linkPlaceholder); } document.getElementById(errorPlaceholder).appendChild(alertMsg); } } function RemoveErrorMessage() { var erorRootElement = document.getElementById(errorPlaceholder) if (erorRootElement.childElementCount > 0) while (erorRootElement.hasChildNodes()) { erorRootElement.removeChild(erorRootElement.lastChild); } } function ShowPopover(buttonId, message) { $('#' + buttonId).popover({ html: 'true', trigger: 'manual', title: 'Not allowed' + '', content: message }); $('#' + buttonId).popover('show'); } function LockTabElements() { var lockableElements = document.getElementsByClassName('lockable'); for (var i = 0; i < lockableElements.length; ++i) { var item = lockableElements[i]; $(item).addClass("disabled"); } } function UnlockTabElements() { var lockableElements = document.getElementsByClassName('lockable'); for (var i = 0; i < lockableElements.length; ++i) { var item = lockableElements[i]; $(item).removeClass("disabled"); } } function StopChecking () { checking = false; } function StopEdit() { updating = false; }