Selaa lähdekoodia

update plugin files

REJack 4 vuotta sitten
vanhempi
commit
5a2c03c6e9
76 muutettua tiedostoa jossa 11767 lisäystä ja 11592 poistoa
  1. 1 1
      plugins/codemirror/addon/hint/show-hint.js
  2. 9 4
      plugins/codemirror/addon/mode/multiplex.js
  3. 16 0
      plugins/codemirror/addon/mode/multiplex_test.js
  4. 1 2
      plugins/codemirror/addon/mode/simple.js
  5. 3 2
      plugins/codemirror/codemirror.js
  6. 11 5
      plugins/codemirror/keymap/sublime.js
  7. 4 4
      plugins/codemirror/mode/crystal/crystal.js
  8. 2 2
      plugins/codemirror/mode/erlang/erlang.js
  9. 4 3
      plugins/codemirror/mode/javascript/javascript.js
  10. 0 44
      plugins/codemirror/mode/julia/julia.js
  11. 1 0
      plugins/codemirror/mode/lua/lua.js
  12. 1 1
      plugins/codemirror/mode/markdown/markdown.js
  13. 1 1
      plugins/codemirror/mode/python/python.js
  14. 6 1
      plugins/codemirror/mode/sass/sass.js
  15. 87 2
      plugins/codemirror/mode/wast/wast.js
  16. 1 1
      plugins/datatables-buttons/css/buttons.bootstrap4.css
  17. 1 1
      plugins/datatables-buttons/css/buttons.bootstrap4.min.css
  18. 66 63
      plugins/datatables-buttons/js/dataTables.buttons.js
  19. 35 35
      plugins/datatables-buttons/js/dataTables.buttons.min.js
  20. 31 21
      plugins/datatables-select/css/select.bootstrap4.css
  21. 1 1
      plugins/datatables-select/css/select.bootstrap4.min.css
  22. 17 9
      plugins/datatables-select/js/dataTables.select.js
  23. 26 26
      plugins/datatables-select/js/dataTables.select.min.js
  24. 12 8
      plugins/datatables/jquery.dataTables.js
  25. 117 117
      plugins/datatables/jquery.dataTables.min.js
  26. 5366 5366
      plugins/dropzone/dropzone-amd-module.js
  27. 5366 5366
      plugins/dropzone/dropzone.js
  28. 1 1
      plugins/dropzone/min/dropzone-amd-module.min.js
  29. 1 1
      plugins/dropzone/min/dropzone.min.js
  30. 1 1
      plugins/flot/jquery.flot.js
  31. 2 2
      plugins/flot/plugins/jquery.flot.stack.js
  32. 1 1
      plugins/fontawesome-free/css/all.css
  33. 1 1
      plugins/fontawesome-free/css/all.min.css
  34. 1 1
      plugins/fontawesome-free/css/brands.css
  35. 1 1
      plugins/fontawesome-free/css/brands.min.css
  36. 1 1
      plugins/fontawesome-free/css/fontawesome.css
  37. 1 1
      plugins/fontawesome-free/css/fontawesome.min.css
  38. 1 1
      plugins/fontawesome-free/css/regular.css
  39. 1 1
      plugins/fontawesome-free/css/regular.min.css
  40. 1 1
      plugins/fontawesome-free/css/solid.css
  41. 1 1
      plugins/fontawesome-free/css/solid.min.css
  42. 1 1
      plugins/fontawesome-free/css/svg-with-js.css
  43. 1 1
      plugins/fontawesome-free/css/svg-with-js.min.css
  44. 1 1
      plugins/fontawesome-free/css/v4-shims.css
  45. 1 1
      plugins/fontawesome-free/css/v4-shims.min.css
  46. BIN
      plugins/fontawesome-free/webfonts/fa-brands-400.eot
  47. 2 2
      plugins/fontawesome-free/webfonts/fa-brands-400.svg
  48. BIN
      plugins/fontawesome-free/webfonts/fa-brands-400.ttf
  49. BIN
      plugins/fontawesome-free/webfonts/fa-brands-400.woff
  50. BIN
      plugins/fontawesome-free/webfonts/fa-brands-400.woff2
  51. BIN
      plugins/fontawesome-free/webfonts/fa-regular-400.eot
  52. 2 2
      plugins/fontawesome-free/webfonts/fa-regular-400.svg
  53. BIN
      plugins/fontawesome-free/webfonts/fa-regular-400.ttf
  54. BIN
      plugins/fontawesome-free/webfonts/fa-regular-400.woff
  55. BIN
      plugins/fontawesome-free/webfonts/fa-regular-400.woff2
  56. BIN
      plugins/fontawesome-free/webfonts/fa-solid-900.eot
  57. 13 7
      plugins/fontawesome-free/webfonts/fa-solid-900.svg
  58. BIN
      plugins/fontawesome-free/webfonts/fa-solid-900.ttf
  59. BIN
      plugins/fontawesome-free/webfonts/fa-solid-900.woff
  60. BIN
      plugins/fontawesome-free/webfonts/fa-solid-900.woff2
  61. 118 109
      plugins/jquery/jquery.js
  62. 2 2
      plugins/jquery/jquery.min.js
  63. 1 1
      plugins/jquery/jquery.min.map
  64. 106 101
      plugins/jquery/jquery.slim.js
  65. 2 2
      plugins/jquery/jquery.slim.min.js
  66. 1 1
      plugins/jquery/jquery.slim.min.map
  67. 6 5
      plugins/sweetalert2/sweetalert2.all.js
  68. 2 2
      plugins/sweetalert2/sweetalert2.all.min.js
  69. 0 1
      plugins/sweetalert2/sweetalert2.css
  70. 5 4
      plugins/sweetalert2/sweetalert2.js
  71. 1 1
      plugins/sweetalert2/sweetalert2.min.css
  72. 1 1
      plugins/sweetalert2/sweetalert2.min.js
  73. 99 81
      plugins/uplot/uPlot.cjs.js
  74. 99 81
      plugins/uplot/uPlot.esm.js
  75. 100 82
      plugins/uplot/uPlot.iife.js
  76. 2 2
      plugins/uplot/uPlot.iife.min.js

+ 1 - 1
plugins/codemirror/addon/hint/show-hint.js

@@ -360,7 +360,7 @@
     close: function() {
       if (this.completion.widget != this) return;
       this.completion.widget = null;
-      this.hints.parentNode.removeChild(this.hints);
+      if (this.hints.parentNode) this.hints.parentNode.removeChild(this.hints);
       this.completion.cm.removeKeyMap(this.keyMap);
 
       var cm = this.completion.cm;

+ 9 - 4
plugins/codemirror/addon/mode/multiplex.js

@@ -12,7 +12,7 @@
 "use strict";
 
 CodeMirror.multiplexingMode = function(outer /*, others */) {
-  // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects
+  // Others should be {open, close, mode [, delimStyle] [, innerStyle] [, parseDelimiters]} objects
   var others = Array.prototype.slice.call(arguments, 1);
 
   function indexOf(string, pattern, from, returnEnd) {
@@ -29,7 +29,8 @@ CodeMirror.multiplexingMode = function(outer /*, others */) {
       return {
         outer: CodeMirror.startState(outer),
         innerActive: null,
-        inner: null
+        inner: null,
+        startingInner: false
       };
     },
 
@@ -37,7 +38,8 @@ CodeMirror.multiplexingMode = function(outer /*, others */) {
       return {
         outer: CodeMirror.copyState(outer, state.outer),
         innerActive: state.innerActive,
-        inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)
+        inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner),
+        startingInner: state.startingInner
       };
     },
 
@@ -49,6 +51,7 @@ CodeMirror.multiplexingMode = function(outer /*, others */) {
           var found = indexOf(oldContent, other.open, stream.pos);
           if (found == stream.pos) {
             if (!other.parseDelimiters) stream.match(other.open);
+            state.startingInner = !!other.parseDelimiters
             state.innerActive = other;
 
             // Get the outer indent, making sure to handle CodeMirror.Pass
@@ -74,7 +77,8 @@ CodeMirror.multiplexingMode = function(outer /*, others */) {
           state.innerActive = state.inner = null;
           return this.token(stream, state);
         }
-        var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;
+        var found = curInner.close && !state.startingInner ?
+            indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;
         if (found == stream.pos && !curInner.parseDelimiters) {
           stream.match(curInner.close);
           state.innerActive = state.inner = null;
@@ -83,6 +87,7 @@ CodeMirror.multiplexingMode = function(outer /*, others */) {
         if (found > -1) stream.string = oldContent.slice(0, found);
         var innerToken = curInner.mode.token(stream, state.inner);
         if (found > -1) stream.string = oldContent;
+        else if (stream.pos > stream.start) state.startingInner = false
 
         if (found == stream.pos && curInner.parseDelimiters)
           state.innerActive = state.inner = null;

+ 16 - 0
plugins/codemirror/addon/mode/multiplex_test.js

@@ -30,4 +30,20 @@
   MT(
     "stexInsideMarkdown",
     "[strong **Equation:**] [delim&delim-open $][inner&tag \\pi][delim&delim-close $]");
+
+  CodeMirror.defineMode("identical_delim_multiplex", function() {
+    return CodeMirror.multiplexingMode(CodeMirror.getMode({indentUnit: 2}, "javascript"), {
+      open: "#",
+      close: "#",
+      mode: CodeMirror.getMode({}, "markdown"),
+      parseDelimiters: true,
+      innerStyle: "q"
+    });
+  });
+
+  var mode2 = CodeMirror.getMode({}, "identical_delim_multiplex");
+
+  test.mode("identical_delimiters_with_parseDelimiters", mode2, [
+    "[keyword let] [def x] [operator =] [q #foo][q&em *bar*][q #];"
+  ], "multiplexing")
 })();

+ 1 - 2
plugins/codemirror/addon/mode/simple.js

@@ -137,10 +137,9 @@
           var token = rule.token
           if (token && token.apply) token = token(matches)
           if (matches.length > 2 && rule.token && typeof rule.token != "string") {
-            state.pending = [];
             for (var j = 2; j < matches.length; j++)
               if (matches[j])
-                state.pending.push({text: matches[j], token: rule.token[j - 1]});
+                (state.pending || (state.pending = [])).push({text: matches[j], token: rule.token[j - 1]});
             stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));
             return token[0];
           } else if (token && token.join) {

+ 3 - 2
plugins/codemirror/codemirror.js

@@ -6181,7 +6181,7 @@
       var out = [];
       for (var i = 0; i < ranges.length; i++)
         { out[i] = new Range(clipPos(this, ranges[i].anchor),
-                           clipPos(this, ranges[i].head)); }
+                           clipPos(this, ranges[i].head || ranges[i].anchor)); }
       if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }
       setSelection(this, normalizeSelection(this.cm, out, primary), options);
     }),
@@ -8766,6 +8766,7 @@
 
     var input = this, cm = input.cm;
     var div = input.div = display.lineDiv;
+    div.contentEditable = true;
     disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);
 
     function belongsToInput(e) {
@@ -9793,7 +9794,7 @@
 
   addLegacyProps(CodeMirror);
 
-  CodeMirror.version = "5.59.4";
+  CodeMirror.version = "5.60.0";
 
   return CodeMirror;
 

+ 11 - 5
plugins/codemirror/keymap/sublime.js

@@ -339,7 +339,7 @@
   };
 
 
-  function sortLines(cm, caseSensitive) {
+  function sortLines(cm, caseSensitive, direction) {
     if (cm.isReadOnly()) return CodeMirror.Pass
     var ranges = cm.listSelections(), toSort = [], selected;
     for (var i = 0; i < ranges.length; i++) {
@@ -361,12 +361,12 @@
         var start = Pos(from, 0), end = Pos(to);
         var lines = cm.getRange(start, end, false);
         if (caseSensitive)
-          lines.sort();
+          lines.sort(function(a, b) { return a < b ? -direction : a == b ? 0 : direction; });
         else
           lines.sort(function(a, b) {
             var au = a.toUpperCase(), bu = b.toUpperCase();
             if (au != bu) { a = au; b = bu; }
-            return a < b ? -1 : a == b ? 0 : 1;
+            return a < b ? -direction : a == b ? 0 : direction;
           });
         cm.replaceRange(lines, start, end);
         if (selected) ranges.push({anchor: start, head: Pos(to + 1, 0)});
@@ -375,8 +375,10 @@
     });
   }
 
-  cmds.sortLines = function(cm) { sortLines(cm, true); };
-  cmds.sortLinesInsensitive = function(cm) { sortLines(cm, false); };
+  cmds.sortLines = function(cm) { sortLines(cm, true, 1); };
+  cmds.reverseSortLines = function(cm) { sortLines(cm, true, -1); };
+  cmds.sortLinesInsensitive = function(cm) { sortLines(cm, false, 1); };
+  cmds.reverseSortLinesInsensitive = function(cm) { sortLines(cm, false, -1); };
 
   cmds.nextBookmark = function(cm) {
     var marks = cm.state.sublimeBookmarks;
@@ -609,7 +611,9 @@
     "Cmd-J": "joinLines",
     "Shift-Cmd-D": "duplicateLine",
     "F5": "sortLines",
+    "Shift-F5": "reverseSortLines",
     "Cmd-F5": "sortLinesInsensitive",
+    "Shift-Cmd-F5": "reverseSortLinesInsensitive",
     "F2": "nextBookmark",
     "Shift-F2": "prevBookmark",
     "Cmd-F2": "toggleBookmark",
@@ -671,7 +675,9 @@
     "Ctrl-J": "joinLines",
     "Shift-Ctrl-D": "duplicateLine",
     "F9": "sortLines",
+    "Shift-F9": "reverseSortLines",
     "Ctrl-F9": "sortLinesInsensitive",
+    "Shift-Ctrl-F9": "reverseSortLinesInsensitive",
     "F2": "nextBookmark",
     "Shift-F2": "prevBookmark",
     "Ctrl-F2": "toggleBookmark",

+ 4 - 4
plugins/codemirror/mode/crystal/crystal.js

@@ -194,17 +194,17 @@
       // Numbers
       if (stream.eat("0")) {
         if (stream.eat("x")) {
-          stream.match(/^[0-9a-fA-F]+/);
+          stream.match(/^[0-9a-fA-F_]+/);
         } else if (stream.eat("o")) {
-          stream.match(/^[0-7]+/);
+          stream.match(/^[0-7_]+/);
         } else if (stream.eat("b")) {
-          stream.match(/^[01]+/);
+          stream.match(/^[01_]+/);
         }
         return "number";
       }
 
       if (stream.eat(/^\d/)) {
-        stream.match(/^\d*(?:\.\d+)?(?:[eE][+-]?\d+)?/);
+        stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?\d+)?/);
         return "number";
       }
 

+ 2 - 2
plugins/codemirror/mode/erlang/erlang.js

