summaryrefslogtreecommitdiff
path: root/assets/js/src/base.js
diff options
context:
space:
mode:
Diffstat (limited to 'assets/js/src/base.js')
-rw-r--r--assets/js/src/base.js284
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();
+ }
+ }
+ };
+
+})();