about summary refs log tree commit diff
path: root/uploader/static/js
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/static/js')
-rw-r--r--uploader/static/js/datatables.js74
-rw-r--r--uploader/static/js/debug.js40
-rw-r--r--uploader/static/js/populations.js17
-rw-r--r--uploader/static/js/pubmed.js2
-rw-r--r--uploader/static/js/species.js16
-rw-r--r--uploader/static/js/upload_samples.js24
-rw-r--r--uploader/static/js/urls.js26
-rw-r--r--uploader/static/js/utils.js3
8 files changed, 163 insertions, 39 deletions
diff --git a/uploader/static/js/datatables.js b/uploader/static/js/datatables.js
index 82fd696..bfcda2a 100644
--- a/uploader/static/js/datatables.js
+++ b/uploader/static/js/datatables.js
@@ -11,13 +11,36 @@ var addTableLength = (menuList, lengthToAdd, dataLength) => {
 
 var defaultLengthMenu = (data) => {
     menuList = []
-    var lengths = [10, 25, 50, 100, 1000, data.length];
+    var lengths = [10, 25, 50, 100, 1000];
+    if(data.length > 1000) {
+        lengths.push(data.length)
+    }
     lengths.forEach((len) => {
         menuList = addTableLength(menuList, len, data.length);
     });
     return menuList;
 };
 
+var setRowCheckableProperty = (node, state) => {
+    /**
+     * Set a row's (`node`) checkbox's or radio button's checked state to the
+     * boolean value `state`.
+     **/
+    if(typeof(state) == "boolean") {
+        var pseudoclass = state == false ? ":checked" : ":not(:checked)";
+        var checkable = (
+            $(node).find(`input[type="checkbox"]${pseudoclass}`)[0]
+                ||
+                $(node).find(`input[type="radio"]${pseudoclass}`)[0]);
+        $(checkable).prop("checked", state);
+    } else {
+        throw new Error("`state` *MUST* be a boolean value.")
+    }
+};
+
+var setRowChecked = (node) => {setRowCheckableProperty(node, true);};
+var setRowUnchecked = (node) => {setRowCheckableProperty(node, false);};
+
 var buildDataTable = (tableId, data = [], columns = [], userSettings = {}) => {
     var defaultSettings = {
         responsive: true,
@@ -35,35 +58,40 @@ var buildDataTable = (tableId, data = [], columns = [], userSettings = {}) => {
             lengthMenu: "",
             info: ""
         },
-        data: data,
-        columns: columns,
-        drawCallback: (settings) => {
-            $(this[0]).find("tbody tr").each((idx, row) => {
-                var arow = $(row);
-                var checkboxOrRadio = arow.find(".chk-row-select");
-                if (checkboxOrRadio) {
-                    if (arow.hasClass("selected")) {
-                        checkboxOrRadio.prop("checked", true);
-                    } else {
-                        checkboxOrRadio.prop("checked", false);
-                    }
-                }
+        drawCallback: function (settings) {
+            var api = this.api();
+            api.rows({selected: true}).nodes().each((node, index) => {
+                setRowChecked(node);
+            });
+            api.rows({selected: false}).nodes().each((node, index) => {
+                setRowUnchecked(node);
             });
         }
     }
     var theDataTable = $(tableId).DataTable({
         ...defaultSettings,
-        ...userSettings
+        ...userSettings,
+        ...(data.length == 0 ? {} : {data: data}),
+        ...(columns.length == 0 ? {} : {columns: columns})
     });
-    theDataTable.on("select", (event, datatable, type, cell, originalEvent) => {
-        datatable.rows({selected: true}).nodes().each((node, index) => {
-            $(node).find(".chk-row-select").prop("checked", true)
-        });
+    theDataTable.on("select", (event, datatable, type, indexes) => {
+        datatable
+            .rows(indexes)
+            .nodes()
+            .each((node, index) => {
+                setRowChecked(node);
+            });
     });
-    theDataTable.on("deselect", (event, datatable, type, cell, originalEvent) => {
-        datatable.rows({selected: false}).nodes().each((node, index) => {
-            $(node).find(".chk-row-select").prop("checked", false)
-        });
+    theDataTable.on("deselect", (event, datatable, type, indexes) => {
+        datatable
+            .rows(indexes)
+            .nodes()
+            .each(function(node, index) {
+                setRowUnchecked(node);
+            });
     });
+
+    theDataTable.selectAll = () => {theDataTable.rows().select()};
+    theDataTable.deselectAll = () => {theDataTable.rows().deselect()};
     return theDataTable;
 };
diff --git a/uploader/static/js/debug.js b/uploader/static/js/debug.js
new file mode 100644
index 0000000..eb01209
--- /dev/null
+++ b/uploader/static/js/debug.js
@@ -0,0 +1,40 @@
+/**
+ * The entire purpose of this function is for use to debug values inline
+ * without changing the flow of the code too much.
+ *
+ * This **MUST** be a non-arrow function to allow access to the `arguments`
+ * object.
+ *
+ * This function expects at least one argument.
+ *
+ * If more than one argument is provided, then:
+ * a) the last argument is considered the value, and will be returned
+ * b) all other arguments will be converted to string and output
+ *
+ * If only one argument is provided, it is considered the value, and will be
+ * returned.
+ *
+ * Zero arguments is an error condition.
+ **/
+function __pk__(val) {
+    /* Handle zero arguments */
+    if (arguments.length < 1) {
+        throw new Error("Invalid arguments: Expected at least one argument.");
+    }
+
+    msg = "/********** DEBUG **********/";
+    if (arguments.length > 1) {
+        msg = Array.from(
+            arguments
+        ).slice(
+            0,
+            arguments.length - 1
+        ).map((val) => {
+            return String(val);
+        }).join("; ")
+    }
+
+    value = arguments[arguments.length - 1];
+    console.debug("/********** " + msg + " **********/", value);
+    return value;
+}
diff --git a/uploader/static/js/populations.js b/uploader/static/js/populations.js
index be1231f..111ebb7 100644
--- a/uploader/static/js/populations.js
+++ b/uploader/static/js/populations.js
@@ -13,9 +13,24 @@ $(() => {
                 }
             },
             {
+                searchable: true,
                 data: (apopulation) => {
                     return `${apopulation.FullName} (${apopulation.InbredSetName})`;
                 }
             }
-        ]);
+        ],
+        {
+            select: "single",
+            paging: true,
+            scrollY: 500,
+            deferRender: true,
+            scroller: true,
+            scrollCollapse: true,
+            layout: {
+                topStart: "info",
+                topEnd: "search",
+                bottomStart: "pageLength",
+                bottomEnd: false
+            }
+        });
 });
diff --git a/uploader/static/js/pubmed.js b/uploader/static/js/pubmed.js
index 9afd4c3..f425f49 100644
--- a/uploader/static/js/pubmed.js
+++ b/uploader/static/js/pubmed.js
@@ -22,7 +22,7 @@ var extract_details = (pubmed_id, details) => {
         "journal": details[pubmed_id].fulljournalname,
         "volume": details[pubmed_id].volume,
         "pages": details[pubmed_id].pages,
-        "month": _date.length > 1 ? months[_date[1].toLowerCase()] : "jan",
+        "month": _date.length > 1 ? (months[_date[1].toLowerCase()] || "January") : "January",
         "year": _date[0],
     };
 };
diff --git a/uploader/static/js/species.js b/uploader/static/js/species.js
index 9ea3017..fb0d2d2 100644
--- a/uploader/static/js/species.js
+++ b/uploader/static/js/species.js
@@ -16,5 +16,19 @@ $(() => {
                     return `${aspecies.FullName} (${aspecies.SpeciesName})`;
                 }
             }
-        ]);
+        ],
+        {
+            select: "single",
+            paging: true,
+            scrollY: 500,
+            deferRender: true,
+            scroller: true,
+            scrollCollapse: true,
+            layout: {
+                topStart: "info",
+                topEnd: "search",
+                bottomStart: "pageLength",
+                bottomEnd: false
+            }
+        });
 });
