diff options
author | Frederic Guillot <fred@kanboard.net> | 2017-01-02 17:01:27 -0500 |
---|---|---|
committer | Frederic Guillot <fred@kanboard.net> | 2017-01-02 17:01:27 -0500 |
commit | 3833c12ccce59bcc49c4cfa892401973558f604d (patch) | |
tree | b67b0e10cdc3d42e5626f728206138a444a40ed0 /assets/js/src | |
parent | d49ce63e51f596ad3bf0d02b689aea673cf544f8 (diff) |
Refactoring/rewrite of modal boxes handling
Diffstat (limited to 'assets/js/src')
-rw-r--r-- | assets/js/src/BoardTask.js | 1 | ||||
-rw-r--r-- | assets/js/src/Dropdown.js | 9 | ||||
-rw-r--r-- | assets/js/src/FileUpload.js | 125 | ||||
-rw-r--r-- | assets/js/src/Popover.js | 161 | ||||
-rw-r--r-- | assets/js/src/Screenshot.js | 134 | ||||
-rw-r--r-- | assets/js/src/Search.js | 1 | ||||
-rw-r--r-- | assets/js/src/Task.js | 25 |
7 files changed, 4 insertions, 452 deletions
diff --git a/assets/js/src/BoardTask.js b/assets/js/src/BoardTask.js index cdf32532..9e51002b 100644 --- a/assets/js/src/BoardTask.js +++ b/assets/js/src/BoardTask.js @@ -2,6 +2,7 @@ Kanboard.BoardTask = function(app) { this.app = app; }; +// TODO: rewrite this code Kanboard.BoardTask.prototype.listen = function() { var self = this; diff --git a/assets/js/src/Dropdown.js b/assets/js/src/Dropdown.js index d97b925e..ec033b3e 100644 --- a/assets/js/src/Dropdown.js +++ b/assets/js/src/Dropdown.js @@ -2,6 +2,7 @@ Kanboard.Dropdown = function(app) { this.app = app; }; +// TODO: rewrite this code Kanboard.Dropdown.prototype.listen = function() { var self = this; @@ -9,10 +10,6 @@ Kanboard.Dropdown.prototype.listen = function() { self.close(); }); - $(document).on('click', '#popover-content', function() { - self.close(); - }); - $(document).on('click', '.dropdown-menu', function(e) { e.preventDefault(); e.stopImmediatePropagation(); @@ -56,7 +53,3 @@ Kanboard.Dropdown.prototype.listen = function() { Kanboard.Dropdown.prototype.close = function() { $("#dropdown").remove(); }; - -Kanboard.Dropdown.prototype.onPopoverOpened = function() { - this.close(); -}; diff --git a/assets/js/src/FileUpload.js b/assets/js/src/FileUpload.js deleted file mode 100644 index f53b9bf8..00000000 --- a/assets/js/src/FileUpload.js +++ /dev/null @@ -1,125 +0,0 @@ -Kanboard.FileUpload = function(app) { - this.app = app; - this.files = []; - this.currentFile = 0; -}; - -Kanboard.FileUpload.prototype.onPopoverOpened = function() { - var dropzone = document.getElementById("file-dropzone"); - var self = this; - - if (dropzone) { - dropzone.ondragover = dropzone.ondragenter = function(e) { - e.stopPropagation(); - e.preventDefault(); - }; - - dropzone.ondrop = function(e) { - e.stopPropagation(); - e.preventDefault(); - self.files = e.dataTransfer.files; - self.show(); - $("#file-error-max-size").hide(); - }; - - $(document).on("click", "#file-browser", function(e) { - e.preventDefault(); - $("#file-form-element").get(0).click(); - }); - - $(document).on("click", "#file-upload-button", function(e) { - e.preventDefault(); - self.currentFile = 0; - self.checkFiles(); - }); - - $("#file-form-element").change(function() { - self.files = document.getElementById("file-form-element").files; - self.show(); - $("#file-error-max-size").hide(); - }); - } -}; - -Kanboard.FileUpload.prototype.show = function() { - $("#file-list").remove(); - - if (this.files.length > 0) { - $("#file-upload-button").prop("disabled", false); - $("#file-dropzone-inner").hide(); - - var ul = jQuery("<ul>", {"id": "file-list"}); - - for (var i = 0; i < this.files.length; i++) { - var percentage = jQuery("<span>", {"id": "file-percentage-" + i}).append("(0%)"); - var progress = jQuery("<progress>", {"id": "file-progress-" + i, "value": 0}); - var li = jQuery("<li>", {"id": "file-label-" + i}) - .append(progress) - .append(" ") - .append(this.files[i].name) - .append(" ") - .append(percentage); - - ul.append(li); - } - - $("#file-dropzone").append(ul); - } else { - $("#file-dropzone-inner").show(); - } -}; - -Kanboard.FileUpload.prototype.checkFiles = function() { - var max = parseInt($("#file-dropzone").data("max-size")); - - for (var i = 0; i < this.files.length; i++) { - if (this.files[i].size > max) { - $("#file-error-max-size").show(); - $("#file-label-" + i).addClass("file-error"); - $("#file-upload-button").prop("disabled", true); - return; - } - } - - this.uploadFiles(); -}; - -Kanboard.FileUpload.prototype.uploadFiles = function() { - if (this.files.length > 0) { - this.uploadFile(this.files[this.currentFile]); - } -}; - -Kanboard.FileUpload.prototype.uploadFile = function(file) { - var dropzone = document.getElementById("file-dropzone"); - var url = dropzone.dataset.url; - var xhr = new XMLHttpRequest(); - var fd = new FormData(); - - xhr.upload.addEventListener("progress", this.updateProgress.bind(this)); - xhr.upload.addEventListener("load", this.transferComplete.bind(this)); - - xhr.open("POST", url, true); - fd.append('files[]', file); - xhr.send(fd); -}; - -Kanboard.FileUpload.prototype.updateProgress = function(e) { - if (e.lengthComputable) { - $("#file-progress-" + this.currentFile).val(e.loaded / e.total); - $("#file-percentage-" + this.currentFile).text('(' + Math.floor((e.loaded / e.total) * 100) + '%)'); - } -}; - -Kanboard.FileUpload.prototype.transferComplete = function() { - this.currentFile++; - - if (this.currentFile < this.files.length) { - this.uploadFile(this.files[this.currentFile]); - } else { - var uploadButton = $("#file-upload-button"); - uploadButton.prop("disabled", true); - uploadButton.parent().hide(); - $("#file-done").show(); - } -}; diff --git a/assets/js/src/Popover.js b/assets/js/src/Popover.js deleted file mode 100644 index ab71505a..00000000 --- a/assets/js/src/Popover.js +++ /dev/null @@ -1,161 +0,0 @@ -Kanboard.Popover = function(app) { - this.app = app; -}; - -Kanboard.Popover.prototype.listen = function() { - var self = this; - - $(document).on("click", ".popover", function(e) { - self.onClick(e); - }); - - $(document).on("click", ".close-popover", function(e) { - self.close(e); - }); - - $(document).on("click", "#popover-close-button", function(e) { - self.close(e); - }); - - $(document).on("click", "#popover-content", function(e) { - e.stopPropagation(); - }); -}; - -Kanboard.Popover.prototype.onClick = function(e) { - e.preventDefault(); - e.stopPropagation(); - - var target = e.currentTarget || e.target; - var link = target.getAttribute("href"); - - if (! link) { - link = target.getAttribute("data-href"); - } - - if (link) { - this.open(link); - } -}; - -Kanboard.Popover.prototype.isOpen = function() { - return $('#popover-container').size() > 0; -}; - -Kanboard.Popover.prototype.open = function(link) { - var self = this; - - if (!self.isOpen()) { - $.get(link, function(content) { - $("body").prepend( - '<div id="popover-container">' + - '<div id="popover-content">' + - '<div id="popover-content-header"><a href="#" id="popover-close-button"><i class="fa fa-times"></i></a></div>' + - content + - '</div>' + - '</div>' - ); - - self.executeOnOpenedListeners(); - }); - } -}; - -Kanboard.Popover.prototype.close = function(e) { - if (this.isOpen()) { - if (e) { - e.preventDefault(); - } - - $("#popover-container").remove(); - this.executeOnClosedListeners(); - } -}; - -Kanboard.Popover.prototype.ajaxReload = function(data, request, self) { - var redirect = request.getResponseHeader("X-Ajax-Redirect"); - - if (redirect === 'self') { - window.location.reload(); - } else if (redirect && redirect.indexOf('#') > -1) { - window.location = redirect.split('#')[0]; - } else if (redirect) { - window.location = redirect; - } else { - $("#popover-content").html(data); - $("#popover-content input[autofocus]").focus(); - self.executeOnOpenedListeners(); - } -}; - -Kanboard.Popover.prototype.executeOnOpenedListeners = function() { - for (var className in this.app.controllers) { - var controller = this.app.get(className); - - if (typeof controller.onPopoverOpened === "function") { - controller.onPopoverOpened(); - } - } - - this.afterOpen(); -}; - -Kanboard.Popover.prototype.executeOnClosedListeners = function() { - for (var className in this.app.controllers) { - var controller = this.app.get(className); - - if (typeof controller.onPopoverClosed === "function") { - controller.onPopoverClosed(); - } - } -}; - -Kanboard.Popover.prototype.afterOpen = function() { - var self = this; - var popoverForm = $("#popover-content .popover-form"); - - // Submit forms with Ajax request - if (popoverForm) { - popoverForm.on("submit", function(e) { - e.preventDefault(); - - $.ajax({ - type: "POST", - url: popoverForm.attr("action"), - data: popoverForm.serialize(), - success: function(data, textStatus, request) { - self.ajaxReload(data, request, self); - }, - beforeSend: function() { - var button = $('.popover-form button[type="submit"]'); - button.html('<i class="fa fa-spinner fa-pulse"></i> ' + button.html()); - button.attr("disabled", true); - } - }); - }); - } - - // Submit link with Ajax request - $(document).on("click", ".popover-link", function(e) { - e.preventDefault(); - - $.ajax({ - type: "GET", - url: $(this).attr("href"), - success: function(data, textStatus, request) { - self.ajaxReload(data, request, self); - } - }); - }); - - // Autofocus fields (html5 autofocus works only with page onload) - $("#popover-content input[autofocus]").each(function() { - $(this).focus(); - }); - - this.app.datePicker(); - this.app.autoComplete(); - this.app.tagAutoComplete(); - - KB.render(); -}; diff --git a/assets/js/src/Screenshot.js b/assets/js/src/Screenshot.js deleted file mode 100644 index 4f69e9c3..00000000 --- a/assets/js/src/Screenshot.js +++ /dev/null @@ -1,134 +0,0 @@ -Kanboard.Screenshot = function(app) { - this.app = app; - this.pasteCatcher = null; -}; - -Kanboard.Screenshot.prototype.onPopoverOpened = function() { - if (this.app.hasId("screenshot-zone")) { - this.initialize(); - } -}; - -// Setup event listener and workarounds -Kanboard.Screenshot.prototype.initialize = function() { - this.destroy(); - - if (! window.Clipboard) { - - // Create a contenteditable element - this.pasteCatcher = document.createElement("div"); - this.pasteCatcher.id = "screenshot-pastezone"; - this.pasteCatcher.contentEditable = "true"; - - // Insert the content editable at the top to avoid scrolling down in the board view - this.pasteCatcher.style.opacity = 0; - this.pasteCatcher.style.position = "fixed"; - this.pasteCatcher.style.top = 0; - this.pasteCatcher.style.right = 0; - this.pasteCatcher.style.width = 0; - - document.body.insertBefore(this.pasteCatcher, document.body.firstChild); - - // Set focus on the contenteditable element - this.pasteCatcher.focus(); - - // Set the focus when clicked anywhere in the document - document.addEventListener("click", this.setFocus.bind(this)); - - // Set the focus when clicked in screenshot dropzone (popover) - document.getElementById("screenshot-zone").addEventListener("click", this.setFocus.bind(this)); - } - - window.addEventListener("paste", this.pasteHandler.bind(this)); -}; - -// Destroy contentEditable element -Kanboard.Screenshot.prototype.destroy = function() { - if (this.pasteCatcher !== null) { - document.body.removeChild(this.pasteCatcher); - } - else if (document.getElementById("screenshot-pastezone")) { - document.body.removeChild(document.getElementById("screenshot-pastezone")); - } - - document.removeEventListener("click", this.setFocus.bind(this)); - this.pasteCatcher = null; -}; - -// Set focus on contentEditable element -Kanboard.Screenshot.prototype.setFocus = function() { - if (this.pasteCatcher !== null) { - this.pasteCatcher.focus(); - } -}; - -// Paste event callback -Kanboard.Screenshot.prototype.pasteHandler = function(e) { - // Firefox doesn't have the property e.clipboardData.items (only Chrome) - if (e.clipboardData && e.clipboardData.items) { - - var items = e.clipboardData.items; - - if (items) { - - for (var i = 0; i < items.length; i++) { - - // Find an image in pasted elements - if (items[i].type.indexOf("image") !== -1) { - - var blob = items[i].getAsFile(); - - // Get the image as base64 data - var reader = new FileReader(); - var self = this; - reader.onload = function(event) { - self.createImage(event.target.result); - }; - - reader.readAsDataURL(blob); - } - } - } - } - else { - - // Handle Firefox - setTimeout(this.checkInput.bind(this), 100); - } -}; - -// Parse the input in the paste catcher element -Kanboard.Screenshot.prototype.checkInput = function() { - var child = this.pasteCatcher.childNodes[0]; - - if (child) { - // If the user pastes an image, the src attribute - // will represent the image as a base64 encoded string. - if (child.tagName === "IMG") { - this.createImage(child.src); - } - } - - this.pasteCatcher.innerHTML = ""; -}; - -// Creates a new image from a given source -Kanboard.Screenshot.prototype.createImage = function(blob) { - var pastedImage = new Image(); - pastedImage.src = blob; - - // Send the image content to the form variable - pastedImage.onload = function() { - var sourceSplit = blob.split("base64,"); - var sourceString = sourceSplit[1]; - $("input[name=screenshot]").val(sourceString); - }; - - var zone = document.getElementById("screenshot-zone"); - zone.innerHTML = ""; - zone.className = "screenshot-pasted"; - zone.appendChild(pastedImage); - - this.destroy(); - this.initialize(); -}; diff --git a/assets/js/src/Search.js b/assets/js/src/Search.js index de78c896..b61710a4 100644 --- a/assets/js/src/Search.js +++ b/assets/js/src/Search.js @@ -15,6 +15,7 @@ Kanboard.Search.prototype.focus = function() { }); }; +// TODO: rewrite this code Kanboard.Search.prototype.listen = function() { $(document).on("click", ".filter-helper", function (e) { e.preventDefault(); diff --git a/assets/js/src/Task.js b/assets/js/src/Task.js index be9c2bfa..19cf39e8 100644 --- a/assets/js/src/Task.js +++ b/assets/js/src/Task.js @@ -2,9 +2,9 @@ Kanboard.Task = function(app) { this.app = app; }; +// TODO: rewrite this code Kanboard.Task.prototype.onPopoverOpened = function() { var self = this; - var reloadingProjectId = 0; self.renderColorPicker(); @@ -19,29 +19,6 @@ Kanboard.Task.prototype.onPopoverOpened = function() { $(dropdownId).val(currentId); } }); - - // Reload page when a destination project is changed - $(document).on("change", "select.task-reload-project-destination", function() { - if (reloadingProjectId > 0) { - $(this).val(reloadingProjectId); - } - else { - reloadingProjectId = $(this).val(); - var url = $(this).data("redirect").replace(/PROJECT_ID/g, reloadingProjectId); - - $(".loading-icon").show(); - - $.ajax({ - type: "GET", - url: url, - success: function(data, textStatus, request) { - reloadingProjectId = 0; - $(".loading-icon").hide(); - self.app.get("Popover").ajaxReload(data, request, self.app.get("Popover")); - } - }); - } - }); }; Kanboard.Task.prototype.renderColorPicker = function() { |