@@ -339,8 +339,8 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
   }
 
   function lookahead(stream) {
-    var m = stream.match(/([\n\s]+|%[^\n]*\n)*(.)/,false);
-    return m ? m.pop() : "";
+    var m = stream.match(/^\s*([^\s%])/, false)
+    return m ? m[1] : "";
   }
 
   function is_member(element,list) {

+ 4 - 3
plugins/codemirror/mode/javascript/javascript.js

@@ -218,7 +218,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
 
   // Parser
 
-  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true};
+  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true,
+                     "regexp": true, "this": true, "import": true, "jsonld-keyword": true};
 
   function JSLexical(indented, column, type, align, prev, info) {
     this.indented = indented;
@@ -441,7 +442,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     if (type == "{") return contCommasep(objprop, "}", null, maybeop);
     if (type == "quasi") return pass(quasi, maybeop);
     if (type == "new") return cont(maybeTarget(noComma));
-    if (type == "import") return cont(expression);
     return cont();
   }
   function maybeexpression(type) {
@@ -605,7 +605,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
     }
   }
   function typeexpr(type, value) {
-    if (value == "keyof" || value == "typeof" || value == "infer") {
+    if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") {
       cx.marked = "keyword"
       return cont(value == "typeof" ? expressionNoComma : typeexpr)
     }
@@ -802,6 +802,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
   function afterImport(type) {
     if (type == "string") return cont();
     if (type == "(") return pass(expression);
+    if (type == ".") return pass(maybeoperatorComma);
     return pass(importSpec, maybeMoreImports, maybeFrom);
   }
   function importSpec(type, value) {

+ 0 - 44
plugins/codemirror/mode/julia/julia.js

@@ -241,10 +241,6 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
         state.isDefinition = false;
         return "def";
       }
-      if (stream.match(/^({[^}]*})*\(/, false)) {
-        state.tokenize = tokenCallOrDef;
-        return state.tokenize(stream, state);
-      }
       state.leavingExpr = true;
       return "variable";
     }