diff --git a/uploader/static/js/upload_samples.js b/uploader/static/js/upload_samples.js
index aed536f..1c25a1d 100644
--- a/uploader/static/js/upload_samples.js
+++ b/uploader/static/js/upload_samples.js
@@ -87,20 +87,20 @@ function display_preview(event) {
     var data_preview_table = document.getElementById("tbl:samples-preview");
     remove_rows(data_preview_table);
 
-    var separator = document.getElementById("select:separator").value;
+    var separator = document.getElementById("select-separator").value;
     if(separator === "other") {
-	separator = document.getElementById("txt:separator").value;
+	separator = document.getElementById("txt-separator").value;
     }
     if(separator == "") {
 	display_error_row(data_preview_table, "Please provide a separator.");
 	return false;
     }
 
-    var delimiter = document.getElementById("txt:delimiter").value;
+    var delimiter = document.getElementById("txt-delimiter").value;
 
-    var firstlineheading = document.getElementById("chk:heading").checked;
+    var firstlineheading = document.getElementById("chk-heading").checked;
 
-    var fileelement = document.getElementById("file:samples");
+    var fileelement = document.getElementById("file-samples");
     var preview_data = JSON.parse(
 	fileelement.getAttribute("data-preview-content") || "[]");
     if(preview_data.length == 0) {
@@ -115,18 +115,18 @@ function display_preview(event) {
 	delimiter));
 }
 
