diff options
Diffstat (limited to 'assets/js/src/base.js')
-rw-r--r-- | assets/js/src/base.js | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/assets/js/src/base.js b/assets/js/src/base.js new file mode 100644 index 00000000..0d46b503 --- /dev/null +++ b/assets/js/src/base.js @@ -0,0 +1,284 @@ +// Common functions +var Kanboard = (function() { + + jQuery(document).ready(function() { + Kanboard.Init(); + }); + + return { + + // Return true if the element#id exists + Exists: function(id) { + if (document.getElementById(id)) { + return true; + } + + return false; + }, + + // Open a popup on a link click + Popover: function(e, callback) { + e.preventDefault(); + e.stopPropagation(); + + var link = e.target.getAttribute("href"); + + if (! link) { + link = e.target.getAttribute("data-href"); + } + + if (link) { + Kanboard.OpenPopover(link, callback); + } + }, + + // Display a popup + OpenPopover: function(link, callback) { + + $.get(link, function(content) { + + $("body").append('<div id="popover-container"><div id="popover-content">' + content + '</div></div>'); + + $("#popover-container").click(function() { + $(this).remove(); + }); + + $("#popover-content").click(function(e) { + e.stopPropagation(); + }); + + $(".close-popover").click(function(e) { + e.preventDefault(); + $('#popover-container').remove(); + }); + + Mousetrap.bind("esc", function() { + $('#popover-container').remove(); + }); + + if (callback) { + callback(); + } + }); + }, + + // Return true if the page is visible + IsVisible: function() { + + var property = ""; + + if (typeof document.hidden !== "undefined") { + property = "visibilityState"; + } else if (typeof document.mozHidden !== "undefined") { + property = "mozVisibilityState"; + } else if (typeof document.msHidden !== "undefined") { + property = "msVisibilityState"; + } else if (typeof document.webkitHidden !== "undefined") { + property = "webkitVisibilityState"; + } + + if (property != "") { + return document[property] == "visible"; + } + + return true; + }, + + // Save preferences in local storage + SetStorageItem: function(key, value) { + if (typeof(Storage) !== "undefined") { + localStorage.setItem(key, value); + } + }, + + GetStorageItem: function(key) { + + if (typeof(Storage) !== "undefined") { + return localStorage.getItem(key); + } + + return ''; + }, + + // Generate Markdown preview + MarkdownPreview: function(e) { + + e.preventDefault(); + + var link = $(this); + var nav = $(this).closest("ul"); + var write = $(".write-area"); + var preview = $(".preview-area"); + var textarea = $("textarea"); + + var request = $.ajax({ + url: "?controller=app&action=preview", + contentType: "application/json", + type: "POST", + processData: false, + dataType: "html", + data: JSON.stringify({ + "text": textarea.val() + }) + }); + + request.done(function(data) { + + nav.find("li").removeClass("form-tab-selected"); + link.parent().addClass("form-tab-selected"); + + preview.find(".markdown").html(data) + preview.css("height", textarea.css("height")); + preview.css("width", textarea.css("width")); + + write.hide(); + preview.show(); + }); + }, + + // Show the Markdown textarea + MarkdownWriter: function(e) { + + e.preventDefault(); + + $(this).closest("ul").find("li").removeClass("form-tab-selected") + $(this).parent().addClass("form-tab-selected"); + + $(".write-area").show(); + $(".preview-area").hide(); + }, + + // Check session and redirect to the login page if not logged + CheckSession: function() { + + if (! $(".form-login").length) { + $.ajax({ + cache: false, + url: $("body").data("status-url"), + statusCode: { + 401: function() { + window.location = $("body").data("login-url"); + } + } + }); + } + }, + + Init: function() { + + // Chosen select + $(".chosen-select").chosen({ + width: "200px", + no_results_text: $(".chosen-select").data("notfound"), + disable_search_threshold: 10 + }); + + // Project select box + $("#board-selector").chosen({ + width: 180, + no_results_text: $("#board-selector").data("notfound") + }); + + $("#board-selector").change(function() { + window.location = $(this).attr("data-board-url").replace(/PROJECT_ID/g, $(this).val()); + }); + + // Check the session every 60s + window.setInterval(Kanboard.CheckSession, 60000); + + // Keyboard shortcuts + Mousetrap.bindGlobal("mod+enter", function() { + $("form").submit(); + }); + + Mousetrap.bind("b", function(e) { + e.preventDefault(); + $('#board-selector').trigger('chosen:open'); + }); + + $.datepicker.setDefaults($.datepicker.regional[$("body").data("js-lang")]); + + Kanboard.InitAfterAjax(); + }, + + InitAfterAjax: function() { + + // Popover + $(document).on("click", ".popover", Kanboard.Popover); + + // Autofocus fields (html5 autofocus works only with page onload) + $("[autofocus]").each(function(index, element) { + $(this).focus(); + }) + + // Datepicker + $(".form-date").datepicker({ + showOtherMonths: true, + selectOtherMonths: true, + dateFormat: 'yy-mm-dd', + constrainInput: false + }); + + // Markdown Preview for textareas + $("#markdown-preview").click(Kanboard.MarkdownPreview); + $("#markdown-write").click(Kanboard.MarkdownWriter); + + // Auto-select input fields + $(".auto-select").focus(function() { + $(this).select(); + }); + + // Dropdown + $(".dropit-submenu").hide(); + $('.dropdown').not(".dropit").dropit({ triggerParentEl : "span" }); + + // Task auto-completion + if ($(".task-autocomplete").length) { + + if ($('.opposite_task_id').val() == '') { + $(".task-autocomplete").parent().find("input[type=submit]").attr('disabled','disabled'); + } + + $(".task-autocomplete").autocomplete({ + source: $(".task-autocomplete").data("search-url"), + minLength: 1, + select: function(event, ui) { + var field = $(".task-autocomplete").data("dst-field"); + $("input[name=" + field + "]").val(ui.item.id); + + $(".task-autocomplete").parent().find("input[type=submit]").removeAttr('disabled'); + } + }); + } + + // Tooltip for column description + $(".column-tooltip").tooltip({ + content: function() { + return '<div class="markdown">' + $(this).attr("title") + '</div>'; + }, + position: { + my: 'left-20 top', + at: 'center bottom+9', + using: function(position, feedback) { + + $(this).css(position); + + var arrow_pos = feedback.target.left + feedback.target.width / 2 - feedback.element.left - 20; + + $("<div>") + .addClass("tooltip-arrow") + .addClass(feedback.vertical) + .addClass(arrow_pos == 0 ? "align-left" : "align-right") + .appendTo(this); + } + } + }); + + // Screenshot + if (Kanboard.Exists("screenshot-zone")) { + Kanboard.Screenshot.Init(); + } + } + }; + +})(); |