@@ -254,46 +250,6 @@ CodeMirror.defineMode("julia", function(config, parserConf) {
     return "error";
   }
 
-  function tokenCallOrDef(stream, state) {
-    for (;;) {
-      var match = stream.match(/^(\(\s*)/), charsAdvanced = 0;
-      if (match) {
-        if (state.firstParenPos < 0)
-          state.firstParenPos = state.scopes.length;
-        state.scopes.push('(');
-        charsAdvanced += match[1].length;
-      }
-      if (currentScope(state) == '(' && stream.match(')')) {
-        state.scopes.pop();
-        charsAdvanced += 1;
-        if (state.scopes.length <= state.firstParenPos) {
-          var isDefinition = stream.match(/^(\s*where\s+[^\s=]+)*\s*?=(?!=)/, false);
-          stream.backUp(charsAdvanced);
-          state.firstParenPos = -1;
-          state.tokenize = tokenBase;
-          if (isDefinition)
-            return "def";
-          return "builtin";
-        }
-      }
-      // Unfortunately javascript does not support multiline strings, so we have
-      // to undo anything done upto here if a function call or definition splits
-      // over two or more lines.
-      if (stream.match(/^$/g, false)) {
-        stream.backUp(charsAdvanced);
-        while (state.scopes.length > state.firstParenPos)
-          state.scopes.pop();
-        state.firstParenPos = -1;
-        state.tokenize = tokenBase;
-        return "builtin";
-      }
-      if (!stream.match(/^[^()]+/)) {
-        stream.next()
-        return null
-      }
-    }
-  }
-
   function tokenAnnotation(stream, state) {
     stream.match(/.*?(?=[,;{}()=\s]|$)/);
     if (stream.match('{')) {

+ 1 - 0
plugins/codemirror/mode/lua/lua.js

@@ -148,6 +148,7 @@ CodeMirror.defineMode("lua", function(config, parserConfig) {
       return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0));
     },
 
+    electricInput: /^\s*(?:end|until|else|\)|\})$/,
     lineComment: "--",
     blockCommentStart: "--[[",
     blockCommentEnd: "]]"

+ 1 - 1
plugins/codemirror/mode/markdown/markdown.js

@@ -735,7 +735,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
     if (stream.peek() === undefined) { // End of line, set flag to check next line
       state.linkTitle = true;
     } else { // More content on line, check if link title
-      stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\.)+\)))?/, true);
+      stream.match(/^(?:\s+(?:"(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+'|\((?:[^)\\]|\\.)+\)))?/, true);
     }
     state.f = state.inline = inlineNormal;
     return tokenTypes.linkHref + " url";

+ 1 - 1
plugins/codemirror/mode/python/python.js

@@ -282,7 +282,7 @@
     }
 
     function pushBracketScope(stream, state, type) {
-      var align = stream.match(/^([\s\[\{\(]|#.*)*$/, false) ? null : stream.column() + 1
+      var align = stream.match(/^[\s\[\{\(]*(?:#|$)/, false) ? null : stream.column() + 1
       state.scopes.push({offset: state.indent + hangingIndent,
                          type: type,
                          align: align})

+ 6 - 1
plugins/codemirror/mode/sass/sass.js

@@ -445,7 +445,12 @@ CodeMirror.defineMode("sass", function(config) {
 
     indent: function(state) {
       return state.scopes[0].offset;
-    }
+    },
+
+    blockCommentStart: "/*",
+    blockCommentEnd: "*/",
+    lineComment: "//",
+    fold: "indent"
   };
 }, "css");
 

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 87 - 2
plugins/codemirror/mode/wast/wast.js


+ 1 - 1
plugins/datatables-buttons/css/buttons.bootstrap4.css

@@ -182,7 +182,7 @@ div.dt-buttons a.btn.processing:after {
   margin: -8px 0 0 -8px;
   box-sizing: border-box;
   display: block;
-  content: ' ';
+  content: " ";
   border: 2px solid #282828;
   border-radius: 50%;
   border-left-color: transparent;

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/datatables-buttons/css/buttons.bootstrap4.min.css


+ 66 - 63
plugins/datatables-buttons/js/dataTables.buttons.js

@@ -1,5 +1,5 @@
-/*! Buttons for DataTables 1.6.5
- * ©2016-2020 SpryMedia Ltd - datatables.net/license
+/*! Buttons for DataTables 1.7.0
+ * ©2016-2021 SpryMedia Ltd - datatables.net/license
  */
 
 (function( factory ){
@@ -585,7 +585,7 @@ $.extend( Buttons.prototype, {
 		}
 
 		// Make sure that the button is available based on whatever requirements
-		// it has. For example, Flash buttons require Flash
+		// it has. For example, PDF button require pdfmake
 		if ( config.available && ! config.available( dt, config ) ) {
 			return false;
 		}
@@ -1464,6 +1464,41 @@ Buttons.buttonSelector = function ( insts, selector )
 	return ret;
 };
 
+/**
+ * Default function used for formatting output data.
+ * @param {*} str Data to strip
+ */
+Buttons.stripData = function ( str, config ) {
+	if ( typeof str !== 'string' ) {
+		return str;
+	}
+
+	// Always remove script tags
+	str = str.replace( /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '' );
+
+	// Always remove comments
+	str = str.replace( /<!\-\-.*?\-\->/g, '' );
+
+	if ( config.stripHtml ) {
+		str = str.replace( /<[^>]*>/g, '' );
+	}
+
+	if ( config.trim ) {
+		str = str.replace( /^\s+|\s+$/g, '' );
+	}
+
+	if ( config.stripNewlines ) {
+		str = str.replace( /\n/g, ' ' );
+	}
+
+	if ( config.decodeEntities ) {
+		_exportTextarea.innerHTML = str;
+		str = _exportTextarea.value;
+	}
+
+	return str;
+};
+
 
 /**
  * Buttons defaults. For full documentation, please refer to the docs/option
@@ -1485,10 +1520,7 @@ Buttons.defaults = {
 			className: ''
 		},
 		button: {
-			// Flash buttons will not work with `<button>` in IE - it has to be `<a>`
-			tag: 'ActiveXObject' in window ?
-				'a' :
-				'button',
+			tag: 'button',
 			className: 'dt-button',
 			active: 'active',
 			disabled: 'disabled'
@@ -1505,7 +1537,7 @@ Buttons.defaults = {
  * @type {string}
  * @static
  */
-Buttons.version = '1.6.5';
+Buttons.version = '1.7.0';
 
 
 $.extend( _dtButtons, {
@@ -1536,41 +1568,26 @@ $.extend( _dtButtons, {
 		if ( _dtButtons.copyHtml5 ) {
 			return 'copyHtml5';
 		}
-		if ( _dtButtons.copyFlash && _dtButtons.copyFlash.available( dt, conf ) ) {
-			return 'copyFlash';
-		}
 	},
 	csv: function ( dt, conf ) {
-		// Common option that will use the HTML5 or Flash export buttons
 		if ( _dtButtons.csvHtml5 && _dtButtons.csvHtml5.available( dt, conf ) ) {
 			return 'csvHtml5';
 		}
-		if ( _dtButtons.csvFlash && _dtButtons.csvFlash.available( dt, conf ) ) {
-			return 'csvFlash';
-		}
 	},
 	excel: function ( dt, conf ) {
-		// Common option that will use the HTML5 or Flash export buttons
 		if ( _dtButtons.excelHtml5 && _dtButtons.excelHtml5.available( dt, conf ) ) {
 			return 'excelHtml5';
 		}
-		if ( _dtButtons.excelFlash && _dtButtons.excelFlash.available( dt, conf ) ) {
-			return 'excelFlash';
-		}
 	},
 	pdf: function ( dt, conf ) {
-		// Common option that will use the HTML5 or Flash export buttons
 		if ( _dtButtons.pdfHtml5 && _dtButtons.pdfHtml5.available( dt, conf ) ) {
 			return 'pdfHtml5';
 		}
-		if ( _dtButtons.pdfFlash && _dtButtons.pdfFlash.available( dt, conf ) ) {
-			return 'pdfFlash';
-		}
 	},
 	pageLength: function ( dt ) {
 		var lengthMenu = dt.settings()[0].aLengthMenu;
-		var vals = Array.isArray( lengthMenu[0] ) ? lengthMenu[0] : lengthMenu;
-		var lang = Array.isArray( lengthMenu[0] ) ? lengthMenu[1] : lengthMenu;
+		var vals = [];
+		var lang = [];
 		var text = function ( dt ) {
 			return dt.i18n( 'buttons.pageLength', {
 				"-1": 'Show all rows',
@@ -1578,6 +1595,27 @@ $.extend( _dtButtons, {
 			}, dt.page.len() );
 		};
 
+		// Support for DataTables 1.x 2D array
+		if (Array.isArray( lengthMenu[0] )) {
+			vals = lengthMenu[0];
+			lang = lengthMenu[1];
+		}
+		else {
+			for (var i=0 ; i<lengthMenu.length ; i++) {
+				var option = lengthMenu[i];
+
+				// Support for DataTables 2 object in the array
+				if ($.isPlainObject(option)) {
+					vals.push(option.value);
+					lang.push(option.label);
+				}
+				else {
+					vals.push(option);
+					lang.push(option);
+				}
+			}
+		}
+
 		return {
 			extend: 'collection',
 			text: text,
@@ -1980,9 +2018,6 @@ var _message = function ( dt, option, position )
 
 
 
-
-
-
 var _exportTextarea = $('<textarea/>')[0];
 var _exportData = function ( dt, inOpts )
 {
@@ -2000,50 +2035,18 @@ var _exportData = function ( dt, inOpts )
 		trim:           true,
 		format:         {
 			header: function ( d ) {
-				return strip( d );
+				return Buttons.stripData( d, config );
 			},
 			footer: function ( d ) {
-				return strip( d );
+				return Buttons.stripData( d, config );
 			},
 			body: function ( d ) {
-				return strip( d );
+				return Buttons.stripData( d, config );
 			}
 		},
 		customizeData: null
 	}, inOpts );
 
-	var strip = function ( str ) {
-		if ( typeof str !== 'string' ) {
-			return str;
-		}
-
-		// Always remove script tags
-		str = str.replace( /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '' );
-
-		// Always remove comments
-		str = str.replace( /<!\-\-.*?\-\->/g, '' );
-
-		if ( config.stripHtml ) {
-			str = str.replace( /<([^>'"]*('[^']*'|"[^"]*")?)*>/g, '' );
-		}
-
-		if ( config.trim ) {
-			str = str.replace( /^\s+|\s+$/g, '' );
-		}
-
-		if ( config.stripNewlines ) {
-			str = str.replace( /\n/g, ' ' );
-		}
-
-		if ( config.decodeEntities ) {
-			_exportTextarea.innerHTML = str;
-			str = _exportTextarea.value;
-		}
-
-		return str;
-	};
-
-
 	var header = dt.columns( config.columns ).indexes().map( function (idx) {
 		var el = dt.column( idx ).header();
 		return config.format.header( el.innerHTML, idx, el );

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 35 - 35
plugins/datatables-buttons/js/dataTables.buttons.min.js


+ 31 - 21
plugins/datatables-select/css/select.bootstrap4.css

@@ -1,3 +1,4 @@
+@charset "UTF-8";
 table.dataTable tbody > tr.selected,
 table.dataTable tbody > tr > .selected {
   background-color: #0275d8;
@@ -5,12 +6,12 @@ table.dataTable tbody > tr > .selected {
 table.dataTable.stripe tbody > tr.odd.selected,
 table.dataTable.stripe tbody > tr.odd > .selected, table.dataTable.display tbody > tr.odd.selected,
 table.dataTable.display tbody > tr.odd > .selected {
-  background-color: #0172d2;
+  background-color: #0272d3;
 }
 table.dataTable.hover tbody > tr.selected:hover,
 table.dataTable.hover tbody > tr > .selected:hover, table.dataTable.display tbody > tr.selected:hover,
 table.dataTable.display tbody > tr > .selected:hover {
-  background-color: #0170d0;
+  background-color: #0271d0;
 }
 table.dataTable.order-column tbody > tr.selected > .sorting_1,
 table.dataTable.order-column tbody > tr.selected > .sorting_2,
@@ -19,45 +20,45 @@ table.dataTable.order-column tbody > tr > .selected, table.dataTable.display tbo
 table.dataTable.display tbody > tr.selected > .sorting_2,
 table.dataTable.display tbody > tr.selected > .sorting_3,
 table.dataTable.display tbody > tr > .selected {
-  background-color: #0172d3;
+  background-color: #0273d4;
 }
 table.dataTable.display tbody > tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody > tr.odd.selected > .sorting_1 {
-  background-color: #016ecc;
+  background-color: #026fcc;
 }
 table.dataTable.display tbody > tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody > tr.odd.selected > .sorting_2 {
-  background-color: #016fcd;
+  background-color: #0270ce;
 }
 table.dataTable.display tbody > tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody > tr.odd.selected > .sorting_3 {
-  background-color: #0170cf;
+  background-color: #0270d0;
 }
 table.dataTable.display tbody > tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody > tr.even.selected > .sorting_1 {
-  background-color: #0172d3;
+  background-color: #0273d4;
 }
 table.dataTable.display tbody > tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody > tr.even.selected > .sorting_2 {
-  background-color: #0173d5;
+  background-color: #0274d5;
 }
 table.dataTable.display tbody > tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody > tr.even.selected > .sorting_3 {
-  background-color: #0174d7;
+  background-color: #0275d7;
 }
 table.dataTable.display tbody > tr.odd > .selected, table.dataTable.order-column.stripe tbody > tr.odd > .selected {
-  background-color: #016ecc;
+  background-color: #026fcc;
 }
 table.dataTable.display tbody > tr.even > .selected, table.dataTable.order-column.stripe tbody > tr.even > .selected {
-  background-color: #0172d3;
+  background-color: #0273d4;
 }
 table.dataTable.display tbody > tr.selected:hover > .sorting_1, table.dataTable.order-column.hover tbody > tr.selected:hover > .sorting_1 {
-  background-color: #016bc6;
+  background-color: #026bc6;
 }
 table.dataTable.display tbody > tr.selected:hover > .sorting_2, table.dataTable.order-column.hover tbody > tr.selected:hover > .sorting_2 {
-  background-color: #016cc7;
+  background-color: #026cc8;
 }
 table.dataTable.display tbody > tr.selected:hover > .sorting_3, table.dataTable.order-column.hover tbody > tr.selected:hover > .sorting_3 {
-  background-color: #016dca;
+  background-color: #026eca;
 }
 table.dataTable.display tbody > tr:hover > .selected,
 table.dataTable.display tbody > tr > .selected:hover, table.dataTable.order-column.hover tbody > tr:hover > .selected,
 table.dataTable.order-column.hover tbody > tr > .selected:hover {
-  background-color: #016bc6;
+  background-color: #026bc6;
 }
 table.dataTable tbody td.select-checkbox,
 table.dataTable tbody th.select-checkbox {
@@ -76,20 +77,29 @@ table.dataTable tbody th.select-checkbox:after {
 }
 table.dataTable tbody td.select-checkbox:before,
 table.dataTable tbody th.select-checkbox:before {
-  content: ' ';
-  margin-top: -6px;
+  content: " ";
+  margin-top: -2px;
   margin-left: -6px;
   border: 1px solid black;
   border-radius: 3px;
 }
 table.dataTable tr.selected td.select-checkbox:after,
 table.dataTable tr.selected th.select-checkbox:after {
-  content: '\2714';
-  margin-top: -11px;
-  margin-left: -4px;
+  content: "✓";
+  font-size: 20px;
+  margin-top: -19px;
+  margin-left: -6px;
   text-align: center;
   text-shadow: 1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9;
 }
+table.dataTable.compact tbody td.select-checkbox:before,
+table.dataTable.compact tbody th.select-checkbox:before {
+  margin-top: -12px;
+}
+table.dataTable.compact tr.selected td.select-checkbox:after,
+table.dataTable.compact tr.selected th.select-checkbox:after {
+  margin-top: -16px;
+}
 
 div.dataTables_wrapper span.select-info,
 div.dataTables_wrapper span.select-item {
@@ -98,7 +108,7 @@ div.dataTables_wrapper span.select-item {
 
 @media screen and (max-width: 640px) {
   div.dataTables_wrapper span.select-info,
-  div.dataTables_wrapper span.select-item {
+div.dataTables_wrapper span.select-item {
     margin-left: 0;
     display: block;
   }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/datatables-select/css/select.bootstrap4.min.css


+ 17 - 9
plugins/datatables-select/js/dataTables.select.js

@@ -1,16 +1,16 @@
-/*! Select for DataTables 1.3.1
- * 2015-2019 SpryMedia Ltd - datatables.net/license/mit
+/*! Select for DataTables 1.3.2
+ * 2015-2021 SpryMedia Ltd - datatables.net/license/mit
  */
 
 /**
  * @summary     Select for DataTables
  * @description A collection of API methods, events and buttons for DataTables
  *   that provides selection options of the items in a DataTable
- * @version     1.3.1
+ * @version     1.3.2
  * @file        dataTables.select.js
  * @author      SpryMedia Ltd (www.sprymedia.co.uk)
  * @contact     datatables.net/forums
- * @copyright   Copyright 2015-2019 SpryMedia Ltd.
+ * @copyright   Copyright 2015-2021 SpryMedia Ltd.
  *
  * This source file is free software, available under the following license:
  *   MIT license - http://datatables.net/license/mit
@@ -54,7 +54,7 @@ var DataTable = $.fn.dataTable;
 // Version information for debugger
 DataTable.select = {};
 
-DataTable.select.version = '1.3.1';
+DataTable.select.version = '1.3.2';
 
 DataTable.select.init = function ( dt ) {
 	var ctx = dt.settings()[0];
@@ -378,7 +378,7 @@ function enableMouseSelection ( dt )
 			}
 
 			var ctx = dt.settings()[0];
-			var wrapperClass = $.trim(dt.settings()[0].oClasses.sWrapper).replace(/ +/g, '.');
+			var wrapperClass = dt.settings()[0].oClasses.sWrapper.trim().replace(/ +/g, '.');
 
 			// Ignore clicks inside a sub-table
 			if ( $(e.target).closest('div.'+wrapperClass)[0] != dt.table().container() ) {
@@ -560,7 +560,12 @@ function init ( ctx ) {
 
 	// On Ajax reload we want to reselect all rows which are currently selected,
 	// if there is an rowId (i.e. a unique value to identify each row with)
-	api.on( 'preXhr.dt.dtSelect', function () {
+	api.on( 'preXhr.dt.dtSelect', function (e, settings) {
+		if (settings !== api.settings()[0]) {
+			// Not triggered by our DataTable!
+			return;
+		}
+
 		// note that column selection doesn't need to be cached and then
 		// reselected, as they are already selected
 		var rows = api.rows( { selected: true } ).ids( true ).filter( function ( d ) {
@@ -596,6 +601,8 @@ function init ( ctx ) {
 
 	// Clean up and release
 	api.on( 'destroy.dtSelect', function () {
+		api.rows({selected: true}).deselect();
+
 		disableMouseSelection( api );
 		api.off( '.dtSelect' );
 	} );
@@ -837,7 +844,7 @@ apiRegister( 'select.toggleable()', function ( flag ) {
 } );
 
 apiRegister( 'select.info()', function ( flag ) {
-	if ( info === undefined ) {
+	if ( flag === undefined ) {
 		return this.context[0]._select.info;
 	}
 
@@ -975,7 +982,7 @@ apiRegisterPlural( 'cells().select()', 'cell().select()', function ( select ) {
 	} );
 
 	this.iterator( 'table', function ( ctx, i ) {
-		eventTrigger( api, 'select', [ 'cell', api[i] ], true );
+		eventTrigger( api, 'select', [ 'cell', api.cells(api[i]).indexes().toArray() ], true );
 	} );
 
 	return this;
@@ -987,6 +994,7 @@ apiRegisterPlural( 'rows().deselect()', 'row().deselect()', function () {
 
 	this.iterator( 'row', function ( ctx, idx ) {
 		ctx.aoData[ idx ]._select_selected = false;
+		ctx._select_lastCell = null;
 		$( ctx.aoData[ idx ].nTr ).removeClass( ctx._select.className );
 	} );
 

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 26 - 26
plugins/datatables-select/js/dataTables.select.min.js


+ 12 - 8
plugins/datatables/jquery.dataTables.js

@@ -1,15 +1,15 @@
-/*! DataTables 1.10.23
- * ©2008-2020 SpryMedia Ltd - datatables.net/license
+/*! DataTables 1.10.24
+ * ©2008-2021 SpryMedia Ltd - datatables.net/license
  */
 
 /**
  * @summary     DataTables
  * @description Paginate, search and order HTML tables
- * @version     1.10.23
+ * @version     1.10.24
  * @file        jquery.dataTables.js
  * @author      SpryMedia Ltd
  * @contact     www.datatables.net
- * @copyright   Copyright 2008-2020 SpryMedia Ltd.
+ * @copyright   Copyright 2008-2021 SpryMedia Ltd.
  *
  * This source file is free software, available under the following license:
  *   MIT license - http://datatables.net/license
@@ -1088,6 +1088,8 @@
 						_fnLanguageCompat( json );
 						_fnCamelToHungarian( defaults.oLanguage, json );
 						$.extend( true, oLanguage, json );
+			
+						_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);
 						_fnInitialise( oSettings );
 					},
 					error: function () {
@@ -1097,6 +1099,9 @@
 				} );
 				bInitHandedOff = true;
 			}
+			else {
+				_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);
+			}
 			
 			/*
 			 * Stripes
@@ -9530,7 +9535,7 @@
 	 *  @type string
 	 *  @default Version number
 	 */
-	DataTable.version = "1.10.23";
+	DataTable.version = "1.10.24";
 
 	/**
 	 * Private data store, containing all of the settings objects that are
@@ -14482,8 +14487,8 @@
 		"sSortAsc": "sorting_asc",
 		"sSortDesc": "sorting_desc",
 		"sSortable": "sorting", /* Sortable in both directions */
-		"sSortableAsc": "sorting_asc_disabled",
-		"sSortableDesc": "sorting_desc_disabled",
+		"sSortableAsc": "sorting_desc_disabled",
+		"sSortableDesc": "sorting_asc_disabled",
 		"sSortableNone": "sorting_disabled",
 		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
 	
@@ -14924,7 +14929,6 @@
 	
 					cell
 						.removeClass(
-							column.sSortingClass +' '+
 							classes.sSortAsc +' '+
 							classes.sSortDesc
 						)

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 117 - 117
plugins/datatables/jquery.dataTables.min.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 5366 - 5366
plugins/dropzone/dropzone-amd-module.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 5366 - 5366
plugins/dropzone/dropzone.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/dropzone/min/dropzone-amd-module.min.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/dropzone/min/dropzone.min.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/flot/jquery.flot.js


+ 2 - 2
plugins/flot/plugins/jquery.flot.stack.js

@@ -63,8 +63,8 @@ charts or filled areas).
             }
 
             datapoints.format.push({
-                x: false,
-                y: true,
+                x: s.bars.horizontal,
+                y: !s.bars.horizontal,
                 number: true,
                 required: false,
                 computeRange: s.yaxis.options.autoScale !== 'none',

+ 1 - 1
plugins/fontawesome-free/css/all.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 .fa,

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/fontawesome-free/css/all.min.css


+ 1 - 1
plugins/fontawesome-free/css/brands.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 @font-face {

+ 1 - 1
plugins/fontawesome-free/css/brands.min.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands";font-weight:400}

+ 1 - 1
plugins/fontawesome-free/css/fontawesome.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 .fa,

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/fontawesome-free/css/fontawesome.min.css


+ 1 - 1
plugins/fontawesome-free/css/regular.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 @font-face {

+ 1 - 1
plugins/fontawesome-free/css/regular.min.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400}

+ 1 - 1
plugins/fontawesome-free/css/solid.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 @font-face {

+ 1 - 1
plugins/fontawesome-free/css/solid.min.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900}

+ 1 - 1
plugins/fontawesome-free/css/svg-with-js.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 svg:not(:root).svg-inline--fa {

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/fontawesome-free/css/svg-with-js.min.css


+ 1 - 1
plugins/fontawesome-free/css/v4-shims.css

@@ -1,5 +1,5 @@
 /*!
- * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com
  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
  */
 .fa.fa-glass:before {

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/fontawesome-free/css/v4-shims.min.css


BIN
plugins/fontawesome-free/webfonts/fa-brands-400.eot


+ 2 - 2
plugins/fontawesome-free/webfonts/fa-brands-400.svg

@@ -2,11 +2,11 @@
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
 <metadata>
-Created by FontForge 20200314 at Wed Jan 13 11:57:55 2021
+Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021
  By Robert Madole
 Copyright (c) Font Awesome
 </metadata>
-<!-- Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
+<!-- Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
 <font id="FontAwesome5Brands-Regular" horiz-adv-x="448" >
   <font-face 
     font-family="Font Awesome 5 Brands Regular"

BIN
plugins/fontawesome-free/webfonts/fa-brands-400.ttf


BIN
plugins/fontawesome-free/webfonts/fa-brands-400.woff


BIN
plugins/fontawesome-free/webfonts/fa-brands-400.woff2


BIN
plugins/fontawesome-free/webfonts/fa-regular-400.eot


+ 2 - 2
plugins/fontawesome-free/webfonts/fa-regular-400.svg

@@ -2,11 +2,11 @@
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
 <metadata>
-Created by FontForge 20200314 at Wed Jan 13 11:57:54 2021
+Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021
  By Robert Madole
 Copyright (c) Font Awesome
 </metadata>
-<!-- Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
+<!-- Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
 <font id="FontAwesome5Free-Regular" horiz-adv-x="512" >
   <font-face 
     font-family="Font Awesome 5 Free Regular"

BIN
plugins/fontawesome-free/webfonts/fa-regular-400.ttf


BIN
plugins/fontawesome-free/webfonts/fa-regular-400.woff


BIN
plugins/fontawesome-free/webfonts/fa-regular-400.woff2


BIN
plugins/fontawesome-free/webfonts/fa-solid-900.eot


+ 13 - 7
plugins/fontawesome-free/webfonts/fa-solid-900.svg

@@ -2,11 +2,11 @@
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
 <metadata>
-Created by FontForge 20200314 at Wed Jan 13 11:57:55 2021
+Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021
  By Robert Madole
 Copyright (c) Font Awesome
 </metadata>
-<!-- Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
+<!-- Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><defs>
 <font id="FontAwesome5Free-Solid" horiz-adv-x="512" >
   <font-face 
     font-family="Font Awesome 5 Free Solid"
@@ -3720,11 +3720,17 @@ c0 53.0195 42.9805 96 96 96c53.0205 0 96 -42.9805 96 -96c0 -11.2803 -2.30957 -21
     <glyph glyph-name="wine-glass-alt" unicode="&#xf5ce;" horiz-adv-x="288" 
 d="M216 -16c22.0898 0 40 -17.9102 40 -40c0 -4.41992 -3.58008 -8 -8 -8h-208c-4.41992 0 -8 3.58008 -8 8c0 22.0898 17.9102 40 40 40h40v117.18c-68.4697 15.8906 -118.05 79.9102 -111.4 154.16l15.96 178.11c0.730469 8.24023 7.55078 14.5498 15.7002 14.5498h223.48
 c8.16016 0 14.9697 -6.30957 15.71 -14.5498l15.9502 -178.101c6.64941 -74.25 -42.9307 -138.27 -111.4 -154.159v-117.19h40zM61.75 400l-7.16992 -80h178.84l-7.16992 80h-164.5z" />
-    <glyph glyph-name="air-freshener" unicode="&#xf5d0;" horiz-adv-x="384" 
-d="M378.94 126.59c11.75 -12.1494 1.71973 -30.5898 -16.6406 -30.5898h-138.3v-32h112c8.83984 0 16 -7.16016 16 -16v-96c0 -8.83984 -7.16016 -16 -16 -16h-288c-8.83984 0 -16 7.16016 -16 16v96c0 8.83984 7.16016 16 16 16h112v32h-138.3
-c-18.3604 0 -28.3906 18.4404 -16.6406 30.5898l94.2402 97.4102h-49.2197c-15.2998 0 -23.6602 16.5996 -13.8604 27.5303l113.33 126.51c-3.42969 6.61035 -5.5498 14 -5.5498 21.96c0 26.5098 21.4902 48 48 48s48 -21.4902 48 -48
-c0 -7.95996 -2.12012 -15.3496 -5.5498 -21.96l113.33 -126.51c9.7998 -10.9307 1.43945 -27.5303 -13.8604 -27.5303h-49.2197zM192 416.02c-8.84961 0 -16.0195 -7.16992 -16.0195 -16.0195c0 -8.83984 7.16992 -16.0195 16.0195 -16.0195
-s16.0195 7.17969 16.0195 16.0195c0 8.84961 -7.16992 16.0195 -16.0195 16.0195zM304 16h-224v-32h224v32z" />
+    <glyph glyph-name="air-freshener" unicode="&#xf5d0;" 
+d="M224 288c53 0 96 -43 96 -96v-224c0 -17.625 -14.375 -32 -32 -32h-256c-17.625 0 -32 14.375 -32 32v224c0 53 43 96 96 96h128zM160 32c44.125 0 80 35.875 80 80s-35.875 80 -80 80s-80 -35.875 -80 -80s35.875 -80 80 -80zM224 416v-96h-128v96
+c0 17.625 14.375 32 32 32h64c17.625 0 32 -14.375 32 -32zM381.781 396.422l-29.7812 -12.4219l-12.4385 -29.7812c-0.592773 -1.21875 -2.18652 -2.21875 -3.56152 -2.21875s-2.96875 1 -3.59375 2.21875l-12.4062 29.7812l-29.7812 12.4219
+c-1.21875 0.609375 -2.21875 2.21875 -2.21875 3.57812c0 1.375 1 2.96875 2.21875 3.57812l29.7812 12.4219l12.4062 29.7812c0.625 1.21875 2.21875 2.21875 3.59375 2.21875s2.96875 -1 3.56152 -2.21875l12.4385 -29.7812l29.7812 -12.4219
+c1.21875 -0.609375 2.21875 -2.20312 2.21875 -3.57812c0 -1.35938 -1 -2.96875 -2.21875 -3.57812zM448 384l-29.7812 12.4219c-1.21875 0.609375 -2.21875 2.21875 -2.21875 3.57812c0 1.375 1 2.96875 2.21875 3.57812l29.7812 12.4219l12.4062 29.7812
+c0.625 1.21875 2.21875 2.21875 3.59375 2.21875s2.96875 -1 3.56152 -2.21875l12.4385 -29.7812l29.7812 -12.4219c1.21875 -0.609375 2.21875 -2.20312 2.21875 -3.57812c0 -1.35938 -1 -2.96875 -2.21875 -3.57812l-29.7812 -12.4219l-12.4385 -29.7812
+c-0.592773 -1.21875 -2.18652 -2.21875 -3.56152 -2.21875s-2.96875 1 -3.59375 2.21875zM480 224l29.7812 -12.4219c1.21875 -0.609375 2.21875 -2.20312 2.21875 -3.57812c0 -1.35938 -1 -2.96875 -2.21875 -3.57812l-29.7812 -12.4219l-12.4385 -29.7812
+c-0.592773 -1.21875 -2.18652 -2.21875 -3.56152 -2.21875s-2.96875 1 -3.59375 2.21875l-12.4062 29.7812l-29.7812 12.4219c-1.21875 0.609375 -2.21875 2.21875 -2.21875 3.57812c0 1.375 1 2.96875 2.21875 3.57812l29.7812 12.4219l12.4062 29.7812
+c0.625 1.21875 2.21875 2.21875 3.59375 2.21875s2.96875 -1 3.56152 -2.21875zM445.781 300.422l-29.7812 -12.4219l-12.4385 -29.7812c-0.592773 -1.21875 -2.18652 -2.21875 -3.56152 -2.21875s-2.96875 1 -3.59375 2.21875l-12.4062 29.7812l-29.7812 12.4219
+c-1.21875 0.609375 -2.21875 2.21875 -2.21875 3.57812c0 1.375 1 2.96875 2.21875 3.57812l29.7812 12.4219l12.4062 29.7812c0.625 1.21875 2.21875 2.21875 3.59375 2.21875s2.96875 -1 3.56152 -2.21875l12.4385 -29.7812l29.7812 -12.4219
+c1.21875 -0.609375 2.21875 -2.20312 2.21875 -3.57812c0 -1.35938 -1 -2.96875 -2.21875 -3.57812z" />
     <glyph glyph-name="apple-alt" unicode="&#xf5d1;" horiz-adv-x="448" 
 d="M350.85 319c25.9707 -4.66992 47.2705 -18.6699 63.9199 -42c14.6504 -20.6699 24.6406 -46.6699 29.9609 -78c4.66992 -28.6699 4.31934 -57.3301 -1 -86c-7.99023 -47.3301 -23.9707 -87 -47.9404 -119c-28.6396 -38.6699 -64.5898 -58 -107.87 -58
 c-10.6602 0 -22.2998 3.33008 -34.96 10c-8.66016 5.33008 -18.3096 8 -28.9697 8s-20.2998 -2.66992 -28.9707 -8c-12.6592 -6.66992 -24.2998 -10 -34.96 -10c-43.2793 0 -79.2295 19.3301 -107.869 58c-23.9707 32 -39.9502 71.6699 -47.9404 119

BIN
plugins/fontawesome-free/webfonts/fa-solid-900.ttf


BIN
plugins/fontawesome-free/webfonts/fa-solid-900.woff


BIN
plugins/fontawesome-free/webfonts/fa-solid-900.woff2


+ 118 - 109
plugins/jquery/jquery.js

@@ -1,15 +1,15 @@
 /*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
  * https://jquery.com/
  *
  * Includes Sizzle.js
  * https://sizzlejs.com/
  *
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
  */
 ( function( global, factory ) {
 
@@ -76,12 +76,16 @@ var support = {};
 
 var isFunction = function isFunction( obj ) {
 
-      // Support: Chrome <=57, Firefox <=52
-      // In some browsers, typeof returns "function" for HTML <object> elements
-      // (i.e., `typeof document.createElement( "object" ) === "function"`).
-      // We don't want to classify *any* DOM node as a function.
-      return typeof obj === "function" && typeof obj.nodeType !== "number";
-  };
+		// Support: Chrome <=57, Firefox <=52
+		// In some browsers, typeof returns "function" for HTML <object> elements
+		// (i.e., `typeof document.createElement( "object" ) === "function"`).
+		// We don't want to classify *any* DOM node as a function.
+		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+		// Plus for old WebKit, typeof returns "function" for HTML collections
+		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+			typeof obj.item !== "function";
+	};
 
 
 var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
 
 
 var
-	version = "3.5.1",
+	version = "3.6.0",
 
 	// Define a local copy of jQuery
 	jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
 			if ( isArrayLike( Object( arr ) ) ) {
 				jQuery.merge( ret,
 					typeof arr === "string" ?
-					[ arr ] : arr
+						[ arr ] : arr
 				);
 			} else {
 				push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
 
 // Populate the class2type map
 jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+	function( _i, name ) {
+		class2type[ "[object " + name + "]" ] = name.toLowerCase();
+	} );
 
 function isArrayLike( obj ) {
 
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
 }
 var Sizzle =
 /*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
  * https://sizzlejs.com/
  *
  * Copyright JS Foundation and other contributors
  * Released under the MIT license
  * https://js.foundation/
  *
- * Date: 2020-03-14
+ * Date: 2021-02-16
  */
 ( function( window ) {
 var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
  * @returns {Boolean} True iff elem is a non-HTML XML node
  */
 isXML = Sizzle.isXML = function( elem ) {
-	var namespace = elem.namespaceURI,
-		docElem = ( elem.ownerDocument || elem ).documentElement;
+	var namespace = elem && elem.namespaceURI,
+		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
 
 	// Support: IE <=8
 	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
 
 function nodeName( elem, name ) {
 
-  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
 
-};
+}
 var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
 
 
@@ -3997,8 +4001,8 @@ jQuery.extend( {
 			resolveContexts = Array( i ),
 			resolveValues = slice.call( arguments ),
 
-			// the master Deferred
-			master = jQuery.Deferred(),
+			// the primary Deferred
+			primary = jQuery.Deferred(),
 
 			// subordinate callback factory
 			updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
 					resolveContexts[ i ] = this;
 					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
 					if ( !( --remaining ) ) {
-						master.resolveWith( resolveContexts, resolveValues );
+						primary.resolveWith( resolveContexts, resolveValues );
 					}
 				};
 			};
 
 		// Single- and empty arguments are adopted like Promise.resolve
 		if ( remaining <= 1 ) {
-			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
 				!remaining );
 
 			// Use .then() to unwrap secondary thenables (cf. gh-3000)
-			if ( master.state() === "pending" ||
+			if ( primary.state() === "pending" ||
 				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
 
-				return master.then();
+				return primary.then();
 			}
 		}
 
 		// Multiple arguments are aggregated like Promise.all array elements
 		while ( i-- ) {
-			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
 		}
 
-		return master.promise();
+		return primary.promise();
 	}
 } );
 
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
 			for ( ; i < len; i++ ) {
 				fn(
 					elems[ i ], key, raw ?
-					value :
-					value.call( elems[ i ], i, fn( elems[ i ], key ) )
+						value :
+						value.call( elems[ i ], i, fn( elems[ i ], key ) )
 				);
 			}
 		}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
 }
 
 
-var
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
 
 function returnTrue() {
 	return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
 			event = jQuery.event.fix( nativeEvent ),
 
 			handlers = (
-					dataPriv.get( this, "events" ) || Object.create( null )
-				)[ event.type ] || [],
+				dataPriv.get( this, "events" ) || Object.create( null )
+			)[ event.type ] || [],
 			special = jQuery.event.special[ event.type ] || {};
 
 		// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
 			get: isFunction( hook ) ?
 				function() {
 					if ( this.originalEvent ) {
-							return hook( this.originalEvent );
+						return hook( this.originalEvent );
 					}
 				} :
 				function() {
 					if ( this.originalEvent ) {
-							return this.originalEvent[ name ];
+						return this.originalEvent[ name ];
 					}
 				},
 
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
 						// Cancel the outer synthetic event
 						event.stopImmediatePropagation();
 						event.preventDefault();
-						return result.value;
+
+						// Support: Chrome 86+
+						// In Chrome, if an element having a focusout handler is blurred by
+						// clicking outside of it, it invokes the handler synchronously. If
+						// that handler calls `.remove()` on the element, the data is cleared,
+						// leaving `result` undefined. We need to guard against this.
+						return result && result.value;
 					}
 
 				// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
 	targetTouches: true,
 	toElement: true,
 	touches: true,
-
-	which: function( event ) {
-		var button = event.button;
-
-		// Add which for key events
-		if ( event.which == null && rkeyEvent.test( event.type ) ) {
-			return event.charCode != null ? event.charCode : event.keyCode;
-		}
-
-		// Add which for click: 1 === left; 2 === middle; 3 === right
-		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
-			if ( button & 1 ) {
-				return 1;
-			}
-
-			if ( button & 2 ) {
-				return 3;
-			}
-
-			if ( button & 4 ) {
-				return 2;
-			}
-
-			return 0;
-		}
-
-		return event.which;
-	}
+	which: true
 }, jQuery.event.addProp );
 
 jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
 			return true;
 		},
 
+		// Suppress native focus or blur as it's already being fired
+		// in leverageNative.
+		_default: function() {
+			return true;
+		},
+
 		delegateType: delegateType
 	};
 } );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
 		// set in CSS while `offset*` properties report correct values.
 		// Behavior in IE 9 is more subtle than in newer versions & it passes
 		// some versions of this test; make sure not to make it pass there!
+		//
+		// Support: Firefox 70+
+		// Only Firefox includes border widths
+		// in computed dimensions. (gh-4529)
 		reliableTrDimensions: function() {
 			var table, tr, trChild, trStyle;
 			if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
 				tr = document.createElement( "tr" );
 				trChild = document.createElement( "div" );
 
-				table.style.cssText = "position:absolute;left:-11111px";
+				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+				tr.style.cssText = "border:1px solid";
+
+				// Support: Chrome 86+
+				// Height set through cssText does not get applied.
+				// Computed height then comes back as 0.
 				tr.style.height = "1px";
 				trChild.style.height = "9px";
 
+				// Support: Android 8 Chrome 86+
+				// In our bodyBackground.html iframe,
+				// display for all div elements is set to "inline",
+				// which causes a problem only in Android 8 Chrome 86.
+				// Ensuring the div is display: block
+				// gets around this issue.
+				trChild.style.display = "block";
+
 				documentElement
 					.appendChild( table )
 					.appendChild( tr )
 					.appendChild( trChild );
 
 				trStyle = window.getComputedStyle( tr );
-				reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+					parseInt( trStyle.borderTopWidth, 10 ) +
+					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
 
 				documentElement.removeChild( table );
 			}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
 					// Running getBoundingClientRect on a disconnected node
 					// in IE throws an error.
 					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
-						swap( elem, cssShow, function() {
-							return getWidthOrHeight( elem, dimension, extra );
-						} ) :
-						getWidthOrHeight( elem, dimension, extra );
+					swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, dimension, extra );
+					} ) :
+					getWidthOrHeight( elem, dimension, extra );
 			}
 		},
 
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
 					swap( elem, { marginLeft: 0 }, function() {
 						return elem.getBoundingClientRect().left;
 					} )
-				) + "px";
+			) + "px";
 		}
 	}
 );
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
 			if ( jQuery.fx.step[ tween.prop ] ) {
 				jQuery.fx.step[ tween.prop ]( tween );
 			} else if ( tween.elem.nodeType === 1 && (
-					jQuery.cssHooks[ tween.prop ] ||
+				jQuery.cssHooks[ tween.prop ] ||
 					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
 				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
 			} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
 
 			anim.done( function() {
 
-			/* eslint-enable no-loop-func */
+				/* eslint-enable no-loop-func */
 
 				// The final step of a "hide" animation is actually hiding the element
 				if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
 			tweens: [],
 			createTween: function( prop, end ) {
 				var tween = jQuery.Tween( elem, animation.opts, prop, end,
-						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+					animation.opts.specialEasing[ prop ] || animation.opts.easing );
 				animation.tweens.push( tween );
 				return tween;
 			},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
 					anim.stop( true );
 				}
 			};
-			doAnimation.finish = doAnimation;
+
+		doAnimation.finish = doAnimation;
 
 		return empty || optall.queue === false ?
 			this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
 				if ( this.setAttribute ) {
 					this.setAttribute( "class",
 						className || value === false ?
-						"" :
-						dataPriv.get( this, "__className__" ) || ""
+							"" :
+							dataPriv.get( this, "__className__" ) || ""
 					);
 				}
 			}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
 		while ( ( elem = this[ i++ ] ) ) {
 			if ( elem.nodeType === 1 &&
 				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
-					return true;
+				return true;
 			}
 		}
 
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
 				special.bindType || type;
 
 			// jQuery handler
-			handle = (
-					dataPriv.get( cur, "events" ) || Object.create( null )
-				)[ event.type ] &&
+			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
 				dataPriv.get( cur, "handle" );
 			if ( handle ) {
 				handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
 
 // Cross-browser xml parsing
 jQuery.parseXML = function( data ) {
-	var xml;
+	var xml, parserErrorElem;
 	if ( !data || typeof data !== "string" ) {
 		return null;
 	}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
 	// IE throws on parseFromString with invalid input.
 	try {
 		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
-	} catch ( e ) {
-		xml = undefined;
-	}
+	} catch ( e ) {}
 
-	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
-		jQuery.error( "Invalid XML: " + data );
+	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+	if ( !xml || parserErrorElem ) {
+		jQuery.error( "Invalid XML: " + (
+			parserErrorElem ?
+				jQuery.map( parserErrorElem.childNodes, function( el ) {
+					return el.textContent;
+				} ).join( "\n" ) :
+				data
+		) );
 	}
 	return xml;
 };
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
 			// Can add propHook for "elements" to filter or add form elements
 			var elements = jQuery.prop( this, "elements" );
 			return elements ? jQuery.makeArray( elements ) : this;
-		} )
-		.filter( function() {
+		} ).filter( function() {
 			var type = this.type;
 
 			// Use .is( ":disabled" ) so that fieldset[disabled] works
 			return this.name && !jQuery( this ).is( ":disabled" ) &&
 				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
 				( this.checked || !rcheckableType.test( type ) );
-		} )
-		.map( function( _i, elem ) {
+		} ).map( function( _i, elem ) {
 			var val = jQuery( this ).val();
 
 			if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
 
 	// Anchor tag for parsing the document origin
 	originAnchor = document.createElement( "a" );
-	originAnchor.href = location.href;
+
+originAnchor.href = location.href;
 
 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
 function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
 			// Context for global events is callbackContext if it is a DOM node or jQuery collection
 			globalEventContext = s.context &&
 				( callbackContext.nodeType || callbackContext.jquery ) ?
-					jQuery( callbackContext ) :
-					jQuery.event,
+				jQuery( callbackContext ) :
+				jQuery.event,
 
 			// Deferreds
 			deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
 				response = ajaxHandleResponses( s, jqXHR, responses );
 			}
 
-			// Use a noop converter for missing script
-			if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+			// Use a noop converter for missing script but not if jsonp
+			if ( !isSuccess &&
+				jQuery.inArray( "script", s.dataTypes ) > -1 &&
+				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
 				s.converters[ "text script" ] = function() {};
 			}
 
@@ -10466,12 +10476,6 @@ jQuery.offset = {
 			options.using.call( elem, props );
 
 		} else {
-			if ( typeof props.top === "number" ) {
-				props.top += "px";
-			}
-			if ( typeof props.left === "number" ) {
-				props.left += "px";
-			}
 			curElem.css( props );
 		}
 	}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
 
 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
-		function( defaultExtra, funcName ) {
+	jQuery.each( {
+		padding: "inner" + name,
+		content: type,
+		"": "outer" + name
+	}, function( defaultExtra, funcName ) {
 
 		// Margin is only for outerHeight, outerWidth
 		jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
 	}
 } );
 
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+	( "blur focus focusin focusout resize scroll click dblclick " +
 	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
 	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
 	function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
 				this.on( name, null, data, fn ) :
 				this.trigger( name );
 		};
-	} );
+	}
+);
 
 
 

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 2 - 2
plugins/jquery/jquery.min.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/jquery/jquery.min.map


+ 106 - 101
plugins/jquery/jquery.slim.js

@@ -1,15 +1,15 @@
 /*!
- * jQuery JavaScript Library v3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector
+ * jQuery JavaScript Library v3.6.0 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector
  * https://jquery.com/
  *
  * Includes Sizzle.js
  * https://sizzlejs.com/
  *
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
  */
 ( function( global, factory ) {
 
@@ -76,12 +76,16 @@ var support = {};
 
 var isFunction = function isFunction( obj ) {
 
-      // Support: Chrome <=57, Firefox <=52
-      // In some browsers, typeof returns "function" for HTML <object> elements
-      // (i.e., `typeof document.createElement( "object" ) === "function"`).
-      // We don't want to classify *any* DOM node as a function.
-      return typeof obj === "function" && typeof obj.nodeType !== "number";
-  };
+		// Support: Chrome <=57, Firefox <=52
+		// In some browsers, typeof returns "function" for HTML <object> elements
+		// (i.e., `typeof document.createElement( "object" ) === "function"`).
+		// We don't want to classify *any* DOM node as a function.
+		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+		// Plus for old WebKit, typeof returns "function" for HTML collections
+		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+			typeof obj.item !== "function";
+	};
 
 
 var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
 
 
 var
-	version = "3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",
+	version = "3.6.0 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",
 
 	// Define a local copy of jQuery
 	jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
 			if ( isArrayLike( Object( arr ) ) ) {
 				jQuery.merge( ret,
 					typeof arr === "string" ?
-					[ arr ] : arr
+						[ arr ] : arr
 				);
 			} else {
 				push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
 
 // Populate the class2type map
 jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+	function( _i, name ) {
+		class2type[ "[object " + name + "]" ] = name.toLowerCase();
+	} );
 
 function isArrayLike( obj ) {
 
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
 }
 var Sizzle =
 /*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
  * https://sizzlejs.com/
  *
  * Copyright JS Foundation and other contributors
  * Released under the MIT license
  * https://js.foundation/
  *
- * Date: 2020-03-14
+ * Date: 2021-02-16
  */
 ( function( window ) {
 var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
  * @returns {Boolean} True iff elem is a non-HTML XML node
  */
 isXML = Sizzle.isXML = function( elem ) {
-	var namespace = elem.namespaceURI,
-		docElem = ( elem.ownerDocument || elem ).documentElement;
+	var namespace = elem && elem.namespaceURI,
+		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
 
 	// Support: IE <=8
 	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
 
 function nodeName( elem, name ) {
 
-  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
 
-};
+}
 var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
 
 
@@ -3997,8 +4001,8 @@ jQuery.extend( {
 			resolveContexts = Array( i ),
 			resolveValues = slice.call( arguments ),
 
-			// the master Deferred
-			master = jQuery.Deferred(),
+			// the primary Deferred
+			primary = jQuery.Deferred(),
 
 			// subordinate callback factory
 			updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
 					resolveContexts[ i ] = this;
 					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
 					if ( !( --remaining ) ) {
-						master.resolveWith( resolveContexts, resolveValues );
+						primary.resolveWith( resolveContexts, resolveValues );
 					}
 				};
 			};
 
 		// Single- and empty arguments are adopted like Promise.resolve
 		if ( remaining <= 1 ) {
-			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
 				!remaining );
 
 			// Use .then() to unwrap secondary thenables (cf. gh-3000)
-			if ( master.state() === "pending" ||
+			if ( primary.state() === "pending" ||
 				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
 
-				return master.then();
+				return primary.then();
 			}
 		}
 
 		// Multiple arguments are aggregated like Promise.all array elements
 		while ( i-- ) {
-			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
 		}
 
-		return master.promise();
+		return primary.promise();
 	}
 } );
 
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
 			for ( ; i < len; i++ ) {
 				fn(
 					elems[ i ], key, raw ?
-					value :
-					value.call( elems[ i ], i, fn( elems[ i ], key ) )
+						value :
+						value.call( elems[ i ], i, fn( elems[ i ], key ) )
 				);
 			}
 		}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
 }
 
 
-var
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
 
 function returnTrue() {
 	return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
 			event = jQuery.event.fix( nativeEvent ),
 
 			handlers = (
-					dataPriv.get( this, "events" ) || Object.create( null )
-				)[ event.type ] || [],
+				dataPriv.get( this, "events" ) || Object.create( null )
+			)[ event.type ] || [],
 			special = jQuery.event.special[ event.type ] || {};
 
 		// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
 			get: isFunction( hook ) ?
 				function() {
 					if ( this.originalEvent ) {
-							return hook( this.originalEvent );
+						return hook( this.originalEvent );
 					}
 				} :
 				function() {
 					if ( this.originalEvent ) {
-							return this.originalEvent[ name ];
+						return this.originalEvent[ name ];
 					}
 				},
 
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
 						// Cancel the outer synthetic event
 						event.stopImmediatePropagation();
 						event.preventDefault();
-						return result.value;
+
+						// Support: Chrome 86+
+						// In Chrome, if an element having a focusout handler is blurred by
+						// clicking outside of it, it invokes the handler synchronously. If
+						// that handler calls `.remove()` on the element, the data is cleared,
+						// leaving `result` undefined. We need to guard against this.
+						return result && result.value;
 					}
 
 				// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
 	targetTouches: true,
 	toElement: true,
 	touches: true,
-
-	which: function( event ) {
-		var button = event.button;
-
-		// Add which for key events
-		if ( event.which == null && rkeyEvent.test( event.type ) ) {
-			return event.charCode != null ? event.charCode : event.keyCode;
-		}
-
-		// Add which for click: 1 === left; 2 === middle; 3 === right
-		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
-			if ( button & 1 ) {
-				return 1;
-			}
-
-			if ( button & 2 ) {
-				return 3;
-			}
-
-			if ( button & 4 ) {
-				return 2;
-			}
-
-			return 0;
-		}
-
-		return event.which;
-	}
+	which: true
 }, jQuery.event.addProp );
 
 jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
 			return true;
 		},
 
+		// Suppress native focus or blur as it's already being fired
+		// in leverageNative.
+		_default: function() {
+			return true;
+		},
+
 		delegateType: delegateType
 	};
 } );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
 		// set in CSS while `offset*` properties report correct values.
 		// Behavior in IE 9 is more subtle than in newer versions & it passes
 		// some versions of this test; make sure not to make it pass there!