-document.getElementById("chk:heading").addEventListener(
+document.getElementById("chk-heading").addEventListener(
     "change", display_preview);
-document.getElementById("select:separator").addEventListener(
+document.getElementById("select-separator").addEventListener(
     "change", display_preview);
-document.getElementById("txt:separator").addEventListener(
+document.getElementById("txt-separator").addEventListener(
     "keyup", display_preview);
-document.getElementById("txt:delimiter").addEventListener(
+document.getElementById("txt-delimiter").addEventListener(
     "keyup", display_preview);
-document.getElementById("file:samples").addEventListener(
+document.getElementById("file-samples").addEventListener(
     "change", (event) => {
 	read_first_n_lines(event,
-			   document.getElementById("file:samples"),
+			   document.getElementById("file-samples"),
 			   30,
-			   document.getElementById("chk:heading").checked);
+			   document.getElementById("chk-heading").checked);
     });
diff --git a/uploader/static/js/urls.js b/uploader/static/js/urls.js
new file mode 100644
index 0000000..e3fb7c6
--- /dev/null
+++ b/uploader/static/js/urls.js
@@ -0,0 +1,26 @@
+function baseURL() {
+    return new URL(`${window.location.protocol}//${window.location.host}`);
+};
+
+function buildURLFromCurrentURL(pathname, searchParams = new URLSearchParams()) {
+    var uri = baseURL();
+    uri.pathname=pathname;
+    var _search = new URLSearchParams(window.location.search);
+    searchParams.forEach(function(value, key) {
+        _search.set(key, value);
+    });
+    uri.search = _search.toString();
+    return uri
+};
+
+function deleteSearchParams(url, listOfParams = []) {
+    _params = new URLSearchParams(url.search);
+    listOfParams.forEach(function(paramName) {
+        _params.delete(paramName);
+    });
+
+    
+    newUrl = new URL(url.toString());
+    newUrl.search = _params.toString();
+    return newUrl;
+}
diff --git a/uploader/static/js/utils.js b/uploader/static/js/utils.js
index 1b31661..62d3662 100644
--- a/uploader/static/js/utils.js
+++ b/uploader/static/js/utils.js
@@ -28,7 +28,8 @@ var remove_class = (element, classvalue) => {
 
 var add_class = (element, classvalue) => {
     remove_class(element, classvalue);
-    element.attr("class", (element.attr("class") || "") + " " + classvalue);
+    element.attr("class",
+                 ((element.attr("class") || "") + " " + classvalue).trim());
 };
 
 $(".not-implemented").click((event) => {