+		//
+		// Support: Firefox 70+
+		// Only Firefox includes border widths
+		// in computed dimensions. (gh-4529)
 		reliableTrDimensions: function() {
 			var table, tr, trChild, trStyle;
 			if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
 				tr = document.createElement( "tr" );
 				trChild = document.createElement( "div" );
 
-				table.style.cssText = "position:absolute;left:-11111px";
+				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+				tr.style.cssText = "border:1px solid";
+
+				// Support: Chrome 86+
+				// Height set through cssText does not get applied.
+				// Computed height then comes back as 0.
 				tr.style.height = "1px";
 				trChild.style.height = "9px";
 
+				// Support: Android 8 Chrome 86+
+				// In our bodyBackground.html iframe,
+				// display for all div elements is set to "inline",
+				// which causes a problem only in Android 8 Chrome 86.
+				// Ensuring the div is display: block
+				// gets around this issue.
+				trChild.style.display = "block";
+
 				documentElement
 					.appendChild( table )
 					.appendChild( tr )
 					.appendChild( trChild );
 
 				trStyle = window.getComputedStyle( tr );
-				reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+					parseInt( trStyle.borderTopWidth, 10 ) +
+					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
 
 				documentElement.removeChild( table );
 			}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
 					// Running getBoundingClientRect on a disconnected node
 					// in IE throws an error.
 					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
-						swap( elem, cssShow, function() {
-							return getWidthOrHeight( elem, dimension, extra );
-						} ) :
-						getWidthOrHeight( elem, dimension, extra );
+					swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, dimension, extra );
+					} ) :
+					getWidthOrHeight( elem, dimension, extra );
 			}
 		},
 
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
 					swap( elem, { marginLeft: 0 }, function() {
 						return elem.getBoundingClientRect().left;
 					} )
-				) + "px";
+			) + "px";
 		}
 	}
 );
@@ -7608,8 +7613,8 @@ jQuery.fn.extend( {
 				if ( this.setAttribute ) {
 					this.setAttribute( "class",
 						className || value === false ?
-						"" :
-						dataPriv.get( this, "__className__" ) || ""
+							"" :
+							dataPriv.get( this, "__className__" ) || ""
 					);
 				}
 			}
@@ -7624,7 +7629,7 @@ jQuery.fn.extend( {
 		while ( ( elem = this[ i++ ] ) ) {
 			if ( elem.nodeType === 1 &&
 				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
-					return true;
+				return true;
 			}
 		}
 
@@ -7914,9 +7919,7 @@ jQuery.extend( jQuery.event, {
 				special.bindType || type;
 
 			// jQuery handler
-			handle = (
-					dataPriv.get( cur, "events" ) || Object.create( null )
-				)[ event.type ] &&
+			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
 				dataPriv.get( cur, "handle" );
 			if ( handle ) {
 				handle.apply( cur, data );
@@ -8057,7 +8060,7 @@ if ( !support.focusin ) {
 
 // Cross-browser xml parsing
 jQuery.parseXML = function( data ) {
-	var xml;
+	var xml, parserErrorElem;
 	if ( !data || typeof data !== "string" ) {
 		return null;
 	}
@@ -8066,12 +8069,17 @@ jQuery.parseXML = function( data ) {
 	// IE throws on parseFromString with invalid input.
 	try {
 		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
-	} catch ( e ) {
-		xml = undefined;
-	}
-
-	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
-		jQuery.error( "Invalid XML: " + data );
+	} catch ( e ) {}
+
+	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+	if ( !xml || parserErrorElem ) {
+		jQuery.error( "Invalid XML: " + (
+			parserErrorElem ?
+				jQuery.map( parserErrorElem.childNodes, function( el ) {
+					return el.textContent;
+				} ).join( "\n" ) :
+				data
+		) );
 	}
 	return xml;
 };
@@ -8172,16 +8180,14 @@ jQuery.fn.extend( {
 			// Can add propHook for "elements" to filter or add form elements
 			var elements = jQuery.prop( this, "elements" );
 			return elements ? jQuery.makeArray( elements ) : this;
-		} )
-		.filter( function() {
+		} ).filter( function() {
 			var type = this.type;
 
 			// Use .is( ":disabled" ) so that fieldset[disabled] works
 			return this.name && !jQuery( this ).is( ":disabled" ) &&
 				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
 				( this.checked || !rcheckableType.test( type ) );
-		} )
-		.map( function( _i, elem ) {
+		} ).map( function( _i, elem ) {
 			var val = jQuery( this ).val();
 
 			if ( val == null ) {
@@ -8387,12 +8393,6 @@ jQuery.offset = {
 			options.using.call( elem, props );
 
 		} else {
-			if ( typeof props.top === "number" ) {
-				props.top += "px";
-			}
-			if ( typeof props.left === "number" ) {
-				props.left += "px";
-			}
 			curElem.css( props );
 		}
 	}
@@ -8561,8 +8561,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
 
 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
-		function( defaultExtra, funcName ) {
+	jQuery.each( {
+		padding: "inner" + name,
+		content: type,
+		"": "outer" + name
+	}, function( defaultExtra, funcName ) {
 
 		// Margin is only for outerHeight, outerWidth
 		jQuery.fn[ funcName ] = function( margin, value ) {
@@ -8631,7 +8634,8 @@ jQuery.fn.extend( {
 	}
 } );
 
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+	( "blur focus focusin focusout resize scroll click dblclick " +
 	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
 	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
 	function( _i, name ) {
@@ -8642,7 +8646,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
 				this.on( name, null, data, fn ) :
 				this.trigger( name );
 		};
-	} );
+	}
+);
 
 
 

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 2 - 2
plugins/jquery/jquery.slim.min.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/jquery/jquery.slim.min.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 6 - 5
plugins/sweetalert2/sweetalert2.all.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 2 - 2
plugins/sweetalert2/sweetalert2.all.min.js


+ 0 - 1
plugins/sweetalert2/sweetalert2.css

@@ -559,7 +559,6 @@
 }
 
 .swal2-validation-message {
-  display: none;
   align-items: center;
   justify-content: center;
   margin: 0 -2.7em;

+ 5 - 4
plugins/sweetalert2/sweetalert2.js

@@ -1,5 +1,5 @@
 /*!
-* sweetalert2 v10.15.5
+* sweetalert2 v10.15.6
 * Released under the MIT License.
 */
 (function (global, factory) {
@@ -101,7 +101,7 @@
     if (typeof Proxy === "function") return true;
 
     try {
-      Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
+      Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
       return true;
     } catch (e) {
       return false;
@@ -1451,8 +1451,9 @@
 
     if (params.background) {
       popup.style.background = params.background;
-    } // Classes
+    }
 
+    hide(getValidationMessage()); // Classes
 
     addClasses(popup, params);
   };
@@ -3628,7 +3629,7 @@
     };
   });
   SweetAlert.DismissReason = DismissReason;
-  SweetAlert.version = '10.15.5';
+  SweetAlert.version = '10.15.6';
 
   var Swal = SweetAlert;
   Swal["default"] = Swal;

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/sweetalert2/sweetalert2.min.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
plugins/sweetalert2/sweetalert2.min.js


+ 99 - 81
plugins/uplot/uPlot.cjs.js

@@ -4,7 +4,7 @@
 *
 * uPlot.js (μPlot)
 * A small, fast chart for time series, lines, areas, ohlc & bars
-* https://github.com/leeoniya/uPlot (v1.6.5)
+* https://github.com/leeoniya/uPlot (v1.6.7)
 */
 
 'use strict';
@@ -257,6 +257,8 @@ const retArg1 = (_0, _1) => _1;
 
 const retNull = _ => null;
 
+const retTrue = _ => true;
+
 function incrRoundUp(num, incr) {
 	return ceil(num/incr)*incr;
 }
@@ -317,15 +319,21 @@ function isObj(v) {
 	return is;
 }
 
-function copy(o) {
+function fastIsObj(v) {
+	return v != null && typeof v == 'object';
+}
+
+function copy(o, _isObj) {
+	_isObj = _isObj || isObj;
+
 	let out;
 
 	if (isArr(o))
-		out = o.map(copy);
-	else if (isObj(o)) {
+		out = o.map(v => copy(v, _isObj));
+	else if (_isObj(o)) {
 		out = {};
 		for (var k in o)
-			out[k] = copy(o[k]);
+			out[k] = copy(o[k], _isObj);
 	}
 	else
 		out = o;
@@ -481,11 +489,15 @@ const win = window;
 const pxRatio = devicePixelRatio;
 
 function addClass(el, c) {
-	c != null && el.classList.add(c);
+	if (c != null) {
+		let cl = el.classList;
+		!cl.contains(c) && cl.add(c);
+	}
 }
 
 function remClass(el, c) {
-	el.classList.remove(c);
+	let cl = el.classList;
+	cl.contains(c) && cl.remove(c);
 }
 
 function setStylePx(el, name, value) {
@@ -587,58 +599,49 @@ function suffix(int) {
 }
 */
 
-const getFullYear = 'getFullYear';
-const getMonth = 'getMonth';
-const getDate = 'getDate';
-const getDay = 'getDay';
-const getHours = 'getHours';
-const getMinutes = 'getMinutes';
-const getSeconds = 'getSeconds';
-const getMilliseconds = 'getMilliseconds';
-
 const subs = {
 	// 2019
-	YYYY:	d => d[getFullYear](),
+	YYYY:	d => d.getFullYear(),
 	// 19
-	YY:		d => (d[getFullYear]()+'').slice(2),
+	YY:		d => (d.getFullYear()+'').slice(2),
 	// July
-	MMMM:	(d, names) => names.MMMM[d[getMonth]()],
+	MMMM:	(d, names) => names.MMMM[d.getMonth()],
 	// Jul
-	MMM:	(d, names) => names.MMM[d[getMonth]()],
+	MMM:	(d, names) => names.MMM[d.getMonth()],
 	// 07
-	MM:		d => zeroPad2(d[getMonth]()+1),
+	MM:		d => zeroPad2(d.getMonth()+1),
 	// 7
-	M:		d => d[getMonth]()+1,
+	M:		d => d.getMonth()+1,
 	// 09
-	DD:		d => zeroPad2(d[getDate]()),
+	DD:		d => zeroPad2(d.getDate()),
 	// 9
-	D:		d => d[getDate](),
+	D:		d => d.getDate(),
 	// Monday
-	WWWW:	(d, names) => names.WWWW[d[getDay]()],
+	WWWW:	(d, names) => names.WWWW[d.getDay()],
 	// Mon
-	WWW:	(d, names) => names.WWW[d[getDay]()],
+	WWW:	(d, names) => names.WWW[d.getDay()],
 	// 03
-	HH:		d => zeroPad2(d[getHours]()),
+	HH:		d => zeroPad2(d.getHours()),
 	// 3
-	H:		d => d[getHours](),
+	H:		d => d.getHours(),
 	// 9 (12hr, unpadded)
-	h:		d => {let h = d[getHours](); return h == 0 ? 12 : h > 12 ? h - 12 : h;},
+	h:		d => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},
 	// AM
-	AA:		d => d[getHours]() >= 12 ? 'PM' : 'AM',
+	AA:		d => d.getHours() >= 12 ? 'PM' : 'AM',
 	// am
-	aa:		d => d[getHours]() >= 12 ? 'pm' : 'am',
+	aa:		d => d.getHours() >= 12 ? 'pm' : 'am',
 	// a
-	a:		d => d[getHours]() >= 12 ? 'p' : 'a',
+	a:		d => d.getHours() >= 12 ? 'p' : 'a',
 	// 09
-	mm:		d => zeroPad2(d[getMinutes]()),
+	mm:		d => zeroPad2(d.getMinutes()),
 	// 9
-	m:		d => d[getMinutes](),
+	m:		d => d.getMinutes(),
 	// 09
-	ss:		d => zeroPad2(d[getSeconds]()),
+	ss:		d => zeroPad2(d.getSeconds()),
 	// 9
-	s:		d => d[getSeconds](),
+	s:		d => d.getSeconds(),
 	// 374
-	fff:	d => zeroPad3(d[getMilliseconds]()),
+	fff:	d => zeroPad3(d.getMilliseconds()),
 };
 
 function fmtDate(tpl, names) {
@@ -667,13 +670,13 @@ function tzDate(date, tz) {
 	let date2;
 
 	// perf optimization
-	if (tz == 'Etc/UTC')
+	if (tz == 'UTC' || tz == 'Etc/UTC')
 		date2 = new Date(+date + date.getTimezoneOffset() * 6e4);
 	else if (tz == localTz)
 		date2 = date;
 	else {
 		date2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));
-		date2.setMilliseconds(date[getMilliseconds]());
+		date2.setMilliseconds(date.getMilliseconds());
 	}
 
 	return date2;
@@ -804,17 +807,17 @@ function genTimeStuffs(ms) {
 			let minDateTs = minDate * ms;
 
 			// get ts of 12am (this lands us at or before the original scaleMin)
-			let minMin = mkDate(minDate[getFullYear](), isYr ? 0 : minDate[getMonth](), isMo || isYr ? 1 : minDate[getDate]());
+			let minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());
 			let minMinTs = minMin * ms;
 
 			if (isMo || isYr) {
 				let moIncr = isMo ? foundIncr / mo : 0;
 				let yrIncr = isYr ? foundIncr / y  : 0;
 			//	let tzOffset = scaleMin - minDateTs;		// needed?
-				let split = minDateTs == minMinTs ? minDateTs : mkDate(minMin[getFullYear]() + yrIncr, minMin[getMonth]() + moIncr, 1) * ms;
+				let split = minDateTs == minMinTs ? minDateTs : mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms;
 				let splitDate = new Date(split / ms);
-				let baseYear = splitDate[getFullYear]();
-				let baseMonth = splitDate[getMonth]();
+				let baseYear = splitDate.getFullYear();
+				let baseMonth = splitDate.getMonth();
 
 				for (let i = 0; split <= scaleMax; i++) {
 					let next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);
@@ -834,7 +837,7 @@ function genTimeStuffs(ms) {
 
 				let date0 = tzDate(split);
 
-				let prevHour = date0[getHours]() + (date0[getMinutes]() / m) + (date0[getSeconds]() / h);
+				let prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);
 				let incrHours = foundIncr / h;
 
 				let minSpace = self.axes[axisIdx]._space;
@@ -923,12 +926,12 @@ function timeAxisVals(tzDate, stamps) {
 		return splits.map(split => {
 			let date = tzDate(split);
 
-			let newYear = date[getFullYear]();
-			let newMnth = date[getMonth]();
-			let newDate = date[getDate]();
-			let newHour = date[getHours]();
-			let newMins = date[getMinutes]();
-			let newSecs = date[getSeconds]();
+			let newYear = date.getFullYear();
+			let newMnth = date.getMonth();
+			let newDate = date.getDate();
+			let newHour = date.getHours();
+			let newMins = date.getMinutes();
+			let newSecs = date.getSeconds();
 
 			let stamp = (
 				newYear != prevYear && s[2] ||
@@ -1841,6 +1844,8 @@ function catmullRomFitting(xCoords, yCoords, alpha, moveTo, bezierCurveTo) {
 
 function stepped(opts) {
 	const align = ifNull(opts.align, 1);
+	// whether to draw ascenders/descenders at null/gap bondaries
+	const ascDesc = ifNull(opts.ascDesc, false);
 
 	return (u, seriesIdx, idx0, idx1) => {
 		return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {
@@ -1885,8 +1890,9 @@ function stepped(opts) {
 						let halfStroke = (series.width * pxRatio) / 2;
 
 						let lastGap = gaps[gaps.length - 1];
-						lastGap[0] += halfStroke;
-						lastGap[1] -= halfStroke;
+
+						lastGap[0] += (ascDesc || align ==  1) ? halfStroke : -halfStroke;
+						lastGap[1] -= (ascDesc || align == -1) ? halfStroke : -halfStroke;
 					}
 
 					inGap = false;
@@ -2183,7 +2189,9 @@ function uPlot(opts, data, then) {
 
 				let rn = sc.range;
 
-				if (scaleKey != xScaleKey && !isArr(rn) && isObj(rn)) {
+				let rangeIsArr = isArr(rn);
+
+				if (scaleKey != xScaleKey && !rangeIsArr && isObj(rn)) {
 					let cfg = rn;
 					// this is similar to snapNumY
 					rn = (self, dataMin, dataMax) => dataMin == null ? nullMinMax : rangeNum(dataMin, dataMax, cfg);
@@ -2194,7 +2202,7 @@ function uPlot(opts, data, then) {
 					(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)
 				));
 
-				sc.auto = fnOrSelf(sc.auto);
+				sc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);
 
 				sc.clamp = fnOrSelf(sc.clamp || clampScale);
 
@@ -2271,8 +2279,10 @@ function uPlot(opts, data, then) {
 	for (let k in scales) {
 		let sc = scales[k];
 
-		if (sc.min != null || sc.max != null)
+		if (sc.min != null || sc.max != null) {
 			pendScales[k] = {min: sc.min, max: sc.max};
+			sc.min = sc.max = null;
+		}
 	}
 
 //	self.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;
@@ -2774,7 +2784,7 @@ function uPlot(opts, data, then) {
 			else
 				_setScale(xScaleKey, xsc.min, xsc.max);
 
-			shouldSetCursor = true;
+			shouldSetCursor = cursor.left >= 0;
 			shouldSetLegend = true;
 			commit();
 		}
@@ -2830,7 +2840,7 @@ function uPlot(opts, data, then) {
 	//	log("setScales()", arguments);
 
 		// wip scales
-		let wipScales = copy(scales);
+		let wipScales = copy(scales, fastIsObj);
 
 		for (let k in wipScales) {
 			let wsc = wipScales[k];
@@ -2957,7 +2967,7 @@ function uPlot(opts, data, then) {
 			}
 
 			if (cursor.show)
-				shouldSetCursor = true;
+				shouldSetCursor = cursor.left >= 0;
 		}
 
 		for (let k in pendScales)
@@ -3503,6 +3513,13 @@ function uPlot(opts, data, then) {
 			shouldSetSize = false;
 		}
 
+		if (fullWidCss > 0 && fullHgtCss > 0) {
+			ctx.clearRect(0, 0, can.width, can.height);
+			fire("drawClear");
+			drawOrder.forEach(fn => fn());
+			fire("draw");
+		}
+
 	//	if (shouldSetSelect) {
 		// TODO: update .u-select metrics (if visible)
 		//	setStylePx(selectDiv, TOP, select.top = 0);
@@ -3519,13 +3536,6 @@ function uPlot(opts, data, then) {
 
 	//	if (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}
 
-		if (fullWidCss > 0 && fullHgtCss > 0) {
-			ctx.clearRect(0, 0, can.width, can.height);
-			fire("drawClear");
-			drawOrder.forEach(fn => fn());
-			fire("draw");
-		}
-
 		if (!ready) {
 			ready = true;
 			self.status = 1;
@@ -3679,7 +3689,6 @@ function uPlot(opts, data, then) {
 
 		let s = series[i];
 
-		// will this cause redundant commit() if both show and focus are set?
 		if (opts.focus != null)
 			setFocus(i);
 
@@ -3693,12 +3702,12 @@ function uPlot(opts, data, then) {
 
 		fire("setSeries", i, opts);
 
-		pub && sync.pub("setSeries", self, i, opts);
+		pub && pubSync("setSeries", self, i, opts);
 	}
 
 	self.setSeries = setSeries;
 
-	function _alpha(i, value) {
+	function setAlpha(i, value) {
 		series[i].alpha = value;
 
 		if (cursor.show && cursorPts[i])
@@ -3708,11 +3717,6 @@ function uPlot(opts, data, then) {
 			legendRows[i][0].parentNode.style.opacity = value;
 	}
 
-	function _setAlpha(i, value) {
-
-		_alpha(i, value);
-	}
-
 	// y-distance
 	let closestDist;
 	let closestSeries;
@@ -3726,14 +3730,16 @@ function uPlot(opts, data, then) {
 
 			let allFocused = i == null;
 
+			let _setAlpha = focus.alpha != 1;
+
 			series.forEach((s, i2) => {
 				let isFocused = allFocused || i2 == 0 || i2 == i;
 				s._focus = allFocused ? null : isFocused;
-				_setAlpha(i2, isFocused ? 1 : focus.alpha);
+				_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);
 			});
 
 			focusedSeries = i;
-			commit();
+			_setAlpha && commit();
 		}
 	}
 
@@ -4006,7 +4012,7 @@ function uPlot(opts, data, then) {
 				let uni = drag.uni;
 
 				if (uni != null) {
-					// only calc drag status if they pass the dist asinh
+					// only calc drag status if they pass the dist thresh
 					if (dragX && dragY) {
 						dragX = rawDX >= uni;
 						dragY = rawDY >= uni;
@@ -4076,7 +4082,7 @@ function uPlot(opts, data, then) {
 		if (ts != null) {
 			// this is not technically a "mousemove" event, since it's debounced, rename to setCursor?
 			// since this is internal, we can tweak it later
-			sync.pub(mousemove, self, mouseLeft1, mouseTop1, xDim, yDim, idx);
+			pubSync(mousemove, self, mouseLeft1, mouseTop1, xDim, yDim, idx);
 
 			if (cursorFocus) {
 				let o = syncOpts.setSeries;
@@ -4201,7 +4207,7 @@ function uPlot(opts, data, then) {
 
 		if (e != null) {
 			onMouse(mouseup, doc, mouseUp);
-			sync.pub(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);
+			pubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);
 		}
 	}
 
@@ -4265,7 +4271,7 @@ function uPlot(opts, data, then) {
 
 		if (e != null) {
 			offMouse(mouseup, doc);
-			sync.pub(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
+			pubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
 		}
 	}
 
@@ -4324,7 +4330,7 @@ function uPlot(opts, data, then) {
 		hideSelect();
 
 		if (e != null)
-			sync.pub(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
+			pubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
 	}
 
 	// internal pub/sub
@@ -4375,6 +4381,10 @@ function uPlot(opts, data, then) {
 	const syncOpts = assign({
 		key: null,
 		setSeries: false,
+		filters: {
+			pub: retTrue,
+			sub: retTrue,
+		},
 		scales: [xScaleKey, null]
 	}, cursor.sync);
 
@@ -4382,10 +4392,16 @@ function uPlot(opts, data, then) {
 
 	const sync = _sync(syncKey);
 
+	function pubSync(type, src, x, y, w, h, i) {
+		if (syncOpts.filters.pub(type, src, x, y, w, h, i))
+			sync.pub(type, src, x, y, w, h, i);
+	}
+
 	sync.sub(self);
 
 	function pub(type, src, x, y, w, h, i) {
-		events[type](null, src, x, y, w, h, i);
+		if (syncOpts.filters.sub(type, src, x, y, w, h, i))
+			events[type](null, src, x, y, w, h, i);
 	}
 
 	(self.pub = pub);
@@ -4412,6 +4428,8 @@ function uPlot(opts, data, then) {
 
 		_setSize(opts.width, opts.height);
 
+		updateCursor();
+
 		setSelect(select, false);
 	}
 

+ 99 - 81
plugins/uplot/uPlot.esm.js

@@ -4,7 +4,7 @@
 *
 * uPlot.js (μPlot)
 * A small, fast chart for time series, lines, areas, ohlc & bars
-* https://github.com/leeoniya/uPlot (v1.6.5)
+* https://github.com/leeoniya/uPlot (v1.6.7)
 */
 
 const FEAT_TIME          = true;
@@ -255,6 +255,8 @@ const retArg1 = (_0, _1) => _1;
 
 const retNull = _ => null;
 
+const retTrue = _ => true;
+
 function incrRoundUp(num, incr) {
 	return ceil(num/incr)*incr;
 }
@@ -315,15 +317,21 @@ function isObj(v) {
 	return is;
 }
 
-function copy(o) {
+function fastIsObj(v) {
+	return v != null && typeof v == 'object';
+}
+
+function copy(o, _isObj) {
+	_isObj = _isObj || isObj;
+
 	let out;
 
 	if (isArr(o))
-		out = o.map(copy);
-	else if (isObj(o)) {
+		out = o.map(v => copy(v, _isObj));
+	else if (_isObj(o)) {
 		out = {};
 		for (var k in o)
-			out[k] = copy(o[k]);
+			out[k] = copy(o[k], _isObj);
 	}
 	else
 		out = o;
@@ -479,11 +487,15 @@ const win = window;
 const pxRatio = devicePixelRatio;
 
 function addClass(el, c) {
-	c != null && el.classList.add(c);
+	if (c != null) {
+		let cl = el.classList;
+		!cl.contains(c) && cl.add(c);
+	}
 }
 
 function remClass(el, c) {
-	el.classList.remove(c);
+	let cl = el.classList;
+	cl.contains(c) && cl.remove(c);
 }
 
 function setStylePx(el, name, value) {
@@ -585,58 +597,49 @@ function suffix(int) {
 }
 */
 
-const getFullYear = 'getFullYear';
-const getMonth = 'getMonth';
-const getDate = 'getDate';
-const getDay = 'getDay';
-const getHours = 'getHours';
-const getMinutes = 'getMinutes';
-const getSeconds = 'getSeconds';
-const getMilliseconds = 'getMilliseconds';
-
 const subs = {
 	// 2019
-	YYYY:	d => d[getFullYear](),
+	YYYY:	d => d.getFullYear(),
 	// 19
-	YY:		d => (d[getFullYear]()+'').slice(2),
+	YY:		d => (d.getFullYear()+'').slice(2),
 	// July
-	MMMM:	(d, names) => names.MMMM[d[getMonth]()],
+	MMMM:	(d, names) => names.MMMM[d.getMonth()],
 	// Jul
-	MMM:	(d, names) => names.MMM[d[getMonth]()],
+	MMM:	(d, names) => names.MMM[d.getMonth()],
 	// 07
-	MM:		d => zeroPad2(d[getMonth]()+1),
+	MM:		d => zeroPad2(d.getMonth()+1),
 	// 7
-	M:		d => d[getMonth]()+1,
+	M:		d => d.getMonth()+1,
 	// 09
-	DD:		d => zeroPad2(d[getDate]()),
+	DD:		d => zeroPad2(d.getDate()),
 	// 9
-	D:		d => d[getDate](),
+	D:		d => d.getDate(),
 	// Monday
-	WWWW:	(d, names) => names.WWWW[d[getDay]()],
+	WWWW:	(d, names) => names.WWWW[d.getDay()],
 	// Mon
-	WWW:	(d, names) => names.WWW[d[getDay]()],
+	WWW:	(d, names) => names.WWW[d.getDay()],
 	// 03
-	HH:		d => zeroPad2(d[getHours]()),
+	HH:		d => zeroPad2(d.getHours()),
 	// 3
-	H:		d => d[getHours](),
+	H:		d => d.getHours(),
 	// 9 (12hr, unpadded)
-	h:		d => {let h = d[getHours](); return h == 0 ? 12 : h > 12 ? h - 12 : h;},
+	h:		d => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},
 	// AM
-	AA:		d => d[getHours]() >= 12 ? 'PM' : 'AM',
+	AA:		d => d.getHours() >= 12 ? 'PM' : 'AM',
 	// am
-	aa:		d => d[getHours]() >= 12 ? 'pm' : 'am',
+	aa:		d => d.getHours() >= 12 ? 'pm' : 'am',
 	// a
-	a:		d => d[getHours]() >= 12 ? 'p' : 'a',
+	a:		d => d.getHours() >= 12 ? 'p' : 'a',
 	// 09
-	mm:		d => zeroPad2(d[getMinutes]()),
+	mm:		d => zeroPad2(d.getMinutes()),
 	// 9
-	m:		d => d[getMinutes](),
+	m:		d => d.getMinutes(),
 	// 09
-	ss:		d => zeroPad2(d[getSeconds]()),
+	ss:		d => zeroPad2(d.getSeconds()),
 	// 9
-	s:		d => d[getSeconds](),
+	s:		d => d.getSeconds(),
 	// 374
-	fff:	d => zeroPad3(d[getMilliseconds]()),
+	fff:	d => zeroPad3(d.getMilliseconds()),
 };
 
 function fmtDate(tpl, names) {
@@ -665,13 +668,13 @@ function tzDate(date, tz) {
 	let date2;
 
 	// perf optimization
-	if (tz == 'Etc/UTC')
+	if (tz == 'UTC' || tz == 'Etc/UTC')
 		date2 = new Date(+date + date.getTimezoneOffset() * 6e4);
 	else if (tz == localTz)
 		date2 = date;
 	else {
 		date2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));
-		date2.setMilliseconds(date[getMilliseconds]());
+		date2.setMilliseconds(date.getMilliseconds());
 	}
 
 	return date2;
@@ -802,17 +805,17 @@ function genTimeStuffs(ms) {
 			let minDateTs = minDate * ms;
 
 			// get ts of 12am (this lands us at or before the original scaleMin)
-			let minMin = mkDate(minDate[getFullYear](), isYr ? 0 : minDate[getMonth](), isMo || isYr ? 1 : minDate[getDate]());
+			let minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());
 			let minMinTs = minMin * ms;
 
 			if (isMo || isYr) {
 				let moIncr = isMo ? foundIncr / mo : 0;
 				let yrIncr = isYr ? foundIncr / y  : 0;
 			//	let tzOffset = scaleMin - minDateTs;		// needed?
-				let split = minDateTs == minMinTs ? minDateTs : mkDate(minMin[getFullYear]() + yrIncr, minMin[getMonth]() + moIncr, 1) * ms;
+				let split = minDateTs == minMinTs ? minDateTs : mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms;
 				let splitDate = new Date(split / ms);
-				let baseYear = splitDate[getFullYear]();
-				let baseMonth = splitDate[getMonth]();
+				let baseYear = splitDate.getFullYear();
+				let baseMonth = splitDate.getMonth();
 
 				for (let i = 0; split <= scaleMax; i++) {
 					let next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);
@@ -832,7 +835,7 @@ function genTimeStuffs(ms) {
 
 				let date0 = tzDate(split);
 
-				let prevHour = date0[getHours]() + (date0[getMinutes]() / m) + (date0[getSeconds]() / h);
+				let prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);
 				let incrHours = foundIncr / h;
 
 				let minSpace = self.axes[axisIdx]._space;
@@ -921,12 +924,12 @@ function timeAxisVals(tzDate, stamps) {
 		return splits.map(split => {
 			let date = tzDate(split);
 
-			let newYear = date[getFullYear]();
-			let newMnth = date[getMonth]();
-			let newDate = date[getDate]();
-			let newHour = date[getHours]();
-			let newMins = date[getMinutes]();
-			let newSecs = date[getSeconds]();
+			let newYear = date.getFullYear();
+			let newMnth = date.getMonth();
+			let newDate = date.getDate();
+			let newHour = date.getHours();
+			let newMins = date.getMinutes();
+			let newSecs = date.getSeconds();
 
 			let stamp = (
 				newYear != prevYear && s[2] ||
@@ -1839,6 +1842,8 @@ function catmullRomFitting(xCoords, yCoords, alpha, moveTo, bezierCurveTo) {
 
 function stepped(opts) {
 	const align = ifNull(opts.align, 1);
+	// whether to draw ascenders/descenders at null/gap bondaries
+	const ascDesc = ifNull(opts.ascDesc, false);
 
 	return (u, seriesIdx, idx0, idx1) => {
 		return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {
@@ -1883,8 +1888,9 @@ function stepped(opts) {
 						let halfStroke = (series.width * pxRatio) / 2;
 
 						let lastGap = gaps[gaps.length - 1];
-						lastGap[0] += halfStroke;
-						lastGap[1] -= halfStroke;
+
+						lastGap[0] += (ascDesc || align ==  1) ? halfStroke : -halfStroke;
+						lastGap[1] -= (ascDesc || align == -1) ? halfStroke : -halfStroke;
 					}
 
 					inGap = false;
@@ -2181,7 +2187,9 @@ function uPlot(opts, data, then) {
 
 				let rn = sc.range;
 
-				if (scaleKey != xScaleKey && !isArr(rn) && isObj(rn)) {
+				let rangeIsArr = isArr(rn);
+
+				if (scaleKey != xScaleKey && !rangeIsArr && isObj(rn)) {
 					let cfg = rn;
 					// this is similar to snapNumY
 					rn = (self, dataMin, dataMax) => dataMin == null ? nullMinMax : rangeNum(dataMin, dataMax, cfg);
@@ -2192,7 +2200,7 @@ function uPlot(opts, data, then) {
 					(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)
 				));
 
-				sc.auto = fnOrSelf(sc.auto);
+				sc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);
 
 				sc.clamp = fnOrSelf(sc.clamp || clampScale);
 
@@ -2269,8 +2277,10 @@ function uPlot(opts, data, then) {
 	for (let k in scales) {
 		let sc = scales[k];
 
-		if (sc.min != null || sc.max != null)
+		if (sc.min != null || sc.max != null) {
 			pendScales[k] = {min: sc.min, max: sc.max};
+			sc.min = sc.max = null;
+		}
 	}
 
 //	self.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;
@@ -2772,7 +2782,7 @@ function uPlot(opts, data, then) {
 			else
 				_setScale(xScaleKey, xsc.min, xsc.max);
 
-			shouldSetCursor = true;
+			shouldSetCursor = cursor.left >= 0;
 			shouldSetLegend = true;
 			commit();
 		}
@@ -2828,7 +2838,7 @@ function uPlot(opts, data, then) {
 	//	log("setScales()", arguments);
 
 		// wip scales
-		let wipScales = copy(scales);
+		let wipScales = copy(scales, fastIsObj);
 
 		for (let k in wipScales) {
 			let wsc = wipScales[k];
@@ -2955,7 +2965,7 @@ function uPlot(opts, data, then) {
 			}
 
 			if (cursor.show)
-				shouldSetCursor = true;
+				shouldSetCursor = cursor.left >= 0;
 		}
 
 		for (let k in pendScales)
@@ -3501,6 +3511,13 @@ function uPlot(opts, data, then) {
 			shouldSetSize = false;
 		}
 
+		if (fullWidCss > 0 && fullHgtCss > 0) {
+			ctx.clearRect(0, 0, can.width, can.height);
+			fire("drawClear");
+			drawOrder.forEach(fn => fn());
+			fire("draw");
+		}
+
 	//	if (shouldSetSelect) {
 		// TODO: update .u-select metrics (if visible)
 		//	setStylePx(selectDiv, TOP, select.top = 0);
@@ -3517,13 +3534,6 @@ function uPlot(opts, data, then) {
 
 	//	if (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}
 
-		if (fullWidCss > 0 && fullHgtCss > 0) {
-			ctx.clearRect(0, 0, can.width, can.height);
-			fire("drawClear");
-			drawOrder.forEach(fn => fn());
-			fire("draw");
-		}
-
 		if (!ready) {
 			ready = true;
 			self.status = 1;
@@ -3677,7 +3687,6 @@ function uPlot(opts, data, then) {
 
 		let s = series[i];
 
-		// will this cause redundant commit() if both show and focus are set?
 		if (opts.focus != null)
 			setFocus(i);
 
@@ -3691,12 +3700,12 @@ function uPlot(opts, data, then) {
 
 		fire("setSeries", i, opts);
 
-		pub && sync.pub("setSeries", self, i, opts);
+		pub && pubSync("setSeries", self, i, opts);
 	}
 
 	self.setSeries = setSeries;
 
-	function _alpha(i, value) {
+	function setAlpha(i, value) {
 		series[i].alpha = value;
 
 		if (cursor.show && cursorPts[i])
@@ -3706,11 +3715,6 @@ function uPlot(opts, data, then) {
 			legendRows[i][0].parentNode.style.opacity = value;
 	}
 
-	function _setAlpha(i, value) {
-
-		_alpha(i, value);
-	}
-
 	// y-distance
 	let closestDist;
 	let closestSeries;
@@ -3724,14 +3728,16 @@ function uPlot(opts, data, then) {
 
 			let allFocused = i == null;
 
+			let _setAlpha = focus.alpha != 1;
+
 			series.forEach((s, i2) => {
 				let isFocused = allFocused || i2 == 0 || i2 == i;
 				s._focus = allFocused ? null : isFocused;
-				_setAlpha(i2, isFocused ? 1 : focus.alpha);
+				_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);
 			});
 
 			focusedSeries = i;
-			commit();
+			_setAlpha && commit();
 		}
 	}
 
@@ -4004,7 +4010,7 @@ function uPlot(opts, data, then) {
 				let uni = drag.uni;
 
 				if (uni != null) {
-					// only calc drag status if they pass the dist asinh
+					// only calc drag status if they pass the dist thresh
 					if (dragX && dragY) {
 						dragX = rawDX >= uni;
 						dragY = rawDY >= uni;
@@ -4074,7 +4080,7 @@ function uPlot(opts, data, then) {
 		if (ts != null) {
 			// this is not technically a "mousemove" event, since it's debounced, rename to setCursor?
 			// since this is internal, we can tweak it later
-			sync.pub(mousemove, self, mouseLeft1, mouseTop1, xDim, yDim, idx);
+			pubSync(mousemove, self, mouseLeft1, mouseTop1, xDim, yDim, idx);
 
 			if (cursorFocus) {
 				let o = syncOpts.setSeries;
@@ -4199,7 +4205,7 @@ function uPlot(opts, data, then) {
 
 		if (e != null) {
 			onMouse(mouseup, doc, mouseUp);
-			sync.pub(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);
+			pubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);
 		}
 	}
 
@@ -4263,7 +4269,7 @@ function uPlot(opts, data, then) {
 
 		if (e != null) {
 			offMouse(mouseup, doc);
-			sync.pub(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
+			pubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
 		}
 	}
 
@@ -4322,7 +4328,7 @@ function uPlot(opts, data, then) {
 		hideSelect();
 
 		if (e != null)
-			sync.pub(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
+			pubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
 	}
 
 	// internal pub/sub
@@ -4373,6 +4379,10 @@ function uPlot(opts, data, then) {
 	const syncOpts = assign({
 		key: null,
 		setSeries: false,
+		filters: {
+			pub: retTrue,
+			sub: retTrue,
+		},
 		scales: [xScaleKey, null]
 	}, cursor.sync);
 
@@ -4380,10 +4390,16 @@ function uPlot(opts, data, then) {
 
 	const sync = _sync(syncKey);
 
+	function pubSync(type, src, x, y, w, h, i) {
+		if (syncOpts.filters.pub(type, src, x, y, w, h, i))
+			sync.pub(type, src, x, y, w, h, i);
+	}
+
 	sync.sub(self);
 
 	function pub(type, src, x, y, w, h, i) {
-		events[type](null, src, x, y, w, h, i);
+		if (syncOpts.filters.sub(type, src, x, y, w, h, i))
+			events[type](null, src, x, y, w, h, i);
 	}
 
 	(self.pub = pub);
@@ -4410,6 +4426,8 @@ function uPlot(opts, data, then) {
 
 		_setSize(opts.width, opts.height);
 
+		updateCursor();
+
 		setSelect(select, false);
 	}
 

+ 100 - 82
plugins/uplot/uPlot.iife.js

@@ -4,7 +4,7 @@
 *
 * uPlot.js (μPlot)
 * A small, fast chart for time series, lines, areas, ohlc & bars
-* https://github.com/leeoniya/uPlot (v1.6.5)
+* https://github.com/leeoniya/uPlot (v1.6.7)
 */
 
 var uPlot = (function () {
@@ -265,6 +265,8 @@ var uPlot = (function () {
 
 	var retNull = _ => null;
 
+	var retTrue = _ => true;
+
 	function incrRoundUp(num, incr) {
 		return ceil(num/incr)*incr;
 	}
@@ -325,15 +327,21 @@ var uPlot = (function () {
 		return is;
 	}
 
-	function copy(o) {
+	function fastIsObj(v) {
+		return v != null && typeof v == 'object';
+	}
+
+	function copy(o, _isObj) {
+		_isObj = _isObj || isObj;
+
 		var out;
 
 		if (isArr(o))
-			{ out = o.map(copy); }
-		else if (isObj(o)) {
+			{ out = o.map(v => copy(v, _isObj)); }
+		else if (_isObj(o)) {
 			out = {};
 			for (var k in o)
-				{ out[k] = copy(o[k]); }
+				{ out[k] = copy(o[k], _isObj); }
 		}
 		else
 			{ out = o; }
@@ -489,11 +497,15 @@ var uPlot = (function () {
 	var pxRatio = devicePixelRatio;
 
 	function addClass(el, c) {
-		c != null && el.classList.add(c);
+		if (c != null) {
+			var cl = el.classList;
+			!cl.contains(c) && cl.add(c);
+		}
 	}
 
 	function remClass(el, c) {
-		el.classList.remove(c);
+		var cl = el.classList;
+		cl.contains(c) && cl.remove(c);
 	}
 
 	function setStylePx(el, name, value) {
@@ -593,58 +605,49 @@ var uPlot = (function () {
 	}
 	*/
 
-	var getFullYear = 'getFullYear';
-	var getMonth = 'getMonth';
-	var getDate = 'getDate';
-	var getDay = 'getDay';
-	var getHours = 'getHours';
-	var getMinutes = 'getMinutes';
-	var getSeconds = 'getSeconds';
-	var getMilliseconds = 'getMilliseconds';
-
 	var subs = {
 		// 2019
-		YYYY:	d => d[getFullYear](),
+		YYYY:	d => d.getFullYear(),
 		// 19
-		YY:		d => (d[getFullYear]()+'').slice(2),
+		YY:		d => (d.getFullYear()+'').slice(2),
 		// July
-		MMMM:	(d, names) => names.MMMM[d[getMonth]()],
+		MMMM:	(d, names) => names.MMMM[d.getMonth()],
 		// Jul
-		MMM:	(d, names) => names.MMM[d[getMonth]()],
+		MMM:	(d, names) => names.MMM[d.getMonth()],
 		// 07
-		MM:		d => zeroPad2(d[getMonth]()+1),
+		MM:		d => zeroPad2(d.getMonth()+1),
 		// 7
-		M:		d => d[getMonth]()+1,
+		M:		d => d.getMonth()+1,
 		// 09
-		DD:		d => zeroPad2(d[getDate]()),
+		DD:		d => zeroPad2(d.getDate()),
 		// 9
-		D:		d => d[getDate](),
+		D:		d => d.getDate(),
 		// Monday
-		WWWW:	(d, names) => names.WWWW[d[getDay]()],
+		WWWW:	(d, names) => names.WWWW[d.getDay()],
 		// Mon
-		WWW:	(d, names) => names.WWW[d[getDay]()],
+		WWW:	(d, names) => names.WWW[d.getDay()],
 		// 03
-		HH:		d => zeroPad2(d[getHours]()),
+		HH:		d => zeroPad2(d.getHours()),
 		// 3
-		H:		d => d[getHours](),
+		H:		d => d.getHours(),
 		// 9 (12hr, unpadded)
-		h:		d => {var h = d[getHours](); return h == 0 ? 12 : h > 12 ? h - 12 : h;},
+		h:		d => {var h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},
 		// AM
-		AA:		d => d[getHours]() >= 12 ? 'PM' : 'AM',
+		AA:		d => d.getHours() >= 12 ? 'PM' : 'AM',
 		// am
-		aa:		d => d[getHours]() >= 12 ? 'pm' : 'am',
+		aa:		d => d.getHours() >= 12 ? 'pm' : 'am',
 		// a
-		a:		d => d[getHours]() >= 12 ? 'p' : 'a',
+		a:		d => d.getHours() >= 12 ? 'p' : 'a',
 		// 09
-		mm:		d => zeroPad2(d[getMinutes]()),
+		mm:		d => zeroPad2(d.getMinutes()),
 		// 9
-		m:		d => d[getMinutes](),
+		m:		d => d.getMinutes(),
 		// 09
-		ss:		d => zeroPad2(d[getSeconds]()),
+		ss:		d => zeroPad2(d.getSeconds()),
 		// 9
-		s:		d => d[getSeconds](),
+		s:		d => d.getSeconds(),
 		// 374
-		fff:	d => zeroPad3(d[getMilliseconds]()),
+		fff:	d => zeroPad3(d.getMilliseconds()),
 	};
 
 	function fmtDate(tpl, names) {
@@ -673,13 +676,13 @@ var uPlot = (function () {
 		var date2;
 
 		// perf optimization
-		if (tz == 'Etc/UTC')
+		if (tz == 'UTC' || tz == 'Etc/UTC')
 			{ date2 = new Date(+date + date.getTimezoneOffset() * 6e4); }
 		else if (tz == localTz)
 			{ date2 = date; }
 		else {
 			date2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));
-			date2.setMilliseconds(date[getMilliseconds]());
+			date2.setMilliseconds(date.getMilliseconds());
 		}
 
 		return date2;
@@ -808,17 +811,17 @@ var uPlot = (function () {
 				var minDateTs = minDate * ms;
 
 				// get ts of 12am (this lands us at or before the original scaleMin)
-				var minMin = mkDate(minDate[getFullYear](), isYr ? 0 : minDate[getMonth](), isMo || isYr ? 1 : minDate[getDate]());
+				var minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());
 				var minMinTs = minMin * ms;
 
 				if (isMo || isYr) {
 					var moIncr = isMo ? foundIncr / mo : 0;
 					var yrIncr = isYr ? foundIncr / y  : 0;
 				//	let tzOffset = scaleMin - minDateTs;		// needed?
-					var split = minDateTs == minMinTs ? minDateTs : mkDate(minMin[getFullYear]() + yrIncr, minMin[getMonth]() + moIncr, 1) * ms;
+					var split = minDateTs == minMinTs ? minDateTs : mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms;
 					var splitDate = new Date(split / ms);
-					var baseYear = splitDate[getFullYear]();
-					var baseMonth = splitDate[getMonth]();
+					var baseYear = splitDate.getFullYear();
+					var baseMonth = splitDate.getMonth();
 
 					for (var i = 0; split <= scaleMax; i++) {
 						var next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);
@@ -838,7 +841,7 @@ var uPlot = (function () {
 
 					var date0 = tzDate(split$1);
 
-					var prevHour = date0[getHours]() + (date0[getMinutes]() / m) + (date0[getSeconds]() / h);
+					var prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);
 					var incrHours = foundIncr / h;
 
 					var minSpace = self.axes[axisIdx]._space;
@@ -932,12 +935,12 @@ var uPlot = (function () {
 			return splits.map(split => {
 				var date = tzDate(split);
 
-				var newYear = date[getFullYear]();
-				var newMnth = date[getMonth]();
-				var newDate = date[getDate]();
-				var newHour = date[getHours]();
-				var newMins = date[getMinutes]();
-				var newSecs = date[getSeconds]();
+				var newYear = date.getFullYear();
+				var newMnth = date.getMonth();
+				var newDate = date.getDate();
+				var newHour = date.getHours();
+				var newMins = date.getMinutes();
+				var newSecs = date.getSeconds();
 
 				var stamp = (
 					newYear != prevYear && s[2] ||
@@ -1843,6 +1846,8 @@ var uPlot = (function () {
 
 	function stepped(opts) {
 		var align = ifNull(opts.align, 1);
+		// whether to draw ascenders/descenders at null/gap bondaries
+		var ascDesc = ifNull(opts.ascDesc, false);
 
 		return (u, seriesIdx, idx0, idx1) => {
 			return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {
@@ -1887,8 +1892,9 @@ var uPlot = (function () {
 							var halfStroke = (series.width * pxRatio) / 2;
 
 							var lastGap = gaps[gaps.length - 1];
-							lastGap[0] += halfStroke;
-							lastGap[1] -= halfStroke;
+
+							lastGap[0] += (ascDesc || align ==  1) ? halfStroke : -halfStroke;
+							lastGap[1] -= (ascDesc || align == -1) ? halfStroke : -halfStroke;
 						}
 
 						inGap = false;
@@ -2185,7 +2191,9 @@ var uPlot = (function () {
 
 					var rn = sc.range;
 
-					if (scaleKey != xScaleKey && !isArr(rn) && isObj(rn)) {
+					var rangeIsArr = isArr(rn);
+
+					if (scaleKey != xScaleKey && !rangeIsArr && isObj(rn)) {
 						var cfg = rn;
 						// this is similar to snapNumY
 						rn = (self, dataMin, dataMax) => dataMin == null ? nullMinMax : rangeNum(dataMin, dataMax, cfg);
@@ -2196,7 +2204,7 @@ var uPlot = (function () {
 						(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)
 					));
 
-					sc.auto = fnOrSelf(sc.auto);
+					sc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);
 
 					sc.clamp = fnOrSelf(sc.clamp || clampScale);
 
@@ -2273,8 +2281,10 @@ var uPlot = (function () {
 		for (var k$1 in scales) {
 			var sc = scales[k$1];
 
-			if (sc.min != null || sc.max != null)
-				{ pendScales[k$1] = {min: sc.min, max: sc.max}; }
+			if (sc.min != null || sc.max != null) {
+				pendScales[k$1] = {min: sc.min, max: sc.max};
+				sc.min = sc.max = null;
+			}
 		}
 
 	//	self.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;
@@ -2783,7 +2793,7 @@ var uPlot = (function () {
 				else
 					{ _setScale(xScaleKey, xsc.min, xsc.max); }
 
-				shouldSetCursor = true;
+				shouldSetCursor = cursor.left >= 0;
 				shouldSetLegend = true;
 				commit();
 			}
@@ -2841,7 +2851,7 @@ var uPlot = (function () {
 		//	log("setScales()", arguments);
 
 			// wip scales
-			var wipScales = copy(scales);
+			var wipScales = copy(scales, fastIsObj);
 
 			for (var k in wipScales) {
 				var wsc = wipScales[k];
@@ -2968,7 +2978,7 @@ var uPlot = (function () {
 				}
 
 				if (cursor.show)
-					{ shouldSetCursor = true; }
+					{ shouldSetCursor = cursor.left >= 0; }
 			}
 
 			for (var k$5 in pendScales)
@@ -3522,6 +3532,13 @@ var uPlot = (function () {
 				shouldSetSize = false;
 			}
 
+			if (fullWidCss > 0 && fullHgtCss > 0) {
+				ctx.clearRect(0, 0, can.width, can.height);
+				fire("drawClear");
+				drawOrder.forEach(fn => fn());
+				fire("draw");
+			}
+
 		//	if (shouldSetSelect) {
 			// TODO: update .u-select metrics (if visible)
 			//	setStylePx(selectDiv, TOP, select.top = 0);
@@ -3538,13 +3555,6 @@ var uPlot = (function () {
 
 		//	if (FEAT_LEGEND && legend.show && legend.live && shouldSetLegend) {}
 
-			if (fullWidCss > 0 && fullHgtCss > 0) {
-				ctx.clearRect(0, 0, can.width, can.height);
-				fire("drawClear");
-				drawOrder.forEach(fn => fn());
-				fire("draw");
-			}
-
 			if (!ready) {
 				ready = true;
 				self.status = 1;
@@ -3698,7 +3708,6 @@ var uPlot = (function () {
 
 			var s = series[i];
 
-			// will this cause redundant commit() if both show and focus are set?
 			if (opts.focus != null)
 				{ setFocus(i); }
 
@@ -3712,12 +3721,12 @@ var uPlot = (function () {
 
 			fire("setSeries", i, opts);
 
-			pub && sync.pub("setSeries", self, i, opts);
+			pub && pubSync("setSeries", self, i, opts);
 		}
 
 		self.setSeries = setSeries;
 
-		function _alpha(i, value) {
+		function setAlpha(i, value) {
 			series[i].alpha = value;
 
 			if (cursor.show && cursorPts[i])
@@ -3727,11 +3736,6 @@ var uPlot = (function () {
 				{ legendRows[i][0].parentNode.style.opacity = value; }
 		}
 
-		function _setAlpha(i, value) {
-
-			_alpha(i, value);
-		}
-
 		// y-distance
 		var closestDist;
 		var closestSeries;
@@ -3745,14 +3749,16 @@ var uPlot = (function () {
 
 				var allFocused = i == null;
 
+				var _setAlpha = focus.alpha != 1;
+
 				series.forEach((s, i2) => {
 					var isFocused = allFocused || i2 == 0 || i2 == i;
 					s._focus = allFocused ? null : isFocused;
-					_setAlpha(i2, isFocused ? 1 : focus.alpha);
+					_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);
 				});
 
 				focusedSeries = i;
-				commit();
+				_setAlpha && commit();
 			}
 		}
 
@@ -4033,7 +4039,7 @@ var uPlot = (function () {
 					var uni = drag.uni;
 
 					if (uni != null) {
-						// only calc drag status if they pass the dist asinh
+						// only calc drag status if they pass the dist thresh
 						if (dragX && dragY) {
 							dragX = rawDX >= uni;
 							dragY = rawDY >= uni;
@@ -4103,7 +4109,7 @@ var uPlot = (function () {
 			if (ts != null) {
 				// this is not technically a "mousemove" event, since it's debounced, rename to setCursor?
 				// since this is internal, we can tweak it later
-				sync.pub(mousemove, self, mouseLeft1, mouseTop1, xDim, yDim, idx);
+				pubSync(mousemove, self, mouseLeft1, mouseTop1, xDim, yDim, idx);
 
 				if (cursorFocus) {
 					var o = syncOpts.setSeries;
@@ -4232,7 +4238,7 @@ var uPlot = (function () {
 
 			if (e != null) {
 				onMouse(mouseup, doc, mouseUp);
-				sync.pub(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);
+				pubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);
 			}
 		}
 
@@ -4299,7 +4305,7 @@ var uPlot = (function () {
 
 			if (e != null) {
 				offMouse(mouseup, doc);
-				sync.pub(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
+				pubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);
 			}
 		}
 
@@ -4358,7 +4364,7 @@ var uPlot = (function () {
 			hideSelect();
 
 			if (e != null)
-				{ sync.pub(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null); }
+				{ pubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null); }
 		}
 
 		// internal pub/sub
@@ -4409,6 +4415,10 @@ var uPlot = (function () {
 		var syncOpts = assign({
 			key: null,
 			setSeries: false,
+			filters: {
+				pub: retTrue,
+				sub: retTrue,
+			},
 			scales: [xScaleKey, null]
 		}, cursor.sync);
 
@@ -4416,10 +4426,16 @@ var uPlot = (function () {
 
 		var sync = _sync(syncKey);
 
+		function pubSync(type, src, x, y, w, h, i) {
+			if (syncOpts.filters.pub(type, src, x, y, w, h, i))
+				{ sync.pub(type, src, x, y, w, h, i); }
+		}
+
 		sync.sub(self);
 
 		function pub(type, src, x, y, w, h, i) {
-			events[type](null, src, x, y, w, h, i);
+			if (syncOpts.filters.sub(type, src, x, y, w, h, i))
+				{ events[type](null, src, x, y, w, h, i); }
 		}
 
 		(self.pub = pub);
@@ -4446,6 +4462,8 @@ var uPlot = (function () {
 
 			_setSize(opts.width, opts.height);
 
+			updateCursor();
+
 			setSelect(select, false);
 		}
 

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 2 - 2
plugins/uplot/uPlot.iife.min.js