diff --git a/gulpfile.js b/gulpfile.js index 80e2f473..18d478da 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,7 +9,7 @@ const pump = require('pump'); const removeSourcemaps = require('gulp-remove-sourcemaps'); const sass = require('gulp-sass')(require('sass')); const sassGlob = require('gulp-sass-glob'); -const styleLint = require('gulp-stylelint'); +const styleLint = require('@ronilaukkarinen/gulp-stylelint'); const spawn = require('child_process').spawn; const config = require('./gulpfile.config.js'); diff --git a/package-lock.json b/package-lock.json index 1dcd4f98..65619ad9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,33 +7,33 @@ "name": "babybuddy", "license": "BSD-2-Clause", "devDependencies": { - "bootstrap": "4.6.1", - "del": "^6.0.0", + "@ronilaukkarinen/gulp-stylelint": "^14.0.6", + "bootstrap": "^4.6.1", + "del": "^6.1.0", "gulp": "^4.0.2", "gulp-concat": "^2.6.1", "gulp-csso": "^4.0.1", "gulp-flatten": "^0.4.0", "gulp-fontello": "^0.5.2", "gulp-remove-sourcemaps": "^1.0.4", - "gulp-sass": "^5.0.0", + "gulp-sass": "^5.1.0", "gulp-sass-glob": "^1.1.0", "gulp-spawn": "^1.0.0", - "gulp-stylelint": "^13.0.0", "gulp-uglify": "^3.0.2", "jquery": "^3.6.0", - "moment": "^2.29.1", + "moment": "^2.29.3", "moment-timezone": "^0.5.34", - "plotly.js": "^2.8.0", + "plotly.js": "^2.12.1", "popper.js": "^1.16.1", "pulltorefreshjs": "^0.1.22", "pump": "^3.0.0", - "sass": "^1.45.0", - "stylelint": "^14.1.0", - "stylelint-config-recommended-scss": "^5.0.2", + "sass": "^1.52.1", + "stylelint": "^14.8.3", + "stylelint-config-recommended-scss": "^6.0.0", "stylelint-order": "^5.0.0", - "stylelint-scss": "^4.0.1", - "tempusdominus-bootstrap-4": "5.1.2", - "tempusdominus-core": "5.0.3" + "stylelint-scss": "^4.2.0", + "tempusdominus-bootstrap-4": "5.39.2", + "tempusdominus-core": "5.19.3" } }, "node_modules/@babel/code-frame": { @@ -300,6 +300,34 @@ "pick-by-alias": "^1.2.0" } }, + "node_modules/@ronilaukkarinen/gulp-stylelint": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@ronilaukkarinen/gulp-stylelint/-/gulp-stylelint-14.0.6.tgz", + "integrity": "sha512-MqN6esUpq7IZNvy2mH7FcH0HUQHpXj+SGyOGGdxO6OGLhnUUCOrGcwuu9EG6cN3VKuIVqF5/HAAuedSJIb6rMw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fancy-log": "^1.3.3", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=15.14.0 || >=16.0.0" + }, + "peerDependencies": { + "stylelint": "^14.0.1" + } + }, + "node_modules/@ronilaukkarinen/gulp-stylelint/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/@turf/area": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", @@ -419,9 +447,9 @@ } }, "node_modules/ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -1577,6 +1605,12 @@ "color-support": "bin.js" } }, + "node_modules/colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "dev": true + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1747,6 +1781,15 @@ "integrity": "sha1-m8BGcayFvHJLV07106yWsNYE/Zc=", "dev": true }, + "node_modules/css-functions-list": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.0.1.tgz", + "integrity": "sha512-PriDuifDt4u4rkDgnqRCLnjfMatufLmWNfQnGCq34xZwpY3oabwhB9SqRBmuvWUgndbemCFlKqg+nO7C2q0SBw==", + "dev": true, + "engines": { + "node": ">=12.22" + } + }, "node_modules/css-global-keywords": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", @@ -2055,9 +2098,9 @@ "dev": true }, "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.0.tgz", + "integrity": "sha512-OpcRktOt7G7HBfyxP0srBH4Djg4824EQORX8E1qvIhIzthNNArxxhrB/Mm7dRMiLi1nvFyUpDhzD2cTtbBhV8A==", "dev": true, "dependencies": { "globby": "^11.0.1", @@ -2560,9 +2603,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2572,7 +2615,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-isnumeric": { @@ -3339,16 +3382,16 @@ } }, "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -3866,17 +3909,16 @@ "dev": true }, "node_modules/gulp-sass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.0.0.tgz", - "integrity": "sha512-J0aH0/2N4+2szGCeut0ktGHK0Wg8L9uWivuigrl7xv+nhxozBQRAKLrhnDDaTa3FeUWYtgT8w4RlgdhRy5v16w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.1.0.tgz", + "integrity": "sha512-7VT0uaF+VZCmkNBglfe1b34bxn/AfcssquLKVDYnCDJ3xNBaW7cUuI3p3BQmoKcoKFrs9jdzUxyb+u+NGfL4OQ==", "dev": true, "dependencies": { - "chalk": "^4.1.1", - "lodash": "^4.17.20", + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.0.0", "plugin-error": "^1.0.1", "replace-ext": "^2.0.0", - "strip-ansi": "^6.0.0", - "transfob": "^1.0.0", + "strip-ansi": "^6.0.1", "vinyl-sourcemaps-apply": "^0.2.1" }, "engines": { @@ -3918,58 +3960,6 @@ "node": ">=12" } }, - "node_modules/gulp-stylelint": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/gulp-stylelint/-/gulp-stylelint-13.0.0.tgz", - "integrity": "sha512-qFWBXnYDsGy6ttzqptctMZjJhhGc0FdFE+UNPlj/5fTyuUo5mfxcc7pzN4hIJnvB79BO1WikLtdtXuC/G2AhGA==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "fancy-log": "^1.3.3", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "strip-ansi": "^6.0.0", - "through2": "^3.0.1" - }, - "engines": { - "node": ">=10.12.0" - }, - "peerDependencies": { - "stylelint": "^13.0.0" - } - }, - "node_modules/gulp-stylelint/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gulp-stylelint/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/gulp-stylelint/node_modules/through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, "node_modules/gulp-uglify": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", @@ -4329,12 +4319,15 @@ "dev": true }, "node_modules/html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/iconv-lite": { @@ -4370,9 +4363,9 @@ ] }, "node_modules/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -4849,12 +4842,6 @@ "integrity": "sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA=", "dev": true }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -4970,9 +4957,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.23.0.tgz", - "integrity": "sha512-h9ivI88e1lFNmTT4HovBN33Ysn0OIJG7IPG2mkpx2uniQXFWqo35QdiX7w0TovlUFXfW8aPFblP5/q0jlOr2sA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz", + "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==", "dev": true }, "node_modules/last-run": { @@ -5174,6 +5161,12 @@ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", "dev": true }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "node_modules/lodash.escape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", @@ -5608,13 +5601,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -5687,9 +5680,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/minimist-options": { @@ -5753,9 +5746,9 @@ } }, "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", "dev": true, "engines": { "node": "*" @@ -5853,9 +5846,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -6051,12 +6044,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", - "dev": true - }, "node_modules/normalize-svg-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", @@ -6527,9 +6514,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -6596,9 +6583,9 @@ } }, "node_modules/plotly.js": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.8.0.tgz", - "integrity": "sha512-bYuLdTlQEWMs/u3nNqV/jwERj9tw8qMDKBV8NBP1BucfapLoYIM9w4ARc3W9m93r6OYvP5I6ykUztiDmDcvA9Q==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.12.1.tgz", + "integrity": "sha512-XbZ3w3jSl+ihZPMXWwblmjinqbzdd+vT+3XKZpyffxmlMmTp/3vY1ewpQDuNyufUoiT0o0ekCqa80Qlzi7jwlA==", "dev": true, "dependencies": { "@plotly/d3": "3.8.0", @@ -6635,8 +6622,8 @@ "native-promise-only": "^0.8.1", "parse-svg-path": "^0.1.2", "polybooljs": "^1.2.0", - "probe-image-size": "^7.2.2", - "regl": "^2.1.0", + "probe-image-size": "^7.2.3", + "regl": "npm:@plotly/regl@^2.1.2", "regl-error2d": "^2.0.12", "regl-line2d": "^3.1.2", "regl-scatter2d": "^3.2.8", @@ -6651,6 +6638,13 @@ "world-calendars": "^1.0.3" } }, + "node_modules/plotly.js/node_modules/regl": { + "name": "@plotly/regl", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", + "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==", + "dev": true + }, "node_modules/plotly.js/node_modules/to-px": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", @@ -6739,21 +6733,27 @@ } }, "node_modules/postcss": { - "version": "8.3.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", - "integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { - "nanoid": "^3.1.30", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", - "source-map-js": "^0.6.2" + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-media-query-parser": { @@ -6801,9 +6801,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -6823,9 +6823,9 @@ } }, "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "node_modules/potpack": { @@ -6853,9 +6853,9 @@ } }, "node_modules/probe-image-size": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.2.tgz", - "integrity": "sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", "dev": true, "dependencies": { "lodash.merge": "^4.6.2", @@ -7714,9 +7714,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.0.tgz", - "integrity": "sha512-ONy5bjppoohtNkFJRqdz1gscXamMzN3wQy1YH9qO2FiNpgjLhpz/IPRGg0PpCjyz/pWfCOaNEaiEGCcjOFAjqw==", + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", + "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -7727,7 +7727,7 @@ "sass": "sass.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=12.0.0" } }, "node_modules/sass/node_modules/anymatch": { @@ -7914,9 +7914,9 @@ "dev": true }, "node_modules/signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/signum": { @@ -8107,9 +8107,9 @@ } }, "node_modules/source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8397,49 +8397,51 @@ "dev": true }, "node_modules/stylelint": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.1.0.tgz", - "integrity": "sha512-IedkssuNVA11+v++2PIV2OHOU5A3SfRcXVi56vZVSsMhGrgtwmmit69jeM+08/Tun5DTBe7BuH1Zp1mMLmtKLA==", + "version": "14.8.3", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.8.3.tgz", + "integrity": "sha512-aLpskXwSgFEBYbFRKA/BfuyYMGuXNtn2t5GqoffNPSezvw97x/vVNWcZNF0+cwt+LBjfvyq9/MRE3OjInGRgNA==", "dev": true, "dependencies": { "balanced-match": "^2.0.0", + "colord": "^2.9.2", "cosmiconfig": "^7.0.1", - "debug": "^4.3.2", + "css-functions-list": "^3.0.1", + "debug": "^4.3.4", "execall": "^2.0.0", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "fastest-levenshtein": "^1.0.12", "file-entry-cache": "^6.0.1", "get-stdin": "^8.0.0", "global-modules": "^2.0.0", - "globby": "^11.0.4", + "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.9", + "html-tags": "^3.2.0", + "ignore": "^5.2.0", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.23.0", + "known-css-properties": "^0.25.0", "mathml-tag-names": "^2.1.3", "meow": "^9.0.0", - "micromatch": "^4.0.4", + "micromatch": "^4.0.5", "normalize-path": "^3.0.0", - "normalize-selector": "^0.2.0", "picocolors": "^1.0.0", - "postcss": "^8.3.11", + "postcss": "^8.4.13", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.6", - "postcss-value-parser": "^4.1.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "specificity": "^0.4.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "style-search": "^0.1.0", + "supports-hyperlinks": "^2.2.0", "svg-tags": "^1.0.0", - "table": "^6.7.3", + "table": "^6.8.0", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^3.0.3" + "write-file-atomic": "^4.0.1" }, "bin": { "stylelint": "bin/stylelint.js" @@ -8453,26 +8455,26 @@ } }, "node_modules/stylelint-config-recommended": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz", - "integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz", + "integrity": "sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==", "dev": true, "peerDependencies": { - "stylelint": "^14.0.0" + "stylelint": "^14.4.0" } }, "node_modules/stylelint-config-recommended-scss": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-5.0.2.tgz", - "integrity": "sha512-b14BSZjcwW0hqbzm9b0S/ScN2+3CO3O4vcMNOw2KGf8lfVSwJ4p5TbNEXKwKl1+0FMtgRXZj6DqVUe/7nGnuBg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-6.0.0.tgz", + "integrity": "sha512-6QOe2/OzXV2AP5FE12A7+qtKdZik7Saf42SMMl84ksVBBPpTdrV+9HaCbPYiRMiwELY9hXCVdH4wlJ+YJb5eig==", "dev": true, "dependencies": { "postcss-scss": "^4.0.2", - "stylelint-config-recommended": "^6.0.0", + "stylelint-config-recommended": "^7.0.0", "stylelint-scss": "^4.0.0" }, "peerDependencies": { - "stylelint": "^14.0.0" + "stylelint": "^14.4.0" } }, "node_modules/stylelint-order": { @@ -8489,9 +8491,9 @@ } }, "node_modules/stylelint-scss": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.0.1.tgz", - "integrity": "sha512-Ea+KY7ZFsDhU6Ne9r84y7NvFSNA843w352MSdQeDmklar0pDbeQj9flKrVAuDIlK0pDDdhFtgBl/N0FrtWHq0g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.2.0.tgz", + "integrity": "sha512-HHHMVKJJ5RM9pPIbgJ/XA67h9H0407G68Rm69H4fzFbFkyDMcTV1Byep3qdze5+fJ3c0U7mJrbj6S0Fg072uZA==", "dev": true, "dependencies": { "lodash": "^4.17.21", @@ -8501,7 +8503,7 @@ "postcss-value-parser": "^4.1.0" }, "peerDependencies": { - "stylelint": "^14.0.0" + "stylelint": "^14.5.1" } }, "node_modules/stylelint/node_modules/balanced-match": { @@ -8511,9 +8513,9 @@ "dev": true }, "node_modules/stylelint/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -8595,6 +8597,19 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", @@ -8652,9 +8667,9 @@ "dev": true }, "node_modules/table": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.5.tgz", - "integrity": "sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -8668,47 +8683,40 @@ } }, "node_modules/tempusdominus-bootstrap-4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.1.2.tgz", - "integrity": "sha512-ksD8qc4wOJeE19wvryXmEpRzMUSZu4wSOdG6zKSn8l4ccad16249KOX1j0CccyZpuuES/n4FLqLAUB+Dd1LTBA==", + "version": "5.39.2", + "resolved": "https://registry.npmjs.org/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.39.2.tgz", + "integrity": "sha512-8Au4miSAsMGdsElPg87EUmsN7aGJFaRA5Y8Ale7dDTfhhnQL1Za53LclIJkq+t/7NO5+Ufr1jY7tmEPvWGHaVg==", "dev": true, "dependencies": { - "bootstrap": ">=4.1.2", - "jquery": "^3.0", - "moment": "^2.22.2", - "moment-timezone": "^0.5.11", - "popper.js": "^1.14.3" + "bootstrap": "^4.6.1", + "jquery": "^3.6.0", + "moment": "^2.29.2", + "moment-timezone": "^0.5.34", + "popper.js": "^1.16.1" }, "peerDependencies": { - "bootstrap": ">=4.1.2", - "jquery": "^3.0", - "moment": "^2.17", - "moment-timezone": "^0.5.11", - "popper.js": "^1.14.3", - "tempusdominus-core": "5.0.3" + "bootstrap": ">=4.5.2", + "jquery": "^3.5.1", + "moment": "^2.29.0", + "moment-timezone": "^0.5.31", + "popper.js": "^1.16.1", + "tempusdominus-core": "5.19.3" } }, "node_modules/tempusdominus-core": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.0.3.tgz", - "integrity": "sha512-52lClmU33gb6J6I/S9uGDrgQwccq3Yw9SlZerTgGLOzOB3Sc9pgIVBirfPMsMcx8nPsg6mA5ItFAH/5BZiQThg==", + "version": "5.19.3", + "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.19.3.tgz", + "integrity": "sha512-WXBVXcBG/hErB6u9gdUs+vzANvCU1kd1ykzL4kolPB3h1OEv20OKUW5qz1iynxyqRFPa1NWY9gwRu5d+MjXEuQ==", "dev": true, "dependencies": { - "jquery": "^3.0", - "moment": "^2.22.2", - "moment-timezone": "^0.4.0" - } - }, - "node_modules/tempusdominus-core/node_modules/moment-timezone": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", - "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=", - "dev": true, - "dependencies": { - "moment": ">= 2.6.0" + "jquery": "^3.6.0", + "moment": "~2.29.2", + "moment-timezone": "^0.5.34" }, - "engines": { - "node": "*" + "peerDependencies": { + "jquery": "^3.0", + "moment": "^2.29.2", + "moment-timezone": "^0.5.0" } }, "node_modules/through2": { @@ -8988,12 +8996,6 @@ "topoquantize": "bin/topoquantize" } }, - "node_modules/transfob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/transfob/-/transfob-1.0.0.tgz", - "integrity": "sha1-x/wnpbVDCtSGJnrmZtkj90oKsyA=", - "dev": true - }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -9055,15 +9057,6 @@ "dup": "^1.0.0" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/uglify-js": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", @@ -9692,15 +9685,16 @@ "dev": true }, "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/xtend": { @@ -10146,6 +10140,27 @@ "pick-by-alias": "^1.2.0" } }, + "@ronilaukkarinen/gulp-stylelint": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@ronilaukkarinen/gulp-stylelint/-/gulp-stylelint-14.0.6.tgz", + "integrity": "sha512-MqN6esUpq7IZNvy2mH7FcH0HUQHpXj+SGyOGGdxO6OGLhnUUCOrGcwuu9EG6cN3VKuIVqF5/HAAuedSJIb6rMw==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "fancy-log": "^1.3.3", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "@turf/area": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", @@ -10238,9 +10253,9 @@ } }, "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -11165,6 +11180,12 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, + "colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "dev": true + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -11328,6 +11349,12 @@ "integrity": "sha1-m8BGcayFvHJLV07106yWsNYE/Zc=", "dev": true }, + "css-functions-list": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.0.1.tgz", + "integrity": "sha512-PriDuifDt4u4rkDgnqRCLnjfMatufLmWNfQnGCq34xZwpY3oabwhB9SqRBmuvWUgndbemCFlKqg+nO7C2q0SBw==", + "dev": true + }, "css-global-keywords": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", @@ -11592,9 +11619,9 @@ "dev": true }, "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.0.tgz", + "integrity": "sha512-OpcRktOt7G7HBfyxP0srBH4Djg4824EQORX8E1qvIhIzthNNArxxhrB/Mm7dRMiLi1nvFyUpDhzD2cTtbBhV8A==", "dev": true, "requires": { "globby": "^11.0.1", @@ -12025,9 +12052,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -12679,16 +12706,16 @@ } }, "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -13141,17 +13168,16 @@ "dev": true }, "gulp-sass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.0.0.tgz", - "integrity": "sha512-J0aH0/2N4+2szGCeut0ktGHK0Wg8L9uWivuigrl7xv+nhxozBQRAKLrhnDDaTa3FeUWYtgT8w4RlgdhRy5v16w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.1.0.tgz", + "integrity": "sha512-7VT0uaF+VZCmkNBglfe1b34bxn/AfcssquLKVDYnCDJ3xNBaW7cUuI3p3BQmoKcoKFrs9jdzUxyb+u+NGfL4OQ==", "dev": true, "requires": { - "chalk": "^4.1.1", - "lodash": "^4.17.20", + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.0.0", "plugin-error": "^1.0.1", "replace-ext": "^2.0.0", - "strip-ansi": "^6.0.0", - "transfob": "^1.0.0", + "strip-ansi": "^6.0.1", "vinyl-sourcemaps-apply": "^0.2.1" } }, @@ -13189,48 +13215,6 @@ "plugin-error": "^1.0.1" } }, - "gulp-stylelint": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/gulp-stylelint/-/gulp-stylelint-13.0.0.tgz", - "integrity": "sha512-qFWBXnYDsGy6ttzqptctMZjJhhGc0FdFE+UNPlj/5fTyuUo5mfxcc7pzN4hIJnvB79BO1WikLtdtXuC/G2AhGA==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "fancy-log": "^1.3.3", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "strip-ansi": "^6.0.0", - "through2": "^3.0.1" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - } - } - }, "gulp-uglify": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", @@ -13519,9 +13503,9 @@ "dev": true }, "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true }, "iconv-lite": { @@ -13540,9 +13524,9 @@ "dev": true }, "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "image-palette": { @@ -13899,12 +13883,6 @@ "integrity": "sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA=", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -14005,9 +13983,9 @@ "dev": true }, "known-css-properties": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.23.0.tgz", - "integrity": "sha512-h9ivI88e1lFNmTT4HovBN33Ysn0OIJG7IPG2mkpx2uniQXFWqo35QdiX7w0TovlUFXfW8aPFblP5/q0jlOr2sA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz", + "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==", "dev": true }, "last-run": { @@ -14183,6 +14161,12 @@ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "lodash.escape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", @@ -14547,13 +14531,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "dependencies": { "braces": { @@ -14607,9 +14591,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minimist-options": { @@ -14662,9 +14646,9 @@ } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", "dev": true }, "moment-timezone": { @@ -14752,9 +14736,9 @@ "optional": true }, "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true }, "nanomatch": { @@ -14903,12 +14887,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", - "dev": true - }, "normalize-svg-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", @@ -15276,9 +15254,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { @@ -15326,9 +15304,9 @@ } }, "plotly.js": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.8.0.tgz", - "integrity": "sha512-bYuLdTlQEWMs/u3nNqV/jwERj9tw8qMDKBV8NBP1BucfapLoYIM9w4ARc3W9m93r6OYvP5I6ykUztiDmDcvA9Q==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.12.1.tgz", + "integrity": "sha512-XbZ3w3jSl+ihZPMXWwblmjinqbzdd+vT+3XKZpyffxmlMmTp/3vY1ewpQDuNyufUoiT0o0ekCqa80Qlzi7jwlA==", "dev": true, "requires": { "@plotly/d3": "3.8.0", @@ -15365,8 +15343,8 @@ "native-promise-only": "^0.8.1", "parse-svg-path": "^0.1.2", "polybooljs": "^1.2.0", - "probe-image-size": "^7.2.2", - "regl": "^2.1.0", + "probe-image-size": "^7.2.3", + "regl": "npm:@plotly/regl@^2.1.2", "regl-error2d": "^2.0.12", "regl-line2d": "^3.1.2", "regl-scatter2d": "^3.2.8", @@ -15381,6 +15359,12 @@ "world-calendars": "^1.0.3" }, "dependencies": { + "regl": { + "version": "npm:@plotly/regl@2.1.2", + "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", + "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==", + "dev": true + }, "to-px": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", @@ -15453,14 +15437,14 @@ "dev": true }, "postcss": { - "version": "8.3.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", - "integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "dev": true, "requires": { - "nanoid": "^3.1.30", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", - "source-map-js": "^0.6.2" + "source-map-js": "^1.0.2" } }, "postcss-media-query-parser": { @@ -15490,9 +15474,9 @@ "requires": {} }, "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -15507,9 +15491,9 @@ "requires": {} }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "potpack": { @@ -15531,9 +15515,9 @@ "dev": true }, "probe-image-size": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.2.tgz", - "integrity": "sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", "dev": true, "requires": { "lodash.merge": "^4.6.2", @@ -16229,9 +16213,9 @@ "dev": true }, "sass": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.0.tgz", - "integrity": "sha512-ONy5bjppoohtNkFJRqdz1gscXamMzN3wQy1YH9qO2FiNpgjLhpz/IPRGg0PpCjyz/pWfCOaNEaiEGCcjOFAjqw==", + "version": "1.52.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz", + "integrity": "sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -16382,9 +16366,9 @@ "dev": true }, "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "signum": { @@ -16539,9 +16523,9 @@ "dev": true }, "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, "source-map-resolve": { @@ -16796,49 +16780,51 @@ "dev": true }, "stylelint": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.1.0.tgz", - "integrity": "sha512-IedkssuNVA11+v++2PIV2OHOU5A3SfRcXVi56vZVSsMhGrgtwmmit69jeM+08/Tun5DTBe7BuH1Zp1mMLmtKLA==", + "version": "14.8.3", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.8.3.tgz", + "integrity": "sha512-aLpskXwSgFEBYbFRKA/BfuyYMGuXNtn2t5GqoffNPSezvw97x/vVNWcZNF0+cwt+LBjfvyq9/MRE3OjInGRgNA==", "dev": true, "requires": { "balanced-match": "^2.0.0", + "colord": "^2.9.2", "cosmiconfig": "^7.0.1", - "debug": "^4.3.2", + "css-functions-list": "^3.0.1", + "debug": "^4.3.4", "execall": "^2.0.0", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "fastest-levenshtein": "^1.0.12", "file-entry-cache": "^6.0.1", "get-stdin": "^8.0.0", "global-modules": "^2.0.0", - "globby": "^11.0.4", + "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.9", + "html-tags": "^3.2.0", + "ignore": "^5.2.0", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.23.0", + "known-css-properties": "^0.25.0", "mathml-tag-names": "^2.1.3", "meow": "^9.0.0", - "micromatch": "^4.0.4", + "micromatch": "^4.0.5", "normalize-path": "^3.0.0", - "normalize-selector": "^0.2.0", "picocolors": "^1.0.0", - "postcss": "^8.3.11", + "postcss": "^8.4.13", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.6", - "postcss-value-parser": "^4.1.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "specificity": "^0.4.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "style-search": "^0.1.0", + "supports-hyperlinks": "^2.2.0", "svg-tags": "^1.0.0", - "table": "^6.7.3", + "table": "^6.8.0", "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^3.0.3" + "write-file-atomic": "^4.0.1" }, "dependencies": { "balanced-match": { @@ -16848,9 +16834,9 @@ "dev": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -16891,20 +16877,20 @@ } }, "stylelint-config-recommended": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz", - "integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz", + "integrity": "sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==", "dev": true, "requires": {} }, "stylelint-config-recommended-scss": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-5.0.2.tgz", - "integrity": "sha512-b14BSZjcwW0hqbzm9b0S/ScN2+3CO3O4vcMNOw2KGf8lfVSwJ4p5TbNEXKwKl1+0FMtgRXZj6DqVUe/7nGnuBg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-6.0.0.tgz", + "integrity": "sha512-6QOe2/OzXV2AP5FE12A7+qtKdZik7Saf42SMMl84ksVBBPpTdrV+9HaCbPYiRMiwELY9hXCVdH4wlJ+YJb5eig==", "dev": true, "requires": { "postcss-scss": "^4.0.2", - "stylelint-config-recommended": "^6.0.0", + "stylelint-config-recommended": "^7.0.0", "stylelint-scss": "^4.0.0" } }, @@ -16919,9 +16905,9 @@ } }, "stylelint-scss": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.0.1.tgz", - "integrity": "sha512-Ea+KY7ZFsDhU6Ne9r84y7NvFSNA843w352MSdQeDmklar0pDbeQj9flKrVAuDIlK0pDDdhFtgBl/N0FrtWHq0g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.2.0.tgz", + "integrity": "sha512-HHHMVKJJ5RM9pPIbgJ/XA67h9H0407G68Rm69H4fzFbFkyDMcTV1Byep3qdze5+fJ3c0U7mJrbj6S0Fg072uZA==", "dev": true, "requires": { "lodash": "^4.17.21", @@ -16955,6 +16941,16 @@ "has-flag": "^4.0.0" } }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, "sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", @@ -17014,9 +17010,9 @@ "dev": true }, "table": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.5.tgz", - "integrity": "sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -17027,38 +17023,27 @@ } }, "tempusdominus-bootstrap-4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.1.2.tgz", - "integrity": "sha512-ksD8qc4wOJeE19wvryXmEpRzMUSZu4wSOdG6zKSn8l4ccad16249KOX1j0CccyZpuuES/n4FLqLAUB+Dd1LTBA==", + "version": "5.39.2", + "resolved": "https://registry.npmjs.org/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.39.2.tgz", + "integrity": "sha512-8Au4miSAsMGdsElPg87EUmsN7aGJFaRA5Y8Ale7dDTfhhnQL1Za53LclIJkq+t/7NO5+Ufr1jY7tmEPvWGHaVg==", "dev": true, "requires": { - "bootstrap": ">=4.1.2", - "jquery": "^3.0", - "moment": "^2.22.2", - "moment-timezone": "^0.5.11", - "popper.js": "^1.14.3" + "bootstrap": "^4.6.1", + "jquery": "^3.6.0", + "moment": "^2.29.2", + "moment-timezone": "^0.5.34", + "popper.js": "^1.16.1" } }, "tempusdominus-core": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.0.3.tgz", - "integrity": "sha512-52lClmU33gb6J6I/S9uGDrgQwccq3Yw9SlZerTgGLOzOB3Sc9pgIVBirfPMsMcx8nPsg6mA5ItFAH/5BZiQThg==", + "version": "5.19.3", + "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.19.3.tgz", + "integrity": "sha512-WXBVXcBG/hErB6u9gdUs+vzANvCU1kd1ykzL4kolPB3h1OEv20OKUW5qz1iynxyqRFPa1NWY9gwRu5d+MjXEuQ==", "dev": true, "requires": { - "jquery": "^3.0", - "moment": "^2.22.2", - "moment-timezone": "^0.4.0" - }, - "dependencies": { - "moment-timezone": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", - "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=", - "dev": true, - "requires": { - "moment": ">= 2.6.0" - } - } + "jquery": "^3.6.0", + "moment": "~2.29.2", + "moment-timezone": "^0.5.34" } }, "through2": { @@ -17289,12 +17274,6 @@ "commander": "2" } }, - "transfob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/transfob/-/transfob-1.0.0.tgz", - "integrity": "sha1-x/wnpbVDCtSGJnrmZtkj90oKsyA=", - "dev": true - }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -17344,15 +17323,6 @@ "dup": "^1.0.0" } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, "uglify-js": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", @@ -17907,15 +17877,13 @@ "dev": true }, "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" } }, "xtend": { diff --git a/package.json b/package.json index 545bec27..68dcecc5 100644 --- a/package.json +++ b/package.json @@ -7,32 +7,32 @@ "url": "https://github.com/babybuddy/babybuddy.git" }, "devDependencies": { - "bootstrap": "4.6.1", - "del": "^6.0.0", + "@ronilaukkarinen/gulp-stylelint": "^14.0.6", + "bootstrap": "^4.6.1", + "del": "^6.1.0", "gulp": "^4.0.2", "gulp-concat": "^2.6.1", "gulp-csso": "^4.0.1", "gulp-flatten": "^0.4.0", "gulp-fontello": "^0.5.2", "gulp-remove-sourcemaps": "^1.0.4", - "gulp-sass": "^5.0.0", + "gulp-sass": "^5.1.0", "gulp-sass-glob": "^1.1.0", "gulp-spawn": "^1.0.0", - "gulp-stylelint": "^13.0.0", "gulp-uglify": "^3.0.2", "jquery": "^3.6.0", - "moment": "^2.29.1", + "moment": "^2.29.3", "moment-timezone": "^0.5.34", - "plotly.js": "^2.8.0", + "plotly.js": "^2.12.1", "popper.js": "^1.16.1", "pulltorefreshjs": "^0.1.22", "pump": "^3.0.0", - "sass": "^1.45.0", - "stylelint": "^14.1.0", - "stylelint-config-recommended-scss": "^5.0.2", + "sass": "^1.52.1", + "stylelint": "^14.8.3", + "stylelint-config-recommended-scss": "^6.0.0", "stylelint-order": "^5.0.0", - "stylelint-scss": "^4.0.1", - "tempusdominus-bootstrap-4": "5.1.2", - "tempusdominus-core": "5.0.3" + "stylelint-scss": "^4.2.0", + "tempusdominus-bootstrap-4": "5.39.2", + "tempusdominus-core": "5.19.3" } } diff --git a/static/babybuddy/css/app.1b0342ed7402.css.gz b/static/babybuddy/css/app.1b0342ed7402.css.gz deleted file mode 100644 index bcb9cb20..00000000 Binary files a/static/babybuddy/css/app.1b0342ed7402.css.gz and /dev/null differ diff --git a/static/babybuddy/css/app.1b0342ed7402.css b/static/babybuddy/css/app.af8edf6b6560.css similarity index 97% rename from static/babybuddy/css/app.1b0342ed7402.css rename to static/babybuddy/css/app.af8edf6b6560.css index cc51a209..89e00258 100644 --- a/static/babybuddy/css/app.1b0342ed7402.css +++ b/static/babybuddy/css/app.af8edf6b6560.css @@ -10233,6 +10233,29 @@ h3 { border-color: #343a40; } } +body.tempusdominus-bootstrap-datetimepicker-widget-day-click, +body.tempusdominus-bootstrap-datetimepicker-widget-day-click * { + cursor: pointer !important; +} + +body.tempusdominus-bootstrap-datetimepicker-widget-day-click { + position: relative !important; +} + +.tempusdominus-bootstrap-datetimepicker-widget-day-click-glass-panel { + position: absolute; + z-index: 999999999999; + top: 0; + left: 0; + right: 0; + bottom: 0; + cursor: pointer !important; +} + +.bootstrap-datetimepicker-widget .datepicker-days tbody td { + cursor: pointer; +} + .bootstrap-datetimepicker-widget { list-style: none; } @@ -10242,6 +10265,15 @@ h3 { padding: 4px; width: 14rem; } +.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons { + width: 16rem; +} +.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks { + width: 16rem; +} +.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons { + width: 17rem; +} @media (min-width: 576px) { .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { width: 38em; @@ -10321,6 +10353,12 @@ h3 { .bootstrap-datetimepicker-widget button[data-action] { padding: 6px; } +.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod] { + text-align: center; + font-family: Arial, sans-serif, -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + width: 38px; + height: 38px; +} .bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after { content: "Increment Hours"; } @@ -10366,6 +10404,10 @@ h3 { height: 2.5em; width: 100%; } +.bootstrap-datetimepicker-widget .picker-switch.picker-switch-with-feathers-icons td span { + line-height: 2.8; + height: 2.8em; +} .bootstrap-datetimepicker-widget table { width: 100%; margin: 0; @@ -10409,6 +10451,7 @@ h3 { height: 20px; line-height: 20px; color: #6c757d; + cursor: default; } .bootstrap-datetimepicker-widget table td.day { height: 20px; @@ -10454,7 +10497,8 @@ h3 { width: 54px; height: 54px; line-height: 54px; - margin: 2px 1.5px; + margin-top: 2px; + margin-bottom: 2px; cursor: pointer; border-radius: 0.25rem; } @@ -10478,6 +10522,28 @@ h3 { height: 27px; line-height: 27px; } +.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn { + color: #007bff; + color: var(--blue, #007bff); +} +.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn:hover { + color: #0056b3; +} +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds], +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds], +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds], +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod] { + pointer-events: none; + cursor: default; +} +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second:hover, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds]:hover, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds]:hover, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds]:hover, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod]:hover { + background: none; +} .input-group [data-toggle=datetimepicker] { cursor: pointer; diff --git a/static/babybuddy/css/app.af8edf6b6560.css.gz b/static/babybuddy/css/app.af8edf6b6560.css.gz new file mode 100644 index 00000000..92e3036a Binary files /dev/null and b/static/babybuddy/css/app.af8edf6b6560.css.gz differ diff --git a/static/babybuddy/css/app.css b/static/babybuddy/css/app.css index 739569df..acf8a9e3 100644 --- a/static/babybuddy/css/app.css +++ b/static/babybuddy/css/app.css @@ -10233,6 +10233,29 @@ h3 { border-color: #343a40; } } +body.tempusdominus-bootstrap-datetimepicker-widget-day-click, +body.tempusdominus-bootstrap-datetimepicker-widget-day-click * { + cursor: pointer !important; +} + +body.tempusdominus-bootstrap-datetimepicker-widget-day-click { + position: relative !important; +} + +.tempusdominus-bootstrap-datetimepicker-widget-day-click-glass-panel { + position: absolute; + z-index: 999999999999; + top: 0; + left: 0; + right: 0; + bottom: 0; + cursor: pointer !important; +} + +.bootstrap-datetimepicker-widget .datepicker-days tbody td { + cursor: pointer; +} + .bootstrap-datetimepicker-widget { list-style: none; } @@ -10242,6 +10265,15 @@ h3 { padding: 4px; width: 14rem; } +.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons { + width: 16rem; +} +.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks { + width: 16rem; +} +.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons { + width: 17rem; +} @media (min-width: 576px) { .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { width: 38em; @@ -10321,6 +10353,12 @@ h3 { .bootstrap-datetimepicker-widget button[data-action] { padding: 6px; } +.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod] { + text-align: center; + font-family: Arial, sans-serif, -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + width: 38px; + height: 38px; +} .bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after { content: "Increment Hours"; } @@ -10366,6 +10404,10 @@ h3 { height: 2.5em; width: 100%; } +.bootstrap-datetimepicker-widget .picker-switch.picker-switch-with-feathers-icons td span { + line-height: 2.8; + height: 2.8em; +} .bootstrap-datetimepicker-widget table { width: 100%; margin: 0; @@ -10409,6 +10451,7 @@ h3 { height: 20px; line-height: 20px; color: #6c757d; + cursor: default; } .bootstrap-datetimepicker-widget table td.day { height: 20px; @@ -10454,7 +10497,8 @@ h3 { width: 54px; height: 54px; line-height: 54px; - margin: 2px 1.5px; + margin-top: 2px; + margin-bottom: 2px; cursor: pointer; border-radius: 0.25rem; } @@ -10478,6 +10522,28 @@ h3 { height: 27px; line-height: 27px; } +.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn { + color: #007bff; + color: var(--blue, #007bff); +} +.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn:hover { + color: #0056b3; +} +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds], +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds], +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes], .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds], +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod] { + pointer-events: none; + cursor: default; +} +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second:hover, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds]:hover, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds]:hover, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes]:hover, .bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds]:hover, +.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod]:hover { + background: none; +} .input-group [data-toggle=datetimepicker] { cursor: pointer; diff --git a/static/babybuddy/css/app.css.gz b/static/babybuddy/css/app.css.gz index ae79b14a..b3619ad7 100644 Binary files a/static/babybuddy/css/app.css.gz and b/static/babybuddy/css/app.css.gz differ diff --git a/static/babybuddy/js/graph.dd89fe4e217b.js b/static/babybuddy/js/graph.81d7e15ea5a8.js similarity index 98% rename from static/babybuddy/js/graph.dd89fe4e217b.js rename to static/babybuddy/js/graph.81d7e15ea5a8.js index ae020302..3157b216 100644 --- a/static/babybuddy/js/graph.dd89fe4e217b.js +++ b/static/babybuddy/js/graph.81d7e15ea5a8.js @@ -1,6 +1,6 @@ /** -* plotly.js (cartesian) v2.8.0 -* Copyright 2012-2021, Plotly, Inc. +* plotly.js (cartesian) v2.12.1 +* Copyright 2012-2022, Plotly, Inc. * All rights reserved. * Licensed under the MIT license */ @@ -51,10 +51,10 @@ var rules = { "X .modebar.vertical .modebar-group .modebar-btn": "display:block;text-align:center;", "X [data-title]:before,X [data-title]:after": "position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;", "X [data-title]:hover:before,X [data-title]:hover:after": "display:block;opacity:1;", - "X [data-title]:before": "content:\"\";position:absolute;background:transparent;border:6px solid transparent;z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;", + "X [data-title]:before": "content:\"\";position:absolute;background:rgba(0,0,0,0);border:6px solid rgba(0,0,0,0);z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;", "X [data-title]:after": "content:attr(data-title);background:#69738a;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;", "X .vertical [data-title]:before,X .vertical [data-title]:after": "top:0%;right:200%;", - "X .vertical [data-title]:before": "border:6px solid transparent;border-left-color:#69738a;margin-top:8px;margin-right:-30px;", + "X .vertical [data-title]:before": "border:6px solid rgba(0,0,0,0);border-left-color:#69738a;margin-top:8px;margin-right:-30px;", "X .select-outline": "fill:none;stroke-width:1;shape-rendering:crispEdges;", "X .select-outline-1": "stroke:#fff;", "X .select-outline-2": "stroke:#000;stroke-dasharray:2px 2px;", @@ -15724,7 +15724,15 @@ exports.readUInt32BE = function (data, offset) { function ProbeError(message, code, statusCode) { Error.call(this); - Error.captureStackTrace(this, this.constructor); + + // Include stack trace in error object + if (Error.captureStackTrace) { + // Chrome and NodeJS + Error.captureStackTrace(this, this.constructor); + } else { + // FF, IE 10+ and Safari 6+. Fallback for others + this.stack = (new Error()).stack || ''; + } this.name = this.constructor.name; @@ -30822,6 +30830,7 @@ module.exports = overrideAll({ ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, + ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, tickfont: fontAttrs({ }), @@ -31912,6 +31921,7 @@ function mockColorBarAxis(gd, opts, zrange) { showticklabels: opts.showticklabels, ticklabelposition: opts.ticklabelposition, ticklabeloverflow: opts.ticklabeloverflow, + ticklabelstep: opts.ticklabelstep, tickfont: opts.tickfont, tickangle: opts.tickangle, tickformat: opts.tickformat, @@ -32064,7 +32074,7 @@ module.exports = function colorScaleAttrs(context, opts) { } var effectDesc = onlyIfNumerical ? - ' Has an effect only if ' + colorAttrFull + 'is set to a numerical array.' : + ' Has an effect only if ' + colorAttrFull + ' is set to a numerical array.' : ''; var auto = cLetter + 'auto'; @@ -33650,24 +33660,42 @@ drawing.dashStyle = function(dash, lineWidth) { return dash; }; +function setFillStyle(sel, trace, gd) { + var markerPattern = trace.fillpattern; + var patternShape = markerPattern && drawing.getPatternAttr(markerPattern.shape, 0, ''); + if(patternShape) { + var patternBGColor = drawing.getPatternAttr(markerPattern.bgcolor, 0, null); + var patternFGColor = drawing.getPatternAttr(markerPattern.fgcolor, 0, null); + var patternFGOpacity = markerPattern.fgopacity; + var patternSize = drawing.getPatternAttr(markerPattern.size, 0, 8); + var patternSolidity = drawing.getPatternAttr(markerPattern.solidity, 0, 0.3); + var patternID = trace.uid; + drawing.pattern(sel, 'point', gd, patternID, + patternShape, patternSize, patternSolidity, + undefined, markerPattern.fillmode, + patternBGColor, patternFGColor, patternFGOpacity + ); + } else if(trace.fillcolor) { + sel.call(Color.fill, trace.fillcolor); + } +} + // Same as fillGroupStyle, except in this case the selection may be a transition -drawing.singleFillStyle = function(sel) { +drawing.singleFillStyle = function(sel, gd) { var node = d3.select(sel.node()); var data = node.data(); - var fillcolor = (((data[0] || [])[0] || {}).trace || {}).fillcolor; - if(fillcolor) { - sel.call(Color.fill, fillcolor); - } + var trace = ((data[0] || [])[0] || {}).trace || {}; + setFillStyle(sel, trace, gd); }; -drawing.fillGroupStyle = function(s) { +drawing.fillGroupStyle = function(s, gd) { s.style('stroke-width', 0) .each(function(d) { var shape = d3.select(this); // N.B. 'd' won't be a calcdata item when // fill !== 'none' on a segment-less and marker-less trace if(d[0].trace) { - shape.call(Color.fill, d[0].trace.fillcolor); + setFillStyle(shape, d[0].trace, gd); } }); }; @@ -33820,12 +33848,7 @@ drawing.gradient = function(sel, gd, gradientID, type, colorscale, prop) { sel.style(prop, getFullUrl(fullID, gd)) .style(prop + '-opacity', null); - var className2query = function(s) { - return '.' + s.attr('class').replace(/\s/g, '.'); - }; - var k = className2query(d3.select(sel.node().parentNode)) + - '>' + className2query(sel); - fullLayout._gradientUrlQueryParts[k] = 1; + sel.classed('gradient_filled', true); }; /** @@ -34032,11 +34055,6 @@ drawing.pattern = function(sel, calledBy, gd, patternID, shape, size, solidity, .style('fill-opacity', null); sel.classed('pattern_filled', true); - var className2query = function(s) { - return '.' + s.attr('class').replace(/\s/g, '.'); - }; - var k = className2query(d3.select(sel.node().parentNode)) + '>.pattern_filled'; - fullLayout._patternUrlQueryParts[k] = 1; }; /* @@ -34052,9 +34070,7 @@ drawing.initGradients = function(gd) { var gradientsGroup = Lib.ensureSingle(fullLayout._defs, 'g', 'gradients'); gradientsGroup.selectAll('linearGradient,radialGradient').remove(); - // initialize stash of query parts filled in Drawing.gradient, - // used to fix URL strings during image exports - fullLayout._gradientUrlQueryParts = {}; + d3.select(gd).selectAll('.gradient_filled').classed('gradient_filled', false); }; drawing.initPatterns = function(gd) { @@ -34063,9 +34079,7 @@ drawing.initPatterns = function(gd) { var patternsGroup = Lib.ensureSingle(fullLayout._defs, 'g', 'patterns'); patternsGroup.selectAll('pattern').remove(); - // initialize stash of query parts filled in Drawing.pattern, - // used to fix URL strings during image exports - fullLayout._patternUrlQueryParts = {}; + d3.select(gd).selectAll('.pattern_filled').classed('pattern_filled', false); }; drawing.getPatternAttr = function(mp, i, dflt) { @@ -39532,7 +39546,7 @@ module.exports = function draw(gd) { canvas.width = this.width; canvas.height = this.height; - var ctx = canvas.getContext('2d'); + var ctx = canvas.getContext('2d', {willReadFrequently: true}); ctx.drawImage(this, 0, 0); var dataURL = canvas.toDataURL('image/png'); @@ -40718,7 +40732,6 @@ function computeLegendDimensions(gd, groups, traces, legendObj) { offsetY += h; maxWidthInGroup = Math.max(maxWidthInGroup, textGap + w); }); - maxGroupHeightInRow = Math.max(maxGroupHeightInRow, offsetY); var next = maxWidthInGroup + itemGap; @@ -40734,6 +40747,8 @@ function computeLegendDimensions(gd, groups, traces, legendObj) { groupOffsetX = 0; groupOffsetY += maxGroupHeightInRow + traceGroupGap; maxGroupHeightInRow = offsetY; + } else { + maxGroupHeightInRow = Math.max(maxGroupHeightInRow, offsetY); } Drawing.setTranslate(this, groupOffsetX, groupOffsetY); @@ -41401,12 +41416,16 @@ module.exports = function style(s, gd, legend) { var colorscale = cOpts.colorscale; var reversescale = cOpts.reversescale; - var fillGradient = function(s) { + var fillStyle = function(s) { if(s.size()) { - var gradientID = 'legendfill-' + trace.uid; - Drawing.gradient(s, gd, gradientID, - getGradientDirection(reversescale), - colorscale, 'fill'); + if(showFill) { + Drawing.fillGroupStyle(s, gd); + } else { + var gradientID = 'legendfill-' + trace.uid; + Drawing.gradient(s, gd, gradientID, + getGradientDirection(reversescale), + colorscale, 'fill'); + } } }; @@ -41435,7 +41454,7 @@ module.exports = function style(s, gd, legend) { fill.enter().append('path').classed('js-fill', true); fill.exit().remove(); fill.attr('d', pathStart + 'h' + itemWidth + 'v6h-' + itemWidth + 'z') - .call(showFill ? Drawing.fillGroupStyle : fillGradient); + .call(fillStyle); if(showLine || showGradientLine) { var lw = boundLineWidth(undefined, trace.line, MAX_LINE_WIDTH, CST_LINE_WIDTH); @@ -42863,6 +42882,7 @@ var isUnifiedHover = _dereq_('../fx/helpers').isUnifiedHover; var createModeBar = _dereq_('./modebar'); var modeBarButtons = _dereq_('./buttons'); var DRAW_MODES = _dereq_('./constants').DRAW_MODES; +var extendDeep = _dereq_('../../lib').extendDeep; /** * ModeBar wrapper around 'create' and 'update', @@ -43185,7 +43205,9 @@ function appendButtonsToGroups(groups, buttons) { } // fill in custom buttons referring to default mode bar buttons -function fillCustomButton(customButtons) { +function fillCustomButton(originalModeBarButtons) { + var customButtons = extendDeep([], originalModeBarButtons); + for(var i = 0; i < customButtons.length; i++) { var buttonGroup = customButtons[i]; @@ -43208,7 +43230,7 @@ function fillCustomButton(customButtons) { return customButtons; } -},{"../../plots/cartesian/axis_ids":338,"../../registry":378,"../../traces/scatter/subtypes":525,"../fx/helpers":193,"./buttons":217,"./constants":218,"./modebar":222}],222:[function(_dereq_,module,exports){ +},{"../../lib":287,"../../plots/cartesian/axis_ids":338,"../../registry":378,"../../traces/scatter/subtypes":525,"../fx/helpers":193,"./buttons":217,"./constants":218,"./modebar":222}],222:[function(_dereq_,module,exports){ 'use strict'; var d3 = _dereq_('@plotly/d3'); @@ -43216,6 +43238,8 @@ var isNumeric = _dereq_('fast-isnumeric'); var Lib = _dereq_('../../lib'); var Icons = _dereq_('../../fonts/ploticon'); +var version = _dereq_('../../version').version; + var Parser = new DOMParser(); /** @@ -43494,6 +43518,10 @@ proto.hasButtons = function(buttons) { return true; }; +function jsVersion(str) { + return str + ' (v' + version + ')'; +} + /** * @return {HTMLDivElement} The logo image wrapped in a group */ @@ -43503,7 +43531,7 @@ proto.getLogo = function() { a.href = 'https://plotly.com/'; a.target = '_blank'; - a.setAttribute('data-title', Lib._(this.graphInfo, 'Produced with Plotly')); + a.setAttribute('data-title', jsVersion(Lib._(this.graphInfo, 'Produced with Plotly.js'))); a.className = 'modebar-btn plotlyjsicon modebar-btn--logo'; a.appendChild(this.createIcon(Icons.newplotlylogo)); @@ -43545,7 +43573,7 @@ function createModeBar(gd, buttons) { module.exports = createModeBar; -},{"../../fonts/ploticon":270,"../../lib":287,"@plotly/d3":20,"fast-isnumeric":33}],223:[function(_dereq_,module,exports){ +},{"../../fonts/ploticon":270,"../../lib":287,"../../version":552,"@plotly/d3":20,"fast-isnumeric":33}],223:[function(_dereq_,module,exports){ 'use strict'; var fontAttrs = _dereq_('../../plots/font_attributes'); @@ -56056,6 +56084,7 @@ exports.convertToTspans = function(_context, gd, _callback) { // Until we get tex integrated more fully (so it can be used along with non-tex) // allow some elements to prohibit it by attaching 'data-notex' to the original var tex = (!_context.attr('data-notex')) && + gd && gd._context.typesetMath && (typeof MathJax !== 'undefined') && str.match(FIND_TEX); @@ -56210,70 +56239,154 @@ function cleanEscapesForTex(s) { .replace(GT_MATCH, '\\gt '); } +var inlineMath = [['$', '$'], ['\\(', '\\)']]; + function texToSVG(_texString, _config, _callback) { + var MathJaxVersion = parseInt( + (MathJax.version || '').split('.')[0] + ); + + if( + MathJaxVersion !== 2 && + MathJaxVersion !== 3 + ) { + Lib.warn('No MathJax version:', MathJax.version); + return; + } + var originalRenderer, originalConfig, originalProcessSectionDelay, tmpDiv; - MathJax.Hub.Queue( - function() { + var setConfig2 = function() { originalConfig = Lib.extendDeepAll({}, MathJax.Hub.config); originalProcessSectionDelay = MathJax.Hub.processSectionDelay; if(MathJax.Hub.processSectionDelay !== undefined) { - // MathJax 2.5+ + // MathJax 2.5+ but not 3+ MathJax.Hub.processSectionDelay = 0; } return MathJax.Hub.Config({ messageStyle: 'none', tex2jax: { - inlineMath: [['$', '$'], ['\\(', '\\)']] + inlineMath: inlineMath }, displayAlign: 'left', }); - }, - function() { - // Get original renderer + }; + + var setConfig3 = function() { + originalConfig = Lib.extendDeepAll({}, MathJax.config); + + if(!MathJax.config.tex) { + MathJax.config.tex = {}; + } + + MathJax.config.tex.inlineMath = inlineMath; + }; + + var setRenderer2 = function() { originalRenderer = MathJax.Hub.config.menuSettings.renderer; if(originalRenderer !== 'SVG') { return MathJax.Hub.setRenderer('SVG'); } - }, - function() { + }; + + var setRenderer3 = function() { + originalRenderer = MathJax.config.startup.output; + if(originalRenderer !== 'svg') { + MathJax.config.startup.output = 'svg'; + } + }; + + var initiateMathJax = function() { var randomID = 'math-output-' + Lib.randstr({}, 64); tmpDiv = d3.select('body').append('div') .attr({id: randomID}) - .style({visibility: 'hidden', position: 'absolute'}) - .style({'font-size': _config.fontSize + 'px'}) + .style({ + visibility: 'hidden', + position: 'absolute', + 'font-size': _config.fontSize + 'px' + }) .text(cleanEscapesForTex(_texString)); - return MathJax.Hub.Typeset(tmpDiv.node()); - }, - function() { - var glyphDefs = d3.select('body').select('#MathJax_SVG_glyphs'); + var tmpNode = tmpDiv.node(); - if(tmpDiv.select('.MathJax_SVG').empty() || !tmpDiv.select('svg').node()) { + return MathJaxVersion === 2 ? + MathJax.Hub.Typeset(tmpNode) : + MathJax.typeset([tmpNode]); + }; + + var finalizeMathJax = function() { + var sel = tmpDiv.select( + MathJaxVersion === 2 ? '.MathJax_SVG' : '.MathJax' + ); + + var node = !sel.empty() && tmpDiv.select('svg').node(); + if(!node) { Lib.log('There was an error in the tex syntax.', _texString); _callback(); } else { - var svgBBox = tmpDiv.select('svg').node().getBoundingClientRect(); - _callback(tmpDiv.select('.MathJax_SVG'), glyphDefs, svgBBox); + var nodeBBox = node.getBoundingClientRect(); + var glyphDefs; + if(MathJaxVersion === 2) { + glyphDefs = d3.select('body').select('#MathJax_SVG_glyphs'); + } else { + glyphDefs = sel.select('defs'); + } + _callback(sel, glyphDefs, nodeBBox); } tmpDiv.remove(); + }; + var resetRenderer2 = function() { if(originalRenderer !== 'SVG') { return MathJax.Hub.setRenderer(originalRenderer); } - }, - function() { + }; + + var resetRenderer3 = function() { + if(originalRenderer !== 'svg') { + MathJax.config.startup.output = originalRenderer; + } + }; + + var resetConfig2 = function() { if(originalProcessSectionDelay !== undefined) { MathJax.Hub.processSectionDelay = originalProcessSectionDelay; } return MathJax.Hub.Config(originalConfig); - }); + }; + + var resetConfig3 = function() { + MathJax.config = originalConfig; + }; + + if(MathJaxVersion === 2) { + MathJax.Hub.Queue( + setConfig2, + setRenderer2, + initiateMathJax, + finalizeMathJax, + resetRenderer2, + resetConfig2 + ); + } else if(MathJaxVersion === 3) { + setConfig3(); + setRenderer3(); + MathJax.startup.defaultReady(); + + MathJax.startup.promise.then(function() { + initiateMathJax(); + finalizeMathJax(); + + resetRenderer3(); + resetConfig3(); + }); + } } var TAG_STYLES = { @@ -60400,7 +60513,9 @@ function _relayout(gd, aobj) { if(parentFull.autorange) flags.calc = true; else flags.plot = true; } else { - if((fullLayout._has('scatter-like') && fullLayout._has('regl')) && + if(ai === 'dragmode' && ((vi === false && vOld !== false) || (vi !== false && vOld === false))) { + flags.plot = true; + } else if((fullLayout._has('scatter-like') && fullLayout._has('regl')) && (ai === 'dragmode' && (vi === 'lasso' || vi === 'select') && !(vOld === 'lasso' || vOld === 'select')) @@ -62093,6 +62208,11 @@ var configAttributes = { dflt: false, }, + typesetMath: { + valType: 'boolean', + dflt: true, + }, + plotlyServerURL: { valType: 'string', dflt: '', @@ -66171,6 +66291,7 @@ var BADNUM = constants.BADNUM; var ZERO_PATH = { K: 'zeroline' }; var GRID_PATH = { K: 'gridline', L: 'path' }; +var MINORGRID_PATH = { K: 'minor-gridline', L: 'path' }; var TICK_PATH = { K: 'tick', L: 'path' }; var TICK_TEXT = { K: 'tick', L: 'text' }; @@ -66675,13 +66796,113 @@ function autoShiftMonthBins(binStart, data, dtick, dataMin, calendar) { // Ticks and grids // ---------------------------------------------------- +// ensure we have minor tick0 and dtick calculated +axes.prepMinorTicks = function(mockAx, ax, opts) { + if(!ax.minor.dtick) { + delete mockAx.dtick; + var hasMajor = ax.dtick && isNumeric(ax._tmin); + var mockMinorRange; + if(hasMajor) { + var tick2 = axes.tickIncrement(ax._tmin, ax.dtick, true); + // mock range a tiny bit smaller than one major tick interval + mockMinorRange = [ax._tmin, tick2 * 0.99 + ax._tmin * 0.01]; + } else { + var rl = Lib.simpleMap(ax.range, ax.r2l); + // If we don't have a major dtick, the concept of minor ticks is a little + // ambiguous - just take a stab and say minor.nticks should span 1/5 the axis + mockMinorRange = [rl[0], 0.8 * rl[0] + 0.2 * rl[1]]; + } + mockAx.range = Lib.simpleMap(mockMinorRange, ax.l2r); + mockAx._isMinor = true; + + axes.prepTicks(mockAx, opts); + + if(hasMajor) { + var numericMajor = isNumeric(ax.dtick); + var numericMinor = isNumeric(mockAx.dtick); + var majorNum = numericMajor ? ax.dtick : +ax.dtick.substring(1); + var minorNum = numericMinor ? mockAx.dtick : +mockAx.dtick.substring(1); + if(numericMajor && numericMinor) { + if(!isMultiple(majorNum, minorNum)) { + // give up on minor ticks - outside the below exceptions, + // this can only happen if minor.nticks is smaller than two jumps + // in the auto-tick scale and the first jump is not an even multiple + // (5 -> 2 or for dates 3 ->2, 15 -> 10 etc) or if you provided + // an explicit dtick, in which case it's fine to give up, + // you can provide an explicit minor.dtick. + if((majorNum === 2 * ONEWEEK) && (minorNum === 3 * ONEDAY)) { + mockAx.dtick = ONEWEEK; + } else if(majorNum === ONEWEEK && !(ax._input.minor || {}).nticks) { + // minor.nticks defaults to 5, but in this one case we want 7, + // so the minor ticks show on all days of the week + mockAx.dtick = ONEDAY; + } else if(isClose(majorNum / minorNum, 2.5)) { + // 5*10^n -> 2*10^n and you've set nticks < 5 + // quarters are pretty common, we don't do this by default as it + // would add an extra digit to display, but minor has no labels + mockAx.dtick = majorNum / 2; + } else { + mockAx.dtick = majorNum; + } + } else if(majorNum === 2 * ONEWEEK && minorNum === 2 * ONEDAY) { + // this is a weird one: we don't want to automatically choose + // 2-day minor ticks for 2-week major, even though it IS an even multiple, + // because people would expect to see the weeks clearly + mockAx.dtick = ONEWEEK; + } + } else if(String(ax.dtick).charAt(0) === 'M') { + if(numericMinor) { + mockAx.dtick = 'M1'; + } else { + if(!isMultiple(majorNum, minorNum)) { + // unless you provided an explicit ax.dtick (in which case + // it's OK for us to give up, you can provide an explicit + // minor.dtick too), this can only happen with: + // minor.nticks < 3 and dtick === M3, or + // minor.nticks < 5 and dtick === 5 * 10^n years + // so in all cases we just give up. + mockAx.dtick = ax.dtick; + } else if((majorNum >= 12) && (minorNum === 2)) { + // another special carve-out: for year major ticks, don't show + // 2-month minor ticks, bump to quarters + mockAx.dtick = 'M3'; + } + } + } else if(String(mockAx.dtick).charAt(0) === 'L') { + if(String(ax.dtick).charAt(0) === 'L') { + if(!isMultiple(majorNum, minorNum)) { + mockAx.dtick = isClose(majorNum / minorNum, 2.5) ? (ax.dtick / 2) : ax.dtick; + } + } else { + mockAx.dtick = 'D1'; + } + } else if(mockAx.dtick === 'D2' && +ax.dtick > 1) { + // the D2 log axis tick spacing is confusing for unlabeled minor ticks if + // the major dtick is more than one order of magnitude. + mockAx.dtick = 1; + } + } + // put back the original range, to use to find the full set of minor ticks + mockAx.range = ax.range; + } + if(ax.minor._tick0Init === undefined) { + // ensure identical tick0 + mockAx.tick0 = ax.tick0; + } +}; + +function isMultiple(bigger, smaller) { + return Math.abs((bigger / smaller + 0.5) % 1 - 0.5) < 0.001; +} + +function isClose(a, b) { + return Math.abs((a / b) - 1) < 0.001; +} + // ensure we have tick0, dtick, and tick rounding calculated axes.prepTicks = function(ax, opts) { var rng = Lib.simpleMap(ax.range, ax.r2l, undefined, undefined, opts); - ax._dtickInit = ax.dtick; - ax._tick0Init = ax.tick0; - // calculate max number of (auto) ticks to display based on plot size if(ax.tickmode === 'auto' || !ax.dtick) { var nt = ax.nticks; @@ -66701,10 +66922,11 @@ axes.prepTicks = function(ax, opts) { if(ax._name === 'radialaxis') nt *= 2; } - // add a couple of extra digits for filling in ticks when we - // have explicit tickvals without tick text - if(ax.tickmode === 'array') nt *= 100; - + if(!(ax.minor && ax.minor.tickmode !== 'array')) { + // add a couple of extra digits for filling in ticks when we + // have explicit tickvals without tick text + if(ax.tickmode === 'array') nt *= 100; + } ax._roughDTick = Math.abs(rng[1] - rng[0]) / nt; axes.autoTicks(ax, ax._roughDTick); @@ -66922,81 +67144,201 @@ function positionPeriodTicks(tickVals, ax, definedDelta) { // in any case, set tickround to # of digits to round tick labels to, // or codes to this effect for log and date scales axes.calcTicks = function calcTicks(ax, opts) { - axes.prepTicks(ax, opts); + var type = ax.type; + var calendar = ax.calendar; + var ticklabelstep = ax.ticklabelstep; + var isPeriod = ax.ticklabelmode === 'period'; + var rng = Lib.simpleMap(ax.range, ax.r2l, undefined, undefined, opts); - - // now that we've figured out the auto values for formatting - // in case we're missing some ticktext, we can break out for array ticks - if(ax.tickmode === 'array') return arrayTicks(ax); - - // add a tiny bit so we get ticks which may have rounded out - var exRng = expandRange(rng); - var startTick = exRng[0]; - var endTick = exRng[1]; - // check for reversed axis var axrev = (rng[1] < rng[0]); var minRange = Math.min(rng[0], rng[1]); var maxRange = Math.max(rng[0], rng[1]); - var isDLog = (ax.type === 'log') && !(isNumeric(ax.dtick) || ax.dtick.charAt(0) === 'L'); - var isPeriod = ax.ticklabelmode === 'period'; - - // find the first tick - ax._tmin = axes.tickFirst(ax, opts); - - // No visible ticks? Quit. - // I've only seen this on category axes with all categories off the edge. - if((ax._tmin < startTick) !== axrev) return []; - - // return the full set of tick vals - if(ax.type === 'category' || ax.type === 'multicategory') { - endTick = (axrev) ? Math.max(-0.5, endTick) : - Math.min(ax._categories.length - 0.5, endTick); - } - - var x = ax._tmin; - - if(ax.rangebreaks && ax._tick0Init !== ax.tick0) { - // adjust tick0 - x = moveOutsideBreak(x, ax); - if(!axrev) { - x = axes.tickIncrement(x, ax.dtick, !axrev, ax.calendar); - } - } - - if(isPeriod) { - // add one item to label period before tick0 - x = axes.tickIncrement(x, ax.dtick, !axrev, ax.calendar); - } - var maxTicks = Math.max(1000, ax._length || 0); + + var ticksOut = []; + var minorTicks = []; + var tickVals = []; - var xPrevious = null; - for(; - (axrev) ? (x >= endTick) : (x <= endTick); - x = axes.tickIncrement(x, ax.dtick, axrev, ax.calendar) - ) { - if(ax.rangebreaks) { - if(!axrev) { - if(x < startTick) continue; - if(ax.maskBreaks(x) === BADNUM && moveOutsideBreak(x, ax) >= maxRange) break; + var minorTickVals = []; + + var hasMinor = ax.minor && (ax.minor.ticks || ax.minor.showgrid); + + // calc major first + for(var major = 1; major >= (hasMinor ? 0 : 1); major--) { + var isMinor = !major; + + if(major) { + ax._dtickInit = ax.dtick; + ax._tick0Init = ax.tick0; + } else { + ax.minor._dtickInit = ax.minor.dtick; + ax.minor._tick0Init = ax.minor.tick0; + } + + var mockAx = major ? ax : Lib.extendFlat({}, ax, ax.minor); + + if(isMinor) { + axes.prepMinorTicks(mockAx, ax, opts); + } else { + axes.prepTicks(mockAx, opts); + } + + // now that we've figured out the auto values for formatting + // in case we're missing some ticktext, we can break out for array ticks + if(mockAx.tickmode === 'array') { + if(major) { + tickVals = []; + ticksOut = arrayTicks(ax); + } else { + minorTickVals = []; + minorTicks = arrayTicks(ax); + } + continue; + } + + // add a tiny bit so we get ticks which may have rounded out + var exRng = expandRange(rng); + var startTick = exRng[0]; + var endTick = exRng[1]; + + var numDtick = isNumeric(mockAx.dtick); + var isDLog = (type === 'log') && !(numDtick || mockAx.dtick.charAt(0) === 'L'); + + // find the first tick + var x0 = axes.tickFirst(mockAx, opts); + + if(major) { + ax._tmin = x0; + + // No visible ticks? Quit. + // I've only seen this on category axes with all categories off the edge. + if((x0 < startTick) !== axrev) break; + + // return the full set of tick vals + if(type === 'category' || type === 'multicategory') { + endTick = (axrev) ? Math.max(-0.5, endTick) : + Math.min(ax._categories.length - 0.5, endTick); } } - // prevent infinite loops - no more than one tick per pixel, - // and make sure each value is different from the previous - if(tickVals.length > maxTicks || x === xPrevious) break; - xPrevious = x; + var prevX = null; + var x = x0; + var majorId; - var minor = false; - if(isDLog && (x !== (x | 0))) { - minor = true; + if(major) { + // ids for ticklabelstep + var _dTick; + if(numDtick) { + _dTick = ax.dtick; + } else { + if(type === 'date') { + if(typeof ax.dtick === 'string' && ax.dtick.charAt(0) === 'M') { + _dTick = ONEAVGMONTH * ax.dtick.substring(1); + } + } else { + _dTick = ax._roughDTick; + } + } + + majorId = Math.round(( + ax.r2l(x) - + ax.r2l(ax.tick0) + ) / _dTick) - 1; } - tickVals.push({ - minor: minor, - value: x - }); + var dtick = mockAx.dtick; + + if(mockAx.rangebreaks && mockAx._tick0Init !== mockAx.tick0) { + // adjust tick0 + x = moveOutsideBreak(x, ax); + if(!axrev) { + x = axes.tickIncrement(x, dtick, !axrev, calendar); + } + } + + if(major && isPeriod) { + // add one item to label period before tick0 + x = axes.tickIncrement(x, dtick, !axrev, calendar); + majorId--; + } + + for(; + axrev ? + (x >= endTick) : + (x <= endTick); + x = axes.tickIncrement( + x, + dtick, + axrev, + calendar + ) + ) { + if(major) majorId++; + + if(mockAx.rangebreaks) { + if(!axrev) { + if(x < startTick) continue; + if(mockAx.maskBreaks(x) === BADNUM && moveOutsideBreak(x, mockAx) >= maxRange) break; + } + } + + // prevent infinite loops - no more than one tick per pixel, + // and make sure each value is different from the previous + if(tickVals.length > maxTicks || x === prevX) break; + prevX = x; + + var obj = { value: x }; + + if(major) { + if(isDLog && (x !== (x | 0))) { + obj.simpleLabel = true; + } + + if(ticklabelstep > 1 && majorId % ticklabelstep) { + obj.skipLabel = true; + } + + tickVals.push(obj); + } else { + obj.minor = true; + + minorTickVals.push(obj); + } + } + } + + if(hasMinor) { + var canOverlap = + (ax.minor.ticks === 'inside' && ax.ticks === 'outside') || + (ax.minor.ticks === 'outside' && ax.ticks === 'inside'); + + if(!canOverlap) { + // remove duplicate minors + + var majorValues = tickVals.map(function(d) { return d.value; }); + + var list = []; + for(var k = 0; k < minorTickVals.length; k++) { + var T = minorTickVals[k]; + var v = T.value; + if(majorValues.indexOf(v) !== -1) { + continue; + } + var found = false; + for(var q = 0; !found && (q < tickVals.length); q++) { + if( + // add 10e6 to eliminate problematic digits + 10e6 + tickVals[q].value === + 10e6 + v + ) { + found = true; + } + } + if(!found) list.push(T); + } + minorTickVals = list; + } } if(isPeriod) positionPeriodTicks(tickVals, ax, ax._definedDelta); @@ -67049,52 +67391,69 @@ axes.calcTicks = function calcTicks(ax, opts) { ax._prevDateHead = ''; ax._inCalcTicks = true; - var ticksOut = []; + var lastVisibleHead; + var hideLabel = function(tick) { + tick.text = ''; + ax._prevDateHead = lastVisibleHead; + }; + + tickVals = tickVals.concat(minorTickVals); + var t, p; for(i = 0; i < tickVals.length; i++) { var _minor = tickVals[i].minor; var _value = tickVals[i].value; - t = axes.tickText( - ax, - _value, - false, // hover - _minor // noSuffixPrefix - ); + if(_minor) { + minorTicks.push({ + x: _value, + minor: true + }); + } else { + lastVisibleHead = ax._prevDateHead; - p = tickVals[i].periodX; - if(p !== undefined) { - t.periodX = p; - if(p > maxRange || p < minRange) { // hide label if outside the range - if(p > maxRange) t.periodX = maxRange; - if(p < minRange) t.periodX = minRange; + t = axes.tickText( + ax, + _value, + false, // hover + tickVals[i].simpleLabel // noSuffixPrefix + ); - t.text = ' '; // don't use an empty string here which can confuse automargin (issue 5132) - ax._prevDateHead = ''; + p = tickVals[i].periodX; + if(p !== undefined) { + t.periodX = p; + if(p > maxRange || p < minRange) { // hide label if outside the range + if(p > maxRange) t.periodX = maxRange; + if(p < minRange) t.periodX = minRange; + + hideLabel(t); + } } - } - ticksOut.push(t); + if(tickVals[i].skipLabel) { + hideLabel(t); + } + + ticksOut.push(t); + } } + ticksOut = ticksOut.concat(minorTicks); ax._inCalcTicks = false; + if(isPeriod && ticksOut.length) { + // drop very first tick that we added to handle period + ticksOut[0].noTick = true; + } + return ticksOut; }; function arrayTicks(ax) { - var vals = ax.tickvals; - var text = ax.ticktext; - var ticksOut = new Array(vals.length); var rng = Lib.simpleMap(ax.range, ax.r2l); var exRng = expandRange(rng); var tickMin = Math.min(exRng[0], exRng[1]); var tickMax = Math.max(exRng[0], exRng[1]); - var j = 0; - - // without a text array, just format the given values as any other ticks - // except with more precision to the numbers - if(!Array.isArray(text)) text = []; // make sure showing ticks doesn't accidentally add new categories // TODO multicategory, if we allow ticktext / tickvals @@ -67106,17 +67465,36 @@ function arrayTicks(ax) { ax.dtick = 'L' + Math.pow(10, Math.floor(Math.min(ax.range[0], ax.range[1])) - 1); } - for(var i = 0; i < vals.length; i++) { - var vali = tickVal2l(vals[i]); - if(vali > tickMin && vali < tickMax) { - if(text[i] === undefined) ticksOut[j] = axes.tickText(ax, vali); - else ticksOut[j] = tickTextObj(ax, vali, String(text[i])); - j++; + var ticksOut = []; + for(var isMinor = 0; isMinor <= 1; isMinor++) { + if(isMinor && !ax.minor) continue; + var vals = !isMinor ? ax.tickvals : ax.minor.tickvals; + var text = !isMinor ? ax.ticktext : []; + + if(!vals) continue; + + + // without a text array, just format the given values as any other ticks + // except with more precision to the numbers + if(!Array.isArray(text)) text = []; + + for(var i = 0; i < vals.length; i++) { + var vali = tickVal2l(vals[i]); + if(vali > tickMin && vali < tickMax) { + var obj = text[i] === undefined ? + axes.tickText(ax, vali) : + tickTextObj(ax, vali, String(text[i])); + + if(isMinor) { + obj.minor = true; + obj.text = ''; + } + + ticksOut.push(obj); + } } } - if(j < vals.length) ticksOut.splice(j, vals.length - j); - if(ax.rangebreaks) { // remove ticks falling inside rangebreaks ticksOut = ticksOut.filter(function(d) { @@ -67159,7 +67537,7 @@ function roundDTick(roughDTick, base, roundingSet) { // log with linear ticks: L# where # is the linear tick spacing // log showing powers plus some intermediates: // D1 shows all digits, D2 shows 2 and 5 -axes.autoTicks = function(ax, roughDTick) { +axes.autoTicks = function(ax, roughDTick, isMinor) { var base; function getBase(v) { @@ -67182,20 +67560,22 @@ axes.autoTicks = function(ax, roughDTick) { ax.dtick = 'M' + roundDTick(roughDTick, 1, roundBase24); } else if(roughX2 > ONEDAY) { ax.dtick = roundDTick(roughDTick, ONEDAY, ax._hasDayOfWeekBreaks ? [1, 2, 7, 14] : roundDays); - // get week ticks on sunday - // this will also move the base tick off 2000-01-01 if dtick is - // 2 or 3 days... but that's a weird enough case that we'll ignore it. - var tickformat = axes.getTickFormat(ax); - var isPeriod = ax.ticklabelmode === 'period'; - if(isPeriod) ax._rawTick0 = ax.tick0; + if(!isMinor) { + // get week ticks on sunday + // this will also move the base tick off 2000-01-01 if dtick is + // 2 or 3 days... but that's a weird enough case that we'll ignore it. + var tickformat = axes.getTickFormat(ax); + var isPeriod = ax.ticklabelmode === 'period'; + if(isPeriod) ax._rawTick0 = ax.tick0; - if(/%[uVW]/.test(tickformat)) { - ax.tick0 = Lib.dateTick0(ax.calendar, 2); // Monday - } else { - ax.tick0 = Lib.dateTick0(ax.calendar, 1); // Sunday + if(/%[uVW]/.test(tickformat)) { + ax.tick0 = Lib.dateTick0(ax.calendar, 2); // Monday + } else { + ax.tick0 = Lib.dateTick0(ax.calendar, 1); // Sunday + } + + if(isPeriod) ax._dowTick0 = ax.tick0; } - - if(isPeriod) ax._dowTick0 = ax.tick0; } else if(roughX2 > ONEHOUR) { ax.dtick = roundDTick(roughDTick, ONEHOUR, roundBase24); } else if(roughX2 > ONEMIN) { @@ -67210,7 +67590,12 @@ axes.autoTicks = function(ax, roughDTick) { } else if(ax.type === 'log') { ax.tick0 = 0; var rng = Lib.simpleMap(ax.range, ax.r2l); - + if(ax._isMinor) { + // Log axes by default get MORE than nTicks based on the metrics below + // But for minor ticks we don't want this increase, we already have + // the major ticks. + roughDTick *= 1.5; + } if(roughDTick > 0.7) { // only show powers of 10 ax.dtick = Math.ceil(roughDTick); @@ -68097,6 +68482,7 @@ axes.draw = function(gd, arg, opts) { plotinfo.xaxislayer.selectAll('.' + xa._id + 'divider').remove(); plotinfo.yaxislayer.selectAll('.' + ya._id + 'divider').remove(); + if(plotinfo.minorGridlayer) plotinfo.minorGridlayer.selectAll('path').remove(); if(plotinfo.gridlayer) plotinfo.gridlayer.selectAll('path').remove(); if(plotinfo.zerolinelayer) plotinfo.zerolinelayer.selectAll('path').remove(); @@ -68250,6 +68636,7 @@ axes.drawOne = function(gd, ax, opts) { vals: gridVals, counterAxis: counterAxis, layer: plotinfo.gridlayer.select('.' + axId), + minorLayer: plotinfo.minorGridlayer.select('.' + axId), path: gridPath, transFn: transTickFn }); @@ -68262,60 +68649,86 @@ axes.drawOne = function(gd, ax, opts) { } } - var tickSigns = axes.getTickSigns(ax); - var tickSubplots = []; + var tickPath; + + var majorTickSigns = axes.getTickSigns(ax); + var minorTickSigns = axes.getTickSigns(ax, 'minor'); + + if(ax.ticks || (ax.minor && ax.minor.ticks)) { + var majorTickPath = axes.makeTickPath(ax, mainLinePosition, majorTickSigns[2]); + var minorTickPath = axes.makeTickPath(ax, mainLinePosition, minorTickSigns[2], { minor: true }); + + var mirrorMajorTickPath; + var mirrorMinorTickPath; + + var fullMajorTickPath; + var fullMinorTickPath; - if(ax.ticks) { - var mainTickPath = axes.makeTickPath(ax, mainLinePosition, tickSigns[2]); - var mirrorTickPath; - var fullTickPath; if(ax._anchorAxis && ax.mirror && ax.mirror !== true) { - mirrorTickPath = axes.makeTickPath(ax, mainMirrorPosition, tickSigns[3]); - fullTickPath = mainTickPath + mirrorTickPath; + mirrorMajorTickPath = axes.makeTickPath(ax, mainMirrorPosition, majorTickSigns[3]); + mirrorMinorTickPath = axes.makeTickPath(ax, mainMirrorPosition, minorTickSigns[3], { minor: true }); + + fullMajorTickPath = majorTickPath + mirrorMajorTickPath; + fullMinorTickPath = minorTickPath + mirrorMinorTickPath; } else { - mirrorTickPath = ''; - fullTickPath = mainTickPath; + mirrorMajorTickPath = ''; + mirrorMinorTickPath = ''; + fullMajorTickPath = majorTickPath; + fullMinorTickPath = minorTickPath; } - var tickPath; if(ax.showdividers && outsideTicks && ax.tickson === 'boundaries') { var dividerLookup = {}; for(i = 0; i < dividerVals.length; i++) { dividerLookup[dividerVals[i].x] = 1; } tickPath = function(d) { - return dividerLookup[d.x] ? mirrorTickPath : fullTickPath; + return dividerLookup[d.x] ? mirrorMajorTickPath : fullMajorTickPath; }; } else { - tickPath = fullTickPath; - } - - axes.drawTicks(gd, ax, { - vals: tickVals, - layer: mainAxLayer, - path: tickPath, - transFn: transTickFn - }); - - if(ax.mirror === 'allticks') { - tickSubplots = Object.keys(ax._linepositions || {}); + tickPath = function(d) { + return d.minor ? fullMinorTickPath : fullMajorTickPath; + }; } } - for(i = 0; i < tickSubplots.length; i++) { - sp = tickSubplots[i]; - plotinfo = fullLayout._plots[sp]; - // [bottom or left, top or right], free and main are handled above - var linepositions = ax._linepositions[sp] || []; - var spTickPath = axes.makeTickPath(ax, linepositions[0], tickSigns[0]) + - axes.makeTickPath(ax, linepositions[1], tickSigns[1]); + axes.drawTicks(gd, ax, { + vals: tickVals, + layer: mainAxLayer, + path: tickPath, + transFn: transTickFn + }); - axes.drawTicks(gd, ax, { - vals: tickVals, - layer: plotinfo[axLetter + 'axislayer'], - path: spTickPath, - transFn: transTickFn - }); + if(ax.mirror === 'allticks') { + var tickSubplots = Object.keys(ax._linepositions || {}); + + for(i = 0; i < tickSubplots.length; i++) { + sp = tickSubplots[i]; + plotinfo = fullLayout._plots[sp]; + // [bottom or left, top or right], free and main are handled above + var linepositions = ax._linepositions[sp] || []; + + var p0 = linepositions[0]; + var p1 = linepositions[1]; + var isMinor = linepositions[2]; + + var spTickPath = + axes.makeTickPath(ax, p0, + isMinor ? majorTickSigns[0] : minorTickSigns[0], + { minor: isMinor } + ) + + axes.makeTickPath(ax, p1, + isMinor ? majorTickSigns[1] : minorTickSigns[1], + { minor: isMinor } + ); + + axes.drawTicks(gd, ax, { + vals: tickVals, + layer: plotinfo[axLetter + 'axislayer'], + path: spTickPath, + transFn: transTickFn + }); + } } var seq = []; @@ -68348,23 +68761,23 @@ axes.drawOne = function(gd, ax, opts) { repositionOnUpdate: true, secondary: true, transFn: transTickFn, - labelFns: axes.makeLabelFns(ax, mainLinePosition + standoff * tickSigns[4]) + labelFns: axes.makeLabelFns(ax, mainLinePosition + standoff * majorTickSigns[4]) }); }); seq.push(function() { - ax._depth = tickSigns[4] * (getLabelLevelBbox('tick2')[ax.side] - mainLinePosition); + ax._depth = majorTickSigns[4] * (getLabelLevelBbox('tick2')[ax.side] - mainLinePosition); return drawDividers(gd, ax, { vals: dividerVals, layer: mainAxLayer, - path: axes.makeTickPath(ax, mainLinePosition, tickSigns[4], ax._depth), + path: axes.makeTickPath(ax, mainLinePosition, majorTickSigns[4], { len: ax._depth }), transFn: transTickFn }); }); } else if(ax.title.hasOwnProperty('standoff')) { seq.push(function() { - ax._depth = tickSigns[4] * (getLabelLevelBbox()[ax.side] - mainLinePosition); + ax._depth = majorTickSigns[4] * (getLabelLevelBbox()[ax.side] - mainLinePosition); }); } @@ -68605,13 +69018,15 @@ function calcLabelLevelBbox(ax, cls) { * - [3]: sign for ticks mirroring 'ax.side' * - [4]: sign of arrow starting at axis pointing towards margin */ -axes.getTickSigns = function(ax) { +axes.getTickSigns = function(ax, minor) { var axLetter = ax._id.charAt(0); var sideOpposite = {x: 'top', y: 'right'}[axLetter]; var main = ax.side === sideOpposite ? 1 : -1; var out = [-1, 1, main, -main]; // then we flip if outside XOR y axis - if((ax.ticks !== 'inside') === (axLetter === 'x')) { + + var ticks = minor ? (ax.minor || {}).ticks : ax.ticks; + if((ticks !== 'inside') === (axLetter === 'x')) { out = out.map(function(v) { return -v; }); } // independent of `ticks`; do not flip this one @@ -68715,11 +69130,17 @@ function getTickLabelUV(ax) { * - {number} linewidth * @param {number} shift along direction of ticklen * @param {1 or -1} sgn tick sign - * @param {number (optional)} len tick length + * @param {object} opts + * - {number (optional)} len tick length * @return {string} */ -axes.makeTickPath = function(ax, shift, sgn, len) { - len = len !== undefined ? len : ax.ticklen; +axes.makeTickPath = function(ax, shift, sgn, opts) { + if(!opts) opts = {}; + var minor = opts.minor; + if(minor && !ax.minor) return ''; + + var len = opts.len !== undefined ? opts.len : + minor ? ax.minor.ticklen : ax.ticklen; var axLetter = ax._id.charAt(0); var pad = (ax.linewidth || 1) / 2; @@ -68926,17 +69347,20 @@ axes.drawTicks = function(gd, ax, opts) { var cls = ax._id + 'tick'; - var vals = opts.vals; - if( - ax.ticklabelmode === 'period' - ) { - // drop very first tick that we added to handle period - vals = vals.slice(); - vals.shift(); - } + var vals = [] + .concat(ax.minor && ax.minor.ticks ? + // minor vals + opts.vals.filter(function(d) { return d.minor && !d.noTick; }) : + [] + ) + .concat(ax.ticks ? + // major vals + opts.vals.filter(function(d) { return !d.minor && !d.noTick; }) : + [] + ); var ticks = opts.layer.selectAll('path.' + cls) - .data(ax.ticks ? vals : [], tickDataFn); + .data(vals, tickDataFn); ticks.exit().remove(); @@ -68944,8 +69368,16 @@ axes.drawTicks = function(gd, ax, opts) { .classed(cls, 1) .classed('ticks', 1) .classed('crisp', opts.crisp !== false) - .call(Color.stroke, ax.tickcolor) - .style('stroke-width', Drawing.crispRound(gd, ax.tickwidth, 1) + 'px') + .each(function(d) { + return Color.stroke(d3.select(this), d.minor ? ax.minor.tickcolor : ax.tickcolor); + }) + .style('stroke-width', function(d) { + return Drawing.crispRound( + gd, + d.minor ? ax.minor.tickwidth : ax.tickwidth, + 1 + ) + 'px'; + }) .attr('d', opts.path) .style('display', null); // visible @@ -68963,6 +69395,7 @@ axes.drawTicks = function(gd, ax, opts) { * - {boolean} showgrid * - {string} gridcolor * - {string} gridwidth + * - {string} griddash * - {boolean} zeroline * - {string} type * - {string} dtick @@ -68979,16 +69412,18 @@ axes.drawGrid = function(gd, ax, opts) { opts = opts || {}; var cls = ax._id + 'grid'; - var vals = opts.vals; + + var hasMinor = ax.minor && ax.minor.showgrid; + var minorVals = hasMinor ? opts.vals.filter(function(d) { return d.minor; }) : []; + var majorVals = ax.showgrid ? opts.vals.filter(function(d) { return !d.minor; }) : []; + var counterAx = opts.counterAxis; - if(ax.showgrid === false) { - vals = []; - } else if(counterAx && axes.shouldShowZeroLine(gd, ax, counterAx)) { + if(counterAx && axes.shouldShowZeroLine(gd, ax, counterAx)) { var isArrayMode = ax.tickmode === 'array'; - for(var i = 0; i < vals.length; i++) { - var xi = vals[i].x; + for(var i = 0; i < majorVals.length; i++) { + var xi = majorVals[i].x; if(isArrayMode ? !xi : (Math.abs(xi) < ax.dtick / 100)) { - vals = vals.slice(0, i).concat(vals.slice(i + 1)); + majorVals = majorVals.slice(0, i).concat(majorVals.slice(i + 1)); // In array mode you can in principle have multiple // ticks at 0, so test them all. Otherwise once we found // one we can stop. @@ -68998,26 +69433,50 @@ axes.drawGrid = function(gd, ax, opts) { } } - var grid = opts.layer.selectAll('path.' + cls) - .data(vals, tickDataFn); + ax._gw = + Drawing.crispRound(gd, ax.gridwidth, 1); - grid.exit().remove(); + var wMinor = !hasMinor ? 0 : + Drawing.crispRound(gd, ax.minor.gridwidth, 1); - grid.enter().append('path') - .classed(cls, 1) - .classed('crisp', opts.crisp !== false); + var majorLayer = opts.layer; + var minorLayer = opts.minorLayer; + for(var major = 1; major >= 0; major--) { + var layer = major ? majorLayer : minorLayer; + if(!layer) continue; - ax._gw = Drawing.crispRound(gd, ax.gridwidth, 1); + var grid = layer.selectAll('path.' + cls) + .data(major ? majorVals : minorVals, tickDataFn); - grid.attr('transform', opts.transFn) - .attr('d', opts.path) - .call(Color.stroke, ax.gridcolor || '#ddd') - .style('stroke-width', ax._gw + 'px') - .style('display', null); // visible + grid.exit().remove(); - hideCounterAxisInsideTickLabels(ax, [GRID_PATH]); + grid.enter().append('path') + .classed(cls, 1) + .classed('crisp', opts.crisp !== false); - if(typeof opts.path === 'function') grid.attr('d', opts.path); + grid.attr('transform', opts.transFn) + .attr('d', opts.path) + .each(function(d) { + return Color.stroke(d3.select(this), d.minor ? + ax.minor.gridcolor : + (ax.gridcolor || '#ddd') + ); + }) + .style('stroke-dasharray', function(d) { + return Drawing.dashStyle( + d.minor ? ax.minor.griddash : ax.griddash, + d.minor ? ax.minor.gridwidth : ax.gridwidth + ); + }) + .style('stroke-width', function(d) { + return (d.minor ? wMinor : ax._gw) + 'px'; + }) + .style('display', null); // visible + + if(typeof opts.path === 'function') grid.attr('d', opts.path); + } + + hideCounterAxisInsideTickLabels(ax, [GRID_PATH, MINORGRID_PATH]); }; /** @@ -69101,7 +69560,8 @@ axes.drawLabels = function(gd, ax, opts) { var axId = ax._id; var axLetter = axId.charAt(0); var cls = opts.cls || axId + 'tick'; - var vals = opts.vals; + + var vals = opts.vals.filter(function(d) { return d.text; }); var labelFns = opts.labelFns; var tickAngle = opts.secondary ? 0 : ax.tickangle; @@ -69283,6 +69743,7 @@ axes.drawLabels = function(gd, ax, opts) { if(anchorAx && insideTicklabelposition(anchorAx)) { (partialOpts || [ ZERO_PATH, + MINORGRID_PATH, GRID_PATH, TICK_PATH, TICK_TEXT @@ -69296,6 +69757,7 @@ axes.drawLabels = function(gd, ax, opts) { var sel; if(e.K === ZERO_PATH.K) sel = mainPlotinfo.zerolinelayer.selectAll('.' + ax._id + 'zl'); + else if(e.K === MINORGRID_PATH.K) sel = mainPlotinfo.minorGridlayer.selectAll('.' + ax._id); else if(e.K === GRID_PATH.K) sel = mainPlotinfo.gridlayer.selectAll('.' + ax._id); else sel = mainPlotinfo[ax._id.charAt(0) + 'axislayer']; @@ -70103,6 +70565,7 @@ var isNumeric = _dereq_('fast-isnumeric'); var Registry = _dereq_('../../registry'); var Lib = _dereq_('../../lib'); +var Template = _dereq_('../../plot_api/plot_template'); var handleArrayContainerDefaults = _dereq_('../array_container_defaults'); @@ -70220,16 +70683,45 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, color: dfltFontColor }); + // major ticks handleTickValueDefaults(containerIn, containerOut, coerce, axType); + + var hasMinor = options.hasMinor; + if(hasMinor) { + // minor ticks + Template.newContainer(containerOut, 'minor'); + handleTickValueDefaults(containerIn, containerOut, coerce, axType, { isMinor: true }); + } + handleTickLabelDefaults(containerIn, containerOut, coerce, axType, options); + + // major and minor ticks handleTickMarkDefaults(containerIn, containerOut, coerce, options); + if(hasMinor) { + var keepIsMinor = options.isMinor; + options.isMinor = true; + handleTickMarkDefaults(containerIn, containerOut, coerce, options); + options.isMinor = keepIsMinor; + } + handleLineGridDefaults(containerIn, containerOut, coerce, { dfltColor: dfltColor, bgColor: options.bgColor, showGrid: options.showGrid, + hasMinor: hasMinor, attributes: layoutAttributes }); + // delete minor when no minor ticks or gridlines + if( + hasMinor && + !containerOut.minor.ticks && + !containerOut.minor.showgrid + ) { + delete containerOut.minor; + } + + // mirror if(containerOut.showline || containerOut.ticks) coerce('mirror'); if(options.automargin) coerce('automargin'); @@ -70409,7 +70901,7 @@ function indexOfDay(v) { ]; } -},{"../../lib":287,"../../registry":378,"../array_container_defaults":329,"./category_order_defaults":339,"./constants":341,"./layout_attributes":349,"./line_grid_defaults":351,"./prefix_suffix_defaults":353,"./set_convert":356,"./tick_label_defaults":358,"./tick_mark_defaults":359,"./tick_value_defaults":360,"fast-isnumeric":33}],337:[function(_dereq_,module,exports){ +},{"../../lib":287,"../../plot_api/plot_template":323,"../../registry":378,"../array_container_defaults":329,"./category_order_defaults":339,"./constants":341,"./layout_attributes":349,"./line_grid_defaults":351,"./prefix_suffix_defaults":353,"./set_convert":356,"./tick_label_defaults":358,"./tick_mark_defaults":359,"./tick_value_defaults":360,"fast-isnumeric":33}],337:[function(_dereq_,module,exports){ 'use strict'; var docs = _dereq_('../../constants/docs'); @@ -73602,6 +74094,7 @@ function makeSubplotLayer(gd, plotinfo) { plotinfo.shapelayer = ensureSingle(backLayer, 'g', 'shapelayer'); plotinfo.imagelayer = ensureSingle(backLayer, 'g', 'imagelayer'); + plotinfo.minorGridlayer = ensureSingle(plotgroup, 'g', 'minor-gridlayer'); plotinfo.gridlayer = ensureSingle(plotgroup, 'g', 'gridlayer'); plotinfo.zerolinelayer = ensureSingle(plotgroup, 'g', 'zerolinelayer'); @@ -73641,6 +74134,7 @@ function makeSubplotLayer(gd, plotinfo) { // their other components to the corresponding // extra groups of their main plots. + plotinfo.minorGridlayer = mainplotinfo.minorGridlayer; plotinfo.gridlayer = mainplotinfo.gridlayer; plotinfo.zerolinelayer = mainplotinfo.zerolinelayer; @@ -73666,6 +74160,12 @@ function makeSubplotLayer(gd, plotinfo) { // common attributes for all subplots, overlays or not if(!hasOnlyLargeSploms) { + ensureSingleAndAddDatum(plotinfo.minorGridlayer, 'g', plotinfo.xaxis._id); + ensureSingleAndAddDatum(plotinfo.minorGridlayer, 'g', plotinfo.yaxis._id); + plotinfo.minorGridlayer.selectAll('g') + .map(function(d) { return d[0]; }) + .sort(axisIds.idSort); + ensureSingleAndAddDatum(plotinfo.gridlayer, 'g', plotinfo.xaxis._id); ensureSingleAndAddDatum(plotinfo.gridlayer, 'g', plotinfo.yaxis._id); plotinfo.gridlayer.selectAll('g') @@ -73762,6 +74262,100 @@ var constants = _dereq_('./constants'); var HOUR = constants.HOUR_PATTERN; var DAY_OF_WEEK = constants.WEEKDAY_PATTERN; +var tickmode = { + valType: 'enumerated', + values: ['auto', 'linear', 'array'], + editType: 'ticks', + impliedEdits: {tick0: undefined, dtick: undefined}, +}; + +function makeNticks(minor) { + return { + valType: 'integer', + min: 0, + dflt: minor ? 5 : 0, + editType: 'ticks', + }; +} + +var tick0 = { + valType: 'any', + editType: 'ticks', + impliedEdits: {tickmode: 'linear'}, +}; + +var dtick = { + valType: 'any', + editType: 'ticks', + impliedEdits: {tickmode: 'linear'}, +}; + +var tickvals = { + valType: 'data_array', + editType: 'ticks', +}; + +var ticks = { + valType: 'enumerated', + values: ['outside', 'inside', ''], + editType: 'ticks', +}; + +function makeTicklen(minor) { + var obj = { + valType: 'number', + min: 0, + editType: 'ticks', + }; + + if(!minor) obj.dflt = 5; + + return obj; +} + +function makeTickwidth(minor) { + var obj = { + valType: 'number', + min: 0, + editType: 'ticks', + }; + + if(!minor) obj.dflt = 1; + + return obj; +} + +var tickcolor = { + valType: 'color', + dflt: colorAttrs.defaultLine, + editType: 'ticks', +}; + +var gridcolor = { + valType: 'color', + dflt: colorAttrs.lightLine, + editType: 'ticks', +}; + +function makeGridwidth(minor) { + var obj = { + valType: 'number', + min: 0, + editType: 'ticks', + }; + + if(!minor) obj.dflt = 1; + + return obj; +} + +var griddash = extendFlat({}, dash, {editType: 'ticks'}); + +var showgrid = { + valType: 'boolean', + editType: 'ticks', +}; + module.exports = { visible: { valType: 'boolean', @@ -73935,41 +74529,22 @@ module.exports = { }), // ticks - tickmode: { - valType: 'enumerated', - values: ['auto', 'linear', 'array'], - editType: 'ticks', - impliedEdits: {tick0: undefined, dtick: undefined}, - }, - nticks: { + tickmode: tickmode, + nticks: makeNticks(), + tick0: tick0, + dtick: dtick, + ticklabelstep: { valType: 'integer', - min: 0, - dflt: 0, - editType: 'ticks', - }, - tick0: { - valType: 'any', - editType: 'ticks', - impliedEdits: {tickmode: 'linear'}, - }, - dtick: { - valType: 'any', - editType: 'ticks', - impliedEdits: {tickmode: 'linear'}, - }, - tickvals: { - valType: 'data_array', + min: 1, + dflt: 1, editType: 'ticks', }, + tickvals: tickvals, ticktext: { valType: 'data_array', editType: 'ticks', }, - ticks: { - valType: 'enumerated', - values: ['outside', 'inside', ''], - editType: 'ticks', - }, + ticks: ticks, tickson: { valType: 'enumerated', values: ['labels', 'boundaries'], @@ -74011,23 +74586,9 @@ module.exports = { dflt: false, editType: 'ticks+layoutstyle', }, - ticklen: { - valType: 'number', - min: 0, - dflt: 5, - editType: 'ticks', - }, - tickwidth: { - valType: 'number', - min: 0, - dflt: 1, - editType: 'ticks', - }, - tickcolor: { - valType: 'color', - dflt: colorAttrs.defaultLine, - editType: 'ticks', - }, + ticklen: makeTicklen(), + tickwidth: makeTickwidth(), + tickcolor: tickcolor, showticklabels: { valType: 'boolean', dflt: true, @@ -74169,21 +74730,11 @@ module.exports = { dflt: 1, editType: 'ticks+layoutstyle', }, - showgrid: { - valType: 'boolean', - editType: 'ticks', - }, - gridcolor: { - valType: 'color', - dflt: colorAttrs.lightLine, - editType: 'ticks', - }, - gridwidth: { - valType: 'number', - min: 0, - dflt: 1, - editType: 'ticks', - }, + showgrid: showgrid, + gridcolor: gridcolor, + gridwidth: makeGridwidth(), + griddash: griddash, + zeroline: { valType: 'boolean', editType: 'ticks', @@ -74247,6 +74798,26 @@ module.exports = { ], editType: 'plot', }, + + minor: { + tickmode: tickmode, + nticks: makeNticks('minor'), + tick0: tick0, + dtick: dtick, + tickvals: tickvals, + ticks: ticks, + ticklen: makeTicklen('minor'), + tickwidth: makeTickwidth('minor'), + tickcolor: tickcolor, + + gridcolor: gridcolor, + gridwidth: makeGridwidth('minor'), + griddash: griddash, + showgrid: showgrid, + + editType: 'ticks' + }, + layer: { valType: 'enumerated', values: ['above traces', 'below traces'], @@ -74540,6 +75111,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { )); var defaultOptions = { + hasMinor: true, letter: axLetter, font: layoutOut.font, outerTicks: outerTicks[axName], @@ -74690,7 +75262,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { 'use strict'; var colorMix = _dereq_('tinycolor2').mix; -var lightFraction = _dereq_('../../components/color/attributes').lightFraction; +var colorAttrs = _dereq_('../../components/color/attributes'); var Lib = _dereq_('../../lib'); /** @@ -74721,14 +75293,38 @@ module.exports = function handleLineGridDefaults(containerIn, containerOut, coer delete containerOut.linewidth; } - var gridColorDflt = colorMix(dfltColor, opts.bgColor, opts.blend || lightFraction).toRgbString(); + var gridColorDflt = colorMix(dfltColor, opts.bgColor, opts.blend || colorAttrs.lightFraction).toRgbString(); var gridColor = coerce2('gridcolor', gridColorDflt); var gridWidth = coerce2('gridwidth'); - var showGridLines = coerce('showgrid', opts.showGrid || !!gridColor || !!gridWidth); + var gridDash = coerce2('griddash'); + var showGridLines = coerce('showgrid', opts.showGrid || + !!gridColor || + !!gridWidth || + !!gridDash + ); if(!showGridLines) { delete containerOut.gridcolor; delete containerOut.gridwidth; + delete containerOut.griddash; + } + + if(opts.hasMinor) { + var minorGridColorDflt = colorMix(containerOut.gridcolor, opts.bgColor, 67).toRgbString(); + var minorGridColor = coerce2('minor.gridcolor', minorGridColorDflt); + var minorGridWidth = coerce2('minor.gridwidth', containerOut.gridwidth || 1); + var minorGridDash = coerce2('minor.griddash', containerOut.griddash || 'solid'); + var minorShowGridLines = coerce('minor.showgrid', + !!minorGridColor || + !!minorGridWidth || + !!minorGridDash + ); + + if(!minorShowGridLines) { + delete containerOut.minor.gridcolor; + delete containerOut.minor.gridwidth; + delete containerOut.minor.griddash; + } } if(!opts.noZeroLine) { @@ -76821,6 +77417,14 @@ module.exports = function handleTickLabelDefaults(containerIn, containerOut, coe color: dfltFontColor }); + if( + !options.noTicklabelstep && + axType !== 'multicategory' && + axType !== 'log' + ) { + coerce('ticklabelstep'); + } + if(!options.noAng) coerce('tickangle'); if(axType !== 'category') { @@ -76869,15 +77473,23 @@ var layoutAttributes = _dereq_('./layout_attributes'); * options: inherits outerTicks from axes.handleAxisDefaults */ module.exports = function handleTickMarkDefaults(containerIn, containerOut, coerce, options) { - var tickLen = Lib.coerce2(containerIn, containerOut, layoutAttributes, 'ticklen'); - var tickWidth = Lib.coerce2(containerIn, containerOut, layoutAttributes, 'tickwidth'); - var tickColor = Lib.coerce2(containerIn, containerOut, layoutAttributes, 'tickcolor', containerOut.color); - var showTicks = coerce('ticks', (options.outerTicks || tickLen || tickWidth || tickColor) ? 'outside' : ''); + var isMinor = options.isMinor; + var cIn = isMinor ? containerIn.minor || {} : containerIn; + var cOut = isMinor ? containerOut.minor : containerOut; + var lAttr = isMinor ? layoutAttributes.minor : layoutAttributes; + var prefix = isMinor ? 'minor.' : ''; + + var tickLen = Lib.coerce2(cIn, cOut, lAttr, 'ticklen', isMinor ? ((containerOut.ticklen || 5) * 0.6) : undefined); + var tickWidth = Lib.coerce2(cIn, cOut, lAttr, 'tickwidth', isMinor ? (containerOut.tickwidth || 1) : undefined); + var tickColor = Lib.coerce2(cIn, cOut, lAttr, 'tickcolor', (isMinor ? containerOut.tickcolor : undefined) || cOut.color); + var showTicks = coerce(prefix + 'ticks', ( + (!isMinor && options.outerTicks) || tickLen || tickWidth || tickColor + ) ? 'outside' : ''); if(!showTicks) { - delete containerOut.ticklen; - delete containerOut.tickwidth; - delete containerOut.tickcolor; + delete cOut.ticklen; + delete cOut.tickwidth; + delete cOut.tickcolor; } }; @@ -76887,12 +77499,18 @@ module.exports = function handleTickMarkDefaults(containerIn, containerOut, coer var cleanTicks = _dereq_('./clean_ticks'); var isArrayOrTypedArray = _dereq_('../../lib').isArrayOrTypedArray; -module.exports = function handleTickValueDefaults(containerIn, containerOut, coerce, axType) { +module.exports = function handleTickValueDefaults(containerIn, containerOut, coerce, axType, opts) { + if(!opts) opts = {}; + var isMinor = opts.isMinor; + var cIn = isMinor ? containerIn.minor || {} : containerIn; + var cOut = isMinor ? containerOut.minor : containerOut; + var prefix = isMinor ? 'minor.' : ''; + function readInput(attr) { - var v = containerIn[attr]; + var v = cIn[attr]; return ( v !== undefined - ) ? v : (containerOut._template || {})[attr]; + ) ? v : (cOut._template || {})[attr]; } var _tick0 = readInput('tick0'); @@ -76902,21 +77520,22 @@ module.exports = function handleTickValueDefaults(containerIn, containerOut, coe var tickmodeDefault = isArrayOrTypedArray(_tickvals) ? 'array' : _dtick ? 'linear' : 'auto'; - var tickmode = coerce('tickmode', tickmodeDefault); + var tickmode = coerce(prefix + 'tickmode', tickmodeDefault); - if(tickmode === 'auto') coerce('nticks'); - else if(tickmode === 'linear') { + if(tickmode === 'auto') { + coerce(prefix + 'nticks'); + } else if(tickmode === 'linear') { // dtick is usually a positive number, but there are some // special strings available for log or date axes // tick0 also has special logic - var dtick = containerOut.dtick = cleanTicks.dtick( + var dtick = cOut.dtick = cleanTicks.dtick( _dtick, axType); - containerOut.tick0 = cleanTicks.tick0( + cOut.tick0 = cleanTicks.tick0( _tick0, axType, containerOut.calendar, dtick); } else if(axType !== 'multicategory') { - var tickvals = coerce('tickvals'); - if(tickvals === undefined) containerOut.tickmode = 'auto'; - else coerce('ticktext'); + var tickvals = coerce(prefix + 'tickvals'); + if(tickvals === undefined) cOut.tickmode = 'auto'; + else if(!isMinor) coerce('ticktext'); } }; @@ -81939,6 +82558,7 @@ var ternaryAxesAttrs = { ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, + ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, showtickprefix: axesAttrs.showtickprefix, tickprefix: axesAttrs.tickprefix, @@ -81960,6 +82580,7 @@ var ternaryAxesAttrs = { showgrid: extendFlat({}, axesAttrs.showgrid, {dflt: true}), gridcolor: axesAttrs.gridcolor, gridwidth: axesAttrs.gridwidth, + griddash: axesAttrs.griddash, layer: axesAttrs.layer, // range min: { @@ -83178,7 +83799,7 @@ function registerTraceModule(_module) { // add `PlotlyGeoAssets` global to stash references to all fetched // topojson / geojson data if((bpmName === 'geo' || bpmName === 'mapbox') && - (typeof window !== undefined && window.PlotlyGeoAssets === undefined) + (window.PlotlyGeoAssets === undefined) ) { window.PlotlyGeoAssets = {topojson: {}}; } @@ -83771,7 +84392,7 @@ function svgToImg(opts) { var w1 = scale * w0; var h1 = scale * h0; - var ctx = canvas.getContext('2d'); + var ctx = canvas.getContext('2d', {willReadFrequently: true}); var img = new Image(); var svgBlob, url; @@ -83959,7 +84580,7 @@ module.exports = function toSVG(gd, format, scale) { var toppaper = fullLayout._toppaper; var width = fullLayout.width; var height = fullLayout.height; - var i, k; + var i; // make background color a rect in the svg, then revert after scraping // all other alterations have been dealt with by properly preparing the svg @@ -84032,32 +84653,21 @@ module.exports = function toSVG(gd, format, scale) { } }); - var queryParts = []; - if(fullLayout._gradientUrlQueryParts) { - for(k in fullLayout._gradientUrlQueryParts) queryParts.push(k); - } + svg.selectAll('.gradient_filled,.pattern_filled').each(function() { + var pt = d3.select(this); - if(fullLayout._patternUrlQueryParts) { - for(k in fullLayout._patternUrlQueryParts) queryParts.push(k); - } + // similar to font family styles above, + // we must remove " after the SVG DOM has been serialized + var fill = this.style.fill; + if(fill && fill.indexOf('url(') !== -1) { + pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB)); + } - if(queryParts.length) { - svg.selectAll(queryParts.join(',')).each(function() { - var pt = d3.select(this); - - // similar to font family styles above, - // we must remove " after the SVG DOM has been serialized - var fill = this.style.fill; - if(fill && fill.indexOf('url(') !== -1) { - pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB)); - } - - var stroke = this.style.stroke; - if(stroke && stroke.indexOf('url(') !== -1) { - pt.style('stroke', stroke.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB)); - } - }); - } + var stroke = this.style.stroke; + if(stroke && stroke.indexOf('url(') !== -1) { + pt.style('stroke', stroke.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB)); + } + }); if(format === 'pdf' || format === 'eps') { // these formats make the extra line MathJax adds around symbols look super thick in some cases @@ -86417,12 +87027,14 @@ function calcTexttemplate(fullLayout, cd, index, xa, ya) { var trace = cd[0].trace; var texttemplate = Lib.castOption(trace, index, 'texttemplate'); if(!texttemplate) return ''; + var isHistogram = (trace.type === 'histogram'); var isWaterfall = (trace.type === 'waterfall'); var isFunnel = (trace.type === 'funnel'); + var isHorizontal = trace.orientation === 'h'; var pLetter, pAxis; var vLetter, vAxis; - if(trace.orientation === 'h') { + if(isHorizontal) { pLetter = 'y'; pAxis = ya; vLetter = 'x'; @@ -86457,6 +87069,11 @@ function calcTexttemplate(fullLayout, cd, index, xa, ya) { var pt = {}; appendArrayPointValue(pt, trace, cdi.i); + if(isHistogram || pt.x === undefined) pt.x = isHorizontal ? obj.value : obj.label; + if(isHistogram || pt.y === undefined) pt.y = isHorizontal ? obj.label : obj.value; + if(isHistogram || pt.xLabel === undefined) pt.xLabel = isHorizontal ? obj.valueLabel : obj.labelLabel; + if(isHistogram || pt.yLabel === undefined) pt.yLabel = isHorizontal ? obj.labelLabel : obj.valueLabel; + if(isWaterfall) { obj.delta = +cdi.rawS || cdi.s; obj.deltaLabel = formatNumber(obj.delta); @@ -92704,6 +93321,7 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { var font = trace.textfont; var fontFamily = font.family; var fontSize = font.size; + var globalFontSize = gd._fullLayout.font.size; if(!fontSize || fontSize === 'auto') { var minW = Infinity; @@ -92730,7 +93348,7 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { !isFinite(minW) || !isFinite(minH) ) { - fontSize = 12; + fontSize = globalFontSize; } else { minW -= xGap; minH -= yGap; @@ -92743,7 +93361,8 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { fontSize = Math.min( Math.floor(minW), - Math.floor(minH) + Math.floor(minH), + globalFontSize ); } } @@ -93397,8 +94016,9 @@ var getBinSpanLabelRound = _dereq_('./bin_label_vals'); function calc(gd, trace) { var pos = []; var size = []; - var pa = Axes.getFromId(gd, trace.orientation === 'h' ? trace.yaxis : trace.xaxis); - var mainData = trace.orientation === 'h' ? 'y' : 'x'; + var isHorizontal = trace.orientation === 'h'; + var pa = Axes.getFromId(gd, isHorizontal ? trace.yaxis : trace.xaxis); + var mainData = isHorizontal ? 'y' : 'x'; var counterData = {x: 'y', y: 'x'}[mainData]; var calendar = trace[mainData + 'calendar']; var cumulativeSpec = trace.cumulative; @@ -95299,7 +95919,7 @@ module.exports = function hoverPoints(pointData, xval, yval) { if(trace._hasZ) { pixel = cd0.z[ny][nx]; } else if(trace._hasSource) { - pixel = trace._canvas.el.getContext('2d').getImageData(nx, ny, 1, 1).data; + pixel = trace._canvas.el.getContext('2d', {willReadFrequently: true}).getImageData(nx, ny, 1, 1).data; } // return early if pixel is undefined @@ -95480,7 +96100,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) { var canvas = document.createElement('canvas'); canvas.width = imageWidth; canvas.height = imageHeight; - var context = canvas.getContext('2d'); + var context = canvas.getContext('2d', {willReadFrequently: true}); var ipx = function(i) {return Lib.constrain(Math.round(xa.c2p(x0 + i * dx) - left), 0, imageWidth);}; var jpx = function(j) {return Lib.constrain(Math.round(ya.c2p(y0 + j * dy) - top), 0, imageHeight);}; @@ -95555,7 +96175,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) { var canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; - var context = canvas.getContext('2d'); + var context = canvas.getContext('2d', {willReadFrequently: true}); trace._image = trace._image || new Image(); var image = trace._image; @@ -95580,7 +96200,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) { if(realImage) { href = trace.source; } else { - var context = trace._canvas.el.getContext('2d'); + var context = trace._canvas.el.getContext('2d', {willReadFrequently: true}); var data = context.getImageData(0, 0, w, h).data; canvas = drawMagnifiedPixelsOnCanvas(function(i, j) { var index = 4 * (j * w + i); @@ -97565,6 +98185,7 @@ var hovertemplateAttrs = _dereq_('../../plots/template_attributes').hovertemplat var colorScaleAttrs = _dereq_('../../components/colorscale/attributes'); var fontAttrs = _dereq_('../../plots/font_attributes'); var dash = _dereq_('../../components/drawing/attributes').dash; +var pattern = _dereq_('../../components/drawing/attributes').pattern; var Drawing = _dereq_('../../components/drawing'); var constants = _dereq_('./constants'); @@ -97752,6 +98373,7 @@ module.exports = { editType: 'style', anim: true, }, + fillpattern: pattern, marker: extendFlat({ symbol: { valType: 'enumerated', @@ -98488,6 +99110,7 @@ var handleLineDefaults = _dereq_('./line_defaults'); var handleLineShapeDefaults = _dereq_('./line_shape_defaults'); var handleTextDefaults = _dereq_('./text_defaults'); var handleFillColorDefaults = _dereq_('./fillcolor_defaults'); +var coercePattern = _dereq_('../../lib').coercePattern; module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { @@ -98541,6 +99164,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(traceOut.fill !== 'none') { handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce); if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce); + coercePattern(coerce, 'fillpattern', traceOut.fillcolor, false); } var lineColor = (traceOut.line || {}).color; @@ -99923,11 +100547,11 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // the points on the axes are the first two points. Otherwise // animations get a little crazy if the number of points changes. transition(ownFillEl3).attr('d', 'M' + pt1 + 'L' + pt0 + 'L' + fullpath.substr(1)) - .call(Drawing.singleFillStyle); + .call(Drawing.singleFillStyle, gd); } else { // fill to self: just join the path to itself transition(ownFillEl3).attr('d', fullpath + 'Z') - .call(Drawing.singleFillStyle); + .call(Drawing.singleFillStyle, gd); } } } else if(tonext) { @@ -99939,7 +100563,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // This makes strange results if one path is *not* entirely // inside the other, but then that is a strange usage. transition(tonext).attr('d', fullpath + 'Z' + prevRevpath + 'Z') - .call(Drawing.singleFillStyle); + .call(Drawing.singleFillStyle, gd); } else { // tonextx/y: for now just connect endpoints with lines. This is // the correct behavior if the endpoints are at the same value of @@ -99947,7 +100571,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // things depending on whether the new endpoint projects onto the // existing curve or off the end of it transition(tonext).attr('d', fullpath + 'L' + prevRevpath.substr(1) + 'Z') - .call(Drawing.singleFillStyle); + .call(Drawing.singleFillStyle, gd); } trace._polygons = trace._polygons.concat(prevPolygons); } else { @@ -100340,7 +100964,7 @@ function style(gd) { .call(Drawing.lineGroupStyle); s.selectAll('g.trace path.js-fill') - .call(Drawing.fillGroupStyle); + .call(Drawing.fillGroupStyle, gd); Registry.getComponentMethod('errorbars', 'style')(s); } @@ -102807,22 +103431,22 @@ function getSortFunc(opts, d2c) { 'use strict'; // package version injected by `npm run preprocess` -exports.version = '2.8.0'; +exports.version = '2.12.1'; },{}]},{},[15])(15) }); var locale={moduleType:"locale",name:"ca",dictionary:{},format:{days:["Diumenge","Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte"],shortDays:["Dug","Dln","Dmt","Dmc","Djs","Dvn","Dsb"],months:["Gener","Febrer","Mar\xe7","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"],shortMonths:["Gen","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Oct","Nov","Des"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"de",dictionary:{Autoscale:"Automatische Skalierung","Box Select":"Rechteckauswahl","Click to enter Colorscale title":"Klicken, um den Farbskalatitel einzugeben","Click to enter Component A title":"Klicken, um den Titel der Komponente A einzugeben","Click to enter Component B title":"Klicken, um den Titel der Komponente B einzugeben","Click to enter Component C title":"Klicken, um den Titel der Komponente C einzugeben","Click to enter Plot title":"Klicken, um den Titel des Graphen einzugeben","Click to enter X axis title":"Klicken, um den Titel der X-Achse einzugeben","Click to enter Y axis title":"Klicken, um den Titel der Y-Achse einzugeben","Compare data on hover":"\xdcber die Daten fahren, um sie zu vergleichen","Double-click on legend to isolate one trace":"Daten isolieren durch Doppelklick in der Legende","Double-click to zoom back out":"Herauszoomen durch Doppelklick","Download plot as a png":"Graphen als PNG herunterladen","Download plot":"Graphen herunterladen","Edit in Chart Studio":"Im Chart Studio bearbeiten","IE only supports svg. Changing format to svg.":"IE unterst\xfctzt nur SVG-Dateien. Format wird zu SVG gewechselt.","Lasso Select":"Lassoauswahl","Orbital rotation":"Orbitalrotation",Pan:"Verschieben","Produced with Plotly":"Erstellt mit Plotly",Reset:"Zur\xfccksetzen","Reset axes":"Achsen zur\xfccksetzen","Reset camera to default":"Kamera auf Standard zur\xfccksetzen","Reset camera to last save":"Kamera auf letzte Speicherung zur\xfccksetzen","Reset view":"Ansicht zur\xfccksetzen","Reset views":"Ansichten zur\xfccksetzen","Show closest data on hover":"Zeige n\xe4heste Daten beim \xdcberfahren","Snapshot succeeded":"Snapshot erfolgreich","Sorry, there was a problem downloading your snapshot!":"Es gab ein Problem beim Herunterladen des Snapshots","Taking snapshot - this may take a few seconds":"Erstelle einen Snapshot - dies kann einige Sekunden dauern",Zoom:"Zoom","Zoom in":"Hineinzoomen","Zoom out":"Herauszoomen","close:":"Schluss:",trace:"Datenspur","lat:":"Lat.:","lon:":"Lon.:","q1:":"q1:","q3:":"q3:","source:":"Quelle:","target:":"Ziel:","lower fence:":"Untere Schranke:","upper fence:":"Obere Schranke:","max:":"Max.:","mean \xb1 \u03c3:":"Mittelwert \xb1 \u03c3:","mean:":"Mittelwert:","median:":"Median:","min:":"Min.:","Turntable rotation":"Drehscheibenorbit","Toggle Spike Lines":"Bezugslinien an-/abschalten","open:":"Er\xf6ffnung:","high:":"H\xf6chstkurs:","low:":"Tiefstkurs:","Toggle show closest data on hover":"Anzeige der n\xe4hesten Daten an-/abschalten","incoming flow count:":"Anzahl eingehender Verbindungen:","outgoing flow count:":"Anzahl ausgehender Verbindungen:","kde:":"Dichte:"},format:{days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","M\xe4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","M\xe4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],date:"%d.%m.%Y",decimal:",",thousands:"."}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"es",dictionary:{Autoscale:"Autoescalar","Box Select":"Seleccionar Caja","Click to enter Colorscale title":"Introducir el t\xedtulo de la Escala de Color","Click to enter Component A title":"Introducir el t\xedtulo del Componente A","Click to enter Component B title":"Introducir el t\xedtulo del Componente B","Click to enter Component C title":"Introducir el t\xedtulo del Componente C","Click to enter Plot title":"Introducir el t\xedtulo de la Gr\xe1fica","Click to enter X axis title":"Introducir el t\xedtulo del eje X","Click to enter Y axis title":"Introducir el t\xedtulo del eje Y","Click to enter radial axis title":"Introducir el t\xedtulo del eje radial","Compare data on hover":"Comparar datos al pasar por encima","Double-click on legend to isolate one trace":"Haga doble-clic en la leyenda para aislar una traza","Double-click to zoom back out":"Haga doble-clic para restaurar la escala","Download plot as a png":"Descargar gr\xe1fica como png","Download plot":"Descargar gr\xe1fica","Edit in Chart Studio":"Editar en Chart Studio","IE only supports svg. Changing format to svg.":"IE solo soporta svg. Cambiando formato a svg.","Lasso Select":"Seleccionar con lazo","Orbital rotation":"Rotaci\xf3n esf\xe9rica",Pan:"Modo Panor\xe1mica","Produced with Plotly":"Hecho con Plotly",Reset:"Reiniciar","Reset axes":"Reiniciar ejes","Reset camera to default":"Restaurar c\xe1mara predeterminada","Reset camera to last save":"Restaurar anterior c\xe1mara","Reset view":"Restaurar vista","Reset views":"Restaurar vistas","Show closest data on hover":"Mostrar el dato m\xe1s cercano al pasar por encima","Snapshot succeeded":"La captura de la instant\xe1nea finaliz\xf3 correctamente","Sorry, there was a problem downloading your snapshot!":"\xa1La descarga de la instant\xe1nea fall\xf3!","Taking snapshot - this may take a few seconds":"Capturando una instant\xe1nea - podr\xeda tardar unos segundos","Toggle Spike Lines":"Mostrar/Ocultar Gu\xedas","Toggle show closest data on hover":"Activar/Desactivar mostrar el dato m\xe1s cercano al pasar por encima","Turntable rotation":"Rotaci\xf3n plana",Zoom:"Modo Ampliar/Reducir","Zoom in":"Ampliar","Zoom out":"Reducir","close:":"cierre:","high:":"alza:","incoming flow count:":"flujo de entrada:","kde:":"edp:","lat:":"lat:","lon:":"lon:","low:":"baja:","lower fence:":"l\xedmite inferior:","max:":"m\xe1x:","mean \xb1 \u03c3:":"media \xb1 \u03c3:","mean:":"media:","median:":"mediana:","min:":"m\xedn:","new text":"nuevo texto","open:":"apertura:","outgoing flow count:":"flujo de salida:","q1:":"q1:","q3:":"q3:","source:":"fuente:","target:":"destino:",trace:"traza","upper fence:":"l\xedmite superior:"},format:{days:["Domingo","Lunes","Martes","Mi\xe9rcoles","Jueves","Viernes","S\xe1bado"],shortDays:["Dom","Lun","Mar","Mi\xe9","Jue","Vie","S\xe1b"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],shortMonths:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],date:"%d/%m/%Y",decimal:",",thousands:" "}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"fi",dictionary:{Autoscale:"Autoskaalaa","Box Select":"Laatikkovalinta","Click to enter Colorscale title":"Klikkaa antaaksesi v\xe4riskaalan otsikko","Click to enter Component A title":"Klikkaa antaaksesi komponentin A otsikko","Click to enter Component B title":"Klikkaa antaaksesi komponentin B otsikko","Click to enter Component C title":"Klikkaa antaaksesi komponentin C otsikko","Click to enter Plot title":"Klikkaa antaaksesi kuvion otsikko","Click to enter X axis title":"Klikkaa antaaksesi x-akselin otsikko","Click to enter Y axis title":"Klikkaa antaaksesi y-akselin otsikko","Click to enter radial axis title":"Klikkaa antaaksesi radiaalisen akselin otsikko","Compare data on hover":"Vertaa dataa kursorilla","Double-click on legend to isolate one trace":"Kaksoisklikkaa selitett\xe4 erist\xe4\xe4ksesi yksi sarja","Double-click to zoom back out":"Kaksoisklikkaa zoomataksesi ulos","Download plot":"Lataa kuvio","Download plot as png":"Lataa kuvio png-muodossa","Edit in Chart Studio":"Muokkaa Chart Studiossa","IE only supports svg. Changing format to svg.":"Formaatiksi vaihdetaan IE:n tukema svg.","Lasso Select":"Lassovalinta","Orbital rotation":"Orbitaalikierto",Pan:"Panorointi","Produced with Plotly":"Tuotettu Plotlyll\xe4",Reset:"Palauta oletusasetukset","Reset axes":"Palauta akselien oletusasetukset","Reset camera to default":"Palauta kameran oletusasetukset","Reset camera to last save":"Palauta kameran viimeksi tallennetut asetukset","Reset view":"Palauta n\xe4kym\xe4n oletusasetukset","Reset views":"Palauta n\xe4kymien oletusasetukset","Show closest data on hover":"N\xe4yt\xe4 kursoria l\xe4hin data","Snapshot succeeded":"Tilannekuvan ottaminen onnistui","Sorry, there was a problem downloading your snapshot!":"Pahoittelut, tilannekuvan lataaminen ep\xe4onnistui!","Taking snapshot - this may take a few seconds":"Otetaan tilannekuvaa - odota hetki","Toggle Spike Lines":"N\xe4yt\xe4 huiput","Toggle show closest data on hover":"N\xe4yt\xe4 kursoria l\xe4hin data","Turntable rotation":"Tasokierto",Zoom:"Zoomaus","Zoom in":"Zoomaa sis\xe4\xe4n","Zoom out":"Zoomaa ulos","close:":"loppu:","high:":"korkein:","incoming flow count:":"saapuva virtaus:","kde:":"ydinestimointi:","lat:":"lat.:","lon:":"lon.:","low:":"matalin:","lower fence:":"alempi raja:","max:":"maks.:","mean \xb1 \u03c3:":"keskiarvo \xb1 \u03c3:","mean:":"keskiarvo:","median:":"mediaani:","min:":"min.:","new text":"uusi teksti","open:":"alku:","outgoing flow count:":"l\xe4htev\xe4 virtaus:","q1:":"q1:","q3:":"q3:","source:":"l\xe4hde:","target:":"kohde:",trace:"sarja","upper fence:":"ylempi raja:"},format:{days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],shortDays:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kes\xe4kuu","hein\xe4kuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],shortMonths:["tammi","helmi","maalis","huhti","touko","kes\xe4","hein\xe4","elo","syys","loka","marras","joulu"],date:"%d.%m.%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"fr",dictionary:{Autoscale:"\xc9chelle automatique","Box Select":"S\xe9lection rectangulaire","Click to enter Colorscale title":"Ajouter un titre \xe0 l'\xe9chelle de couleurs","Click to enter Component A title":"Ajouter un titre \xe0 la composante A","Click to enter Component B title":"Ajouter un titre \xe0 la composante B","Click to enter Component C title":"Ajouter un titre \xe0 la composante C","Click to enter Plot title":"Ajouter un titre au graphique","Click to enter X axis title":"Ajouter un titre \xe0 l'axe des x","Click to enter Y axis title":"Ajouter un titre \xe0 l'axe des y","Click to enter radial axis title":"Ajouter un titre \xe0 l'axe radial","Compare data on hover":"Comparaison entre donn\xe9es en survol","Double-click on legend to isolate one trace":"Double-cliquer sur la l\xe9gende pour isoler une s\xe9rie","Double-click to zoom back out":"Double-cliquer pour d\xe9zoomer","Download plot as a png":"T\xe9l\xe9charger le graphique en fichier PNG","Download plot":"T\xe9l\xe9charger le graphique","Edit in Chart Studio":"\xc9diter le graphique sur Chart Studio","IE only supports svg. Changing format to svg.":"IE ne permet que les conversions en SVG. Conversion en SVG en cours.","Lasso Select":"S\xe9lection lasso","Orbital rotation":"Rotation orbitale",Pan:"Translation","Produced with Plotly":"G\xe9n\xe9r\xe9 avec Plotly",Reset:"R\xe9initialiser","Reset axes":"R\xe9initialiser les axes","Reset camera to default":"R\xe9gler la cam\xe9ra \xe0 sa valeur d\xe9faut","Reset camera to last save":"R\xe9gler la cam\xe9ra \xe0 sa valeur sauvegard\xe9e","Reset view":"R\xe9initialiser","Reset views":"R\xe9initialiser","Show closest data on hover":"Donn\xe9es les plus proches en survol","Snapshot succeeded":"Conversion r\xe9ussie","Sorry, there was a problem downloading your snapshot!":"D\xe9sol\xe9, un probl\xe8me est survenu lors du t\xe9l\xe9chargement de votre graphique","Taking snapshot - this may take a few seconds":"Conversion en cours, ceci peut prendre quelques secondes",Zoom:"Zoom","Zoom in":"Zoom int\xe9rieur","Zoom out":"Zoom ext\xe9rieur","close:":"fermeture :",trace:"s\xe9rie","lat:":"lat. :","lon:":"lon. :","q1:":"q1 :","q3:":"q3 :","source:":"source :","target:":"embouchure :","lower fence:":"cl\xf4ture sup\xe9rieure :","upper fence:":"cl\xf4ture inf\xe9rieure :","max:":"max. :","mean \xb1 \u03c3:":"moyenne \xb1 \u03c3 :","mean:":"moyenne :","median:":"m\xe9diane :","min:":"min. :","new text":"nouveau texte","Turntable rotation":"Rotation planaire","Toggle Spike Lines":"Activer/d\xe9sactiver les pics","open:":"ouverture :","high:":"haut :","low:":"bas :","Toggle show closest data on hover":"Activer/d\xe9sactiver le survol","incoming flow count:":"flux entrant :","outgoing flow count:":"flux sortant :","kde:":"est. par noyau :"},format:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],shortDays:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Janvier","F\xe9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xfbt","Septembre","Octobre","Novembre","D\xe9cembre"],shortMonths:["Jan","F\xe9v","Mar","Avr","Mai","Jun","Jul","Ao\xfb","Sep","Oct","Nov","D\xe9c"],date:"%d/%m/%Y",decimal:",",thousands:" ",year:"%Y",month:"%b %Y",dayMonth:"%-d %b",dayMonthYear:"%-d %b %Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"it",dictionary:{Autoscale:"Scala automaticamente","Box Select":"Selezione box","Click to enter Colorscale title":"Clicca per inserire un titolo alla scala di colori","Click to enter Component A title":"Clicca per inserire un titolo al componente A","Click to enter Component B title":"Clicca per inserire un titolo al componente B","Click to enter Component C title":"Clicca per inserire un titolo al componente C","Click to enter Plot title":"Clicca per inserire un titolo al grafico","Click to enter X axis title":"Clicca per inserire un titolo all'asse X","Click to enter Y axis title":"Clicca per inserire un titolo all'asse Y","Click to enter radial axis title":"Clicca per inserire un titolo per l' asse radiale","Compare data on hover":"Paragona i dati al passaggio del mouse","Double-click on legend to isolate one trace":"Doppio click per isolare i dati di una traccia","Double-click to zoom back out":"Doppio click per tornare allo zoom iniziale","Download plot as a png":"Scarica il grafico come immagine png","Download plot":"Scarica il grafico","Edit in Chart Studio":"Modifica in Chart Studio","IE only supports svg. Changing format to svg.":"IE supporta solo svg. Modifica formato in svg.","Lasso Select":"Selezione lazo","Orbital rotation":"Rotazione orbitale",Pan:"Sposta","Produced with Plotly":"Creato con Plotly",Reset:"Reset","Reset axes":"Resetta gli assi","Reset camera to default":"Reimposta la camera ai valori predefiniti","Reset camera to last save":"Reimposta la camera all' ultimo salvataggio","Reset view":"Reimposta la vista","Reset views":"Reimposta le viste","Show closest data on hover":"Mostra i dati pi\xf9 vicini al passaggio del mouse","Snapshot succeeded":"Screenshot creato con successo","Sorry, there was a problem downloading your snapshot!":"Si \xe8 verificato un errore durante la creazione dello screenshot","Taking snapshot - this may take a few seconds":"Creazione screenshot - potrebbe richiedere qualche secondo",Zoom:"Zoom","Zoom in":"Ingrandisci","Zoom out":"Rimpicciolisci","close:":"chiudi:",trace:"traccia","lat:":"lat.:","lon:":"lon.:","q1:":"q1:","q3:":"q3:","source:":"sorgente:","target:":"target:","max:":"max.:","mean \xb1 \u03c3:":"media \xb1 \u03c3:","mean:":"media:","median:":"mediana:","min:":"min.:","new text:":"Nuovo testo:","upper fence:":"limite superiore:","lower fence:":"limite inferiore:","Turntable rotation":"Rotazione piattaforma","Toggle Spike Lines":"Abilita linee di identificazione","open:":"apri:","high:":"alto:","kde:":"kde:","low:":"basso:","incoming flow count:":"Flusso in entrata:","outgoing flow count:":"Flusso in uscita:","Toggle show closest data on hover":"Abilita mostra i dati pi\xf9 vicini al passaggio del mouse"},format:{days:["Domenica","Luned\xec","Marted\xec","Mercoled\xec","Gioved\xec","Venerd\xec","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],date:"%d/%m/%Y",decimal:",",thousands:"."}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"de",dictionary:{Autoscale:"Automatische Skalierung","Box Select":"Rechteckauswahl","Click to enter Colorscale title":"Klicken, um den Farbskalatitel einzugeben","Click to enter Component A title":"Klicken, um den Titel der Komponente A einzugeben","Click to enter Component B title":"Klicken, um den Titel der Komponente B einzugeben","Click to enter Component C title":"Klicken, um den Titel der Komponente C einzugeben","Click to enter Plot title":"Klicken, um den Titel des Graphen einzugeben","Click to enter X axis title":"Klicken, um den Titel der X-Achse einzugeben","Click to enter Y axis title":"Klicken, um den Titel der Y-Achse einzugeben","Compare data on hover":"\xdcber die Daten fahren, um sie zu vergleichen","Double-click on legend to isolate one trace":"Daten isolieren durch Doppelklick in der Legende","Double-click to zoom back out":"Herauszoomen durch Doppelklick","Download plot as a png":"Graphen als PNG herunterladen","Download plot":"Graphen herunterladen","Edit in Chart Studio":"Im Chart Studio bearbeiten","IE only supports svg. Changing format to svg.":"IE unterst\xfctzt nur SVG-Dateien. Format wird zu SVG gewechselt.","Lasso Select":"Lassoauswahl","Orbital rotation":"Orbitalrotation",Pan:"Verschieben","Produced with Plotly.js":"Erstellt mit Plotly.js",Reset:"Zur\xfccksetzen","Reset axes":"Achsen zur\xfccksetzen","Reset camera to default":"Kamera auf Standard zur\xfccksetzen","Reset camera to last save":"Kamera auf letzte Speicherung zur\xfccksetzen","Reset view":"Ansicht zur\xfccksetzen","Reset views":"Ansichten zur\xfccksetzen","Show closest data on hover":"Zeige n\xe4heste Daten beim \xdcberfahren","Snapshot succeeded":"Snapshot erfolgreich","Sorry, there was a problem downloading your snapshot!":"Es gab ein Problem beim Herunterladen des Snapshots","Taking snapshot - this may take a few seconds":"Erstelle einen Snapshot - dies kann einige Sekunden dauern",Zoom:"Zoom","Zoom in":"Hineinzoomen","Zoom out":"Herauszoomen","close:":"Schluss:",trace:"Datenspur","lat:":"Lat.:","lon:":"Lon.:","q1:":"q1:","q3:":"q3:","source:":"Quelle:","target:":"Ziel:","lower fence:":"Untere Schranke:","upper fence:":"Obere Schranke:","max:":"Max.:","mean \xb1 \u03c3:":"Mittelwert \xb1 \u03c3:","mean:":"Mittelwert:","median:":"Median:","min:":"Min.:","Turntable rotation":"Drehscheibenorbit","Toggle Spike Lines":"Bezugslinien an-/abschalten","open:":"Er\xf6ffnung:","high:":"H\xf6chstkurs:","low:":"Tiefstkurs:","Toggle show closest data on hover":"Anzeige der n\xe4hesten Daten an-/abschalten","incoming flow count:":"Anzahl eingehender Verbindungen:","outgoing flow count:":"Anzahl ausgehender Verbindungen:","kde:":"Dichte:"},format:{days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","M\xe4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","M\xe4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],date:"%d.%m.%Y",decimal:",",thousands:"."}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"es",dictionary:{Autoscale:"Autoescalar","Box Select":"Seleccionar Caja","Click to enter Colorscale title":"Introducir el t\xedtulo de la Escala de Color","Click to enter Component A title":"Introducir el t\xedtulo del Componente A","Click to enter Component B title":"Introducir el t\xedtulo del Componente B","Click to enter Component C title":"Introducir el t\xedtulo del Componente C","Click to enter Plot title":"Introducir el t\xedtulo de la Gr\xe1fica","Click to enter X axis title":"Introducir el t\xedtulo del eje X","Click to enter Y axis title":"Introducir el t\xedtulo del eje Y","Click to enter radial axis title":"Introducir el t\xedtulo del eje radial","Compare data on hover":"Comparar datos al pasar por encima","Double-click on legend to isolate one trace":"Haga doble-clic en la leyenda para aislar una traza","Double-click to zoom back out":"Haga doble-clic para restaurar la escala","Download plot as a png":"Descargar gr\xe1fica como png","Download plot":"Descargar gr\xe1fica","Edit in Chart Studio":"Editar en Chart Studio","IE only supports svg. Changing format to svg.":"IE solo soporta svg. Cambiando formato a svg.","Lasso Select":"Seleccionar con lazo","Orbital rotation":"Rotaci\xf3n esf\xe9rica",Pan:"Modo Panor\xe1mica","Produced with Plotly.js":"Hecho con Plotly.js",Reset:"Reiniciar","Reset axes":"Reiniciar ejes","Reset camera to default":"Restaurar c\xe1mara predeterminada","Reset camera to last save":"Restaurar anterior c\xe1mara","Reset view":"Restaurar vista","Reset views":"Restaurar vistas","Show closest data on hover":"Mostrar el dato m\xe1s cercano al pasar por encima","Snapshot succeeded":"La captura de la instant\xe1nea finaliz\xf3 correctamente","Sorry, there was a problem downloading your snapshot!":"\xa1La descarga de la instant\xe1nea fall\xf3!","Taking snapshot - this may take a few seconds":"Capturando una instant\xe1nea - podr\xeda tardar unos segundos","Toggle Spike Lines":"Mostrar/Ocultar Gu\xedas","Toggle show closest data on hover":"Activar/Desactivar mostrar el dato m\xe1s cercano al pasar por encima","Turntable rotation":"Rotaci\xf3n plana",Zoom:"Modo Ampliar/Reducir","Zoom in":"Ampliar","Zoom out":"Reducir","close:":"cierre:","high:":"alza:","incoming flow count:":"flujo de entrada:","kde:":"edp:","lat:":"lat:","lon:":"lon:","low:":"baja:","lower fence:":"l\xedmite inferior:","max:":"m\xe1x:","mean \xb1 \u03c3:":"media \xb1 \u03c3:","mean:":"media:","median:":"mediana:","min:":"m\xedn:","new text":"nuevo texto","open:":"apertura:","outgoing flow count:":"flujo de salida:","q1:":"q1:","q3:":"q3:","source:":"fuente:","target:":"destino:",trace:"traza","upper fence:":"l\xedmite superior:"},format:{days:["Domingo","Lunes","Martes","Mi\xe9rcoles","Jueves","Viernes","S\xe1bado"],shortDays:["Dom","Lun","Mar","Mi\xe9","Jue","Vie","S\xe1b"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],shortMonths:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],date:"%d/%m/%Y",decimal:",",thousands:" "}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"fi",dictionary:{Autoscale:"Autoskaalaa","Box Select":"Laatikkovalinta","Click to enter Colorscale title":"Klikkaa antaaksesi v\xe4riskaalan otsikko","Click to enter Component A title":"Klikkaa antaaksesi komponentin A otsikko","Click to enter Component B title":"Klikkaa antaaksesi komponentin B otsikko","Click to enter Component C title":"Klikkaa antaaksesi komponentin C otsikko","Click to enter Plot title":"Klikkaa antaaksesi kuvion otsikko","Click to enter X axis title":"Klikkaa antaaksesi x-akselin otsikko","Click to enter Y axis title":"Klikkaa antaaksesi y-akselin otsikko","Click to enter radial axis title":"Klikkaa antaaksesi radiaalisen akselin otsikko","Compare data on hover":"Vertaa dataa kursorilla","Double-click on legend to isolate one trace":"Kaksoisklikkaa selitett\xe4 erist\xe4\xe4ksesi yksi sarja","Double-click to zoom back out":"Kaksoisklikkaa zoomataksesi ulos","Download plot":"Lataa kuvio","Download plot as png":"Lataa kuvio png-muodossa","Edit in Chart Studio":"Muokkaa Chart Studiossa","IE only supports svg. Changing format to svg.":"Formaatiksi vaihdetaan IE:n tukema svg.","Lasso Select":"Lassovalinta","Orbital rotation":"Orbitaalikierto",Pan:"Panorointi","Produced with Plotly.js":"Tuotettu Plotly.jsll\xe4",Reset:"Palauta oletusasetukset","Reset axes":"Palauta akselien oletusasetukset","Reset camera to default":"Palauta kameran oletusasetukset","Reset camera to last save":"Palauta kameran viimeksi tallennetut asetukset","Reset view":"Palauta n\xe4kym\xe4n oletusasetukset","Reset views":"Palauta n\xe4kymien oletusasetukset","Show closest data on hover":"N\xe4yt\xe4 kursoria l\xe4hin data","Snapshot succeeded":"Tilannekuvan ottaminen onnistui","Sorry, there was a problem downloading your snapshot!":"Pahoittelut, tilannekuvan lataaminen ep\xe4onnistui!","Taking snapshot - this may take a few seconds":"Otetaan tilannekuvaa - odota hetki","Toggle Spike Lines":"N\xe4yt\xe4 huiput","Toggle show closest data on hover":"N\xe4yt\xe4 kursoria l\xe4hin data","Turntable rotation":"Tasokierto",Zoom:"Zoomaus","Zoom in":"Zoomaa sis\xe4\xe4n","Zoom out":"Zoomaa ulos","close:":"loppu:","high:":"korkein:","incoming flow count:":"saapuva virtaus:","kde:":"ydinestimointi:","lat:":"lat.:","lon:":"lon.:","low:":"matalin:","lower fence:":"alempi raja:","max:":"maks.:","mean \xb1 \u03c3:":"keskiarvo \xb1 \u03c3:","mean:":"keskiarvo:","median:":"mediaani:","min:":"min.:","new text":"uusi teksti","open:":"alku:","outgoing flow count:":"l\xe4htev\xe4 virtaus:","q1:":"q1:","q3:":"q3:","source:":"l\xe4hde:","target:":"kohde:",trace:"sarja","upper fence:":"ylempi raja:"},format:{days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],shortDays:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kes\xe4kuu","hein\xe4kuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],shortMonths:["tammi","helmi","maalis","huhti","touko","kes\xe4","hein\xe4","elo","syys","loka","marras","joulu"],date:"%d.%m.%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"fr",dictionary:{Autoscale:"\xc9chelle automatique","Box Select":"S\xe9lection rectangulaire","Click to enter Colorscale title":"Ajouter un titre \xe0 l'\xe9chelle de couleurs","Click to enter Component A title":"Ajouter un titre \xe0 la composante A","Click to enter Component B title":"Ajouter un titre \xe0 la composante B","Click to enter Component C title":"Ajouter un titre \xe0 la composante C","Click to enter Plot title":"Ajouter un titre au graphique","Click to enter X axis title":"Ajouter un titre \xe0 l'axe des x","Click to enter Y axis title":"Ajouter un titre \xe0 l'axe des y","Click to enter radial axis title":"Ajouter un titre \xe0 l'axe radial","Compare data on hover":"Comparaison entre donn\xe9es en survol","Double-click on legend to isolate one trace":"Double-cliquer sur la l\xe9gende pour isoler une s\xe9rie","Double-click to zoom back out":"Double-cliquer pour d\xe9zoomer","Download plot as a png":"T\xe9l\xe9charger le graphique en fichier PNG","Download plot":"T\xe9l\xe9charger le graphique","Edit in Chart Studio":"\xc9diter le graphique sur Chart Studio","IE only supports svg. Changing format to svg.":"IE ne permet que les conversions en SVG. Conversion en SVG en cours.","Lasso Select":"S\xe9lection lasso","Orbital rotation":"Rotation orbitale",Pan:"Translation","Produced with Plotly.js":"G\xe9n\xe9r\xe9 avec Plotly.js",Reset:"R\xe9initialiser","Reset axes":"R\xe9initialiser les axes","Reset camera to default":"R\xe9gler la cam\xe9ra \xe0 sa valeur d\xe9faut","Reset camera to last save":"R\xe9gler la cam\xe9ra \xe0 sa valeur sauvegard\xe9e","Reset view":"R\xe9initialiser","Reset views":"R\xe9initialiser","Show closest data on hover":"Donn\xe9es les plus proches en survol","Snapshot succeeded":"Conversion r\xe9ussie","Sorry, there was a problem downloading your snapshot!":"D\xe9sol\xe9, un probl\xe8me est survenu lors du t\xe9l\xe9chargement de votre graphique","Taking snapshot - this may take a few seconds":"Conversion en cours, ceci peut prendre quelques secondes",Zoom:"Zoom","Zoom in":"Zoom int\xe9rieur","Zoom out":"Zoom ext\xe9rieur","close:":"fermeture :",trace:"s\xe9rie","lat:":"lat. :","lon:":"lon. :","q1:":"q1 :","q3:":"q3 :","source:":"source :","target:":"embouchure :","lower fence:":"cl\xf4ture sup\xe9rieure :","upper fence:":"cl\xf4ture inf\xe9rieure :","max:":"max. :","mean \xb1 \u03c3:":"moyenne \xb1 \u03c3 :","mean:":"moyenne :","median:":"m\xe9diane :","min:":"min. :","new text":"nouveau texte","Turntable rotation":"Rotation planaire","Toggle Spike Lines":"Activer/d\xe9sactiver les pics","open:":"ouverture :","high:":"haut :","low:":"bas :","Toggle show closest data on hover":"Activer/d\xe9sactiver le survol","incoming flow count:":"flux entrant :","outgoing flow count:":"flux sortant :","kde:":"est. par noyau :"},format:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],shortDays:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Janvier","F\xe9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xfbt","Septembre","Octobre","Novembre","D\xe9cembre"],shortMonths:["Jan","F\xe9v","Mar","Avr","Mai","Jun","Jul","Ao\xfb","Sep","Oct","Nov","D\xe9c"],date:"%d/%m/%Y",decimal:",",thousands:" ",year:"%Y",month:"%b %Y",dayMonth:"%-d %b",dayMonthYear:"%-d %b %Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"it",dictionary:{Autoscale:"Scala automaticamente","Box Select":"Selezione box","Click to enter Colorscale title":"Clicca per inserire un titolo alla scala di colori","Click to enter Component A title":"Clicca per inserire un titolo al componente A","Click to enter Component B title":"Clicca per inserire un titolo al componente B","Click to enter Component C title":"Clicca per inserire un titolo al componente C","Click to enter Plot title":"Clicca per inserire un titolo al grafico","Click to enter X axis title":"Clicca per inserire un titolo all'asse X","Click to enter Y axis title":"Clicca per inserire un titolo all'asse Y","Click to enter radial axis title":"Clicca per inserire un titolo per l' asse radiale","Compare data on hover":"Paragona i dati al passaggio del mouse","Double-click on legend to isolate one trace":"Doppio click per isolare i dati di una traccia","Double-click to zoom back out":"Doppio click per tornare allo zoom iniziale","Download plot as a png":"Scarica il grafico come immagine png","Download plot":"Scarica il grafico","Edit in Chart Studio":"Modifica in Chart Studio","IE only supports svg. Changing format to svg.":"IE supporta solo svg. Modifica formato in svg.","Lasso Select":"Selezione lazo","Orbital rotation":"Rotazione orbitale",Pan:"Sposta","Produced with Plotly.js":"Creato con Plotly.js",Reset:"Reset","Reset axes":"Resetta gli assi","Reset camera to default":"Reimposta la camera ai valori predefiniti","Reset camera to last save":"Reimposta la camera all' ultimo salvataggio","Reset view":"Reimposta la vista","Reset views":"Reimposta le viste","Show closest data on hover":"Mostra i dati pi\xf9 vicini al passaggio del mouse","Snapshot succeeded":"Screenshot creato con successo","Sorry, there was a problem downloading your snapshot!":"Si \xe8 verificato un errore durante la creazione dello screenshot","Taking snapshot - this may take a few seconds":"Creazione screenshot - potrebbe richiedere qualche secondo",Zoom:"Zoom","Zoom in":"Ingrandisci","Zoom out":"Rimpicciolisci","close:":"chiudi:",trace:"traccia","lat:":"lat.:","lon:":"lon.:","q1:":"q1:","q3:":"q3:","source:":"sorgente:","target:":"target:","max:":"max.:","mean \xb1 \u03c3:":"media \xb1 \u03c3:","mean:":"media:","median:":"mediana:","min:":"min.:","new text:":"Nuovo testo:","upper fence:":"limite superiore:","lower fence:":"limite inferiore:","Turntable rotation":"Rotazione piattaforma","Toggle Spike Lines":"Abilita linee di identificazione","open:":"apri:","high:":"alto:","kde:":"kde:","low:":"basso:","incoming flow count:":"Flusso in entrata:","outgoing flow count:":"Flusso in uscita:","Toggle show closest data on hover":"Abilita mostra i dati pi\xf9 vicini al passaggio del mouse"},format:{days:["Domenica","Luned\xec","Marted\xec","Mercoled\xec","Gioved\xec","Venerd\xec","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],date:"%d/%m/%Y",decimal:",",thousands:"."}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); var locale={moduleType:"locale",name:"nl",dictionary:{},format:{days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],shortDays:["zon","maa","din","woe","don","vri","zat"],months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],shortMonths:["jan","feb","maa","apr","mei","jun","jul","aug","sep","okt","nov","dec"],date:"%d-%m-%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); var locale={moduleType:"locale",name:"pl",dictionary:{},format:{days:["Niedziela","Poniedzia\u0142ek","Wtorek","\u015aroda","Czwartek","Pi\u0105tek","Sobota"],shortDays:["Nie","Pn","Wt","\u015ar","Czw","Pt","So"],months:["Stycze\u0144","Luty","Marzec","Kwiecie\u0144","Maj","Czerwiec","Lipiec","Sierpie\u0144","Wrzesie\u0144","Pa\u017adziernik","Listopad","Grudzie\u0144"],shortMonths:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"pt-BR",dictionary:{Autoscale:"Escala autom\xe1tica","Box Select":"Sele\xe7\xe3o retangular","Click to enter Colorscale title":"Clique para editar o t\xedtulo da escala de cor","Click to enter Component A title":"Clique para editar o t\xedtulo do Componente A","Click to enter Component B title":"Clique para editar o t\xedtulo do Componente B","Click to enter Component C title":"Clique para editar o t\xedtulo do Componente C","Click to enter Plot title":"Clique para editar o t\xedtulo do Gr\xe1fico","Click to enter X axis title":"Clique para editar o t\xedtulo do eixo X","Click to enter Y axis title":"Clique para editar o t\xedtulo do eixo Y","Click to enter radial axis title":"Clique para editar o t\xedtulo do eixo radial","Compare data on hover":"Comparar dados ao pairar","Double-click on legend to isolate one trace":"Duplo clique na legenda para isolar uma s\xe9rie","Double-click to zoom back out":"Duplo clique para reverter zoom","Download plot as a png":"Fazer download do gr\xe1fico como imagem (png)","Download plot":"Fazer download do gr\xe1fico","Edit in Chart Studio":"Editar no Chart Studio","IE only supports svg. Changing format to svg.":"IE suporta apenas svg. Alterando formato para svg","Lasso Select":"Sele\xe7\xe3o de la\xe7o","Orbital rotation":"Rota\xe7\xe3o orbital",Pan:"Mover","Produced with Plotly":"Criado com o Plotly",Reset:"Restaurar","Reset axes":"Restaurar eixos","Reset camera to default":"Restaurar c\xe2mera para padr\xe3o","Reset camera to last save":"Restaurar c\xe2mera para \xfaltima salva","Reset view":"Restaurar vis\xe3o","Reset views":"Restaurar vis\xf5es","Show closest data on hover":"Exibir dado mais pr\xf3ximo ao pairar","Snapshot succeeded":"Captura instant\xe2nea completa","Sorry, there was a problem downloading your snapshot!":"Desculpe, houve um problema no download de sua captura instant\xe2nea!","Taking snapshot - this may take a few seconds":"Efetuando captura instant\xe2nea - isso pode levar alguns instantes","Toggle Spike Lines":"Habilitar/desabilitar triangula\xe7\xe3o de linhas","Toggle show closest data on hover":"Habilitar/desabilitar exibi\xe7\xe3o de dado mais pr\xf3ximo ao pairar","Turntable rotation":"Rota\xe7\xe3o de mesa",Zoom:"Zoom","Zoom in":"Ampliar zoom","Zoom out":"Reduzir zoom",close:"fechamento",high:"alta","incoming flow count":"contagem de fluxo de entrada",kde:"kde",lat:"latitude",lon:"longitude",low:"baixa","lower fence":"limite inferior",max:"m\xe1ximo","mean \xb1 \u03c3":"m\xe9dia \xb1 \u03c3",mean:"m\xe9dia",median:"mediana",min:"m\xednimo","new text":"novo texto",open:"abertura","outgoing flow count":"contagem de fluxo de sa\xedda",q1:"q1",q3:"q3",source:"origem",target:"destino",trace:"s\xe9rie","upper fence":"limite superior"},format:{days:["Domingo","Segunda-feira","Ter\xe7a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"pt-PT",dictionary:{Autoscale:"Escala autom\xe1tica","Box Select":"Sele\xe7\xe3o retangular","Click to enter Colorscale title":"Clique para editar o t\xedtulo da escala de cor","Click to enter Component A title":"Clique para editar o t\xedtulo do Componente A","Click to enter Component B title":"Clique para editar o t\xedtulo do Componente B","Click to enter Component C title":"Clique para editar o t\xedtulo do Componente C","Click to enter Plot title":"Clique para editar o t\xedtulo do Gr\xe1fico","Click to enter X axis title":"Clique para editar o t\xedtulo do eixo X","Click to enter Y axis title":"Clique para editar o t\xedtulo do eixo Y","Click to enter radial axis title":"Clique para editar o t\xedtulo do eixo radial","Compare data on hover":"Comparar dados ao pairar","Double-click on legend to isolate one trace":"Duplo clique na legenda para isolar uma s\xe9rie","Double-click to zoom back out":"Duplo clique para reverter amplia\xe7\xe3o","Download plot as a png":"Baixar gr\xe1fico como imagem (png)","Download plot":"Baixar gr\xe1fico","Edit in Chart Studio":"Editar no Chart Studio","IE only supports svg. Changing format to svg.":"IE suporta apenas svg. Alterando formato para svg","Lasso Select":"Sele\xe7\xe3o de la\xe7o","Orbital rotation":"Rota\xe7\xe3o orbital",Pan:"Mover","Produced with Plotly":"Criado com Plotly",Reset:"Restaurar","Reset axes":"Restaurar eixos","Reset camera to default":"Restaurar c\xe2mera para padr\xe3o","Reset camera to last save":"Restaurar c\xe2mera para \xfaltima grava\xe7\xe3o","Reset view":"Restaurar vista","Reset views":"Restaurar vistas","Show closest data on hover":"Exibir dado mais pr\xf3ximo ao pairar","Snapshot succeeded":"Captura instant\xe2nea com sucesso","Sorry, there was a problem downloading your snapshot!":"Desculpe, houve um problema no download de sua captura instant\xe2nea!","Taking snapshot - this may take a few seconds":"Efetuando captura instant\xe2nea - isso pode demorar alguns segundos","Toggle Spike Lines":"Habilitar/desabilitar triangula\xe7\xe3o de linhas","Toggle show closest data on hover":"Habilitar/desabilitar exibi\xe7\xe3o de dado mais pr\xf3ximo ao pairar","Turntable rotation":"Rodar",Zoom:"Ampliar","Zoom in":"Aumentar Amplia\xe7\xe3o","Zoom out":"Reduzir Amplia\xe7\xe3o",close:"fechar",high:"alta","incoming flow count":"contagem de fluxo de entrada",kde:"kde",lat:"latitude",lon:"longitude",low:"baixa","lower fence":"limite inferior",max:"m\xe1ximo","mean \xb1 \u03c3":"m\xe9dia \xb1 \u03c3",mean:"m\xe9dia",median:"mediana",min:"m\xednimo","new text":"novo texto",open:"abrir","outgoing flow count":"contagem de fluxo de sa\xedda",q1:"q1",q3:"q3",source:"origem",target:"destino",trace:"s\xe9rie","upper fence":"limite superior"},format:{days:["domingo","segunda-feira","ter\xe7a-feira","quarta-feira","quinta-feira","sexta-feira","s\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"sv",dictionary:{Autoscale:"Autoskala","Box Select":"V\xe4lj rektangel","Click to enter Colorscale title":"Klicka f\xf6r att ange titel p\xe5 f\xe4rgskala","Click to enter Component A title":"Klicka f\xf6r att ange titel p\xe5 komponent A","Click to enter Component B title":"Klicka f\xf6r att ange titel p\xe5 komponent B","Click to enter Component C title":"Klicka f\xf6r att ange titel p\xe5 komponent C","Click to enter Plot title":"Klicka f\xf6r att ange titel p\xe5 diagram","Click to enter X axis title":"Klicka f\xf6r att ange titel p\xe5 x-axel","Click to enter Y axis title":"Klicka f\xf6r att ange titel p\xe5 y-axel","Click to enter radial axis title":"Klicka f\xf6r att ange titel p\xe5 radiell axel","Compare data on hover":"J\xe4mf\xf6r data n\xe4r muspekaren h\xe5lls \xf6ver","Double-click on legend to isolate one trace":"Dubbelklicka p\xe5 f\xf6rklaringen f\xf6r att visa endast en serie","Double-click to zoom back out":"Dubbelklicka f\xf6r att zooma ut igen","Download plot":"Ladda ner diagram","Download plot as a png":"Ladda ner diagram som png","Edit in Chart Studio":"Editera i Chart Studio","IE only supports svg. Changing format to svg.":"IE st\xf6der enbart svg. Byter format till svg.","Lasso Select":"V\xe4lj lasso","Orbital rotation":"Orbital rotation",Pan:"Panorera","Produced with Plotly":"Skapad med Plotly",Reset:"\xc5terst\xe4ll","Reset axes":"\xc5terst\xe4ll axlar","Reset camera to default":"\xc5terst\xe4ll kamera till standard","Reset camera to last save":"\xc5terst\xe4ll kamera till senast sparad","Reset view":"\xc5terst\xe4ll vy","Reset views":"\xc5terst\xe4ll vyer","Show closest data on hover":"Visa n\xe4rmaste v\xe4rde n\xe4r muspekaren h\xe5lls \xf6ver","Snapshot succeeded":"Bild skapad","Sorry, there was a problem downloading your snapshot!":"Tyv\xe4rr gick n\xe5got fel vid nedladdning av bild","Taking snapshot - this may take a few seconds":"Skapar bild - detta kan ta n\xe5gra sekunder","Toggle Spike Lines":"Aktivera/Inaktivera topplinjer","Toggle show closest data on hover":"Aktivera/Inaktivera visa n\xe4rmaste v\xe4rde n\xe4r muspekaren h\xe5lls \xf6ver","Turntable rotation":"Platt rotation",Zoom:"Zooma","Zoom in":"Zooma in","Zoom out":"Zooma ut","close:":"st\xe4ngning:","concentration:":"koncentration:","high:":"h\xf6g:","incoming flow count:":"inkommande fl\xf6de summering:","kde:":"kde:","lat:":"lat:","lon:":"lon:","low:":"l\xe5g:","lower fence:":"undre gr\xe4ns:","max:":"max:","mean \xb1 \u03c3:":"medel \xb1 \u03c3:","mean:":"medel:","median:":"median:","min:":"min:","new text":"ny text","open:":"\xf6ppning:","outgoing flow count:":"utg\xe5ende fl\xf6de summering:","q1:":"q1:","q3:":"q3:","source:":"k\xe4lla:","target:":"m\xe5l:",trace:"serie","upper fence:":"\xf6vre gr\xe4ns:"},format:{days:["S\xf6ndag","M\xe5ndag","Tisdag","Onsdag","Torsdag","Fredag","L\xf6rdag"],shortDays:["S\xf6n","M\xe5n","Tis","Ons","Tor","Fre","L\xf6r"],months:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"pt-BR",dictionary:{Autoscale:"Escala autom\xe1tica","Box Select":"Sele\xe7\xe3o retangular","Click to enter Colorscale title":"Clique para editar o t\xedtulo da escala de cor","Click to enter Component A title":"Clique para editar o t\xedtulo do Componente A","Click to enter Component B title":"Clique para editar o t\xedtulo do Componente B","Click to enter Component C title":"Clique para editar o t\xedtulo do Componente C","Click to enter Plot title":"Clique para editar o t\xedtulo do Gr\xe1fico","Click to enter X axis title":"Clique para editar o t\xedtulo do eixo X","Click to enter Y axis title":"Clique para editar o t\xedtulo do eixo Y","Click to enter radial axis title":"Clique para editar o t\xedtulo do eixo radial","Compare data on hover":"Comparar dados ao pairar","Double-click on legend to isolate one trace":"Duplo clique na legenda para isolar uma s\xe9rie","Double-click to zoom back out":"Duplo clique para reverter zoom","Download plot as a png":"Fazer download do gr\xe1fico como imagem (png)","Download plot":"Fazer download do gr\xe1fico","Edit in Chart Studio":"Editar no Chart Studio","IE only supports svg. Changing format to svg.":"IE suporta apenas svg. Alterando formato para svg","Lasso Select":"Sele\xe7\xe3o de la\xe7o","Orbital rotation":"Rota\xe7\xe3o orbital",Pan:"Mover","Produced with Plotly.js":"Criado com o Plotly.js",Reset:"Restaurar","Reset axes":"Restaurar eixos","Reset camera to default":"Restaurar c\xe2mera para padr\xe3o","Reset camera to last save":"Restaurar c\xe2mera para \xfaltima salva","Reset view":"Restaurar vis\xe3o","Reset views":"Restaurar vis\xf5es","Show closest data on hover":"Exibir dado mais pr\xf3ximo ao pairar","Snapshot succeeded":"Captura instant\xe2nea completa","Sorry, there was a problem downloading your snapshot!":"Desculpe, houve um problema no download de sua captura instant\xe2nea!","Taking snapshot - this may take a few seconds":"Efetuando captura instant\xe2nea - isso pode levar alguns instantes","Toggle Spike Lines":"Habilitar/desabilitar triangula\xe7\xe3o de linhas","Toggle show closest data on hover":"Habilitar/desabilitar exibi\xe7\xe3o de dado mais pr\xf3ximo ao pairar","Turntable rotation":"Rota\xe7\xe3o de mesa",Zoom:"Zoom","Zoom in":"Ampliar zoom","Zoom out":"Reduzir zoom",close:"fechamento",high:"alta","incoming flow count":"contagem de fluxo de entrada",kde:"kde",lat:"latitude",lon:"longitude",low:"baixa","lower fence":"limite inferior",max:"m\xe1ximo","mean \xb1 \u03c3":"m\xe9dia \xb1 \u03c3",mean:"m\xe9dia",median:"mediana",min:"m\xednimo","new text":"novo texto",open:"abertura","outgoing flow count":"contagem de fluxo de sa\xedda",q1:"q1",q3:"q3",source:"origem",target:"destino",trace:"s\xe9rie","upper fence":"limite superior"},format:{days:["Domingo","Segunda-feira","Ter\xe7a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"pt-PT",dictionary:{Autoscale:"Escala autom\xe1tica","Box Select":"Sele\xe7\xe3o retangular","Click to enter Colorscale title":"Clique para editar o t\xedtulo da escala de cor","Click to enter Component A title":"Clique para editar o t\xedtulo do Componente A","Click to enter Component B title":"Clique para editar o t\xedtulo do Componente B","Click to enter Component C title":"Clique para editar o t\xedtulo do Componente C","Click to enter Plot title":"Clique para editar o t\xedtulo do Gr\xe1fico","Click to enter X axis title":"Clique para editar o t\xedtulo do eixo X","Click to enter Y axis title":"Clique para editar o t\xedtulo do eixo Y","Click to enter radial axis title":"Clique para editar o t\xedtulo do eixo radial","Compare data on hover":"Comparar dados ao pairar","Double-click on legend to isolate one trace":"Duplo clique na legenda para isolar uma s\xe9rie","Double-click to zoom back out":"Duplo clique para reverter amplia\xe7\xe3o","Download plot as a png":"Baixar gr\xe1fico como imagem (png)","Download plot":"Baixar gr\xe1fico","Edit in Chart Studio":"Editar no Chart Studio","IE only supports svg. Changing format to svg.":"IE suporta apenas svg. Alterando formato para svg","Lasso Select":"Sele\xe7\xe3o de la\xe7o","Orbital rotation":"Rota\xe7\xe3o orbital",Pan:"Mover","Produced with Plotly.js":"Criado com Plotly.js",Reset:"Restaurar","Reset axes":"Restaurar eixos","Reset camera to default":"Restaurar c\xe2mera para padr\xe3o","Reset camera to last save":"Restaurar c\xe2mera para \xfaltima grava\xe7\xe3o","Reset view":"Restaurar vista","Reset views":"Restaurar vistas","Show closest data on hover":"Exibir dado mais pr\xf3ximo ao pairar","Snapshot succeeded":"Captura instant\xe2nea com sucesso","Sorry, there was a problem downloading your snapshot!":"Desculpe, houve um problema no download de sua captura instant\xe2nea!","Taking snapshot - this may take a few seconds":"Efetuando captura instant\xe2nea - isso pode demorar alguns segundos","Toggle Spike Lines":"Habilitar/desabilitar triangula\xe7\xe3o de linhas","Toggle show closest data on hover":"Habilitar/desabilitar exibi\xe7\xe3o de dado mais pr\xf3ximo ao pairar","Turntable rotation":"Rodar",Zoom:"Ampliar","Zoom in":"Aumentar Amplia\xe7\xe3o","Zoom out":"Reduzir Amplia\xe7\xe3o",close:"fechar",high:"alta","incoming flow count":"contagem de fluxo de entrada",kde:"kde",lat:"latitude",lon:"longitude",low:"baixa","lower fence":"limite inferior",max:"m\xe1ximo","mean \xb1 \u03c3":"m\xe9dia \xb1 \u03c3",mean:"m\xe9dia",median:"mediana",min:"m\xednimo","new text":"novo texto",open:"abrir","outgoing flow count":"contagem de fluxo de sa\xedda",q1:"q1",q3:"q3",source:"origem",target:"destino",trace:"s\xe9rie","upper fence":"limite superior"},format:{days:["domingo","segunda-feira","ter\xe7a-feira","quarta-feira","quinta-feira","sexta-feira","s\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"sv",dictionary:{Autoscale:"Autoskala","Box Select":"V\xe4lj rektangel","Click to enter Colorscale title":"Klicka f\xf6r att ange titel p\xe5 f\xe4rgskala","Click to enter Component A title":"Klicka f\xf6r att ange titel p\xe5 komponent A","Click to enter Component B title":"Klicka f\xf6r att ange titel p\xe5 komponent B","Click to enter Component C title":"Klicka f\xf6r att ange titel p\xe5 komponent C","Click to enter Plot title":"Klicka f\xf6r att ange titel p\xe5 diagram","Click to enter X axis title":"Klicka f\xf6r att ange titel p\xe5 x-axel","Click to enter Y axis title":"Klicka f\xf6r att ange titel p\xe5 y-axel","Click to enter radial axis title":"Klicka f\xf6r att ange titel p\xe5 radiell axel","Compare data on hover":"J\xe4mf\xf6r data n\xe4r muspekaren h\xe5lls \xf6ver","Double-click on legend to isolate one trace":"Dubbelklicka p\xe5 f\xf6rklaringen f\xf6r att visa endast en serie","Double-click to zoom back out":"Dubbelklicka f\xf6r att zooma ut igen","Download plot":"Ladda ner diagram","Download plot as a png":"Ladda ner diagram som png","Edit in Chart Studio":"Editera i Chart Studio","IE only supports svg. Changing format to svg.":"IE st\xf6der enbart svg. Byter format till svg.","Lasso Select":"V\xe4lj lasso","Orbital rotation":"Orbital rotation",Pan:"Panorera","Produced with Plotly.js":"Skapad med Plotly.js",Reset:"\xc5terst\xe4ll","Reset axes":"\xc5terst\xe4ll axlar","Reset camera to default":"\xc5terst\xe4ll kamera till standard","Reset camera to last save":"\xc5terst\xe4ll kamera till senast sparad","Reset view":"\xc5terst\xe4ll vy","Reset views":"\xc5terst\xe4ll vyer","Show closest data on hover":"Visa n\xe4rmaste v\xe4rde n\xe4r muspekaren h\xe5lls \xf6ver","Snapshot succeeded":"Bild skapad","Sorry, there was a problem downloading your snapshot!":"Tyv\xe4rr gick n\xe5got fel vid nedladdning av bild","Taking snapshot - this may take a few seconds":"Skapar bild - detta kan ta n\xe5gra sekunder","Toggle Spike Lines":"Aktivera/Inaktivera topplinjer","Toggle show closest data on hover":"Aktivera/Inaktivera visa n\xe4rmaste v\xe4rde n\xe4r muspekaren h\xe5lls \xf6ver","Turntable rotation":"Platt rotation",Zoom:"Zooma","Zoom in":"Zooma in","Zoom out":"Zooma ut","close:":"st\xe4ngning:","concentration:":"koncentration:","high:":"h\xf6g:","incoming flow count:":"inkommande fl\xf6de summering:","kde:":"kde:","lat:":"lat:","lon:":"lon:","low:":"l\xe5g:","lower fence:":"undre gr\xe4ns:","max:":"max:","mean \xb1 \u03c3:":"medel \xb1 \u03c3:","mean:":"medel:","median:":"median:","min:":"min:","new text":"ny text","open:":"\xf6ppning:","outgoing flow count:":"utg\xe5ende fl\xf6de summering:","q1:":"q1:","q3:":"q3:","source:":"k\xe4lla:","target:":"m\xe5l:",trace:"serie","upper fence:":"\xf6vre gr\xe4ns:"},format:{days:["S\xf6ndag","M\xe5ndag","Tisdag","Onsdag","Torsdag","Fredag","L\xf6rdag"],shortDays:["S\xf6n","M\xe5n","Tis","Ons","Tor","Fre","L\xf6r"],months:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); var locale={moduleType:"locale",name:"tr",dictionary:{},format:{days:["Pazar","Pazartesi","Sal\u0131","\xc7ar\u015famba","Per\u015fembe","Cuma","Cumartesi"],shortDays:["Pz","Pt","Sa","\xc7a","Pe","Cu","Ct"],months:["Ocak","\u015eubat","Mart","Nisan","May\u0131s","Haziran","Temmuz","A\u011fustos","Eyl\xfcl","Ekim","Kas\u0131m","Aral\u0131k"],shortMonths:["Oca","\u015eub","Mar","Nis","May","Haz","Tem","A\u011fu","Eyl","Eki","Kas","Ara"],date:"%d.%m.%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"uk",dictionary:{Autoscale:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0448\u043a\u0430\u043b\u044e\u0432\u0430\u043d\u043d\u044f","Box Select":"\u0412\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u043f\u0440\u044f\u043c\u043e\u043a\u0443\u0442\u043d\u043e\u0457 \u043e\u0431\u043b\u0430\u0441\u0442\u0456","Click to enter Colorscale title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u0448\u043a\u0430\u043b\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0443","Click to enter Component A title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 A","Click to enter Component B title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 B","Click to enter Component C title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 C","Click to enter Plot title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u0433\u0440\u0430\u0444\u0456\u043a\u0430","Click to enter X axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043e\u0441\u0456 X","Click to enter Y axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043e\u0441\u0456 Y","Click to enter radial axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0457 \u043e\u0441\u0456","Compare data on hover":"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456 \u043f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u043d\u0456","Double-click on legend to isolate one trace":"\u0414\u0432\u0456\u0447\u0456 \u043a\u043b\u0430\u0446\u043d\u0456\u0442\u044c \u043f\u043e \u043b\u0435\u0433\u0435\u043d\u0434\u0456 \u0434\u043b\u044f \u0432\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0434\u0430\u043d\u0438\u0445","Double-click to zoom back out":"\u0414\u043b\u044f \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c \u0434\u0432\u0456\u0447\u0456 \u043a\u043b\u0430\u0446\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e","Download plot":"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0433\u0440\u0430\u0444\u0456\u043a","Download plot as a png":"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0456 PNG","Edit in Chart Studio":"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0443 Chart Studio","IE only supports svg. Changing format to svg.":"IE \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u0454 \u043b\u0438\u0448\u0435 svg. \u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u043c\u0456\u043d\u044e\u0454\u0442\u044c\u0441\u044f \u043d\u0430 svg.","Lasso Select":"\u041b\u0430\u0441\u043e","Orbital rotation":"\u0420\u0443\u0445 \u043f\u043e \u043e\u0440\u0431\u0456\u0442\u0456",Pan:"\u0417\u0441\u0443\u0432","Produced with Plotly":"\u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e Plotly",Reset:"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset axes":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043e\u0441\u044f\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset camera to default":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u0456 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset camera to last save":"\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u0443 \u0432 \u043e\u0441\u0442\u0430\u043d\u043d\u0456\u0439 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043d","Reset view":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset views":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Show closest data on hover":"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456 \u043f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0456 \u0434\u0430\u043d\u0456","Snapshot succeeded":"\u0417\u043d\u0456\u043c\u043e\u043a \u0443\u0441\u043f\u0456\u0448\u043d\u043e \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439","Sorry, there was a problem downloading your snapshot!":"\u041d\u0430 \u0436\u0430\u043b\u044c, \u0432\u0438\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u0456 \u0437\u043d\u0456\u043c\u043a\u0443","Taking snapshot - this may take a few seconds":"\u0421\u0442\u0432\u043e\u0440\u044e\u0454\u0442\u044c\u0441\u044f \u0437\u043d\u0456\u043c\u043e\u043a - \u0446\u0435 \u043c\u043e\u0436\u0435 \u0437\u0430\u0439\u043d\u044f\u0442\u0438 \u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434","Toggle Spike Lines":"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438/\u0432\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043b\u0456\u043d\u0456\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0456\u0439 \u0442\u043e\u0447\u043e\u043a","Toggle show closest data on hover":"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438/\u0432\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0438\u0445 \u0434\u0430\u043d\u0438\u0445 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456","Turntable rotation":"\u041e\u0431\u0435\u0440\u0442\u0430\u043d\u043d\u044f \u043d\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043d\u043e\u043c\u0443 \u0441\u0442\u043e\u043b\u0456",Zoom:"\u0417\u0443\u043c","Zoom in":"\u0417\u0431\u0456\u043b\u044c\u0448\u0438\u0442\u0438","Zoom out":"\u0417\u043c\u0435\u043d\u0448\u0438\u0442\u0438","close:":"\u0417\u0430\u043a\u0440\u0438\u0442\u0442\u044f:","concentration:":"\u041a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0456\u044f:","high:":"\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c:","incoming flow count:":"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0445\u0456\u0434\u043d\u0438\u0445 \u0437\u0432'\u044f\u0437\u043a\u0456\u0432:","kde:":"\u042f\u0434\u0440\u043e\u0432\u0430 \u043e\u0446\u0456\u043d\u043a\u0430 \u0433\u0443\u0441\u0442\u0438\u043d\u0438 \u0440\u043e\u0437\u043f\u043e\u0434\u0456\u043b\u0443:","lat:":"\u0428\u0438\u0440\u043e\u0442\u0430:","lon:":"\u0414\u043e\u0432\u0433\u043e\u0442\u0430:","low:":"\u041c\u0456\u043d\u0456\u043c\u0443\u043c:","lower fence:":"\u041d\u0438\u0436\u043d\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044f:","max:":"\u041c\u0430\u043a\u0441.:","mean \xb1 \u03c3:":"\u0421\u0435\u0440\u0435\u0434\u043d\u0454 \xb1 \u03c3:","mean:":"\u0421\u0435\u0440\u0435\u0434\u043d\u0454:","median:":"\u041c\u0435\u0434\u0456\u0430\u043d\u0430:","min:":"\u041c\u0456\u043d.:","new text":"\u041d\u043e\u0432\u0438\u0439 \u0442\u0435\u043a\u0441\u0442","open:":"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0442\u044f:","outgoing flow count:":"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0438\u0445\u0456\u0434\u043d\u0438\u0445 \u0437\u0432'\u044f\u0437\u043a\u0456\u0432:","q1:":"q1:","q3:":"q3:","source:":"\u0414\u0436\u0435\u0440\u0435\u043b\u043e:","target:":"\u0426\u0456\u043b\u044c:",trace:"\u0420\u044f\u0434","upper fence:":"\u0412\u0435\u0440\u0445\u043d\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044f:"},format:{days:["\u043d\u0435\u0434\u0456\u043b\u044f","\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a","\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a","\u0441\u0435\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440","\u043f'\u044f\u0442\u043d\u0438\u0446\u044f","\u0441\u0443\u0431\u043e\u0442\u0430"],shortDays:["\u043d\u0434","\u043f\u043d","\u0432\u0442","\u0441\u0440","\u0447\u0442","\u043f\u0442","\u0441\u0431"],months:["\u0421\u0456\u0447\u0435\u043d\u044c","\u041b\u044e\u0442\u0438\u0439","\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c","\u041a\u0432\u0456\u0442\u0435\u043d\u044c","\u0422\u0440\u0430\u0432\u0435\u043d\u044c","\u0427\u0435\u0440\u0432\u0435\u043d\u044c","\u041b\u0438\u043f\u0435\u043d\u044c","\u0421\u0435\u0440\u043f\u0435\u043d\u044c","\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c","\u0416\u043e\u0432\u0442\u0435\u043d\u044c","\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434","\u0413\u0440\u0443\u0434\u0435\u043d\u044c"],shortMonths:["\u0421\u0456\u0447.","\u041b\u044e\u0442.","\u0411\u0435\u0440\u0435\u0437.","\u041a\u0432\u0456\u0442.","\u0422\u0440\u0430\u0432.","\u0427\u0435\u0440\u0432.","\u041b\u0438\u043f.","\u0421\u0435\u0440\u043f.","\u0412\u0435\u0440\u0435\u0441.","\u0416\u043e\u0432\u0442.","\u041b\u0438\u0441\u0442\u043e\u043f.","\u0413\u0440\u0443\u0434."],date:"%d.%m.%Y",decimal:",",thousands:" "}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"zh-CN",dictionary:{Autoscale:"\u81ea\u52a8\u7f29\u653e","Box Select":"\u77e9\u5f62\u6846\u9009","Click to enter Colorscale title":"\u70b9\u51fb\u8f93\u5165\u8272\u9636\u7684\u6807\u9898","Click to enter Component A title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6A\u7684\u6807\u9898","Click to enter Component B title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6B\u7684\u6807\u9898","Click to enter Component C title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6C\u7684\u6807\u9898","Click to enter Plot title":"\u70b9\u51fb\u8f93\u5165\u56fe\u8868\u7684\u6807\u9898","Click to enter X axis title":"\u70b9\u51fb\u8f93\u5165X\u8f74\u7684\u6807\u9898","Click to enter Y axis title":"\u70b9\u51fb\u8f93\u5165Y\u8f74\u7684\u6807\u9898","Compare data on hover":"\u60ac\u505c\u65f6\u6bd4\u8f83\u6570\u636e","Double-click on legend to isolate one trace":"\u53cc\u51fb\u56fe\u4f8b\u6765\u7a81\u663e\u5bf9\u5e94\u8f68\u8ff9","Double-click to zoom back out":"\u53cc\u51fb\u8fd4\u56de\u7f29\u5c0f\u663e\u793a","Download plot as a png":"\u4e0b\u8f7d\u56fe\u8868\u4e3aPNG\u683c\u5f0f","Download plot":"\u4e0b\u8f7d\u56fe\u8868","Edit in Chart Studio":"\u5728Chart Studio\u4e2d\u7f16\u8f91","IE only supports svg. Changing format to svg.":"IE\u53ea\u652f\u6301SVG\u3002\u8f6c\u6362\u683c\u5f0f\u4e3aSVG\u3002","Lasso Select":"\u5957\u7d22\u9009\u62e9","Orbital rotation":"\u8f68\u9053\u65cb\u8f6c",Pan:"\u5e73\u79fb","Produced with Plotly":"\u7531Plotly\u751f\u6210",Reset:"\u91cd\u7f6e","Reset axes":"\u91cd\u7f6e\u8f74","Reset camera to default":"\u91cd\u7f6e\u955c\u5934\u89c6\u89d2\u4e3a\u9ed8\u8ba4\u72b6\u6001","Reset camera to last save":"\u91cd\u7f6e\u955c\u5934\u89c6\u89d2\u4e3a\u4e0a\u6b21\u4fdd\u5b58\u72b6\u6001","Reset view":"\u91cd\u7f6e\u89c6\u56fe","Reset views":"\u91cd\u7f6e\u89c6\u56fe","Show closest data on hover":"\u60ac\u505c\u65f6\u663e\u793a\u6700\u8fd1\u7684\u6570\u636e","Snapshot succeeded":"\u751f\u6210\u5feb\u7167\u6210\u529f","Sorry, there was a problem downloading your snapshot!":"\u62b1\u6b49\uff0c\u4e0b\u8f7d\u5feb\u7167\u51fa\u73b0\u95ee\u9898\uff01","Taking snapshot - this may take a few seconds":"\u6b63\u5728\u751f\u6210\u5feb\u7167 - \u53ef\u80fd\u9700\u8981\u51e0\u79d2\u949f",Zoom:"\u7f29\u653e","Zoom in":"\u653e\u5927","Zoom out":"\u7f29\u5c0f","close:":"\u5173\u95ed:",trace:"\u8e2a\u8ff9:","lat:":"\u7eac\u5ea6:","lon:":"\u7ecf\u5ea6:","q1:":"\u7b2c\u4e00\u56db\u5206\u4f4d\u6570:","q3:":"\u7b2c\u4e09\u56db\u5206\u4f4d\u6570:","source:":"\u6e90:","target:":"\u76ee\u6807:","lower fence:":"\u5185\u4fa7\u680f(lower fence):","upper fence:":"\u5916\u4fa7\u680f(upper fence):","max:":"\u6700\u5927\u503c:","mean \xb1 \u03c3:":"\u5e73\u5747\u6570 \xb1 \u6807\u51c6\u5dee\u03c3:","mean:":"\u5e73\u5747\u6570:","median:":"\u4e2d\u4f4d\u6570:","min:":"\u6700\u5c0f\u503c:","Turntable rotation":"\u65cb\u8f6c\u8f6c\u76d8:","Toggle Spike Lines":"\u5207\u6362\u663e\u793a\u6570\u636e\u70b9\u8f85\u52a9\u7ebf(Spike Lines)","open:":"\u6253\u5f00:","high:":"\u9ad8:","low:":"\u4f4e:","Toggle show closest data on hover":"\u5207\u6362\u60ac\u505c\u65f6\u663e\u793a\u6700\u8fd1\u7684\u6570\u636e\u70b9","incoming flow count:":"\u6d41\u5165\u6570\u91cf:","outgoing flow count:":"\u6d41\u51fa\u6570\u91cf:","kde:":"kde:","Click to enter radial axis title":"\u70b9\u51fb\u8f93\u5165\u5f84\u5411\u8f74\u6807\u9898","new text":"\u65b0\u5efa\u6587\u672c"},format:{days:["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],shortDays:["\u5468\u65e5","\u5468\u4e00","\u5468\u4e8c","\u5468\u4e09","\u5468\u56db","\u5468\u4e94","\u5468\u516d"],months:["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],shortMonths:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); \ No newline at end of file +var locale={moduleType:"locale",name:"uk",dictionary:{Autoscale:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0448\u043a\u0430\u043b\u044e\u0432\u0430\u043d\u043d\u044f","Box Select":"\u0412\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u043f\u0440\u044f\u043c\u043e\u043a\u0443\u0442\u043d\u043e\u0457 \u043e\u0431\u043b\u0430\u0441\u0442\u0456","Click to enter Colorscale title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u0448\u043a\u0430\u043b\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0443","Click to enter Component A title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 A","Click to enter Component B title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 B","Click to enter Component C title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 C","Click to enter Plot title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u0433\u0440\u0430\u0444\u0456\u043a\u0430","Click to enter X axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043e\u0441\u0456 X","Click to enter Y axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043e\u0441\u0456 Y","Click to enter radial axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0457 \u043e\u0441\u0456","Compare data on hover":"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456 \u043f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u043d\u0456","Double-click on legend to isolate one trace":"\u0414\u0432\u0456\u0447\u0456 \u043a\u043b\u0430\u0446\u043d\u0456\u0442\u044c \u043f\u043e \u043b\u0435\u0433\u0435\u043d\u0434\u0456 \u0434\u043b\u044f \u0432\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0434\u0430\u043d\u0438\u0445","Double-click to zoom back out":"\u0414\u043b\u044f \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c \u0434\u0432\u0456\u0447\u0456 \u043a\u043b\u0430\u0446\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e","Download plot":"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0433\u0440\u0430\u0444\u0456\u043a","Download plot as a png":"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0456 PNG","Edit in Chart Studio":"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0443 Chart Studio","IE only supports svg. Changing format to svg.":"IE \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u0454 \u043b\u0438\u0448\u0435 svg. \u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u043c\u0456\u043d\u044e\u0454\u0442\u044c\u0441\u044f \u043d\u0430 svg.","Lasso Select":"\u041b\u0430\u0441\u043e","Orbital rotation":"\u0420\u0443\u0445 \u043f\u043e \u043e\u0440\u0431\u0456\u0442\u0456",Pan:"\u0417\u0441\u0443\u0432","Produced with Plotly.js":"\u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e Plotly.js",Reset:"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset axes":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043e\u0441\u044f\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset camera to default":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u0456 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset camera to last save":"\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u0443 \u0432 \u043e\u0441\u0442\u0430\u043d\u043d\u0456\u0439 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043d","Reset view":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset views":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Show closest data on hover":"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456 \u043f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0456 \u0434\u0430\u043d\u0456","Snapshot succeeded":"\u0417\u043d\u0456\u043c\u043e\u043a \u0443\u0441\u043f\u0456\u0448\u043d\u043e \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439","Sorry, there was a problem downloading your snapshot!":"\u041d\u0430 \u0436\u0430\u043b\u044c, \u0432\u0438\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u0456 \u0437\u043d\u0456\u043c\u043a\u0443","Taking snapshot - this may take a few seconds":"\u0421\u0442\u0432\u043e\u0440\u044e\u0454\u0442\u044c\u0441\u044f \u0437\u043d\u0456\u043c\u043e\u043a - \u0446\u0435 \u043c\u043e\u0436\u0435 \u0437\u0430\u0439\u043d\u044f\u0442\u0438 \u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434","Toggle Spike Lines":"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438/\u0432\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043b\u0456\u043d\u0456\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0456\u0439 \u0442\u043e\u0447\u043e\u043a","Toggle show closest data on hover":"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438/\u0432\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0438\u0445 \u0434\u0430\u043d\u0438\u0445 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456","Turntable rotation":"\u041e\u0431\u0435\u0440\u0442\u0430\u043d\u043d\u044f \u043d\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043d\u043e\u043c\u0443 \u0441\u0442\u043e\u043b\u0456",Zoom:"\u0417\u0443\u043c","Zoom in":"\u0417\u0431\u0456\u043b\u044c\u0448\u0438\u0442\u0438","Zoom out":"\u0417\u043c\u0435\u043d\u0448\u0438\u0442\u0438","close:":"\u0417\u0430\u043a\u0440\u0438\u0442\u0442\u044f:","concentration:":"\u041a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0456\u044f:","high:":"\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c:","incoming flow count:":"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0445\u0456\u0434\u043d\u0438\u0445 \u0437\u0432'\u044f\u0437\u043a\u0456\u0432:","kde:":"\u042f\u0434\u0440\u043e\u0432\u0430 \u043e\u0446\u0456\u043d\u043a\u0430 \u0433\u0443\u0441\u0442\u0438\u043d\u0438 \u0440\u043e\u0437\u043f\u043e\u0434\u0456\u043b\u0443:","lat:":"\u0428\u0438\u0440\u043e\u0442\u0430:","lon:":"\u0414\u043e\u0432\u0433\u043e\u0442\u0430:","low:":"\u041c\u0456\u043d\u0456\u043c\u0443\u043c:","lower fence:":"\u041d\u0438\u0436\u043d\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044f:","max:":"\u041c\u0430\u043a\u0441.:","mean \xb1 \u03c3:":"\u0421\u0435\u0440\u0435\u0434\u043d\u0454 \xb1 \u03c3:","mean:":"\u0421\u0435\u0440\u0435\u0434\u043d\u0454:","median:":"\u041c\u0435\u0434\u0456\u0430\u043d\u0430:","min:":"\u041c\u0456\u043d.:","new text":"\u041d\u043e\u0432\u0438\u0439 \u0442\u0435\u043a\u0441\u0442","open:":"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0442\u044f:","outgoing flow count:":"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0438\u0445\u0456\u0434\u043d\u0438\u0445 \u0437\u0432'\u044f\u0437\u043a\u0456\u0432:","q1:":"q1:","q3:":"q3:","source:":"\u0414\u0436\u0435\u0440\u0435\u043b\u043e:","target:":"\u0426\u0456\u043b\u044c:",trace:"\u0420\u044f\u0434","upper fence:":"\u0412\u0435\u0440\u0445\u043d\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044f:"},format:{days:["\u043d\u0435\u0434\u0456\u043b\u044f","\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a","\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a","\u0441\u0435\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440","\u043f'\u044f\u0442\u043d\u0438\u0446\u044f","\u0441\u0443\u0431\u043e\u0442\u0430"],shortDays:["\u043d\u0434","\u043f\u043d","\u0432\u0442","\u0441\u0440","\u0447\u0442","\u043f\u0442","\u0441\u0431"],months:["\u0421\u0456\u0447\u0435\u043d\u044c","\u041b\u044e\u0442\u0438\u0439","\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c","\u041a\u0432\u0456\u0442\u0435\u043d\u044c","\u0422\u0440\u0430\u0432\u0435\u043d\u044c","\u0427\u0435\u0440\u0432\u0435\u043d\u044c","\u041b\u0438\u043f\u0435\u043d\u044c","\u0421\u0435\u0440\u043f\u0435\u043d\u044c","\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c","\u0416\u043e\u0432\u0442\u0435\u043d\u044c","\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434","\u0413\u0440\u0443\u0434\u0435\u043d\u044c"],shortMonths:["\u0421\u0456\u0447.","\u041b\u044e\u0442.","\u0411\u0435\u0440\u0435\u0437.","\u041a\u0432\u0456\u0442.","\u0422\u0440\u0430\u0432.","\u0427\u0435\u0440\u0432.","\u041b\u0438\u043f.","\u0421\u0435\u0440\u043f.","\u0412\u0435\u0440\u0435\u0441.","\u0416\u043e\u0432\u0442.","\u041b\u0438\u0441\u0442\u043e\u043f.","\u0413\u0440\u0443\u0434."],date:"%d.%m.%Y",decimal:",",thousands:" "}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"zh-CN",dictionary:{Autoscale:"\u81ea\u52a8\u7f29\u653e","Box Select":"\u77e9\u5f62\u6846\u9009","Click to enter Colorscale title":"\u70b9\u51fb\u8f93\u5165\u8272\u9636\u7684\u6807\u9898","Click to enter Component A title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6A\u7684\u6807\u9898","Click to enter Component B title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6B\u7684\u6807\u9898","Click to enter Component C title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6C\u7684\u6807\u9898","Click to enter Plot title":"\u70b9\u51fb\u8f93\u5165\u56fe\u8868\u7684\u6807\u9898","Click to enter X axis title":"\u70b9\u51fb\u8f93\u5165X\u8f74\u7684\u6807\u9898","Click to enter Y axis title":"\u70b9\u51fb\u8f93\u5165Y\u8f74\u7684\u6807\u9898","Compare data on hover":"\u60ac\u505c\u65f6\u6bd4\u8f83\u6570\u636e","Double-click on legend to isolate one trace":"\u53cc\u51fb\u56fe\u4f8b\u6765\u7a81\u663e\u5bf9\u5e94\u8f68\u8ff9","Double-click to zoom back out":"\u53cc\u51fb\u8fd4\u56de\u7f29\u5c0f\u663e\u793a","Download plot as a png":"\u4e0b\u8f7d\u56fe\u8868\u4e3aPNG\u683c\u5f0f","Download plot":"\u4e0b\u8f7d\u56fe\u8868","Edit in Chart Studio":"\u5728Chart Studio\u4e2d\u7f16\u8f91","IE only supports svg. Changing format to svg.":"IE\u53ea\u652f\u6301SVG\u3002\u8f6c\u6362\u683c\u5f0f\u4e3aSVG\u3002","Lasso Select":"\u5957\u7d22\u9009\u62e9","Orbital rotation":"\u8f68\u9053\u65cb\u8f6c",Pan:"\u5e73\u79fb","Produced with Plotly.js":"\u7531Plotly.js\u751f\u6210",Reset:"\u91cd\u7f6e","Reset axes":"\u91cd\u7f6e\u8f74","Reset camera to default":"\u91cd\u7f6e\u955c\u5934\u89c6\u89d2\u4e3a\u9ed8\u8ba4\u72b6\u6001","Reset camera to last save":"\u91cd\u7f6e\u955c\u5934\u89c6\u89d2\u4e3a\u4e0a\u6b21\u4fdd\u5b58\u72b6\u6001","Reset view":"\u91cd\u7f6e\u89c6\u56fe","Reset views":"\u91cd\u7f6e\u89c6\u56fe","Show closest data on hover":"\u60ac\u505c\u65f6\u663e\u793a\u6700\u8fd1\u7684\u6570\u636e","Snapshot succeeded":"\u751f\u6210\u5feb\u7167\u6210\u529f","Sorry, there was a problem downloading your snapshot!":"\u62b1\u6b49\uff0c\u4e0b\u8f7d\u5feb\u7167\u51fa\u73b0\u95ee\u9898\uff01","Taking snapshot - this may take a few seconds":"\u6b63\u5728\u751f\u6210\u5feb\u7167 - \u53ef\u80fd\u9700\u8981\u51e0\u79d2\u949f",Zoom:"\u7f29\u653e","Zoom in":"\u653e\u5927","Zoom out":"\u7f29\u5c0f","close:":"\u5173\u95ed:",trace:"\u8e2a\u8ff9:","lat:":"\u7eac\u5ea6:","lon:":"\u7ecf\u5ea6:","q1:":"\u7b2c\u4e00\u56db\u5206\u4f4d\u6570:","q3:":"\u7b2c\u4e09\u56db\u5206\u4f4d\u6570:","source:":"\u6e90:","target:":"\u76ee\u6807:","lower fence:":"\u5185\u4fa7\u680f(lower fence):","upper fence:":"\u5916\u4fa7\u680f(upper fence):","max:":"\u6700\u5927\u503c:","mean \xb1 \u03c3:":"\u5e73\u5747\u6570 \xb1 \u6807\u51c6\u5dee\u03c3:","mean:":"\u5e73\u5747\u6570:","median:":"\u4e2d\u4f4d\u6570:","min:":"\u6700\u5c0f\u503c:","Turntable rotation":"\u65cb\u8f6c\u8f6c\u76d8:","Toggle Spike Lines":"\u5207\u6362\u663e\u793a\u6570\u636e\u70b9\u8f85\u52a9\u7ebf(Spike Lines)","open:":"\u6253\u5f00:","high:":"\u9ad8:","low:":"\u4f4e:","Toggle show closest data on hover":"\u5207\u6362\u60ac\u505c\u65f6\u663e\u793a\u6700\u8fd1\u7684\u6570\u636e\u70b9","incoming flow count:":"\u6d41\u5165\u6570\u91cf:","outgoing flow count:":"\u6d41\u51fa\u6570\u91cf:","kde:":"kde:","Click to enter radial axis title":"\u70b9\u51fb\u8f93\u5165\u5f84\u5411\u8f74\u6807\u9898","new text":"\u65b0\u5efa\u6587\u672c"},format:{days:["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],shortDays:["\u5468\u65e5","\u5468\u4e00","\u5468\u4e8c","\u5468\u4e09","\u5468\u56db","\u5468\u4e94","\u5468\u516d"],months:["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],shortMonths:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); \ No newline at end of file diff --git a/static/babybuddy/js/graph.81d7e15ea5a8.js.gz b/static/babybuddy/js/graph.81d7e15ea5a8.js.gz new file mode 100644 index 00000000..cb12d977 Binary files /dev/null and b/static/babybuddy/js/graph.81d7e15ea5a8.js.gz differ diff --git a/static/babybuddy/js/graph.dd89fe4e217b.js.gz b/static/babybuddy/js/graph.dd89fe4e217b.js.gz deleted file mode 100644 index 8b3e4c87..00000000 Binary files a/static/babybuddy/js/graph.dd89fe4e217b.js.gz and /dev/null differ diff --git a/static/babybuddy/js/graph.js b/static/babybuddy/js/graph.js index c55eb911..39cd576d 100644 --- a/static/babybuddy/js/graph.js +++ b/static/babybuddy/js/graph.js @@ -1,6 +1,6 @@ /** -* plotly.js (cartesian) v2.8.0 -* Copyright 2012-2021, Plotly, Inc. +* plotly.js (cartesian) v2.12.1 +* Copyright 2012-2022, Plotly, Inc. * All rights reserved. * Licensed under the MIT license */ @@ -51,10 +51,10 @@ var rules = { "X .modebar.vertical .modebar-group .modebar-btn": "display:block;text-align:center;", "X [data-title]:before,X [data-title]:after": "position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;", "X [data-title]:hover:before,X [data-title]:hover:after": "display:block;opacity:1;", - "X [data-title]:before": "content:\"\";position:absolute;background:transparent;border:6px solid transparent;z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;", + "X [data-title]:before": "content:\"\";position:absolute;background:rgba(0,0,0,0);border:6px solid rgba(0,0,0,0);z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;", "X [data-title]:after": "content:attr(data-title);background:#69738a;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;", "X .vertical [data-title]:before,X .vertical [data-title]:after": "top:0%;right:200%;", - "X .vertical [data-title]:before": "border:6px solid transparent;border-left-color:#69738a;margin-top:8px;margin-right:-30px;", + "X .vertical [data-title]:before": "border:6px solid rgba(0,0,0,0);border-left-color:#69738a;margin-top:8px;margin-right:-30px;", "X .select-outline": "fill:none;stroke-width:1;shape-rendering:crispEdges;", "X .select-outline-1": "stroke:#fff;", "X .select-outline-2": "stroke:#000;stroke-dasharray:2px 2px;", @@ -15724,7 +15724,15 @@ exports.readUInt32BE = function (data, offset) { function ProbeError(message, code, statusCode) { Error.call(this); - Error.captureStackTrace(this, this.constructor); + + // Include stack trace in error object + if (Error.captureStackTrace) { + // Chrome and NodeJS + Error.captureStackTrace(this, this.constructor); + } else { + // FF, IE 10+ and Safari 6+. Fallback for others + this.stack = (new Error()).stack || ''; + } this.name = this.constructor.name; @@ -30822,6 +30830,7 @@ module.exports = overrideAll({ ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, + ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, tickfont: fontAttrs({ }), @@ -31912,6 +31921,7 @@ function mockColorBarAxis(gd, opts, zrange) { showticklabels: opts.showticklabels, ticklabelposition: opts.ticklabelposition, ticklabeloverflow: opts.ticklabeloverflow, + ticklabelstep: opts.ticklabelstep, tickfont: opts.tickfont, tickangle: opts.tickangle, tickformat: opts.tickformat, @@ -32064,7 +32074,7 @@ module.exports = function colorScaleAttrs(context, opts) { } var effectDesc = onlyIfNumerical ? - ' Has an effect only if ' + colorAttrFull + 'is set to a numerical array.' : + ' Has an effect only if ' + colorAttrFull + ' is set to a numerical array.' : ''; var auto = cLetter + 'auto'; @@ -33650,24 +33660,42 @@ drawing.dashStyle = function(dash, lineWidth) { return dash; }; +function setFillStyle(sel, trace, gd) { + var markerPattern = trace.fillpattern; + var patternShape = markerPattern && drawing.getPatternAttr(markerPattern.shape, 0, ''); + if(patternShape) { + var patternBGColor = drawing.getPatternAttr(markerPattern.bgcolor, 0, null); + var patternFGColor = drawing.getPatternAttr(markerPattern.fgcolor, 0, null); + var patternFGOpacity = markerPattern.fgopacity; + var patternSize = drawing.getPatternAttr(markerPattern.size, 0, 8); + var patternSolidity = drawing.getPatternAttr(markerPattern.solidity, 0, 0.3); + var patternID = trace.uid; + drawing.pattern(sel, 'point', gd, patternID, + patternShape, patternSize, patternSolidity, + undefined, markerPattern.fillmode, + patternBGColor, patternFGColor, patternFGOpacity + ); + } else if(trace.fillcolor) { + sel.call(Color.fill, trace.fillcolor); + } +} + // Same as fillGroupStyle, except in this case the selection may be a transition -drawing.singleFillStyle = function(sel) { +drawing.singleFillStyle = function(sel, gd) { var node = d3.select(sel.node()); var data = node.data(); - var fillcolor = (((data[0] || [])[0] || {}).trace || {}).fillcolor; - if(fillcolor) { - sel.call(Color.fill, fillcolor); - } + var trace = ((data[0] || [])[0] || {}).trace || {}; + setFillStyle(sel, trace, gd); }; -drawing.fillGroupStyle = function(s) { +drawing.fillGroupStyle = function(s, gd) { s.style('stroke-width', 0) .each(function(d) { var shape = d3.select(this); // N.B. 'd' won't be a calcdata item when // fill !== 'none' on a segment-less and marker-less trace if(d[0].trace) { - shape.call(Color.fill, d[0].trace.fillcolor); + setFillStyle(shape, d[0].trace, gd); } }); }; @@ -33820,12 +33848,7 @@ drawing.gradient = function(sel, gd, gradientID, type, colorscale, prop) { sel.style(prop, getFullUrl(fullID, gd)) .style(prop + '-opacity', null); - var className2query = function(s) { - return '.' + s.attr('class').replace(/\s/g, '.'); - }; - var k = className2query(d3.select(sel.node().parentNode)) + - '>' + className2query(sel); - fullLayout._gradientUrlQueryParts[k] = 1; + sel.classed('gradient_filled', true); }; /** @@ -34032,11 +34055,6 @@ drawing.pattern = function(sel, calledBy, gd, patternID, shape, size, solidity, .style('fill-opacity', null); sel.classed('pattern_filled', true); - var className2query = function(s) { - return '.' + s.attr('class').replace(/\s/g, '.'); - }; - var k = className2query(d3.select(sel.node().parentNode)) + '>.pattern_filled'; - fullLayout._patternUrlQueryParts[k] = 1; }; /* @@ -34052,9 +34070,7 @@ drawing.initGradients = function(gd) { var gradientsGroup = Lib.ensureSingle(fullLayout._defs, 'g', 'gradients'); gradientsGroup.selectAll('linearGradient,radialGradient').remove(); - // initialize stash of query parts filled in Drawing.gradient, - // used to fix URL strings during image exports - fullLayout._gradientUrlQueryParts = {}; + d3.select(gd).selectAll('.gradient_filled').classed('gradient_filled', false); }; drawing.initPatterns = function(gd) { @@ -34063,9 +34079,7 @@ drawing.initPatterns = function(gd) { var patternsGroup = Lib.ensureSingle(fullLayout._defs, 'g', 'patterns'); patternsGroup.selectAll('pattern').remove(); - // initialize stash of query parts filled in Drawing.pattern, - // used to fix URL strings during image exports - fullLayout._patternUrlQueryParts = {}; + d3.select(gd).selectAll('.pattern_filled').classed('pattern_filled', false); }; drawing.getPatternAttr = function(mp, i, dflt) { @@ -39532,7 +39546,7 @@ module.exports = function draw(gd) { canvas.width = this.width; canvas.height = this.height; - var ctx = canvas.getContext('2d'); + var ctx = canvas.getContext('2d', {willReadFrequently: true}); ctx.drawImage(this, 0, 0); var dataURL = canvas.toDataURL('image/png'); @@ -40718,7 +40732,6 @@ function computeLegendDimensions(gd, groups, traces, legendObj) { offsetY += h; maxWidthInGroup = Math.max(maxWidthInGroup, textGap + w); }); - maxGroupHeightInRow = Math.max(maxGroupHeightInRow, offsetY); var next = maxWidthInGroup + itemGap; @@ -40734,6 +40747,8 @@ function computeLegendDimensions(gd, groups, traces, legendObj) { groupOffsetX = 0; groupOffsetY += maxGroupHeightInRow + traceGroupGap; maxGroupHeightInRow = offsetY; + } else { + maxGroupHeightInRow = Math.max(maxGroupHeightInRow, offsetY); } Drawing.setTranslate(this, groupOffsetX, groupOffsetY); @@ -41401,12 +41416,16 @@ module.exports = function style(s, gd, legend) { var colorscale = cOpts.colorscale; var reversescale = cOpts.reversescale; - var fillGradient = function(s) { + var fillStyle = function(s) { if(s.size()) { - var gradientID = 'legendfill-' + trace.uid; - Drawing.gradient(s, gd, gradientID, - getGradientDirection(reversescale), - colorscale, 'fill'); + if(showFill) { + Drawing.fillGroupStyle(s, gd); + } else { + var gradientID = 'legendfill-' + trace.uid; + Drawing.gradient(s, gd, gradientID, + getGradientDirection(reversescale), + colorscale, 'fill'); + } } }; @@ -41435,7 +41454,7 @@ module.exports = function style(s, gd, legend) { fill.enter().append('path').classed('js-fill', true); fill.exit().remove(); fill.attr('d', pathStart + 'h' + itemWidth + 'v6h-' + itemWidth + 'z') - .call(showFill ? Drawing.fillGroupStyle : fillGradient); + .call(fillStyle); if(showLine || showGradientLine) { var lw = boundLineWidth(undefined, trace.line, MAX_LINE_WIDTH, CST_LINE_WIDTH); @@ -42863,6 +42882,7 @@ var isUnifiedHover = _dereq_('../fx/helpers').isUnifiedHover; var createModeBar = _dereq_('./modebar'); var modeBarButtons = _dereq_('./buttons'); var DRAW_MODES = _dereq_('./constants').DRAW_MODES; +var extendDeep = _dereq_('../../lib').extendDeep; /** * ModeBar wrapper around 'create' and 'update', @@ -43185,7 +43205,9 @@ function appendButtonsToGroups(groups, buttons) { } // fill in custom buttons referring to default mode bar buttons -function fillCustomButton(customButtons) { +function fillCustomButton(originalModeBarButtons) { + var customButtons = extendDeep([], originalModeBarButtons); + for(var i = 0; i < customButtons.length; i++) { var buttonGroup = customButtons[i]; @@ -43208,7 +43230,7 @@ function fillCustomButton(customButtons) { return customButtons; } -},{"../../plots/cartesian/axis_ids":338,"../../registry":378,"../../traces/scatter/subtypes":525,"../fx/helpers":193,"./buttons":217,"./constants":218,"./modebar":222}],222:[function(_dereq_,module,exports){ +},{"../../lib":287,"../../plots/cartesian/axis_ids":338,"../../registry":378,"../../traces/scatter/subtypes":525,"../fx/helpers":193,"./buttons":217,"./constants":218,"./modebar":222}],222:[function(_dereq_,module,exports){ 'use strict'; var d3 = _dereq_('@plotly/d3'); @@ -43216,6 +43238,8 @@ var isNumeric = _dereq_('fast-isnumeric'); var Lib = _dereq_('../../lib'); var Icons = _dereq_('../../fonts/ploticon'); +var version = _dereq_('../../version').version; + var Parser = new DOMParser(); /** @@ -43494,6 +43518,10 @@ proto.hasButtons = function(buttons) { return true; }; +function jsVersion(str) { + return str + ' (v' + version + ')'; +} + /** * @return {HTMLDivElement} The logo image wrapped in a group */ @@ -43503,7 +43531,7 @@ proto.getLogo = function() { a.href = 'https://plotly.com/'; a.target = '_blank'; - a.setAttribute('data-title', Lib._(this.graphInfo, 'Produced with Plotly')); + a.setAttribute('data-title', jsVersion(Lib._(this.graphInfo, 'Produced with Plotly.js'))); a.className = 'modebar-btn plotlyjsicon modebar-btn--logo'; a.appendChild(this.createIcon(Icons.newplotlylogo)); @@ -43545,7 +43573,7 @@ function createModeBar(gd, buttons) { module.exports = createModeBar; -},{"../../fonts/ploticon":270,"../../lib":287,"@plotly/d3":20,"fast-isnumeric":33}],223:[function(_dereq_,module,exports){ +},{"../../fonts/ploticon":270,"../../lib":287,"../../version":552,"@plotly/d3":20,"fast-isnumeric":33}],223:[function(_dereq_,module,exports){ 'use strict'; var fontAttrs = _dereq_('../../plots/font_attributes'); @@ -56056,6 +56084,7 @@ exports.convertToTspans = function(_context, gd, _callback) { // Until we get tex integrated more fully (so it can be used along with non-tex) // allow some elements to prohibit it by attaching 'data-notex' to the original var tex = (!_context.attr('data-notex')) && + gd && gd._context.typesetMath && (typeof MathJax !== 'undefined') && str.match(FIND_TEX); @@ -56210,70 +56239,154 @@ function cleanEscapesForTex(s) { .replace(GT_MATCH, '\\gt '); } +var inlineMath = [['$', '$'], ['\\(', '\\)']]; + function texToSVG(_texString, _config, _callback) { + var MathJaxVersion = parseInt( + (MathJax.version || '').split('.')[0] + ); + + if( + MathJaxVersion !== 2 && + MathJaxVersion !== 3 + ) { + Lib.warn('No MathJax version:', MathJax.version); + return; + } + var originalRenderer, originalConfig, originalProcessSectionDelay, tmpDiv; - MathJax.Hub.Queue( - function() { + var setConfig2 = function() { originalConfig = Lib.extendDeepAll({}, MathJax.Hub.config); originalProcessSectionDelay = MathJax.Hub.processSectionDelay; if(MathJax.Hub.processSectionDelay !== undefined) { - // MathJax 2.5+ + // MathJax 2.5+ but not 3+ MathJax.Hub.processSectionDelay = 0; } return MathJax.Hub.Config({ messageStyle: 'none', tex2jax: { - inlineMath: [['$', '$'], ['\\(', '\\)']] + inlineMath: inlineMath }, displayAlign: 'left', }); - }, - function() { - // Get original renderer + }; + + var setConfig3 = function() { + originalConfig = Lib.extendDeepAll({}, MathJax.config); + + if(!MathJax.config.tex) { + MathJax.config.tex = {}; + } + + MathJax.config.tex.inlineMath = inlineMath; + }; + + var setRenderer2 = function() { originalRenderer = MathJax.Hub.config.menuSettings.renderer; if(originalRenderer !== 'SVG') { return MathJax.Hub.setRenderer('SVG'); } - }, - function() { + }; + + var setRenderer3 = function() { + originalRenderer = MathJax.config.startup.output; + if(originalRenderer !== 'svg') { + MathJax.config.startup.output = 'svg'; + } + }; + + var initiateMathJax = function() { var randomID = 'math-output-' + Lib.randstr({}, 64); tmpDiv = d3.select('body').append('div') .attr({id: randomID}) - .style({visibility: 'hidden', position: 'absolute'}) - .style({'font-size': _config.fontSize + 'px'}) + .style({ + visibility: 'hidden', + position: 'absolute', + 'font-size': _config.fontSize + 'px' + }) .text(cleanEscapesForTex(_texString)); - return MathJax.Hub.Typeset(tmpDiv.node()); - }, - function() { - var glyphDefs = d3.select('body').select('#MathJax_SVG_glyphs'); + var tmpNode = tmpDiv.node(); - if(tmpDiv.select('.MathJax_SVG').empty() || !tmpDiv.select('svg').node()) { + return MathJaxVersion === 2 ? + MathJax.Hub.Typeset(tmpNode) : + MathJax.typeset([tmpNode]); + }; + + var finalizeMathJax = function() { + var sel = tmpDiv.select( + MathJaxVersion === 2 ? '.MathJax_SVG' : '.MathJax' + ); + + var node = !sel.empty() && tmpDiv.select('svg').node(); + if(!node) { Lib.log('There was an error in the tex syntax.', _texString); _callback(); } else { - var svgBBox = tmpDiv.select('svg').node().getBoundingClientRect(); - _callback(tmpDiv.select('.MathJax_SVG'), glyphDefs, svgBBox); + var nodeBBox = node.getBoundingClientRect(); + var glyphDefs; + if(MathJaxVersion === 2) { + glyphDefs = d3.select('body').select('#MathJax_SVG_glyphs'); + } else { + glyphDefs = sel.select('defs'); + } + _callback(sel, glyphDefs, nodeBBox); } tmpDiv.remove(); + }; + var resetRenderer2 = function() { if(originalRenderer !== 'SVG') { return MathJax.Hub.setRenderer(originalRenderer); } - }, - function() { + }; + + var resetRenderer3 = function() { + if(originalRenderer !== 'svg') { + MathJax.config.startup.output = originalRenderer; + } + }; + + var resetConfig2 = function() { if(originalProcessSectionDelay !== undefined) { MathJax.Hub.processSectionDelay = originalProcessSectionDelay; } return MathJax.Hub.Config(originalConfig); - }); + }; + + var resetConfig3 = function() { + MathJax.config = originalConfig; + }; + + if(MathJaxVersion === 2) { + MathJax.Hub.Queue( + setConfig2, + setRenderer2, + initiateMathJax, + finalizeMathJax, + resetRenderer2, + resetConfig2 + ); + } else if(MathJaxVersion === 3) { + setConfig3(); + setRenderer3(); + MathJax.startup.defaultReady(); + + MathJax.startup.promise.then(function() { + initiateMathJax(); + finalizeMathJax(); + + resetRenderer3(); + resetConfig3(); + }); + } } var TAG_STYLES = { @@ -60400,7 +60513,9 @@ function _relayout(gd, aobj) { if(parentFull.autorange) flags.calc = true; else flags.plot = true; } else { - if((fullLayout._has('scatter-like') && fullLayout._has('regl')) && + if(ai === 'dragmode' && ((vi === false && vOld !== false) || (vi !== false && vOld === false))) { + flags.plot = true; + } else if((fullLayout._has('scatter-like') && fullLayout._has('regl')) && (ai === 'dragmode' && (vi === 'lasso' || vi === 'select') && !(vOld === 'lasso' || vOld === 'select')) @@ -62093,6 +62208,11 @@ var configAttributes = { dflt: false, }, + typesetMath: { + valType: 'boolean', + dflt: true, + }, + plotlyServerURL: { valType: 'string', dflt: '', @@ -66171,6 +66291,7 @@ var BADNUM = constants.BADNUM; var ZERO_PATH = { K: 'zeroline' }; var GRID_PATH = { K: 'gridline', L: 'path' }; +var MINORGRID_PATH = { K: 'minor-gridline', L: 'path' }; var TICK_PATH = { K: 'tick', L: 'path' }; var TICK_TEXT = { K: 'tick', L: 'text' }; @@ -66675,13 +66796,113 @@ function autoShiftMonthBins(binStart, data, dtick, dataMin, calendar) { // Ticks and grids // ---------------------------------------------------- +// ensure we have minor tick0 and dtick calculated +axes.prepMinorTicks = function(mockAx, ax, opts) { + if(!ax.minor.dtick) { + delete mockAx.dtick; + var hasMajor = ax.dtick && isNumeric(ax._tmin); + var mockMinorRange; + if(hasMajor) { + var tick2 = axes.tickIncrement(ax._tmin, ax.dtick, true); + // mock range a tiny bit smaller than one major tick interval + mockMinorRange = [ax._tmin, tick2 * 0.99 + ax._tmin * 0.01]; + } else { + var rl = Lib.simpleMap(ax.range, ax.r2l); + // If we don't have a major dtick, the concept of minor ticks is a little + // ambiguous - just take a stab and say minor.nticks should span 1/5 the axis + mockMinorRange = [rl[0], 0.8 * rl[0] + 0.2 * rl[1]]; + } + mockAx.range = Lib.simpleMap(mockMinorRange, ax.l2r); + mockAx._isMinor = true; + + axes.prepTicks(mockAx, opts); + + if(hasMajor) { + var numericMajor = isNumeric(ax.dtick); + var numericMinor = isNumeric(mockAx.dtick); + var majorNum = numericMajor ? ax.dtick : +ax.dtick.substring(1); + var minorNum = numericMinor ? mockAx.dtick : +mockAx.dtick.substring(1); + if(numericMajor && numericMinor) { + if(!isMultiple(majorNum, minorNum)) { + // give up on minor ticks - outside the below exceptions, + // this can only happen if minor.nticks is smaller than two jumps + // in the auto-tick scale and the first jump is not an even multiple + // (5 -> 2 or for dates 3 ->2, 15 -> 10 etc) or if you provided + // an explicit dtick, in which case it's fine to give up, + // you can provide an explicit minor.dtick. + if((majorNum === 2 * ONEWEEK) && (minorNum === 3 * ONEDAY)) { + mockAx.dtick = ONEWEEK; + } else if(majorNum === ONEWEEK && !(ax._input.minor || {}).nticks) { + // minor.nticks defaults to 5, but in this one case we want 7, + // so the minor ticks show on all days of the week + mockAx.dtick = ONEDAY; + } else if(isClose(majorNum / minorNum, 2.5)) { + // 5*10^n -> 2*10^n and you've set nticks < 5 + // quarters are pretty common, we don't do this by default as it + // would add an extra digit to display, but minor has no labels + mockAx.dtick = majorNum / 2; + } else { + mockAx.dtick = majorNum; + } + } else if(majorNum === 2 * ONEWEEK && minorNum === 2 * ONEDAY) { + // this is a weird one: we don't want to automatically choose + // 2-day minor ticks for 2-week major, even though it IS an even multiple, + // because people would expect to see the weeks clearly + mockAx.dtick = ONEWEEK; + } + } else if(String(ax.dtick).charAt(0) === 'M') { + if(numericMinor) { + mockAx.dtick = 'M1'; + } else { + if(!isMultiple(majorNum, minorNum)) { + // unless you provided an explicit ax.dtick (in which case + // it's OK for us to give up, you can provide an explicit + // minor.dtick too), this can only happen with: + // minor.nticks < 3 and dtick === M3, or + // minor.nticks < 5 and dtick === 5 * 10^n years + // so in all cases we just give up. + mockAx.dtick = ax.dtick; + } else if((majorNum >= 12) && (minorNum === 2)) { + // another special carve-out: for year major ticks, don't show + // 2-month minor ticks, bump to quarters + mockAx.dtick = 'M3'; + } + } + } else if(String(mockAx.dtick).charAt(0) === 'L') { + if(String(ax.dtick).charAt(0) === 'L') { + if(!isMultiple(majorNum, minorNum)) { + mockAx.dtick = isClose(majorNum / minorNum, 2.5) ? (ax.dtick / 2) : ax.dtick; + } + } else { + mockAx.dtick = 'D1'; + } + } else if(mockAx.dtick === 'D2' && +ax.dtick > 1) { + // the D2 log axis tick spacing is confusing for unlabeled minor ticks if + // the major dtick is more than one order of magnitude. + mockAx.dtick = 1; + } + } + // put back the original range, to use to find the full set of minor ticks + mockAx.range = ax.range; + } + if(ax.minor._tick0Init === undefined) { + // ensure identical tick0 + mockAx.tick0 = ax.tick0; + } +}; + +function isMultiple(bigger, smaller) { + return Math.abs((bigger / smaller + 0.5) % 1 - 0.5) < 0.001; +} + +function isClose(a, b) { + return Math.abs((a / b) - 1) < 0.001; +} + // ensure we have tick0, dtick, and tick rounding calculated axes.prepTicks = function(ax, opts) { var rng = Lib.simpleMap(ax.range, ax.r2l, undefined, undefined, opts); - ax._dtickInit = ax.dtick; - ax._tick0Init = ax.tick0; - // calculate max number of (auto) ticks to display based on plot size if(ax.tickmode === 'auto' || !ax.dtick) { var nt = ax.nticks; @@ -66701,10 +66922,11 @@ axes.prepTicks = function(ax, opts) { if(ax._name === 'radialaxis') nt *= 2; } - // add a couple of extra digits for filling in ticks when we - // have explicit tickvals without tick text - if(ax.tickmode === 'array') nt *= 100; - + if(!(ax.minor && ax.minor.tickmode !== 'array')) { + // add a couple of extra digits for filling in ticks when we + // have explicit tickvals without tick text + if(ax.tickmode === 'array') nt *= 100; + } ax._roughDTick = Math.abs(rng[1] - rng[0]) / nt; axes.autoTicks(ax, ax._roughDTick); @@ -66922,81 +67144,201 @@ function positionPeriodTicks(tickVals, ax, definedDelta) { // in any case, set tickround to # of digits to round tick labels to, // or codes to this effect for log and date scales axes.calcTicks = function calcTicks(ax, opts) { - axes.prepTicks(ax, opts); + var type = ax.type; + var calendar = ax.calendar; + var ticklabelstep = ax.ticklabelstep; + var isPeriod = ax.ticklabelmode === 'period'; + var rng = Lib.simpleMap(ax.range, ax.r2l, undefined, undefined, opts); - - // now that we've figured out the auto values for formatting - // in case we're missing some ticktext, we can break out for array ticks - if(ax.tickmode === 'array') return arrayTicks(ax); - - // add a tiny bit so we get ticks which may have rounded out - var exRng = expandRange(rng); - var startTick = exRng[0]; - var endTick = exRng[1]; - // check for reversed axis var axrev = (rng[1] < rng[0]); var minRange = Math.min(rng[0], rng[1]); var maxRange = Math.max(rng[0], rng[1]); - var isDLog = (ax.type === 'log') && !(isNumeric(ax.dtick) || ax.dtick.charAt(0) === 'L'); - var isPeriod = ax.ticklabelmode === 'period'; - - // find the first tick - ax._tmin = axes.tickFirst(ax, opts); - - // No visible ticks? Quit. - // I've only seen this on category axes with all categories off the edge. - if((ax._tmin < startTick) !== axrev) return []; - - // return the full set of tick vals - if(ax.type === 'category' || ax.type === 'multicategory') { - endTick = (axrev) ? Math.max(-0.5, endTick) : - Math.min(ax._categories.length - 0.5, endTick); - } - - var x = ax._tmin; - - if(ax.rangebreaks && ax._tick0Init !== ax.tick0) { - // adjust tick0 - x = moveOutsideBreak(x, ax); - if(!axrev) { - x = axes.tickIncrement(x, ax.dtick, !axrev, ax.calendar); - } - } - - if(isPeriod) { - // add one item to label period before tick0 - x = axes.tickIncrement(x, ax.dtick, !axrev, ax.calendar); - } - var maxTicks = Math.max(1000, ax._length || 0); + + var ticksOut = []; + var minorTicks = []; + var tickVals = []; - var xPrevious = null; - for(; - (axrev) ? (x >= endTick) : (x <= endTick); - x = axes.tickIncrement(x, ax.dtick, axrev, ax.calendar) - ) { - if(ax.rangebreaks) { - if(!axrev) { - if(x < startTick) continue; - if(ax.maskBreaks(x) === BADNUM && moveOutsideBreak(x, ax) >= maxRange) break; + var minorTickVals = []; + + var hasMinor = ax.minor && (ax.minor.ticks || ax.minor.showgrid); + + // calc major first + for(var major = 1; major >= (hasMinor ? 0 : 1); major--) { + var isMinor = !major; + + if(major) { + ax._dtickInit = ax.dtick; + ax._tick0Init = ax.tick0; + } else { + ax.minor._dtickInit = ax.minor.dtick; + ax.minor._tick0Init = ax.minor.tick0; + } + + var mockAx = major ? ax : Lib.extendFlat({}, ax, ax.minor); + + if(isMinor) { + axes.prepMinorTicks(mockAx, ax, opts); + } else { + axes.prepTicks(mockAx, opts); + } + + // now that we've figured out the auto values for formatting + // in case we're missing some ticktext, we can break out for array ticks + if(mockAx.tickmode === 'array') { + if(major) { + tickVals = []; + ticksOut = arrayTicks(ax); + } else { + minorTickVals = []; + minorTicks = arrayTicks(ax); + } + continue; + } + + // add a tiny bit so we get ticks which may have rounded out + var exRng = expandRange(rng); + var startTick = exRng[0]; + var endTick = exRng[1]; + + var numDtick = isNumeric(mockAx.dtick); + var isDLog = (type === 'log') && !(numDtick || mockAx.dtick.charAt(0) === 'L'); + + // find the first tick + var x0 = axes.tickFirst(mockAx, opts); + + if(major) { + ax._tmin = x0; + + // No visible ticks? Quit. + // I've only seen this on category axes with all categories off the edge. + if((x0 < startTick) !== axrev) break; + + // return the full set of tick vals + if(type === 'category' || type === 'multicategory') { + endTick = (axrev) ? Math.max(-0.5, endTick) : + Math.min(ax._categories.length - 0.5, endTick); } } - // prevent infinite loops - no more than one tick per pixel, - // and make sure each value is different from the previous - if(tickVals.length > maxTicks || x === xPrevious) break; - xPrevious = x; + var prevX = null; + var x = x0; + var majorId; - var minor = false; - if(isDLog && (x !== (x | 0))) { - minor = true; + if(major) { + // ids for ticklabelstep + var _dTick; + if(numDtick) { + _dTick = ax.dtick; + } else { + if(type === 'date') { + if(typeof ax.dtick === 'string' && ax.dtick.charAt(0) === 'M') { + _dTick = ONEAVGMONTH * ax.dtick.substring(1); + } + } else { + _dTick = ax._roughDTick; + } + } + + majorId = Math.round(( + ax.r2l(x) - + ax.r2l(ax.tick0) + ) / _dTick) - 1; } - tickVals.push({ - minor: minor, - value: x - }); + var dtick = mockAx.dtick; + + if(mockAx.rangebreaks && mockAx._tick0Init !== mockAx.tick0) { + // adjust tick0 + x = moveOutsideBreak(x, ax); + if(!axrev) { + x = axes.tickIncrement(x, dtick, !axrev, calendar); + } + } + + if(major && isPeriod) { + // add one item to label period before tick0 + x = axes.tickIncrement(x, dtick, !axrev, calendar); + majorId--; + } + + for(; + axrev ? + (x >= endTick) : + (x <= endTick); + x = axes.tickIncrement( + x, + dtick, + axrev, + calendar + ) + ) { + if(major) majorId++; + + if(mockAx.rangebreaks) { + if(!axrev) { + if(x < startTick) continue; + if(mockAx.maskBreaks(x) === BADNUM && moveOutsideBreak(x, mockAx) >= maxRange) break; + } + } + + // prevent infinite loops - no more than one tick per pixel, + // and make sure each value is different from the previous + if(tickVals.length > maxTicks || x === prevX) break; + prevX = x; + + var obj = { value: x }; + + if(major) { + if(isDLog && (x !== (x | 0))) { + obj.simpleLabel = true; + } + + if(ticklabelstep > 1 && majorId % ticklabelstep) { + obj.skipLabel = true; + } + + tickVals.push(obj); + } else { + obj.minor = true; + + minorTickVals.push(obj); + } + } + } + + if(hasMinor) { + var canOverlap = + (ax.minor.ticks === 'inside' && ax.ticks === 'outside') || + (ax.minor.ticks === 'outside' && ax.ticks === 'inside'); + + if(!canOverlap) { + // remove duplicate minors + + var majorValues = tickVals.map(function(d) { return d.value; }); + + var list = []; + for(var k = 0; k < minorTickVals.length; k++) { + var T = minorTickVals[k]; + var v = T.value; + if(majorValues.indexOf(v) !== -1) { + continue; + } + var found = false; + for(var q = 0; !found && (q < tickVals.length); q++) { + if( + // add 10e6 to eliminate problematic digits + 10e6 + tickVals[q].value === + 10e6 + v + ) { + found = true; + } + } + if(!found) list.push(T); + } + minorTickVals = list; + } } if(isPeriod) positionPeriodTicks(tickVals, ax, ax._definedDelta); @@ -67049,52 +67391,69 @@ axes.calcTicks = function calcTicks(ax, opts) { ax._prevDateHead = ''; ax._inCalcTicks = true; - var ticksOut = []; + var lastVisibleHead; + var hideLabel = function(tick) { + tick.text = ''; + ax._prevDateHead = lastVisibleHead; + }; + + tickVals = tickVals.concat(minorTickVals); + var t, p; for(i = 0; i < tickVals.length; i++) { var _minor = tickVals[i].minor; var _value = tickVals[i].value; - t = axes.tickText( - ax, - _value, - false, // hover - _minor // noSuffixPrefix - ); + if(_minor) { + minorTicks.push({ + x: _value, + minor: true + }); + } else { + lastVisibleHead = ax._prevDateHead; - p = tickVals[i].periodX; - if(p !== undefined) { - t.periodX = p; - if(p > maxRange || p < minRange) { // hide label if outside the range - if(p > maxRange) t.periodX = maxRange; - if(p < minRange) t.periodX = minRange; + t = axes.tickText( + ax, + _value, + false, // hover + tickVals[i].simpleLabel // noSuffixPrefix + ); - t.text = ' '; // don't use an empty string here which can confuse automargin (issue 5132) - ax._prevDateHead = ''; + p = tickVals[i].periodX; + if(p !== undefined) { + t.periodX = p; + if(p > maxRange || p < minRange) { // hide label if outside the range + if(p > maxRange) t.periodX = maxRange; + if(p < minRange) t.periodX = minRange; + + hideLabel(t); + } } - } - ticksOut.push(t); + if(tickVals[i].skipLabel) { + hideLabel(t); + } + + ticksOut.push(t); + } } + ticksOut = ticksOut.concat(minorTicks); ax._inCalcTicks = false; + if(isPeriod && ticksOut.length) { + // drop very first tick that we added to handle period + ticksOut[0].noTick = true; + } + return ticksOut; }; function arrayTicks(ax) { - var vals = ax.tickvals; - var text = ax.ticktext; - var ticksOut = new Array(vals.length); var rng = Lib.simpleMap(ax.range, ax.r2l); var exRng = expandRange(rng); var tickMin = Math.min(exRng[0], exRng[1]); var tickMax = Math.max(exRng[0], exRng[1]); - var j = 0; - - // without a text array, just format the given values as any other ticks - // except with more precision to the numbers - if(!Array.isArray(text)) text = []; // make sure showing ticks doesn't accidentally add new categories // TODO multicategory, if we allow ticktext / tickvals @@ -67106,17 +67465,36 @@ function arrayTicks(ax) { ax.dtick = 'L' + Math.pow(10, Math.floor(Math.min(ax.range[0], ax.range[1])) - 1); } - for(var i = 0; i < vals.length; i++) { - var vali = tickVal2l(vals[i]); - if(vali > tickMin && vali < tickMax) { - if(text[i] === undefined) ticksOut[j] = axes.tickText(ax, vali); - else ticksOut[j] = tickTextObj(ax, vali, String(text[i])); - j++; + var ticksOut = []; + for(var isMinor = 0; isMinor <= 1; isMinor++) { + if(isMinor && !ax.minor) continue; + var vals = !isMinor ? ax.tickvals : ax.minor.tickvals; + var text = !isMinor ? ax.ticktext : []; + + if(!vals) continue; + + + // without a text array, just format the given values as any other ticks + // except with more precision to the numbers + if(!Array.isArray(text)) text = []; + + for(var i = 0; i < vals.length; i++) { + var vali = tickVal2l(vals[i]); + if(vali > tickMin && vali < tickMax) { + var obj = text[i] === undefined ? + axes.tickText(ax, vali) : + tickTextObj(ax, vali, String(text[i])); + + if(isMinor) { + obj.minor = true; + obj.text = ''; + } + + ticksOut.push(obj); + } } } - if(j < vals.length) ticksOut.splice(j, vals.length - j); - if(ax.rangebreaks) { // remove ticks falling inside rangebreaks ticksOut = ticksOut.filter(function(d) { @@ -67159,7 +67537,7 @@ function roundDTick(roughDTick, base, roundingSet) { // log with linear ticks: L# where # is the linear tick spacing // log showing powers plus some intermediates: // D1 shows all digits, D2 shows 2 and 5 -axes.autoTicks = function(ax, roughDTick) { +axes.autoTicks = function(ax, roughDTick, isMinor) { var base; function getBase(v) { @@ -67182,20 +67560,22 @@ axes.autoTicks = function(ax, roughDTick) { ax.dtick = 'M' + roundDTick(roughDTick, 1, roundBase24); } else if(roughX2 > ONEDAY) { ax.dtick = roundDTick(roughDTick, ONEDAY, ax._hasDayOfWeekBreaks ? [1, 2, 7, 14] : roundDays); - // get week ticks on sunday - // this will also move the base tick off 2000-01-01 if dtick is - // 2 or 3 days... but that's a weird enough case that we'll ignore it. - var tickformat = axes.getTickFormat(ax); - var isPeriod = ax.ticklabelmode === 'period'; - if(isPeriod) ax._rawTick0 = ax.tick0; + if(!isMinor) { + // get week ticks on sunday + // this will also move the base tick off 2000-01-01 if dtick is + // 2 or 3 days... but that's a weird enough case that we'll ignore it. + var tickformat = axes.getTickFormat(ax); + var isPeriod = ax.ticklabelmode === 'period'; + if(isPeriod) ax._rawTick0 = ax.tick0; - if(/%[uVW]/.test(tickformat)) { - ax.tick0 = Lib.dateTick0(ax.calendar, 2); // Monday - } else { - ax.tick0 = Lib.dateTick0(ax.calendar, 1); // Sunday + if(/%[uVW]/.test(tickformat)) { + ax.tick0 = Lib.dateTick0(ax.calendar, 2); // Monday + } else { + ax.tick0 = Lib.dateTick0(ax.calendar, 1); // Sunday + } + + if(isPeriod) ax._dowTick0 = ax.tick0; } - - if(isPeriod) ax._dowTick0 = ax.tick0; } else if(roughX2 > ONEHOUR) { ax.dtick = roundDTick(roughDTick, ONEHOUR, roundBase24); } else if(roughX2 > ONEMIN) { @@ -67210,7 +67590,12 @@ axes.autoTicks = function(ax, roughDTick) { } else if(ax.type === 'log') { ax.tick0 = 0; var rng = Lib.simpleMap(ax.range, ax.r2l); - + if(ax._isMinor) { + // Log axes by default get MORE than nTicks based on the metrics below + // But for minor ticks we don't want this increase, we already have + // the major ticks. + roughDTick *= 1.5; + } if(roughDTick > 0.7) { // only show powers of 10 ax.dtick = Math.ceil(roughDTick); @@ -68097,6 +68482,7 @@ axes.draw = function(gd, arg, opts) { plotinfo.xaxislayer.selectAll('.' + xa._id + 'divider').remove(); plotinfo.yaxislayer.selectAll('.' + ya._id + 'divider').remove(); + if(plotinfo.minorGridlayer) plotinfo.minorGridlayer.selectAll('path').remove(); if(plotinfo.gridlayer) plotinfo.gridlayer.selectAll('path').remove(); if(plotinfo.zerolinelayer) plotinfo.zerolinelayer.selectAll('path').remove(); @@ -68250,6 +68636,7 @@ axes.drawOne = function(gd, ax, opts) { vals: gridVals, counterAxis: counterAxis, layer: plotinfo.gridlayer.select('.' + axId), + minorLayer: plotinfo.minorGridlayer.select('.' + axId), path: gridPath, transFn: transTickFn }); @@ -68262,60 +68649,86 @@ axes.drawOne = function(gd, ax, opts) { } } - var tickSigns = axes.getTickSigns(ax); - var tickSubplots = []; + var tickPath; + + var majorTickSigns = axes.getTickSigns(ax); + var minorTickSigns = axes.getTickSigns(ax, 'minor'); + + if(ax.ticks || (ax.minor && ax.minor.ticks)) { + var majorTickPath = axes.makeTickPath(ax, mainLinePosition, majorTickSigns[2]); + var minorTickPath = axes.makeTickPath(ax, mainLinePosition, minorTickSigns[2], { minor: true }); + + var mirrorMajorTickPath; + var mirrorMinorTickPath; + + var fullMajorTickPath; + var fullMinorTickPath; - if(ax.ticks) { - var mainTickPath = axes.makeTickPath(ax, mainLinePosition, tickSigns[2]); - var mirrorTickPath; - var fullTickPath; if(ax._anchorAxis && ax.mirror && ax.mirror !== true) { - mirrorTickPath = axes.makeTickPath(ax, mainMirrorPosition, tickSigns[3]); - fullTickPath = mainTickPath + mirrorTickPath; + mirrorMajorTickPath = axes.makeTickPath(ax, mainMirrorPosition, majorTickSigns[3]); + mirrorMinorTickPath = axes.makeTickPath(ax, mainMirrorPosition, minorTickSigns[3], { minor: true }); + + fullMajorTickPath = majorTickPath + mirrorMajorTickPath; + fullMinorTickPath = minorTickPath + mirrorMinorTickPath; } else { - mirrorTickPath = ''; - fullTickPath = mainTickPath; + mirrorMajorTickPath = ''; + mirrorMinorTickPath = ''; + fullMajorTickPath = majorTickPath; + fullMinorTickPath = minorTickPath; } - var tickPath; if(ax.showdividers && outsideTicks && ax.tickson === 'boundaries') { var dividerLookup = {}; for(i = 0; i < dividerVals.length; i++) { dividerLookup[dividerVals[i].x] = 1; } tickPath = function(d) { - return dividerLookup[d.x] ? mirrorTickPath : fullTickPath; + return dividerLookup[d.x] ? mirrorMajorTickPath : fullMajorTickPath; }; } else { - tickPath = fullTickPath; - } - - axes.drawTicks(gd, ax, { - vals: tickVals, - layer: mainAxLayer, - path: tickPath, - transFn: transTickFn - }); - - if(ax.mirror === 'allticks') { - tickSubplots = Object.keys(ax._linepositions || {}); + tickPath = function(d) { + return d.minor ? fullMinorTickPath : fullMajorTickPath; + }; } } - for(i = 0; i < tickSubplots.length; i++) { - sp = tickSubplots[i]; - plotinfo = fullLayout._plots[sp]; - // [bottom or left, top or right], free and main are handled above - var linepositions = ax._linepositions[sp] || []; - var spTickPath = axes.makeTickPath(ax, linepositions[0], tickSigns[0]) + - axes.makeTickPath(ax, linepositions[1], tickSigns[1]); + axes.drawTicks(gd, ax, { + vals: tickVals, + layer: mainAxLayer, + path: tickPath, + transFn: transTickFn + }); - axes.drawTicks(gd, ax, { - vals: tickVals, - layer: plotinfo[axLetter + 'axislayer'], - path: spTickPath, - transFn: transTickFn - }); + if(ax.mirror === 'allticks') { + var tickSubplots = Object.keys(ax._linepositions || {}); + + for(i = 0; i < tickSubplots.length; i++) { + sp = tickSubplots[i]; + plotinfo = fullLayout._plots[sp]; + // [bottom or left, top or right], free and main are handled above + var linepositions = ax._linepositions[sp] || []; + + var p0 = linepositions[0]; + var p1 = linepositions[1]; + var isMinor = linepositions[2]; + + var spTickPath = + axes.makeTickPath(ax, p0, + isMinor ? majorTickSigns[0] : minorTickSigns[0], + { minor: isMinor } + ) + + axes.makeTickPath(ax, p1, + isMinor ? majorTickSigns[1] : minorTickSigns[1], + { minor: isMinor } + ); + + axes.drawTicks(gd, ax, { + vals: tickVals, + layer: plotinfo[axLetter + 'axislayer'], + path: spTickPath, + transFn: transTickFn + }); + } } var seq = []; @@ -68348,23 +68761,23 @@ axes.drawOne = function(gd, ax, opts) { repositionOnUpdate: true, secondary: true, transFn: transTickFn, - labelFns: axes.makeLabelFns(ax, mainLinePosition + standoff * tickSigns[4]) + labelFns: axes.makeLabelFns(ax, mainLinePosition + standoff * majorTickSigns[4]) }); }); seq.push(function() { - ax._depth = tickSigns[4] * (getLabelLevelBbox('tick2')[ax.side] - mainLinePosition); + ax._depth = majorTickSigns[4] * (getLabelLevelBbox('tick2')[ax.side] - mainLinePosition); return drawDividers(gd, ax, { vals: dividerVals, layer: mainAxLayer, - path: axes.makeTickPath(ax, mainLinePosition, tickSigns[4], ax._depth), + path: axes.makeTickPath(ax, mainLinePosition, majorTickSigns[4], { len: ax._depth }), transFn: transTickFn }); }); } else if(ax.title.hasOwnProperty('standoff')) { seq.push(function() { - ax._depth = tickSigns[4] * (getLabelLevelBbox()[ax.side] - mainLinePosition); + ax._depth = majorTickSigns[4] * (getLabelLevelBbox()[ax.side] - mainLinePosition); }); } @@ -68605,13 +69018,15 @@ function calcLabelLevelBbox(ax, cls) { * - [3]: sign for ticks mirroring 'ax.side' * - [4]: sign of arrow starting at axis pointing towards margin */ -axes.getTickSigns = function(ax) { +axes.getTickSigns = function(ax, minor) { var axLetter = ax._id.charAt(0); var sideOpposite = {x: 'top', y: 'right'}[axLetter]; var main = ax.side === sideOpposite ? 1 : -1; var out = [-1, 1, main, -main]; // then we flip if outside XOR y axis - if((ax.ticks !== 'inside') === (axLetter === 'x')) { + + var ticks = minor ? (ax.minor || {}).ticks : ax.ticks; + if((ticks !== 'inside') === (axLetter === 'x')) { out = out.map(function(v) { return -v; }); } // independent of `ticks`; do not flip this one @@ -68715,11 +69130,17 @@ function getTickLabelUV(ax) { * - {number} linewidth * @param {number} shift along direction of ticklen * @param {1 or -1} sgn tick sign - * @param {number (optional)} len tick length + * @param {object} opts + * - {number (optional)} len tick length * @return {string} */ -axes.makeTickPath = function(ax, shift, sgn, len) { - len = len !== undefined ? len : ax.ticklen; +axes.makeTickPath = function(ax, shift, sgn, opts) { + if(!opts) opts = {}; + var minor = opts.minor; + if(minor && !ax.minor) return ''; + + var len = opts.len !== undefined ? opts.len : + minor ? ax.minor.ticklen : ax.ticklen; var axLetter = ax._id.charAt(0); var pad = (ax.linewidth || 1) / 2; @@ -68926,17 +69347,20 @@ axes.drawTicks = function(gd, ax, opts) { var cls = ax._id + 'tick'; - var vals = opts.vals; - if( - ax.ticklabelmode === 'period' - ) { - // drop very first tick that we added to handle period - vals = vals.slice(); - vals.shift(); - } + var vals = [] + .concat(ax.minor && ax.minor.ticks ? + // minor vals + opts.vals.filter(function(d) { return d.minor && !d.noTick; }) : + [] + ) + .concat(ax.ticks ? + // major vals + opts.vals.filter(function(d) { return !d.minor && !d.noTick; }) : + [] + ); var ticks = opts.layer.selectAll('path.' + cls) - .data(ax.ticks ? vals : [], tickDataFn); + .data(vals, tickDataFn); ticks.exit().remove(); @@ -68944,8 +69368,16 @@ axes.drawTicks = function(gd, ax, opts) { .classed(cls, 1) .classed('ticks', 1) .classed('crisp', opts.crisp !== false) - .call(Color.stroke, ax.tickcolor) - .style('stroke-width', Drawing.crispRound(gd, ax.tickwidth, 1) + 'px') + .each(function(d) { + return Color.stroke(d3.select(this), d.minor ? ax.minor.tickcolor : ax.tickcolor); + }) + .style('stroke-width', function(d) { + return Drawing.crispRound( + gd, + d.minor ? ax.minor.tickwidth : ax.tickwidth, + 1 + ) + 'px'; + }) .attr('d', opts.path) .style('display', null); // visible @@ -68963,6 +69395,7 @@ axes.drawTicks = function(gd, ax, opts) { * - {boolean} showgrid * - {string} gridcolor * - {string} gridwidth + * - {string} griddash * - {boolean} zeroline * - {string} type * - {string} dtick @@ -68979,16 +69412,18 @@ axes.drawGrid = function(gd, ax, opts) { opts = opts || {}; var cls = ax._id + 'grid'; - var vals = opts.vals; + + var hasMinor = ax.minor && ax.minor.showgrid; + var minorVals = hasMinor ? opts.vals.filter(function(d) { return d.minor; }) : []; + var majorVals = ax.showgrid ? opts.vals.filter(function(d) { return !d.minor; }) : []; + var counterAx = opts.counterAxis; - if(ax.showgrid === false) { - vals = []; - } else if(counterAx && axes.shouldShowZeroLine(gd, ax, counterAx)) { + if(counterAx && axes.shouldShowZeroLine(gd, ax, counterAx)) { var isArrayMode = ax.tickmode === 'array'; - for(var i = 0; i < vals.length; i++) { - var xi = vals[i].x; + for(var i = 0; i < majorVals.length; i++) { + var xi = majorVals[i].x; if(isArrayMode ? !xi : (Math.abs(xi) < ax.dtick / 100)) { - vals = vals.slice(0, i).concat(vals.slice(i + 1)); + majorVals = majorVals.slice(0, i).concat(majorVals.slice(i + 1)); // In array mode you can in principle have multiple // ticks at 0, so test them all. Otherwise once we found // one we can stop. @@ -68998,26 +69433,50 @@ axes.drawGrid = function(gd, ax, opts) { } } - var grid = opts.layer.selectAll('path.' + cls) - .data(vals, tickDataFn); + ax._gw = + Drawing.crispRound(gd, ax.gridwidth, 1); - grid.exit().remove(); + var wMinor = !hasMinor ? 0 : + Drawing.crispRound(gd, ax.minor.gridwidth, 1); - grid.enter().append('path') - .classed(cls, 1) - .classed('crisp', opts.crisp !== false); + var majorLayer = opts.layer; + var minorLayer = opts.minorLayer; + for(var major = 1; major >= 0; major--) { + var layer = major ? majorLayer : minorLayer; + if(!layer) continue; - ax._gw = Drawing.crispRound(gd, ax.gridwidth, 1); + var grid = layer.selectAll('path.' + cls) + .data(major ? majorVals : minorVals, tickDataFn); - grid.attr('transform', opts.transFn) - .attr('d', opts.path) - .call(Color.stroke, ax.gridcolor || '#ddd') - .style('stroke-width', ax._gw + 'px') - .style('display', null); // visible + grid.exit().remove(); - hideCounterAxisInsideTickLabels(ax, [GRID_PATH]); + grid.enter().append('path') + .classed(cls, 1) + .classed('crisp', opts.crisp !== false); - if(typeof opts.path === 'function') grid.attr('d', opts.path); + grid.attr('transform', opts.transFn) + .attr('d', opts.path) + .each(function(d) { + return Color.stroke(d3.select(this), d.minor ? + ax.minor.gridcolor : + (ax.gridcolor || '#ddd') + ); + }) + .style('stroke-dasharray', function(d) { + return Drawing.dashStyle( + d.minor ? ax.minor.griddash : ax.griddash, + d.minor ? ax.minor.gridwidth : ax.gridwidth + ); + }) + .style('stroke-width', function(d) { + return (d.minor ? wMinor : ax._gw) + 'px'; + }) + .style('display', null); // visible + + if(typeof opts.path === 'function') grid.attr('d', opts.path); + } + + hideCounterAxisInsideTickLabels(ax, [GRID_PATH, MINORGRID_PATH]); }; /** @@ -69101,7 +69560,8 @@ axes.drawLabels = function(gd, ax, opts) { var axId = ax._id; var axLetter = axId.charAt(0); var cls = opts.cls || axId + 'tick'; - var vals = opts.vals; + + var vals = opts.vals.filter(function(d) { return d.text; }); var labelFns = opts.labelFns; var tickAngle = opts.secondary ? 0 : ax.tickangle; @@ -69283,6 +69743,7 @@ axes.drawLabels = function(gd, ax, opts) { if(anchorAx && insideTicklabelposition(anchorAx)) { (partialOpts || [ ZERO_PATH, + MINORGRID_PATH, GRID_PATH, TICK_PATH, TICK_TEXT @@ -69296,6 +69757,7 @@ axes.drawLabels = function(gd, ax, opts) { var sel; if(e.K === ZERO_PATH.K) sel = mainPlotinfo.zerolinelayer.selectAll('.' + ax._id + 'zl'); + else if(e.K === MINORGRID_PATH.K) sel = mainPlotinfo.minorGridlayer.selectAll('.' + ax._id); else if(e.K === GRID_PATH.K) sel = mainPlotinfo.gridlayer.selectAll('.' + ax._id); else sel = mainPlotinfo[ax._id.charAt(0) + 'axislayer']; @@ -70103,6 +70565,7 @@ var isNumeric = _dereq_('fast-isnumeric'); var Registry = _dereq_('../../registry'); var Lib = _dereq_('../../lib'); +var Template = _dereq_('../../plot_api/plot_template'); var handleArrayContainerDefaults = _dereq_('../array_container_defaults'); @@ -70220,16 +70683,45 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, color: dfltFontColor }); + // major ticks handleTickValueDefaults(containerIn, containerOut, coerce, axType); + + var hasMinor = options.hasMinor; + if(hasMinor) { + // minor ticks + Template.newContainer(containerOut, 'minor'); + handleTickValueDefaults(containerIn, containerOut, coerce, axType, { isMinor: true }); + } + handleTickLabelDefaults(containerIn, containerOut, coerce, axType, options); + + // major and minor ticks handleTickMarkDefaults(containerIn, containerOut, coerce, options); + if(hasMinor) { + var keepIsMinor = options.isMinor; + options.isMinor = true; + handleTickMarkDefaults(containerIn, containerOut, coerce, options); + options.isMinor = keepIsMinor; + } + handleLineGridDefaults(containerIn, containerOut, coerce, { dfltColor: dfltColor, bgColor: options.bgColor, showGrid: options.showGrid, + hasMinor: hasMinor, attributes: layoutAttributes }); + // delete minor when no minor ticks or gridlines + if( + hasMinor && + !containerOut.minor.ticks && + !containerOut.minor.showgrid + ) { + delete containerOut.minor; + } + + // mirror if(containerOut.showline || containerOut.ticks) coerce('mirror'); if(options.automargin) coerce('automargin'); @@ -70409,7 +70901,7 @@ function indexOfDay(v) { ]; } -},{"../../lib":287,"../../registry":378,"../array_container_defaults":329,"./category_order_defaults":339,"./constants":341,"./layout_attributes":349,"./line_grid_defaults":351,"./prefix_suffix_defaults":353,"./set_convert":356,"./tick_label_defaults":358,"./tick_mark_defaults":359,"./tick_value_defaults":360,"fast-isnumeric":33}],337:[function(_dereq_,module,exports){ +},{"../../lib":287,"../../plot_api/plot_template":323,"../../registry":378,"../array_container_defaults":329,"./category_order_defaults":339,"./constants":341,"./layout_attributes":349,"./line_grid_defaults":351,"./prefix_suffix_defaults":353,"./set_convert":356,"./tick_label_defaults":358,"./tick_mark_defaults":359,"./tick_value_defaults":360,"fast-isnumeric":33}],337:[function(_dereq_,module,exports){ 'use strict'; var docs = _dereq_('../../constants/docs'); @@ -73602,6 +74094,7 @@ function makeSubplotLayer(gd, plotinfo) { plotinfo.shapelayer = ensureSingle(backLayer, 'g', 'shapelayer'); plotinfo.imagelayer = ensureSingle(backLayer, 'g', 'imagelayer'); + plotinfo.minorGridlayer = ensureSingle(plotgroup, 'g', 'minor-gridlayer'); plotinfo.gridlayer = ensureSingle(plotgroup, 'g', 'gridlayer'); plotinfo.zerolinelayer = ensureSingle(plotgroup, 'g', 'zerolinelayer'); @@ -73641,6 +74134,7 @@ function makeSubplotLayer(gd, plotinfo) { // their other components to the corresponding // extra groups of their main plots. + plotinfo.minorGridlayer = mainplotinfo.minorGridlayer; plotinfo.gridlayer = mainplotinfo.gridlayer; plotinfo.zerolinelayer = mainplotinfo.zerolinelayer; @@ -73666,6 +74160,12 @@ function makeSubplotLayer(gd, plotinfo) { // common attributes for all subplots, overlays or not if(!hasOnlyLargeSploms) { + ensureSingleAndAddDatum(plotinfo.minorGridlayer, 'g', plotinfo.xaxis._id); + ensureSingleAndAddDatum(plotinfo.minorGridlayer, 'g', plotinfo.yaxis._id); + plotinfo.minorGridlayer.selectAll('g') + .map(function(d) { return d[0]; }) + .sort(axisIds.idSort); + ensureSingleAndAddDatum(plotinfo.gridlayer, 'g', plotinfo.xaxis._id); ensureSingleAndAddDatum(plotinfo.gridlayer, 'g', plotinfo.yaxis._id); plotinfo.gridlayer.selectAll('g') @@ -73762,6 +74262,100 @@ var constants = _dereq_('./constants'); var HOUR = constants.HOUR_PATTERN; var DAY_OF_WEEK = constants.WEEKDAY_PATTERN; +var tickmode = { + valType: 'enumerated', + values: ['auto', 'linear', 'array'], + editType: 'ticks', + impliedEdits: {tick0: undefined, dtick: undefined}, +}; + +function makeNticks(minor) { + return { + valType: 'integer', + min: 0, + dflt: minor ? 5 : 0, + editType: 'ticks', + }; +} + +var tick0 = { + valType: 'any', + editType: 'ticks', + impliedEdits: {tickmode: 'linear'}, +}; + +var dtick = { + valType: 'any', + editType: 'ticks', + impliedEdits: {tickmode: 'linear'}, +}; + +var tickvals = { + valType: 'data_array', + editType: 'ticks', +}; + +var ticks = { + valType: 'enumerated', + values: ['outside', 'inside', ''], + editType: 'ticks', +}; + +function makeTicklen(minor) { + var obj = { + valType: 'number', + min: 0, + editType: 'ticks', + }; + + if(!minor) obj.dflt = 5; + + return obj; +} + +function makeTickwidth(minor) { + var obj = { + valType: 'number', + min: 0, + editType: 'ticks', + }; + + if(!minor) obj.dflt = 1; + + return obj; +} + +var tickcolor = { + valType: 'color', + dflt: colorAttrs.defaultLine, + editType: 'ticks', +}; + +var gridcolor = { + valType: 'color', + dflt: colorAttrs.lightLine, + editType: 'ticks', +}; + +function makeGridwidth(minor) { + var obj = { + valType: 'number', + min: 0, + editType: 'ticks', + }; + + if(!minor) obj.dflt = 1; + + return obj; +} + +var griddash = extendFlat({}, dash, {editType: 'ticks'}); + +var showgrid = { + valType: 'boolean', + editType: 'ticks', +}; + module.exports = { visible: { valType: 'boolean', @@ -73935,41 +74529,22 @@ module.exports = { }), // ticks - tickmode: { - valType: 'enumerated', - values: ['auto', 'linear', 'array'], - editType: 'ticks', - impliedEdits: {tick0: undefined, dtick: undefined}, - }, - nticks: { + tickmode: tickmode, + nticks: makeNticks(), + tick0: tick0, + dtick: dtick, + ticklabelstep: { valType: 'integer', - min: 0, - dflt: 0, - editType: 'ticks', - }, - tick0: { - valType: 'any', - editType: 'ticks', - impliedEdits: {tickmode: 'linear'}, - }, - dtick: { - valType: 'any', - editType: 'ticks', - impliedEdits: {tickmode: 'linear'}, - }, - tickvals: { - valType: 'data_array', + min: 1, + dflt: 1, editType: 'ticks', }, + tickvals: tickvals, ticktext: { valType: 'data_array', editType: 'ticks', }, - ticks: { - valType: 'enumerated', - values: ['outside', 'inside', ''], - editType: 'ticks', - }, + ticks: ticks, tickson: { valType: 'enumerated', values: ['labels', 'boundaries'], @@ -74011,23 +74586,9 @@ module.exports = { dflt: false, editType: 'ticks+layoutstyle', }, - ticklen: { - valType: 'number', - min: 0, - dflt: 5, - editType: 'ticks', - }, - tickwidth: { - valType: 'number', - min: 0, - dflt: 1, - editType: 'ticks', - }, - tickcolor: { - valType: 'color', - dflt: colorAttrs.defaultLine, - editType: 'ticks', - }, + ticklen: makeTicklen(), + tickwidth: makeTickwidth(), + tickcolor: tickcolor, showticklabels: { valType: 'boolean', dflt: true, @@ -74169,21 +74730,11 @@ module.exports = { dflt: 1, editType: 'ticks+layoutstyle', }, - showgrid: { - valType: 'boolean', - editType: 'ticks', - }, - gridcolor: { - valType: 'color', - dflt: colorAttrs.lightLine, - editType: 'ticks', - }, - gridwidth: { - valType: 'number', - min: 0, - dflt: 1, - editType: 'ticks', - }, + showgrid: showgrid, + gridcolor: gridcolor, + gridwidth: makeGridwidth(), + griddash: griddash, + zeroline: { valType: 'boolean', editType: 'ticks', @@ -74247,6 +74798,26 @@ module.exports = { ], editType: 'plot', }, + + minor: { + tickmode: tickmode, + nticks: makeNticks('minor'), + tick0: tick0, + dtick: dtick, + tickvals: tickvals, + ticks: ticks, + ticklen: makeTicklen('minor'), + tickwidth: makeTickwidth('minor'), + tickcolor: tickcolor, + + gridcolor: gridcolor, + gridwidth: makeGridwidth('minor'), + griddash: griddash, + showgrid: showgrid, + + editType: 'ticks' + }, + layer: { valType: 'enumerated', values: ['above traces', 'below traces'], @@ -74540,6 +75111,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { )); var defaultOptions = { + hasMinor: true, letter: axLetter, font: layoutOut.font, outerTicks: outerTicks[axName], @@ -74690,7 +75262,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { 'use strict'; var colorMix = _dereq_('tinycolor2').mix; -var lightFraction = _dereq_('../../components/color/attributes').lightFraction; +var colorAttrs = _dereq_('../../components/color/attributes'); var Lib = _dereq_('../../lib'); /** @@ -74721,14 +75293,38 @@ module.exports = function handleLineGridDefaults(containerIn, containerOut, coer delete containerOut.linewidth; } - var gridColorDflt = colorMix(dfltColor, opts.bgColor, opts.blend || lightFraction).toRgbString(); + var gridColorDflt = colorMix(dfltColor, opts.bgColor, opts.blend || colorAttrs.lightFraction).toRgbString(); var gridColor = coerce2('gridcolor', gridColorDflt); var gridWidth = coerce2('gridwidth'); - var showGridLines = coerce('showgrid', opts.showGrid || !!gridColor || !!gridWidth); + var gridDash = coerce2('griddash'); + var showGridLines = coerce('showgrid', opts.showGrid || + !!gridColor || + !!gridWidth || + !!gridDash + ); if(!showGridLines) { delete containerOut.gridcolor; delete containerOut.gridwidth; + delete containerOut.griddash; + } + + if(opts.hasMinor) { + var minorGridColorDflt = colorMix(containerOut.gridcolor, opts.bgColor, 67).toRgbString(); + var minorGridColor = coerce2('minor.gridcolor', minorGridColorDflt); + var minorGridWidth = coerce2('minor.gridwidth', containerOut.gridwidth || 1); + var minorGridDash = coerce2('minor.griddash', containerOut.griddash || 'solid'); + var minorShowGridLines = coerce('minor.showgrid', + !!minorGridColor || + !!minorGridWidth || + !!minorGridDash + ); + + if(!minorShowGridLines) { + delete containerOut.minor.gridcolor; + delete containerOut.minor.gridwidth; + delete containerOut.minor.griddash; + } } if(!opts.noZeroLine) { @@ -76821,6 +77417,14 @@ module.exports = function handleTickLabelDefaults(containerIn, containerOut, coe color: dfltFontColor }); + if( + !options.noTicklabelstep && + axType !== 'multicategory' && + axType !== 'log' + ) { + coerce('ticklabelstep'); + } + if(!options.noAng) coerce('tickangle'); if(axType !== 'category') { @@ -76869,15 +77473,23 @@ var layoutAttributes = _dereq_('./layout_attributes'); * options: inherits outerTicks from axes.handleAxisDefaults */ module.exports = function handleTickMarkDefaults(containerIn, containerOut, coerce, options) { - var tickLen = Lib.coerce2(containerIn, containerOut, layoutAttributes, 'ticklen'); - var tickWidth = Lib.coerce2(containerIn, containerOut, layoutAttributes, 'tickwidth'); - var tickColor = Lib.coerce2(containerIn, containerOut, layoutAttributes, 'tickcolor', containerOut.color); - var showTicks = coerce('ticks', (options.outerTicks || tickLen || tickWidth || tickColor) ? 'outside' : ''); + var isMinor = options.isMinor; + var cIn = isMinor ? containerIn.minor || {} : containerIn; + var cOut = isMinor ? containerOut.minor : containerOut; + var lAttr = isMinor ? layoutAttributes.minor : layoutAttributes; + var prefix = isMinor ? 'minor.' : ''; + + var tickLen = Lib.coerce2(cIn, cOut, lAttr, 'ticklen', isMinor ? ((containerOut.ticklen || 5) * 0.6) : undefined); + var tickWidth = Lib.coerce2(cIn, cOut, lAttr, 'tickwidth', isMinor ? (containerOut.tickwidth || 1) : undefined); + var tickColor = Lib.coerce2(cIn, cOut, lAttr, 'tickcolor', (isMinor ? containerOut.tickcolor : undefined) || cOut.color); + var showTicks = coerce(prefix + 'ticks', ( + (!isMinor && options.outerTicks) || tickLen || tickWidth || tickColor + ) ? 'outside' : ''); if(!showTicks) { - delete containerOut.ticklen; - delete containerOut.tickwidth; - delete containerOut.tickcolor; + delete cOut.ticklen; + delete cOut.tickwidth; + delete cOut.tickcolor; } }; @@ -76887,12 +77499,18 @@ module.exports = function handleTickMarkDefaults(containerIn, containerOut, coer var cleanTicks = _dereq_('./clean_ticks'); var isArrayOrTypedArray = _dereq_('../../lib').isArrayOrTypedArray; -module.exports = function handleTickValueDefaults(containerIn, containerOut, coerce, axType) { +module.exports = function handleTickValueDefaults(containerIn, containerOut, coerce, axType, opts) { + if(!opts) opts = {}; + var isMinor = opts.isMinor; + var cIn = isMinor ? containerIn.minor || {} : containerIn; + var cOut = isMinor ? containerOut.minor : containerOut; + var prefix = isMinor ? 'minor.' : ''; + function readInput(attr) { - var v = containerIn[attr]; + var v = cIn[attr]; return ( v !== undefined - ) ? v : (containerOut._template || {})[attr]; + ) ? v : (cOut._template || {})[attr]; } var _tick0 = readInput('tick0'); @@ -76902,21 +77520,22 @@ module.exports = function handleTickValueDefaults(containerIn, containerOut, coe var tickmodeDefault = isArrayOrTypedArray(_tickvals) ? 'array' : _dtick ? 'linear' : 'auto'; - var tickmode = coerce('tickmode', tickmodeDefault); + var tickmode = coerce(prefix + 'tickmode', tickmodeDefault); - if(tickmode === 'auto') coerce('nticks'); - else if(tickmode === 'linear') { + if(tickmode === 'auto') { + coerce(prefix + 'nticks'); + } else if(tickmode === 'linear') { // dtick is usually a positive number, but there are some // special strings available for log or date axes // tick0 also has special logic - var dtick = containerOut.dtick = cleanTicks.dtick( + var dtick = cOut.dtick = cleanTicks.dtick( _dtick, axType); - containerOut.tick0 = cleanTicks.tick0( + cOut.tick0 = cleanTicks.tick0( _tick0, axType, containerOut.calendar, dtick); } else if(axType !== 'multicategory') { - var tickvals = coerce('tickvals'); - if(tickvals === undefined) containerOut.tickmode = 'auto'; - else coerce('ticktext'); + var tickvals = coerce(prefix + 'tickvals'); + if(tickvals === undefined) cOut.tickmode = 'auto'; + else if(!isMinor) coerce('ticktext'); } }; @@ -81939,6 +82558,7 @@ var ternaryAxesAttrs = { ticklen: axesAttrs.ticklen, tickwidth: axesAttrs.tickwidth, tickcolor: axesAttrs.tickcolor, + ticklabelstep: axesAttrs.ticklabelstep, showticklabels: axesAttrs.showticklabels, showtickprefix: axesAttrs.showtickprefix, tickprefix: axesAttrs.tickprefix, @@ -81960,6 +82580,7 @@ var ternaryAxesAttrs = { showgrid: extendFlat({}, axesAttrs.showgrid, {dflt: true}), gridcolor: axesAttrs.gridcolor, gridwidth: axesAttrs.gridwidth, + griddash: axesAttrs.griddash, layer: axesAttrs.layer, // range min: { @@ -83178,7 +83799,7 @@ function registerTraceModule(_module) { // add `PlotlyGeoAssets` global to stash references to all fetched // topojson / geojson data if((bpmName === 'geo' || bpmName === 'mapbox') && - (typeof window !== undefined && window.PlotlyGeoAssets === undefined) + (window.PlotlyGeoAssets === undefined) ) { window.PlotlyGeoAssets = {topojson: {}}; } @@ -83771,7 +84392,7 @@ function svgToImg(opts) { var w1 = scale * w0; var h1 = scale * h0; - var ctx = canvas.getContext('2d'); + var ctx = canvas.getContext('2d', {willReadFrequently: true}); var img = new Image(); var svgBlob, url; @@ -83959,7 +84580,7 @@ module.exports = function toSVG(gd, format, scale) { var toppaper = fullLayout._toppaper; var width = fullLayout.width; var height = fullLayout.height; - var i, k; + var i; // make background color a rect in the svg, then revert after scraping // all other alterations have been dealt with by properly preparing the svg @@ -84032,32 +84653,21 @@ module.exports = function toSVG(gd, format, scale) { } }); - var queryParts = []; - if(fullLayout._gradientUrlQueryParts) { - for(k in fullLayout._gradientUrlQueryParts) queryParts.push(k); - } + svg.selectAll('.gradient_filled,.pattern_filled').each(function() { + var pt = d3.select(this); - if(fullLayout._patternUrlQueryParts) { - for(k in fullLayout._patternUrlQueryParts) queryParts.push(k); - } + // similar to font family styles above, + // we must remove " after the SVG DOM has been serialized + var fill = this.style.fill; + if(fill && fill.indexOf('url(') !== -1) { + pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB)); + } - if(queryParts.length) { - svg.selectAll(queryParts.join(',')).each(function() { - var pt = d3.select(this); - - // similar to font family styles above, - // we must remove " after the SVG DOM has been serialized - var fill = this.style.fill; - if(fill && fill.indexOf('url(') !== -1) { - pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB)); - } - - var stroke = this.style.stroke; - if(stroke && stroke.indexOf('url(') !== -1) { - pt.style('stroke', stroke.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB)); - } - }); - } + var stroke = this.style.stroke; + if(stroke && stroke.indexOf('url(') !== -1) { + pt.style('stroke', stroke.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB)); + } + }); if(format === 'pdf' || format === 'eps') { // these formats make the extra line MathJax adds around symbols look super thick in some cases @@ -86417,12 +87027,14 @@ function calcTexttemplate(fullLayout, cd, index, xa, ya) { var trace = cd[0].trace; var texttemplate = Lib.castOption(trace, index, 'texttemplate'); if(!texttemplate) return ''; + var isHistogram = (trace.type === 'histogram'); var isWaterfall = (trace.type === 'waterfall'); var isFunnel = (trace.type === 'funnel'); + var isHorizontal = trace.orientation === 'h'; var pLetter, pAxis; var vLetter, vAxis; - if(trace.orientation === 'h') { + if(isHorizontal) { pLetter = 'y'; pAxis = ya; vLetter = 'x'; @@ -86457,6 +87069,11 @@ function calcTexttemplate(fullLayout, cd, index, xa, ya) { var pt = {}; appendArrayPointValue(pt, trace, cdi.i); + if(isHistogram || pt.x === undefined) pt.x = isHorizontal ? obj.value : obj.label; + if(isHistogram || pt.y === undefined) pt.y = isHorizontal ? obj.label : obj.value; + if(isHistogram || pt.xLabel === undefined) pt.xLabel = isHorizontal ? obj.valueLabel : obj.labelLabel; + if(isHistogram || pt.yLabel === undefined) pt.yLabel = isHorizontal ? obj.labelLabel : obj.valueLabel; + if(isWaterfall) { obj.delta = +cdi.rawS || cdi.s; obj.deltaLabel = formatNumber(obj.delta); @@ -92704,6 +93321,7 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { var font = trace.textfont; var fontFamily = font.family; var fontSize = font.size; + var globalFontSize = gd._fullLayout.font.size; if(!fontSize || fontSize === 'auto') { var minW = Infinity; @@ -92730,7 +93348,7 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { !isFinite(minW) || !isFinite(minH) ) { - fontSize = 12; + fontSize = globalFontSize; } else { minW -= xGap; minH -= yGap; @@ -92743,7 +93361,8 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { fontSize = Math.min( Math.floor(minW), - Math.floor(minH) + Math.floor(minH), + globalFontSize ); } } @@ -93397,8 +94016,9 @@ var getBinSpanLabelRound = _dereq_('./bin_label_vals'); function calc(gd, trace) { var pos = []; var size = []; - var pa = Axes.getFromId(gd, trace.orientation === 'h' ? trace.yaxis : trace.xaxis); - var mainData = trace.orientation === 'h' ? 'y' : 'x'; + var isHorizontal = trace.orientation === 'h'; + var pa = Axes.getFromId(gd, isHorizontal ? trace.yaxis : trace.xaxis); + var mainData = isHorizontal ? 'y' : 'x'; var counterData = {x: 'y', y: 'x'}[mainData]; var calendar = trace[mainData + 'calendar']; var cumulativeSpec = trace.cumulative; @@ -95299,7 +95919,7 @@ module.exports = function hoverPoints(pointData, xval, yval) { if(trace._hasZ) { pixel = cd0.z[ny][nx]; } else if(trace._hasSource) { - pixel = trace._canvas.el.getContext('2d').getImageData(nx, ny, 1, 1).data; + pixel = trace._canvas.el.getContext('2d', {willReadFrequently: true}).getImageData(nx, ny, 1, 1).data; } // return early if pixel is undefined @@ -95480,7 +96100,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) { var canvas = document.createElement('canvas'); canvas.width = imageWidth; canvas.height = imageHeight; - var context = canvas.getContext('2d'); + var context = canvas.getContext('2d', {willReadFrequently: true}); var ipx = function(i) {return Lib.constrain(Math.round(xa.c2p(x0 + i * dx) - left), 0, imageWidth);}; var jpx = function(j) {return Lib.constrain(Math.round(ya.c2p(y0 + j * dy) - top), 0, imageHeight);}; @@ -95555,7 +96175,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) { var canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; - var context = canvas.getContext('2d'); + var context = canvas.getContext('2d', {willReadFrequently: true}); trace._image = trace._image || new Image(); var image = trace._image; @@ -95580,7 +96200,7 @@ module.exports = function plot(gd, plotinfo, cdimage, imageLayer) { if(realImage) { href = trace.source; } else { - var context = trace._canvas.el.getContext('2d'); + var context = trace._canvas.el.getContext('2d', {willReadFrequently: true}); var data = context.getImageData(0, 0, w, h).data; canvas = drawMagnifiedPixelsOnCanvas(function(i, j) { var index = 4 * (j * w + i); @@ -97565,6 +98185,7 @@ var hovertemplateAttrs = _dereq_('../../plots/template_attributes').hovertemplat var colorScaleAttrs = _dereq_('../../components/colorscale/attributes'); var fontAttrs = _dereq_('../../plots/font_attributes'); var dash = _dereq_('../../components/drawing/attributes').dash; +var pattern = _dereq_('../../components/drawing/attributes').pattern; var Drawing = _dereq_('../../components/drawing'); var constants = _dereq_('./constants'); @@ -97752,6 +98373,7 @@ module.exports = { editType: 'style', anim: true, }, + fillpattern: pattern, marker: extendFlat({ symbol: { valType: 'enumerated', @@ -98488,6 +99110,7 @@ var handleLineDefaults = _dereq_('./line_defaults'); var handleLineShapeDefaults = _dereq_('./line_shape_defaults'); var handleTextDefaults = _dereq_('./text_defaults'); var handleFillColorDefaults = _dereq_('./fillcolor_defaults'); +var coercePattern = _dereq_('../../lib').coercePattern; module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { @@ -98541,6 +99164,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(traceOut.fill !== 'none') { handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce); if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce); + coercePattern(coerce, 'fillpattern', traceOut.fillcolor, false); } var lineColor = (traceOut.line || {}).color; @@ -99923,11 +100547,11 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // the points on the axes are the first two points. Otherwise // animations get a little crazy if the number of points changes. transition(ownFillEl3).attr('d', 'M' + pt1 + 'L' + pt0 + 'L' + fullpath.substr(1)) - .call(Drawing.singleFillStyle); + .call(Drawing.singleFillStyle, gd); } else { // fill to self: just join the path to itself transition(ownFillEl3).attr('d', fullpath + 'Z') - .call(Drawing.singleFillStyle); + .call(Drawing.singleFillStyle, gd); } } } else if(tonext) { @@ -99939,7 +100563,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // This makes strange results if one path is *not* entirely // inside the other, but then that is a strange usage. transition(tonext).attr('d', fullpath + 'Z' + prevRevpath + 'Z') - .call(Drawing.singleFillStyle); + .call(Drawing.singleFillStyle, gd); } else { // tonextx/y: for now just connect endpoints with lines. This is // the correct behavior if the endpoints are at the same value of @@ -99947,7 +100571,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // things depending on whether the new endpoint projects onto the // existing curve or off the end of it transition(tonext).attr('d', fullpath + 'L' + prevRevpath.substr(1) + 'Z') - .call(Drawing.singleFillStyle); + .call(Drawing.singleFillStyle, gd); } trace._polygons = trace._polygons.concat(prevPolygons); } else { @@ -100340,7 +100964,7 @@ function style(gd) { .call(Drawing.lineGroupStyle); s.selectAll('g.trace path.js-fill') - .call(Drawing.fillGroupStyle); + .call(Drawing.fillGroupStyle, gd); Registry.getComponentMethod('errorbars', 'style')(s); } @@ -102807,22 +103431,22 @@ function getSortFunc(opts, d2c) { 'use strict'; // package version injected by `npm run preprocess` -exports.version = '2.8.0'; +exports.version = '2.12.1'; },{}]},{},[15])(15) }); var locale={moduleType:"locale",name:"ca",dictionary:{},format:{days:["Diumenge","Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte"],shortDays:["Dug","Dln","Dmt","Dmc","Djs","Dvn","Dsb"],months:["Gener","Febrer","Mar\xe7","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"],shortMonths:["Gen","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Oct","Nov","Des"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"de",dictionary:{Autoscale:"Automatische Skalierung","Box Select":"Rechteckauswahl","Click to enter Colorscale title":"Klicken, um den Farbskalatitel einzugeben","Click to enter Component A title":"Klicken, um den Titel der Komponente A einzugeben","Click to enter Component B title":"Klicken, um den Titel der Komponente B einzugeben","Click to enter Component C title":"Klicken, um den Titel der Komponente C einzugeben","Click to enter Plot title":"Klicken, um den Titel des Graphen einzugeben","Click to enter X axis title":"Klicken, um den Titel der X-Achse einzugeben","Click to enter Y axis title":"Klicken, um den Titel der Y-Achse einzugeben","Compare data on hover":"\xdcber die Daten fahren, um sie zu vergleichen","Double-click on legend to isolate one trace":"Daten isolieren durch Doppelklick in der Legende","Double-click to zoom back out":"Herauszoomen durch Doppelklick","Download plot as a png":"Graphen als PNG herunterladen","Download plot":"Graphen herunterladen","Edit in Chart Studio":"Im Chart Studio bearbeiten","IE only supports svg. Changing format to svg.":"IE unterst\xfctzt nur SVG-Dateien. Format wird zu SVG gewechselt.","Lasso Select":"Lassoauswahl","Orbital rotation":"Orbitalrotation",Pan:"Verschieben","Produced with Plotly":"Erstellt mit Plotly",Reset:"Zur\xfccksetzen","Reset axes":"Achsen zur\xfccksetzen","Reset camera to default":"Kamera auf Standard zur\xfccksetzen","Reset camera to last save":"Kamera auf letzte Speicherung zur\xfccksetzen","Reset view":"Ansicht zur\xfccksetzen","Reset views":"Ansichten zur\xfccksetzen","Show closest data on hover":"Zeige n\xe4heste Daten beim \xdcberfahren","Snapshot succeeded":"Snapshot erfolgreich","Sorry, there was a problem downloading your snapshot!":"Es gab ein Problem beim Herunterladen des Snapshots","Taking snapshot - this may take a few seconds":"Erstelle einen Snapshot - dies kann einige Sekunden dauern",Zoom:"Zoom","Zoom in":"Hineinzoomen","Zoom out":"Herauszoomen","close:":"Schluss:",trace:"Datenspur","lat:":"Lat.:","lon:":"Lon.:","q1:":"q1:","q3:":"q3:","source:":"Quelle:","target:":"Ziel:","lower fence:":"Untere Schranke:","upper fence:":"Obere Schranke:","max:":"Max.:","mean \xb1 \u03c3:":"Mittelwert \xb1 \u03c3:","mean:":"Mittelwert:","median:":"Median:","min:":"Min.:","Turntable rotation":"Drehscheibenorbit","Toggle Spike Lines":"Bezugslinien an-/abschalten","open:":"Er\xf6ffnung:","high:":"H\xf6chstkurs:","low:":"Tiefstkurs:","Toggle show closest data on hover":"Anzeige der n\xe4hesten Daten an-/abschalten","incoming flow count:":"Anzahl eingehender Verbindungen:","outgoing flow count:":"Anzahl ausgehender Verbindungen:","kde:":"Dichte:"},format:{days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","M\xe4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","M\xe4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],date:"%d.%m.%Y",decimal:",",thousands:"."}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"es",dictionary:{Autoscale:"Autoescalar","Box Select":"Seleccionar Caja","Click to enter Colorscale title":"Introducir el t\xedtulo de la Escala de Color","Click to enter Component A title":"Introducir el t\xedtulo del Componente A","Click to enter Component B title":"Introducir el t\xedtulo del Componente B","Click to enter Component C title":"Introducir el t\xedtulo del Componente C","Click to enter Plot title":"Introducir el t\xedtulo de la Gr\xe1fica","Click to enter X axis title":"Introducir el t\xedtulo del eje X","Click to enter Y axis title":"Introducir el t\xedtulo del eje Y","Click to enter radial axis title":"Introducir el t\xedtulo del eje radial","Compare data on hover":"Comparar datos al pasar por encima","Double-click on legend to isolate one trace":"Haga doble-clic en la leyenda para aislar una traza","Double-click to zoom back out":"Haga doble-clic para restaurar la escala","Download plot as a png":"Descargar gr\xe1fica como png","Download plot":"Descargar gr\xe1fica","Edit in Chart Studio":"Editar en Chart Studio","IE only supports svg. Changing format to svg.":"IE solo soporta svg. Cambiando formato a svg.","Lasso Select":"Seleccionar con lazo","Orbital rotation":"Rotaci\xf3n esf\xe9rica",Pan:"Modo Panor\xe1mica","Produced with Plotly":"Hecho con Plotly",Reset:"Reiniciar","Reset axes":"Reiniciar ejes","Reset camera to default":"Restaurar c\xe1mara predeterminada","Reset camera to last save":"Restaurar anterior c\xe1mara","Reset view":"Restaurar vista","Reset views":"Restaurar vistas","Show closest data on hover":"Mostrar el dato m\xe1s cercano al pasar por encima","Snapshot succeeded":"La captura de la instant\xe1nea finaliz\xf3 correctamente","Sorry, there was a problem downloading your snapshot!":"\xa1La descarga de la instant\xe1nea fall\xf3!","Taking snapshot - this may take a few seconds":"Capturando una instant\xe1nea - podr\xeda tardar unos segundos","Toggle Spike Lines":"Mostrar/Ocultar Gu\xedas","Toggle show closest data on hover":"Activar/Desactivar mostrar el dato m\xe1s cercano al pasar por encima","Turntable rotation":"Rotaci\xf3n plana",Zoom:"Modo Ampliar/Reducir","Zoom in":"Ampliar","Zoom out":"Reducir","close:":"cierre:","high:":"alza:","incoming flow count:":"flujo de entrada:","kde:":"edp:","lat:":"lat:","lon:":"lon:","low:":"baja:","lower fence:":"l\xedmite inferior:","max:":"m\xe1x:","mean \xb1 \u03c3:":"media \xb1 \u03c3:","mean:":"media:","median:":"mediana:","min:":"m\xedn:","new text":"nuevo texto","open:":"apertura:","outgoing flow count:":"flujo de salida:","q1:":"q1:","q3:":"q3:","source:":"fuente:","target:":"destino:",trace:"traza","upper fence:":"l\xedmite superior:"},format:{days:["Domingo","Lunes","Martes","Mi\xe9rcoles","Jueves","Viernes","S\xe1bado"],shortDays:["Dom","Lun","Mar","Mi\xe9","Jue","Vie","S\xe1b"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],shortMonths:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],date:"%d/%m/%Y",decimal:",",thousands:" "}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"fi",dictionary:{Autoscale:"Autoskaalaa","Box Select":"Laatikkovalinta","Click to enter Colorscale title":"Klikkaa antaaksesi v\xe4riskaalan otsikko","Click to enter Component A title":"Klikkaa antaaksesi komponentin A otsikko","Click to enter Component B title":"Klikkaa antaaksesi komponentin B otsikko","Click to enter Component C title":"Klikkaa antaaksesi komponentin C otsikko","Click to enter Plot title":"Klikkaa antaaksesi kuvion otsikko","Click to enter X axis title":"Klikkaa antaaksesi x-akselin otsikko","Click to enter Y axis title":"Klikkaa antaaksesi y-akselin otsikko","Click to enter radial axis title":"Klikkaa antaaksesi radiaalisen akselin otsikko","Compare data on hover":"Vertaa dataa kursorilla","Double-click on legend to isolate one trace":"Kaksoisklikkaa selitett\xe4 erist\xe4\xe4ksesi yksi sarja","Double-click to zoom back out":"Kaksoisklikkaa zoomataksesi ulos","Download plot":"Lataa kuvio","Download plot as png":"Lataa kuvio png-muodossa","Edit in Chart Studio":"Muokkaa Chart Studiossa","IE only supports svg. Changing format to svg.":"Formaatiksi vaihdetaan IE:n tukema svg.","Lasso Select":"Lassovalinta","Orbital rotation":"Orbitaalikierto",Pan:"Panorointi","Produced with Plotly":"Tuotettu Plotlyll\xe4",Reset:"Palauta oletusasetukset","Reset axes":"Palauta akselien oletusasetukset","Reset camera to default":"Palauta kameran oletusasetukset","Reset camera to last save":"Palauta kameran viimeksi tallennetut asetukset","Reset view":"Palauta n\xe4kym\xe4n oletusasetukset","Reset views":"Palauta n\xe4kymien oletusasetukset","Show closest data on hover":"N\xe4yt\xe4 kursoria l\xe4hin data","Snapshot succeeded":"Tilannekuvan ottaminen onnistui","Sorry, there was a problem downloading your snapshot!":"Pahoittelut, tilannekuvan lataaminen ep\xe4onnistui!","Taking snapshot - this may take a few seconds":"Otetaan tilannekuvaa - odota hetki","Toggle Spike Lines":"N\xe4yt\xe4 huiput","Toggle show closest data on hover":"N\xe4yt\xe4 kursoria l\xe4hin data","Turntable rotation":"Tasokierto",Zoom:"Zoomaus","Zoom in":"Zoomaa sis\xe4\xe4n","Zoom out":"Zoomaa ulos","close:":"loppu:","high:":"korkein:","incoming flow count:":"saapuva virtaus:","kde:":"ydinestimointi:","lat:":"lat.:","lon:":"lon.:","low:":"matalin:","lower fence:":"alempi raja:","max:":"maks.:","mean \xb1 \u03c3:":"keskiarvo \xb1 \u03c3:","mean:":"keskiarvo:","median:":"mediaani:","min:":"min.:","new text":"uusi teksti","open:":"alku:","outgoing flow count:":"l\xe4htev\xe4 virtaus:","q1:":"q1:","q3:":"q3:","source:":"l\xe4hde:","target:":"kohde:",trace:"sarja","upper fence:":"ylempi raja:"},format:{days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],shortDays:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kes\xe4kuu","hein\xe4kuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],shortMonths:["tammi","helmi","maalis","huhti","touko","kes\xe4","hein\xe4","elo","syys","loka","marras","joulu"],date:"%d.%m.%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"fr",dictionary:{Autoscale:"\xc9chelle automatique","Box Select":"S\xe9lection rectangulaire","Click to enter Colorscale title":"Ajouter un titre \xe0 l'\xe9chelle de couleurs","Click to enter Component A title":"Ajouter un titre \xe0 la composante A","Click to enter Component B title":"Ajouter un titre \xe0 la composante B","Click to enter Component C title":"Ajouter un titre \xe0 la composante C","Click to enter Plot title":"Ajouter un titre au graphique","Click to enter X axis title":"Ajouter un titre \xe0 l'axe des x","Click to enter Y axis title":"Ajouter un titre \xe0 l'axe des y","Click to enter radial axis title":"Ajouter un titre \xe0 l'axe radial","Compare data on hover":"Comparaison entre donn\xe9es en survol","Double-click on legend to isolate one trace":"Double-cliquer sur la l\xe9gende pour isoler une s\xe9rie","Double-click to zoom back out":"Double-cliquer pour d\xe9zoomer","Download plot as a png":"T\xe9l\xe9charger le graphique en fichier PNG","Download plot":"T\xe9l\xe9charger le graphique","Edit in Chart Studio":"\xc9diter le graphique sur Chart Studio","IE only supports svg. Changing format to svg.":"IE ne permet que les conversions en SVG. Conversion en SVG en cours.","Lasso Select":"S\xe9lection lasso","Orbital rotation":"Rotation orbitale",Pan:"Translation","Produced with Plotly":"G\xe9n\xe9r\xe9 avec Plotly",Reset:"R\xe9initialiser","Reset axes":"R\xe9initialiser les axes","Reset camera to default":"R\xe9gler la cam\xe9ra \xe0 sa valeur d\xe9faut","Reset camera to last save":"R\xe9gler la cam\xe9ra \xe0 sa valeur sauvegard\xe9e","Reset view":"R\xe9initialiser","Reset views":"R\xe9initialiser","Show closest data on hover":"Donn\xe9es les plus proches en survol","Snapshot succeeded":"Conversion r\xe9ussie","Sorry, there was a problem downloading your snapshot!":"D\xe9sol\xe9, un probl\xe8me est survenu lors du t\xe9l\xe9chargement de votre graphique","Taking snapshot - this may take a few seconds":"Conversion en cours, ceci peut prendre quelques secondes",Zoom:"Zoom","Zoom in":"Zoom int\xe9rieur","Zoom out":"Zoom ext\xe9rieur","close:":"fermeture :",trace:"s\xe9rie","lat:":"lat. :","lon:":"lon. :","q1:":"q1 :","q3:":"q3 :","source:":"source :","target:":"embouchure :","lower fence:":"cl\xf4ture sup\xe9rieure :","upper fence:":"cl\xf4ture inf\xe9rieure :","max:":"max. :","mean \xb1 \u03c3:":"moyenne \xb1 \u03c3 :","mean:":"moyenne :","median:":"m\xe9diane :","min:":"min. :","new text":"nouveau texte","Turntable rotation":"Rotation planaire","Toggle Spike Lines":"Activer/d\xe9sactiver les pics","open:":"ouverture :","high:":"haut :","low:":"bas :","Toggle show closest data on hover":"Activer/d\xe9sactiver le survol","incoming flow count:":"flux entrant :","outgoing flow count:":"flux sortant :","kde:":"est. par noyau :"},format:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],shortDays:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Janvier","F\xe9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xfbt","Septembre","Octobre","Novembre","D\xe9cembre"],shortMonths:["Jan","F\xe9v","Mar","Avr","Mai","Jun","Jul","Ao\xfb","Sep","Oct","Nov","D\xe9c"],date:"%d/%m/%Y",decimal:",",thousands:" ",year:"%Y",month:"%b %Y",dayMonth:"%-d %b",dayMonthYear:"%-d %b %Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"it",dictionary:{Autoscale:"Scala automaticamente","Box Select":"Selezione box","Click to enter Colorscale title":"Clicca per inserire un titolo alla scala di colori","Click to enter Component A title":"Clicca per inserire un titolo al componente A","Click to enter Component B title":"Clicca per inserire un titolo al componente B","Click to enter Component C title":"Clicca per inserire un titolo al componente C","Click to enter Plot title":"Clicca per inserire un titolo al grafico","Click to enter X axis title":"Clicca per inserire un titolo all'asse X","Click to enter Y axis title":"Clicca per inserire un titolo all'asse Y","Click to enter radial axis title":"Clicca per inserire un titolo per l' asse radiale","Compare data on hover":"Paragona i dati al passaggio del mouse","Double-click on legend to isolate one trace":"Doppio click per isolare i dati di una traccia","Double-click to zoom back out":"Doppio click per tornare allo zoom iniziale","Download plot as a png":"Scarica il grafico come immagine png","Download plot":"Scarica il grafico","Edit in Chart Studio":"Modifica in Chart Studio","IE only supports svg. Changing format to svg.":"IE supporta solo svg. Modifica formato in svg.","Lasso Select":"Selezione lazo","Orbital rotation":"Rotazione orbitale",Pan:"Sposta","Produced with Plotly":"Creato con Plotly",Reset:"Reset","Reset axes":"Resetta gli assi","Reset camera to default":"Reimposta la camera ai valori predefiniti","Reset camera to last save":"Reimposta la camera all' ultimo salvataggio","Reset view":"Reimposta la vista","Reset views":"Reimposta le viste","Show closest data on hover":"Mostra i dati pi\xf9 vicini al passaggio del mouse","Snapshot succeeded":"Screenshot creato con successo","Sorry, there was a problem downloading your snapshot!":"Si \xe8 verificato un errore durante la creazione dello screenshot","Taking snapshot - this may take a few seconds":"Creazione screenshot - potrebbe richiedere qualche secondo",Zoom:"Zoom","Zoom in":"Ingrandisci","Zoom out":"Rimpicciolisci","close:":"chiudi:",trace:"traccia","lat:":"lat.:","lon:":"lon.:","q1:":"q1:","q3:":"q3:","source:":"sorgente:","target:":"target:","max:":"max.:","mean \xb1 \u03c3:":"media \xb1 \u03c3:","mean:":"media:","median:":"mediana:","min:":"min.:","new text:":"Nuovo testo:","upper fence:":"limite superiore:","lower fence:":"limite inferiore:","Turntable rotation":"Rotazione piattaforma","Toggle Spike Lines":"Abilita linee di identificazione","open:":"apri:","high:":"alto:","kde:":"kde:","low:":"basso:","incoming flow count:":"Flusso in entrata:","outgoing flow count:":"Flusso in uscita:","Toggle show closest data on hover":"Abilita mostra i dati pi\xf9 vicini al passaggio del mouse"},format:{days:["Domenica","Luned\xec","Marted\xec","Mercoled\xec","Gioved\xec","Venerd\xec","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],date:"%d/%m/%Y",decimal:",",thousands:"."}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"de",dictionary:{Autoscale:"Automatische Skalierung","Box Select":"Rechteckauswahl","Click to enter Colorscale title":"Klicken, um den Farbskalatitel einzugeben","Click to enter Component A title":"Klicken, um den Titel der Komponente A einzugeben","Click to enter Component B title":"Klicken, um den Titel der Komponente B einzugeben","Click to enter Component C title":"Klicken, um den Titel der Komponente C einzugeben","Click to enter Plot title":"Klicken, um den Titel des Graphen einzugeben","Click to enter X axis title":"Klicken, um den Titel der X-Achse einzugeben","Click to enter Y axis title":"Klicken, um den Titel der Y-Achse einzugeben","Compare data on hover":"\xdcber die Daten fahren, um sie zu vergleichen","Double-click on legend to isolate one trace":"Daten isolieren durch Doppelklick in der Legende","Double-click to zoom back out":"Herauszoomen durch Doppelklick","Download plot as a png":"Graphen als PNG herunterladen","Download plot":"Graphen herunterladen","Edit in Chart Studio":"Im Chart Studio bearbeiten","IE only supports svg. Changing format to svg.":"IE unterst\xfctzt nur SVG-Dateien. Format wird zu SVG gewechselt.","Lasso Select":"Lassoauswahl","Orbital rotation":"Orbitalrotation",Pan:"Verschieben","Produced with Plotly.js":"Erstellt mit Plotly.js",Reset:"Zur\xfccksetzen","Reset axes":"Achsen zur\xfccksetzen","Reset camera to default":"Kamera auf Standard zur\xfccksetzen","Reset camera to last save":"Kamera auf letzte Speicherung zur\xfccksetzen","Reset view":"Ansicht zur\xfccksetzen","Reset views":"Ansichten zur\xfccksetzen","Show closest data on hover":"Zeige n\xe4heste Daten beim \xdcberfahren","Snapshot succeeded":"Snapshot erfolgreich","Sorry, there was a problem downloading your snapshot!":"Es gab ein Problem beim Herunterladen des Snapshots","Taking snapshot - this may take a few seconds":"Erstelle einen Snapshot - dies kann einige Sekunden dauern",Zoom:"Zoom","Zoom in":"Hineinzoomen","Zoom out":"Herauszoomen","close:":"Schluss:",trace:"Datenspur","lat:":"Lat.:","lon:":"Lon.:","q1:":"q1:","q3:":"q3:","source:":"Quelle:","target:":"Ziel:","lower fence:":"Untere Schranke:","upper fence:":"Obere Schranke:","max:":"Max.:","mean \xb1 \u03c3:":"Mittelwert \xb1 \u03c3:","mean:":"Mittelwert:","median:":"Median:","min:":"Min.:","Turntable rotation":"Drehscheibenorbit","Toggle Spike Lines":"Bezugslinien an-/abschalten","open:":"Er\xf6ffnung:","high:":"H\xf6chstkurs:","low:":"Tiefstkurs:","Toggle show closest data on hover":"Anzeige der n\xe4hesten Daten an-/abschalten","incoming flow count:":"Anzahl eingehender Verbindungen:","outgoing flow count:":"Anzahl ausgehender Verbindungen:","kde:":"Dichte:"},format:{days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","M\xe4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","M\xe4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],date:"%d.%m.%Y",decimal:",",thousands:"."}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"es",dictionary:{Autoscale:"Autoescalar","Box Select":"Seleccionar Caja","Click to enter Colorscale title":"Introducir el t\xedtulo de la Escala de Color","Click to enter Component A title":"Introducir el t\xedtulo del Componente A","Click to enter Component B title":"Introducir el t\xedtulo del Componente B","Click to enter Component C title":"Introducir el t\xedtulo del Componente C","Click to enter Plot title":"Introducir el t\xedtulo de la Gr\xe1fica","Click to enter X axis title":"Introducir el t\xedtulo del eje X","Click to enter Y axis title":"Introducir el t\xedtulo del eje Y","Click to enter radial axis title":"Introducir el t\xedtulo del eje radial","Compare data on hover":"Comparar datos al pasar por encima","Double-click on legend to isolate one trace":"Haga doble-clic en la leyenda para aislar una traza","Double-click to zoom back out":"Haga doble-clic para restaurar la escala","Download plot as a png":"Descargar gr\xe1fica como png","Download plot":"Descargar gr\xe1fica","Edit in Chart Studio":"Editar en Chart Studio","IE only supports svg. Changing format to svg.":"IE solo soporta svg. Cambiando formato a svg.","Lasso Select":"Seleccionar con lazo","Orbital rotation":"Rotaci\xf3n esf\xe9rica",Pan:"Modo Panor\xe1mica","Produced with Plotly.js":"Hecho con Plotly.js",Reset:"Reiniciar","Reset axes":"Reiniciar ejes","Reset camera to default":"Restaurar c\xe1mara predeterminada","Reset camera to last save":"Restaurar anterior c\xe1mara","Reset view":"Restaurar vista","Reset views":"Restaurar vistas","Show closest data on hover":"Mostrar el dato m\xe1s cercano al pasar por encima","Snapshot succeeded":"La captura de la instant\xe1nea finaliz\xf3 correctamente","Sorry, there was a problem downloading your snapshot!":"\xa1La descarga de la instant\xe1nea fall\xf3!","Taking snapshot - this may take a few seconds":"Capturando una instant\xe1nea - podr\xeda tardar unos segundos","Toggle Spike Lines":"Mostrar/Ocultar Gu\xedas","Toggle show closest data on hover":"Activar/Desactivar mostrar el dato m\xe1s cercano al pasar por encima","Turntable rotation":"Rotaci\xf3n plana",Zoom:"Modo Ampliar/Reducir","Zoom in":"Ampliar","Zoom out":"Reducir","close:":"cierre:","high:":"alza:","incoming flow count:":"flujo de entrada:","kde:":"edp:","lat:":"lat:","lon:":"lon:","low:":"baja:","lower fence:":"l\xedmite inferior:","max:":"m\xe1x:","mean \xb1 \u03c3:":"media \xb1 \u03c3:","mean:":"media:","median:":"mediana:","min:":"m\xedn:","new text":"nuevo texto","open:":"apertura:","outgoing flow count:":"flujo de salida:","q1:":"q1:","q3:":"q3:","source:":"fuente:","target:":"destino:",trace:"traza","upper fence:":"l\xedmite superior:"},format:{days:["Domingo","Lunes","Martes","Mi\xe9rcoles","Jueves","Viernes","S\xe1bado"],shortDays:["Dom","Lun","Mar","Mi\xe9","Jue","Vie","S\xe1b"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],shortMonths:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],date:"%d/%m/%Y",decimal:",",thousands:" "}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"fi",dictionary:{Autoscale:"Autoskaalaa","Box Select":"Laatikkovalinta","Click to enter Colorscale title":"Klikkaa antaaksesi v\xe4riskaalan otsikko","Click to enter Component A title":"Klikkaa antaaksesi komponentin A otsikko","Click to enter Component B title":"Klikkaa antaaksesi komponentin B otsikko","Click to enter Component C title":"Klikkaa antaaksesi komponentin C otsikko","Click to enter Plot title":"Klikkaa antaaksesi kuvion otsikko","Click to enter X axis title":"Klikkaa antaaksesi x-akselin otsikko","Click to enter Y axis title":"Klikkaa antaaksesi y-akselin otsikko","Click to enter radial axis title":"Klikkaa antaaksesi radiaalisen akselin otsikko","Compare data on hover":"Vertaa dataa kursorilla","Double-click on legend to isolate one trace":"Kaksoisklikkaa selitett\xe4 erist\xe4\xe4ksesi yksi sarja","Double-click to zoom back out":"Kaksoisklikkaa zoomataksesi ulos","Download plot":"Lataa kuvio","Download plot as png":"Lataa kuvio png-muodossa","Edit in Chart Studio":"Muokkaa Chart Studiossa","IE only supports svg. Changing format to svg.":"Formaatiksi vaihdetaan IE:n tukema svg.","Lasso Select":"Lassovalinta","Orbital rotation":"Orbitaalikierto",Pan:"Panorointi","Produced with Plotly.js":"Tuotettu Plotly.jsll\xe4",Reset:"Palauta oletusasetukset","Reset axes":"Palauta akselien oletusasetukset","Reset camera to default":"Palauta kameran oletusasetukset","Reset camera to last save":"Palauta kameran viimeksi tallennetut asetukset","Reset view":"Palauta n\xe4kym\xe4n oletusasetukset","Reset views":"Palauta n\xe4kymien oletusasetukset","Show closest data on hover":"N\xe4yt\xe4 kursoria l\xe4hin data","Snapshot succeeded":"Tilannekuvan ottaminen onnistui","Sorry, there was a problem downloading your snapshot!":"Pahoittelut, tilannekuvan lataaminen ep\xe4onnistui!","Taking snapshot - this may take a few seconds":"Otetaan tilannekuvaa - odota hetki","Toggle Spike Lines":"N\xe4yt\xe4 huiput","Toggle show closest data on hover":"N\xe4yt\xe4 kursoria l\xe4hin data","Turntable rotation":"Tasokierto",Zoom:"Zoomaus","Zoom in":"Zoomaa sis\xe4\xe4n","Zoom out":"Zoomaa ulos","close:":"loppu:","high:":"korkein:","incoming flow count:":"saapuva virtaus:","kde:":"ydinestimointi:","lat:":"lat.:","lon:":"lon.:","low:":"matalin:","lower fence:":"alempi raja:","max:":"maks.:","mean \xb1 \u03c3:":"keskiarvo \xb1 \u03c3:","mean:":"keskiarvo:","median:":"mediaani:","min:":"min.:","new text":"uusi teksti","open:":"alku:","outgoing flow count:":"l\xe4htev\xe4 virtaus:","q1:":"q1:","q3:":"q3:","source:":"l\xe4hde:","target:":"kohde:",trace:"sarja","upper fence:":"ylempi raja:"},format:{days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],shortDays:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kes\xe4kuu","hein\xe4kuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],shortMonths:["tammi","helmi","maalis","huhti","touko","kes\xe4","hein\xe4","elo","syys","loka","marras","joulu"],date:"%d.%m.%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"fr",dictionary:{Autoscale:"\xc9chelle automatique","Box Select":"S\xe9lection rectangulaire","Click to enter Colorscale title":"Ajouter un titre \xe0 l'\xe9chelle de couleurs","Click to enter Component A title":"Ajouter un titre \xe0 la composante A","Click to enter Component B title":"Ajouter un titre \xe0 la composante B","Click to enter Component C title":"Ajouter un titre \xe0 la composante C","Click to enter Plot title":"Ajouter un titre au graphique","Click to enter X axis title":"Ajouter un titre \xe0 l'axe des x","Click to enter Y axis title":"Ajouter un titre \xe0 l'axe des y","Click to enter radial axis title":"Ajouter un titre \xe0 l'axe radial","Compare data on hover":"Comparaison entre donn\xe9es en survol","Double-click on legend to isolate one trace":"Double-cliquer sur la l\xe9gende pour isoler une s\xe9rie","Double-click to zoom back out":"Double-cliquer pour d\xe9zoomer","Download plot as a png":"T\xe9l\xe9charger le graphique en fichier PNG","Download plot":"T\xe9l\xe9charger le graphique","Edit in Chart Studio":"\xc9diter le graphique sur Chart Studio","IE only supports svg. Changing format to svg.":"IE ne permet que les conversions en SVG. Conversion en SVG en cours.","Lasso Select":"S\xe9lection lasso","Orbital rotation":"Rotation orbitale",Pan:"Translation","Produced with Plotly.js":"G\xe9n\xe9r\xe9 avec Plotly.js",Reset:"R\xe9initialiser","Reset axes":"R\xe9initialiser les axes","Reset camera to default":"R\xe9gler la cam\xe9ra \xe0 sa valeur d\xe9faut","Reset camera to last save":"R\xe9gler la cam\xe9ra \xe0 sa valeur sauvegard\xe9e","Reset view":"R\xe9initialiser","Reset views":"R\xe9initialiser","Show closest data on hover":"Donn\xe9es les plus proches en survol","Snapshot succeeded":"Conversion r\xe9ussie","Sorry, there was a problem downloading your snapshot!":"D\xe9sol\xe9, un probl\xe8me est survenu lors du t\xe9l\xe9chargement de votre graphique","Taking snapshot - this may take a few seconds":"Conversion en cours, ceci peut prendre quelques secondes",Zoom:"Zoom","Zoom in":"Zoom int\xe9rieur","Zoom out":"Zoom ext\xe9rieur","close:":"fermeture :",trace:"s\xe9rie","lat:":"lat. :","lon:":"lon. :","q1:":"q1 :","q3:":"q3 :","source:":"source :","target:":"embouchure :","lower fence:":"cl\xf4ture sup\xe9rieure :","upper fence:":"cl\xf4ture inf\xe9rieure :","max:":"max. :","mean \xb1 \u03c3:":"moyenne \xb1 \u03c3 :","mean:":"moyenne :","median:":"m\xe9diane :","min:":"min. :","new text":"nouveau texte","Turntable rotation":"Rotation planaire","Toggle Spike Lines":"Activer/d\xe9sactiver les pics","open:":"ouverture :","high:":"haut :","low:":"bas :","Toggle show closest data on hover":"Activer/d\xe9sactiver le survol","incoming flow count:":"flux entrant :","outgoing flow count:":"flux sortant :","kde:":"est. par noyau :"},format:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],shortDays:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Janvier","F\xe9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xfbt","Septembre","Octobre","Novembre","D\xe9cembre"],shortMonths:["Jan","F\xe9v","Mar","Avr","Mai","Jun","Jul","Ao\xfb","Sep","Oct","Nov","D\xe9c"],date:"%d/%m/%Y",decimal:",",thousands:" ",year:"%Y",month:"%b %Y",dayMonth:"%-d %b",dayMonthYear:"%-d %b %Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"it",dictionary:{Autoscale:"Scala automaticamente","Box Select":"Selezione box","Click to enter Colorscale title":"Clicca per inserire un titolo alla scala di colori","Click to enter Component A title":"Clicca per inserire un titolo al componente A","Click to enter Component B title":"Clicca per inserire un titolo al componente B","Click to enter Component C title":"Clicca per inserire un titolo al componente C","Click to enter Plot title":"Clicca per inserire un titolo al grafico","Click to enter X axis title":"Clicca per inserire un titolo all'asse X","Click to enter Y axis title":"Clicca per inserire un titolo all'asse Y","Click to enter radial axis title":"Clicca per inserire un titolo per l' asse radiale","Compare data on hover":"Paragona i dati al passaggio del mouse","Double-click on legend to isolate one trace":"Doppio click per isolare i dati di una traccia","Double-click to zoom back out":"Doppio click per tornare allo zoom iniziale","Download plot as a png":"Scarica il grafico come immagine png","Download plot":"Scarica il grafico","Edit in Chart Studio":"Modifica in Chart Studio","IE only supports svg. Changing format to svg.":"IE supporta solo svg. Modifica formato in svg.","Lasso Select":"Selezione lazo","Orbital rotation":"Rotazione orbitale",Pan:"Sposta","Produced with Plotly.js":"Creato con Plotly.js",Reset:"Reset","Reset axes":"Resetta gli assi","Reset camera to default":"Reimposta la camera ai valori predefiniti","Reset camera to last save":"Reimposta la camera all' ultimo salvataggio","Reset view":"Reimposta la vista","Reset views":"Reimposta le viste","Show closest data on hover":"Mostra i dati pi\xf9 vicini al passaggio del mouse","Snapshot succeeded":"Screenshot creato con successo","Sorry, there was a problem downloading your snapshot!":"Si \xe8 verificato un errore durante la creazione dello screenshot","Taking snapshot - this may take a few seconds":"Creazione screenshot - potrebbe richiedere qualche secondo",Zoom:"Zoom","Zoom in":"Ingrandisci","Zoom out":"Rimpicciolisci","close:":"chiudi:",trace:"traccia","lat:":"lat.:","lon:":"lon.:","q1:":"q1:","q3:":"q3:","source:":"sorgente:","target:":"target:","max:":"max.:","mean \xb1 \u03c3:":"media \xb1 \u03c3:","mean:":"media:","median:":"mediana:","min:":"min.:","new text:":"Nuovo testo:","upper fence:":"limite superiore:","lower fence:":"limite inferiore:","Turntable rotation":"Rotazione piattaforma","Toggle Spike Lines":"Abilita linee di identificazione","open:":"apri:","high:":"alto:","kde:":"kde:","low:":"basso:","incoming flow count:":"Flusso in entrata:","outgoing flow count:":"Flusso in uscita:","Toggle show closest data on hover":"Abilita mostra i dati pi\xf9 vicini al passaggio del mouse"},format:{days:["Domenica","Luned\xec","Marted\xec","Mercoled\xec","Gioved\xec","Venerd\xec","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],date:"%d/%m/%Y",decimal:",",thousands:"."}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); var locale={moduleType:"locale",name:"nl",dictionary:{},format:{days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],shortDays:["zon","maa","din","woe","don","vri","zat"],months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],shortMonths:["jan","feb","maa","apr","mei","jun","jul","aug","sep","okt","nov","dec"],date:"%d-%m-%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); var locale={moduleType:"locale",name:"pl",dictionary:{},format:{days:["Niedziela","Poniedzia\u0142ek","Wtorek","\u015aroda","Czwartek","Pi\u0105tek","Sobota"],shortDays:["Nie","Pn","Wt","\u015ar","Czw","Pt","So"],months:["Stycze\u0144","Luty","Marzec","Kwiecie\u0144","Maj","Czerwiec","Lipiec","Sierpie\u0144","Wrzesie\u0144","Pa\u017adziernik","Listopad","Grudzie\u0144"],shortMonths:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"pt-BR",dictionary:{Autoscale:"Escala autom\xe1tica","Box Select":"Sele\xe7\xe3o retangular","Click to enter Colorscale title":"Clique para editar o t\xedtulo da escala de cor","Click to enter Component A title":"Clique para editar o t\xedtulo do Componente A","Click to enter Component B title":"Clique para editar o t\xedtulo do Componente B","Click to enter Component C title":"Clique para editar o t\xedtulo do Componente C","Click to enter Plot title":"Clique para editar o t\xedtulo do Gr\xe1fico","Click to enter X axis title":"Clique para editar o t\xedtulo do eixo X","Click to enter Y axis title":"Clique para editar o t\xedtulo do eixo Y","Click to enter radial axis title":"Clique para editar o t\xedtulo do eixo radial","Compare data on hover":"Comparar dados ao pairar","Double-click on legend to isolate one trace":"Duplo clique na legenda para isolar uma s\xe9rie","Double-click to zoom back out":"Duplo clique para reverter zoom","Download plot as a png":"Fazer download do gr\xe1fico como imagem (png)","Download plot":"Fazer download do gr\xe1fico","Edit in Chart Studio":"Editar no Chart Studio","IE only supports svg. Changing format to svg.":"IE suporta apenas svg. Alterando formato para svg","Lasso Select":"Sele\xe7\xe3o de la\xe7o","Orbital rotation":"Rota\xe7\xe3o orbital",Pan:"Mover","Produced with Plotly":"Criado com o Plotly",Reset:"Restaurar","Reset axes":"Restaurar eixos","Reset camera to default":"Restaurar c\xe2mera para padr\xe3o","Reset camera to last save":"Restaurar c\xe2mera para \xfaltima salva","Reset view":"Restaurar vis\xe3o","Reset views":"Restaurar vis\xf5es","Show closest data on hover":"Exibir dado mais pr\xf3ximo ao pairar","Snapshot succeeded":"Captura instant\xe2nea completa","Sorry, there was a problem downloading your snapshot!":"Desculpe, houve um problema no download de sua captura instant\xe2nea!","Taking snapshot - this may take a few seconds":"Efetuando captura instant\xe2nea - isso pode levar alguns instantes","Toggle Spike Lines":"Habilitar/desabilitar triangula\xe7\xe3o de linhas","Toggle show closest data on hover":"Habilitar/desabilitar exibi\xe7\xe3o de dado mais pr\xf3ximo ao pairar","Turntable rotation":"Rota\xe7\xe3o de mesa",Zoom:"Zoom","Zoom in":"Ampliar zoom","Zoom out":"Reduzir zoom",close:"fechamento",high:"alta","incoming flow count":"contagem de fluxo de entrada",kde:"kde",lat:"latitude",lon:"longitude",low:"baixa","lower fence":"limite inferior",max:"m\xe1ximo","mean \xb1 \u03c3":"m\xe9dia \xb1 \u03c3",mean:"m\xe9dia",median:"mediana",min:"m\xednimo","new text":"novo texto",open:"abertura","outgoing flow count":"contagem de fluxo de sa\xedda",q1:"q1",q3:"q3",source:"origem",target:"destino",trace:"s\xe9rie","upper fence":"limite superior"},format:{days:["Domingo","Segunda-feira","Ter\xe7a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"pt-PT",dictionary:{Autoscale:"Escala autom\xe1tica","Box Select":"Sele\xe7\xe3o retangular","Click to enter Colorscale title":"Clique para editar o t\xedtulo da escala de cor","Click to enter Component A title":"Clique para editar o t\xedtulo do Componente A","Click to enter Component B title":"Clique para editar o t\xedtulo do Componente B","Click to enter Component C title":"Clique para editar o t\xedtulo do Componente C","Click to enter Plot title":"Clique para editar o t\xedtulo do Gr\xe1fico","Click to enter X axis title":"Clique para editar o t\xedtulo do eixo X","Click to enter Y axis title":"Clique para editar o t\xedtulo do eixo Y","Click to enter radial axis title":"Clique para editar o t\xedtulo do eixo radial","Compare data on hover":"Comparar dados ao pairar","Double-click on legend to isolate one trace":"Duplo clique na legenda para isolar uma s\xe9rie","Double-click to zoom back out":"Duplo clique para reverter amplia\xe7\xe3o","Download plot as a png":"Baixar gr\xe1fico como imagem (png)","Download plot":"Baixar gr\xe1fico","Edit in Chart Studio":"Editar no Chart Studio","IE only supports svg. Changing format to svg.":"IE suporta apenas svg. Alterando formato para svg","Lasso Select":"Sele\xe7\xe3o de la\xe7o","Orbital rotation":"Rota\xe7\xe3o orbital",Pan:"Mover","Produced with Plotly":"Criado com Plotly",Reset:"Restaurar","Reset axes":"Restaurar eixos","Reset camera to default":"Restaurar c\xe2mera para padr\xe3o","Reset camera to last save":"Restaurar c\xe2mera para \xfaltima grava\xe7\xe3o","Reset view":"Restaurar vista","Reset views":"Restaurar vistas","Show closest data on hover":"Exibir dado mais pr\xf3ximo ao pairar","Snapshot succeeded":"Captura instant\xe2nea com sucesso","Sorry, there was a problem downloading your snapshot!":"Desculpe, houve um problema no download de sua captura instant\xe2nea!","Taking snapshot - this may take a few seconds":"Efetuando captura instant\xe2nea - isso pode demorar alguns segundos","Toggle Spike Lines":"Habilitar/desabilitar triangula\xe7\xe3o de linhas","Toggle show closest data on hover":"Habilitar/desabilitar exibi\xe7\xe3o de dado mais pr\xf3ximo ao pairar","Turntable rotation":"Rodar",Zoom:"Ampliar","Zoom in":"Aumentar Amplia\xe7\xe3o","Zoom out":"Reduzir Amplia\xe7\xe3o",close:"fechar",high:"alta","incoming flow count":"contagem de fluxo de entrada",kde:"kde",lat:"latitude",lon:"longitude",low:"baixa","lower fence":"limite inferior",max:"m\xe1ximo","mean \xb1 \u03c3":"m\xe9dia \xb1 \u03c3",mean:"m\xe9dia",median:"mediana",min:"m\xednimo","new text":"novo texto",open:"abrir","outgoing flow count":"contagem de fluxo de sa\xedda",q1:"q1",q3:"q3",source:"origem",target:"destino",trace:"s\xe9rie","upper fence":"limite superior"},format:{days:["domingo","segunda-feira","ter\xe7a-feira","quarta-feira","quinta-feira","sexta-feira","s\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"sv",dictionary:{Autoscale:"Autoskala","Box Select":"V\xe4lj rektangel","Click to enter Colorscale title":"Klicka f\xf6r att ange titel p\xe5 f\xe4rgskala","Click to enter Component A title":"Klicka f\xf6r att ange titel p\xe5 komponent A","Click to enter Component B title":"Klicka f\xf6r att ange titel p\xe5 komponent B","Click to enter Component C title":"Klicka f\xf6r att ange titel p\xe5 komponent C","Click to enter Plot title":"Klicka f\xf6r att ange titel p\xe5 diagram","Click to enter X axis title":"Klicka f\xf6r att ange titel p\xe5 x-axel","Click to enter Y axis title":"Klicka f\xf6r att ange titel p\xe5 y-axel","Click to enter radial axis title":"Klicka f\xf6r att ange titel p\xe5 radiell axel","Compare data on hover":"J\xe4mf\xf6r data n\xe4r muspekaren h\xe5lls \xf6ver","Double-click on legend to isolate one trace":"Dubbelklicka p\xe5 f\xf6rklaringen f\xf6r att visa endast en serie","Double-click to zoom back out":"Dubbelklicka f\xf6r att zooma ut igen","Download plot":"Ladda ner diagram","Download plot as a png":"Ladda ner diagram som png","Edit in Chart Studio":"Editera i Chart Studio","IE only supports svg. Changing format to svg.":"IE st\xf6der enbart svg. Byter format till svg.","Lasso Select":"V\xe4lj lasso","Orbital rotation":"Orbital rotation",Pan:"Panorera","Produced with Plotly":"Skapad med Plotly",Reset:"\xc5terst\xe4ll","Reset axes":"\xc5terst\xe4ll axlar","Reset camera to default":"\xc5terst\xe4ll kamera till standard","Reset camera to last save":"\xc5terst\xe4ll kamera till senast sparad","Reset view":"\xc5terst\xe4ll vy","Reset views":"\xc5terst\xe4ll vyer","Show closest data on hover":"Visa n\xe4rmaste v\xe4rde n\xe4r muspekaren h\xe5lls \xf6ver","Snapshot succeeded":"Bild skapad","Sorry, there was a problem downloading your snapshot!":"Tyv\xe4rr gick n\xe5got fel vid nedladdning av bild","Taking snapshot - this may take a few seconds":"Skapar bild - detta kan ta n\xe5gra sekunder","Toggle Spike Lines":"Aktivera/Inaktivera topplinjer","Toggle show closest data on hover":"Aktivera/Inaktivera visa n\xe4rmaste v\xe4rde n\xe4r muspekaren h\xe5lls \xf6ver","Turntable rotation":"Platt rotation",Zoom:"Zooma","Zoom in":"Zooma in","Zoom out":"Zooma ut","close:":"st\xe4ngning:","concentration:":"koncentration:","high:":"h\xf6g:","incoming flow count:":"inkommande fl\xf6de summering:","kde:":"kde:","lat:":"lat:","lon:":"lon:","low:":"l\xe5g:","lower fence:":"undre gr\xe4ns:","max:":"max:","mean \xb1 \u03c3:":"medel \xb1 \u03c3:","mean:":"medel:","median:":"median:","min:":"min:","new text":"ny text","open:":"\xf6ppning:","outgoing flow count:":"utg\xe5ende fl\xf6de summering:","q1:":"q1:","q3:":"q3:","source:":"k\xe4lla:","target:":"m\xe5l:",trace:"serie","upper fence:":"\xf6vre gr\xe4ns:"},format:{days:["S\xf6ndag","M\xe5ndag","Tisdag","Onsdag","Torsdag","Fredag","L\xf6rdag"],shortDays:["S\xf6n","M\xe5n","Tis","Ons","Tor","Fre","L\xf6r"],months:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"pt-BR",dictionary:{Autoscale:"Escala autom\xe1tica","Box Select":"Sele\xe7\xe3o retangular","Click to enter Colorscale title":"Clique para editar o t\xedtulo da escala de cor","Click to enter Component A title":"Clique para editar o t\xedtulo do Componente A","Click to enter Component B title":"Clique para editar o t\xedtulo do Componente B","Click to enter Component C title":"Clique para editar o t\xedtulo do Componente C","Click to enter Plot title":"Clique para editar o t\xedtulo do Gr\xe1fico","Click to enter X axis title":"Clique para editar o t\xedtulo do eixo X","Click to enter Y axis title":"Clique para editar o t\xedtulo do eixo Y","Click to enter radial axis title":"Clique para editar o t\xedtulo do eixo radial","Compare data on hover":"Comparar dados ao pairar","Double-click on legend to isolate one trace":"Duplo clique na legenda para isolar uma s\xe9rie","Double-click to zoom back out":"Duplo clique para reverter zoom","Download plot as a png":"Fazer download do gr\xe1fico como imagem (png)","Download plot":"Fazer download do gr\xe1fico","Edit in Chart Studio":"Editar no Chart Studio","IE only supports svg. Changing format to svg.":"IE suporta apenas svg. Alterando formato para svg","Lasso Select":"Sele\xe7\xe3o de la\xe7o","Orbital rotation":"Rota\xe7\xe3o orbital",Pan:"Mover","Produced with Plotly.js":"Criado com o Plotly.js",Reset:"Restaurar","Reset axes":"Restaurar eixos","Reset camera to default":"Restaurar c\xe2mera para padr\xe3o","Reset camera to last save":"Restaurar c\xe2mera para \xfaltima salva","Reset view":"Restaurar vis\xe3o","Reset views":"Restaurar vis\xf5es","Show closest data on hover":"Exibir dado mais pr\xf3ximo ao pairar","Snapshot succeeded":"Captura instant\xe2nea completa","Sorry, there was a problem downloading your snapshot!":"Desculpe, houve um problema no download de sua captura instant\xe2nea!","Taking snapshot - this may take a few seconds":"Efetuando captura instant\xe2nea - isso pode levar alguns instantes","Toggle Spike Lines":"Habilitar/desabilitar triangula\xe7\xe3o de linhas","Toggle show closest data on hover":"Habilitar/desabilitar exibi\xe7\xe3o de dado mais pr\xf3ximo ao pairar","Turntable rotation":"Rota\xe7\xe3o de mesa",Zoom:"Zoom","Zoom in":"Ampliar zoom","Zoom out":"Reduzir zoom",close:"fechamento",high:"alta","incoming flow count":"contagem de fluxo de entrada",kde:"kde",lat:"latitude",lon:"longitude",low:"baixa","lower fence":"limite inferior",max:"m\xe1ximo","mean \xb1 \u03c3":"m\xe9dia \xb1 \u03c3",mean:"m\xe9dia",median:"mediana",min:"m\xednimo","new text":"novo texto",open:"abertura","outgoing flow count":"contagem de fluxo de sa\xedda",q1:"q1",q3:"q3",source:"origem",target:"destino",trace:"s\xe9rie","upper fence":"limite superior"},format:{days:["Domingo","Segunda-feira","Ter\xe7a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"pt-PT",dictionary:{Autoscale:"Escala autom\xe1tica","Box Select":"Sele\xe7\xe3o retangular","Click to enter Colorscale title":"Clique para editar o t\xedtulo da escala de cor","Click to enter Component A title":"Clique para editar o t\xedtulo do Componente A","Click to enter Component B title":"Clique para editar o t\xedtulo do Componente B","Click to enter Component C title":"Clique para editar o t\xedtulo do Componente C","Click to enter Plot title":"Clique para editar o t\xedtulo do Gr\xe1fico","Click to enter X axis title":"Clique para editar o t\xedtulo do eixo X","Click to enter Y axis title":"Clique para editar o t\xedtulo do eixo Y","Click to enter radial axis title":"Clique para editar o t\xedtulo do eixo radial","Compare data on hover":"Comparar dados ao pairar","Double-click on legend to isolate one trace":"Duplo clique na legenda para isolar uma s\xe9rie","Double-click to zoom back out":"Duplo clique para reverter amplia\xe7\xe3o","Download plot as a png":"Baixar gr\xe1fico como imagem (png)","Download plot":"Baixar gr\xe1fico","Edit in Chart Studio":"Editar no Chart Studio","IE only supports svg. Changing format to svg.":"IE suporta apenas svg. Alterando formato para svg","Lasso Select":"Sele\xe7\xe3o de la\xe7o","Orbital rotation":"Rota\xe7\xe3o orbital",Pan:"Mover","Produced with Plotly.js":"Criado com Plotly.js",Reset:"Restaurar","Reset axes":"Restaurar eixos","Reset camera to default":"Restaurar c\xe2mera para padr\xe3o","Reset camera to last save":"Restaurar c\xe2mera para \xfaltima grava\xe7\xe3o","Reset view":"Restaurar vista","Reset views":"Restaurar vistas","Show closest data on hover":"Exibir dado mais pr\xf3ximo ao pairar","Snapshot succeeded":"Captura instant\xe2nea com sucesso","Sorry, there was a problem downloading your snapshot!":"Desculpe, houve um problema no download de sua captura instant\xe2nea!","Taking snapshot - this may take a few seconds":"Efetuando captura instant\xe2nea - isso pode demorar alguns segundos","Toggle Spike Lines":"Habilitar/desabilitar triangula\xe7\xe3o de linhas","Toggle show closest data on hover":"Habilitar/desabilitar exibi\xe7\xe3o de dado mais pr\xf3ximo ao pairar","Turntable rotation":"Rodar",Zoom:"Ampliar","Zoom in":"Aumentar Amplia\xe7\xe3o","Zoom out":"Reduzir Amplia\xe7\xe3o",close:"fechar",high:"alta","incoming flow count":"contagem de fluxo de entrada",kde:"kde",lat:"latitude",lon:"longitude",low:"baixa","lower fence":"limite inferior",max:"m\xe1ximo","mean \xb1 \u03c3":"m\xe9dia \xb1 \u03c3",mean:"m\xe9dia",median:"mediana",min:"m\xednimo","new text":"novo texto",open:"abrir","outgoing flow count":"contagem de fluxo de sa\xedda",q1:"q1",q3:"q3",source:"origem",target:"destino",trace:"s\xe9rie","upper fence":"limite superior"},format:{days:["domingo","segunda-feira","ter\xe7a-feira","quarta-feira","quinta-feira","sexta-feira","s\xe1bado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","S\xe1b"],months:["Janeiro","Fevereiro","Mar\xe7o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],date:"%d/%m/%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"sv",dictionary:{Autoscale:"Autoskala","Box Select":"V\xe4lj rektangel","Click to enter Colorscale title":"Klicka f\xf6r att ange titel p\xe5 f\xe4rgskala","Click to enter Component A title":"Klicka f\xf6r att ange titel p\xe5 komponent A","Click to enter Component B title":"Klicka f\xf6r att ange titel p\xe5 komponent B","Click to enter Component C title":"Klicka f\xf6r att ange titel p\xe5 komponent C","Click to enter Plot title":"Klicka f\xf6r att ange titel p\xe5 diagram","Click to enter X axis title":"Klicka f\xf6r att ange titel p\xe5 x-axel","Click to enter Y axis title":"Klicka f\xf6r att ange titel p\xe5 y-axel","Click to enter radial axis title":"Klicka f\xf6r att ange titel p\xe5 radiell axel","Compare data on hover":"J\xe4mf\xf6r data n\xe4r muspekaren h\xe5lls \xf6ver","Double-click on legend to isolate one trace":"Dubbelklicka p\xe5 f\xf6rklaringen f\xf6r att visa endast en serie","Double-click to zoom back out":"Dubbelklicka f\xf6r att zooma ut igen","Download plot":"Ladda ner diagram","Download plot as a png":"Ladda ner diagram som png","Edit in Chart Studio":"Editera i Chart Studio","IE only supports svg. Changing format to svg.":"IE st\xf6der enbart svg. Byter format till svg.","Lasso Select":"V\xe4lj lasso","Orbital rotation":"Orbital rotation",Pan:"Panorera","Produced with Plotly.js":"Skapad med Plotly.js",Reset:"\xc5terst\xe4ll","Reset axes":"\xc5terst\xe4ll axlar","Reset camera to default":"\xc5terst\xe4ll kamera till standard","Reset camera to last save":"\xc5terst\xe4ll kamera till senast sparad","Reset view":"\xc5terst\xe4ll vy","Reset views":"\xc5terst\xe4ll vyer","Show closest data on hover":"Visa n\xe4rmaste v\xe4rde n\xe4r muspekaren h\xe5lls \xf6ver","Snapshot succeeded":"Bild skapad","Sorry, there was a problem downloading your snapshot!":"Tyv\xe4rr gick n\xe5got fel vid nedladdning av bild","Taking snapshot - this may take a few seconds":"Skapar bild - detta kan ta n\xe5gra sekunder","Toggle Spike Lines":"Aktivera/Inaktivera topplinjer","Toggle show closest data on hover":"Aktivera/Inaktivera visa n\xe4rmaste v\xe4rde n\xe4r muspekaren h\xe5lls \xf6ver","Turntable rotation":"Platt rotation",Zoom:"Zooma","Zoom in":"Zooma in","Zoom out":"Zooma ut","close:":"st\xe4ngning:","concentration:":"koncentration:","high:":"h\xf6g:","incoming flow count:":"inkommande fl\xf6de summering:","kde:":"kde:","lat:":"lat:","lon:":"lon:","low:":"l\xe5g:","lower fence:":"undre gr\xe4ns:","max:":"max:","mean \xb1 \u03c3:":"medel \xb1 \u03c3:","mean:":"medel:","median:":"median:","min:":"min:","new text":"ny text","open:":"\xf6ppning:","outgoing flow count:":"utg\xe5ende fl\xf6de summering:","q1:":"q1:","q3:":"q3:","source:":"k\xe4lla:","target:":"m\xe5l:",trace:"serie","upper fence:":"\xf6vre gr\xe4ns:"},format:{days:["S\xf6ndag","M\xe5ndag","Tisdag","Onsdag","Torsdag","Fredag","L\xf6rdag"],shortDays:["S\xf6n","M\xe5n","Tis","Ons","Tor","Fre","L\xf6r"],months:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],shortMonths:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); var locale={moduleType:"locale",name:"tr",dictionary:{},format:{days:["Pazar","Pazartesi","Sal\u0131","\xc7ar\u015famba","Per\u015fembe","Cuma","Cumartesi"],shortDays:["Pz","Pt","Sa","\xc7a","Pe","Cu","Ct"],months:["Ocak","\u015eubat","Mart","Nisan","May\u0131s","Haziran","Temmuz","A\u011fustos","Eyl\xfcl","Ekim","Kas\u0131m","Aral\u0131k"],shortMonths:["Oca","\u015eub","Mar","Nis","May","Haz","Tem","A\u011fu","Eyl","Eki","Kas","Ara"],date:"%d.%m.%Y"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"uk",dictionary:{Autoscale:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0448\u043a\u0430\u043b\u044e\u0432\u0430\u043d\u043d\u044f","Box Select":"\u0412\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u043f\u0440\u044f\u043c\u043e\u043a\u0443\u0442\u043d\u043e\u0457 \u043e\u0431\u043b\u0430\u0441\u0442\u0456","Click to enter Colorscale title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u0448\u043a\u0430\u043b\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0443","Click to enter Component A title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 A","Click to enter Component B title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 B","Click to enter Component C title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 C","Click to enter Plot title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u0433\u0440\u0430\u0444\u0456\u043a\u0430","Click to enter X axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043e\u0441\u0456 X","Click to enter Y axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043e\u0441\u0456 Y","Click to enter radial axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0457 \u043e\u0441\u0456","Compare data on hover":"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456 \u043f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u043d\u0456","Double-click on legend to isolate one trace":"\u0414\u0432\u0456\u0447\u0456 \u043a\u043b\u0430\u0446\u043d\u0456\u0442\u044c \u043f\u043e \u043b\u0435\u0433\u0435\u043d\u0434\u0456 \u0434\u043b\u044f \u0432\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0434\u0430\u043d\u0438\u0445","Double-click to zoom back out":"\u0414\u043b\u044f \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c \u0434\u0432\u0456\u0447\u0456 \u043a\u043b\u0430\u0446\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e","Download plot":"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0433\u0440\u0430\u0444\u0456\u043a","Download plot as a png":"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0456 PNG","Edit in Chart Studio":"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0443 Chart Studio","IE only supports svg. Changing format to svg.":"IE \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u0454 \u043b\u0438\u0448\u0435 svg. \u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u043c\u0456\u043d\u044e\u0454\u0442\u044c\u0441\u044f \u043d\u0430 svg.","Lasso Select":"\u041b\u0430\u0441\u043e","Orbital rotation":"\u0420\u0443\u0445 \u043f\u043e \u043e\u0440\u0431\u0456\u0442\u0456",Pan:"\u0417\u0441\u0443\u0432","Produced with Plotly":"\u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e Plotly",Reset:"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset axes":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043e\u0441\u044f\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset camera to default":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u0456 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset camera to last save":"\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u0443 \u0432 \u043e\u0441\u0442\u0430\u043d\u043d\u0456\u0439 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043d","Reset view":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset views":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Show closest data on hover":"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456 \u043f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0456 \u0434\u0430\u043d\u0456","Snapshot succeeded":"\u0417\u043d\u0456\u043c\u043e\u043a \u0443\u0441\u043f\u0456\u0448\u043d\u043e \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439","Sorry, there was a problem downloading your snapshot!":"\u041d\u0430 \u0436\u0430\u043b\u044c, \u0432\u0438\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u0456 \u0437\u043d\u0456\u043c\u043a\u0443","Taking snapshot - this may take a few seconds":"\u0421\u0442\u0432\u043e\u0440\u044e\u0454\u0442\u044c\u0441\u044f \u0437\u043d\u0456\u043c\u043e\u043a - \u0446\u0435 \u043c\u043e\u0436\u0435 \u0437\u0430\u0439\u043d\u044f\u0442\u0438 \u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434","Toggle Spike Lines":"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438/\u0432\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043b\u0456\u043d\u0456\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0456\u0439 \u0442\u043e\u0447\u043e\u043a","Toggle show closest data on hover":"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438/\u0432\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0438\u0445 \u0434\u0430\u043d\u0438\u0445 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456","Turntable rotation":"\u041e\u0431\u0435\u0440\u0442\u0430\u043d\u043d\u044f \u043d\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043d\u043e\u043c\u0443 \u0441\u0442\u043e\u043b\u0456",Zoom:"\u0417\u0443\u043c","Zoom in":"\u0417\u0431\u0456\u043b\u044c\u0448\u0438\u0442\u0438","Zoom out":"\u0417\u043c\u0435\u043d\u0448\u0438\u0442\u0438","close:":"\u0417\u0430\u043a\u0440\u0438\u0442\u0442\u044f:","concentration:":"\u041a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0456\u044f:","high:":"\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c:","incoming flow count:":"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0445\u0456\u0434\u043d\u0438\u0445 \u0437\u0432'\u044f\u0437\u043a\u0456\u0432:","kde:":"\u042f\u0434\u0440\u043e\u0432\u0430 \u043e\u0446\u0456\u043d\u043a\u0430 \u0433\u0443\u0441\u0442\u0438\u043d\u0438 \u0440\u043e\u0437\u043f\u043e\u0434\u0456\u043b\u0443:","lat:":"\u0428\u0438\u0440\u043e\u0442\u0430:","lon:":"\u0414\u043e\u0432\u0433\u043e\u0442\u0430:","low:":"\u041c\u0456\u043d\u0456\u043c\u0443\u043c:","lower fence:":"\u041d\u0438\u0436\u043d\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044f:","max:":"\u041c\u0430\u043a\u0441.:","mean \xb1 \u03c3:":"\u0421\u0435\u0440\u0435\u0434\u043d\u0454 \xb1 \u03c3:","mean:":"\u0421\u0435\u0440\u0435\u0434\u043d\u0454:","median:":"\u041c\u0435\u0434\u0456\u0430\u043d\u0430:","min:":"\u041c\u0456\u043d.:","new text":"\u041d\u043e\u0432\u0438\u0439 \u0442\u0435\u043a\u0441\u0442","open:":"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0442\u044f:","outgoing flow count:":"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0438\u0445\u0456\u0434\u043d\u0438\u0445 \u0437\u0432'\u044f\u0437\u043a\u0456\u0432:","q1:":"q1:","q3:":"q3:","source:":"\u0414\u0436\u0435\u0440\u0435\u043b\u043e:","target:":"\u0426\u0456\u043b\u044c:",trace:"\u0420\u044f\u0434","upper fence:":"\u0412\u0435\u0440\u0445\u043d\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044f:"},format:{days:["\u043d\u0435\u0434\u0456\u043b\u044f","\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a","\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a","\u0441\u0435\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440","\u043f'\u044f\u0442\u043d\u0438\u0446\u044f","\u0441\u0443\u0431\u043e\u0442\u0430"],shortDays:["\u043d\u0434","\u043f\u043d","\u0432\u0442","\u0441\u0440","\u0447\u0442","\u043f\u0442","\u0441\u0431"],months:["\u0421\u0456\u0447\u0435\u043d\u044c","\u041b\u044e\u0442\u0438\u0439","\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c","\u041a\u0432\u0456\u0442\u0435\u043d\u044c","\u0422\u0440\u0430\u0432\u0435\u043d\u044c","\u0427\u0435\u0440\u0432\u0435\u043d\u044c","\u041b\u0438\u043f\u0435\u043d\u044c","\u0421\u0435\u0440\u043f\u0435\u043d\u044c","\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c","\u0416\u043e\u0432\u0442\u0435\u043d\u044c","\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434","\u0413\u0440\u0443\u0434\u0435\u043d\u044c"],shortMonths:["\u0421\u0456\u0447.","\u041b\u044e\u0442.","\u0411\u0435\u0440\u0435\u0437.","\u041a\u0432\u0456\u0442.","\u0422\u0440\u0430\u0432.","\u0427\u0435\u0440\u0432.","\u041b\u0438\u043f.","\u0421\u0435\u0440\u043f.","\u0412\u0435\u0440\u0435\u0441.","\u0416\u043e\u0432\u0442.","\u041b\u0438\u0441\u0442\u043e\u043f.","\u0413\u0440\u0443\u0434."],date:"%d.%m.%Y",decimal:",",thousands:" "}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); -var locale={moduleType:"locale",name:"zh-CN",dictionary:{Autoscale:"\u81ea\u52a8\u7f29\u653e","Box Select":"\u77e9\u5f62\u6846\u9009","Click to enter Colorscale title":"\u70b9\u51fb\u8f93\u5165\u8272\u9636\u7684\u6807\u9898","Click to enter Component A title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6A\u7684\u6807\u9898","Click to enter Component B title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6B\u7684\u6807\u9898","Click to enter Component C title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6C\u7684\u6807\u9898","Click to enter Plot title":"\u70b9\u51fb\u8f93\u5165\u56fe\u8868\u7684\u6807\u9898","Click to enter X axis title":"\u70b9\u51fb\u8f93\u5165X\u8f74\u7684\u6807\u9898","Click to enter Y axis title":"\u70b9\u51fb\u8f93\u5165Y\u8f74\u7684\u6807\u9898","Compare data on hover":"\u60ac\u505c\u65f6\u6bd4\u8f83\u6570\u636e","Double-click on legend to isolate one trace":"\u53cc\u51fb\u56fe\u4f8b\u6765\u7a81\u663e\u5bf9\u5e94\u8f68\u8ff9","Double-click to zoom back out":"\u53cc\u51fb\u8fd4\u56de\u7f29\u5c0f\u663e\u793a","Download plot as a png":"\u4e0b\u8f7d\u56fe\u8868\u4e3aPNG\u683c\u5f0f","Download plot":"\u4e0b\u8f7d\u56fe\u8868","Edit in Chart Studio":"\u5728Chart Studio\u4e2d\u7f16\u8f91","IE only supports svg. Changing format to svg.":"IE\u53ea\u652f\u6301SVG\u3002\u8f6c\u6362\u683c\u5f0f\u4e3aSVG\u3002","Lasso Select":"\u5957\u7d22\u9009\u62e9","Orbital rotation":"\u8f68\u9053\u65cb\u8f6c",Pan:"\u5e73\u79fb","Produced with Plotly":"\u7531Plotly\u751f\u6210",Reset:"\u91cd\u7f6e","Reset axes":"\u91cd\u7f6e\u8f74","Reset camera to default":"\u91cd\u7f6e\u955c\u5934\u89c6\u89d2\u4e3a\u9ed8\u8ba4\u72b6\u6001","Reset camera to last save":"\u91cd\u7f6e\u955c\u5934\u89c6\u89d2\u4e3a\u4e0a\u6b21\u4fdd\u5b58\u72b6\u6001","Reset view":"\u91cd\u7f6e\u89c6\u56fe","Reset views":"\u91cd\u7f6e\u89c6\u56fe","Show closest data on hover":"\u60ac\u505c\u65f6\u663e\u793a\u6700\u8fd1\u7684\u6570\u636e","Snapshot succeeded":"\u751f\u6210\u5feb\u7167\u6210\u529f","Sorry, there was a problem downloading your snapshot!":"\u62b1\u6b49\uff0c\u4e0b\u8f7d\u5feb\u7167\u51fa\u73b0\u95ee\u9898\uff01","Taking snapshot - this may take a few seconds":"\u6b63\u5728\u751f\u6210\u5feb\u7167 - \u53ef\u80fd\u9700\u8981\u51e0\u79d2\u949f",Zoom:"\u7f29\u653e","Zoom in":"\u653e\u5927","Zoom out":"\u7f29\u5c0f","close:":"\u5173\u95ed:",trace:"\u8e2a\u8ff9:","lat:":"\u7eac\u5ea6:","lon:":"\u7ecf\u5ea6:","q1:":"\u7b2c\u4e00\u56db\u5206\u4f4d\u6570:","q3:":"\u7b2c\u4e09\u56db\u5206\u4f4d\u6570:","source:":"\u6e90:","target:":"\u76ee\u6807:","lower fence:":"\u5185\u4fa7\u680f(lower fence):","upper fence:":"\u5916\u4fa7\u680f(upper fence):","max:":"\u6700\u5927\u503c:","mean \xb1 \u03c3:":"\u5e73\u5747\u6570 \xb1 \u6807\u51c6\u5dee\u03c3:","mean:":"\u5e73\u5747\u6570:","median:":"\u4e2d\u4f4d\u6570:","min:":"\u6700\u5c0f\u503c:","Turntable rotation":"\u65cb\u8f6c\u8f6c\u76d8:","Toggle Spike Lines":"\u5207\u6362\u663e\u793a\u6570\u636e\u70b9\u8f85\u52a9\u7ebf(Spike Lines)","open:":"\u6253\u5f00:","high:":"\u9ad8:","low:":"\u4f4e:","Toggle show closest data on hover":"\u5207\u6362\u60ac\u505c\u65f6\u663e\u793a\u6700\u8fd1\u7684\u6570\u636e\u70b9","incoming flow count:":"\u6d41\u5165\u6570\u91cf:","outgoing flow count:":"\u6d41\u51fa\u6570\u91cf:","kde:":"kde:","Click to enter radial axis title":"\u70b9\u51fb\u8f93\u5165\u5f84\u5411\u8f74\u6807\u9898","new text":"\u65b0\u5efa\u6587\u672c"},format:{days:["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],shortDays:["\u5468\u65e5","\u5468\u4e00","\u5468\u4e8c","\u5468\u4e09","\u5468\u56db","\u5468\u4e94","\u5468\u516d"],months:["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],shortMonths:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); \ No newline at end of file +var locale={moduleType:"locale",name:"uk",dictionary:{Autoscale:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0448\u043a\u0430\u043b\u044e\u0432\u0430\u043d\u043d\u044f","Box Select":"\u0412\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u043f\u0440\u044f\u043c\u043e\u043a\u0443\u0442\u043d\u043e\u0457 \u043e\u0431\u043b\u0430\u0441\u0442\u0456","Click to enter Colorscale title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u0448\u043a\u0430\u043b\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0443","Click to enter Component A title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 A","Click to enter Component B title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 B","Click to enter Component C title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 C","Click to enter Plot title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u0433\u0440\u0430\u0444\u0456\u043a\u0430","Click to enter X axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043e\u0441\u0456 X","Click to enter Y axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043e\u0441\u0456 Y","Click to enter radial axis title":"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u043d\u0430\u0437\u0432\u0438 \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0457 \u043e\u0441\u0456","Compare data on hover":"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456 \u043f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u043d\u0456","Double-click on legend to isolate one trace":"\u0414\u0432\u0456\u0447\u0456 \u043a\u043b\u0430\u0446\u043d\u0456\u0442\u044c \u043f\u043e \u043b\u0435\u0433\u0435\u043d\u0434\u0456 \u0434\u043b\u044f \u0432\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0434\u0430\u043d\u0438\u0445","Double-click to zoom back out":"\u0414\u043b\u044f \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c \u0434\u0432\u0456\u0447\u0456 \u043a\u043b\u0430\u0446\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e","Download plot":"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0433\u0440\u0430\u0444\u0456\u043a","Download plot as a png":"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0456 PNG","Edit in Chart Studio":"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0443 Chart Studio","IE only supports svg. Changing format to svg.":"IE \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u0454 \u043b\u0438\u0448\u0435 svg. \u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u043c\u0456\u043d\u044e\u0454\u0442\u044c\u0441\u044f \u043d\u0430 svg.","Lasso Select":"\u041b\u0430\u0441\u043e","Orbital rotation":"\u0420\u0443\u0445 \u043f\u043e \u043e\u0440\u0431\u0456\u0442\u0456",Pan:"\u0417\u0441\u0443\u0432","Produced with Plotly.js":"\u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e Plotly.js",Reset:"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset axes":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043e\u0441\u044f\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset camera to default":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u0456 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset camera to last save":"\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u0443 \u0432 \u043e\u0441\u0442\u0430\u043d\u043d\u0456\u0439 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043d","Reset view":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Reset views":"\u0412\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c","Show closest data on hover":"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456 \u043f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0456 \u0434\u0430\u043d\u0456","Snapshot succeeded":"\u0417\u043d\u0456\u043c\u043e\u043a \u0443\u0441\u043f\u0456\u0448\u043d\u043e \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439","Sorry, there was a problem downloading your snapshot!":"\u041d\u0430 \u0436\u0430\u043b\u044c, \u0432\u0438\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u0456 \u0437\u043d\u0456\u043c\u043a\u0443","Taking snapshot - this may take a few seconds":"\u0421\u0442\u0432\u043e\u0440\u044e\u0454\u0442\u044c\u0441\u044f \u0437\u043d\u0456\u043c\u043e\u043a - \u0446\u0435 \u043c\u043e\u0436\u0435 \u0437\u0430\u0439\u043d\u044f\u0442\u0438 \u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434","Toggle Spike Lines":"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438/\u0432\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043b\u0456\u043d\u0456\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0456\u0439 \u0442\u043e\u0447\u043e\u043a","Toggle show closest data on hover":"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438/\u0432\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0430\u0439\u0431\u043b\u0438\u0436\u0447\u0438\u0445 \u0434\u0430\u043d\u0438\u0445 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456","Turntable rotation":"\u041e\u0431\u0435\u0440\u0442\u0430\u043d\u043d\u044f \u043d\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043d\u043e\u043c\u0443 \u0441\u0442\u043e\u043b\u0456",Zoom:"\u0417\u0443\u043c","Zoom in":"\u0417\u0431\u0456\u043b\u044c\u0448\u0438\u0442\u0438","Zoom out":"\u0417\u043c\u0435\u043d\u0448\u0438\u0442\u0438","close:":"\u0417\u0430\u043a\u0440\u0438\u0442\u0442\u044f:","concentration:":"\u041a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0456\u044f:","high:":"\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c:","incoming flow count:":"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0445\u0456\u0434\u043d\u0438\u0445 \u0437\u0432'\u044f\u0437\u043a\u0456\u0432:","kde:":"\u042f\u0434\u0440\u043e\u0432\u0430 \u043e\u0446\u0456\u043d\u043a\u0430 \u0433\u0443\u0441\u0442\u0438\u043d\u0438 \u0440\u043e\u0437\u043f\u043e\u0434\u0456\u043b\u0443:","lat:":"\u0428\u0438\u0440\u043e\u0442\u0430:","lon:":"\u0414\u043e\u0432\u0433\u043e\u0442\u0430:","low:":"\u041c\u0456\u043d\u0456\u043c\u0443\u043c:","lower fence:":"\u041d\u0438\u0436\u043d\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044f:","max:":"\u041c\u0430\u043a\u0441.:","mean \xb1 \u03c3:":"\u0421\u0435\u0440\u0435\u0434\u043d\u0454 \xb1 \u03c3:","mean:":"\u0421\u0435\u0440\u0435\u0434\u043d\u0454:","median:":"\u041c\u0435\u0434\u0456\u0430\u043d\u0430:","min:":"\u041c\u0456\u043d.:","new text":"\u041d\u043e\u0432\u0438\u0439 \u0442\u0435\u043a\u0441\u0442","open:":"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0442\u044f:","outgoing flow count:":"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0438\u0445\u0456\u0434\u043d\u0438\u0445 \u0437\u0432'\u044f\u0437\u043a\u0456\u0432:","q1:":"q1:","q3:":"q3:","source:":"\u0414\u0436\u0435\u0440\u0435\u043b\u043e:","target:":"\u0426\u0456\u043b\u044c:",trace:"\u0420\u044f\u0434","upper fence:":"\u0412\u0435\u0440\u0445\u043d\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044f:"},format:{days:["\u043d\u0435\u0434\u0456\u043b\u044f","\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a","\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a","\u0441\u0435\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440","\u043f'\u044f\u0442\u043d\u0438\u0446\u044f","\u0441\u0443\u0431\u043e\u0442\u0430"],shortDays:["\u043d\u0434","\u043f\u043d","\u0432\u0442","\u0441\u0440","\u0447\u0442","\u043f\u0442","\u0441\u0431"],months:["\u0421\u0456\u0447\u0435\u043d\u044c","\u041b\u044e\u0442\u0438\u0439","\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c","\u041a\u0432\u0456\u0442\u0435\u043d\u044c","\u0422\u0440\u0430\u0432\u0435\u043d\u044c","\u0427\u0435\u0440\u0432\u0435\u043d\u044c","\u041b\u0438\u043f\u0435\u043d\u044c","\u0421\u0435\u0440\u043f\u0435\u043d\u044c","\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c","\u0416\u043e\u0432\u0442\u0435\u043d\u044c","\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434","\u0413\u0440\u0443\u0434\u0435\u043d\u044c"],shortMonths:["\u0421\u0456\u0447.","\u041b\u044e\u0442.","\u0411\u0435\u0440\u0435\u0437.","\u041a\u0432\u0456\u0442.","\u0422\u0440\u0430\u0432.","\u0427\u0435\u0440\u0432.","\u041b\u0438\u043f.","\u0421\u0435\u0440\u043f.","\u0412\u0435\u0440\u0435\u0441.","\u0416\u043e\u0432\u0442.","\u041b\u0438\u0441\u0442\u043e\u043f.","\u0413\u0440\u0443\u0434."],date:"%d.%m.%Y",decimal:",",thousands:" "}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); +var locale={moduleType:"locale",name:"zh-CN",dictionary:{Autoscale:"\u81ea\u52a8\u7f29\u653e","Box Select":"\u77e9\u5f62\u6846\u9009","Click to enter Colorscale title":"\u70b9\u51fb\u8f93\u5165\u8272\u9636\u7684\u6807\u9898","Click to enter Component A title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6A\u7684\u6807\u9898","Click to enter Component B title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6B\u7684\u6807\u9898","Click to enter Component C title":"\u70b9\u51fb\u8f93\u5165\u7ec4\u4ef6C\u7684\u6807\u9898","Click to enter Plot title":"\u70b9\u51fb\u8f93\u5165\u56fe\u8868\u7684\u6807\u9898","Click to enter X axis title":"\u70b9\u51fb\u8f93\u5165X\u8f74\u7684\u6807\u9898","Click to enter Y axis title":"\u70b9\u51fb\u8f93\u5165Y\u8f74\u7684\u6807\u9898","Compare data on hover":"\u60ac\u505c\u65f6\u6bd4\u8f83\u6570\u636e","Double-click on legend to isolate one trace":"\u53cc\u51fb\u56fe\u4f8b\u6765\u7a81\u663e\u5bf9\u5e94\u8f68\u8ff9","Double-click to zoom back out":"\u53cc\u51fb\u8fd4\u56de\u7f29\u5c0f\u663e\u793a","Download plot as a png":"\u4e0b\u8f7d\u56fe\u8868\u4e3aPNG\u683c\u5f0f","Download plot":"\u4e0b\u8f7d\u56fe\u8868","Edit in Chart Studio":"\u5728Chart Studio\u4e2d\u7f16\u8f91","IE only supports svg. Changing format to svg.":"IE\u53ea\u652f\u6301SVG\u3002\u8f6c\u6362\u683c\u5f0f\u4e3aSVG\u3002","Lasso Select":"\u5957\u7d22\u9009\u62e9","Orbital rotation":"\u8f68\u9053\u65cb\u8f6c",Pan:"\u5e73\u79fb","Produced with Plotly.js":"\u7531Plotly.js\u751f\u6210",Reset:"\u91cd\u7f6e","Reset axes":"\u91cd\u7f6e\u8f74","Reset camera to default":"\u91cd\u7f6e\u955c\u5934\u89c6\u89d2\u4e3a\u9ed8\u8ba4\u72b6\u6001","Reset camera to last save":"\u91cd\u7f6e\u955c\u5934\u89c6\u89d2\u4e3a\u4e0a\u6b21\u4fdd\u5b58\u72b6\u6001","Reset view":"\u91cd\u7f6e\u89c6\u56fe","Reset views":"\u91cd\u7f6e\u89c6\u56fe","Show closest data on hover":"\u60ac\u505c\u65f6\u663e\u793a\u6700\u8fd1\u7684\u6570\u636e","Snapshot succeeded":"\u751f\u6210\u5feb\u7167\u6210\u529f","Sorry, there was a problem downloading your snapshot!":"\u62b1\u6b49\uff0c\u4e0b\u8f7d\u5feb\u7167\u51fa\u73b0\u95ee\u9898\uff01","Taking snapshot - this may take a few seconds":"\u6b63\u5728\u751f\u6210\u5feb\u7167 - \u53ef\u80fd\u9700\u8981\u51e0\u79d2\u949f",Zoom:"\u7f29\u653e","Zoom in":"\u653e\u5927","Zoom out":"\u7f29\u5c0f","close:":"\u5173\u95ed:",trace:"\u8e2a\u8ff9:","lat:":"\u7eac\u5ea6:","lon:":"\u7ecf\u5ea6:","q1:":"\u7b2c\u4e00\u56db\u5206\u4f4d\u6570:","q3:":"\u7b2c\u4e09\u56db\u5206\u4f4d\u6570:","source:":"\u6e90:","target:":"\u76ee\u6807:","lower fence:":"\u5185\u4fa7\u680f(lower fence):","upper fence:":"\u5916\u4fa7\u680f(upper fence):","max:":"\u6700\u5927\u503c:","mean \xb1 \u03c3:":"\u5e73\u5747\u6570 \xb1 \u6807\u51c6\u5dee\u03c3:","mean:":"\u5e73\u5747\u6570:","median:":"\u4e2d\u4f4d\u6570:","min:":"\u6700\u5c0f\u503c:","Turntable rotation":"\u65cb\u8f6c\u8f6c\u76d8:","Toggle Spike Lines":"\u5207\u6362\u663e\u793a\u6570\u636e\u70b9\u8f85\u52a9\u7ebf(Spike Lines)","open:":"\u6253\u5f00:","high:":"\u9ad8:","low:":"\u4f4e:","Toggle show closest data on hover":"\u5207\u6362\u60ac\u505c\u65f6\u663e\u793a\u6700\u8fd1\u7684\u6570\u636e\u70b9","incoming flow count:":"\u6d41\u5165\u6570\u91cf:","outgoing flow count:":"\u6d41\u51fa\u6570\u91cf:","kde:":"kde:","Click to enter radial axis title":"\u70b9\u51fb\u8f93\u5165\u5f84\u5411\u8f74\u6807\u9898","new text":"\u65b0\u5efa\u6587\u672c"},format:{days:["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],shortDays:["\u5468\u65e5","\u5468\u4e00","\u5468\u4e8c","\u5468\u4e09","\u5468\u56db","\u5468\u4e94","\u5468\u516d"],months:["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],shortMonths:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],date:"%Y-%m-%d"}};"undefined"==typeof Plotly?(window.PlotlyLocales=window.PlotlyLocales||[],window.PlotlyLocales.push(locale)):Plotly.register(locale); \ No newline at end of file diff --git a/static/babybuddy/js/graph.js.gz b/static/babybuddy/js/graph.js.gz index 8b3e4c87..cb12d977 100644 Binary files a/static/babybuddy/js/graph.js.gz and b/static/babybuddy/js/graph.js.gz differ diff --git a/static/babybuddy/js/vendor.b28919e31f4a.js b/static/babybuddy/js/vendor.c72a03a06acd.js similarity index 87% rename from static/babybuddy/js/vendor.b28919e31f4a.js rename to static/babybuddy/js/vendor.c72a03a06acd.js index 04c1fa92..a22e7fd9 100644 --- a/static/babybuddy/js/vendor.b28919e31f4a.js +++ b/static/babybuddy/js/vendor.c72a03a06acd.js @@ -18279,7 +18279,7 @@ return Popper; //! moment.js -//! version : 2.29.1 +//! version : 2.29.3 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com @@ -18356,8 +18356,9 @@ return Popper; function map(arr, fn) { var res = [], - i; - for (i = 0; i < arr.length; ++i) { + i, + arrLen = arr.length; + for (i = 0; i < arrLen; ++i) { res.push(fn(arr[i], i)); } return res; @@ -18486,7 +18487,10 @@ return Popper; updateInProgress = false; function copyConfig(to, from) { - var i, prop, val; + var i, + prop, + val, + momentPropertiesLen = momentProperties.length; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; @@ -18519,8 +18523,8 @@ return Popper; to._locale = from._locale; } - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { + if (momentPropertiesLen > 0) { + for (i = 0; i < momentPropertiesLen; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { @@ -18575,8 +18579,9 @@ return Popper; var args = [], arg, i, - key; - for (i = 0; i < arguments.length; i++) { + key, + argLen = arguments.length; + for (i = 0; i < argLen; i++) { arg = ''; if (typeof arguments[i] === 'object') { arg += '\n[' + i + '] '; @@ -18726,7 +18731,8 @@ return Popper; ); } - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, + var formattingTokens = + /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {}; @@ -19030,8 +19036,9 @@ return Popper; if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units), - i; - for (i = 0; i < prioritized.length; i++) { + i, + prioritizedLen = prioritized.length; + for (i = 0; i < prioritizedLen; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { @@ -19061,7 +19068,8 @@ return Popper; matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months - matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, + matchWord = + /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, regexes; regexes = {}; @@ -19087,15 +19095,12 @@ return Popper; return regexEscape( s .replace('\\', '') - .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function ( - matched, - p1, - p2, - p3, - p4 - ) { - return p1 || p2 || p3 || p4; - }) + .replace( + /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, + function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + } + ) ); } @@ -19107,7 +19112,8 @@ return Popper; function addParseToken(token, callback) { var i, - func = callback; + func = callback, + tokenLen; if (typeof token === 'string') { token = [token]; } @@ -19116,7 +19122,8 @@ return Popper; array[callback] = toInt(input); }; } - for (i = 0; i < token.length; i++) { + tokenLen = token.length; + for (i = 0; i < tokenLen; i++) { tokens[token[i]] = func; } } @@ -19227,12 +19234,12 @@ return Popper; // LOCALES - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split( - '_' - ), - defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split( - '_' - ), + var defaultLocaleMonths = + 'January_February_March_April_May_June_July_August_September_October_November_December'.split( + '_' + ), + defaultLocaleMonthsShort = + 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, defaultMonthsShortRegex = matchWord, defaultMonthsRegex = matchWord; @@ -19674,14 +19681,12 @@ return Popper; addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); - addWeekParseToken(['w', 'ww', 'W', 'WW'], function ( - input, - week, - config, - token - ) { - week[token.substr(0, 1)] = toInt(input); - }); + addWeekParseToken( + ['w', 'ww', 'W', 'WW'], + function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + } + ); // HELPERS @@ -19806,9 +19811,8 @@ return Popper; return ws.slice(n, 7).concat(ws.slice(0, n)); } - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split( - '_' - ), + var defaultLocaleWeekdays = + 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), defaultWeekdaysRegex = matchWord, @@ -20356,6 +20360,11 @@ return Popper; return globalLocale; } + function isLocaleNameSane(name) { + // Prevent names that look like filesystem paths, i.e contain '/' or '\' + return name.match('^[^/\\\\]*$') != null; + } + function loadLocale(name) { var oldLocale = null, aliasedRequire; @@ -20364,7 +20373,8 @@ return Popper; locales[name] === undefined && typeof module !== 'undefined' && module && - module.exports + module.exports && + isLocaleNameSane(name) ) { try { oldLocale = globalLocale._abbr; @@ -20581,8 +20591,10 @@ return Popper; // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, - basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + var extendedIsoRegex = + /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + basicIsoRegex = + /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], @@ -20613,7 +20625,8 @@ return Popper; ], aspNetJsonRegex = /^\/?Date\((-?\d+)/i, // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 - rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, + rfc2822 = + /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, obsOffsets = { UT: 0, GMT: 0, @@ -20636,12 +20649,13 @@ return Popper; allowTime, dateFormat, timeFormat, - tzFormat; + tzFormat, + isoDatesLen = isoDates.length, + isoTimesLen = isoTimes.length; if (match) { getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { + for (i = 0, l = isoDatesLen; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; @@ -20653,7 +20667,7 @@ return Popper; return; } if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { + for (i = 0, l = isoTimesLen; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { // match[2] should be 'T' or space timeFormat = (match[2] || ' ') + isoTimes[i][0]; @@ -21033,12 +21047,13 @@ return Popper; skipped, stringLength = string.length, totalParsedInputLength = 0, - era; + era, + tokenLen; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { + tokenLen = tokens.length; + for (i = 0; i < tokenLen; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; @@ -21133,15 +21148,16 @@ return Popper; i, currentScore, validFormatFound, - bestFormatIsValid = false; + bestFormatIsValid = false, + configfLen = config._f.length; - if (config._f.length === 0) { + if (configfLen === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } - for (i = 0; i < config._f.length; i++) { + for (i = 0; i < configfLen; i++) { currentScore = 0; validFormatFound = false; tempConfig = copyConfig({}, config); @@ -21382,7 +21398,8 @@ return Popper; function isDurationValid(m) { var key, unitHasDecimal = false, - i; + i, + orderLen = ordering.length; for (key in m) { if ( hasOwnProp(m, key) && @@ -21395,7 +21412,7 @@ return Popper; } } - for (i = 0; i < ordering.length; ++i) { + for (i = 0; i < orderLen; ++i) { if (m[ordering[i]]) { if (unitHasDecimal) { return false; // only allow non-integers for smallest unit @@ -21720,7 +21737,8 @@ return Popper; // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere // and further modified to allow for strings containing both week and day - isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + isoRegex = + /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function createDuration(input, key) { var duration = input, @@ -21941,9 +21959,10 @@ return Popper; 'ms', ], i, - property; + property, + propertyLen = properties.length; - for (i = 0; i < properties.length; i += 1) { + for (i = 0; i < propertyLen; i += 1) { property = properties[i]; propertyTest = propertyTest || hasOwnProp(input, property); } @@ -22566,19 +22585,17 @@ return Popper; addRegexToken('NNNN', matchEraName); addRegexToken('NNNNN', matchEraNarrow); - addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function ( - input, - array, - config, - token - ) { - var era = config._locale.erasParse(input, token, config._strict); - if (era) { - getParsingFlags(config).era = era; - } else { - getParsingFlags(config).invalidEra = input; + addParseToken( + ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], + function (input, array, config, token) { + var era = config._locale.erasParse(input, token, config._strict); + if (era) { + getParsingFlags(config).era = era; + } else { + getParsingFlags(config).invalidEra = input; + } } - }); + ); addRegexToken('y', matchUnsigned); addRegexToken('yy', matchUnsigned); @@ -22870,14 +22887,12 @@ return Popper; addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function ( - input, - week, - config, - token - ) { - week[token.substr(0, 2)] = toInt(input); - }); + addWeekParseToken( + ['gggg', 'ggggg', 'GGGG', 'GGGGG'], + function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + } + ); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = hooks.parseTwoDigitYear(input); @@ -23900,7 +23915,7 @@ return Popper; //! moment.js - hooks.version = '2.29.1'; + hooks.version = '2.29.3'; setHookCallback(createLocal); @@ -23964,21 +23979,24 @@ return Popper; var ca = moment.defineLocale('ca', { months: { - standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split( - '_' - ), + standalone: + 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split( + '_' + ), format: "de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split( '_' ), isFormat: /D[oD]?(\s)+MMMM/, }, - monthsShort: 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split( - '_' - ), + monthsShort: + 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split( + '_' + ), monthsParseExact: true, - weekdays: 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split( - '_' - ), + weekdays: + 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split( + '_' + ), weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'), weekdaysParseExact: true, @@ -24092,13 +24110,13 @@ return Popper; months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split( '_' ), - monthsShort: 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split( - '_' - ), + monthsShort: + 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), monthsParseExact: true, - weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split( - '_' - ), + weekdays: + 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split( + '_' + ), weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), weekdaysParseExact: true, @@ -24241,9 +24259,10 @@ return Popper; //! moment.js locale configuration - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split( - '_' - ), + var monthsShortDot = + 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split( + '_' + ), monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'), monthsParse = [ /^ene/i, @@ -24259,7 +24278,8 @@ return Popper; /^nov/i, /^dic/i, ], - monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + monthsRegex = + /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; var es = moment.defineLocale('es', { months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split( @@ -24276,8 +24296,10 @@ return Popper; }, monthsRegex: monthsRegex, monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsStrictRegex: + /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex: + /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, monthsParse: monthsParse, longMonthsParse: monthsParse, shortMonthsParse: monthsParse, @@ -24359,9 +24381,10 @@ return Popper; //! moment.js locale configuration - var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split( - ' ' - ), + var numbersPast = + 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split( + ' ' + ), numbersFuture = [ 'nolla', 'yhden', @@ -24423,12 +24446,14 @@ return Popper; months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split( '_' ), - monthsShort: 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split( - '_' - ), - weekdays: 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split( - '_' - ), + monthsShort: + 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split( + '_' + ), + weekdays: + 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split( + '_' + ), weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'), weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'), longDateFormat: { @@ -24492,9 +24517,12 @@ return Popper; //! moment.js locale configuration - var monthsStrictRegex = /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i, - monthsShortStrictRegex = /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i, - monthsRegex = /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i, + var monthsStrictRegex = + /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i, + monthsShortStrictRegex = + /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i, + monthsRegex = + /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i, monthsParse = [ /^janv/i, /^févr/i, @@ -24514,9 +24542,10 @@ return Popper; months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split( '_' ), - monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split( - '_' - ), + monthsShort: + 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split( + '_' + ), monthsRegex: monthsRegex, monthsShortRegex: monthsRegex, monthsStrictRegex: monthsStrictRegex, @@ -24727,12 +24756,10 @@ return Popper; //! moment.js locale configuration - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split( - '_' - ), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split( - '_' - ), + var monthsShortWithDots = + 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = + 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'), monthsParse = [ /^jan/i, /^feb/i, @@ -24747,7 +24774,8 @@ return Popper; /^nov/i, /^dec/i, ], - monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + monthsRegex = + /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; var nl = moment.defineLocale('nl', { months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split( @@ -24765,16 +24793,17 @@ return Popper; monthsRegex: monthsRegex, monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + monthsStrictRegex: + /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: + /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, monthsParse: monthsParse, longMonthsParse: monthsParse, shortMonthsParse: monthsParse, - weekdays: 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split( - '_' - ), + weekdays: + 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'), weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'), weekdaysParseExact: true, @@ -24842,12 +24871,14 @@ return Popper; //! moment.js locale configuration - var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split( - '_' - ), - monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split( - '_' - ), + var monthsNominative = + 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split( + '_' + ), + monthsSubjective = + 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split( + '_' + ), monthsParse = [ /^sty/i, /^lut/i, @@ -24901,9 +24932,8 @@ return Popper; monthsParse: monthsParse, longMonthsParse: monthsParse, shortMonthsParse: monthsParse, - weekdays: 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split( - '_' - ), + weekdays: + 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), longDateFormat: { @@ -24998,9 +25028,10 @@ return Popper; '_' ), monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays: 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split( - '_' - ), + weekdays: + 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split( + '_' + ), weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), weekdaysParseExact: true, @@ -25177,7 +25208,7 @@ return Popper; weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split( '_' ), - weekdaysShort: 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'), weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), meridiem: function (hours, minutes, isLower) { if (hours < 12) { @@ -26931,9 +26962,9 @@ return Popper; return moment; })); -/*@preserve - * Tempus Dominus Bootstrap4 v5.1.2 (https://tempusdominus.github.io/bootstrap-4/) - * Copyright 2016-2018 Jonathan Peterson +/*!@preserve + * Tempus Dominus Bootstrap4 v5.39.0 (https://tempusdominus.github.io/bootstrap-4/) + * Copyright 2016-2020 Jonathan Peterson and contributors * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE) */ @@ -26960,2753 +26991,3479 @@ if ((version[0] <= 2 && version[1] < 17) || (version[0] >= 3)) { +function () { -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } // ReSharper disable once InconsistentNaming var DateTimePicker = function ($, moment) { - // ReSharper disable InconsistentNaming - var NAME = 'datetimepicker', - DATA_KEY = '' + NAME, - EVENT_KEY = '.' + DATA_KEY, - DATA_API_KEY = '.data-api', - Selector = { - DATA_TOGGLE: '[data-toggle="' + DATA_KEY + '"]' + function escapeRegExp(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + } + + function isValidDate(date) { + return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime()); + } + + function isValidDateTimeStr(str) { + return isValidDate(new Date(str)); + } // ReSharper disable InconsistentNaming + + + var trim = function trim(str) { + return str.replace(/(^\s+)|(\s+$)/g, ''); + }, + NAME = 'datetimepicker', + DATA_KEY = "" + NAME, + EVENT_KEY = "." + DATA_KEY, + DATA_API_KEY = '.data-api', + Selector = { + DATA_TOGGLE: "[data-toggle=\"" + DATA_KEY + "\"]" + }, + ClassName = { + INPUT: NAME + "-input" + }, + Event = { + CHANGE: "change" + EVENT_KEY, + BLUR: "blur" + EVENT_KEY, + KEYUP: "keyup" + EVENT_KEY, + KEYDOWN: "keydown" + EVENT_KEY, + FOCUS: "focus" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, + //emitted + UPDATE: "update" + EVENT_KEY, + ERROR: "error" + EVENT_KEY, + HIDE: "hide" + EVENT_KEY, + SHOW: "show" + EVENT_KEY + }, + DatePickerModes = [{ + CLASS_NAME: 'days', + NAV_FUNCTION: 'M', + NAV_STEP: 1 + }, { + CLASS_NAME: 'months', + NAV_FUNCTION: 'y', + NAV_STEP: 1 + }, { + CLASS_NAME: 'years', + NAV_FUNCTION: 'y', + NAV_STEP: 10 + }, { + CLASS_NAME: 'decades', + NAV_FUNCTION: 'y', + NAV_STEP: 100 + }], + KeyMap = { + 'up': 38, + 38: 'up', + 'down': 40, + 40: 'down', + 'left': 37, + 37: 'left', + 'right': 39, + 39: 'right', + 'tab': 9, + 9: 'tab', + 'escape': 27, + 27: 'escape', + 'enter': 13, + 13: 'enter', + 'pageUp': 33, + 33: 'pageUp', + 'pageDown': 34, + 34: 'pageDown', + 'shift': 16, + 16: 'shift', + 'control': 17, + 17: 'control', + 'space': 32, + 32: 'space', + 't': 84, + 84: 't', + 'delete': 46, + 46: 'delete' + }, + ViewModes = ['times', 'days', 'months', 'years', 'decades'], + keyState = {}, + keyPressHandled = {}, + optionsSortMap = { + timeZone: -39, + format: -38, + dayViewHeaderFormat: -37, + extraFormats: -36, + stepping: -35, + minDate: -34, + maxDate: -33, + useCurrent: -32, + collapse: -31, + locale: -30, + defaultDate: -29, + disabledDates: -28, + enabledDates: -27, + icons: -26, + tooltips: -25, + useStrict: -24, + sideBySide: -23, + daysOfWeekDisabled: -22, + calendarWeeks: -21, + viewMode: -20, + toolbarPlacement: -19, + buttons: -18, + widgetPositioning: -17, + widgetParent: -16, + ignoreReadonly: -15, + keepOpen: -14, + focusOnShow: -13, + inline: -12, + keepInvalid: -11, + keyBinds: -10, + debug: -9, + allowInputToggle: -8, + disabledTimeIntervals: -7, + disabledHours: -6, + enabledHours: -5, + viewDate: -4, + allowMultidate: -3, + multidateSeparator: -2, + updateOnlyThroughDateOption: -1, + date: 1 + }, + defaultFeatherIcons = { + time: 'clock', + date: 'calendar', + up: 'arrow-up', + down: 'arrow-down', + previous: 'arrow-left', + next: 'arrow-right', + today: 'arrow-down-circle', + clear: 'trash-2', + close: 'x' + }; + + function optionsSortFn(optionKeyA, optionKeyB) { + if (optionsSortMap[optionKeyA] && optionsSortMap[optionKeyB]) { + if (optionsSortMap[optionKeyA] < 0 && optionsSortMap[optionKeyB] < 0) { + return Math.abs(optionsSortMap[optionKeyB]) - Math.abs(optionsSortMap[optionKeyA]); + } else if (optionsSortMap[optionKeyA] < 0) { + return -1; + } else if (optionsSortMap[optionKeyB] < 0) { + return 1; + } + + return optionsSortMap[optionKeyA] - optionsSortMap[optionKeyB]; + } else if (optionsSortMap[optionKeyA]) { + return optionsSortMap[optionKeyA]; + } else if (optionsSortMap[optionKeyB]) { + return optionsSortMap[optionKeyB]; + } + + return 0; + } + + var Default = { + timeZone: '', + format: false, + dayViewHeaderFormat: 'MMMM YYYY', + extraFormats: false, + stepping: 1, + minDate: false, + maxDate: false, + useCurrent: true, + collapse: true, + locale: moment.locale(), + defaultDate: false, + disabledDates: false, + enabledDates: false, + icons: { + type: 'class', + time: 'fa fa-clock-o', + date: 'fa fa-calendar', + up: 'fa fa-arrow-up', + down: 'fa fa-arrow-down', + previous: 'fa fa-chevron-left', + next: 'fa fa-chevron-right', + today: 'fa fa-calendar-check-o', + clear: 'fa fa-trash', + close: 'fa fa-times' }, - ClassName = { - INPUT: NAME + '-input' + tooltips: { + today: 'Go to today', + clear: 'Clear selection', + close: 'Close the picker', + selectMonth: 'Select Month', + prevMonth: 'Previous Month', + nextMonth: 'Next Month', + selectYear: 'Select Year', + prevYear: 'Previous Year', + nextYear: 'Next Year', + selectDecade: 'Select Decade', + prevDecade: 'Previous Decade', + nextDecade: 'Next Decade', + prevCentury: 'Previous Century', + nextCentury: 'Next Century', + pickHour: 'Pick Hour', + incrementHour: 'Increment Hour', + decrementHour: 'Decrement Hour', + pickMinute: 'Pick Minute', + incrementMinute: 'Increment Minute', + decrementMinute: 'Decrement Minute', + pickSecond: 'Pick Second', + incrementSecond: 'Increment Second', + decrementSecond: 'Decrement Second', + togglePeriod: 'Toggle Period', + selectTime: 'Select Time', + selectDate: 'Select Date' }, - Event = { - CHANGE: 'change' + EVENT_KEY, - BLUR: 'blur' + EVENT_KEY, - KEYUP: 'keyup' + EVENT_KEY, - KEYDOWN: 'keydown' + EVENT_KEY, - FOCUS: 'focus' + EVENT_KEY, - CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY, - //emitted - UPDATE: 'update' + EVENT_KEY, - ERROR: 'error' + EVENT_KEY, - HIDE: 'hide' + EVENT_KEY, - SHOW: 'show' + EVENT_KEY + useStrict: false, + sideBySide: false, + daysOfWeekDisabled: false, + calendarWeeks: false, + viewMode: 'days', + toolbarPlacement: 'default', + buttons: { + showToday: false, + showClear: false, + showClose: false }, - DatePickerModes = [{ - CLASS_NAME: 'days', - NAV_FUNCTION: 'M', - NAV_STEP: 1 - }, { - CLASS_NAME: 'months', - NAV_FUNCTION: 'y', - NAV_STEP: 1 - }, { - CLASS_NAME: 'years', - NAV_FUNCTION: 'y', - NAV_STEP: 10 - }, { - CLASS_NAME: 'decades', - NAV_FUNCTION: 'y', - NAV_STEP: 100 - }], - KeyMap = { - 'up': 38, - 38: 'up', - 'down': 40, - 40: 'down', - 'left': 37, - 37: 'left', - 'right': 39, - 39: 'right', - 'tab': 9, - 9: 'tab', - 'escape': 27, - 27: 'escape', - 'enter': 13, - 13: 'enter', - 'pageUp': 33, - 33: 'pageUp', - 'pageDown': 34, - 34: 'pageDown', - 'shift': 16, - 16: 'shift', - 'control': 17, - 17: 'control', - 'space': 32, - 32: 'space', - 't': 84, - 84: 't', - 'delete': 46, - 46: 'delete' + widgetPositioning: { + horizontal: 'auto', + vertical: 'auto' }, - ViewModes = ['times', 'days', 'months', 'years', 'decades'], - keyState = {}, - keyPressHandled = {}; - - var Default = { - timeZone: '', - format: false, - dayViewHeaderFormat: 'MMMM YYYY', - extraFormats: false, - stepping: 1, - minDate: false, - maxDate: false, - useCurrent: true, - collapse: true, - locale: moment.locale(), - defaultDate: false, - disabledDates: false, - enabledDates: false, - icons: { - time: 'fa fa-clock-o', - date: 'fa fa-calendar', - up: 'fa fa-arrow-up', - down: 'fa fa-arrow-down', - previous: 'fa fa-chevron-left', - next: 'fa fa-chevron-right', - today: 'fa fa-calendar-check-o', - clear: 'fa fa-delete', - close: 'fa fa-times' - }, - tooltips: { - today: 'Go to today', - clear: 'Clear selection', - close: 'Close the picker', - selectMonth: 'Select Month', - prevMonth: 'Previous Month', - nextMonth: 'Next Month', - selectYear: 'Select Year', - prevYear: 'Previous Year', - nextYear: 'Next Year', - selectDecade: 'Select Decade', - prevDecade: 'Previous Decade', - nextDecade: 'Next Decade', - prevCentury: 'Previous Century', - nextCentury: 'Next Century', - pickHour: 'Pick Hour', - incrementHour: 'Increment Hour', - decrementHour: 'Decrement Hour', - pickMinute: 'Pick Minute', - incrementMinute: 'Increment Minute', - decrementMinute: 'Decrement Minute', - pickSecond: 'Pick Second', - incrementSecond: 'Increment Second', - decrementSecond: 'Decrement Second', - togglePeriod: 'Toggle Period', - selectTime: 'Select Time', - selectDate: 'Select Date' - }, - useStrict: false, - sideBySide: false, - daysOfWeekDisabled: false, - calendarWeeks: false, - viewMode: 'days', - toolbarPlacement: 'default', - buttons: { - showToday: false, - showClear: false, - showClose: false - }, - widgetPositioning: { - horizontal: 'auto', - vertical: 'auto' - }, - widgetParent: null, - ignoreReadonly: false, - keepOpen: false, - focusOnShow: true, - inline: false, - keepInvalid: false, - keyBinds: { - up: function up() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().subtract(7, 'd')); - } else { - this.date(d.clone().add(this.stepping(), 'm')); - } - return true; - }, - down: function down() { - if (!this.widget) { - this.show(); - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().add(7, 'd')); - } else { - this.date(d.clone().subtract(this.stepping(), 'm')); - } - return true; - }, - 'control up': function controlUp() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().subtract(1, 'y')); - } else { - this.date(d.clone().add(1, 'h')); - } - return true; - }, - 'control down': function controlDown() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().add(1, 'y')); - } else { - this.date(d.clone().subtract(1, 'h')); - } - return true; - }, - left: function left() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().subtract(1, 'd')); - } - return true; - }, - right: function right() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().add(1, 'd')); - } - return true; - }, - pageUp: function pageUp() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().subtract(1, 'M')); - } - return true; - }, - pageDown: function pageDown() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().add(1, 'M')); - } - return true; - }, - enter: function enter() { - if (!this.widget) { - return false; - } - this.hide(); - return true; - }, - escape: function escape() { - if (!this.widget) { - return false; - } - this.hide(); - return true; - }, - 'control space': function controlSpace() { - if (!this.widget) { - return false; - } - if (this.widget.find('.timepicker').is(':visible')) { - this.widget.find('.btn[data-action="togglePeriod"]').click(); - } - return true; - }, - t: function t() { - if (!this.widget) { - return false; - } - this.date(this.getMoment()); - return true; - }, - 'delete': function _delete() { - if (!this.widget) { - return false; - } - this.clear(); - return true; - } - }, - debug: false, - allowInputToggle: false, - disabledTimeIntervals: false, - disabledHours: false, - enabledHours: false, - viewDate: false, - allowMultidate: false, - multidateSeparator: ',' - }; - - // ReSharper restore InconsistentNaming - - // ReSharper disable once DeclarationHides - // ReSharper disable once InconsistentNaming - - var DateTimePicker = function () { - /** @namespace eData.dateOptions */ - /** @namespace moment.tz */ - - function DateTimePicker(element, options) { - _classCallCheck(this, DateTimePicker); - - this._options = this._getOptions(options); - this._element = element; - this._dates = []; - this._datesFormatted = []; - this._viewDate = null; - this.unset = true; - this.component = false; - this.widget = false; - this.use24Hours = null; - this.actualFormat = null; - this.parseFormats = null; - this.currentViewMode = null; - this.MinViewModeNumber = 0; - - this._int(); + widgetParent: null, + readonly: false, + ignoreReadonly: false, + keepOpen: false, + focusOnShow: true, + inline: false, + keepInvalid: false, + keyBinds: { + up: function up() { + if (!this.widget) { + return false; } - /** - * @return {string} - */ + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().subtract(7, 'd')); + } else { + this.date(d.clone().add(this.stepping(), 'm')); + } + + return true; + }, + down: function down() { + if (!this.widget) { + this.show(); + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().add(7, 'd')); + } else { + this.date(d.clone().subtract(this.stepping(), 'm')); + } + + return true; + }, + 'control up': function controlUp() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().subtract(1, 'y')); + } else { + this.date(d.clone().add(1, 'h')); + } + + return true; + }, + 'control down': function controlDown() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().add(1, 'y')); + } else { + this.date(d.clone().subtract(1, 'h')); + } + + return true; + }, + left: function left() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().subtract(1, 'd')); + } + + return true; + }, + right: function right() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().add(1, 'd')); + } + + return true; + }, + pageUp: function pageUp() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().subtract(1, 'M')); + } + + return true; + }, + pageDown: function pageDown() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().add(1, 'M')); + } + + return true; + }, + enter: function enter() { + if (!this.widget) { + return false; + } + + this.hide(); + return true; + }, + escape: function escape() { + if (!this.widget) { + return false; + } + + this.hide(); + return true; + }, + 'control space': function controlSpace() { + if (!this.widget) { + return false; + } + + if (this.widget.find('.timepicker').is(':visible')) { + this.widget.find('.btn[data-action="togglePeriod"]').click(); + } + + return true; + }, + t: function t() { + if (!this.widget) { + return false; + } + + this.date(this.getMoment()); + return true; + }, + 'delete': function _delete() { + if (!this.widget) { + return false; + } + + this.clear(); + return true; + } + }, + debug: false, + allowInputToggle: false, + disabledTimeIntervals: false, + disabledHours: false, + enabledHours: false, + viewDate: false, + allowMultidate: false, + multidateSeparator: ', ', + updateOnlyThroughDateOption: false, + promptTimeOnDateChange: false, + promptTimeOnDateChangeTransitionDelay: 200 + }; // ReSharper restore InconsistentNaming + // ReSharper disable once DeclarationHides + // ReSharper disable once InconsistentNaming + + var DateTimePicker = /*#__PURE__*/function () { + /** @namespace eData.dateOptions */ + + /** @namespace moment.tz */ + function DateTimePicker(element, options) { + this._options = this._getOptions(options); + this._element = element; + this._dates = []; + this._datesFormatted = []; + this._viewDate = null; + this.unset = true; + this.component = false; + this.widget = false; + this.use24Hours = null; + this.actualFormat = null; + this.parseFormats = null; + this.currentViewMode = null; + this.MinViewModeNumber = 0; + this.isInitFormatting = false; + this.isInit = false; + this.isDateUpdateThroughDateOptionFromClientCode = false; + this.hasInitDate = false; + this.initDate = void 0; + this._notifyChangeEventContext = void 0; + this._currentPromptTimeTimeout = null; + + this._int(); + } + /** + * @return {string} + */ - //private + var _proto = DateTimePicker.prototype; - DateTimePicker.prototype._int = function _int() { - var targetInput = this._element.data('target-input'); - if (this._element.is('input')) { - this.input = this._element; - } else if (targetInput !== undefined) { - if (targetInput === 'nearest') { - this.input = this._element.find('input'); - } else { - this.input = $(targetInput); - } - } + //private + _proto._int = function _int() { + this.isInit = true; - this._dates = []; - this._dates[0] = this.getMoment(); - this._viewDate = this.getMoment().clone(); + var targetInput = this._element.data('target-input'); - $.extend(true, this._options, this._dataToOptions()); + if (this._element.is('input')) { + this.input = this._element; + } else if (targetInput !== undefined) { + if (targetInput === 'nearest') { + this.input = this._element.find('input'); + } else { + this.input = $(targetInput); + } + } - this.options(this._options); + this._dates = []; + this._dates[0] = this.getMoment(); + this._viewDate = this.getMoment().clone(); + $.extend(true, this._options, this._dataToOptions()); + this.hasInitDate = false; + this.initDate = void 0; + this.options(this._options); + this.isInitFormatting = true; - this._initFormatting(); + this._initFormatting(); - if (this.input !== undefined && this.input.is('input') && this.input.val().trim().length !== 0) { - this._setValue(this._parseInputDate(this.input.val().trim()), 0); - } else if (this._options.defaultDate && this.input !== undefined && this.input.attr('placeholder') === undefined) { - this._setValue(this._options.defaultDate, 0); - } - if (this._options.inline) { - this.show(); - } - }; + this.isInitFormatting = false; - DateTimePicker.prototype._update = function _update() { - if (!this.widget) { - return; - } - this._fillDate(); - this._fillTime(); - }; + if (this.input !== undefined && this.input.is('input') && this.input.val().trim().length !== 0) { + this._setValue(this._parseInputDate(this.input.val().trim()), 0); + } else if (this._options.defaultDate && this.input !== undefined && this.input.attr('placeholder') === undefined) { + this._setValue(this._options.defaultDate, 0); + } - DateTimePicker.prototype._setValue = function _setValue(targetMoment, index) { - var oldDate = this.unset ? null : this._dates[index]; - var outpValue = ''; - // case of calling setValue(null or false) - if (!targetMoment) { - if (!this._options.allowMultidate || this._dates.length === 1) { - this.unset = true; - this._dates = []; - this._datesFormatted = []; - } else { - outpValue = this._element.data('date') + ','; - outpValue = outpValue.replace(oldDate.format(this.actualFormat) + ',', '').replace(',,', '').replace(/,\s*$/, ''); - this._dates.splice(index, 1); - this._datesFormatted.splice(index, 1); - } - if (this.input !== undefined) { - this.input.val(outpValue); - this.input.trigger('input'); - } - this._element.data('date', outpValue); - this._notifyEvent({ - type: DateTimePicker.Event.CHANGE, - date: false, - oldDate: oldDate - }); - this._update(); - return; - } + if (this.hasInitDate) { + this.date(this.initDate); + } - targetMoment = targetMoment.clone().locale(this._options.locale); + if (this._options.inline) { + this.show(); + } - if (this._hasTimeZone()) { - targetMoment.tz(this._options.timeZone); - } + this.isInit = false; + }; - if (this._options.stepping !== 1) { - targetMoment.minutes(Math.round(targetMoment.minutes() / this._options.stepping) * this._options.stepping).seconds(0); - } + _proto._update = function _update() { + if (!this.widget) { + return; + } - if (this._isValid(targetMoment)) { - this._dates[index] = targetMoment; - this._datesFormatted[index] = targetMoment.format('YYYY-MM-DD'); - this._viewDate = targetMoment.clone(); - if (this._options.allowMultidate && this._dates.length > 1) { - for (var i = 0; i < this._dates.length; i++) { - outpValue += '' + this._dates[i].format(this.actualFormat) + this._options.multidateSeparator; - } - outpValue = outpValue.replace(/,\s*$/, ''); - } else { - outpValue = this._dates[index].format(this.actualFormat); - } - if (this.input !== undefined) { - this.input.val(outpValue); - this.input.trigger('input'); - } - this._element.data('date', outpValue); + this._fillDate(); - this.unset = false; - this._update(); - this._notifyEvent({ - type: DateTimePicker.Event.CHANGE, - date: this._dates[index].clone(), - oldDate: oldDate - }); - } else { - if (!this._options.keepInvalid) { - if (this.input !== undefined) { - this.input.val('' + (this.unset ? '' : this._dates[index].format(this.actualFormat))); - this.input.trigger('input'); - } - } else { - this._notifyEvent({ - type: DateTimePicker.Event.CHANGE, - date: targetMoment, - oldDate: oldDate - }); - } - this._notifyEvent({ - type: DateTimePicker.Event.ERROR, - date: targetMoment, - oldDate: oldDate - }); - } - }; + this._fillTime(); + }; - DateTimePicker.prototype._change = function _change(e) { - var val = $(e.target).val().trim(), - parsedDate = val ? this._parseInputDate(val) : null; - this._setValue(parsedDate); - e.stopImmediatePropagation(); + _proto._setValue = function _setValue(targetMoment, index) { + var noIndex = typeof index === 'undefined', + isClear = !targetMoment && noIndex, + isDateUpdateThroughDateOptionFromClientCode = this.isDateUpdateThroughDateOptionFromClientCode, + isNotAllowedProgrammaticUpdate = !this.isInit && this._options.updateOnlyThroughDateOption && !isDateUpdateThroughDateOptionFromClientCode; + var outpValue = '', + isInvalid = false, + oldDate = this.unset ? null : this._dates[index]; + + if (!oldDate && !this.unset && noIndex && isClear) { + oldDate = this._dates[this._dates.length - 1]; + } // case of calling setValue(null or false) + + + if (!targetMoment) { + if (isNotAllowedProgrammaticUpdate) { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment, + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + + return; + } + + if (!this._options.allowMultidate || this._dates.length === 1 || isClear) { + this.unset = true; + this._dates = []; + this._datesFormatted = []; + } else { + outpValue = "" + this._element.data('date') + this._options.multidateSeparator; + outpValue = oldDate && outpValue.replace("" + oldDate.format(this.actualFormat) + this._options.multidateSeparator, '').replace("" + this._options.multidateSeparator + this._options.multidateSeparator, '').replace(new RegExp(escapeRegExp(this._options.multidateSeparator) + "\\s*$"), '') || ''; + + this._dates.splice(index, 1); + + this._datesFormatted.splice(index, 1); + } + + outpValue = trim(outpValue); + + if (this.input !== undefined) { + this.input.val(outpValue); + this.input.trigger('input'); + } + + this._element.data('date', outpValue); + + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: false, + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + + this._update(); + + return; + } + + targetMoment = targetMoment.clone().locale(this._options.locale); + + if (this._hasTimeZone()) { + targetMoment.tz(this._options.timeZone); + } + + if (this._options.stepping !== 1) { + targetMoment.minutes(Math.round(targetMoment.minutes() / this._options.stepping) * this._options.stepping).seconds(0); + } + + if (this._isValid(targetMoment)) { + if (isNotAllowedProgrammaticUpdate) { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment.clone(), + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + + return; + } + + this._dates[index] = targetMoment; + this._datesFormatted[index] = targetMoment.format('YYYY-MM-DD'); + this._viewDate = targetMoment.clone(); + + if (this._options.allowMultidate && this._dates.length > 1) { + for (var i = 0; i < this._dates.length; i++) { + outpValue += "" + this._dates[i].format(this.actualFormat) + this._options.multidateSeparator; + } + + outpValue = outpValue.replace(new RegExp(this._options.multidateSeparator + "\\s*$"), ''); + } else { + outpValue = this._dates[index].format(this.actualFormat); + } + + outpValue = trim(outpValue); + + if (this.input !== undefined) { + this.input.val(outpValue); + this.input.trigger('input'); + } + + this._element.data('date', outpValue); + + this.unset = false; + + this._update(); + + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: this._dates[index].clone(), + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + } else { + isInvalid = true; + + if (!this._options.keepInvalid) { + if (this.input !== undefined) { + this.input.val("" + (this.unset ? '' : this._dates[index].format(this.actualFormat))); + this.input.trigger('input'); + } + } else { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment, + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + } + + this._notifyEvent({ + type: DateTimePicker.Event.ERROR, + date: targetMoment, + oldDate: oldDate + }); + } + }; + + _proto._change = function _change(e) { + var val = $(e.target).val().trim(), + parsedDate = val ? this._parseInputDate(val) : null; + + this._setValue(parsedDate, 0); + + e.stopImmediatePropagation(); + return false; + } //noinspection JSMethodCanBeStatic + ; + + _proto._getOptions = function _getOptions(options) { + options = $.extend(true, {}, Default, options && options.icons && options.icons.type === 'feather' ? { + icons: defaultFeatherIcons + } : {}, options); + return options; + }; + + _proto._hasTimeZone = function _hasTimeZone() { + return moment.tz !== undefined && this._options.timeZone !== undefined && this._options.timeZone !== null && this._options.timeZone !== ''; + }; + + _proto._isEnabled = function _isEnabled(granularity) { + if (typeof granularity !== 'string' || granularity.length > 1) { + throw new TypeError('isEnabled expects a single character string parameter'); + } + + switch (granularity) { + case 'y': + return this.actualFormat.indexOf('Y') !== -1; + + case 'M': + return this.actualFormat.indexOf('M') !== -1; + + case 'd': + return this.actualFormat.toLowerCase().indexOf('d') !== -1; + + case 'h': + case 'H': + return this.actualFormat.toLowerCase().indexOf('h') !== -1; + + case 'm': + return this.actualFormat.indexOf('m') !== -1; + + case 's': + return this.actualFormat.indexOf('s') !== -1; + + case 'a': + case 'A': + return this.actualFormat.toLowerCase().indexOf('a') !== -1; + + default: + return false; + } + }; + + _proto._hasTime = function _hasTime() { + return this._isEnabled('h') || this._isEnabled('m') || this._isEnabled('s'); + }; + + _proto._hasDate = function _hasDate() { + return this._isEnabled('y') || this._isEnabled('M') || this._isEnabled('d'); + }; + + _proto._dataToOptions = function _dataToOptions() { + var eData = this._element.data(); + + var dataOptions = {}; + + if (eData.dateOptions && eData.dateOptions instanceof Object) { + dataOptions = $.extend(true, dataOptions, eData.dateOptions); + } + + $.each(this._options, function (key) { + var attributeName = "date" + key.charAt(0).toUpperCase() + key.slice(1); //todo data api key + + if (eData[attributeName] !== undefined) { + dataOptions[key] = eData[attributeName]; + } else { + delete dataOptions[key]; + } + }); + return dataOptions; + }; + + _proto._format = function _format() { + return this._options.format || 'YYYY-MM-DD HH:mm'; + }; + + _proto._areSameDates = function _areSameDates(a, b) { + var format = this._format(); + + return a && b && (a.isSame(b) || moment(a.format(format), format).isSame(moment(b.format(format), format))); + }; + + _proto._notifyEvent = function _notifyEvent(e) { + if (e.type === DateTimePicker.Event.CHANGE) { + this._notifyChangeEventContext = this._notifyChangeEventContext || 0; + this._notifyChangeEventContext++; + + if (e.date && this._areSameDates(e.date, e.oldDate) || !e.isClear && !e.date && !e.oldDate || this._notifyChangeEventContext > 1) { + this._notifyChangeEventContext = void 0; + return; + } + + this._handlePromptTimeIfNeeded(e); + } + + this._element.trigger(e); + + this._notifyChangeEventContext = void 0; + }; + + _proto._handlePromptTimeIfNeeded = function _handlePromptTimeIfNeeded(e) { + if (this._options.promptTimeOnDateChange) { + if (!e.oldDate && this._options.useCurrent) { + // First time ever. If useCurrent option is set to true (default), do nothing + // because the first date is selected automatically. + return; + } else if (e.oldDate && e.date && (e.oldDate.format('YYYY-MM-DD') === e.date.format('YYYY-MM-DD') || e.oldDate.format('YYYY-MM-DD') !== e.date.format('YYYY-MM-DD') && e.oldDate.format('HH:mm:ss') !== e.date.format('HH:mm:ss'))) { + // Date didn't change (time did) or date changed because time did. + return; + } + + var that = this; + clearTimeout(this._currentPromptTimeTimeout); + this._currentPromptTimeTimeout = setTimeout(function () { + if (that.widget) { + that.widget.find('[data-action="togglePicker"]').click(); + } + }, this._options.promptTimeOnDateChangeTransitionDelay); + } + }; + + _proto._viewUpdate = function _viewUpdate(e) { + if (e === 'y') { + e = 'YYYY'; + } + + this._notifyEvent({ + type: DateTimePicker.Event.UPDATE, + change: e, + viewDate: this._viewDate.clone() + }); + }; + + _proto._showMode = function _showMode(dir) { + if (!this.widget) { + return; + } + + if (dir) { + this.currentViewMode = Math.max(this.MinViewModeNumber, Math.min(3, this.currentViewMode + dir)); + } + + this.widget.find('.datepicker > div').hide().filter(".datepicker-" + DatePickerModes[this.currentViewMode].CLASS_NAME).show(); + }; + + _proto._isInDisabledDates = function _isInDisabledDates(testDate) { + return this._options.disabledDates[testDate.format('YYYY-MM-DD')] === true; + }; + + _proto._isInEnabledDates = function _isInEnabledDates(testDate) { + return this._options.enabledDates[testDate.format('YYYY-MM-DD')] === true; + }; + + _proto._isInDisabledHours = function _isInDisabledHours(testDate) { + return this._options.disabledHours[testDate.format('H')] === true; + }; + + _proto._isInEnabledHours = function _isInEnabledHours(testDate) { + return this._options.enabledHours[testDate.format('H')] === true; + }; + + _proto._isValid = function _isValid(targetMoment, granularity) { + if (!targetMoment || !targetMoment.isValid()) { + return false; + } + + if (this._options.disabledDates && granularity === 'd' && this._isInDisabledDates(targetMoment)) { + return false; + } + + if (this._options.enabledDates && granularity === 'd' && !this._isInEnabledDates(targetMoment)) { + return false; + } + + if (this._options.minDate && targetMoment.isBefore(this._options.minDate, granularity)) { + return false; + } + + if (this._options.maxDate && targetMoment.isAfter(this._options.maxDate, granularity)) { + return false; + } + + if (this._options.daysOfWeekDisabled && granularity === 'd' && this._options.daysOfWeekDisabled.indexOf(targetMoment.day()) !== -1) { + return false; + } + + if (this._options.disabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && this._isInDisabledHours(targetMoment)) { + return false; + } + + if (this._options.enabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && !this._isInEnabledHours(targetMoment)) { + return false; + } + + if (this._options.disabledTimeIntervals && (granularity === 'h' || granularity === 'm' || granularity === 's')) { + var found = false; + $.each(this._options.disabledTimeIntervals, function () { + if (targetMoment.isBetween(this[0], this[1])) { + found = true; return false; - }; + } + }); + + if (found) { + return false; + } + } + + return true; + }; + + _proto._parseInputDate = function _parseInputDate(inputDate, _temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$isPickerShow = _ref.isPickerShow, + isPickerShow = _ref$isPickerShow === void 0 ? false : _ref$isPickerShow; + + if (this._options.parseInputDate === undefined || isPickerShow) { + if (!moment.isMoment(inputDate)) { + inputDate = this.getMoment(inputDate); + } + } else { + inputDate = this._options.parseInputDate(inputDate); + } //inputDate.locale(this.options.locale); + + + return inputDate; + }; + + _proto._keydown = function _keydown(e) { + var handler = null, + index, + index2, + keyBindKeys, + allModifiersPressed; + var pressedKeys = [], + pressedModifiers = {}, + currentKey = e.which, + pressed = 'p'; + keyState[currentKey] = pressed; + + for (index in keyState) { + if (keyState.hasOwnProperty(index) && keyState[index] === pressed) { + pressedKeys.push(index); + + if (parseInt(index, 10) !== currentKey) { + pressedModifiers[index] = true; + } + } + } + + for (index in this._options.keyBinds) { + if (this._options.keyBinds.hasOwnProperty(index) && typeof this._options.keyBinds[index] === 'function') { + keyBindKeys = index.split(' '); + + if (keyBindKeys.length === pressedKeys.length && KeyMap[currentKey] === keyBindKeys[keyBindKeys.length - 1]) { + allModifiersPressed = true; + + for (index2 = keyBindKeys.length - 2; index2 >= 0; index2--) { + if (!(KeyMap[keyBindKeys[index2]] in pressedModifiers)) { + allModifiersPressed = false; + break; + } + } + + if (allModifiersPressed) { + handler = this._options.keyBinds[index]; + break; + } + } + } + } + + if (handler) { + if (handler.call(this)) { + e.stopPropagation(); + e.preventDefault(); + } + } + } //noinspection JSMethodCanBeStatic,SpellCheckingInspection + ; + + _proto._keyup = function _keyup(e) { + keyState[e.which] = 'r'; + + if (keyPressHandled[e.which]) { + keyPressHandled[e.which] = false; + e.stopPropagation(); + e.preventDefault(); + } + }; + + _proto._indexGivenDates = function _indexGivenDates(givenDatesArray) { + // Store given enabledDates and disabledDates as keys. + // This way we can check their existence in O(1) time instead of looping through whole array. + // (for example: options.enabledDates['2014-02-27'] === true) + var givenDatesIndexed = {}, + self = this; + $.each(givenDatesArray, function () { + var dDate = self._parseInputDate(this); + + if (dDate.isValid()) { + givenDatesIndexed[dDate.format('YYYY-MM-DD')] = true; + } + }); + return Object.keys(givenDatesIndexed).length ? givenDatesIndexed : false; + }; + + _proto._indexGivenHours = function _indexGivenHours(givenHoursArray) { + // Store given enabledHours and disabledHours as keys. + // This way we can check their existence in O(1) time instead of looping through whole array. + // (for example: options.enabledHours['2014-02-27'] === true) + var givenHoursIndexed = {}; + $.each(givenHoursArray, function () { + givenHoursIndexed[this] = true; + }); + return Object.keys(givenHoursIndexed).length ? givenHoursIndexed : false; + }; + + _proto._initFormatting = function _initFormatting() { + var format = this._options.format || 'L LT', + self = this; + this.actualFormat = format.replace(/(\[[^\[]*])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput) { + return (self.isInitFormatting && self._options.date === null ? self.getMoment() : self._dates[0]).localeData().longDateFormat(formatInput) || formatInput; //todo taking the first date should be ok + }); + this.parseFormats = this._options.extraFormats ? this._options.extraFormats.slice() : []; + + if (this.parseFormats.indexOf(format) < 0 && this.parseFormats.indexOf(this.actualFormat) < 0) { + this.parseFormats.push(this.actualFormat); + } + + this.use24Hours = this.actualFormat.toLowerCase().indexOf('a') < 1 && this.actualFormat.replace(/\[.*?]/g, '').indexOf('h') < 1; + + if (this._isEnabled('y')) { + this.MinViewModeNumber = 2; + } + + if (this._isEnabled('M')) { + this.MinViewModeNumber = 1; + } + + if (this._isEnabled('d')) { + this.MinViewModeNumber = 0; + } + + this.currentViewMode = Math.max(this.MinViewModeNumber, this.currentViewMode); + + if (!this.unset) { + this._setValue(this._dates[0], 0); + } + }; + + _proto._getLastPickedDate = function _getLastPickedDate() { + var lastPickedDate = this._dates[this._getLastPickedDateIndex()]; + + if (!lastPickedDate && this._options.allowMultidate) { + lastPickedDate = moment(new Date()); + } + + return lastPickedDate; + }; + + _proto._getLastPickedDateIndex = function _getLastPickedDateIndex() { + return this._dates.length - 1; + } //public + ; + + _proto.getMoment = function getMoment(d) { + var returnMoment; + + if (d === undefined || d === null) { + // TODO: Should this use format? + returnMoment = moment().clone().locale(this._options.locale); + } else if (this._hasTimeZone()) { + // There is a string to parse and a default time zone + // parse with the tz function which takes a default time zone if it is not in the format string + returnMoment = moment.tz(d, this.parseFormats, this._options.locale, this._options.useStrict, this._options.timeZone); + } else { + returnMoment = moment(d, this.parseFormats, this._options.locale, this._options.useStrict); + } + + if (this._hasTimeZone()) { + returnMoment.tz(this._options.timeZone); + } + + return returnMoment; + }; + + _proto.toggle = function toggle() { + return this.widget ? this.hide() : this.show(); + }; + + _proto.readonly = function readonly(_readonly) { + if (arguments.length === 0) { + return this._options.readonly; + } + + if (typeof _readonly !== 'boolean') { + throw new TypeError('readonly() expects a boolean parameter'); + } + + this._options.readonly = _readonly; + + if (this.input !== undefined) { + this.input.prop('readonly', this._options.readonly); + } + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto.ignoreReadonly = function ignoreReadonly(_ignoreReadonly) { + if (arguments.length === 0) { + return this._options.ignoreReadonly; + } + + if (typeof _ignoreReadonly !== 'boolean') { + throw new TypeError('ignoreReadonly() expects a boolean parameter'); + } + + this._options.ignoreReadonly = _ignoreReadonly; + }; + + _proto.options = function options(newOptions) { + if (arguments.length === 0) { + return $.extend(true, {}, this._options); + } + + if (!(newOptions instanceof Object)) { + throw new TypeError('options() this.options parameter should be an object'); + } + + $.extend(true, this._options, newOptions); + var self = this, + optionsKeys = Object.keys(this._options).sort(optionsSortFn); + $.each(optionsKeys, function (i, key) { + var value = self._options[key]; + + if (self[key] !== undefined) { + if (self.isInit && key === 'date') { + self.hasInitDate = true; + self.initDate = value; + return; + } + + self[key](value); + } + }); + }; + + _proto.date = function date(newDate, index) { + index = index || 0; + + if (arguments.length === 0) { + if (this.unset) { + return null; + } + + if (this._options.allowMultidate) { + return this._dates.join(this._options.multidateSeparator); + } else { + return this._dates[index].clone(); + } + } - //noinspection JSMethodCanBeStatic + if (newDate !== null && typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { + throw new TypeError('date() parameter must be one of [null, string, moment or Date]'); + } + + if (typeof newDate === 'string' && isValidDateTimeStr(newDate)) { + newDate = new Date(newDate); + } + this._setValue(newDate === null ? null : this._parseInputDate(newDate), index); + }; - DateTimePicker.prototype._getOptions = function _getOptions(options) { - options = $.extend(true, {}, Default, options); - return options; - }; + _proto.updateOnlyThroughDateOption = function updateOnlyThroughDateOption(_updateOnlyThroughDateOption) { + if (typeof _updateOnlyThroughDateOption !== 'boolean') { + throw new TypeError('updateOnlyThroughDateOption() expects a boolean parameter'); + } - DateTimePicker.prototype._hasTimeZone = function _hasTimeZone() { - return moment.tz !== undefined && this._options.timeZone !== undefined && this._options.timeZone !== null && this._options.timeZone !== ''; - }; + this._options.updateOnlyThroughDateOption = _updateOnlyThroughDateOption; + }; - DateTimePicker.prototype._isEnabled = function _isEnabled(granularity) { - if (typeof granularity !== 'string' || granularity.length > 1) { - throw new TypeError('isEnabled expects a single character string parameter'); - } - switch (granularity) { - case 'y': - return this.actualFormat.indexOf('Y') !== -1; - case 'M': - return this.actualFormat.indexOf('M') !== -1; - case 'd': - return this.actualFormat.toLowerCase().indexOf('d') !== -1; - case 'h': - case 'H': - return this.actualFormat.toLowerCase().indexOf('h') !== -1; - case 'm': - return this.actualFormat.indexOf('m') !== -1; - case 's': - return this.actualFormat.indexOf('s') !== -1; - case 'a': - case 'A': - return this.actualFormat.toLowerCase().indexOf('a') !== -1; - default: - return false; - } - }; + _proto.format = function format(newFormat) { + if (arguments.length === 0) { + return this._options.format; + } - DateTimePicker.prototype._hasTime = function _hasTime() { - return this._isEnabled('h') || this._isEnabled('m') || this._isEnabled('s'); - }; + if (typeof newFormat !== 'string' && (typeof newFormat !== 'boolean' || newFormat !== false)) { + throw new TypeError("format() expects a string or boolean:false parameter " + newFormat); + } - DateTimePicker.prototype._hasDate = function _hasDate() { - return this._isEnabled('y') || this._isEnabled('M') || this._isEnabled('d'); - }; + this._options.format = newFormat; - DateTimePicker.prototype._dataToOptions = function _dataToOptions() { - var eData = this._element.data(); - var dataOptions = {}; + if (this.actualFormat) { + this._initFormatting(); // reinitialize formatting - if (eData.dateOptions && eData.dateOptions instanceof Object) { - dataOptions = $.extend(true, dataOptions, eData.dateOptions); - } + } + }; - $.each(this._options, function (key) { - var attributeName = 'date' + key.charAt(0).toUpperCase() + key.slice(1); //todo data api key - if (eData[attributeName] !== undefined) { - dataOptions[key] = eData[attributeName]; - } else { - delete dataOptions[key]; - } - }); - return dataOptions; - }; - - DateTimePicker.prototype._notifyEvent = function _notifyEvent(e) { - if (e.type === DateTimePicker.Event.CHANGE && (e.date && e.date.isSame(e.oldDate)) || !e.date && !e.oldDate) { - return; - } - this._element.trigger(e); - }; + _proto.timeZone = function timeZone(newZone) { + if (arguments.length === 0) { + return this._options.timeZone; + } - DateTimePicker.prototype._viewUpdate = function _viewUpdate(e) { - if (e === 'y') { - e = 'YYYY'; - } - this._notifyEvent({ - type: DateTimePicker.Event.UPDATE, - change: e, - viewDate: this._viewDate.clone() - }); - }; - - DateTimePicker.prototype._showMode = function _showMode(dir) { - if (!this.widget) { - return; - } - if (dir) { - this.currentViewMode = Math.max(this.MinViewModeNumber, Math.min(3, this.currentViewMode + dir)); - } - this.widget.find('.datepicker > div').hide().filter('.datepicker-' + DatePickerModes[this.currentViewMode].CLASS_NAME).show(); - }; + if (typeof newZone !== 'string') { + throw new TypeError('newZone() expects a string parameter'); + } - DateTimePicker.prototype._isInDisabledDates = function _isInDisabledDates(testDate) { - return this._options.disabledDates[testDate.format('YYYY-MM-DD')] === true; - }; + this._options.timeZone = newZone; + }; - DateTimePicker.prototype._isInEnabledDates = function _isInEnabledDates(testDate) { - return this._options.enabledDates[testDate.format('YYYY-MM-DD')] === true; - }; + _proto.dayViewHeaderFormat = function dayViewHeaderFormat(newFormat) { + if (arguments.length === 0) { + return this._options.dayViewHeaderFormat; + } - DateTimePicker.prototype._isInDisabledHours = function _isInDisabledHours(testDate) { - return this._options.disabledHours[testDate.format('H')] === true; - }; + if (typeof newFormat !== 'string') { + throw new TypeError('dayViewHeaderFormat() expects a string parameter'); + } - DateTimePicker.prototype._isInEnabledHours = function _isInEnabledHours(testDate) { - return this._options.enabledHours[testDate.format('H')] === true; - }; + this._options.dayViewHeaderFormat = newFormat; + }; - DateTimePicker.prototype._isValid = function _isValid(targetMoment, granularity) { - if (!targetMoment.isValid()) { - return false; - } - if (this._options.disabledDates && granularity === 'd' && this._isInDisabledDates(targetMoment)) { - return false; - } - if (this._options.enabledDates && granularity === 'd' && !this._isInEnabledDates(targetMoment)) { - return false; - } - if (this._options.minDate && targetMoment.isBefore(this._options.minDate, granularity)) { - return false; - } - if (this._options.maxDate && targetMoment.isAfter(this._options.maxDate, granularity)) { - return false; - } - if (this._options.daysOfWeekDisabled && granularity === 'd' && this._options.daysOfWeekDisabled.indexOf(targetMoment.day()) !== -1) { - return false; - } - if (this._options.disabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && this._isInDisabledHours(targetMoment)) { - return false; - } - if (this._options.enabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && !this._isInEnabledHours(targetMoment)) { - return false; - } - if (this._options.disabledTimeIntervals && (granularity === 'h' || granularity === 'm' || granularity === 's')) { - var found = false; - $.each(this._options.disabledTimeIntervals, function () { - if (targetMoment.isBetween(this[0], this[1])) { - found = true; - return false; - } - }); - if (found) { - return false; - } - } - return true; - }; - - DateTimePicker.prototype._parseInputDate = function _parseInputDate(inputDate) { - if (this._options.parseInputDate === undefined) { - if (!moment.isMoment(inputDate)) { - inputDate = this.getMoment(inputDate); - } - } else { - inputDate = this._options.parseInputDate(inputDate); - } - //inputDate.locale(this.options.locale); - return inputDate; - }; - - DateTimePicker.prototype._keydown = function _keydown(e) { - var handler = null, - index = void 0, - index2 = void 0, - keyBindKeys = void 0, - allModifiersPressed = void 0; - var pressedKeys = [], - pressedModifiers = {}, - currentKey = e.which, - pressed = 'p'; - - keyState[currentKey] = pressed; - - for (index in keyState) { - if (keyState.hasOwnProperty(index) && keyState[index] === pressed) { - pressedKeys.push(index); - if (parseInt(index, 10) !== currentKey) { - pressedModifiers[index] = true; - } - } - } + _proto.extraFormats = function extraFormats(formats) { + if (arguments.length === 0) { + return this._options.extraFormats; + } - for (index in this._options.keyBinds) { - if (this._options.keyBinds.hasOwnProperty(index) && typeof this._options.keyBinds[index] === 'function') { - keyBindKeys = index.split(' '); - if (keyBindKeys.length === pressedKeys.length && KeyMap[currentKey] === keyBindKeys[keyBindKeys.length - 1]) { - allModifiersPressed = true; - for (index2 = keyBindKeys.length - 2; index2 >= 0; index2--) { - if (!(KeyMap[keyBindKeys[index2]] in pressedModifiers)) { - allModifiersPressed = false; - break; - } - } - if (allModifiersPressed) { - handler = this._options.keyBinds[index]; - break; - } - } - } - } + if (formats !== false && !(formats instanceof Array)) { + throw new TypeError('extraFormats() expects an array or false parameter'); + } - if (handler) { - if (handler.call(this)) { - e.stopPropagation(); - e.preventDefault(); - } - } - }; + this._options.extraFormats = formats; - //noinspection JSMethodCanBeStatic,SpellCheckingInspection + if (this.parseFormats) { + this._initFormatting(); // reinit formatting + } + }; - DateTimePicker.prototype._keyup = function _keyup(e) { - keyState[e.which] = 'r'; - if (keyPressHandled[e.which]) { - keyPressHandled[e.which] = false; - e.stopPropagation(); - e.preventDefault(); - } - }; - - DateTimePicker.prototype._indexGivenDates = function _indexGivenDates(givenDatesArray) { - // Store given enabledDates and disabledDates as keys. - // This way we can check their existence in O(1) time instead of looping through whole array. - // (for example: options.enabledDates['2014-02-27'] === true) - var givenDatesIndexed = {}, - self = this; - $.each(givenDatesArray, function () { - var dDate = self._parseInputDate(this); - if (dDate.isValid()) { - givenDatesIndexed[dDate.format('YYYY-MM-DD')] = true; - } - }); - return Object.keys(givenDatesIndexed).length ? givenDatesIndexed : false; - }; - - DateTimePicker.prototype._indexGivenHours = function _indexGivenHours(givenHoursArray) { - // Store given enabledHours and disabledHours as keys. - // This way we can check their existence in O(1) time instead of looping through whole array. - // (for example: options.enabledHours['2014-02-27'] === true) - var givenHoursIndexed = {}; - $.each(givenHoursArray, function () { - givenHoursIndexed[this] = true; - }); - return Object.keys(givenHoursIndexed).length ? givenHoursIndexed : false; - }; - - DateTimePicker.prototype._initFormatting = function _initFormatting() { - var format = this._options.format || 'L LT', - self = this; - - this.actualFormat = format.replace(/(\[[^\[]*])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput) { - return self._dates[0].localeData().longDateFormat(formatInput) || formatInput; //todo taking the first date should be ok - }); - - this.parseFormats = this._options.extraFormats ? this._options.extraFormats.slice() : []; - if (this.parseFormats.indexOf(format) < 0 && this.parseFormats.indexOf(this.actualFormat) < 0) { - this.parseFormats.push(this.actualFormat); - } + _proto.disabledDates = function disabledDates(dates) { + if (arguments.length === 0) { + return this._options.disabledDates ? $.extend({}, this._options.disabledDates) : this._options.disabledDates; + } - this.use24Hours = this.actualFormat.toLowerCase().indexOf('a') < 1 && this.actualFormat.replace(/\[.*?]/g, '').indexOf('h') < 1; + if (!dates) { + this._options.disabledDates = false; - if (this._isEnabled('y')) { - this.MinViewModeNumber = 2; - } - if (this._isEnabled('M')) { - this.MinViewModeNumber = 1; - } - if (this._isEnabled('d')) { - this.MinViewModeNumber = 0; - } + this._update(); - this.currentViewMode = Math.max(this.MinViewModeNumber, this.currentViewMode); + return true; + } - if (!this.unset) { - this._setValue(this._dates[0], 0); - } - }; + if (!(dates instanceof Array)) { + throw new TypeError('disabledDates() expects an array parameter'); + } - DateTimePicker.prototype._getLastPickedDate = function _getLastPickedDate() { - return this._dates[this._getLastPickedDateIndex()]; - }; + this._options.disabledDates = this._indexGivenDates(dates); + this._options.enabledDates = false; - DateTimePicker.prototype._getLastPickedDateIndex = function _getLastPickedDateIndex() { - return this._dates.length - 1; - }; + this._update(); + }; - //public + _proto.enabledDates = function enabledDates(dates) { + if (arguments.length === 0) { + return this._options.enabledDates ? $.extend({}, this._options.enabledDates) : this._options.enabledDates; + } + if (!dates) { + this._options.enabledDates = false; - DateTimePicker.prototype.getMoment = function getMoment(d) { - var returnMoment = void 0; + this._update(); - if (d === undefined || d === null) { - returnMoment = moment(); //TODO should this use format? and locale? - } else if (this._hasTimeZone()) { - // There is a string to parse and a default time zone - // parse with the tz function which takes a default time zone if it is not in the format string - returnMoment = moment.tz(d, this.parseFormats, this._options.locale, this._options.useStrict, this._options.timeZone); - } else { - returnMoment = moment(d, this.parseFormats, this._options.locale, this._options.useStrict); - } + return true; + } - if (this._hasTimeZone()) { - returnMoment.tz(this._options.timeZone); - } + if (!(dates instanceof Array)) { + throw new TypeError('enabledDates() expects an array parameter'); + } - return returnMoment; - }; + this._options.enabledDates = this._indexGivenDates(dates); + this._options.disabledDates = false; - DateTimePicker.prototype.toggle = function toggle() { - return this.widget ? this.hide() : this.show(); - }; + this._update(); + }; - DateTimePicker.prototype.ignoreReadonly = function ignoreReadonly(_ignoreReadonly) { - if (arguments.length === 0) { - return this._options.ignoreReadonly; - } - if (typeof _ignoreReadonly !== 'boolean') { - throw new TypeError('ignoreReadonly () expects a boolean parameter'); - } - this._options.ignoreReadonly = _ignoreReadonly; - }; + _proto.daysOfWeekDisabled = function daysOfWeekDisabled(_daysOfWeekDisabled) { + if (arguments.length === 0) { + return this._options.daysOfWeekDisabled.splice(0); + } - DateTimePicker.prototype.options = function options(newOptions) { - if (arguments.length === 0) { - return $.extend(true, {}, this._options); - } + if (typeof _daysOfWeekDisabled === 'boolean' && !_daysOfWeekDisabled) { + this._options.daysOfWeekDisabled = false; - if (!(newOptions instanceof Object)) { - throw new TypeError('options() this.options parameter should be an object'); - } - $.extend(true, this._options, newOptions); - var self = this; - $.each(this._options, function (key, value) { - if (self[key] !== undefined) { - self[key](value); - } - }); - }; - - DateTimePicker.prototype.date = function date(newDate, index) { - index = index || 0; - if (arguments.length === 0) { - if (this.unset) { - return null; - } - if (this._options.allowMultidate) { - return this._dates.join(this._options.multidateSeparator); - } else { - return this._dates[index].clone(); - } - } + this._update(); - if (newDate !== null && typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { - throw new TypeError('date() parameter must be one of [null, string, moment or Date]'); - } + return true; + } - this._setValue(newDate === null ? null : this._parseInputDate(newDate), index); - }; + if (!(_daysOfWeekDisabled instanceof Array)) { + throw new TypeError('daysOfWeekDisabled() expects an array parameter'); + } - DateTimePicker.prototype.format = function format(newFormat) { - if (arguments.length === 0) { - return this._options.format; - } + this._options.daysOfWeekDisabled = _daysOfWeekDisabled.reduce(function (previousValue, currentValue) { + currentValue = parseInt(currentValue, 10); - if (typeof newFormat !== 'string' && (typeof newFormat !== 'boolean' || newFormat !== false)) { - throw new TypeError('format() expects a string or boolean:false parameter ' + newFormat); - } + if (currentValue > 6 || currentValue < 0 || isNaN(currentValue)) { + return previousValue; + } - this._options.format = newFormat; - if (this.actualFormat) { - this._initFormatting(); // reinitialize formatting - } - }; + if (previousValue.indexOf(currentValue) === -1) { + previousValue.push(currentValue); + } - DateTimePicker.prototype.timeZone = function timeZone(newZone) { - if (arguments.length === 0) { - return this._options.timeZone; - } + return previousValue; + }, []).sort(); - if (typeof newZone !== 'string') { - throw new TypeError('newZone() expects a string parameter'); - } + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; - this._options.timeZone = newZone; - }; + while (!this._isValid(this._dates[i], 'd')) { + this._dates[i].add(1, 'd'); - DateTimePicker.prototype.dayViewHeaderFormat = function dayViewHeaderFormat(newFormat) { - if (arguments.length === 0) { - return this._options.dayViewHeaderFormat; + if (tries === 31) { + throw 'Tried 31 times to find a valid date'; } - if (typeof newFormat !== 'string') { - throw new TypeError('dayViewHeaderFormat() expects a string parameter'); - } + tries++; + } - this._options.dayViewHeaderFormat = newFormat; - }; + this._setValue(this._dates[i], i); + } + } - DateTimePicker.prototype.extraFormats = function extraFormats(formats) { - if (arguments.length === 0) { - return this._options.extraFormats; - } + this._update(); + }; - if (formats !== false && !(formats instanceof Array)) { - throw new TypeError('extraFormats() expects an array or false parameter'); - } + _proto.maxDate = function maxDate(_maxDate) { + if (arguments.length === 0) { + return this._options.maxDate ? this._options.maxDate.clone() : this._options.maxDate; + } - this._options.extraFormats = formats; - if (this.parseFormats) { - this._initFormatting(); // reinit formatting - } - }; + if (typeof _maxDate === 'boolean' && _maxDate === false) { + this._options.maxDate = false; - DateTimePicker.prototype.disabledDates = function disabledDates(dates) { - if (arguments.length === 0) { - return this._options.disabledDates ? $.extend({}, this._options.disabledDates) : this._options.disabledDates; - } + this._update(); - if (!dates) { - this._options.disabledDates = false; - this._update(); - return true; - } - if (!(dates instanceof Array)) { - throw new TypeError('disabledDates() expects an array parameter'); - } - this._options.disabledDates = this._indexGivenDates(dates); - this._options.enabledDates = false; - this._update(); - }; - - DateTimePicker.prototype.enabledDates = function enabledDates(dates) { - if (arguments.length === 0) { - return this._options.enabledDates ? $.extend({}, this._options.enabledDates) : this._options.enabledDates; - } + return true; + } - if (!dates) { - this._options.enabledDates = false; - this._update(); - return true; - } - if (!(dates instanceof Array)) { - throw new TypeError('enabledDates() expects an array parameter'); - } - this._options.enabledDates = this._indexGivenDates(dates); - this._options.disabledDates = false; - this._update(); - }; - - DateTimePicker.prototype.daysOfWeekDisabled = function daysOfWeekDisabled(_daysOfWeekDisabled) { - if (arguments.length === 0) { - return this._options.daysOfWeekDisabled.splice(0); - } + if (typeof _maxDate === 'string') { + if (_maxDate === 'now' || _maxDate === 'moment') { + _maxDate = this.getMoment(); + } + } - if (typeof _daysOfWeekDisabled === 'boolean' && !_daysOfWeekDisabled) { - this._options.daysOfWeekDisabled = false; - this._update(); - return true; - } + var parsedDate = this._parseInputDate(_maxDate); - if (!(_daysOfWeekDisabled instanceof Array)) { - throw new TypeError('daysOfWeekDisabled() expects an array parameter'); - } - this._options.daysOfWeekDisabled = _daysOfWeekDisabled.reduce(function (previousValue, currentValue) { - currentValue = parseInt(currentValue, 10); - if (currentValue > 6 || currentValue < 0 || isNaN(currentValue)) { - return previousValue; - } - if (previousValue.indexOf(currentValue) === -1) { - previousValue.push(currentValue); - } - return previousValue; - }, []).sort(); - if (this._options.useCurrent && !this._options.keepInvalid) { - for (var i = 0; i < this._dates.length; i++) { - var tries = 0; - while (!this._isValid(this._dates[i], 'd')) { - this._dates[i].add(1, 'd'); - if (tries === 31) { - throw 'Tried 31 times to find a valid date'; - } - tries++; - } - this._setValue(this._dates[i], i); - } - } - this._update(); - }; + if (!parsedDate.isValid()) { + throw new TypeError("maxDate() Could not parse date parameter: " + _maxDate); + } - DateTimePicker.prototype.maxDate = function maxDate(_maxDate) { - if (arguments.length === 0) { - return this._options.maxDate ? this._options.maxDate.clone() : this._options.maxDate; - } + if (this._options.minDate && parsedDate.isBefore(this._options.minDate)) { + throw new TypeError("maxDate() date parameter is before this.options.minDate: " + parsedDate.format(this.actualFormat)); + } - if (typeof _maxDate === 'boolean' && _maxDate === false) { - this._options.maxDate = false; - this._update(); - return true; - } + this._options.maxDate = parsedDate; - if (typeof _maxDate === 'string') { - if (_maxDate === 'now' || _maxDate === 'moment') { - _maxDate = this.getMoment(); - } - } + for (var i = 0; i < this._dates.length; i++) { + if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isAfter(_maxDate)) { + this._setValue(this._options.maxDate, i); + } + } - var parsedDate = this._parseInputDate(_maxDate); + if (this._viewDate.isAfter(parsedDate)) { + this._viewDate = parsedDate.clone().subtract(this._options.stepping, 'm'); + } - if (!parsedDate.isValid()) { - throw new TypeError('maxDate() Could not parse date parameter: ' + _maxDate); - } - if (this._options.minDate && parsedDate.isBefore(this._options.minDate)) { - throw new TypeError('maxDate() date parameter is before this.options.minDate: ' + parsedDate.format(this.actualFormat)); - } - this._options.maxDate = parsedDate; - for (var i = 0; i < this._dates.length; i++) { - if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isAfter(_maxDate)) { - this._setValue(this._options.maxDate, i); - } - } - if (this._viewDate.isAfter(parsedDate)) { - this._viewDate = parsedDate.clone().subtract(this._options.stepping, 'm'); - } - this._update(); - }; + this._update(); + }; - DateTimePicker.prototype.minDate = function minDate(_minDate) { - if (arguments.length === 0) { - return this._options.minDate ? this._options.minDate.clone() : this._options.minDate; - } + _proto.minDate = function minDate(_minDate) { + if (arguments.length === 0) { + return this._options.minDate ? this._options.minDate.clone() : this._options.minDate; + } - if (typeof _minDate === 'boolean' && _minDate === false) { - this._options.minDate = false; - this._update(); - return true; - } + if (typeof _minDate === 'boolean' && _minDate === false) { + this._options.minDate = false; - if (typeof _minDate === 'string') { - if (_minDate === 'now' || _minDate === 'moment') { - _minDate = this.getMoment(); - } - } + this._update(); - var parsedDate = this._parseInputDate(_minDate); + return true; + } - if (!parsedDate.isValid()) { - throw new TypeError('minDate() Could not parse date parameter: ' + _minDate); - } - if (this._options.maxDate && parsedDate.isAfter(this._options.maxDate)) { - throw new TypeError('minDate() date parameter is after this.options.maxDate: ' + parsedDate.format(this.actualFormat)); - } - this._options.minDate = parsedDate; - for (var i = 0; i < this._dates.length; i++) { - if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isBefore(_minDate)) { - this._setValue(this._options.minDate, i); - } - } - if (this._viewDate.isBefore(parsedDate)) { - this._viewDate = parsedDate.clone().add(this._options.stepping, 'm'); - } - this._update(); - }; + if (typeof _minDate === 'string') { + if (_minDate === 'now' || _minDate === 'moment') { + _minDate = this.getMoment(); + } + } - DateTimePicker.prototype.defaultDate = function defaultDate(_defaultDate) { - if (arguments.length === 0) { - return this._options.defaultDate ? this._options.defaultDate.clone() : this._options.defaultDate; - } - if (!_defaultDate) { - this._options.defaultDate = false; - return true; - } + var parsedDate = this._parseInputDate(_minDate); - if (typeof _defaultDate === 'string') { - if (_defaultDate === 'now' || _defaultDate === 'moment') { - _defaultDate = this.getMoment(); - } else { - _defaultDate = this.getMoment(_defaultDate); - } - } + if (!parsedDate.isValid()) { + throw new TypeError("minDate() Could not parse date parameter: " + _minDate); + } - var parsedDate = this._parseInputDate(_defaultDate); - if (!parsedDate.isValid()) { - throw new TypeError('defaultDate() Could not parse date parameter: ' + _defaultDate); - } - if (!this._isValid(parsedDate)) { - throw new TypeError('defaultDate() date passed is invalid according to component setup validations'); - } + if (this._options.maxDate && parsedDate.isAfter(this._options.maxDate)) { + throw new TypeError("minDate() date parameter is after this.options.maxDate: " + parsedDate.format(this.actualFormat)); + } - this._options.defaultDate = parsedDate; + this._options.minDate = parsedDate; - if (this._options.defaultDate && this._options.inline || this.input !== undefined && this.input.val().trim() === '') { - this._setValue(this._options.defaultDate, 0); - } - }; + for (var i = 0; i < this._dates.length; i++) { + if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isBefore(_minDate)) { + this._setValue(this._options.minDate, i); + } + } - DateTimePicker.prototype.locale = function locale(_locale) { - if (arguments.length === 0) { - return this._options.locale; - } + if (this._viewDate.isBefore(parsedDate)) { + this._viewDate = parsedDate.clone().add(this._options.stepping, 'm'); + } - if (!moment.localeData(_locale)) { - throw new TypeError('locale() locale ' + _locale + ' is not loaded from moment locales!'); - } + this._update(); + }; - this._options.locale = _locale; + _proto.defaultDate = function defaultDate(_defaultDate) { + if (arguments.length === 0) { + return this._options.defaultDate ? this._options.defaultDate.clone() : this._options.defaultDate; + } - for (var i = 0; i < this._dates.length; i++) { - this._dates[i].locale(this._options.locale); - } - this._viewDate.locale(this._options.locale); + if (!_defaultDate) { + this._options.defaultDate = false; + return true; + } - if (this.actualFormat) { - this._initFormatting(); // reinitialize formatting - } - if (this.widget) { - this.hide(); - this.show(); - } - }; + if (typeof _defaultDate === 'string') { + if (_defaultDate === 'now' || _defaultDate === 'moment') { + _defaultDate = this.getMoment(); + } else { + _defaultDate = this.getMoment(_defaultDate); + } + } - DateTimePicker.prototype.stepping = function stepping(_stepping) { - if (arguments.length === 0) { - return this._options.stepping; - } + var parsedDate = this._parseInputDate(_defaultDate); - _stepping = parseInt(_stepping, 10); - if (isNaN(_stepping) || _stepping < 1) { - _stepping = 1; - } - this._options.stepping = _stepping; - }; + if (!parsedDate.isValid()) { + throw new TypeError("defaultDate() Could not parse date parameter: " + _defaultDate); + } - DateTimePicker.prototype.useCurrent = function useCurrent(_useCurrent) { - var useCurrentOptions = ['year', 'month', 'day', 'hour', 'minute']; - if (arguments.length === 0) { - return this._options.useCurrent; - } + if (!this._isValid(parsedDate)) { + throw new TypeError('defaultDate() date passed is invalid according to component setup validations'); + } - if (typeof _useCurrent !== 'boolean' && typeof _useCurrent !== 'string') { - throw new TypeError('useCurrent() expects a boolean or string parameter'); - } - if (typeof _useCurrent === 'string' && useCurrentOptions.indexOf(_useCurrent.toLowerCase()) === -1) { - throw new TypeError('useCurrent() expects a string parameter of ' + useCurrentOptions.join(', ')); - } - this._options.useCurrent = _useCurrent; - }; + this._options.defaultDate = parsedDate; - DateTimePicker.prototype.collapse = function collapse(_collapse) { - if (arguments.length === 0) { - return this._options.collapse; - } + if (this._options.defaultDate && this._options.inline || this.input !== undefined && this.input.val().trim() === '') { + this._setValue(this._options.defaultDate, 0); + } + }; - if (typeof _collapse !== 'boolean') { - throw new TypeError('collapse() expects a boolean parameter'); - } - if (this._options.collapse === _collapse) { - return true; - } - this._options.collapse = _collapse; - if (this.widget) { - this.hide(); - this.show(); - } - }; + _proto.locale = function locale(_locale) { + if (arguments.length === 0) { + return this._options.locale; + } - DateTimePicker.prototype.icons = function icons(_icons) { - if (arguments.length === 0) { - return $.extend({}, this._options.icons); - } + if (!moment.localeData(_locale)) { + throw new TypeError("locale() locale " + _locale + " is not loaded from moment locales!"); + } - if (!(_icons instanceof Object)) { - throw new TypeError('icons() expects parameter to be an Object'); - } + this._options.locale = _locale; - $.extend(this._options.icons, _icons); + for (var i = 0; i < this._dates.length; i++) { + this._dates[i].locale(this._options.locale); + } - if (this.widget) { - this.hide(); - this.show(); - } - }; + this._viewDate.locale(this._options.locale); - DateTimePicker.prototype.tooltips = function tooltips(_tooltips) { - if (arguments.length === 0) { - return $.extend({}, this._options.tooltips); - } + if (this.actualFormat) { + this._initFormatting(); // reinitialize formatting - if (!(_tooltips instanceof Object)) { - throw new TypeError('tooltips() expects parameter to be an Object'); - } - $.extend(this._options.tooltips, _tooltips); - if (this.widget) { - this.hide(); - this.show(); - } - }; + } - DateTimePicker.prototype.useStrict = function useStrict(_useStrict) { - if (arguments.length === 0) { - return this._options.useStrict; - } + if (this.widget) { + this.hide(); + this.show(); + } + }; - if (typeof _useStrict !== 'boolean') { - throw new TypeError('useStrict() expects a boolean parameter'); - } - this._options.useStrict = _useStrict; - }; + _proto.stepping = function stepping(_stepping) { + if (arguments.length === 0) { + return this._options.stepping; + } - DateTimePicker.prototype.sideBySide = function sideBySide(_sideBySide) { - if (arguments.length === 0) { - return this._options.sideBySide; - } + _stepping = parseInt(_stepping, 10); - if (typeof _sideBySide !== 'boolean') { - throw new TypeError('sideBySide() expects a boolean parameter'); - } - this._options.sideBySide = _sideBySide; - if (this.widget) { - this.hide(); - this.show(); - } - }; + if (isNaN(_stepping) || _stepping < 1) { + _stepping = 1; + } - DateTimePicker.prototype.viewMode = function viewMode(_viewMode) { - if (arguments.length === 0) { - return this._options.viewMode; - } + this._options.stepping = _stepping; + }; - if (typeof _viewMode !== 'string') { - throw new TypeError('viewMode() expects a string parameter'); - } + _proto.useCurrent = function useCurrent(_useCurrent) { + var useCurrentOptions = ['year', 'month', 'day', 'hour', 'minute']; - if (DateTimePicker.ViewModes.indexOf(_viewMode) === -1) { - throw new TypeError('viewMode() parameter must be one of (' + DateTimePicker.ViewModes.join(', ') + ') value'); - } + if (arguments.length === 0) { + return this._options.useCurrent; + } - this._options.viewMode = _viewMode; - this.currentViewMode = Math.max(DateTimePicker.ViewModes.indexOf(_viewMode) - 1, this.MinViewModeNumber); + if (typeof _useCurrent !== 'boolean' && typeof _useCurrent !== 'string') { + throw new TypeError('useCurrent() expects a boolean or string parameter'); + } - this._showMode(); - }; + if (typeof _useCurrent === 'string' && useCurrentOptions.indexOf(_useCurrent.toLowerCase()) === -1) { + throw new TypeError("useCurrent() expects a string parameter of " + useCurrentOptions.join(', ')); + } - DateTimePicker.prototype.calendarWeeks = function calendarWeeks(_calendarWeeks) { - if (arguments.length === 0) { - return this._options.calendarWeeks; - } + this._options.useCurrent = _useCurrent; + }; - if (typeof _calendarWeeks !== 'boolean') { - throw new TypeError('calendarWeeks() expects parameter to be a boolean value'); - } + _proto.collapse = function collapse(_collapse) { + if (arguments.length === 0) { + return this._options.collapse; + } - this._options.calendarWeeks = _calendarWeeks; - this._update(); - }; + if (typeof _collapse !== 'boolean') { + throw new TypeError('collapse() expects a boolean parameter'); + } - DateTimePicker.prototype.buttons = function buttons(_buttons) { - if (arguments.length === 0) { - return $.extend({}, this._options.buttons); - } + if (this._options.collapse === _collapse) { + return true; + } - if (!(_buttons instanceof Object)) { - throw new TypeError('buttons() expects parameter to be an Object'); - } + this._options.collapse = _collapse; - $.extend(this._options.buttons, _buttons); + if (this.widget) { + this.hide(); + this.show(); + } + }; - if (typeof this._options.buttons.showToday !== 'boolean') { - throw new TypeError('buttons.showToday expects a boolean parameter'); - } - if (typeof this._options.buttons.showClear !== 'boolean') { - throw new TypeError('buttons.showClear expects a boolean parameter'); - } - if (typeof this._options.buttons.showClose !== 'boolean') { - throw new TypeError('buttons.showClose expects a boolean parameter'); - } + _proto.icons = function icons(_icons) { + if (arguments.length === 0) { + return $.extend({}, this._options.icons); + } - if (this.widget) { - this.hide(); - this.show(); - } - }; + if (!(_icons instanceof Object)) { + throw new TypeError('icons() expects parameter to be an Object'); + } - DateTimePicker.prototype.keepOpen = function keepOpen(_keepOpen) { - if (arguments.length === 0) { - return this._options.keepOpen; - } + $.extend(this._options.icons, _icons); - if (typeof _keepOpen !== 'boolean') { - throw new TypeError('keepOpen() expects a boolean parameter'); - } + if (this.widget) { + this.hide(); + this.show(); + } + }; - this._options.keepOpen = _keepOpen; - }; + _proto.tooltips = function tooltips(_tooltips) { + if (arguments.length === 0) { + return $.extend({}, this._options.tooltips); + } - DateTimePicker.prototype.focusOnShow = function focusOnShow(_focusOnShow) { - if (arguments.length === 0) { - return this._options.focusOnShow; - } + if (!(_tooltips instanceof Object)) { + throw new TypeError('tooltips() expects parameter to be an Object'); + } - if (typeof _focusOnShow !== 'boolean') { - throw new TypeError('focusOnShow() expects a boolean parameter'); - } + $.extend(this._options.tooltips, _tooltips); - this._options.focusOnShow = _focusOnShow; - }; + if (this.widget) { + this.hide(); + this.show(); + } + }; - DateTimePicker.prototype.inline = function inline(_inline) { - if (arguments.length === 0) { - return this._options.inline; - } + _proto.useStrict = function useStrict(_useStrict) { + if (arguments.length === 0) { + return this._options.useStrict; + } - if (typeof _inline !== 'boolean') { - throw new TypeError('inline() expects a boolean parameter'); - } + if (typeof _useStrict !== 'boolean') { + throw new TypeError('useStrict() expects a boolean parameter'); + } - this._options.inline = _inline; - }; + this._options.useStrict = _useStrict; + }; - DateTimePicker.prototype.clear = function clear() { - this._setValue(null); //todo - }; + _proto.sideBySide = function sideBySide(_sideBySide) { + if (arguments.length === 0) { + return this._options.sideBySide; + } - DateTimePicker.prototype.keyBinds = function keyBinds(_keyBinds) { - if (arguments.length === 0) { - return this._options.keyBinds; - } + if (typeof _sideBySide !== 'boolean') { + throw new TypeError('sideBySide() expects a boolean parameter'); + } - this._options.keyBinds = _keyBinds; - }; + this._options.sideBySide = _sideBySide; - DateTimePicker.prototype.debug = function debug(_debug) { - if (typeof _debug !== 'boolean') { - throw new TypeError('debug() expects a boolean parameter'); - } + if (this.widget) { + this.hide(); + this.show(); + } + }; - this._options.debug = _debug; - }; + _proto.viewMode = function viewMode(_viewMode) { + if (arguments.length === 0) { + return this._options.viewMode; + } - DateTimePicker.prototype.allowInputToggle = function allowInputToggle(_allowInputToggle) { - if (arguments.length === 0) { - return this._options.allowInputToggle; - } + if (typeof _viewMode !== 'string') { + throw new TypeError('viewMode() expects a string parameter'); + } - if (typeof _allowInputToggle !== 'boolean') { - throw new TypeError('allowInputToggle() expects a boolean parameter'); - } + if (DateTimePicker.ViewModes.indexOf(_viewMode) === -1) { + throw new TypeError("viewMode() parameter must be one of (" + DateTimePicker.ViewModes.join(', ') + ") value"); + } - this._options.allowInputToggle = _allowInputToggle; - }; + this._options.viewMode = _viewMode; + this.currentViewMode = Math.max(DateTimePicker.ViewModes.indexOf(_viewMode) - 1, this.MinViewModeNumber); - DateTimePicker.prototype.keepInvalid = function keepInvalid(_keepInvalid) { - if (arguments.length === 0) { - return this._options.keepInvalid; - } + this._showMode(); + }; - if (typeof _keepInvalid !== 'boolean') { - throw new TypeError('keepInvalid() expects a boolean parameter'); - } - this._options.keepInvalid = _keepInvalid; - }; + _proto.calendarWeeks = function calendarWeeks(_calendarWeeks) { + if (arguments.length === 0) { + return this._options.calendarWeeks; + } - DateTimePicker.prototype.datepickerInput = function datepickerInput(_datepickerInput) { - if (arguments.length === 0) { - return this._options.datepickerInput; - } + if (typeof _calendarWeeks !== 'boolean') { + throw new TypeError('calendarWeeks() expects parameter to be a boolean value'); + } - if (typeof _datepickerInput !== 'string') { - throw new TypeError('datepickerInput() expects a string parameter'); - } + this._options.calendarWeeks = _calendarWeeks; - this._options.datepickerInput = _datepickerInput; - }; + this._update(); + }; - DateTimePicker.prototype.parseInputDate = function parseInputDate(_parseInputDate2) { - if (arguments.length === 0) { - return this._options.parseInputDate; - } + _proto.buttons = function buttons(_buttons) { + if (arguments.length === 0) { + return $.extend({}, this._options.buttons); + } - if (typeof _parseInputDate2 !== 'function') { - throw new TypeError('parseInputDate() should be as function'); - } + if (!(_buttons instanceof Object)) { + throw new TypeError('buttons() expects parameter to be an Object'); + } - this._options.parseInputDate = _parseInputDate2; - }; + $.extend(this._options.buttons, _buttons); - DateTimePicker.prototype.disabledTimeIntervals = function disabledTimeIntervals(_disabledTimeIntervals) { - if (arguments.length === 0) { - return this._options.disabledTimeIntervals ? $.extend({}, this._options.disabledTimeIntervals) : this._options.disabledTimeIntervals; - } + if (typeof this._options.buttons.showToday !== 'boolean') { + throw new TypeError('buttons.showToday expects a boolean parameter'); + } - if (!_disabledTimeIntervals) { - this._options.disabledTimeIntervals = false; - this._update(); - return true; - } - if (!(_disabledTimeIntervals instanceof Array)) { - throw new TypeError('disabledTimeIntervals() expects an array parameter'); - } - this._options.disabledTimeIntervals = _disabledTimeIntervals; - this._update(); - }; + if (typeof this._options.buttons.showClear !== 'boolean') { + throw new TypeError('buttons.showClear expects a boolean parameter'); + } - DateTimePicker.prototype.disabledHours = function disabledHours(hours) { - if (arguments.length === 0) { - return this._options.disabledHours ? $.extend({}, this._options.disabledHours) : this._options.disabledHours; - } + if (typeof this._options.buttons.showClose !== 'boolean') { + throw new TypeError('buttons.showClose expects a boolean parameter'); + } - if (!hours) { - this._options.disabledHours = false; - this._update(); - return true; - } - if (!(hours instanceof Array)) { - throw new TypeError('disabledHours() expects an array parameter'); - } - this._options.disabledHours = this._indexGivenHours(hours); - this._options.enabledHours = false; - if (this._options.useCurrent && !this._options.keepInvalid) { - for (var i = 0; i < this._dates.length; i++) { - var tries = 0; - while (!this._isValid(this._dates[i], 'h')) { - this._dates[i].add(1, 'h'); - if (tries === 24) { - throw 'Tried 24 times to find a valid date'; - } - tries++; - } - this._setValue(this._dates[i], i); - } - } - this._update(); - }; + if (this.widget) { + this.hide(); + this.show(); + } + }; - DateTimePicker.prototype.enabledHours = function enabledHours(hours) { - if (arguments.length === 0) { - return this._options.enabledHours ? $.extend({}, this._options.enabledHours) : this._options.enabledHours; - } + _proto.keepOpen = function keepOpen(_keepOpen) { + if (arguments.length === 0) { + return this._options.keepOpen; + } - if (!hours) { - this._options.enabledHours = false; - this._update(); - return true; - } - if (!(hours instanceof Array)) { - throw new TypeError('enabledHours() expects an array parameter'); - } - this._options.enabledHours = this._indexGivenHours(hours); - this._options.disabledHours = false; - if (this._options.useCurrent && !this._options.keepInvalid) { - for (var i = 0; i < this._dates.length; i++) { - var tries = 0; - while (!this._isValid(this._dates[i], 'h')) { - this._dates[i].add(1, 'h'); - if (tries === 24) { - throw 'Tried 24 times to find a valid date'; - } - tries++; - } - this._setValue(this._dates[i], i); - } - } - this._update(); - }; + if (typeof _keepOpen !== 'boolean') { + throw new TypeError('keepOpen() expects a boolean parameter'); + } - DateTimePicker.prototype.viewDate = function viewDate(newDate) { - if (arguments.length === 0) { - return this._viewDate.clone(); - } + this._options.keepOpen = _keepOpen; + }; - if (!newDate) { - this._viewDate = (this._dates[0] || this.getMoment()).clone(); - return true; - } + _proto.focusOnShow = function focusOnShow(_focusOnShow) { + if (arguments.length === 0) { + return this._options.focusOnShow; + } - if (typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { - throw new TypeError('viewDate() parameter must be one of [string, moment or Date]'); - } + if (typeof _focusOnShow !== 'boolean') { + throw new TypeError('focusOnShow() expects a boolean parameter'); + } - this._viewDate = this._parseInputDate(newDate); - this._viewUpdate(); - }; + this._options.focusOnShow = _focusOnShow; + }; - DateTimePicker.prototype.allowMultidate = function allowMultidate(_allowMultidate) { - if (typeof _allowMultidate !== 'boolean') { - throw new TypeError('allowMultidate() expects a boolean parameter'); - } + _proto.inline = function inline(_inline) { + if (arguments.length === 0) { + return this._options.inline; + } - this._options.allowMultidate = _allowMultidate; - }; + if (typeof _inline !== 'boolean') { + throw new TypeError('inline() expects a boolean parameter'); + } - DateTimePicker.prototype.multidateSeparator = function multidateSeparator(_multidateSeparator) { - if (arguments.length === 0) { - return this._options.multidateSeparator; - } + this._options.inline = _inline; + }; - if (typeof _multidateSeparator !== 'string' || _multidateSeparator.length > 1) { - throw new TypeError('multidateSeparator expects a single character string parameter'); - } + _proto.clear = function clear() { + this._setValue(null); //todo - this._options.multidateSeparator = _multidateSeparator; - }; + }; - _createClass(DateTimePicker, null, [{ - key: 'NAME', - get: function get() { - return NAME; - } + _proto.keyBinds = function keyBinds(_keyBinds) { + if (arguments.length === 0) { + return this._options.keyBinds; + } - /** - * @return {string} - */ + this._options.keyBinds = _keyBinds; + }; - }, { - key: 'DATA_KEY', - get: function get() { - return DATA_KEY; - } + _proto.debug = function debug(_debug) { + if (typeof _debug !== 'boolean') { + throw new TypeError('debug() expects a boolean parameter'); + } - /** - * @return {string} - */ + this._options.debug = _debug; + }; - }, { - key: 'EVENT_KEY', - get: function get() { - return EVENT_KEY; - } + _proto.allowInputToggle = function allowInputToggle(_allowInputToggle) { + if (arguments.length === 0) { + return this._options.allowInputToggle; + } - /** - * @return {string} - */ + if (typeof _allowInputToggle !== 'boolean') { + throw new TypeError('allowInputToggle() expects a boolean parameter'); + } - }, { - key: 'DATA_API_KEY', - get: function get() { - return DATA_API_KEY; - } - }, { - key: 'DatePickerModes', - get: function get() { - return DatePickerModes; - } - }, { - key: 'ViewModes', - get: function get() { - return ViewModes; - } - }, { - key: 'Event', - get: function get() { - return Event; - } - }, { - key: 'Selector', - get: function get() { - return Selector; - } - }, { - key: 'Default', - get: function get() { - return Default; - }, - set: function set(value) { - Default = value; + this._options.allowInputToggle = _allowInputToggle; + }; + + _proto.keepInvalid = function keepInvalid(_keepInvalid) { + if (arguments.length === 0) { + return this._options.keepInvalid; + } + + if (typeof _keepInvalid !== 'boolean') { + throw new TypeError('keepInvalid() expects a boolean parameter'); + } + + this._options.keepInvalid = _keepInvalid; + }; + + _proto.datepickerInput = function datepickerInput(_datepickerInput) { + if (arguments.length === 0) { + return this._options.datepickerInput; + } + + if (typeof _datepickerInput !== 'string') { + throw new TypeError('datepickerInput() expects a string parameter'); + } + + this._options.datepickerInput = _datepickerInput; + }; + + _proto.parseInputDate = function parseInputDate(_parseInputDate2) { + if (arguments.length === 0) { + return this._options.parseInputDate; + } + + if (typeof _parseInputDate2 !== 'function') { + throw new TypeError('parseInputDate() should be as function'); + } + + this._options.parseInputDate = _parseInputDate2; + }; + + _proto.disabledTimeIntervals = function disabledTimeIntervals(_disabledTimeIntervals) { + if (arguments.length === 0) { + return this._options.disabledTimeIntervals ? $.extend({}, this._options.disabledTimeIntervals) : this._options.disabledTimeIntervals; + } + + if (!_disabledTimeIntervals) { + this._options.disabledTimeIntervals = false; + + this._update(); + + return true; + } + + if (!(_disabledTimeIntervals instanceof Array)) { + throw new TypeError('disabledTimeIntervals() expects an array parameter'); + } + + this._options.disabledTimeIntervals = _disabledTimeIntervals; + + this._update(); + }; + + _proto.disabledHours = function disabledHours(hours) { + if (arguments.length === 0) { + return this._options.disabledHours ? $.extend({}, this._options.disabledHours) : this._options.disabledHours; + } + + if (!hours) { + this._options.disabledHours = false; + + this._update(); + + return true; + } + + if (!(hours instanceof Array)) { + throw new TypeError('disabledHours() expects an array parameter'); + } + + this._options.disabledHours = this._indexGivenHours(hours); + this._options.enabledHours = false; + + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; + + while (!this._isValid(this._dates[i], 'h')) { + this._dates[i].add(1, 'h'); + + if (tries === 24) { + throw 'Tried 24 times to find a valid date'; } - }, { - key: 'ClassName', - get: function get() { - return ClassName; + + tries++; + } + + this._setValue(this._dates[i], i); + } + } + + this._update(); + }; + + _proto.enabledHours = function enabledHours(hours) { + if (arguments.length === 0) { + return this._options.enabledHours ? $.extend({}, this._options.enabledHours) : this._options.enabledHours; + } + + if (!hours) { + this._options.enabledHours = false; + + this._update(); + + return true; + } + + if (!(hours instanceof Array)) { + throw new TypeError('enabledHours() expects an array parameter'); + } + + this._options.enabledHours = this._indexGivenHours(hours); + this._options.disabledHours = false; + + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; + + while (!this._isValid(this._dates[i], 'h')) { + this._dates[i].add(1, 'h'); + + if (tries === 24) { + throw 'Tried 24 times to find a valid date'; } - }]); - return DateTimePicker; - }(); + tries++; + } + + this._setValue(this._dates[i], i); + } + } + + this._update(); + }; + + _proto.viewDate = function viewDate(newDate) { + if (arguments.length === 0) { + return this._viewDate.clone(); + } + + if (!newDate) { + this._viewDate = (this._dates[0] || this.getMoment()).clone(); + return true; + } + + if (typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { + throw new TypeError('viewDate() parameter must be one of [string, moment or Date]'); + } + + this._viewDate = this._parseInputDate(newDate); + + this._update(); + + this._viewUpdate(DatePickerModes[this.currentViewMode] && DatePickerModes[this.currentViewMode].NAV_FUNCTION); + }; + + _proto._fillDate = function _fillDate() {}; + + _proto._useFeatherIcons = function _useFeatherIcons() { + return this._options.icons.type === 'feather'; + }; + + _proto.allowMultidate = function allowMultidate(_allowMultidate) { + if (typeof _allowMultidate !== 'boolean') { + throw new TypeError('allowMultidate() expects a boolean parameter'); + } + + this._options.allowMultidate = _allowMultidate; + }; + + _proto.multidateSeparator = function multidateSeparator(_multidateSeparator) { + if (arguments.length === 0) { + return this._options.multidateSeparator; + } + + if (typeof _multidateSeparator !== 'string') { + throw new TypeError('multidateSeparator expects a string parameter'); + } + + this._options.multidateSeparator = _multidateSeparator; + }; + + _createClass(DateTimePicker, null, [{ + key: "NAME", + get: function get() { + return NAME; + } + /** + * @return {string} + */ + + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY; + } + /** + * @return {string} + */ + + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY; + } + /** + * @return {string} + */ + + }, { + key: "DATA_API_KEY", + get: function get() { + return DATA_API_KEY; + } + }, { + key: "DatePickerModes", + get: function get() { + return DatePickerModes; + } + }, { + key: "ViewModes", + get: function get() { + return ViewModes; + } + }, { + key: "Event", + get: function get() { + return Event; + } + }, { + key: "Selector", + get: function get() { + return Selector; + } + }, { + key: "Default", + get: function get() { + return Default; + }, + set: function set(value) { + Default = value; + } + }, { + key: "ClassName", + get: function get() { + return ClassName; + } + }]); return DateTimePicker; -}(jQuery, moment); + }(); + + return DateTimePicker; +}(jQuery, moment); //noinspection JSUnusedGlobalSymbols -//noinspection JSUnusedGlobalSymbols /* global DateTimePicker */ + +/* global feather */ + + var TempusDominusBootstrap4 = function ($) { - // eslint-disable-line no-unused-vars - // ReSharper disable once InconsistentNaming - var JQUERY_NO_CONFLICT = $.fn[DateTimePicker.NAME], - verticalModes = ['top', 'bottom', 'auto'], - horizontalModes = ['left', 'right', 'auto'], - toolbarPlacements = ['default', 'top', 'bottom'], - getSelectorFromElement = function getSelectorFromElement($element) { - var selector = $element.data('target'), - $selector = void 0; + // eslint-disable-line no-unused-vars + // ReSharper disable once InconsistentNaming + var JQUERY_NO_CONFLICT = $.fn[DateTimePicker.NAME], + verticalModes = ['top', 'bottom', 'auto'], + horizontalModes = ['left', 'right', 'auto'], + toolbarPlacements = ['default', 'top', 'bottom'], + getSelectorFromElement = function getSelectorFromElement($element) { + var selector = $element.data('target'), + $selector; - if (!selector) { - selector = $element.attr('href') || ''; - selector = /^#[a-z]/i.test(selector) ? selector : null; - } - $selector = $(selector); - if ($selector.length === 0) { - return $selector; - } + if (!selector) { + selector = $element.attr('href') || ''; + selector = /^#[a-z]/i.test(selector) ? selector : null; + } - if (!$selector.data(DateTimePicker.DATA_KEY)) { - $.extend({}, $selector.data(), $(this).data()); - } + $selector = $(selector); - return $selector; + if ($selector.length === 0) { + return $element; + } + + if (!$selector.data(DateTimePicker.DATA_KEY)) { + $.extend({}, $selector.data(), $(this).data()); + } + + return $selector; + }; // ReSharper disable once InconsistentNaming + + + var TempusDominusBootstrap4 = /*#__PURE__*/function (_DateTimePicker) { + _inheritsLoose(TempusDominusBootstrap4, _DateTimePicker); + + function TempusDominusBootstrap4(element, options) { + var _this; + + _this = _DateTimePicker.call(this, element, options) || this; + + _this._init(); + + return _this; + } + + var _proto2 = TempusDominusBootstrap4.prototype; + + _proto2._init = function _init() { + if (this._element.hasClass('input-group')) { + var datepickerButton = this._element.find('.datepickerbutton'); + + if (datepickerButton.length === 0) { + this.component = this._element.find('[data-toggle="datetimepicker"]'); + } else { + this.component = datepickerButton; + } + } }; - // ReSharper disable once InconsistentNaming + _proto2._iconTag = function _iconTag(iconName) { + if (typeof feather !== 'undefined' && this._useFeatherIcons() && feather.icons[iconName]) { + return $('').html(feather.icons[iconName].toSvg()); + } else { + return $('').addClass(iconName); + } + }; - var TempusDominusBootstrap4 = function (_DateTimePicker) { - _inherits(TempusDominusBootstrap4, _DateTimePicker); + _proto2._getDatePickerTemplate = function _getDatePickerTemplate() { + var headTemplate = $('').append($('').append($('').addClass('prev').attr('data-action', 'previous').append(this._iconTag(this._options.icons.previous))).append($('').addClass('picker-switch').attr('data-action', 'pickerSwitch').attr('colspan', "" + (this._options.calendarWeeks ? '6' : '5'))).append($('').addClass('next').attr('data-action', 'next').append(this._iconTag(this._options.icons.next)))), + contTemplate = $('').append($('').append($('').attr('colspan', "" + (this._options.calendarWeeks ? '8' : '7')))); + return [$('
').addClass('datepicker-days').append($('').addClass('table table-sm').append(headTemplate).append($(''))), $('
').addClass('datepicker-months').append($('
').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone())), $('
').addClass('datepicker-years').append($('
').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone())), $('
').addClass('datepicker-decades').append($('
').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone()))]; + }; - function TempusDominusBootstrap4(element, options) { - _classCallCheck(this, TempusDominusBootstrap4); + _proto2._getTimePickerMainTemplate = function _getTimePickerMainTemplate() { + var topRow = $(''), + middleRow = $(''), + bottomRow = $(''); - var _this = _possibleConstructorReturn(this, _DateTimePicker.call(this, element, options)); + if (this._isEnabled('h')) { + topRow.append($('').append($('').append($('').append($('').append($('
').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.incrementHour + }).addClass('btn').attr('data-action', 'incrementHours').append(this._iconTag(this._options.icons.up)))); + middleRow.append($('').append($('').addClass('timepicker-hour').attr({ + 'data-time-component': 'hours', + 'title': this._options.tooltips.pickHour + }).attr('data-action', 'showHours'))); + bottomRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.decrementHour + }).addClass('btn').attr('data-action', 'decrementHours').append(this._iconTag(this._options.icons.down)))); + } - _this._init(); - return _this; + if (this._isEnabled('m')) { + if (this._isEnabled('h')) { + topRow.append($('').addClass('separator')); + middleRow.append($('').addClass('separator').html(':')); + bottomRow.append($('').addClass('separator')); } - TempusDominusBootstrap4.prototype._init = function _init() { - if (this._element.hasClass('input-group')) { - var datepickerButton = this._element.find('.datepickerbutton'); - if (datepickerButton.length === 0) { - this.component = this._element.find('[data-toggle="datetimepicker"]'); - } else { - this.component = datepickerButton; - } - } - }; + topRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.incrementMinute + }).addClass('btn').attr('data-action', 'incrementMinutes').append(this._iconTag(this._options.icons.up)))); + middleRow.append($('').append($('').addClass('timepicker-minute').attr({ + 'data-time-component': 'minutes', + 'title': this._options.tooltips.pickMinute + }).attr('data-action', 'showMinutes'))); + bottomRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.decrementMinute + }).addClass('btn').attr('data-action', 'decrementMinutes').append(this._iconTag(this._options.icons.down)))); + } - TempusDominusBootstrap4.prototype._getDatePickerTemplate = function _getDatePickerTemplate() { - var headTemplate = $('
').addClass('prev').attr('data-action', 'previous').append($('').addClass(this._options.icons.previous))).append($('').addClass('picker-switch').attr('data-action', 'pickerSwitch').attr('colspan', '' + (this._options.calendarWeeks ? '6' : '5'))).append($('').addClass('next').attr('data-action', 'next').append($('').addClass(this._options.icons.next)))), - contTemplate = $('
').attr('colspan', '' + (this._options.calendarWeeks ? '8' : '7')))); + if (this._isEnabled('s')) { + if (this._isEnabled('m')) { + topRow.append($('').addClass('separator')); + middleRow.append($('').addClass('separator').html(':')); + bottomRow.append($('').addClass('separator')); + } - return [$('
').addClass('datepicker-days').append($('').addClass('table table-sm').append(headTemplate).append($(''))), $('
').addClass('datepicker-months').append($('
').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone())), $('
').addClass('datepicker-years').append($('
').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone())), $('
').addClass('datepicker-decades').append($('
').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone()))]; - }; + topRow.append($(''), - middleRow = $(''), - bottomRow = $(''); + if (!this.use24Hours) { + topRow.append($('
').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.incrementSecond + }).addClass('btn').attr('data-action', 'incrementSeconds').append(this._iconTag(this._options.icons.up)))); + middleRow.append($('').append($('').addClass('timepicker-second').attr({ + 'data-time-component': 'seconds', + 'title': this._options.tooltips.pickSecond + }).attr('data-action', 'showSeconds'))); + bottomRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.decrementSecond + }).addClass('btn').attr('data-action', 'decrementSeconds').append(this._iconTag(this._options.icons.down)))); + } - TempusDominusBootstrap4.prototype._getTimePickerMainTemplate = function _getTimePickerMainTemplate() { - var topRow = $('
').addClass('separator')); + middleRow.append($('').append($('').addClass('separator')); + } - if (this._isEnabled('h')) { - topRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.incrementHour - }).addClass('btn').attr('data-action', 'incrementHours').append($('').addClass(this._options.icons.up)))); - middleRow.append($('').append($('').addClass('timepicker-hour').attr({ - 'data-time-component': 'hours', - 'title': this._options.tooltips.pickHour - }).attr('data-action', 'showHours'))); - bottomRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.decrementHour - }).addClass('btn').attr('data-action', 'decrementHours').append($('').addClass(this._options.icons.down)))); - } - if (this._isEnabled('m')) { - if (this._isEnabled('h')) { - topRow.append($('').addClass('separator')); - middleRow.append($('').addClass('separator').html(':')); - bottomRow.append($('').addClass('separator')); - } - topRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.incrementMinute - }).addClass('btn').attr('data-action', 'incrementMinutes').append($('').addClass(this._options.icons.up)))); - middleRow.append($('').append($('').addClass('timepicker-minute').attr({ - 'data-time-component': 'minutes', - 'title': this._options.tooltips.pickMinute - }).attr('data-action', 'showMinutes'))); - bottomRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.decrementMinute - }).addClass('btn').attr('data-action', 'decrementMinutes').append($('').addClass(this._options.icons.down)))); - } - if (this._isEnabled('s')) { - if (this._isEnabled('m')) { - topRow.append($('').addClass('separator')); - middleRow.append($('').addClass('separator').html(':')); - bottomRow.append($('').addClass('separator')); - } - topRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.incrementSecond - }).addClass('btn').attr('data-action', 'incrementSeconds').append($('').addClass(this._options.icons.up)))); - middleRow.append($('').append($('').addClass('timepicker-second').attr({ - 'data-time-component': 'seconds', - 'title': this._options.tooltips.pickSecond - }).attr('data-action', 'showSeconds'))); - bottomRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.decrementSecond - }).addClass('btn').attr('data-action', 'decrementSeconds').append($('').addClass(this._options.icons.down)))); - } + return $('
').addClass('timepicker-picker').append($('').addClass('table-condensed').append([topRow, middleRow, bottomRow])); + }; - if (!this.use24Hours) { - topRow.append($('
').addClass('separator')); - middleRow.append($('').append($('').addClass('separator')); - } + _proto2._getTimePickerTemplate = function _getTimePickerTemplate() { + var hoursView = $('
').addClass('timepicker-hours').append($('').addClass('table-condensed')), + minutesView = $('
').addClass('timepicker-minutes').append($('
').addClass('table-condensed')), + secondsView = $('
').addClass('timepicker-seconds').append($('
').addClass('table-condensed')), + ret = [this._getTimePickerMainTemplate()]; - return $('
').addClass('timepicker-picker').append($('
').addClass('table-condensed').append([topRow, middleRow, bottomRow])); - }; + if (this._isEnabled('h')) { + ret.push(hoursView); + } - TempusDominusBootstrap4.prototype._getTimePickerTemplate = function _getTimePickerTemplate() { - var hoursView = $('
').addClass('timepicker-hours').append($('
').addClass('table-condensed')), - minutesView = $('
').addClass('timepicker-minutes').append($('
').addClass('table-condensed')), - secondsView = $('
').addClass('timepicker-seconds').append($('
').addClass('table-condensed')), - ret = [this._getTimePickerMainTemplate()]; + if (this._isEnabled('m')) { + ret.push(minutesView); + } - if (this._isEnabled('h')) { - ret.push(hoursView); - } - if (this._isEnabled('m')) { - ret.push(minutesView); - } - if (this._isEnabled('s')) { - ret.push(secondsView); - } + if (this._isEnabled('s')) { + ret.push(secondsView); + } - return ret; - }; + return ret; + }; - TempusDominusBootstrap4.prototype._getToolbar = function _getToolbar() { - var row = []; - if (this._options.buttons.showToday) { - row.push($('
').append($('').attr({ - href: '#', - tabindex: '-1', - 'data-action': 'today', - 'title': this._options.tooltips.today - }).append($('').addClass(this._options.icons.today)))); - } - if (!this._options.sideBySide && this._hasDate() && this._hasTime()) { - var title = void 0, - icon = void 0; - if (this._options.viewMode === 'times') { - title = this._options.tooltips.selectDate; - icon = this._options.icons.date; - } else { - title = this._options.tooltips.selectTime; - icon = this._options.icons.time; - } - row.push($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'data-action': 'togglePicker', - 'title': title - }).append($('').addClass(icon)))); - } - if (this._options.buttons.showClear) { - row.push($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'data-action': 'clear', - 'title': this._options.tooltips.clear - }).append($('').addClass(this._options.icons.clear)))); - } - if (this._options.buttons.showClose) { - row.push($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'data-action': 'close', - 'title': this._options.tooltips.close - }).append($('').addClass(this._options.icons.close)))); - } - return row.length === 0 ? '' : $('').addClass('table-condensed').append($('').append($('').append(row))); - }; + _proto2._getToolbar = function _getToolbar() { + var row = []; - TempusDominusBootstrap4.prototype._getTemplate = function _getTemplate() { - var template = $('
').addClass('bootstrap-datetimepicker-widget dropdown-menu'), - dateView = $('
').addClass('datepicker').append(this._getDatePickerTemplate()), - timeView = $('
').addClass('timepicker').append(this._getTimePickerTemplate()), - content = $('
    ').addClass('list-unstyled'), - toolbar = $('
  • ').addClass('picker-switch' + (this._options.collapse ? ' accordion-toggle' : '')).append(this._getToolbar()); + if (this._options.buttons.showToday) { + row.push($('
').append($('').attr({ + href: '#', + tabindex: '-1', + 'data-action': 'today', + 'title': this._options.tooltips.today + }).append(this._iconTag(this._options.icons.today)))); + } - if (this._options.inline) { - template.removeClass('dropdown-menu'); - } + if (!this._options.sideBySide && this._options.collapse && this._hasDate() && this._hasTime()) { + var title, icon; - if (this.use24Hours) { - template.addClass('usetwentyfour'); - } - if (this._isEnabled('s') && !this.use24Hours) { - template.addClass('wider'); - } + if (this._options.viewMode === 'times') { + title = this._options.tooltips.selectDate; + icon = this._options.icons.date; + } else { + title = this._options.tooltips.selectTime; + icon = this._options.icons.time; + } - if (this._options.sideBySide && this._hasDate() && this._hasTime()) { - template.addClass('timepicker-sbs'); - if (this._options.toolbarPlacement === 'top') { - template.append(toolbar); - } - template.append($('
').addClass('row').append(dateView.addClass('col-md-6')).append(timeView.addClass('col-md-6'))); - if (this._options.toolbarPlacement === 'bottom' || this._options.toolbarPlacement === 'default') { - template.append(toolbar); - } - return template; - } + row.push($('
').append($('').attr({ + href: '#', + tabindex: '-1', + 'data-action': 'togglePicker', + 'title': title + }).append(this._iconTag(icon)))); + } - if (this._options.toolbarPlacement === 'top') { - content.append(toolbar); - } - if (this._hasDate()) { - content.append($('
  • ').addClass(this._options.collapse && this._hasTime() ? 'collapse' : '').addClass(this._options.collapse && this._hasTime() && this._options.viewMode === 'times' ? '' : 'show').append(dateView)); - } - if (this._options.toolbarPlacement === 'default') { - content.append(toolbar); - } - if (this._hasTime()) { - content.append($('
  • ').addClass(this._options.collapse && this._hasDate() ? 'collapse' : '').addClass(this._options.collapse && this._hasDate() && this._options.viewMode === 'times' ? 'show' : '').append(timeView)); - } - if (this._options.toolbarPlacement === 'bottom') { - content.append(toolbar); - } - return template.append(content); - }; + if (this._options.buttons.showClear) { + row.push($('
  • ').append($('').attr({ + href: '#', + tabindex: '-1', + 'data-action': 'clear', + 'title': this._options.tooltips.clear + }).append(this._iconTag(this._options.icons.clear)))); + } - TempusDominusBootstrap4.prototype._place = function _place(e) { - var self = e && e.data && e.data.picker || this, - vertical = self._options.widgetPositioning.vertical, - horizontal = self._options.widgetPositioning.horizontal, - parent = void 0; - var position = (self.component && self.component.length ? self.component : self._element).position(), - offset = (self.component && self.component.length ? self.component : self._element).offset(); - if (self._options.widgetParent) { - parent = self._options.widgetParent.append(self.widget); - } else if (self._element.is('input')) { - parent = self._element.after(self.widget).parent(); - } else if (self._options.inline) { - parent = self._element.append(self.widget); - return; + if (this._options.buttons.showClose) { + row.push($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'data-action': 'close', + 'title': this._options.tooltips.close + }).append(this._iconTag(this._options.icons.close)))); + } + + return row.length === 0 ? '' : $('').addClass('table-condensed').append($('').append($('').append(row))); + }; + + _proto2._getTemplate = function _getTemplate() { + var template = $('
    ').addClass(("bootstrap-datetimepicker-widget dropdown-menu " + (this._options.calendarWeeks ? 'tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks' : '') + " " + ((this._useFeatherIcons() ? 'tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons' : '') + " ")).trim()), + dateView = $('
    ').addClass('datepicker').append(this._getDatePickerTemplate()), + timeView = $('
    ').addClass('timepicker').append(this._getTimePickerTemplate()), + content = $('
      ').addClass('list-unstyled'), + toolbar = $('
    • ').addClass(("picker-switch" + (this._options.collapse ? ' accordion-toggle' : '') + " " + ("" + (this._useFeatherIcons() ? 'picker-switch-with-feathers-icons' : ''))).trim()).append(this._getToolbar()); + + if (this._options.inline) { + template.removeClass('dropdown-menu'); + } + + if (this.use24Hours) { + template.addClass('usetwentyfour'); + } + + if (this.input !== undefined && this.input.prop('readonly') || this._options.readonly) { + template.addClass('bootstrap-datetimepicker-widget-readonly'); + } + + if (this._isEnabled('s') && !this.use24Hours) { + template.addClass('wider'); + } + + if (this._options.sideBySide && this._hasDate() && this._hasTime()) { + template.addClass('timepicker-sbs'); + + if (this._options.toolbarPlacement === 'top') { + template.append(toolbar); + } + + template.append($('
      ').addClass('row').append(dateView.addClass('col-md-6')).append(timeView.addClass('col-md-6'))); + + if (this._options.toolbarPlacement === 'bottom' || this._options.toolbarPlacement === 'default') { + template.append(toolbar); + } + + return template; + } + + if (this._options.toolbarPlacement === 'top') { + content.append(toolbar); + } + + if (this._hasDate()) { + content.append($('
    • ').addClass(this._options.collapse && this._hasTime() ? 'collapse' : '').addClass(this._options.collapse && this._hasTime() && this._options.viewMode === 'times' ? '' : 'show').append(dateView)); + } + + if (this._options.toolbarPlacement === 'default') { + content.append(toolbar); + } + + if (this._hasTime()) { + content.append($('
    • ').addClass(this._options.collapse && this._hasDate() ? 'collapse' : '').addClass(this._options.collapse && this._hasDate() && this._options.viewMode === 'times' ? 'show' : '').append(timeView)); + } + + if (this._options.toolbarPlacement === 'bottom') { + content.append(toolbar); + } + + return template.append(content); + }; + + _proto2._place = function _place(e) { + var self = e && e.data && e.data.picker || this, + vertical = self._options.widgetPositioning.vertical, + horizontal = self._options.widgetPositioning.horizontal, + parent; + var position = (self.component && self.component.length ? self.component : self._element).position(), + offset = (self.component && self.component.length ? self.component : self._element).offset(); + + if (self._options.widgetParent) { + parent = self._options.widgetParent.append(self.widget); + } else if (self._element.is('input')) { + parent = self._element.after(self.widget).parent(); + } else if (self._options.inline) { + parent = self._element.append(self.widget); + return; + } else { + parent = self._element; + + self._element.children().first().after(self.widget); + } // Top and bottom logic + + + if (vertical === 'auto') { + //noinspection JSValidateTypes + if (offset.top + self.widget.height() * 1.5 >= $(window).height() + $(window).scrollTop() && self.widget.height() + self._element.outerHeight() < offset.top) { + vertical = 'top'; + } else { + vertical = 'bottom'; + } + } // Left and right logic + + + if (horizontal === 'auto') { + if (parent.width() < offset.left + self.widget.outerWidth() / 2 && offset.left + self.widget.outerWidth() > $(window).width()) { + horizontal = 'right'; + } else { + horizontal = 'left'; + } + } + + if (vertical === 'top') { + self.widget.addClass('top').removeClass('bottom'); + } else { + self.widget.addClass('bottom').removeClass('top'); + } + + if (horizontal === 'right') { + self.widget.addClass('float-right'); + } else { + self.widget.removeClass('float-right'); + } // find the first parent element that has a relative css positioning + + + if (parent.css('position') !== 'relative') { + parent = parent.parents().filter(function () { + return $(this).css('position') === 'relative'; + }).first(); + } + + if (parent.length === 0) { + throw new Error('datetimepicker component should be placed within a relative positioned container'); + } + + self.widget.css({ + top: vertical === 'top' ? 'auto' : position.top + self._element.outerHeight() + 'px', + bottom: vertical === 'top' ? parent.outerHeight() - (parent === self._element ? 0 : position.top) + 'px' : 'auto', + left: horizontal === 'left' ? (parent === self._element ? 0 : position.left) + 'px' : 'auto', + right: horizontal === 'left' ? 'auto' : parent.outerWidth() - self._element.outerWidth() - (parent === self._element ? 0 : position.left) + 'px' + }); + }; + + _proto2._fillDow = function _fillDow() { + var row = $('
    '), + currentDate = this._viewDate.clone().startOf('w').startOf('d'); + + if (this._options.calendarWeeks === true) { + row.append($(''); + + if (this._options.calendarWeeks) { + row.append(""); + } + + html.push(row); + } + + clsName = ''; + + if (currentDate.isBefore(this._viewDate, 'M')) { + clsName += ' old'; + } + + if (currentDate.isAfter(this._viewDate, 'M')) { + clsName += ' new'; + } + + if (this._options.allowMultidate) { + var index = this._datesFormatted.indexOf(currentDate.format('YYYY-MM-DD')); + + if (index !== -1) { + if (currentDate.isSame(this._datesFormatted[index], 'd') && !this.unset) { + clsName += ' active'; + } + } + } else { + if (currentDate.isSame(this._getLastPickedDate(), 'd') && !this.unset) { + clsName += ' active'; + } + } + + if (!this._isValid(currentDate, 'd')) { + clsName += ' disabled'; + } + + if (currentDate.isSame(this.getMoment(), 'd')) { + clsName += ' today'; + } + + if (currentDate.day() === 0 || currentDate.day() === 6) { + clsName += ' weekend'; + } + + row.append(""); + currentDate.add(1, 'd'); + } + + $('body').addClass('tempusdominus-bootstrap-datetimepicker-widget-day-click'); + $('body').append('
    '); + daysView.find('tbody').empty().append(html); + $('body').find('.tempusdominus-bootstrap-datetimepicker-widget-day-click-glass-panel').remove(); + $('body').removeClass('tempusdominus-bootstrap-datetimepicker-widget-day-click'); + + this._updateMonths(); + + this._updateYears(); + + this._updateDecades(); + }; + + _proto2._fillHours = function _fillHours() { + var table = this.widget.find('.timepicker-hours table'), + currentHour = this._viewDate.clone().startOf('d'), + html = []; + + var row = $(''); + + if (this._viewDate.hour() > 11 && !this.use24Hours) { + currentHour.hour(12); + } + + while (currentHour.isSame(this._viewDate, 'd') && (this.use24Hours || this._viewDate.hour() < 12 && currentHour.hour() < 12 || this._viewDate.hour() > 11)) { + if (currentHour.hour() % 4 === 0) { + row = $(''); + html.push(row); + } + + row.append(""); + currentHour.add(1, 'h'); + } + + table.empty().append(html); + }; + + _proto2._fillMinutes = function _fillMinutes() { + var table = this.widget.find('.timepicker-minutes table'), + currentMinute = this._viewDate.clone().startOf('h'), + html = [], + step = this._options.stepping === 1 ? 5 : this._options.stepping; + + var row = $(''); + + while (this._viewDate.isSame(currentMinute, 'h')) { + if (currentMinute.minute() % (step * 4) === 0) { + row = $(''); + html.push(row); + } + + row.append(""); + currentMinute.add(step, 'm'); + } + + table.empty().append(html); + }; + + _proto2._fillSeconds = function _fillSeconds() { + var table = this.widget.find('.timepicker-seconds table'), + currentSecond = this._viewDate.clone().startOf('m'), + html = []; + + var row = $(''); + + while (this._viewDate.isSame(currentSecond, 'm')) { + if (currentSecond.second() % 20 === 0) { + row = $(''); + html.push(row); + } + + row.append(""); + currentSecond.add(5, 's'); + } + + table.empty().append(html); + }; + + _proto2._fillTime = function _fillTime() { + var toggle, newDate; + + var timeComponents = this.widget.find('.timepicker span[data-time-component]'), + lastPickedDate = this._getLastPickedDate(); + + if (!this.use24Hours) { + toggle = this.widget.find('.timepicker [data-action=togglePeriod]'); + newDate = lastPickedDate ? lastPickedDate.clone().add(lastPickedDate.hours() >= 12 ? -12 : 12, 'h') : void 0; + lastPickedDate && toggle.text(lastPickedDate.format('A')); + + if (this._isValid(newDate, 'h')) { + toggle.removeClass('disabled'); + } else { + toggle.addClass('disabled'); + } + } + + lastPickedDate && timeComponents.filter('[data-time-component=hours]').text(lastPickedDate.format("" + (this.use24Hours ? 'HH' : 'hh'))); + lastPickedDate && timeComponents.filter('[data-time-component=minutes]').text(lastPickedDate.format('mm')); + lastPickedDate && timeComponents.filter('[data-time-component=seconds]').text(lastPickedDate.format('ss')); + + this._fillHours(); + + this._fillMinutes(); + + this._fillSeconds(); + }; + + _proto2._doAction = function _doAction(e, action) { + var lastPicked = this._getLastPickedDate(); + + if ($(e.currentTarget).is('.disabled')) { + return false; + } + + action = action || $(e.currentTarget).data('action'); + + switch (action) { + case 'next': + { + var navFnc = DateTimePicker.DatePickerModes[this.currentViewMode].NAV_FUNCTION; + + this._viewDate.add(DateTimePicker.DatePickerModes[this.currentViewMode].NAV_STEP, navFnc); + + this._fillDate(); + + this._viewUpdate(navFnc); + + break; + } + + case 'previous': + { + var _navFnc = DateTimePicker.DatePickerModes[this.currentViewMode].NAV_FUNCTION; + + this._viewDate.subtract(DateTimePicker.DatePickerModes[this.currentViewMode].NAV_STEP, _navFnc); + + this._fillDate(); + + this._viewUpdate(_navFnc); + + break; + } + + case 'pickerSwitch': + this._showMode(1); + + break; + + case 'selectMonth': + { + var month = $(e.target).closest('tbody').find('span').index($(e.target)); + + this._viewDate.month(month); + + if (this.currentViewMode === this.MinViewModeNumber) { + this._setValue(lastPicked.clone().year(this._viewDate.year()).month(this._viewDate.month()), this._getLastPickedDateIndex()); + + if (!this._options.inline) { + this.hide(); + } } else { - parent = self._element; - self._element.children().first().after(self.widget); + this._showMode(-1); + + this._fillDate(); } - // Top and bottom logic - if (vertical === 'auto') { - //noinspection JSValidateTypes - if (offset.top + self.widget.height() * 1.5 >= $(window).height() + $(window).scrollTop() && self.widget.height() + self._element.outerHeight() < offset.top) { - vertical = 'top'; - } else { - vertical = 'bottom'; - } - } + this._viewUpdate('M'); - // Left and right logic - if (horizontal === 'auto') { - if (parent.width() < offset.left + self.widget.outerWidth() / 2 && offset.left + self.widget.outerWidth() > $(window).width()) { - horizontal = 'right'; - } else { - horizontal = 'left'; - } - } + break; + } - if (vertical === 'top') { - self.widget.addClass('top').removeClass('bottom'); + case 'selectYear': + { + var year = parseInt($(e.target).text(), 10) || 0; + + this._viewDate.year(year); + + if (this.currentViewMode === this.MinViewModeNumber) { + this._setValue(lastPicked.clone().year(this._viewDate.year()), this._getLastPickedDateIndex()); + + if (!this._options.inline) { + this.hide(); + } } else { - self.widget.addClass('bottom').removeClass('top'); + this._showMode(-1); + + this._fillDate(); } - if (horizontal === 'right') { - self.widget.addClass('float-right'); + this._viewUpdate('YYYY'); + + break; + } + + case 'selectDecade': + { + var _year = parseInt($(e.target).data('selection'), 10) || 0; + + this._viewDate.year(_year); + + if (this.currentViewMode === this.MinViewModeNumber) { + this._setValue(lastPicked.clone().year(this._viewDate.year()), this._getLastPickedDateIndex()); + + if (!this._options.inline) { + this.hide(); + } } else { - self.widget.removeClass('float-right'); + this._showMode(-1); + + this._fillDate(); } - // find the first parent element that has a relative css positioning - if (parent.css('position') !== 'relative') { - parent = parent.parents().filter(function () { - return $(this).css('position') === 'relative'; - }).first(); + this._viewUpdate('YYYY'); + + break; + } + + case 'selectDay': + { + var day = this._viewDate.clone(); + + if ($(e.target).is('.old')) { + day.subtract(1, 'M'); } - if (parent.length === 0) { - throw new Error('datetimepicker component should be placed within a relative positioned container'); + if ($(e.target).is('.new')) { + day.add(1, 'M'); } - self.widget.css({ - top: vertical === 'top' ? 'auto' : position.top + self._element.outerHeight() + 'px', - bottom: vertical === 'top' ? parent.outerHeight() - (parent === self._element ? 0 : position.top) + 'px' : 'auto', - left: horizontal === 'left' ? (parent === self._element ? 0 : position.left) + 'px' : 'auto', - right: horizontal === 'left' ? 'auto' : parent.outerWidth() - self._element.outerWidth() - (parent === self._element ? 0 : position.left) + 'px' - }); - }; + var selectDate = day.date(parseInt($(e.target).text(), 10)), + index = 0; - TempusDominusBootstrap4.prototype._fillDow = function _fillDow() { - var row = $(''), - currentDate = this._viewDate.clone().startOf('w').startOf('d'); + if (this._options.allowMultidate) { + index = this._datesFormatted.indexOf(selectDate.format('YYYY-MM-DD')); - if (this._options.calendarWeeks === true) { - row.append($(''); - if (this._options.calendarWeeks) { - row.append(''); - } - html.push(row); - } - clsName = ''; - if (currentDate.isBefore(this._viewDate, 'M')) { - clsName += ' old'; - } - if (currentDate.isAfter(this._viewDate, 'M')) { - clsName += ' new'; - } - if (this._options.allowMultidate) { - var index = this._datesFormatted.indexOf(currentDate.format('YYYY-MM-DD')); - if (index !== -1) { - if (currentDate.isSame(this._datesFormatted[index], 'd') && !this.unset) { - clsName += ' active'; - } - } - } else { - if (currentDate.isSame(this._getLastPickedDate(), 'd') && !this.unset) { - clsName += ' active'; - } - } - if (!this._isValid(currentDate, 'd')) { - clsName += ' disabled'; - } - if (currentDate.isSame(this.getMoment(), 'd')) { - clsName += ' today'; - } - if (currentDate.day() === 0 || currentDate.day() === 6) { - clsName += ' weekend'; - } - row.append(''); - currentDate.add(1, 'd'); + if (this._isValid(newDate, 'h')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(newDate); + } + + this._setValue(newDate, this._getLastPickedDateIndex()); } - daysView.find('tbody').empty().append(html); + break; + } - this._updateMonths(); - - this._updateYears(); - - this._updateDecades(); - }; - - TempusDominusBootstrap4.prototype._fillHours = function _fillHours() { - var table = this.widget.find('.timepicker-hours table'), - currentHour = this._viewDate.clone().startOf('d'), - html = []; - var row = $(''); - - if (this._viewDate.hour() > 11 && !this.use24Hours) { - currentHour.hour(12); - } - while (currentHour.isSame(this._viewDate, 'd') && (this.use24Hours || this._viewDate.hour() < 12 && currentHour.hour() < 12 || this._viewDate.hour() > 11)) { - if (currentHour.hour() % 4 === 0) { - row = $(''); - html.push(row); - } - row.append(''); - currentHour.add(1, 'h'); - } - table.empty().append(html); - }; - - TempusDominusBootstrap4.prototype._fillMinutes = function _fillMinutes() { - var table = this.widget.find('.timepicker-minutes table'), - currentMinute = this._viewDate.clone().startOf('h'), - html = [], - step = this._options.stepping === 1 ? 5 : this._options.stepping; - var row = $(''); - - while (this._viewDate.isSame(currentMinute, 'h')) { - if (currentMinute.minute() % (step * 4) === 0) { - row = $(''); - html.push(row); - } - row.append(''); - currentMinute.add(step, 'm'); - } - table.empty().append(html); - }; - - TempusDominusBootstrap4.prototype._fillSeconds = function _fillSeconds() { - var table = this.widget.find('.timepicker-seconds table'), - currentSecond = this._viewDate.clone().startOf('m'), - html = []; - var row = $(''); - - while (this._viewDate.isSame(currentSecond, 'm')) { - if (currentSecond.second() % 20 === 0) { - row = $(''); - html.push(row); - } - row.append(''); - currentSecond.add(5, 's'); + case 'incrementMinutes': + { + if (!lastPicked) { + break; } - table.empty().append(html); - }; + var _newDate = lastPicked.clone().add(this._options.stepping, 'm'); - TempusDominusBootstrap4.prototype._fillTime = function _fillTime() { - var toggle = void 0, - newDate = void 0; - var timeComponents = this.widget.find('.timepicker span[data-time-component]'); + if (this._isValid(_newDate, 'm')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate); + } - if (!this.use24Hours) { - toggle = this.widget.find('.timepicker [data-action=togglePeriod]'); - newDate = this._getLastPickedDate().clone().add(this._getLastPickedDate().hours() >= 12 ? -12 : 12, 'h'); - - toggle.text(this._getLastPickedDate().format('A')); - - if (this._isValid(newDate, 'h')) { - toggle.removeClass('disabled'); - } else { - toggle.addClass('disabled'); - } + this._setValue(_newDate, this._getLastPickedDateIndex()); } - timeComponents.filter('[data-time-component=hours]').text(this._getLastPickedDate().format('' + (this.use24Hours ? 'HH' : 'hh'))); - timeComponents.filter('[data-time-component=minutes]').text(this._getLastPickedDate().format('mm')); - timeComponents.filter('[data-time-component=seconds]').text(this._getLastPickedDate().format('ss')); - this._fillHours(); - this._fillMinutes(); - this._fillSeconds(); - }; + break; + } - TempusDominusBootstrap4.prototype._doAction = function _doAction(e, action) { - var lastPicked = this._getLastPickedDate(); - if ($(e.currentTarget).is('.disabled')) { - return false; + case 'incrementSeconds': + { + if (!lastPicked) { + break; } - action = action || $(e.currentTarget).data('action'); - switch (action) { - case 'next': - { - var navFnc = DateTimePicker.DatePickerModes[this.currentViewMode].NAV_FUNCTION; - this._viewDate.add(DateTimePicker.DatePickerModes[this.currentViewMode].NAV_STEP, navFnc); - this._fillDate(); - this._viewUpdate(navFnc); - break; - } - case 'previous': - { - var _navFnc = DateTimePicker.DatePickerModes[this.currentViewMode].NAV_FUNCTION; - this._viewDate.subtract(DateTimePicker.DatePickerModes[this.currentViewMode].NAV_STEP, _navFnc); - this._fillDate(); - this._viewUpdate(_navFnc); - break; - } - case 'pickerSwitch': - this._showMode(1); - break; - case 'selectMonth': - { - var month = $(e.target).closest('tbody').find('span').index($(e.target)); - this._viewDate.month(month); - if (this.currentViewMode === this.MinViewModeNumber) { - this._setValue(lastPicked.clone().year(this._viewDate.year()).month(this._viewDate.month()), this._getLastPickedDateIndex()); - if (!this._options.inline) { - this.hide(); - } - } else { - this._showMode(-1); - this._fillDate(); - } - this._viewUpdate('M'); - break; - } - case 'selectYear': - { - var year = parseInt($(e.target).text(), 10) || 0; - this._viewDate.year(year); - if (this.currentViewMode === this.MinViewModeNumber) { - this._setValue(lastPicked.clone().year(this._viewDate.year()), this._getLastPickedDateIndex()); - if (!this._options.inline) { - this.hide(); - } - } else { - this._showMode(-1); - this._fillDate(); - } - this._viewUpdate('YYYY'); - break; - } - case 'selectDecade': - { - var _year = parseInt($(e.target).data('selection'), 10) || 0; - this._viewDate.year(_year); - if (this.currentViewMode === this.MinViewModeNumber) { - this._setValue(lastPicked.clone().year(this._viewDate.year()), this._getLastPickedDateIndex()); - if (!this._options.inline) { - this.hide(); - } - } else { - this._showMode(-1); - this._fillDate(); - } - this._viewUpdate('YYYY'); - break; - } - case 'selectDay': - { - var day = this._viewDate.clone(); - if ($(e.target).is('.old')) { - day.subtract(1, 'M'); - } - if ($(e.target).is('.new')) { - day.add(1, 'M'); - } - var selectDate = day.date(parseInt($(e.target).text(), 10)), - index = 0; - if (this._options.allowMultidate) { - index = this._datesFormatted.indexOf(selectDate.format('YYYY-MM-DD')); - if (index !== -1) { - this._setValue(null, index); //deselect multidate - } else { - this._setValue(selectDate, this._getLastPickedDateIndex() + 1); - } - } else { - this._setValue(selectDate, this._getLastPickedDateIndex()); - } + var _newDate2 = lastPicked.clone().add(1, 's'); - if (!this._hasTime() && !this._options.keepOpen && !this._options.inline && !this._options.allowMultidate) { - this.hide(); - } - break; - } - case 'incrementHours': - { - var newDate = lastPicked.clone().add(1, 'h'); - if (this._isValid(newDate, 'h')) { - this._setValue(newDate, this._getLastPickedDateIndex()); - } - break; - } - case 'incrementMinutes': - { - var _newDate = lastPicked.clone().add(this._options.stepping, 'm'); - if (this._isValid(_newDate, 'm')) { - this._setValue(_newDate, this._getLastPickedDateIndex()); - } - break; - } - case 'incrementSeconds': - { - var _newDate2 = lastPicked.clone().add(1, 's'); - if (this._isValid(_newDate2, 's')) { - this._setValue(_newDate2, this._getLastPickedDateIndex()); - } - break; - } - case 'decrementHours': - { - var _newDate3 = lastPicked.clone().subtract(1, 'h'); - if (this._isValid(_newDate3, 'h')) { - this._setValue(_newDate3, this._getLastPickedDateIndex()); - } - break; - } - case 'decrementMinutes': - { - var _newDate4 = lastPicked.clone().subtract(this._options.stepping, 'm'); - if (this._isValid(_newDate4, 'm')) { - this._setValue(_newDate4, this._getLastPickedDateIndex()); - } - break; - } - case 'decrementSeconds': - { - var _newDate5 = lastPicked.clone().subtract(1, 's'); - if (this._isValid(_newDate5, 's')) { - this._setValue(_newDate5, this._getLastPickedDateIndex()); - } - break; - } - case 'togglePeriod': - { - this._setValue(lastPicked.clone().add(lastPicked.hours() >= 12 ? -12 : 12, 'h'), this._getLastPickedDateIndex()); - break; - } - case 'togglePicker': - { - var $this = $(e.target), - $link = $this.closest('a'), - $parent = $this.closest('ul'), - expanded = $parent.find('.show'), - closed = $parent.find('.collapse:not(.show)'), - $span = $this.is('span') ? $this : $this.find('span'); - var collapseData = void 0; + if (this._isValid(_newDate2, 's')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate2); + } - if (expanded && expanded.length) { - collapseData = expanded.data('collapse'); - if (collapseData && collapseData.transitioning) { - return true; - } - if (expanded.collapse) { - // if collapse plugin is available through bootstrap.js then use it - expanded.collapse('hide'); - closed.collapse('show'); - } else { - // otherwise just toggle in class on the two views - expanded.removeClass('show'); - closed.addClass('show'); - } - $span.toggleClass(this._options.icons.time + ' ' + this._options.icons.date); - - if ($span.hasClass(this._options.icons.date)) { - $link.attr('title', this._options.tooltips.selectDate); - } else { - $link.attr('title', this._options.tooltips.selectTime); - } - } - } - break; - case 'showPicker': - this.widget.find('.timepicker > div:not(.timepicker-picker)').hide(); - this.widget.find('.timepicker .timepicker-picker').show(); - break; - case 'showHours': - this.widget.find('.timepicker .timepicker-picker').hide(); - this.widget.find('.timepicker .timepicker-hours').show(); - break; - case 'showMinutes': - this.widget.find('.timepicker .timepicker-picker').hide(); - this.widget.find('.timepicker .timepicker-minutes').show(); - break; - case 'showSeconds': - this.widget.find('.timepicker .timepicker-picker').hide(); - this.widget.find('.timepicker .timepicker-seconds').show(); - break; - case 'selectHour': - { - var hour = parseInt($(e.target).text(), 10); - - if (!this.use24Hours) { - if (lastPicked.hours() >= 12) { - if (hour !== 12) { - hour += 12; - } - } else { - if (hour === 12) { - hour = 0; - } - } - } - this._setValue(lastPicked.clone().hours(hour), this._getLastPickedDateIndex()); - if (!this._isEnabled('a') && !this._isEnabled('m') && !this._options.keepOpen && !this._options.inline) { - this.hide(); - } else { - this._doAction(e, 'showPicker'); - } - break; - } - case 'selectMinute': - this._setValue(lastPicked.clone().minutes(parseInt($(e.target).text(), 10)), this._getLastPickedDateIndex()); - if (!this._isEnabled('a') && !this._isEnabled('s') && !this._options.keepOpen && !this._options.inline) { - this.hide(); - } else { - this._doAction(e, 'showPicker'); - } - break; - case 'selectSecond': - this._setValue(lastPicked.clone().seconds(parseInt($(e.target).text(), 10)), this._getLastPickedDateIndex()); - if (!this._isEnabled('a') && !this._options.keepOpen && !this._options.inline) { - this.hide(); - } else { - this._doAction(e, 'showPicker'); - } - break; - case 'clear': - this.clear(); - break; - case 'close': - this.hide(); - break; - case 'today': - { - var todaysDate = this.getMoment(); - if (this._isValid(todaysDate, 'd')) { - this._setValue(todaysDate, this._getLastPickedDateIndex()); - } - break; - } + this._setValue(_newDate2, this._getLastPickedDateIndex()); } - return false; - }; - //public + break; + } - - TempusDominusBootstrap4.prototype.hide = function hide() { - var transitioning = false; - if (!this.widget) { - return; + case 'decrementHours': + { + if (!lastPicked) { + break; } - // Ignore event if in the middle of a picker transition - this.widget.find('.collapse').each(function () { - var collapseData = $(this).data('collapse'); - if (collapseData && collapseData.transitioning) { - transitioning = true; - return false; - } + + var _newDate3 = lastPicked.clone().subtract(1, 'h'); + + if (this._isValid(_newDate3, 'h')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate3); + } + + this._setValue(_newDate3, this._getLastPickedDateIndex()); + } + + break; + } + + case 'decrementMinutes': + { + if (!lastPicked) { + break; + } + + var _newDate4 = lastPicked.clone().subtract(this._options.stepping, 'm'); + + if (this._isValid(_newDate4, 'm')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate4); + } + + this._setValue(_newDate4, this._getLastPickedDateIndex()); + } + + break; + } + + case 'decrementSeconds': + { + if (!lastPicked) { + break; + } + + var _newDate5 = lastPicked.clone().subtract(1, 's'); + + if (this._isValid(_newDate5, 's')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate5); + } + + this._setValue(_newDate5, this._getLastPickedDateIndex()); + } + + break; + } + + case 'togglePeriod': + { + this._setValue(lastPicked.clone().add(lastPicked.hours() >= 12 ? -12 : 12, 'h'), this._getLastPickedDateIndex()); + + break; + } + + case 'togglePicker': + { + var $this = $(e.target), + $link = $this.closest('a'), + $parent = $this.closest('ul'), + expanded = $parent.find('.show'), + closed = $parent.find('.collapse:not(.show)'), + $span = $this.is('span') ? $this : $this.find('span'); + var collapseData, inactiveIcon, iconTest; + + if (expanded && expanded.length) { + collapseData = expanded.data('collapse'); + + if (collapseData && collapseData.transitioning) { return true; - }); - if (transitioning) { - return; + } + + if (expanded.collapse) { + // if collapse plugin is available through bootstrap.js then use it + expanded.collapse('hide'); + closed.collapse('show'); + } else { + // otherwise just toggle in class on the two views + expanded.removeClass('show'); + closed.addClass('show'); + } + + if (this._useFeatherIcons()) { + $link.toggleClass(this._options.icons.time + ' ' + this._options.icons.date); + inactiveIcon = $link.hasClass(this._options.icons.time) ? this._options.icons.date : this._options.icons.time; + $link.html(this._iconTag(inactiveIcon)); + } else { + $span.toggleClass(this._options.icons.time + ' ' + this._options.icons.date); + } + + if (this._useFeatherIcons()) { + iconTest = $link.hasClass(this._options.icons.date); + } else { + iconTest = $span.hasClass(this._options.icons.date); + } + + if (iconTest) { + $link.attr('title', this._options.tooltips.selectDate); + } else { + $link.attr('title', this._options.tooltips.selectTime); + } } - if (this.component && this.component.hasClass('btn')) { - this.component.toggleClass('active'); - } - this.widget.hide(); + } + break; - $(window).off('resize', this._place()); - this.widget.off('click', '[data-action]'); - this.widget.off('mousedown', false); + case 'showPicker': + this.widget.find('.timepicker > div:not(.timepicker-picker)').hide(); + this.widget.find('.timepicker .timepicker-picker').show(); + break; - this.widget.remove(); - this.widget = false; + case 'showHours': + this.widget.find('.timepicker .timepicker-picker').hide(); + this.widget.find('.timepicker .timepicker-hours').show(); + break; - this._notifyEvent({ - type: DateTimePicker.Event.HIDE, - date: this._getLastPickedDate().clone() - }); + case 'showMinutes': + this.widget.find('.timepicker .timepicker-picker').hide(); + this.widget.find('.timepicker .timepicker-minutes').show(); + break; - if (this.input !== undefined) { - this.input.blur(); - } + case 'showSeconds': + this.widget.find('.timepicker .timepicker-picker').hide(); + this.widget.find('.timepicker .timepicker-seconds').show(); + break; - this._viewDate = this._getLastPickedDate().clone(); - }; + case 'selectHour': + { + var hour = parseInt($(e.target).text(), 10); - TempusDominusBootstrap4.prototype.show = function show() { - var currentMoment = void 0; - var useCurrentGranularity = { - 'year': function year(m) { - return m.month(0).date(1).hours(0).seconds(0).minutes(0); - }, - 'month': function month(m) { - return m.date(1).hours(0).seconds(0).minutes(0); - }, - 'day': function day(m) { - return m.hours(0).seconds(0).minutes(0); - }, - 'hour': function hour(m) { - return m.seconds(0).minutes(0); - }, - 'minute': function minute(m) { - return m.seconds(0); + if (!this.use24Hours) { + if (lastPicked.hours() >= 12) { + if (hour !== 12) { + hour += 12; } - }; - - if (this.input !== undefined) { - if (this.input.prop('disabled') || !this._options.ignoreReadonly && this.input.prop('readonly') || this.widget) { - return; + } else { + if (hour === 12) { + hour = 0; } - if (this.input.val() !== undefined && this.input.val().trim().length !== 0) { - this._setValue(this._parseInputDate(this.input.val().trim()), 0); - } else if (this.unset && this._options.useCurrent) { - currentMoment = this.getMoment(); - if (typeof this._options.useCurrent === 'string') { - currentMoment = useCurrentGranularity[this._options.useCurrent](currentMoment); - } - this._setValue(currentMoment, 0); - } - } else if (this.unset && this._options.useCurrent) { - currentMoment = this.getMoment(); - if (typeof this._options.useCurrent === 'string') { - currentMoment = useCurrentGranularity[this._options.useCurrent](currentMoment); - } - this._setValue(currentMoment, 0); + } } - this.widget = this._getTemplate(); + this._setValue(lastPicked.clone().hours(hour), this._getLastPickedDateIndex()); - this._fillDow(); - this._fillMonths(); - - this.widget.find('.timepicker-hours').hide(); - this.widget.find('.timepicker-minutes').hide(); - this.widget.find('.timepicker-seconds').hide(); - - this._update(); - this._showMode(); - - $(window).on('resize', { picker: this }, this._place); - this.widget.on('click', '[data-action]', $.proxy(this._doAction, this)); // this handles clicks on the widget - this.widget.on('mousedown', false); - - if (this.component && this.component.hasClass('btn')) { - this.component.toggleClass('active'); - } - this._place(); - this.widget.show(); - if (this.input !== undefined && this._options.focusOnShow && !this.input.is(':focus')) { - this.input.focus(); + if (!this._isEnabled('a') && !this._isEnabled('m') && !this._options.keepOpen && !this._options.inline) { + this.hide(); + } else { + this._doAction(e, 'showPicker'); } - this._notifyEvent({ - type: DateTimePicker.Event.SHOW - }); - }; + break; + } - TempusDominusBootstrap4.prototype.destroy = function destroy() { + case 'selectMinute': + this._setValue(lastPicked.clone().minutes(parseInt($(e.target).text(), 10)), this._getLastPickedDateIndex()); + + if (!this._isEnabled('a') && !this._isEnabled('s') && !this._options.keepOpen && !this._options.inline) { this.hide(); - //todo doc off? - this._element.removeData(DateTimePicker.DATA_KEY); - this._element.removeData('date'); - }; + } else { + this._doAction(e, 'showPicker'); + } - TempusDominusBootstrap4.prototype.disable = function disable() { + break; + + case 'selectSecond': + this._setValue(lastPicked.clone().seconds(parseInt($(e.target).text(), 10)), this._getLastPickedDateIndex()); + + if (!this._isEnabled('a') && !this._options.keepOpen && !this._options.inline) { this.hide(); - if (this.component && this.component.hasClass('btn')) { - this.component.addClass('disabled'); - } - if (this.input !== undefined) { - this.input.prop('disabled', true); //todo disable this/comp if input is null - } - }; + } else { + this._doAction(e, 'showPicker'); + } - TempusDominusBootstrap4.prototype.enable = function enable() { - if (this.component && this.component.hasClass('btn')) { - this.component.removeClass('disabled'); - } - if (this.input !== undefined) { - this.input.prop('disabled', false); //todo enable comp/this if input is null - } - }; + break; - TempusDominusBootstrap4.prototype.toolbarPlacement = function toolbarPlacement(_toolbarPlacement) { - if (arguments.length === 0) { - return this._options.toolbarPlacement; + case 'clear': + this.clear(); + break; + + case 'close': + this.hide(); + break; + + case 'today': + { + var todaysDate = this.getMoment(); + + if (this._isValid(todaysDate, 'd')) { + this._setValue(todaysDate, this._getLastPickedDateIndex()); } - if (typeof _toolbarPlacement !== 'string') { - throw new TypeError('toolbarPlacement() expects a string parameter'); - } - if (toolbarPlacements.indexOf(_toolbarPlacement) === -1) { - throw new TypeError('toolbarPlacement() parameter must be one of (' + toolbarPlacements.join(', ') + ') value'); - } - this._options.toolbarPlacement = _toolbarPlacement; + break; + } + } - if (this.widget) { - this.hide(); - this.show(); - } - }; + return false; + } //public + ; - TempusDominusBootstrap4.prototype.widgetPositioning = function widgetPositioning(_widgetPositioning) { - if (arguments.length === 0) { - return $.extend({}, this._options.widgetPositioning); - } + _proto2.hide = function hide() { + var transitioning = false; - if ({}.toString.call(_widgetPositioning) !== '[object Object]') { - throw new TypeError('widgetPositioning() expects an object variable'); - } - if (_widgetPositioning.horizontal) { - if (typeof _widgetPositioning.horizontal !== 'string') { - throw new TypeError('widgetPositioning() horizontal variable must be a string'); - } - _widgetPositioning.horizontal = _widgetPositioning.horizontal.toLowerCase(); - if (horizontalModes.indexOf(_widgetPositioning.horizontal) === -1) { - throw new TypeError('widgetPositioning() expects horizontal parameter to be one of (' + horizontalModes.join(', ') + ')'); - } - this._options.widgetPositioning.horizontal = _widgetPositioning.horizontal; - } - if (_widgetPositioning.vertical) { - if (typeof _widgetPositioning.vertical !== 'string') { - throw new TypeError('widgetPositioning() vertical variable must be a string'); - } - _widgetPositioning.vertical = _widgetPositioning.vertical.toLowerCase(); - if (verticalModes.indexOf(_widgetPositioning.vertical) === -1) { - throw new TypeError('widgetPositioning() expects vertical parameter to be one of (' + verticalModes.join(', ') + ')'); - } - this._options.widgetPositioning.vertical = _widgetPositioning.vertical; - } - this._update(); - }; - - TempusDominusBootstrap4.prototype.widgetParent = function widgetParent(_widgetParent) { - if (arguments.length === 0) { - return this._options.widgetParent; - } - - if (typeof _widgetParent === 'string') { - _widgetParent = $(_widgetParent); - } - - if (_widgetParent !== null && typeof _widgetParent !== 'string' && !(_widgetParent instanceof $)) { - throw new TypeError('widgetParent() expects a string or a jQuery object parameter'); - } - - this._options.widgetParent = _widgetParent; - if (this.widget) { - this.hide(); - this.show(); - } - }; - - //static + if (!this.widget) { + return; + } // Ignore event if in the middle of a picker transition - TempusDominusBootstrap4._jQueryHandleThis = function _jQueryHandleThis(me, option, argument) { - var data = $(me).data(DateTimePicker.DATA_KEY); - if ((typeof option === 'undefined' ? 'undefined' : _typeof(option)) === 'object') { - $.extend({}, DateTimePicker.Default, option); - } + this.widget.find('.collapse').each(function () { + var collapseData = $(this).data('collapse'); - if (!data) { - data = new TempusDominusBootstrap4($(me), option); - $(me).data(DateTimePicker.DATA_KEY, data); - } - - if (typeof option === 'string') { - if (data[option] === undefined) { - throw new Error('No method named "' + option + '"'); - } - if (argument === undefined) { - return data[option](); - } else { - return data[option](argument); - } - } - }; - - TempusDominusBootstrap4._jQueryInterface = function _jQueryInterface(option, argument) { - if (this.length === 1) { - return TempusDominusBootstrap4._jQueryHandleThis(this[0], option, argument); - } - return this.each(function () { - TempusDominusBootstrap4._jQueryHandleThis(this, option, argument); - }); - }; - - return TempusDominusBootstrap4; - }(DateTimePicker); - - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - - $(document).on(DateTimePicker.Event.CLICK_DATA_API, DateTimePicker.Selector.DATA_TOGGLE, function () { - var $target = getSelectorFromElement($(this)); - if ($target.length === 0) { - return; + if (collapseData && collapseData.transitioning) { + transitioning = true; + return false; } - TempusDominusBootstrap4._jQueryInterface.call($target, 'toggle'); - }).on(DateTimePicker.Event.CHANGE, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)); - if ($target.length === 0) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, '_change', event); - }).on(DateTimePicker.Event.BLUR, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)), - config = $target.data(DateTimePicker.DATA_KEY); - if ($target.length === 0) { - return; - } - if (config._options.debug || window.debug) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, 'hide', event); - }).on(DateTimePicker.Event.KEYDOWN, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)); - if ($target.length === 0) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, '_keydown', event); - }).on(DateTimePicker.Event.KEYUP, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)); - if ($target.length === 0) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, '_keyup', event); - }).on(DateTimePicker.Event.FOCUS, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)), - config = $target.data(DateTimePicker.DATA_KEY); - if ($target.length === 0) { - return; - } - if (!config._options.allowInputToggle) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, 'show', event); - }); - $.fn[DateTimePicker.NAME] = TempusDominusBootstrap4._jQueryInterface; - $.fn[DateTimePicker.NAME].Constructor = TempusDominusBootstrap4; - $.fn[DateTimePicker.NAME].noConflict = function () { - $.fn[DateTimePicker.NAME] = JQUERY_NO_CONFLICT; - return TempusDominusBootstrap4._jQueryInterface; + return true; + }); + + if (transitioning) { + return; + } + + if (this.component && this.component.hasClass('btn')) { + this.component.toggleClass('active'); + } + + this.widget.hide(); + $(window).off('resize', this._place); + this.widget.off('click', '[data-action]'); + this.widget.off('mousedown', false); + this.widget.remove(); + this.widget = false; + + if (this.input !== undefined && this.input.val() !== undefined && this.input.val().trim().length !== 0) { + this._setValue(this._parseInputDate(this.input.val().trim(), { + isPickerShow: false + }), 0); + } + + var lastPickedDate = this._getLastPickedDate(); + + this._notifyEvent({ + type: DateTimePicker.Event.HIDE, + date: this.unset ? null : lastPickedDate ? lastPickedDate.clone() : void 0 + }); + + if (this.input !== undefined) { + this.input.blur(); + } + + this._viewDate = lastPickedDate ? lastPickedDate.clone() : this.getMoment(); + }; + + _proto2.show = function show() { + var currentMoment, + shouldUseCurrentIfUnset = false; + var useCurrentGranularity = { + 'year': function year(m) { + return m.month(0).date(1).hours(0).seconds(0).minutes(0); + }, + 'month': function month(m) { + return m.date(1).hours(0).seconds(0).minutes(0); + }, + 'day': function day(m) { + return m.hours(0).seconds(0).minutes(0); + }, + 'hour': function hour(m) { + return m.seconds(0).minutes(0); + }, + 'minute': function minute(m) { + return m.seconds(0); + } + }; + + if (this.input !== undefined) { + if (this.input.prop('disabled') || !this._options.ignoreReadonly && this.input.prop('readonly') || this.widget) { + return; + } + + if (this.input.val() !== undefined && this.input.val().trim().length !== 0) { + this._setValue(this._parseInputDate(this.input.val().trim(), { + isPickerShow: true + }), 0); + } else { + shouldUseCurrentIfUnset = true; + } + } else { + shouldUseCurrentIfUnset = true; + } + + if (shouldUseCurrentIfUnset && this.unset && this._options.useCurrent) { + currentMoment = this.getMoment(); + + if (typeof this._options.useCurrent === 'string') { + currentMoment = useCurrentGranularity[this._options.useCurrent](currentMoment); + } + + this._setValue(currentMoment, 0); + } + + this.widget = this._getTemplate(); + + this._fillDow(); + + this._fillMonths(); + + this.widget.find('.timepicker-hours').hide(); + this.widget.find('.timepicker-minutes').hide(); + this.widget.find('.timepicker-seconds').hide(); + + this._update(); + + this._showMode(); + + $(window).on('resize', { + picker: this + }, this._place); + this.widget.on('click', '[data-action]', $.proxy(this._doAction, this)); // this handles clicks on the widget + + this.widget.on('mousedown', false); + + if (this.component && this.component.hasClass('btn')) { + this.component.toggleClass('active'); + } + + this._place(); + + this.widget.show(); + + if (this.input !== undefined && this._options.focusOnShow && !this.input.is(':focus')) { + this.input.focus(); + } + + this._notifyEvent({ + type: DateTimePicker.Event.SHOW + }); + }; + + _proto2.destroy = function destroy() { + this.hide(); //todo doc off? + + this._element.removeData(DateTimePicker.DATA_KEY); + + this._element.removeData('date'); + }; + + _proto2.disable = function disable() { + this.hide(); + + if (this.component && this.component.hasClass('btn')) { + this.component.addClass('disabled'); + } + + if (this.input !== undefined) { + this.input.prop('disabled', true); //todo disable this/comp if input is null + } + }; + + _proto2.enable = function enable() { + if (this.component && this.component.hasClass('btn')) { + this.component.removeClass('disabled'); + } + + if (this.input !== undefined) { + this.input.prop('disabled', false); //todo enable comp/this if input is null + } + }; + + _proto2.toolbarPlacement = function toolbarPlacement(_toolbarPlacement) { + if (arguments.length === 0) { + return this._options.toolbarPlacement; + } + + if (typeof _toolbarPlacement !== 'string') { + throw new TypeError('toolbarPlacement() expects a string parameter'); + } + + if (toolbarPlacements.indexOf(_toolbarPlacement) === -1) { + throw new TypeError("toolbarPlacement() parameter must be one of (" + toolbarPlacements.join(', ') + ") value"); + } + + this._options.toolbarPlacement = _toolbarPlacement; + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto2.widgetPositioning = function widgetPositioning(_widgetPositioning) { + if (arguments.length === 0) { + return $.extend({}, this._options.widgetPositioning); + } + + if ({}.toString.call(_widgetPositioning) !== '[object Object]') { + throw new TypeError('widgetPositioning() expects an object variable'); + } + + if (_widgetPositioning.horizontal) { + if (typeof _widgetPositioning.horizontal !== 'string') { + throw new TypeError('widgetPositioning() horizontal variable must be a string'); + } + + _widgetPositioning.horizontal = _widgetPositioning.horizontal.toLowerCase(); + + if (horizontalModes.indexOf(_widgetPositioning.horizontal) === -1) { + throw new TypeError("widgetPositioning() expects horizontal parameter to be one of (" + horizontalModes.join(', ') + ")"); + } + + this._options.widgetPositioning.horizontal = _widgetPositioning.horizontal; + } + + if (_widgetPositioning.vertical) { + if (typeof _widgetPositioning.vertical !== 'string') { + throw new TypeError('widgetPositioning() vertical variable must be a string'); + } + + _widgetPositioning.vertical = _widgetPositioning.vertical.toLowerCase(); + + if (verticalModes.indexOf(_widgetPositioning.vertical) === -1) { + throw new TypeError("widgetPositioning() expects vertical parameter to be one of (" + verticalModes.join(', ') + ")"); + } + + this._options.widgetPositioning.vertical = _widgetPositioning.vertical; + } + + this._update(); + }; + + _proto2.widgetParent = function widgetParent(_widgetParent) { + if (arguments.length === 0) { + return this._options.widgetParent; + } + + if (typeof _widgetParent === 'string') { + _widgetParent = $(_widgetParent); + } + + if (_widgetParent !== null && typeof _widgetParent !== 'string' && !(_widgetParent instanceof $)) { + throw new TypeError('widgetParent() expects a string or a jQuery object parameter'); + } + + this._options.widgetParent = _widgetParent; + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto2.setMultiDate = function setMultiDate(multiDateArray) { + var dateFormat = this._options.format; + this.clear(); + + for (var index = 0; index < multiDateArray.length; index++) { + var date = moment(multiDateArray[index], dateFormat); + + this._setValue(date, index); + } + } //static + ; + + TempusDominusBootstrap4._jQueryHandleThis = function _jQueryHandleThis(me, option, argument) { + var data = $(me).data(DateTimePicker.DATA_KEY); + + if (typeof option === 'object') { + $.extend({}, DateTimePicker.Default, option); + } + + if (!data) { + data = new TempusDominusBootstrap4($(me), option); + $(me).data(DateTimePicker.DATA_KEY, data); + } + + if (typeof option === 'string') { + if (data[option] === undefined) { + throw new Error("No method named \"" + option + "\""); + } + + if (argument === undefined) { + return data[option](); + } else { + if (option === 'date') { + data.isDateUpdateThroughDateOptionFromClientCode = true; + } + + var ret = data[option](argument); + data.isDateUpdateThroughDateOptionFromClientCode = false; + return ret; + } + } + }; + + TempusDominusBootstrap4._jQueryInterface = function _jQueryInterface(option, argument) { + if (this.length === 1) { + return TempusDominusBootstrap4._jQueryHandleThis(this[0], option, argument); + } + + return this.each(function () { + TempusDominusBootstrap4._jQueryHandleThis(this, option, argument); + }); }; return TempusDominusBootstrap4; + }(DateTimePicker); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $(document).on(DateTimePicker.Event.CLICK_DATA_API, DateTimePicker.Selector.DATA_TOGGLE, function () { + var $originalTarget = $(this), + $target = getSelectorFromElement($originalTarget), + config = $target.data(DateTimePicker.DATA_KEY); + + if ($target.length === 0) { + return; + } + + if (config._options.allowInputToggle && $originalTarget.is('input[data-toggle="datetimepicker"]')) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, 'toggle'); + }).on(DateTimePicker.Event.CHANGE, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)); + + if ($target.length === 0 || event.isInit) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, '_change', event); + }).on(DateTimePicker.Event.BLUR, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)), + config = $target.data(DateTimePicker.DATA_KEY); + + if ($target.length === 0) { + return; + } + + if (config._options.debug || window.debug) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, 'hide', event); + }).on(DateTimePicker.Event.KEYDOWN, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)); + + if ($target.length === 0) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, '_keydown', event); + }).on(DateTimePicker.Event.KEYUP, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)); + + if ($target.length === 0) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, '_keyup', event); + }).on(DateTimePicker.Event.FOCUS, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)), + config = $target.data(DateTimePicker.DATA_KEY); + + if ($target.length === 0) { + return; + } + + if (!config._options.allowInputToggle) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, 'show', event); + }); + $.fn[DateTimePicker.NAME] = TempusDominusBootstrap4._jQueryInterface; + $.fn[DateTimePicker.NAME].Constructor = TempusDominusBootstrap4; + + $.fn[DateTimePicker.NAME].noConflict = function () { + $.fn[DateTimePicker.NAME] = JQUERY_NO_CONFLICT; + return TempusDominusBootstrap4._jQueryInterface; + }; + + return TempusDominusBootstrap4; }(jQuery); }(); diff --git a/static/babybuddy/js/vendor.b28919e31f4a.js.gz b/static/babybuddy/js/vendor.c72a03a06acd.js.gz similarity index 57% rename from static/babybuddy/js/vendor.b28919e31f4a.js.gz rename to static/babybuddy/js/vendor.c72a03a06acd.js.gz index 17d9a57c..dc750387 100644 Binary files a/static/babybuddy/js/vendor.b28919e31f4a.js.gz and b/static/babybuddy/js/vendor.c72a03a06acd.js.gz differ diff --git a/static/babybuddy/js/vendor.js b/static/babybuddy/js/vendor.js index 23e76bc8..48555e2a 100644 --- a/static/babybuddy/js/vendor.js +++ b/static/babybuddy/js/vendor.js @@ -18279,7 +18279,7 @@ return Popper; //! moment.js -//! version : 2.29.1 +//! version : 2.29.3 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com @@ -18356,8 +18356,9 @@ return Popper; function map(arr, fn) { var res = [], - i; - for (i = 0; i < arr.length; ++i) { + i, + arrLen = arr.length; + for (i = 0; i < arrLen; ++i) { res.push(fn(arr[i], i)); } return res; @@ -18486,7 +18487,10 @@ return Popper; updateInProgress = false; function copyConfig(to, from) { - var i, prop, val; + var i, + prop, + val, + momentPropertiesLen = momentProperties.length; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; @@ -18519,8 +18523,8 @@ return Popper; to._locale = from._locale; } - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { + if (momentPropertiesLen > 0) { + for (i = 0; i < momentPropertiesLen; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { @@ -18575,8 +18579,9 @@ return Popper; var args = [], arg, i, - key; - for (i = 0; i < arguments.length; i++) { + key, + argLen = arguments.length; + for (i = 0; i < argLen; i++) { arg = ''; if (typeof arguments[i] === 'object') { arg += '\n[' + i + '] '; @@ -18726,7 +18731,8 @@ return Popper; ); } - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, + var formattingTokens = + /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {}; @@ -19030,8 +19036,9 @@ return Popper; if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units), - i; - for (i = 0; i < prioritized.length; i++) { + i, + prioritizedLen = prioritized.length; + for (i = 0; i < prioritizedLen; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { @@ -19061,7 +19068,8 @@ return Popper; matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months - matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, + matchWord = + /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, regexes; regexes = {}; @@ -19087,15 +19095,12 @@ return Popper; return regexEscape( s .replace('\\', '') - .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function ( - matched, - p1, - p2, - p3, - p4 - ) { - return p1 || p2 || p3 || p4; - }) + .replace( + /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, + function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + } + ) ); } @@ -19107,7 +19112,8 @@ return Popper; function addParseToken(token, callback) { var i, - func = callback; + func = callback, + tokenLen; if (typeof token === 'string') { token = [token]; } @@ -19116,7 +19122,8 @@ return Popper; array[callback] = toInt(input); }; } - for (i = 0; i < token.length; i++) { + tokenLen = token.length; + for (i = 0; i < tokenLen; i++) { tokens[token[i]] = func; } } @@ -19227,12 +19234,12 @@ return Popper; // LOCALES - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split( - '_' - ), - defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split( - '_' - ), + var defaultLocaleMonths = + 'January_February_March_April_May_June_July_August_September_October_November_December'.split( + '_' + ), + defaultLocaleMonthsShort = + 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, defaultMonthsShortRegex = matchWord, defaultMonthsRegex = matchWord; @@ -19674,14 +19681,12 @@ return Popper; addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); - addWeekParseToken(['w', 'ww', 'W', 'WW'], function ( - input, - week, - config, - token - ) { - week[token.substr(0, 1)] = toInt(input); - }); + addWeekParseToken( + ['w', 'ww', 'W', 'WW'], + function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + } + ); // HELPERS @@ -19806,9 +19811,8 @@ return Popper; return ws.slice(n, 7).concat(ws.slice(0, n)); } - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split( - '_' - ), + var defaultLocaleWeekdays = + 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), defaultWeekdaysRegex = matchWord, @@ -20356,6 +20360,11 @@ return Popper; return globalLocale; } + function isLocaleNameSane(name) { + // Prevent names that look like filesystem paths, i.e contain '/' or '\' + return name.match('^[^/\\\\]*$') != null; + } + function loadLocale(name) { var oldLocale = null, aliasedRequire; @@ -20364,7 +20373,8 @@ return Popper; locales[name] === undefined && typeof module !== 'undefined' && module && - module.exports + module.exports && + isLocaleNameSane(name) ) { try { oldLocale = globalLocale._abbr; @@ -20581,8 +20591,10 @@ return Popper; // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, - basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + var extendedIsoRegex = + /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + basicIsoRegex = + /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], @@ -20613,7 +20625,8 @@ return Popper; ], aspNetJsonRegex = /^\/?Date\((-?\d+)/i, // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 - rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, + rfc2822 = + /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, obsOffsets = { UT: 0, GMT: 0, @@ -20636,12 +20649,13 @@ return Popper; allowTime, dateFormat, timeFormat, - tzFormat; + tzFormat, + isoDatesLen = isoDates.length, + isoTimesLen = isoTimes.length; if (match) { getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { + for (i = 0, l = isoDatesLen; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; @@ -20653,7 +20667,7 @@ return Popper; return; } if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { + for (i = 0, l = isoTimesLen; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { // match[2] should be 'T' or space timeFormat = (match[2] || ' ') + isoTimes[i][0]; @@ -21033,12 +21047,13 @@ return Popper; skipped, stringLength = string.length, totalParsedInputLength = 0, - era; + era, + tokenLen; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { + tokenLen = tokens.length; + for (i = 0; i < tokenLen; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; @@ -21133,15 +21148,16 @@ return Popper; i, currentScore, validFormatFound, - bestFormatIsValid = false; + bestFormatIsValid = false, + configfLen = config._f.length; - if (config._f.length === 0) { + if (configfLen === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } - for (i = 0; i < config._f.length; i++) { + for (i = 0; i < configfLen; i++) { currentScore = 0; validFormatFound = false; tempConfig = copyConfig({}, config); @@ -21382,7 +21398,8 @@ return Popper; function isDurationValid(m) { var key, unitHasDecimal = false, - i; + i, + orderLen = ordering.length; for (key in m) { if ( hasOwnProp(m, key) && @@ -21395,7 +21412,7 @@ return Popper; } } - for (i = 0; i < ordering.length; ++i) { + for (i = 0; i < orderLen; ++i) { if (m[ordering[i]]) { if (unitHasDecimal) { return false; // only allow non-integers for smallest unit @@ -21720,7 +21737,8 @@ return Popper; // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere // and further modified to allow for strings containing both week and day - isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + isoRegex = + /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function createDuration(input, key) { var duration = input, @@ -21941,9 +21959,10 @@ return Popper; 'ms', ], i, - property; + property, + propertyLen = properties.length; - for (i = 0; i < properties.length; i += 1) { + for (i = 0; i < propertyLen; i += 1) { property = properties[i]; propertyTest = propertyTest || hasOwnProp(input, property); } @@ -22566,19 +22585,17 @@ return Popper; addRegexToken('NNNN', matchEraName); addRegexToken('NNNNN', matchEraNarrow); - addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function ( - input, - array, - config, - token - ) { - var era = config._locale.erasParse(input, token, config._strict); - if (era) { - getParsingFlags(config).era = era; - } else { - getParsingFlags(config).invalidEra = input; + addParseToken( + ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], + function (input, array, config, token) { + var era = config._locale.erasParse(input, token, config._strict); + if (era) { + getParsingFlags(config).era = era; + } else { + getParsingFlags(config).invalidEra = input; + } } - }); + ); addRegexToken('y', matchUnsigned); addRegexToken('yy', matchUnsigned); @@ -22870,14 +22887,12 @@ return Popper; addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function ( - input, - week, - config, - token - ) { - week[token.substr(0, 2)] = toInt(input); - }); + addWeekParseToken( + ['gggg', 'ggggg', 'GGGG', 'GGGGG'], + function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + } + ); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = hooks.parseTwoDigitYear(input); @@ -23900,7 +23915,7 @@ return Popper; //! moment.js - hooks.version = '2.29.1'; + hooks.version = '2.29.3'; setHookCallback(createLocal); @@ -23964,21 +23979,24 @@ return Popper; var ca = moment.defineLocale('ca', { months: { - standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split( - '_' - ), + standalone: + 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split( + '_' + ), format: "de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split( '_' ), isFormat: /D[oD]?(\s)+MMMM/, }, - monthsShort: 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split( - '_' - ), + monthsShort: + 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split( + '_' + ), monthsParseExact: true, - weekdays: 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split( - '_' - ), + weekdays: + 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split( + '_' + ), weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'), weekdaysParseExact: true, @@ -24092,13 +24110,13 @@ return Popper; months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split( '_' ), - monthsShort: 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split( - '_' - ), + monthsShort: + 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), monthsParseExact: true, - weekdays: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split( - '_' - ), + weekdays: + 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split( + '_' + ), weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), weekdaysParseExact: true, @@ -24241,9 +24259,10 @@ return Popper; //! moment.js locale configuration - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split( - '_' - ), + var monthsShortDot = + 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split( + '_' + ), monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'), monthsParse = [ /^ene/i, @@ -24259,7 +24278,8 @@ return Popper; /^nov/i, /^dic/i, ], - monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + monthsRegex = + /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; var es = moment.defineLocale('es', { months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split( @@ -24276,8 +24296,10 @@ return Popper; }, monthsRegex: monthsRegex, monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsStrictRegex: + /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex: + /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, monthsParse: monthsParse, longMonthsParse: monthsParse, shortMonthsParse: monthsParse, @@ -24359,9 +24381,10 @@ return Popper; //! moment.js locale configuration - var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split( - ' ' - ), + var numbersPast = + 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split( + ' ' + ), numbersFuture = [ 'nolla', 'yhden', @@ -24423,12 +24446,14 @@ return Popper; months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split( '_' ), - monthsShort: 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split( - '_' - ), - weekdays: 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split( - '_' - ), + monthsShort: + 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split( + '_' + ), + weekdays: + 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split( + '_' + ), weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'), weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'), longDateFormat: { @@ -24492,9 +24517,12 @@ return Popper; //! moment.js locale configuration - var monthsStrictRegex = /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i, - monthsShortStrictRegex = /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i, - monthsRegex = /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i, + var monthsStrictRegex = + /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i, + monthsShortStrictRegex = + /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i, + monthsRegex = + /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i, monthsParse = [ /^janv/i, /^févr/i, @@ -24514,9 +24542,10 @@ return Popper; months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split( '_' ), - monthsShort: 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split( - '_' - ), + monthsShort: + 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split( + '_' + ), monthsRegex: monthsRegex, monthsShortRegex: monthsRegex, monthsStrictRegex: monthsStrictRegex, @@ -24727,12 +24756,10 @@ return Popper; //! moment.js locale configuration - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split( - '_' - ), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split( - '_' - ), + var monthsShortWithDots = + 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = + 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'), monthsParse = [ /^jan/i, /^feb/i, @@ -24747,7 +24774,8 @@ return Popper; /^nov/i, /^dec/i, ], - monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + monthsRegex = + /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; var nl = moment.defineLocale('nl', { months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split( @@ -24765,16 +24793,17 @@ return Popper; monthsRegex: monthsRegex, monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + monthsStrictRegex: + /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: + /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, monthsParse: monthsParse, longMonthsParse: monthsParse, shortMonthsParse: monthsParse, - weekdays: 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split( - '_' - ), + weekdays: + 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'), weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'), weekdaysParseExact: true, @@ -24842,12 +24871,14 @@ return Popper; //! moment.js locale configuration - var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split( - '_' - ), - monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split( - '_' - ), + var monthsNominative = + 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split( + '_' + ), + monthsSubjective = + 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split( + '_' + ), monthsParse = [ /^sty/i, /^lut/i, @@ -24901,9 +24932,8 @@ return Popper; monthsParse: monthsParse, longMonthsParse: monthsParse, shortMonthsParse: monthsParse, - weekdays: 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split( - '_' - ), + weekdays: + 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), longDateFormat: { @@ -24998,9 +25028,10 @@ return Popper; '_' ), monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'), - weekdays: 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split( - '_' - ), + weekdays: + 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split( + '_' + ), weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), weekdaysParseExact: true, @@ -25177,7 +25208,7 @@ return Popper; weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split( '_' ), - weekdaysShort: 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'), weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), meridiem: function (hours, minutes, isLower) { if (hours < 12) { @@ -26931,9 +26962,9 @@ return Popper; return moment; })); -/*@preserve - * Tempus Dominus Bootstrap4 v5.1.2 (https://tempusdominus.github.io/bootstrap-4/) - * Copyright 2016-2018 Jonathan Peterson +/*!@preserve + * Tempus Dominus Bootstrap4 v5.39.0 (https://tempusdominus.github.io/bootstrap-4/) + * Copyright 2016-2020 Jonathan Peterson and contributors * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE) */ @@ -26960,2753 +26991,3479 @@ if ((version[0] <= 2 && version[1] < 17) || (version[0] >= 3)) { +function () { -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -// ReSharper disable once InconsistentNaming -var DateTimePicker = function ($, moment) { - // ReSharper disable InconsistentNaming - var NAME = 'datetimepicker', - DATA_KEY = '' + NAME, - EVENT_KEY = '.' + DATA_KEY, - DATA_API_KEY = '.data-api', - Selector = { - DATA_TOGGLE: '[data-toggle="' + DATA_KEY + '"]' - }, - ClassName = { - INPUT: NAME + '-input' - }, - Event = { - CHANGE: 'change' + EVENT_KEY, - BLUR: 'blur' + EVENT_KEY, - KEYUP: 'keyup' + EVENT_KEY, - KEYDOWN: 'keydown' + EVENT_KEY, - FOCUS: 'focus' + EVENT_KEY, - CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY, - //emitted - UPDATE: 'update' + EVENT_KEY, - ERROR: 'error' + EVENT_KEY, - HIDE: 'hide' + EVENT_KEY, - SHOW: 'show' + EVENT_KEY - }, - DatePickerModes = [{ - CLASS_NAME: 'days', - NAV_FUNCTION: 'M', - NAV_STEP: 1 - }, { - CLASS_NAME: 'months', - NAV_FUNCTION: 'y', - NAV_STEP: 1 - }, { - CLASS_NAME: 'years', - NAV_FUNCTION: 'y', - NAV_STEP: 10 - }, { - CLASS_NAME: 'decades', - NAV_FUNCTION: 'y', - NAV_STEP: 100 - }], - KeyMap = { - 'up': 38, - 38: 'up', - 'down': 40, - 40: 'down', - 'left': 37, - 37: 'left', - 'right': 39, - 39: 'right', - 'tab': 9, - 9: 'tab', - 'escape': 27, - 27: 'escape', - 'enter': 13, - 13: 'enter', - 'pageUp': 33, - 33: 'pageUp', - 'pageDown': 34, - 34: 'pageDown', - 'shift': 16, - 16: 'shift', - 'control': 17, - 17: 'control', - 'space': 32, - 32: 'space', - 't': 84, - 84: 't', - 'delete': 46, - 46: 'delete' - }, - ViewModes = ['times', 'days', 'months', 'years', 'decades'], - keyState = {}, - keyPressHandled = {}; - - var Default = { - timeZone: '', - format: false, - dayViewHeaderFormat: 'MMMM YYYY', - extraFormats: false, - stepping: 1, - minDate: false, - maxDate: false, - useCurrent: true, - collapse: true, - locale: moment.locale(), - defaultDate: false, - disabledDates: false, - enabledDates: false, - icons: { - time: 'fa fa-clock-o', - date: 'fa fa-calendar', - up: 'fa fa-arrow-up', - down: 'fa fa-arrow-down', - previous: 'fa fa-chevron-left', - next: 'fa fa-chevron-right', - today: 'fa fa-calendar-check-o', - clear: 'fa fa-delete', - close: 'fa fa-times' - }, - tooltips: { - today: 'Go to today', - clear: 'Clear selection', - close: 'Close the picker', - selectMonth: 'Select Month', - prevMonth: 'Previous Month', - nextMonth: 'Next Month', - selectYear: 'Select Year', - prevYear: 'Previous Year', - nextYear: 'Next Year', - selectDecade: 'Select Decade', - prevDecade: 'Previous Decade', - nextDecade: 'Next Decade', - prevCentury: 'Previous Century', - nextCentury: 'Next Century', - pickHour: 'Pick Hour', - incrementHour: 'Increment Hour', - decrementHour: 'Decrement Hour', - pickMinute: 'Pick Minute', - incrementMinute: 'Increment Minute', - decrementMinute: 'Decrement Minute', - pickSecond: 'Pick Second', - incrementSecond: 'Increment Second', - decrementSecond: 'Decrement Second', - togglePeriod: 'Toggle Period', - selectTime: 'Select Time', - selectDate: 'Select Date' - }, - useStrict: false, - sideBySide: false, - daysOfWeekDisabled: false, - calendarWeeks: false, - viewMode: 'days', - toolbarPlacement: 'default', - buttons: { - showToday: false, - showClear: false, - showClose: false - }, - widgetPositioning: { - horizontal: 'auto', - vertical: 'auto' - }, - widgetParent: null, - ignoreReadonly: false, - keepOpen: false, - focusOnShow: true, - inline: false, - keepInvalid: false, - keyBinds: { - up: function up() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().subtract(7, 'd')); - } else { - this.date(d.clone().add(this.stepping(), 'm')); - } - return true; - }, - down: function down() { - if (!this.widget) { - this.show(); - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().add(7, 'd')); - } else { - this.date(d.clone().subtract(this.stepping(), 'm')); - } - return true; - }, - 'control up': function controlUp() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().subtract(1, 'y')); - } else { - this.date(d.clone().add(1, 'h')); - } - return true; - }, - 'control down': function controlDown() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().add(1, 'y')); - } else { - this.date(d.clone().subtract(1, 'h')); - } - return true; - }, - left: function left() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().subtract(1, 'd')); - } - return true; - }, - right: function right() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().add(1, 'd')); - } - return true; - }, - pageUp: function pageUp() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().subtract(1, 'M')); - } - return true; - }, - pageDown: function pageDown() { - if (!this.widget) { - return false; - } - var d = this._dates[0] || this.getMoment(); - if (this.widget.find('.datepicker').is(':visible')) { - this.date(d.clone().add(1, 'M')); - } - return true; - }, - enter: function enter() { - if (!this.widget) { - return false; - } - this.hide(); - return true; - }, - escape: function escape() { - if (!this.widget) { - return false; - } - this.hide(); - return true; - }, - 'control space': function controlSpace() { - if (!this.widget) { - return false; - } - if (this.widget.find('.timepicker').is(':visible')) { - this.widget.find('.btn[data-action="togglePeriod"]').click(); - } - return true; - }, - t: function t() { - if (!this.widget) { - return false; - } - this.date(this.getMoment()); - return true; - }, - 'delete': function _delete() { - if (!this.widget) { - return false; - } - this.clear(); - return true; - } - }, - debug: false, - allowInputToggle: false, - disabledTimeIntervals: false, - disabledHours: false, - enabledHours: false, - viewDate: false, - allowMultidate: false, - multidateSeparator: ',' - }; - - // ReSharper restore InconsistentNaming - - // ReSharper disable once DeclarationHides - // ReSharper disable once InconsistentNaming - - var DateTimePicker = function () { - /** @namespace eData.dateOptions */ - /** @namespace moment.tz */ - - function DateTimePicker(element, options) { - _classCallCheck(this, DateTimePicker); - - this._options = this._getOptions(options); - this._element = element; - this._dates = []; - this._datesFormatted = []; - this._viewDate = null; - this.unset = true; - this.component = false; - this.widget = false; - this.use24Hours = null; - this.actualFormat = null; - this.parseFormats = null; - this.currentViewMode = null; - this.MinViewModeNumber = 0; - - this._int(); - } - - /** - * @return {string} - */ - - - //private - - DateTimePicker.prototype._int = function _int() { - var targetInput = this._element.data('target-input'); - if (this._element.is('input')) { - this.input = this._element; - } else if (targetInput !== undefined) { - if (targetInput === 'nearest') { - this.input = this._element.find('input'); - } else { - this.input = $(targetInput); - } - } - - this._dates = []; - this._dates[0] = this.getMoment(); - this._viewDate = this.getMoment().clone(); - - $.extend(true, this._options, this._dataToOptions()); - - this.options(this._options); - - this._initFormatting(); - - if (this.input !== undefined && this.input.is('input') && this.input.val().trim().length !== 0) { - this._setValue(this._parseInputDate(this.input.val().trim()), 0); - } else if (this._options.defaultDate && this.input !== undefined && this.input.attr('placeholder') === undefined) { - this._setValue(this._options.defaultDate, 0); - } - if (this._options.inline) { - this.show(); - } - }; - - DateTimePicker.prototype._update = function _update() { - if (!this.widget) { - return; - } - this._fillDate(); - this._fillTime(); - }; - - DateTimePicker.prototype._setValue = function _setValue(targetMoment, index) { - var oldDate = this.unset ? null : this._dates[index]; - var outpValue = ''; - // case of calling setValue(null or false) - if (!targetMoment) { - if (!this._options.allowMultidate || this._dates.length === 1) { - this.unset = true; - this._dates = []; - this._datesFormatted = []; - } else { - outpValue = this._element.data('date') + ','; - outpValue = outpValue.replace(oldDate.format(this.actualFormat) + ',', '').replace(',,', '').replace(/,\s*$/, ''); - this._dates.splice(index, 1); - this._datesFormatted.splice(index, 1); - } - if (this.input !== undefined) { - this.input.val(outpValue); - this.input.trigger('input'); - } - this._element.data('date', outpValue); - this._notifyEvent({ - type: DateTimePicker.Event.CHANGE, - date: false, - oldDate: oldDate - }); - this._update(); - return; - } - - targetMoment = targetMoment.clone().locale(this._options.locale); - - if (this._hasTimeZone()) { - targetMoment.tz(this._options.timeZone); - } - - if (this._options.stepping !== 1) { - targetMoment.minutes(Math.round(targetMoment.minutes() / this._options.stepping) * this._options.stepping).seconds(0); - } - - if (this._isValid(targetMoment)) { - this._dates[index] = targetMoment; - this._datesFormatted[index] = targetMoment.format('YYYY-MM-DD'); - this._viewDate = targetMoment.clone(); - if (this._options.allowMultidate && this._dates.length > 1) { - for (var i = 0; i < this._dates.length; i++) { - outpValue += '' + this._dates[i].format(this.actualFormat) + this._options.multidateSeparator; - } - outpValue = outpValue.replace(/,\s*$/, ''); - } else { - outpValue = this._dates[index].format(this.actualFormat); - } - if (this.input !== undefined) { - this.input.val(outpValue); - this.input.trigger('input'); - } - this._element.data('date', outpValue); - - this.unset = false; - this._update(); - this._notifyEvent({ - type: DateTimePicker.Event.CHANGE, - date: this._dates[index].clone(), - oldDate: oldDate - }); - } else { - if (!this._options.keepInvalid) { - if (this.input !== undefined) { - this.input.val('' + (this.unset ? '' : this._dates[index].format(this.actualFormat))); - this.input.trigger('input'); - } - } else { - this._notifyEvent({ - type: DateTimePicker.Event.CHANGE, - date: targetMoment, - oldDate: oldDate - }); - } - this._notifyEvent({ - type: DateTimePicker.Event.ERROR, - date: targetMoment, - oldDate: oldDate - }); - } - }; - - DateTimePicker.prototype._change = function _change(e) { - var val = $(e.target).val().trim(), - parsedDate = val ? this._parseInputDate(val) : null; - this._setValue(parsedDate); - e.stopImmediatePropagation(); - return false; - }; - - //noinspection JSMethodCanBeStatic - - - DateTimePicker.prototype._getOptions = function _getOptions(options) { - options = $.extend(true, {}, Default, options); - return options; - }; - - DateTimePicker.prototype._hasTimeZone = function _hasTimeZone() { - return moment.tz !== undefined && this._options.timeZone !== undefined && this._options.timeZone !== null && this._options.timeZone !== ''; - }; - - DateTimePicker.prototype._isEnabled = function _isEnabled(granularity) { - if (typeof granularity !== 'string' || granularity.length > 1) { - throw new TypeError('isEnabled expects a single character string parameter'); - } - switch (granularity) { - case 'y': - return this.actualFormat.indexOf('Y') !== -1; - case 'M': - return this.actualFormat.indexOf('M') !== -1; - case 'd': - return this.actualFormat.toLowerCase().indexOf('d') !== -1; - case 'h': - case 'H': - return this.actualFormat.toLowerCase().indexOf('h') !== -1; - case 'm': - return this.actualFormat.indexOf('m') !== -1; - case 's': - return this.actualFormat.indexOf('s') !== -1; - case 'a': - case 'A': - return this.actualFormat.toLowerCase().indexOf('a') !== -1; - default: - return false; - } - }; - - DateTimePicker.prototype._hasTime = function _hasTime() { - return this._isEnabled('h') || this._isEnabled('m') || this._isEnabled('s'); - }; - - DateTimePicker.prototype._hasDate = function _hasDate() { - return this._isEnabled('y') || this._isEnabled('M') || this._isEnabled('d'); - }; - - DateTimePicker.prototype._dataToOptions = function _dataToOptions() { - var eData = this._element.data(); - var dataOptions = {}; - - if (eData.dateOptions && eData.dateOptions instanceof Object) { - dataOptions = $.extend(true, dataOptions, eData.dateOptions); - } - - $.each(this._options, function (key) { - var attributeName = 'date' + key.charAt(0).toUpperCase() + key.slice(1); //todo data api key - if (eData[attributeName] !== undefined) { - dataOptions[key] = eData[attributeName]; - } else { - delete dataOptions[key]; - } - }); - return dataOptions; - }; - - DateTimePicker.prototype._notifyEvent = function _notifyEvent(e) { - if (e.type === DateTimePicker.Event.CHANGE && (e.date && e.date.isSame(e.oldDate)) || !e.date && !e.oldDate) { - return; - } - this._element.trigger(e); - }; - - DateTimePicker.prototype._viewUpdate = function _viewUpdate(e) { - if (e === 'y') { - e = 'YYYY'; - } - this._notifyEvent({ - type: DateTimePicker.Event.UPDATE, - change: e, - viewDate: this._viewDate.clone() - }); - }; - - DateTimePicker.prototype._showMode = function _showMode(dir) { - if (!this.widget) { - return; - } - if (dir) { - this.currentViewMode = Math.max(this.MinViewModeNumber, Math.min(3, this.currentViewMode + dir)); - } - this.widget.find('.datepicker > div').hide().filter('.datepicker-' + DatePickerModes[this.currentViewMode].CLASS_NAME).show(); - }; - - DateTimePicker.prototype._isInDisabledDates = function _isInDisabledDates(testDate) { - return this._options.disabledDates[testDate.format('YYYY-MM-DD')] === true; - }; - - DateTimePicker.prototype._isInEnabledDates = function _isInEnabledDates(testDate) { - return this._options.enabledDates[testDate.format('YYYY-MM-DD')] === true; - }; - - DateTimePicker.prototype._isInDisabledHours = function _isInDisabledHours(testDate) { - return this._options.disabledHours[testDate.format('H')] === true; - }; - - DateTimePicker.prototype._isInEnabledHours = function _isInEnabledHours(testDate) { - return this._options.enabledHours[testDate.format('H')] === true; - }; - - DateTimePicker.prototype._isValid = function _isValid(targetMoment, granularity) { - if (!targetMoment.isValid()) { - return false; - } - if (this._options.disabledDates && granularity === 'd' && this._isInDisabledDates(targetMoment)) { - return false; - } - if (this._options.enabledDates && granularity === 'd' && !this._isInEnabledDates(targetMoment)) { - return false; - } - if (this._options.minDate && targetMoment.isBefore(this._options.minDate, granularity)) { - return false; - } - if (this._options.maxDate && targetMoment.isAfter(this._options.maxDate, granularity)) { - return false; - } - if (this._options.daysOfWeekDisabled && granularity === 'd' && this._options.daysOfWeekDisabled.indexOf(targetMoment.day()) !== -1) { - return false; - } - if (this._options.disabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && this._isInDisabledHours(targetMoment)) { - return false; - } - if (this._options.enabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && !this._isInEnabledHours(targetMoment)) { - return false; - } - if (this._options.disabledTimeIntervals && (granularity === 'h' || granularity === 'm' || granularity === 's')) { - var found = false; - $.each(this._options.disabledTimeIntervals, function () { - if (targetMoment.isBetween(this[0], this[1])) { - found = true; - return false; - } - }); - if (found) { - return false; - } - } - return true; - }; - - DateTimePicker.prototype._parseInputDate = function _parseInputDate(inputDate) { - if (this._options.parseInputDate === undefined) { - if (!moment.isMoment(inputDate)) { - inputDate = this.getMoment(inputDate); - } - } else { - inputDate = this._options.parseInputDate(inputDate); - } - //inputDate.locale(this.options.locale); - return inputDate; - }; - - DateTimePicker.prototype._keydown = function _keydown(e) { - var handler = null, - index = void 0, - index2 = void 0, - keyBindKeys = void 0, - allModifiersPressed = void 0; - var pressedKeys = [], - pressedModifiers = {}, - currentKey = e.which, - pressed = 'p'; - - keyState[currentKey] = pressed; - - for (index in keyState) { - if (keyState.hasOwnProperty(index) && keyState[index] === pressed) { - pressedKeys.push(index); - if (parseInt(index, 10) !== currentKey) { - pressedModifiers[index] = true; - } - } - } - - for (index in this._options.keyBinds) { - if (this._options.keyBinds.hasOwnProperty(index) && typeof this._options.keyBinds[index] === 'function') { - keyBindKeys = index.split(' '); - if (keyBindKeys.length === pressedKeys.length && KeyMap[currentKey] === keyBindKeys[keyBindKeys.length - 1]) { - allModifiersPressed = true; - for (index2 = keyBindKeys.length - 2; index2 >= 0; index2--) { - if (!(KeyMap[keyBindKeys[index2]] in pressedModifiers)) { - allModifiersPressed = false; - break; - } - } - if (allModifiersPressed) { - handler = this._options.keyBinds[index]; - break; - } - } - } - } - - if (handler) { - if (handler.call(this)) { - e.stopPropagation(); - e.preventDefault(); - } - } - }; - - //noinspection JSMethodCanBeStatic,SpellCheckingInspection - - - DateTimePicker.prototype._keyup = function _keyup(e) { - keyState[e.which] = 'r'; - if (keyPressHandled[e.which]) { - keyPressHandled[e.which] = false; - e.stopPropagation(); - e.preventDefault(); - } - }; - - DateTimePicker.prototype._indexGivenDates = function _indexGivenDates(givenDatesArray) { - // Store given enabledDates and disabledDates as keys. - // This way we can check their existence in O(1) time instead of looping through whole array. - // (for example: options.enabledDates['2014-02-27'] === true) - var givenDatesIndexed = {}, - self = this; - $.each(givenDatesArray, function () { - var dDate = self._parseInputDate(this); - if (dDate.isValid()) { - givenDatesIndexed[dDate.format('YYYY-MM-DD')] = true; - } - }); - return Object.keys(givenDatesIndexed).length ? givenDatesIndexed : false; - }; - - DateTimePicker.prototype._indexGivenHours = function _indexGivenHours(givenHoursArray) { - // Store given enabledHours and disabledHours as keys. - // This way we can check their existence in O(1) time instead of looping through whole array. - // (for example: options.enabledHours['2014-02-27'] === true) - var givenHoursIndexed = {}; - $.each(givenHoursArray, function () { - givenHoursIndexed[this] = true; - }); - return Object.keys(givenHoursIndexed).length ? givenHoursIndexed : false; - }; - - DateTimePicker.prototype._initFormatting = function _initFormatting() { - var format = this._options.format || 'L LT', - self = this; - - this.actualFormat = format.replace(/(\[[^\[]*])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput) { - return self._dates[0].localeData().longDateFormat(formatInput) || formatInput; //todo taking the first date should be ok - }); - - this.parseFormats = this._options.extraFormats ? this._options.extraFormats.slice() : []; - if (this.parseFormats.indexOf(format) < 0 && this.parseFormats.indexOf(this.actualFormat) < 0) { - this.parseFormats.push(this.actualFormat); - } - - this.use24Hours = this.actualFormat.toLowerCase().indexOf('a') < 1 && this.actualFormat.replace(/\[.*?]/g, '').indexOf('h') < 1; - - if (this._isEnabled('y')) { - this.MinViewModeNumber = 2; - } - if (this._isEnabled('M')) { - this.MinViewModeNumber = 1; - } - if (this._isEnabled('d')) { - this.MinViewModeNumber = 0; - } - - this.currentViewMode = Math.max(this.MinViewModeNumber, this.currentViewMode); - - if (!this.unset) { - this._setValue(this._dates[0], 0); - } - }; - - DateTimePicker.prototype._getLastPickedDate = function _getLastPickedDate() { - return this._dates[this._getLastPickedDateIndex()]; - }; - - DateTimePicker.prototype._getLastPickedDateIndex = function _getLastPickedDateIndex() { - return this._dates.length - 1; - }; - - //public - - - DateTimePicker.prototype.getMoment = function getMoment(d) { - var returnMoment = void 0; - - if (d === undefined || d === null) { - returnMoment = moment(); //TODO should this use format? and locale? - } else if (this._hasTimeZone()) { - // There is a string to parse and a default time zone - // parse with the tz function which takes a default time zone if it is not in the format string - returnMoment = moment.tz(d, this.parseFormats, this._options.locale, this._options.useStrict, this._options.timeZone); - } else { - returnMoment = moment(d, this.parseFormats, this._options.locale, this._options.useStrict); - } - - if (this._hasTimeZone()) { - returnMoment.tz(this._options.timeZone); - } - - return returnMoment; - }; - - DateTimePicker.prototype.toggle = function toggle() { - return this.widget ? this.hide() : this.show(); - }; - - DateTimePicker.prototype.ignoreReadonly = function ignoreReadonly(_ignoreReadonly) { - if (arguments.length === 0) { - return this._options.ignoreReadonly; - } - if (typeof _ignoreReadonly !== 'boolean') { - throw new TypeError('ignoreReadonly () expects a boolean parameter'); - } - this._options.ignoreReadonly = _ignoreReadonly; - }; - - DateTimePicker.prototype.options = function options(newOptions) { - if (arguments.length === 0) { - return $.extend(true, {}, this._options); - } - - if (!(newOptions instanceof Object)) { - throw new TypeError('options() this.options parameter should be an object'); - } - $.extend(true, this._options, newOptions); - var self = this; - $.each(this._options, function (key, value) { - if (self[key] !== undefined) { - self[key](value); - } - }); - }; - - DateTimePicker.prototype.date = function date(newDate, index) { - index = index || 0; - if (arguments.length === 0) { - if (this.unset) { - return null; - } - if (this._options.allowMultidate) { - return this._dates.join(this._options.multidateSeparator); - } else { - return this._dates[index].clone(); - } - } - - if (newDate !== null && typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { - throw new TypeError('date() parameter must be one of [null, string, moment or Date]'); - } - - this._setValue(newDate === null ? null : this._parseInputDate(newDate), index); - }; - - DateTimePicker.prototype.format = function format(newFormat) { - if (arguments.length === 0) { - return this._options.format; - } - - if (typeof newFormat !== 'string' && (typeof newFormat !== 'boolean' || newFormat !== false)) { - throw new TypeError('format() expects a string or boolean:false parameter ' + newFormat); - } - - this._options.format = newFormat; - if (this.actualFormat) { - this._initFormatting(); // reinitialize formatting - } - }; - - DateTimePicker.prototype.timeZone = function timeZone(newZone) { - if (arguments.length === 0) { - return this._options.timeZone; - } - - if (typeof newZone !== 'string') { - throw new TypeError('newZone() expects a string parameter'); - } - - this._options.timeZone = newZone; - }; - - DateTimePicker.prototype.dayViewHeaderFormat = function dayViewHeaderFormat(newFormat) { - if (arguments.length === 0) { - return this._options.dayViewHeaderFormat; - } - - if (typeof newFormat !== 'string') { - throw new TypeError('dayViewHeaderFormat() expects a string parameter'); - } - - this._options.dayViewHeaderFormat = newFormat; - }; - - DateTimePicker.prototype.extraFormats = function extraFormats(formats) { - if (arguments.length === 0) { - return this._options.extraFormats; - } - - if (formats !== false && !(formats instanceof Array)) { - throw new TypeError('extraFormats() expects an array or false parameter'); - } - - this._options.extraFormats = formats; - if (this.parseFormats) { - this._initFormatting(); // reinit formatting - } - }; - - DateTimePicker.prototype.disabledDates = function disabledDates(dates) { - if (arguments.length === 0) { - return this._options.disabledDates ? $.extend({}, this._options.disabledDates) : this._options.disabledDates; - } - - if (!dates) { - this._options.disabledDates = false; - this._update(); - return true; - } - if (!(dates instanceof Array)) { - throw new TypeError('disabledDates() expects an array parameter'); - } - this._options.disabledDates = this._indexGivenDates(dates); - this._options.enabledDates = false; - this._update(); - }; - - DateTimePicker.prototype.enabledDates = function enabledDates(dates) { - if (arguments.length === 0) { - return this._options.enabledDates ? $.extend({}, this._options.enabledDates) : this._options.enabledDates; - } - - if (!dates) { - this._options.enabledDates = false; - this._update(); - return true; - } - if (!(dates instanceof Array)) { - throw new TypeError('enabledDates() expects an array parameter'); - } - this._options.enabledDates = this._indexGivenDates(dates); - this._options.disabledDates = false; - this._update(); - }; - - DateTimePicker.prototype.daysOfWeekDisabled = function daysOfWeekDisabled(_daysOfWeekDisabled) { - if (arguments.length === 0) { - return this._options.daysOfWeekDisabled.splice(0); - } - - if (typeof _daysOfWeekDisabled === 'boolean' && !_daysOfWeekDisabled) { - this._options.daysOfWeekDisabled = false; - this._update(); - return true; - } - - if (!(_daysOfWeekDisabled instanceof Array)) { - throw new TypeError('daysOfWeekDisabled() expects an array parameter'); - } - this._options.daysOfWeekDisabled = _daysOfWeekDisabled.reduce(function (previousValue, currentValue) { - currentValue = parseInt(currentValue, 10); - if (currentValue > 6 || currentValue < 0 || isNaN(currentValue)) { - return previousValue; - } - if (previousValue.indexOf(currentValue) === -1) { - previousValue.push(currentValue); - } - return previousValue; - }, []).sort(); - if (this._options.useCurrent && !this._options.keepInvalid) { - for (var i = 0; i < this._dates.length; i++) { - var tries = 0; - while (!this._isValid(this._dates[i], 'd')) { - this._dates[i].add(1, 'd'); - if (tries === 31) { - throw 'Tried 31 times to find a valid date'; - } - tries++; - } - this._setValue(this._dates[i], i); - } - } - this._update(); - }; - - DateTimePicker.prototype.maxDate = function maxDate(_maxDate) { - if (arguments.length === 0) { - return this._options.maxDate ? this._options.maxDate.clone() : this._options.maxDate; - } - - if (typeof _maxDate === 'boolean' && _maxDate === false) { - this._options.maxDate = false; - this._update(); - return true; - } - - if (typeof _maxDate === 'string') { - if (_maxDate === 'now' || _maxDate === 'moment') { - _maxDate = this.getMoment(); - } - } - - var parsedDate = this._parseInputDate(_maxDate); - - if (!parsedDate.isValid()) { - throw new TypeError('maxDate() Could not parse date parameter: ' + _maxDate); - } - if (this._options.minDate && parsedDate.isBefore(this._options.minDate)) { - throw new TypeError('maxDate() date parameter is before this.options.minDate: ' + parsedDate.format(this.actualFormat)); - } - this._options.maxDate = parsedDate; - for (var i = 0; i < this._dates.length; i++) { - if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isAfter(_maxDate)) { - this._setValue(this._options.maxDate, i); - } - } - if (this._viewDate.isAfter(parsedDate)) { - this._viewDate = parsedDate.clone().subtract(this._options.stepping, 'm'); - } - this._update(); - }; - - DateTimePicker.prototype.minDate = function minDate(_minDate) { - if (arguments.length === 0) { - return this._options.minDate ? this._options.minDate.clone() : this._options.minDate; - } - - if (typeof _minDate === 'boolean' && _minDate === false) { - this._options.minDate = false; - this._update(); - return true; - } - - if (typeof _minDate === 'string') { - if (_minDate === 'now' || _minDate === 'moment') { - _minDate = this.getMoment(); - } - } - - var parsedDate = this._parseInputDate(_minDate); - - if (!parsedDate.isValid()) { - throw new TypeError('minDate() Could not parse date parameter: ' + _minDate); - } - if (this._options.maxDate && parsedDate.isAfter(this._options.maxDate)) { - throw new TypeError('minDate() date parameter is after this.options.maxDate: ' + parsedDate.format(this.actualFormat)); - } - this._options.minDate = parsedDate; - for (var i = 0; i < this._dates.length; i++) { - if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isBefore(_minDate)) { - this._setValue(this._options.minDate, i); - } - } - if (this._viewDate.isBefore(parsedDate)) { - this._viewDate = parsedDate.clone().add(this._options.stepping, 'm'); - } - this._update(); - }; - - DateTimePicker.prototype.defaultDate = function defaultDate(_defaultDate) { - if (arguments.length === 0) { - return this._options.defaultDate ? this._options.defaultDate.clone() : this._options.defaultDate; - } - if (!_defaultDate) { - this._options.defaultDate = false; - return true; - } - - if (typeof _defaultDate === 'string') { - if (_defaultDate === 'now' || _defaultDate === 'moment') { - _defaultDate = this.getMoment(); - } else { - _defaultDate = this.getMoment(_defaultDate); - } - } - - var parsedDate = this._parseInputDate(_defaultDate); - if (!parsedDate.isValid()) { - throw new TypeError('defaultDate() Could not parse date parameter: ' + _defaultDate); - } - if (!this._isValid(parsedDate)) { - throw new TypeError('defaultDate() date passed is invalid according to component setup validations'); - } - - this._options.defaultDate = parsedDate; - - if (this._options.defaultDate && this._options.inline || this.input !== undefined && this.input.val().trim() === '') { - this._setValue(this._options.defaultDate, 0); - } - }; - - DateTimePicker.prototype.locale = function locale(_locale) { - if (arguments.length === 0) { - return this._options.locale; - } - - if (!moment.localeData(_locale)) { - throw new TypeError('locale() locale ' + _locale + ' is not loaded from moment locales!'); - } - - this._options.locale = _locale; - - for (var i = 0; i < this._dates.length; i++) { - this._dates[i].locale(this._options.locale); - } - this._viewDate.locale(this._options.locale); - - if (this.actualFormat) { - this._initFormatting(); // reinitialize formatting - } - if (this.widget) { - this.hide(); - this.show(); - } - }; - - DateTimePicker.prototype.stepping = function stepping(_stepping) { - if (arguments.length === 0) { - return this._options.stepping; - } - - _stepping = parseInt(_stepping, 10); - if (isNaN(_stepping) || _stepping < 1) { - _stepping = 1; - } - this._options.stepping = _stepping; - }; - - DateTimePicker.prototype.useCurrent = function useCurrent(_useCurrent) { - var useCurrentOptions = ['year', 'month', 'day', 'hour', 'minute']; - if (arguments.length === 0) { - return this._options.useCurrent; - } - - if (typeof _useCurrent !== 'boolean' && typeof _useCurrent !== 'string') { - throw new TypeError('useCurrent() expects a boolean or string parameter'); - } - if (typeof _useCurrent === 'string' && useCurrentOptions.indexOf(_useCurrent.toLowerCase()) === -1) { - throw new TypeError('useCurrent() expects a string parameter of ' + useCurrentOptions.join(', ')); - } - this._options.useCurrent = _useCurrent; - }; - - DateTimePicker.prototype.collapse = function collapse(_collapse) { - if (arguments.length === 0) { - return this._options.collapse; - } - - if (typeof _collapse !== 'boolean') { - throw new TypeError('collapse() expects a boolean parameter'); - } - if (this._options.collapse === _collapse) { - return true; - } - this._options.collapse = _collapse; - if (this.widget) { - this.hide(); - this.show(); - } - }; - - DateTimePicker.prototype.icons = function icons(_icons) { - if (arguments.length === 0) { - return $.extend({}, this._options.icons); - } - - if (!(_icons instanceof Object)) { - throw new TypeError('icons() expects parameter to be an Object'); - } - - $.extend(this._options.icons, _icons); - - if (this.widget) { - this.hide(); - this.show(); - } - }; - - DateTimePicker.prototype.tooltips = function tooltips(_tooltips) { - if (arguments.length === 0) { - return $.extend({}, this._options.tooltips); - } - - if (!(_tooltips instanceof Object)) { - throw new TypeError('tooltips() expects parameter to be an Object'); - } - $.extend(this._options.tooltips, _tooltips); - if (this.widget) { - this.hide(); - this.show(); - } - }; - - DateTimePicker.prototype.useStrict = function useStrict(_useStrict) { - if (arguments.length === 0) { - return this._options.useStrict; - } - - if (typeof _useStrict !== 'boolean') { - throw new TypeError('useStrict() expects a boolean parameter'); - } - this._options.useStrict = _useStrict; - }; - - DateTimePicker.prototype.sideBySide = function sideBySide(_sideBySide) { - if (arguments.length === 0) { - return this._options.sideBySide; - } - - if (typeof _sideBySide !== 'boolean') { - throw new TypeError('sideBySide() expects a boolean parameter'); - } - this._options.sideBySide = _sideBySide; - if (this.widget) { - this.hide(); - this.show(); - } - }; - - DateTimePicker.prototype.viewMode = function viewMode(_viewMode) { - if (arguments.length === 0) { - return this._options.viewMode; - } - - if (typeof _viewMode !== 'string') { - throw new TypeError('viewMode() expects a string parameter'); - } - - if (DateTimePicker.ViewModes.indexOf(_viewMode) === -1) { - throw new TypeError('viewMode() parameter must be one of (' + DateTimePicker.ViewModes.join(', ') + ') value'); - } - - this._options.viewMode = _viewMode; - this.currentViewMode = Math.max(DateTimePicker.ViewModes.indexOf(_viewMode) - 1, this.MinViewModeNumber); - - this._showMode(); - }; - - DateTimePicker.prototype.calendarWeeks = function calendarWeeks(_calendarWeeks) { - if (arguments.length === 0) { - return this._options.calendarWeeks; - } - - if (typeof _calendarWeeks !== 'boolean') { - throw new TypeError('calendarWeeks() expects parameter to be a boolean value'); - } - - this._options.calendarWeeks = _calendarWeeks; - this._update(); - }; - - DateTimePicker.prototype.buttons = function buttons(_buttons) { - if (arguments.length === 0) { - return $.extend({}, this._options.buttons); - } - - if (!(_buttons instanceof Object)) { - throw new TypeError('buttons() expects parameter to be an Object'); - } - - $.extend(this._options.buttons, _buttons); - - if (typeof this._options.buttons.showToday !== 'boolean') { - throw new TypeError('buttons.showToday expects a boolean parameter'); - } - if (typeof this._options.buttons.showClear !== 'boolean') { - throw new TypeError('buttons.showClear expects a boolean parameter'); - } - if (typeof this._options.buttons.showClose !== 'boolean') { - throw new TypeError('buttons.showClose expects a boolean parameter'); - } - - if (this.widget) { - this.hide(); - this.show(); - } - }; - - DateTimePicker.prototype.keepOpen = function keepOpen(_keepOpen) { - if (arguments.length === 0) { - return this._options.keepOpen; - } - - if (typeof _keepOpen !== 'boolean') { - throw new TypeError('keepOpen() expects a boolean parameter'); - } - - this._options.keepOpen = _keepOpen; - }; - - DateTimePicker.prototype.focusOnShow = function focusOnShow(_focusOnShow) { - if (arguments.length === 0) { - return this._options.focusOnShow; - } - - if (typeof _focusOnShow !== 'boolean') { - throw new TypeError('focusOnShow() expects a boolean parameter'); - } - - this._options.focusOnShow = _focusOnShow; - }; - - DateTimePicker.prototype.inline = function inline(_inline) { - if (arguments.length === 0) { - return this._options.inline; - } - - if (typeof _inline !== 'boolean') { - throw new TypeError('inline() expects a boolean parameter'); - } - - this._options.inline = _inline; - }; - - DateTimePicker.prototype.clear = function clear() { - this._setValue(null); //todo - }; - - DateTimePicker.prototype.keyBinds = function keyBinds(_keyBinds) { - if (arguments.length === 0) { - return this._options.keyBinds; - } - - this._options.keyBinds = _keyBinds; - }; - - DateTimePicker.prototype.debug = function debug(_debug) { - if (typeof _debug !== 'boolean') { - throw new TypeError('debug() expects a boolean parameter'); - } - - this._options.debug = _debug; - }; - - DateTimePicker.prototype.allowInputToggle = function allowInputToggle(_allowInputToggle) { - if (arguments.length === 0) { - return this._options.allowInputToggle; - } - - if (typeof _allowInputToggle !== 'boolean') { - throw new TypeError('allowInputToggle() expects a boolean parameter'); - } - - this._options.allowInputToggle = _allowInputToggle; - }; - - DateTimePicker.prototype.keepInvalid = function keepInvalid(_keepInvalid) { - if (arguments.length === 0) { - return this._options.keepInvalid; - } - - if (typeof _keepInvalid !== 'boolean') { - throw new TypeError('keepInvalid() expects a boolean parameter'); - } - this._options.keepInvalid = _keepInvalid; - }; - - DateTimePicker.prototype.datepickerInput = function datepickerInput(_datepickerInput) { - if (arguments.length === 0) { - return this._options.datepickerInput; - } - - if (typeof _datepickerInput !== 'string') { - throw new TypeError('datepickerInput() expects a string parameter'); - } - - this._options.datepickerInput = _datepickerInput; - }; - - DateTimePicker.prototype.parseInputDate = function parseInputDate(_parseInputDate2) { - if (arguments.length === 0) { - return this._options.parseInputDate; - } - - if (typeof _parseInputDate2 !== 'function') { - throw new TypeError('parseInputDate() should be as function'); - } - - this._options.parseInputDate = _parseInputDate2; - }; - - DateTimePicker.prototype.disabledTimeIntervals = function disabledTimeIntervals(_disabledTimeIntervals) { - if (arguments.length === 0) { - return this._options.disabledTimeIntervals ? $.extend({}, this._options.disabledTimeIntervals) : this._options.disabledTimeIntervals; - } - - if (!_disabledTimeIntervals) { - this._options.disabledTimeIntervals = false; - this._update(); - return true; - } - if (!(_disabledTimeIntervals instanceof Array)) { - throw new TypeError('disabledTimeIntervals() expects an array parameter'); - } - this._options.disabledTimeIntervals = _disabledTimeIntervals; - this._update(); - }; - - DateTimePicker.prototype.disabledHours = function disabledHours(hours) { - if (arguments.length === 0) { - return this._options.disabledHours ? $.extend({}, this._options.disabledHours) : this._options.disabledHours; - } - - if (!hours) { - this._options.disabledHours = false; - this._update(); - return true; - } - if (!(hours instanceof Array)) { - throw new TypeError('disabledHours() expects an array parameter'); - } - this._options.disabledHours = this._indexGivenHours(hours); - this._options.enabledHours = false; - if (this._options.useCurrent && !this._options.keepInvalid) { - for (var i = 0; i < this._dates.length; i++) { - var tries = 0; - while (!this._isValid(this._dates[i], 'h')) { - this._dates[i].add(1, 'h'); - if (tries === 24) { - throw 'Tried 24 times to find a valid date'; - } - tries++; - } - this._setValue(this._dates[i], i); - } - } - this._update(); - }; - - DateTimePicker.prototype.enabledHours = function enabledHours(hours) { - if (arguments.length === 0) { - return this._options.enabledHours ? $.extend({}, this._options.enabledHours) : this._options.enabledHours; - } - - if (!hours) { - this._options.enabledHours = false; - this._update(); - return true; - } - if (!(hours instanceof Array)) { - throw new TypeError('enabledHours() expects an array parameter'); - } - this._options.enabledHours = this._indexGivenHours(hours); - this._options.disabledHours = false; - if (this._options.useCurrent && !this._options.keepInvalid) { - for (var i = 0; i < this._dates.length; i++) { - var tries = 0; - while (!this._isValid(this._dates[i], 'h')) { - this._dates[i].add(1, 'h'); - if (tries === 24) { - throw 'Tried 24 times to find a valid date'; - } - tries++; - } - this._setValue(this._dates[i], i); - } - } - this._update(); - }; - - DateTimePicker.prototype.viewDate = function viewDate(newDate) { - if (arguments.length === 0) { - return this._viewDate.clone(); - } - - if (!newDate) { - this._viewDate = (this._dates[0] || this.getMoment()).clone(); - return true; - } - - if (typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { - throw new TypeError('viewDate() parameter must be one of [string, moment or Date]'); - } - - this._viewDate = this._parseInputDate(newDate); - this._viewUpdate(); - }; - - DateTimePicker.prototype.allowMultidate = function allowMultidate(_allowMultidate) { - if (typeof _allowMultidate !== 'boolean') { - throw new TypeError('allowMultidate() expects a boolean parameter'); - } - - this._options.allowMultidate = _allowMultidate; - }; - - DateTimePicker.prototype.multidateSeparator = function multidateSeparator(_multidateSeparator) { - if (arguments.length === 0) { - return this._options.multidateSeparator; - } - - if (typeof _multidateSeparator !== 'string' || _multidateSeparator.length > 1) { - throw new TypeError('multidateSeparator expects a single character string parameter'); - } - - this._options.multidateSeparator = _multidateSeparator; - }; - - _createClass(DateTimePicker, null, [{ - key: 'NAME', - get: function get() { - return NAME; - } - - /** - * @return {string} - */ - - }, { - key: 'DATA_KEY', - get: function get() { - return DATA_KEY; - } - - /** - * @return {string} - */ - - }, { - key: 'EVENT_KEY', - get: function get() { - return EVENT_KEY; - } - - /** - * @return {string} - */ - - }, { - key: 'DATA_API_KEY', - get: function get() { - return DATA_API_KEY; - } - }, { - key: 'DatePickerModes', - get: function get() { - return DatePickerModes; - } - }, { - key: 'ViewModes', - get: function get() { - return ViewModes; - } - }, { - key: 'Event', - get: function get() { - return Event; - } - }, { - key: 'Selector', - get: function get() { - return Selector; - } - }, { - key: 'Default', - get: function get() { - return Default; - }, - set: function set(value) { - Default = value; - } - }, { - key: 'ClassName', - get: function get() { - return ClassName; - } - }]); - - return DateTimePicker; - }(); - - return DateTimePicker; -}(jQuery, moment); - -//noinspection JSUnusedGlobalSymbols -/* global DateTimePicker */ -var TempusDominusBootstrap4 = function ($) { - // eslint-disable-line no-unused-vars - // ReSharper disable once InconsistentNaming - var JQUERY_NO_CONFLICT = $.fn[DateTimePicker.NAME], - verticalModes = ['top', 'bottom', 'auto'], - horizontalModes = ['left', 'right', 'auto'], - toolbarPlacements = ['default', 'top', 'bottom'], - getSelectorFromElement = function getSelectorFromElement($element) { - var selector = $element.data('target'), - $selector = void 0; - - if (!selector) { - selector = $element.attr('href') || ''; - selector = /^#[a-z]/i.test(selector) ? selector : null; - } - $selector = $(selector); - if ($selector.length === 0) { - return $selector; - } - - if (!$selector.data(DateTimePicker.DATA_KEY)) { - $.extend({}, $selector.data(), $(this).data()); - } - - return $selector; - }; - - // ReSharper disable once InconsistentNaming - - var TempusDominusBootstrap4 = function (_DateTimePicker) { - _inherits(TempusDominusBootstrap4, _DateTimePicker); - - function TempusDominusBootstrap4(element, options) { - _classCallCheck(this, TempusDominusBootstrap4); - - var _this = _possibleConstructorReturn(this, _DateTimePicker.call(this, element, options)); - - _this._init(); - return _this; - } - - TempusDominusBootstrap4.prototype._init = function _init() { - if (this._element.hasClass('input-group')) { - var datepickerButton = this._element.find('.datepickerbutton'); - if (datepickerButton.length === 0) { - this.component = this._element.find('[data-toggle="datetimepicker"]'); - } else { - this.component = datepickerButton; - } - } - }; - - TempusDominusBootstrap4.prototype._getDatePickerTemplate = function _getDatePickerTemplate() { - var headTemplate = $('').append($('').append($('').append($('').append($('
    ').addClass('cw').text('#')); + } + + while (currentDate.isBefore(this._viewDate.clone().endOf('w'))) { + row.append($('').addClass('dow').text(currentDate.format('dd'))); + currentDate.add(1, 'd'); + } + + this.widget.find('.datepicker-days thead').append(row); + }; + + _proto2._fillMonths = function _fillMonths() { + var spans = [], + monthsShort = this._viewDate.clone().startOf('y').startOf('d'); + + while (monthsShort.isSame(this._viewDate, 'y')) { + spans.push($('').attr('data-action', 'selectMonth').addClass('month').text(monthsShort.format('MMM'))); + monthsShort.add(1, 'M'); + } + + this.widget.find('.datepicker-months td').empty().append(spans); + }; + + _proto2._updateMonths = function _updateMonths() { + var monthsView = this.widget.find('.datepicker-months'), + monthsViewHeader = monthsView.find('th'), + months = monthsView.find('tbody').find('span'), + self = this, + lastPickedDate = this._getLastPickedDate(); + + monthsViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevYear); + monthsViewHeader.eq(1).attr('title', this._options.tooltips.selectYear); + monthsViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextYear); + monthsView.find('.disabled').removeClass('disabled'); + + if (!this._isValid(this._viewDate.clone().subtract(1, 'y'), 'y')) { + monthsViewHeader.eq(0).addClass('disabled'); + } + + monthsViewHeader.eq(1).text(this._viewDate.year()); + + if (!this._isValid(this._viewDate.clone().add(1, 'y'), 'y')) { + monthsViewHeader.eq(2).addClass('disabled'); + } + + months.removeClass('active'); + + if (lastPickedDate && lastPickedDate.isSame(this._viewDate, 'y') && !this.unset) { + months.eq(lastPickedDate.month()).addClass('active'); + } + + months.each(function (index) { + if (!self._isValid(self._viewDate.clone().month(index), 'M')) { + $(this).addClass('disabled'); + } + }); + }; + + _proto2._getStartEndYear = function _getStartEndYear(factor, year) { + var step = factor / 10, + startYear = Math.floor(year / factor) * factor, + endYear = startYear + step * 9, + focusValue = Math.floor(year / step) * step; + return [startYear, endYear, focusValue]; + }; + + _proto2._updateYears = function _updateYears() { + var yearsView = this.widget.find('.datepicker-years'), + yearsViewHeader = yearsView.find('th'), + yearCaps = this._getStartEndYear(10, this._viewDate.year()), + startYear = this._viewDate.clone().year(yearCaps[0]), + endYear = this._viewDate.clone().year(yearCaps[1]); + + var html = ''; + yearsViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevDecade); + yearsViewHeader.eq(1).attr('title', this._options.tooltips.selectDecade); + yearsViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextDecade); + yearsView.find('.disabled').removeClass('disabled'); + + if (this._options.minDate && this._options.minDate.isAfter(startYear, 'y')) { + yearsViewHeader.eq(0).addClass('disabled'); + } + + yearsViewHeader.eq(1).text(startYear.year() + "-" + endYear.year()); + + if (this._options.maxDate && this._options.maxDate.isBefore(endYear, 'y')) { + yearsViewHeader.eq(2).addClass('disabled'); + } + + html += "" + (startYear.year() - 1) + ""; + + while (!startYear.isAfter(endYear, 'y')) { + html += "" + startYear.year() + ""; + startYear.add(1, 'y'); + } + + html += "" + startYear.year() + ""; + yearsView.find('td').html(html); + }; + + _proto2._updateDecades = function _updateDecades() { + var decadesView = this.widget.find('.datepicker-decades'), + decadesViewHeader = decadesView.find('th'), + yearCaps = this._getStartEndYear(100, this._viewDate.year()), + startDecade = this._viewDate.clone().year(yearCaps[0]), + endDecade = this._viewDate.clone().year(yearCaps[1]), + lastPickedDate = this._getLastPickedDate(); + + var minDateDecade = false, + maxDateDecade = false, + endDecadeYear, + html = ''; + decadesViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevCentury); + decadesViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextCentury); + decadesView.find('.disabled').removeClass('disabled'); + + if (startDecade.year() === 0 || this._options.minDate && this._options.minDate.isAfter(startDecade, 'y')) { + decadesViewHeader.eq(0).addClass('disabled'); + } + + decadesViewHeader.eq(1).text(startDecade.year() + "-" + endDecade.year()); + + if (this._options.maxDate && this._options.maxDate.isBefore(endDecade, 'y')) { + decadesViewHeader.eq(2).addClass('disabled'); + } + + if (startDecade.year() - 10 < 0) { + html += ' '; + } else { + html += "" + (startDecade.year() - 10) + ""; + } + + while (!startDecade.isAfter(endDecade, 'y')) { + endDecadeYear = startDecade.year() + 11; + minDateDecade = this._options.minDate && this._options.minDate.isAfter(startDecade, 'y') && this._options.minDate.year() <= endDecadeYear; + maxDateDecade = this._options.maxDate && this._options.maxDate.isAfter(startDecade, 'y') && this._options.maxDate.year() <= endDecadeYear; + html += "" + startDecade.year() + ""; + startDecade.add(10, 'y'); + } + + html += "" + startDecade.year() + ""; + decadesView.find('td').html(html); + }; + + _proto2._fillDate = function _fillDate() { + _DateTimePicker.prototype._fillDate.call(this); + + var daysView = this.widget.find('.datepicker-days'), + daysViewHeader = daysView.find('th'), + html = []; + var currentDate, row, clsName, i; + + if (!this._hasDate()) { + return; + } + + daysViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevMonth); + daysViewHeader.eq(1).attr('title', this._options.tooltips.selectMonth); + daysViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextMonth); + daysView.find('.disabled').removeClass('disabled'); + daysViewHeader.eq(1).text(this._viewDate.format(this._options.dayViewHeaderFormat)); + + if (!this._isValid(this._viewDate.clone().subtract(1, 'M'), 'M')) { + daysViewHeader.eq(0).addClass('disabled'); + } + + if (!this._isValid(this._viewDate.clone().add(1, 'M'), 'M')) { + daysViewHeader.eq(2).addClass('disabled'); + } + + currentDate = this._viewDate.clone().startOf('M').startOf('w').startOf('d'); + + for (i = 0; i < 42; i++) { + //always display 42 days (should show 6 weeks) + if (currentDate.weekday() === 0) { + row = $('
    " + currentDate.week() + "" + currentDate.date() + "
    " + currentHour.format(this.use24Hours ? 'HH' : 'hh') + "
    " + currentMinute.format('mm') + "
    " + currentSecond.format('ss') + "
    ').addClass('cw').text('#')); - } + if (index !== -1) { + this._setValue(null, index); //deselect multidate - while (currentDate.isBefore(this._viewDate.clone().endOf('w'))) { - row.append($('').addClass('dow').text(currentDate.format('dd'))); - currentDate.add(1, 'd'); - } - this.widget.find('.datepicker-days thead').append(row); - }; - - TempusDominusBootstrap4.prototype._fillMonths = function _fillMonths() { - var spans = [], - monthsShort = this._viewDate.clone().startOf('y').startOf('d'); - while (monthsShort.isSame(this._viewDate, 'y')) { - spans.push($('').attr('data-action', 'selectMonth').addClass('month').text(monthsShort.format('MMM'))); - monthsShort.add(1, 'M'); - } - this.widget.find('.datepicker-months td').empty().append(spans); - }; - - TempusDominusBootstrap4.prototype._updateMonths = function _updateMonths() { - var monthsView = this.widget.find('.datepicker-months'), - monthsViewHeader = monthsView.find('th'), - months = monthsView.find('tbody').find('span'), - self = this; - - monthsViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevYear); - monthsViewHeader.eq(1).attr('title', this._options.tooltips.selectYear); - monthsViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextYear); - - monthsView.find('.disabled').removeClass('disabled'); - - if (!this._isValid(this._viewDate.clone().subtract(1, 'y'), 'y')) { - monthsViewHeader.eq(0).addClass('disabled'); - } - - monthsViewHeader.eq(1).text(this._viewDate.year()); - - if (!this._isValid(this._viewDate.clone().add(1, 'y'), 'y')) { - monthsViewHeader.eq(2).addClass('disabled'); - } - - months.removeClass('active'); - if (this._getLastPickedDate().isSame(this._viewDate, 'y') && !this.unset) { - months.eq(this._getLastPickedDate().month()).addClass('active'); - } - - months.each(function (index) { - if (!self._isValid(self._viewDate.clone().month(index), 'M')) { - $(this).addClass('disabled'); - } - }); - }; - - TempusDominusBootstrap4.prototype._getStartEndYear = function _getStartEndYear(factor, year) { - var step = factor / 10, - startYear = Math.floor(year / factor) * factor, - endYear = startYear + step * 9, - focusValue = Math.floor(year / step) * step; - return [startYear, endYear, focusValue]; - }; - - TempusDominusBootstrap4.prototype._updateYears = function _updateYears() { - var yearsView = this.widget.find('.datepicker-years'), - yearsViewHeader = yearsView.find('th'), - yearCaps = this._getStartEndYear(10, this._viewDate.year()), - startYear = this._viewDate.clone().year(yearCaps[0]), - endYear = this._viewDate.clone().year(yearCaps[1]); - var html = ''; - - yearsViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevDecade); - yearsViewHeader.eq(1).attr('title', this._options.tooltips.selectDecade); - yearsViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextDecade); - - yearsView.find('.disabled').removeClass('disabled'); - - if (this._options.minDate && this._options.minDate.isAfter(startYear, 'y')) { - yearsViewHeader.eq(0).addClass('disabled'); - } - - yearsViewHeader.eq(1).text(startYear.year() + '-' + endYear.year()); - - if (this._options.maxDate && this._options.maxDate.isBefore(endYear, 'y')) { - yearsViewHeader.eq(2).addClass('disabled'); - } - - html += '' + (startYear.year() - 1) + ''; - while (!startYear.isAfter(endYear, 'y')) { - html += '' + startYear.year() + ''; - startYear.add(1, 'y'); - } - html += '' + startYear.year() + ''; - - yearsView.find('td').html(html); - }; - - TempusDominusBootstrap4.prototype._updateDecades = function _updateDecades() { - var decadesView = this.widget.find('.datepicker-decades'), - decadesViewHeader = decadesView.find('th'), - yearCaps = this._getStartEndYear(100, this._viewDate.year()), - startDecade = this._viewDate.clone().year(yearCaps[0]), - endDecade = this._viewDate.clone().year(yearCaps[1]); - var minDateDecade = false, - maxDateDecade = false, - endDecadeYear = void 0, - html = ''; - - decadesViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevCentury); - decadesViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextCentury); - - decadesView.find('.disabled').removeClass('disabled'); - - if (startDecade.year() === 0 || this._options.minDate && this._options.minDate.isAfter(startDecade, 'y')) { - decadesViewHeader.eq(0).addClass('disabled'); - } - - decadesViewHeader.eq(1).text(startDecade.year() + '-' + endDecade.year()); - - if (this._options.maxDate && this._options.maxDate.isBefore(endDecade, 'y')) { - decadesViewHeader.eq(2).addClass('disabled'); - } - - if (startDecade.year() - 10 < 0) { - html += ' '; + } else { + this._setValue(selectDate, this._getLastPickedDateIndex() + 1); + } } else { - html += '' + (startDecade.year() - 10) + ''; + this._setValue(selectDate, this._getLastPickedDateIndex()); } - while (!startDecade.isAfter(endDecade, 'y')) { - endDecadeYear = startDecade.year() + 11; - minDateDecade = this._options.minDate && this._options.minDate.isAfter(startDecade, 'y') && this._options.minDate.year() <= endDecadeYear; - maxDateDecade = this._options.maxDate && this._options.maxDate.isAfter(startDecade, 'y') && this._options.maxDate.year() <= endDecadeYear; - html += '' + startDecade.year() + ''; - startDecade.add(10, 'y'); - } - html += '' + startDecade.year() + ''; - - decadesView.find('td').html(html); - }; - - TempusDominusBootstrap4.prototype._fillDate = function _fillDate() { - var daysView = this.widget.find('.datepicker-days'), - daysViewHeader = daysView.find('th'), - html = []; - var currentDate = void 0, - row = void 0, - clsName = void 0, - i = void 0; - - if (!this._hasDate()) { - return; + if (!this._hasTime() && !this._options.keepOpen && !this._options.inline && !this._options.allowMultidate) { + this.hide(); } - daysViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevMonth); - daysViewHeader.eq(1).attr('title', this._options.tooltips.selectMonth); - daysViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextMonth); + break; + } - daysView.find('.disabled').removeClass('disabled'); - daysViewHeader.eq(1).text(this._viewDate.format(this._options.dayViewHeaderFormat)); - - if (!this._isValid(this._viewDate.clone().subtract(1, 'M'), 'M')) { - daysViewHeader.eq(0).addClass('disabled'); - } - if (!this._isValid(this._viewDate.clone().add(1, 'M'), 'M')) { - daysViewHeader.eq(2).addClass('disabled'); + case 'incrementHours': + { + if (!lastPicked) { + break; } - currentDate = this._viewDate.clone().startOf('M').startOf('w').startOf('d'); + var newDate = lastPicked.clone().add(1, 'h'); - for (i = 0; i < 42; i++) { - //always display 42 days (should show 6 weeks) - if (currentDate.weekday() === 0) { - row = $('
    ' + currentDate.week() + '' + currentDate.date() + '
    ' + currentHour.format(this.use24Hours ? 'HH' : 'hh') + '
    ' + currentMinute.format('mm') + '
    ' + currentSecond.format('ss') + '
    ').addClass('prev').attr('data-action', 'previous').append($('').addClass(this._options.icons.previous))).append($('').addClass('picker-switch').attr('data-action', 'pickerSwitch').attr('colspan', '' + (this._options.calendarWeeks ? '6' : '5'))).append($('').addClass('next').attr('data-action', 'next').append($('').addClass(this._options.icons.next)))), - contTemplate = $('
    ').attr('colspan', '' + (this._options.calendarWeeks ? '8' : '7')))); - - return [$('
    ').addClass('datepicker-days').append($('').addClass('table table-sm').append(headTemplate).append($(''))), $('
    ').addClass('datepicker-months').append($('
    ').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone())), $('
    ').addClass('datepicker-years').append($('
    ').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone())), $('
    ').addClass('datepicker-decades').append($('
    ').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone()))]; - }; - - TempusDominusBootstrap4.prototype._getTimePickerMainTemplate = function _getTimePickerMainTemplate() { - var topRow = $(''), - middleRow = $(''), - bottomRow = $(''); - - if (this._isEnabled('h')) { - topRow.append($('
    ').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.incrementHour - }).addClass('btn').attr('data-action', 'incrementHours').append($('').addClass(this._options.icons.up)))); - middleRow.append($('').append($('').addClass('timepicker-hour').attr({ - 'data-time-component': 'hours', - 'title': this._options.tooltips.pickHour - }).attr('data-action', 'showHours'))); - bottomRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.decrementHour - }).addClass('btn').attr('data-action', 'decrementHours').append($('').addClass(this._options.icons.down)))); - } - if (this._isEnabled('m')) { - if (this._isEnabled('h')) { - topRow.append($('').addClass('separator')); - middleRow.append($('').addClass('separator').html(':')); - bottomRow.append($('').addClass('separator')); - } - topRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.incrementMinute - }).addClass('btn').attr('data-action', 'incrementMinutes').append($('').addClass(this._options.icons.up)))); - middleRow.append($('').append($('').addClass('timepicker-minute').attr({ - 'data-time-component': 'minutes', - 'title': this._options.tooltips.pickMinute - }).attr('data-action', 'showMinutes'))); - bottomRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.decrementMinute - }).addClass('btn').attr('data-action', 'decrementMinutes').append($('').addClass(this._options.icons.down)))); - } - if (this._isEnabled('s')) { - if (this._isEnabled('m')) { - topRow.append($('').addClass('separator')); - middleRow.append($('').addClass('separator').html(':')); - bottomRow.append($('').addClass('separator')); - } - topRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.incrementSecond - }).addClass('btn').attr('data-action', 'incrementSeconds').append($('').addClass(this._options.icons.up)))); - middleRow.append($('').append($('').addClass('timepicker-second').attr({ - 'data-time-component': 'seconds', - 'title': this._options.tooltips.pickSecond - }).attr('data-action', 'showSeconds'))); - bottomRow.append($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'title': this._options.tooltips.decrementSecond - }).addClass('btn').attr('data-action', 'decrementSeconds').append($('').addClass(this._options.icons.down)))); - } - - if (!this.use24Hours) { - topRow.append($('').addClass('separator')); - middleRow.append($('').append($('').addClass('separator')); - } - - return $('
    ').addClass('timepicker-picker').append($('').addClass('table-condensed').append([topRow, middleRow, bottomRow])); - }; - - TempusDominusBootstrap4.prototype._getTimePickerTemplate = function _getTimePickerTemplate() { - var hoursView = $('
    ').addClass('timepicker-hours').append($('
    ').addClass('table-condensed')), - minutesView = $('
    ').addClass('timepicker-minutes').append($('
    ').addClass('table-condensed')), - secondsView = $('
    ').addClass('timepicker-seconds').append($('
    ').addClass('table-condensed')), - ret = [this._getTimePickerMainTemplate()]; - - if (this._isEnabled('h')) { - ret.push(hoursView); - } - if (this._isEnabled('m')) { - ret.push(minutesView); - } - if (this._isEnabled('s')) { - ret.push(secondsView); - } - - return ret; - }; - - TempusDominusBootstrap4.prototype._getToolbar = function _getToolbar() { - var row = []; - if (this._options.buttons.showToday) { - row.push($('
    ').append($('').attr({ - href: '#', - tabindex: '-1', - 'data-action': 'today', - 'title': this._options.tooltips.today - }).append($('').addClass(this._options.icons.today)))); - } - if (!this._options.sideBySide && this._hasDate() && this._hasTime()) { - var title = void 0, - icon = void 0; - if (this._options.viewMode === 'times') { - title = this._options.tooltips.selectDate; - icon = this._options.icons.date; - } else { - title = this._options.tooltips.selectTime; - icon = this._options.icons.time; - } - row.push($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'data-action': 'togglePicker', - 'title': title - }).append($('').addClass(icon)))); - } - if (this._options.buttons.showClear) { - row.push($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'data-action': 'clear', - 'title': this._options.tooltips.clear - }).append($('').addClass(this._options.icons.clear)))); - } - if (this._options.buttons.showClose) { - row.push($('').append($('').attr({ - href: '#', - tabindex: '-1', - 'data-action': 'close', - 'title': this._options.tooltips.close - }).append($('').addClass(this._options.icons.close)))); - } - return row.length === 0 ? '' : $('').addClass('table-condensed').append($('').append($('').append(row))); - }; - - TempusDominusBootstrap4.prototype._getTemplate = function _getTemplate() { - var template = $('
    ').addClass('bootstrap-datetimepicker-widget dropdown-menu'), - dateView = $('
    ').addClass('datepicker').append(this._getDatePickerTemplate()), - timeView = $('
    ').addClass('timepicker').append(this._getTimePickerTemplate()), - content = $('
      ').addClass('list-unstyled'), - toolbar = $('
    • ').addClass('picker-switch' + (this._options.collapse ? ' accordion-toggle' : '')).append(this._getToolbar()); - - if (this._options.inline) { - template.removeClass('dropdown-menu'); - } - - if (this.use24Hours) { - template.addClass('usetwentyfour'); - } - if (this._isEnabled('s') && !this.use24Hours) { - template.addClass('wider'); - } - - if (this._options.sideBySide && this._hasDate() && this._hasTime()) { - template.addClass('timepicker-sbs'); - if (this._options.toolbarPlacement === 'top') { - template.append(toolbar); - } - template.append($('
      ').addClass('row').append(dateView.addClass('col-md-6')).append(timeView.addClass('col-md-6'))); - if (this._options.toolbarPlacement === 'bottom' || this._options.toolbarPlacement === 'default') { - template.append(toolbar); - } - return template; - } - - if (this._options.toolbarPlacement === 'top') { - content.append(toolbar); - } - if (this._hasDate()) { - content.append($('
    • ').addClass(this._options.collapse && this._hasTime() ? 'collapse' : '').addClass(this._options.collapse && this._hasTime() && this._options.viewMode === 'times' ? '' : 'show').append(dateView)); - } - if (this._options.toolbarPlacement === 'default') { - content.append(toolbar); - } - if (this._hasTime()) { - content.append($('
    • ').addClass(this._options.collapse && this._hasDate() ? 'collapse' : '').addClass(this._options.collapse && this._hasDate() && this._options.viewMode === 'times' ? 'show' : '').append(timeView)); - } - if (this._options.toolbarPlacement === 'bottom') { - content.append(toolbar); - } - return template.append(content); - }; - - TempusDominusBootstrap4.prototype._place = function _place(e) { - var self = e && e.data && e.data.picker || this, - vertical = self._options.widgetPositioning.vertical, - horizontal = self._options.widgetPositioning.horizontal, - parent = void 0; - var position = (self.component && self.component.length ? self.component : self._element).position(), - offset = (self.component && self.component.length ? self.component : self._element).offset(); - if (self._options.widgetParent) { - parent = self._options.widgetParent.append(self.widget); - } else if (self._element.is('input')) { - parent = self._element.after(self.widget).parent(); - } else if (self._options.inline) { - parent = self._element.append(self.widget); - return; - } else { - parent = self._element; - self._element.children().first().after(self.widget); - } - - // Top and bottom logic - if (vertical === 'auto') { - //noinspection JSValidateTypes - if (offset.top + self.widget.height() * 1.5 >= $(window).height() + $(window).scrollTop() && self.widget.height() + self._element.outerHeight() < offset.top) { - vertical = 'top'; - } else { - vertical = 'bottom'; - } - } - - // Left and right logic - if (horizontal === 'auto') { - if (parent.width() < offset.left + self.widget.outerWidth() / 2 && offset.left + self.widget.outerWidth() > $(window).width()) { - horizontal = 'right'; - } else { - horizontal = 'left'; - } - } - - if (vertical === 'top') { - self.widget.addClass('top').removeClass('bottom'); - } else { - self.widget.addClass('bottom').removeClass('top'); - } - - if (horizontal === 'right') { - self.widget.addClass('float-right'); - } else { - self.widget.removeClass('float-right'); - } - - // find the first parent element that has a relative css positioning - if (parent.css('position') !== 'relative') { - parent = parent.parents().filter(function () { - return $(this).css('position') === 'relative'; - }).first(); - } - - if (parent.length === 0) { - throw new Error('datetimepicker component should be placed within a relative positioned container'); - } - - self.widget.css({ - top: vertical === 'top' ? 'auto' : position.top + self._element.outerHeight() + 'px', - bottom: vertical === 'top' ? parent.outerHeight() - (parent === self._element ? 0 : position.top) + 'px' : 'auto', - left: horizontal === 'left' ? (parent === self._element ? 0 : position.left) + 'px' : 'auto', - right: horizontal === 'left' ? 'auto' : parent.outerWidth() - self._element.outerWidth() - (parent === self._element ? 0 : position.left) + 'px' - }); - }; - - TempusDominusBootstrap4.prototype._fillDow = function _fillDow() { - var row = $('
    '), - currentDate = this._viewDate.clone().startOf('w').startOf('d'); - - if (this._options.calendarWeeks === true) { - row.append($(''); - if (this._options.calendarWeeks) { - row.append(''); - } - html.push(row); - } - clsName = ''; - if (currentDate.isBefore(this._viewDate, 'M')) { - clsName += ' old'; - } - if (currentDate.isAfter(this._viewDate, 'M')) { - clsName += ' new'; - } - if (this._options.allowMultidate) { - var index = this._datesFormatted.indexOf(currentDate.format('YYYY-MM-DD')); - if (index !== -1) { - if (currentDate.isSame(this._datesFormatted[index], 'd') && !this.unset) { - clsName += ' active'; - } - } - } else { - if (currentDate.isSame(this._getLastPickedDate(), 'd') && !this.unset) { - clsName += ' active'; - } - } - if (!this._isValid(currentDate, 'd')) { - clsName += ' disabled'; - } - if (currentDate.isSame(this.getMoment(), 'd')) { - clsName += ' today'; - } - if (currentDate.day() === 0 || currentDate.day() === 6) { - clsName += ' weekend'; - } - row.append(''); - currentDate.add(1, 'd'); - } - - daysView.find('tbody').empty().append(html); - - this._updateMonths(); - - this._updateYears(); - - this._updateDecades(); - }; - - TempusDominusBootstrap4.prototype._fillHours = function _fillHours() { - var table = this.widget.find('.timepicker-hours table'), - currentHour = this._viewDate.clone().startOf('d'), - html = []; - var row = $(''); - - if (this._viewDate.hour() > 11 && !this.use24Hours) { - currentHour.hour(12); - } - while (currentHour.isSame(this._viewDate, 'd') && (this.use24Hours || this._viewDate.hour() < 12 && currentHour.hour() < 12 || this._viewDate.hour() > 11)) { - if (currentHour.hour() % 4 === 0) { - row = $(''); - html.push(row); - } - row.append(''); - currentHour.add(1, 'h'); - } - table.empty().append(html); - }; - - TempusDominusBootstrap4.prototype._fillMinutes = function _fillMinutes() { - var table = this.widget.find('.timepicker-minutes table'), - currentMinute = this._viewDate.clone().startOf('h'), - html = [], - step = this._options.stepping === 1 ? 5 : this._options.stepping; - var row = $(''); - - while (this._viewDate.isSame(currentMinute, 'h')) { - if (currentMinute.minute() % (step * 4) === 0) { - row = $(''); - html.push(row); - } - row.append(''); - currentMinute.add(step, 'm'); - } - table.empty().append(html); - }; - - TempusDominusBootstrap4.prototype._fillSeconds = function _fillSeconds() { - var table = this.widget.find('.timepicker-seconds table'), - currentSecond = this._viewDate.clone().startOf('m'), - html = []; - var row = $(''); - - while (this._viewDate.isSame(currentSecond, 'm')) { - if (currentSecond.second() % 20 === 0) { - row = $(''); - html.push(row); - } - row.append(''); - currentSecond.add(5, 's'); - } - - table.empty().append(html); - }; - - TempusDominusBootstrap4.prototype._fillTime = function _fillTime() { - var toggle = void 0, - newDate = void 0; - var timeComponents = this.widget.find('.timepicker span[data-time-component]'); - - if (!this.use24Hours) { - toggle = this.widget.find('.timepicker [data-action=togglePeriod]'); - newDate = this._getLastPickedDate().clone().add(this._getLastPickedDate().hours() >= 12 ? -12 : 12, 'h'); - - toggle.text(this._getLastPickedDate().format('A')); - - if (this._isValid(newDate, 'h')) { - toggle.removeClass('disabled'); - } else { - toggle.addClass('disabled'); - } - } - timeComponents.filter('[data-time-component=hours]').text(this._getLastPickedDate().format('' + (this.use24Hours ? 'HH' : 'hh'))); - timeComponents.filter('[data-time-component=minutes]').text(this._getLastPickedDate().format('mm')); - timeComponents.filter('[data-time-component=seconds]').text(this._getLastPickedDate().format('ss')); - - this._fillHours(); - this._fillMinutes(); - this._fillSeconds(); - }; - - TempusDominusBootstrap4.prototype._doAction = function _doAction(e, action) { - var lastPicked = this._getLastPickedDate(); - if ($(e.currentTarget).is('.disabled')) { - return false; - } - action = action || $(e.currentTarget).data('action'); - switch (action) { - case 'next': - { - var navFnc = DateTimePicker.DatePickerModes[this.currentViewMode].NAV_FUNCTION; - this._viewDate.add(DateTimePicker.DatePickerModes[this.currentViewMode].NAV_STEP, navFnc); - this._fillDate(); - this._viewUpdate(navFnc); - break; - } - case 'previous': - { - var _navFnc = DateTimePicker.DatePickerModes[this.currentViewMode].NAV_FUNCTION; - this._viewDate.subtract(DateTimePicker.DatePickerModes[this.currentViewMode].NAV_STEP, _navFnc); - this._fillDate(); - this._viewUpdate(_navFnc); - break; - } - case 'pickerSwitch': - this._showMode(1); - break; - case 'selectMonth': - { - var month = $(e.target).closest('tbody').find('span').index($(e.target)); - this._viewDate.month(month); - if (this.currentViewMode === this.MinViewModeNumber) { - this._setValue(lastPicked.clone().year(this._viewDate.year()).month(this._viewDate.month()), this._getLastPickedDateIndex()); - if (!this._options.inline) { - this.hide(); - } - } else { - this._showMode(-1); - this._fillDate(); - } - this._viewUpdate('M'); - break; - } - case 'selectYear': - { - var year = parseInt($(e.target).text(), 10) || 0; - this._viewDate.year(year); - if (this.currentViewMode === this.MinViewModeNumber) { - this._setValue(lastPicked.clone().year(this._viewDate.year()), this._getLastPickedDateIndex()); - if (!this._options.inline) { - this.hide(); - } - } else { - this._showMode(-1); - this._fillDate(); - } - this._viewUpdate('YYYY'); - break; - } - case 'selectDecade': - { - var _year = parseInt($(e.target).data('selection'), 10) || 0; - this._viewDate.year(_year); - if (this.currentViewMode === this.MinViewModeNumber) { - this._setValue(lastPicked.clone().year(this._viewDate.year()), this._getLastPickedDateIndex()); - if (!this._options.inline) { - this.hide(); - } - } else { - this._showMode(-1); - this._fillDate(); - } - this._viewUpdate('YYYY'); - break; - } - case 'selectDay': - { - var day = this._viewDate.clone(); - if ($(e.target).is('.old')) { - day.subtract(1, 'M'); - } - if ($(e.target).is('.new')) { - day.add(1, 'M'); - } - - var selectDate = day.date(parseInt($(e.target).text(), 10)), - index = 0; - if (this._options.allowMultidate) { - index = this._datesFormatted.indexOf(selectDate.format('YYYY-MM-DD')); - if (index !== -1) { - this._setValue(null, index); //deselect multidate - } else { - this._setValue(selectDate, this._getLastPickedDateIndex() + 1); - } - } else { - this._setValue(selectDate, this._getLastPickedDateIndex()); - } - - if (!this._hasTime() && !this._options.keepOpen && !this._options.inline && !this._options.allowMultidate) { - this.hide(); - } - break; - } - case 'incrementHours': - { - var newDate = lastPicked.clone().add(1, 'h'); - if (this._isValid(newDate, 'h')) { - this._setValue(newDate, this._getLastPickedDateIndex()); - } - break; - } - case 'incrementMinutes': - { - var _newDate = lastPicked.clone().add(this._options.stepping, 'm'); - if (this._isValid(_newDate, 'm')) { - this._setValue(_newDate, this._getLastPickedDateIndex()); - } - break; - } - case 'incrementSeconds': - { - var _newDate2 = lastPicked.clone().add(1, 's'); - if (this._isValid(_newDate2, 's')) { - this._setValue(_newDate2, this._getLastPickedDateIndex()); - } - break; - } - case 'decrementHours': - { - var _newDate3 = lastPicked.clone().subtract(1, 'h'); - if (this._isValid(_newDate3, 'h')) { - this._setValue(_newDate3, this._getLastPickedDateIndex()); - } - break; - } - case 'decrementMinutes': - { - var _newDate4 = lastPicked.clone().subtract(this._options.stepping, 'm'); - if (this._isValid(_newDate4, 'm')) { - this._setValue(_newDate4, this._getLastPickedDateIndex()); - } - break; - } - case 'decrementSeconds': - { - var _newDate5 = lastPicked.clone().subtract(1, 's'); - if (this._isValid(_newDate5, 's')) { - this._setValue(_newDate5, this._getLastPickedDateIndex()); - } - break; - } - case 'togglePeriod': - { - this._setValue(lastPicked.clone().add(lastPicked.hours() >= 12 ? -12 : 12, 'h'), this._getLastPickedDateIndex()); - break; - } - case 'togglePicker': - { - var $this = $(e.target), - $link = $this.closest('a'), - $parent = $this.closest('ul'), - expanded = $parent.find('.show'), - closed = $parent.find('.collapse:not(.show)'), - $span = $this.is('span') ? $this : $this.find('span'); - var collapseData = void 0; - - if (expanded && expanded.length) { - collapseData = expanded.data('collapse'); - if (collapseData && collapseData.transitioning) { - return true; - } - if (expanded.collapse) { - // if collapse plugin is available through bootstrap.js then use it - expanded.collapse('hide'); - closed.collapse('show'); - } else { - // otherwise just toggle in class on the two views - expanded.removeClass('show'); - closed.addClass('show'); - } - $span.toggleClass(this._options.icons.time + ' ' + this._options.icons.date); - - if ($span.hasClass(this._options.icons.date)) { - $link.attr('title', this._options.tooltips.selectDate); - } else { - $link.attr('title', this._options.tooltips.selectTime); - } - } - } - break; - case 'showPicker': - this.widget.find('.timepicker > div:not(.timepicker-picker)').hide(); - this.widget.find('.timepicker .timepicker-picker').show(); - break; - case 'showHours': - this.widget.find('.timepicker .timepicker-picker').hide(); - this.widget.find('.timepicker .timepicker-hours').show(); - break; - case 'showMinutes': - this.widget.find('.timepicker .timepicker-picker').hide(); - this.widget.find('.timepicker .timepicker-minutes').show(); - break; - case 'showSeconds': - this.widget.find('.timepicker .timepicker-picker').hide(); - this.widget.find('.timepicker .timepicker-seconds').show(); - break; - case 'selectHour': - { - var hour = parseInt($(e.target).text(), 10); - - if (!this.use24Hours) { - if (lastPicked.hours() >= 12) { - if (hour !== 12) { - hour += 12; - } - } else { - if (hour === 12) { - hour = 0; - } - } - } - this._setValue(lastPicked.clone().hours(hour), this._getLastPickedDateIndex()); - if (!this._isEnabled('a') && !this._isEnabled('m') && !this._options.keepOpen && !this._options.inline) { - this.hide(); - } else { - this._doAction(e, 'showPicker'); - } - break; - } - case 'selectMinute': - this._setValue(lastPicked.clone().minutes(parseInt($(e.target).text(), 10)), this._getLastPickedDateIndex()); - if (!this._isEnabled('a') && !this._isEnabled('s') && !this._options.keepOpen && !this._options.inline) { - this.hide(); - } else { - this._doAction(e, 'showPicker'); - } - break; - case 'selectSecond': - this._setValue(lastPicked.clone().seconds(parseInt($(e.target).text(), 10)), this._getLastPickedDateIndex()); - if (!this._isEnabled('a') && !this._options.keepOpen && !this._options.inline) { - this.hide(); - } else { - this._doAction(e, 'showPicker'); - } - break; - case 'clear': - this.clear(); - break; - case 'close': - this.hide(); - break; - case 'today': - { - var todaysDate = this.getMoment(); - if (this._isValid(todaysDate, 'd')) { - this._setValue(todaysDate, this._getLastPickedDateIndex()); - } - break; - } - } - return false; - }; - - //public - - - TempusDominusBootstrap4.prototype.hide = function hide() { - var transitioning = false; - if (!this.widget) { - return; - } - // Ignore event if in the middle of a picker transition - this.widget.find('.collapse').each(function () { - var collapseData = $(this).data('collapse'); - if (collapseData && collapseData.transitioning) { - transitioning = true; - return false; - } - return true; - }); - if (transitioning) { - return; - } - if (this.component && this.component.hasClass('btn')) { - this.component.toggleClass('active'); - } - this.widget.hide(); - - $(window).off('resize', this._place()); - this.widget.off('click', '[data-action]'); - this.widget.off('mousedown', false); - - this.widget.remove(); - this.widget = false; - - this._notifyEvent({ - type: DateTimePicker.Event.HIDE, - date: this._getLastPickedDate().clone() - }); - - if (this.input !== undefined) { - this.input.blur(); - } - - this._viewDate = this._getLastPickedDate().clone(); - }; - - TempusDominusBootstrap4.prototype.show = function show() { - var currentMoment = void 0; - var useCurrentGranularity = { - 'year': function year(m) { - return m.month(0).date(1).hours(0).seconds(0).minutes(0); - }, - 'month': function month(m) { - return m.date(1).hours(0).seconds(0).minutes(0); - }, - 'day': function day(m) { - return m.hours(0).seconds(0).minutes(0); - }, - 'hour': function hour(m) { - return m.seconds(0).minutes(0); - }, - 'minute': function minute(m) { - return m.seconds(0); - } - }; - - if (this.input !== undefined) { - if (this.input.prop('disabled') || !this._options.ignoreReadonly && this.input.prop('readonly') || this.widget) { - return; - } - if (this.input.val() !== undefined && this.input.val().trim().length !== 0) { - this._setValue(this._parseInputDate(this.input.val().trim()), 0); - } else if (this.unset && this._options.useCurrent) { - currentMoment = this.getMoment(); - if (typeof this._options.useCurrent === 'string') { - currentMoment = useCurrentGranularity[this._options.useCurrent](currentMoment); - } - this._setValue(currentMoment, 0); - } - } else if (this.unset && this._options.useCurrent) { - currentMoment = this.getMoment(); - if (typeof this._options.useCurrent === 'string') { - currentMoment = useCurrentGranularity[this._options.useCurrent](currentMoment); - } - this._setValue(currentMoment, 0); - } - - this.widget = this._getTemplate(); - - this._fillDow(); - this._fillMonths(); - - this.widget.find('.timepicker-hours').hide(); - this.widget.find('.timepicker-minutes').hide(); - this.widget.find('.timepicker-seconds').hide(); - - this._update(); - this._showMode(); - - $(window).on('resize', { picker: this }, this._place); - this.widget.on('click', '[data-action]', $.proxy(this._doAction, this)); // this handles clicks on the widget - this.widget.on('mousedown', false); - - if (this.component && this.component.hasClass('btn')) { - this.component.toggleClass('active'); - } - this._place(); - this.widget.show(); - if (this.input !== undefined && this._options.focusOnShow && !this.input.is(':focus')) { - this.input.focus(); - } - - this._notifyEvent({ - type: DateTimePicker.Event.SHOW - }); - }; - - TempusDominusBootstrap4.prototype.destroy = function destroy() { - this.hide(); - //todo doc off? - this._element.removeData(DateTimePicker.DATA_KEY); - this._element.removeData('date'); - }; - - TempusDominusBootstrap4.prototype.disable = function disable() { - this.hide(); - if (this.component && this.component.hasClass('btn')) { - this.component.addClass('disabled'); - } - if (this.input !== undefined) { - this.input.prop('disabled', true); //todo disable this/comp if input is null - } - }; - - TempusDominusBootstrap4.prototype.enable = function enable() { - if (this.component && this.component.hasClass('btn')) { - this.component.removeClass('disabled'); - } - if (this.input !== undefined) { - this.input.prop('disabled', false); //todo enable comp/this if input is null - } - }; - - TempusDominusBootstrap4.prototype.toolbarPlacement = function toolbarPlacement(_toolbarPlacement) { - if (arguments.length === 0) { - return this._options.toolbarPlacement; - } - - if (typeof _toolbarPlacement !== 'string') { - throw new TypeError('toolbarPlacement() expects a string parameter'); - } - if (toolbarPlacements.indexOf(_toolbarPlacement) === -1) { - throw new TypeError('toolbarPlacement() parameter must be one of (' + toolbarPlacements.join(', ') + ') value'); - } - this._options.toolbarPlacement = _toolbarPlacement; - - if (this.widget) { - this.hide(); - this.show(); - } - }; - - TempusDominusBootstrap4.prototype.widgetPositioning = function widgetPositioning(_widgetPositioning) { - if (arguments.length === 0) { - return $.extend({}, this._options.widgetPositioning); - } - - if ({}.toString.call(_widgetPositioning) !== '[object Object]') { - throw new TypeError('widgetPositioning() expects an object variable'); - } - if (_widgetPositioning.horizontal) { - if (typeof _widgetPositioning.horizontal !== 'string') { - throw new TypeError('widgetPositioning() horizontal variable must be a string'); - } - _widgetPositioning.horizontal = _widgetPositioning.horizontal.toLowerCase(); - if (horizontalModes.indexOf(_widgetPositioning.horizontal) === -1) { - throw new TypeError('widgetPositioning() expects horizontal parameter to be one of (' + horizontalModes.join(', ') + ')'); - } - this._options.widgetPositioning.horizontal = _widgetPositioning.horizontal; - } - if (_widgetPositioning.vertical) { - if (typeof _widgetPositioning.vertical !== 'string') { - throw new TypeError('widgetPositioning() vertical variable must be a string'); - } - _widgetPositioning.vertical = _widgetPositioning.vertical.toLowerCase(); - if (verticalModes.indexOf(_widgetPositioning.vertical) === -1) { - throw new TypeError('widgetPositioning() expects vertical parameter to be one of (' + verticalModes.join(', ') + ')'); - } - this._options.widgetPositioning.vertical = _widgetPositioning.vertical; - } - this._update(); - }; - - TempusDominusBootstrap4.prototype.widgetParent = function widgetParent(_widgetParent) { - if (arguments.length === 0) { - return this._options.widgetParent; - } - - if (typeof _widgetParent === 'string') { - _widgetParent = $(_widgetParent); - } - - if (_widgetParent !== null && typeof _widgetParent !== 'string' && !(_widgetParent instanceof $)) { - throw new TypeError('widgetParent() expects a string or a jQuery object parameter'); - } - - this._options.widgetParent = _widgetParent; - if (this.widget) { - this.hide(); - this.show(); - } - }; - - //static - - - TempusDominusBootstrap4._jQueryHandleThis = function _jQueryHandleThis(me, option, argument) { - var data = $(me).data(DateTimePicker.DATA_KEY); - if ((typeof option === 'undefined' ? 'undefined' : _typeof(option)) === 'object') { - $.extend({}, DateTimePicker.Default, option); - } - - if (!data) { - data = new TempusDominusBootstrap4($(me), option); - $(me).data(DateTimePicker.DATA_KEY, data); - } - - if (typeof option === 'string') { - if (data[option] === undefined) { - throw new Error('No method named "' + option + '"'); - } - if (argument === undefined) { - return data[option](); - } else { - return data[option](argument); - } - } - }; - - TempusDominusBootstrap4._jQueryInterface = function _jQueryInterface(option, argument) { - if (this.length === 1) { - return TempusDominusBootstrap4._jQueryHandleThis(this[0], option, argument); - } - return this.each(function () { - TempusDominusBootstrap4._jQueryHandleThis(this, option, argument); - }); - }; - - return TempusDominusBootstrap4; - }(DateTimePicker); - +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// ReSharper disable once InconsistentNaming +var DateTimePicker = function ($, moment) { + function escapeRegExp(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + } + + function isValidDate(date) { + return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime()); + } + + function isValidDateTimeStr(str) { + return isValidDate(new Date(str)); + } // ReSharper disable InconsistentNaming + + + var trim = function trim(str) { + return str.replace(/(^\s+)|(\s+$)/g, ''); + }, + NAME = 'datetimepicker', + DATA_KEY = "" + NAME, + EVENT_KEY = "." + DATA_KEY, + DATA_API_KEY = '.data-api', + Selector = { + DATA_TOGGLE: "[data-toggle=\"" + DATA_KEY + "\"]" + }, + ClassName = { + INPUT: NAME + "-input" + }, + Event = { + CHANGE: "change" + EVENT_KEY, + BLUR: "blur" + EVENT_KEY, + KEYUP: "keyup" + EVENT_KEY, + KEYDOWN: "keydown" + EVENT_KEY, + FOCUS: "focus" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, + //emitted + UPDATE: "update" + EVENT_KEY, + ERROR: "error" + EVENT_KEY, + HIDE: "hide" + EVENT_KEY, + SHOW: "show" + EVENT_KEY + }, + DatePickerModes = [{ + CLASS_NAME: 'days', + NAV_FUNCTION: 'M', + NAV_STEP: 1 + }, { + CLASS_NAME: 'months', + NAV_FUNCTION: 'y', + NAV_STEP: 1 + }, { + CLASS_NAME: 'years', + NAV_FUNCTION: 'y', + NAV_STEP: 10 + }, { + CLASS_NAME: 'decades', + NAV_FUNCTION: 'y', + NAV_STEP: 100 + }], + KeyMap = { + 'up': 38, + 38: 'up', + 'down': 40, + 40: 'down', + 'left': 37, + 37: 'left', + 'right': 39, + 39: 'right', + 'tab': 9, + 9: 'tab', + 'escape': 27, + 27: 'escape', + 'enter': 13, + 13: 'enter', + 'pageUp': 33, + 33: 'pageUp', + 'pageDown': 34, + 34: 'pageDown', + 'shift': 16, + 16: 'shift', + 'control': 17, + 17: 'control', + 'space': 32, + 32: 'space', + 't': 84, + 84: 't', + 'delete': 46, + 46: 'delete' + }, + ViewModes = ['times', 'days', 'months', 'years', 'decades'], + keyState = {}, + keyPressHandled = {}, + optionsSortMap = { + timeZone: -39, + format: -38, + dayViewHeaderFormat: -37, + extraFormats: -36, + stepping: -35, + minDate: -34, + maxDate: -33, + useCurrent: -32, + collapse: -31, + locale: -30, + defaultDate: -29, + disabledDates: -28, + enabledDates: -27, + icons: -26, + tooltips: -25, + useStrict: -24, + sideBySide: -23, + daysOfWeekDisabled: -22, + calendarWeeks: -21, + viewMode: -20, + toolbarPlacement: -19, + buttons: -18, + widgetPositioning: -17, + widgetParent: -16, + ignoreReadonly: -15, + keepOpen: -14, + focusOnShow: -13, + inline: -12, + keepInvalid: -11, + keyBinds: -10, + debug: -9, + allowInputToggle: -8, + disabledTimeIntervals: -7, + disabledHours: -6, + enabledHours: -5, + viewDate: -4, + allowMultidate: -3, + multidateSeparator: -2, + updateOnlyThroughDateOption: -1, + date: 1 + }, + defaultFeatherIcons = { + time: 'clock', + date: 'calendar', + up: 'arrow-up', + down: 'arrow-down', + previous: 'arrow-left', + next: 'arrow-right', + today: 'arrow-down-circle', + clear: 'trash-2', + close: 'x' + }; + + function optionsSortFn(optionKeyA, optionKeyB) { + if (optionsSortMap[optionKeyA] && optionsSortMap[optionKeyB]) { + if (optionsSortMap[optionKeyA] < 0 && optionsSortMap[optionKeyB] < 0) { + return Math.abs(optionsSortMap[optionKeyB]) - Math.abs(optionsSortMap[optionKeyA]); + } else if (optionsSortMap[optionKeyA] < 0) { + return -1; + } else if (optionsSortMap[optionKeyB] < 0) { + return 1; + } + + return optionsSortMap[optionKeyA] - optionsSortMap[optionKeyB]; + } else if (optionsSortMap[optionKeyA]) { + return optionsSortMap[optionKeyA]; + } else if (optionsSortMap[optionKeyB]) { + return optionsSortMap[optionKeyB]; + } + + return 0; + } + + var Default = { + timeZone: '', + format: false, + dayViewHeaderFormat: 'MMMM YYYY', + extraFormats: false, + stepping: 1, + minDate: false, + maxDate: false, + useCurrent: true, + collapse: true, + locale: moment.locale(), + defaultDate: false, + disabledDates: false, + enabledDates: false, + icons: { + type: 'class', + time: 'fa fa-clock-o', + date: 'fa fa-calendar', + up: 'fa fa-arrow-up', + down: 'fa fa-arrow-down', + previous: 'fa fa-chevron-left', + next: 'fa fa-chevron-right', + today: 'fa fa-calendar-check-o', + clear: 'fa fa-trash', + close: 'fa fa-times' + }, + tooltips: { + today: 'Go to today', + clear: 'Clear selection', + close: 'Close the picker', + selectMonth: 'Select Month', + prevMonth: 'Previous Month', + nextMonth: 'Next Month', + selectYear: 'Select Year', + prevYear: 'Previous Year', + nextYear: 'Next Year', + selectDecade: 'Select Decade', + prevDecade: 'Previous Decade', + nextDecade: 'Next Decade', + prevCentury: 'Previous Century', + nextCentury: 'Next Century', + pickHour: 'Pick Hour', + incrementHour: 'Increment Hour', + decrementHour: 'Decrement Hour', + pickMinute: 'Pick Minute', + incrementMinute: 'Increment Minute', + decrementMinute: 'Decrement Minute', + pickSecond: 'Pick Second', + incrementSecond: 'Increment Second', + decrementSecond: 'Decrement Second', + togglePeriod: 'Toggle Period', + selectTime: 'Select Time', + selectDate: 'Select Date' + }, + useStrict: false, + sideBySide: false, + daysOfWeekDisabled: false, + calendarWeeks: false, + viewMode: 'days', + toolbarPlacement: 'default', + buttons: { + showToday: false, + showClear: false, + showClose: false + }, + widgetPositioning: { + horizontal: 'auto', + vertical: 'auto' + }, + widgetParent: null, + readonly: false, + ignoreReadonly: false, + keepOpen: false, + focusOnShow: true, + inline: false, + keepInvalid: false, + keyBinds: { + up: function up() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().subtract(7, 'd')); + } else { + this.date(d.clone().add(this.stepping(), 'm')); + } + + return true; + }, + down: function down() { + if (!this.widget) { + this.show(); + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().add(7, 'd')); + } else { + this.date(d.clone().subtract(this.stepping(), 'm')); + } + + return true; + }, + 'control up': function controlUp() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().subtract(1, 'y')); + } else { + this.date(d.clone().add(1, 'h')); + } + + return true; + }, + 'control down': function controlDown() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().add(1, 'y')); + } else { + this.date(d.clone().subtract(1, 'h')); + } + + return true; + }, + left: function left() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().subtract(1, 'd')); + } + + return true; + }, + right: function right() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().add(1, 'd')); + } + + return true; + }, + pageUp: function pageUp() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().subtract(1, 'M')); + } + + return true; + }, + pageDown: function pageDown() { + if (!this.widget) { + return false; + } + + var d = this._dates[0] || this.getMoment(); + + if (this.widget.find('.datepicker').is(':visible')) { + this.date(d.clone().add(1, 'M')); + } + + return true; + }, + enter: function enter() { + if (!this.widget) { + return false; + } + + this.hide(); + return true; + }, + escape: function escape() { + if (!this.widget) { + return false; + } + + this.hide(); + return true; + }, + 'control space': function controlSpace() { + if (!this.widget) { + return false; + } + + if (this.widget.find('.timepicker').is(':visible')) { + this.widget.find('.btn[data-action="togglePeriod"]').click(); + } + + return true; + }, + t: function t() { + if (!this.widget) { + return false; + } + + this.date(this.getMoment()); + return true; + }, + 'delete': function _delete() { + if (!this.widget) { + return false; + } + + this.clear(); + return true; + } + }, + debug: false, + allowInputToggle: false, + disabledTimeIntervals: false, + disabledHours: false, + enabledHours: false, + viewDate: false, + allowMultidate: false, + multidateSeparator: ', ', + updateOnlyThroughDateOption: false, + promptTimeOnDateChange: false, + promptTimeOnDateChangeTransitionDelay: 200 + }; // ReSharper restore InconsistentNaming + // ReSharper disable once DeclarationHides + // ReSharper disable once InconsistentNaming + + var DateTimePicker = /*#__PURE__*/function () { + /** @namespace eData.dateOptions */ + + /** @namespace moment.tz */ + function DateTimePicker(element, options) { + this._options = this._getOptions(options); + this._element = element; + this._dates = []; + this._datesFormatted = []; + this._viewDate = null; + this.unset = true; + this.component = false; + this.widget = false; + this.use24Hours = null; + this.actualFormat = null; + this.parseFormats = null; + this.currentViewMode = null; + this.MinViewModeNumber = 0; + this.isInitFormatting = false; + this.isInit = false; + this.isDateUpdateThroughDateOptionFromClientCode = false; + this.hasInitDate = false; + this.initDate = void 0; + this._notifyChangeEventContext = void 0; + this._currentPromptTimeTimeout = null; + + this._int(); + } /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - - $(document).on(DateTimePicker.Event.CLICK_DATA_API, DateTimePicker.Selector.DATA_TOGGLE, function () { - var $target = getSelectorFromElement($(this)); - if ($target.length === 0) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, 'toggle'); - }).on(DateTimePicker.Event.CHANGE, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)); - if ($target.length === 0) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, '_change', event); - }).on(DateTimePicker.Event.BLUR, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)), - config = $target.data(DateTimePicker.DATA_KEY); - if ($target.length === 0) { - return; - } - if (config._options.debug || window.debug) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, 'hide', event); - }).on(DateTimePicker.Event.KEYDOWN, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)); - if ($target.length === 0) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, '_keydown', event); - }).on(DateTimePicker.Event.KEYUP, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)); - if ($target.length === 0) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, '_keyup', event); - }).on(DateTimePicker.Event.FOCUS, '.' + DateTimePicker.ClassName.INPUT, function (event) { - var $target = getSelectorFromElement($(this)), - config = $target.data(DateTimePicker.DATA_KEY); - if ($target.length === 0) { - return; - } - if (!config._options.allowInputToggle) { - return; - } - TempusDominusBootstrap4._jQueryInterface.call($target, 'show', event); - }); - - $.fn[DateTimePicker.NAME] = TempusDominusBootstrap4._jQueryInterface; - $.fn[DateTimePicker.NAME].Constructor = TempusDominusBootstrap4; - $.fn[DateTimePicker.NAME].noConflict = function () { - $.fn[DateTimePicker.NAME] = JQUERY_NO_CONFLICT; - return TempusDominusBootstrap4._jQueryInterface; - }; - - return TempusDominusBootstrap4; + * @return {string} + */ + + + var _proto = DateTimePicker.prototype; + + //private + _proto._int = function _int() { + this.isInit = true; + + var targetInput = this._element.data('target-input'); + + if (this._element.is('input')) { + this.input = this._element; + } else if (targetInput !== undefined) { + if (targetInput === 'nearest') { + this.input = this._element.find('input'); + } else { + this.input = $(targetInput); + } + } + + this._dates = []; + this._dates[0] = this.getMoment(); + this._viewDate = this.getMoment().clone(); + $.extend(true, this._options, this._dataToOptions()); + this.hasInitDate = false; + this.initDate = void 0; + this.options(this._options); + this.isInitFormatting = true; + + this._initFormatting(); + + this.isInitFormatting = false; + + if (this.input !== undefined && this.input.is('input') && this.input.val().trim().length !== 0) { + this._setValue(this._parseInputDate(this.input.val().trim()), 0); + } else if (this._options.defaultDate && this.input !== undefined && this.input.attr('placeholder') === undefined) { + this._setValue(this._options.defaultDate, 0); + } + + if (this.hasInitDate) { + this.date(this.initDate); + } + + if (this._options.inline) { + this.show(); + } + + this.isInit = false; + }; + + _proto._update = function _update() { + if (!this.widget) { + return; + } + + this._fillDate(); + + this._fillTime(); + }; + + _proto._setValue = function _setValue(targetMoment, index) { + var noIndex = typeof index === 'undefined', + isClear = !targetMoment && noIndex, + isDateUpdateThroughDateOptionFromClientCode = this.isDateUpdateThroughDateOptionFromClientCode, + isNotAllowedProgrammaticUpdate = !this.isInit && this._options.updateOnlyThroughDateOption && !isDateUpdateThroughDateOptionFromClientCode; + var outpValue = '', + isInvalid = false, + oldDate = this.unset ? null : this._dates[index]; + + if (!oldDate && !this.unset && noIndex && isClear) { + oldDate = this._dates[this._dates.length - 1]; + } // case of calling setValue(null or false) + + + if (!targetMoment) { + if (isNotAllowedProgrammaticUpdate) { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment, + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + + return; + } + + if (!this._options.allowMultidate || this._dates.length === 1 || isClear) { + this.unset = true; + this._dates = []; + this._datesFormatted = []; + } else { + outpValue = "" + this._element.data('date') + this._options.multidateSeparator; + outpValue = oldDate && outpValue.replace("" + oldDate.format(this.actualFormat) + this._options.multidateSeparator, '').replace("" + this._options.multidateSeparator + this._options.multidateSeparator, '').replace(new RegExp(escapeRegExp(this._options.multidateSeparator) + "\\s*$"), '') || ''; + + this._dates.splice(index, 1); + + this._datesFormatted.splice(index, 1); + } + + outpValue = trim(outpValue); + + if (this.input !== undefined) { + this.input.val(outpValue); + this.input.trigger('input'); + } + + this._element.data('date', outpValue); + + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: false, + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + + this._update(); + + return; + } + + targetMoment = targetMoment.clone().locale(this._options.locale); + + if (this._hasTimeZone()) { + targetMoment.tz(this._options.timeZone); + } + + if (this._options.stepping !== 1) { + targetMoment.minutes(Math.round(targetMoment.minutes() / this._options.stepping) * this._options.stepping).seconds(0); + } + + if (this._isValid(targetMoment)) { + if (isNotAllowedProgrammaticUpdate) { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment.clone(), + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + + return; + } + + this._dates[index] = targetMoment; + this._datesFormatted[index] = targetMoment.format('YYYY-MM-DD'); + this._viewDate = targetMoment.clone(); + + if (this._options.allowMultidate && this._dates.length > 1) { + for (var i = 0; i < this._dates.length; i++) { + outpValue += "" + this._dates[i].format(this.actualFormat) + this._options.multidateSeparator; + } + + outpValue = outpValue.replace(new RegExp(this._options.multidateSeparator + "\\s*$"), ''); + } else { + outpValue = this._dates[index].format(this.actualFormat); + } + + outpValue = trim(outpValue); + + if (this.input !== undefined) { + this.input.val(outpValue); + this.input.trigger('input'); + } + + this._element.data('date', outpValue); + + this.unset = false; + + this._update(); + + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: this._dates[index].clone(), + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + } else { + isInvalid = true; + + if (!this._options.keepInvalid) { + if (this.input !== undefined) { + this.input.val("" + (this.unset ? '' : this._dates[index].format(this.actualFormat))); + this.input.trigger('input'); + } + } else { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment, + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + } + + this._notifyEvent({ + type: DateTimePicker.Event.ERROR, + date: targetMoment, + oldDate: oldDate + }); + } + }; + + _proto._change = function _change(e) { + var val = $(e.target).val().trim(), + parsedDate = val ? this._parseInputDate(val) : null; + + this._setValue(parsedDate, 0); + + e.stopImmediatePropagation(); + return false; + } //noinspection JSMethodCanBeStatic + ; + + _proto._getOptions = function _getOptions(options) { + options = $.extend(true, {}, Default, options && options.icons && options.icons.type === 'feather' ? { + icons: defaultFeatherIcons + } : {}, options); + return options; + }; + + _proto._hasTimeZone = function _hasTimeZone() { + return moment.tz !== undefined && this._options.timeZone !== undefined && this._options.timeZone !== null && this._options.timeZone !== ''; + }; + + _proto._isEnabled = function _isEnabled(granularity) { + if (typeof granularity !== 'string' || granularity.length > 1) { + throw new TypeError('isEnabled expects a single character string parameter'); + } + + switch (granularity) { + case 'y': + return this.actualFormat.indexOf('Y') !== -1; + + case 'M': + return this.actualFormat.indexOf('M') !== -1; + + case 'd': + return this.actualFormat.toLowerCase().indexOf('d') !== -1; + + case 'h': + case 'H': + return this.actualFormat.toLowerCase().indexOf('h') !== -1; + + case 'm': + return this.actualFormat.indexOf('m') !== -1; + + case 's': + return this.actualFormat.indexOf('s') !== -1; + + case 'a': + case 'A': + return this.actualFormat.toLowerCase().indexOf('a') !== -1; + + default: + return false; + } + }; + + _proto._hasTime = function _hasTime() { + return this._isEnabled('h') || this._isEnabled('m') || this._isEnabled('s'); + }; + + _proto._hasDate = function _hasDate() { + return this._isEnabled('y') || this._isEnabled('M') || this._isEnabled('d'); + }; + + _proto._dataToOptions = function _dataToOptions() { + var eData = this._element.data(); + + var dataOptions = {}; + + if (eData.dateOptions && eData.dateOptions instanceof Object) { + dataOptions = $.extend(true, dataOptions, eData.dateOptions); + } + + $.each(this._options, function (key) { + var attributeName = "date" + key.charAt(0).toUpperCase() + key.slice(1); //todo data api key + + if (eData[attributeName] !== undefined) { + dataOptions[key] = eData[attributeName]; + } else { + delete dataOptions[key]; + } + }); + return dataOptions; + }; + + _proto._format = function _format() { + return this._options.format || 'YYYY-MM-DD HH:mm'; + }; + + _proto._areSameDates = function _areSameDates(a, b) { + var format = this._format(); + + return a && b && (a.isSame(b) || moment(a.format(format), format).isSame(moment(b.format(format), format))); + }; + + _proto._notifyEvent = function _notifyEvent(e) { + if (e.type === DateTimePicker.Event.CHANGE) { + this._notifyChangeEventContext = this._notifyChangeEventContext || 0; + this._notifyChangeEventContext++; + + if (e.date && this._areSameDates(e.date, e.oldDate) || !e.isClear && !e.date && !e.oldDate || this._notifyChangeEventContext > 1) { + this._notifyChangeEventContext = void 0; + return; + } + + this._handlePromptTimeIfNeeded(e); + } + + this._element.trigger(e); + + this._notifyChangeEventContext = void 0; + }; + + _proto._handlePromptTimeIfNeeded = function _handlePromptTimeIfNeeded(e) { + if (this._options.promptTimeOnDateChange) { + if (!e.oldDate && this._options.useCurrent) { + // First time ever. If useCurrent option is set to true (default), do nothing + // because the first date is selected automatically. + return; + } else if (e.oldDate && e.date && (e.oldDate.format('YYYY-MM-DD') === e.date.format('YYYY-MM-DD') || e.oldDate.format('YYYY-MM-DD') !== e.date.format('YYYY-MM-DD') && e.oldDate.format('HH:mm:ss') !== e.date.format('HH:mm:ss'))) { + // Date didn't change (time did) or date changed because time did. + return; + } + + var that = this; + clearTimeout(this._currentPromptTimeTimeout); + this._currentPromptTimeTimeout = setTimeout(function () { + if (that.widget) { + that.widget.find('[data-action="togglePicker"]').click(); + } + }, this._options.promptTimeOnDateChangeTransitionDelay); + } + }; + + _proto._viewUpdate = function _viewUpdate(e) { + if (e === 'y') { + e = 'YYYY'; + } + + this._notifyEvent({ + type: DateTimePicker.Event.UPDATE, + change: e, + viewDate: this._viewDate.clone() + }); + }; + + _proto._showMode = function _showMode(dir) { + if (!this.widget) { + return; + } + + if (dir) { + this.currentViewMode = Math.max(this.MinViewModeNumber, Math.min(3, this.currentViewMode + dir)); + } + + this.widget.find('.datepicker > div').hide().filter(".datepicker-" + DatePickerModes[this.currentViewMode].CLASS_NAME).show(); + }; + + _proto._isInDisabledDates = function _isInDisabledDates(testDate) { + return this._options.disabledDates[testDate.format('YYYY-MM-DD')] === true; + }; + + _proto._isInEnabledDates = function _isInEnabledDates(testDate) { + return this._options.enabledDates[testDate.format('YYYY-MM-DD')] === true; + }; + + _proto._isInDisabledHours = function _isInDisabledHours(testDate) { + return this._options.disabledHours[testDate.format('H')] === true; + }; + + _proto._isInEnabledHours = function _isInEnabledHours(testDate) { + return this._options.enabledHours[testDate.format('H')] === true; + }; + + _proto._isValid = function _isValid(targetMoment, granularity) { + if (!targetMoment || !targetMoment.isValid()) { + return false; + } + + if (this._options.disabledDates && granularity === 'd' && this._isInDisabledDates(targetMoment)) { + return false; + } + + if (this._options.enabledDates && granularity === 'd' && !this._isInEnabledDates(targetMoment)) { + return false; + } + + if (this._options.minDate && targetMoment.isBefore(this._options.minDate, granularity)) { + return false; + } + + if (this._options.maxDate && targetMoment.isAfter(this._options.maxDate, granularity)) { + return false; + } + + if (this._options.daysOfWeekDisabled && granularity === 'd' && this._options.daysOfWeekDisabled.indexOf(targetMoment.day()) !== -1) { + return false; + } + + if (this._options.disabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && this._isInDisabledHours(targetMoment)) { + return false; + } + + if (this._options.enabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && !this._isInEnabledHours(targetMoment)) { + return false; + } + + if (this._options.disabledTimeIntervals && (granularity === 'h' || granularity === 'm' || granularity === 's')) { + var found = false; + $.each(this._options.disabledTimeIntervals, function () { + if (targetMoment.isBetween(this[0], this[1])) { + found = true; + return false; + } + }); + + if (found) { + return false; + } + } + + return true; + }; + + _proto._parseInputDate = function _parseInputDate(inputDate, _temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$isPickerShow = _ref.isPickerShow, + isPickerShow = _ref$isPickerShow === void 0 ? false : _ref$isPickerShow; + + if (this._options.parseInputDate === undefined || isPickerShow) { + if (!moment.isMoment(inputDate)) { + inputDate = this.getMoment(inputDate); + } + } else { + inputDate = this._options.parseInputDate(inputDate); + } //inputDate.locale(this.options.locale); + + + return inputDate; + }; + + _proto._keydown = function _keydown(e) { + var handler = null, + index, + index2, + keyBindKeys, + allModifiersPressed; + var pressedKeys = [], + pressedModifiers = {}, + currentKey = e.which, + pressed = 'p'; + keyState[currentKey] = pressed; + + for (index in keyState) { + if (keyState.hasOwnProperty(index) && keyState[index] === pressed) { + pressedKeys.push(index); + + if (parseInt(index, 10) !== currentKey) { + pressedModifiers[index] = true; + } + } + } + + for (index in this._options.keyBinds) { + if (this._options.keyBinds.hasOwnProperty(index) && typeof this._options.keyBinds[index] === 'function') { + keyBindKeys = index.split(' '); + + if (keyBindKeys.length === pressedKeys.length && KeyMap[currentKey] === keyBindKeys[keyBindKeys.length - 1]) { + allModifiersPressed = true; + + for (index2 = keyBindKeys.length - 2; index2 >= 0; index2--) { + if (!(KeyMap[keyBindKeys[index2]] in pressedModifiers)) { + allModifiersPressed = false; + break; + } + } + + if (allModifiersPressed) { + handler = this._options.keyBinds[index]; + break; + } + } + } + } + + if (handler) { + if (handler.call(this)) { + e.stopPropagation(); + e.preventDefault(); + } + } + } //noinspection JSMethodCanBeStatic,SpellCheckingInspection + ; + + _proto._keyup = function _keyup(e) { + keyState[e.which] = 'r'; + + if (keyPressHandled[e.which]) { + keyPressHandled[e.which] = false; + e.stopPropagation(); + e.preventDefault(); + } + }; + + _proto._indexGivenDates = function _indexGivenDates(givenDatesArray) { + // Store given enabledDates and disabledDates as keys. + // This way we can check their existence in O(1) time instead of looping through whole array. + // (for example: options.enabledDates['2014-02-27'] === true) + var givenDatesIndexed = {}, + self = this; + $.each(givenDatesArray, function () { + var dDate = self._parseInputDate(this); + + if (dDate.isValid()) { + givenDatesIndexed[dDate.format('YYYY-MM-DD')] = true; + } + }); + return Object.keys(givenDatesIndexed).length ? givenDatesIndexed : false; + }; + + _proto._indexGivenHours = function _indexGivenHours(givenHoursArray) { + // Store given enabledHours and disabledHours as keys. + // This way we can check their existence in O(1) time instead of looping through whole array. + // (for example: options.enabledHours['2014-02-27'] === true) + var givenHoursIndexed = {}; + $.each(givenHoursArray, function () { + givenHoursIndexed[this] = true; + }); + return Object.keys(givenHoursIndexed).length ? givenHoursIndexed : false; + }; + + _proto._initFormatting = function _initFormatting() { + var format = this._options.format || 'L LT', + self = this; + this.actualFormat = format.replace(/(\[[^\[]*])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput) { + return (self.isInitFormatting && self._options.date === null ? self.getMoment() : self._dates[0]).localeData().longDateFormat(formatInput) || formatInput; //todo taking the first date should be ok + }); + this.parseFormats = this._options.extraFormats ? this._options.extraFormats.slice() : []; + + if (this.parseFormats.indexOf(format) < 0 && this.parseFormats.indexOf(this.actualFormat) < 0) { + this.parseFormats.push(this.actualFormat); + } + + this.use24Hours = this.actualFormat.toLowerCase().indexOf('a') < 1 && this.actualFormat.replace(/\[.*?]/g, '').indexOf('h') < 1; + + if (this._isEnabled('y')) { + this.MinViewModeNumber = 2; + } + + if (this._isEnabled('M')) { + this.MinViewModeNumber = 1; + } + + if (this._isEnabled('d')) { + this.MinViewModeNumber = 0; + } + + this.currentViewMode = Math.max(this.MinViewModeNumber, this.currentViewMode); + + if (!this.unset) { + this._setValue(this._dates[0], 0); + } + }; + + _proto._getLastPickedDate = function _getLastPickedDate() { + var lastPickedDate = this._dates[this._getLastPickedDateIndex()]; + + if (!lastPickedDate && this._options.allowMultidate) { + lastPickedDate = moment(new Date()); + } + + return lastPickedDate; + }; + + _proto._getLastPickedDateIndex = function _getLastPickedDateIndex() { + return this._dates.length - 1; + } //public + ; + + _proto.getMoment = function getMoment(d) { + var returnMoment; + + if (d === undefined || d === null) { + // TODO: Should this use format? + returnMoment = moment().clone().locale(this._options.locale); + } else if (this._hasTimeZone()) { + // There is a string to parse and a default time zone + // parse with the tz function which takes a default time zone if it is not in the format string + returnMoment = moment.tz(d, this.parseFormats, this._options.locale, this._options.useStrict, this._options.timeZone); + } else { + returnMoment = moment(d, this.parseFormats, this._options.locale, this._options.useStrict); + } + + if (this._hasTimeZone()) { + returnMoment.tz(this._options.timeZone); + } + + return returnMoment; + }; + + _proto.toggle = function toggle() { + return this.widget ? this.hide() : this.show(); + }; + + _proto.readonly = function readonly(_readonly) { + if (arguments.length === 0) { + return this._options.readonly; + } + + if (typeof _readonly !== 'boolean') { + throw new TypeError('readonly() expects a boolean parameter'); + } + + this._options.readonly = _readonly; + + if (this.input !== undefined) { + this.input.prop('readonly', this._options.readonly); + } + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto.ignoreReadonly = function ignoreReadonly(_ignoreReadonly) { + if (arguments.length === 0) { + return this._options.ignoreReadonly; + } + + if (typeof _ignoreReadonly !== 'boolean') { + throw new TypeError('ignoreReadonly() expects a boolean parameter'); + } + + this._options.ignoreReadonly = _ignoreReadonly; + }; + + _proto.options = function options(newOptions) { + if (arguments.length === 0) { + return $.extend(true, {}, this._options); + } + + if (!(newOptions instanceof Object)) { + throw new TypeError('options() this.options parameter should be an object'); + } + + $.extend(true, this._options, newOptions); + var self = this, + optionsKeys = Object.keys(this._options).sort(optionsSortFn); + $.each(optionsKeys, function (i, key) { + var value = self._options[key]; + + if (self[key] !== undefined) { + if (self.isInit && key === 'date') { + self.hasInitDate = true; + self.initDate = value; + return; + } + + self[key](value); + } + }); + }; + + _proto.date = function date(newDate, index) { + index = index || 0; + + if (arguments.length === 0) { + if (this.unset) { + return null; + } + + if (this._options.allowMultidate) { + return this._dates.join(this._options.multidateSeparator); + } else { + return this._dates[index].clone(); + } + } + + if (newDate !== null && typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { + throw new TypeError('date() parameter must be one of [null, string, moment or Date]'); + } + + if (typeof newDate === 'string' && isValidDateTimeStr(newDate)) { + newDate = new Date(newDate); + } + + this._setValue(newDate === null ? null : this._parseInputDate(newDate), index); + }; + + _proto.updateOnlyThroughDateOption = function updateOnlyThroughDateOption(_updateOnlyThroughDateOption) { + if (typeof _updateOnlyThroughDateOption !== 'boolean') { + throw new TypeError('updateOnlyThroughDateOption() expects a boolean parameter'); + } + + this._options.updateOnlyThroughDateOption = _updateOnlyThroughDateOption; + }; + + _proto.format = function format(newFormat) { + if (arguments.length === 0) { + return this._options.format; + } + + if (typeof newFormat !== 'string' && (typeof newFormat !== 'boolean' || newFormat !== false)) { + throw new TypeError("format() expects a string or boolean:false parameter " + newFormat); + } + + this._options.format = newFormat; + + if (this.actualFormat) { + this._initFormatting(); // reinitialize formatting + + } + }; + + _proto.timeZone = function timeZone(newZone) { + if (arguments.length === 0) { + return this._options.timeZone; + } + + if (typeof newZone !== 'string') { + throw new TypeError('newZone() expects a string parameter'); + } + + this._options.timeZone = newZone; + }; + + _proto.dayViewHeaderFormat = function dayViewHeaderFormat(newFormat) { + if (arguments.length === 0) { + return this._options.dayViewHeaderFormat; + } + + if (typeof newFormat !== 'string') { + throw new TypeError('dayViewHeaderFormat() expects a string parameter'); + } + + this._options.dayViewHeaderFormat = newFormat; + }; + + _proto.extraFormats = function extraFormats(formats) { + if (arguments.length === 0) { + return this._options.extraFormats; + } + + if (formats !== false && !(formats instanceof Array)) { + throw new TypeError('extraFormats() expects an array or false parameter'); + } + + this._options.extraFormats = formats; + + if (this.parseFormats) { + this._initFormatting(); // reinit formatting + + } + }; + + _proto.disabledDates = function disabledDates(dates) { + if (arguments.length === 0) { + return this._options.disabledDates ? $.extend({}, this._options.disabledDates) : this._options.disabledDates; + } + + if (!dates) { + this._options.disabledDates = false; + + this._update(); + + return true; + } + + if (!(dates instanceof Array)) { + throw new TypeError('disabledDates() expects an array parameter'); + } + + this._options.disabledDates = this._indexGivenDates(dates); + this._options.enabledDates = false; + + this._update(); + }; + + _proto.enabledDates = function enabledDates(dates) { + if (arguments.length === 0) { + return this._options.enabledDates ? $.extend({}, this._options.enabledDates) : this._options.enabledDates; + } + + if (!dates) { + this._options.enabledDates = false; + + this._update(); + + return true; + } + + if (!(dates instanceof Array)) { + throw new TypeError('enabledDates() expects an array parameter'); + } + + this._options.enabledDates = this._indexGivenDates(dates); + this._options.disabledDates = false; + + this._update(); + }; + + _proto.daysOfWeekDisabled = function daysOfWeekDisabled(_daysOfWeekDisabled) { + if (arguments.length === 0) { + return this._options.daysOfWeekDisabled.splice(0); + } + + if (typeof _daysOfWeekDisabled === 'boolean' && !_daysOfWeekDisabled) { + this._options.daysOfWeekDisabled = false; + + this._update(); + + return true; + } + + if (!(_daysOfWeekDisabled instanceof Array)) { + throw new TypeError('daysOfWeekDisabled() expects an array parameter'); + } + + this._options.daysOfWeekDisabled = _daysOfWeekDisabled.reduce(function (previousValue, currentValue) { + currentValue = parseInt(currentValue, 10); + + if (currentValue > 6 || currentValue < 0 || isNaN(currentValue)) { + return previousValue; + } + + if (previousValue.indexOf(currentValue) === -1) { + previousValue.push(currentValue); + } + + return previousValue; + }, []).sort(); + + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; + + while (!this._isValid(this._dates[i], 'd')) { + this._dates[i].add(1, 'd'); + + if (tries === 31) { + throw 'Tried 31 times to find a valid date'; + } + + tries++; + } + + this._setValue(this._dates[i], i); + } + } + + this._update(); + }; + + _proto.maxDate = function maxDate(_maxDate) { + if (arguments.length === 0) { + return this._options.maxDate ? this._options.maxDate.clone() : this._options.maxDate; + } + + if (typeof _maxDate === 'boolean' && _maxDate === false) { + this._options.maxDate = false; + + this._update(); + + return true; + } + + if (typeof _maxDate === 'string') { + if (_maxDate === 'now' || _maxDate === 'moment') { + _maxDate = this.getMoment(); + } + } + + var parsedDate = this._parseInputDate(_maxDate); + + if (!parsedDate.isValid()) { + throw new TypeError("maxDate() Could not parse date parameter: " + _maxDate); + } + + if (this._options.minDate && parsedDate.isBefore(this._options.minDate)) { + throw new TypeError("maxDate() date parameter is before this.options.minDate: " + parsedDate.format(this.actualFormat)); + } + + this._options.maxDate = parsedDate; + + for (var i = 0; i < this._dates.length; i++) { + if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isAfter(_maxDate)) { + this._setValue(this._options.maxDate, i); + } + } + + if (this._viewDate.isAfter(parsedDate)) { + this._viewDate = parsedDate.clone().subtract(this._options.stepping, 'm'); + } + + this._update(); + }; + + _proto.minDate = function minDate(_minDate) { + if (arguments.length === 0) { + return this._options.minDate ? this._options.minDate.clone() : this._options.minDate; + } + + if (typeof _minDate === 'boolean' && _minDate === false) { + this._options.minDate = false; + + this._update(); + + return true; + } + + if (typeof _minDate === 'string') { + if (_minDate === 'now' || _minDate === 'moment') { + _minDate = this.getMoment(); + } + } + + var parsedDate = this._parseInputDate(_minDate); + + if (!parsedDate.isValid()) { + throw new TypeError("minDate() Could not parse date parameter: " + _minDate); + } + + if (this._options.maxDate && parsedDate.isAfter(this._options.maxDate)) { + throw new TypeError("minDate() date parameter is after this.options.maxDate: " + parsedDate.format(this.actualFormat)); + } + + this._options.minDate = parsedDate; + + for (var i = 0; i < this._dates.length; i++) { + if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isBefore(_minDate)) { + this._setValue(this._options.minDate, i); + } + } + + if (this._viewDate.isBefore(parsedDate)) { + this._viewDate = parsedDate.clone().add(this._options.stepping, 'm'); + } + + this._update(); + }; + + _proto.defaultDate = function defaultDate(_defaultDate) { + if (arguments.length === 0) { + return this._options.defaultDate ? this._options.defaultDate.clone() : this._options.defaultDate; + } + + if (!_defaultDate) { + this._options.defaultDate = false; + return true; + } + + if (typeof _defaultDate === 'string') { + if (_defaultDate === 'now' || _defaultDate === 'moment') { + _defaultDate = this.getMoment(); + } else { + _defaultDate = this.getMoment(_defaultDate); + } + } + + var parsedDate = this._parseInputDate(_defaultDate); + + if (!parsedDate.isValid()) { + throw new TypeError("defaultDate() Could not parse date parameter: " + _defaultDate); + } + + if (!this._isValid(parsedDate)) { + throw new TypeError('defaultDate() date passed is invalid according to component setup validations'); + } + + this._options.defaultDate = parsedDate; + + if (this._options.defaultDate && this._options.inline || this.input !== undefined && this.input.val().trim() === '') { + this._setValue(this._options.defaultDate, 0); + } + }; + + _proto.locale = function locale(_locale) { + if (arguments.length === 0) { + return this._options.locale; + } + + if (!moment.localeData(_locale)) { + throw new TypeError("locale() locale " + _locale + " is not loaded from moment locales!"); + } + + this._options.locale = _locale; + + for (var i = 0; i < this._dates.length; i++) { + this._dates[i].locale(this._options.locale); + } + + this._viewDate.locale(this._options.locale); + + if (this.actualFormat) { + this._initFormatting(); // reinitialize formatting + + } + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto.stepping = function stepping(_stepping) { + if (arguments.length === 0) { + return this._options.stepping; + } + + _stepping = parseInt(_stepping, 10); + + if (isNaN(_stepping) || _stepping < 1) { + _stepping = 1; + } + + this._options.stepping = _stepping; + }; + + _proto.useCurrent = function useCurrent(_useCurrent) { + var useCurrentOptions = ['year', 'month', 'day', 'hour', 'minute']; + + if (arguments.length === 0) { + return this._options.useCurrent; + } + + if (typeof _useCurrent !== 'boolean' && typeof _useCurrent !== 'string') { + throw new TypeError('useCurrent() expects a boolean or string parameter'); + } + + if (typeof _useCurrent === 'string' && useCurrentOptions.indexOf(_useCurrent.toLowerCase()) === -1) { + throw new TypeError("useCurrent() expects a string parameter of " + useCurrentOptions.join(', ')); + } + + this._options.useCurrent = _useCurrent; + }; + + _proto.collapse = function collapse(_collapse) { + if (arguments.length === 0) { + return this._options.collapse; + } + + if (typeof _collapse !== 'boolean') { + throw new TypeError('collapse() expects a boolean parameter'); + } + + if (this._options.collapse === _collapse) { + return true; + } + + this._options.collapse = _collapse; + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto.icons = function icons(_icons) { + if (arguments.length === 0) { + return $.extend({}, this._options.icons); + } + + if (!(_icons instanceof Object)) { + throw new TypeError('icons() expects parameter to be an Object'); + } + + $.extend(this._options.icons, _icons); + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto.tooltips = function tooltips(_tooltips) { + if (arguments.length === 0) { + return $.extend({}, this._options.tooltips); + } + + if (!(_tooltips instanceof Object)) { + throw new TypeError('tooltips() expects parameter to be an Object'); + } + + $.extend(this._options.tooltips, _tooltips); + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto.useStrict = function useStrict(_useStrict) { + if (arguments.length === 0) { + return this._options.useStrict; + } + + if (typeof _useStrict !== 'boolean') { + throw new TypeError('useStrict() expects a boolean parameter'); + } + + this._options.useStrict = _useStrict; + }; + + _proto.sideBySide = function sideBySide(_sideBySide) { + if (arguments.length === 0) { + return this._options.sideBySide; + } + + if (typeof _sideBySide !== 'boolean') { + throw new TypeError('sideBySide() expects a boolean parameter'); + } + + this._options.sideBySide = _sideBySide; + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto.viewMode = function viewMode(_viewMode) { + if (arguments.length === 0) { + return this._options.viewMode; + } + + if (typeof _viewMode !== 'string') { + throw new TypeError('viewMode() expects a string parameter'); + } + + if (DateTimePicker.ViewModes.indexOf(_viewMode) === -1) { + throw new TypeError("viewMode() parameter must be one of (" + DateTimePicker.ViewModes.join(', ') + ") value"); + } + + this._options.viewMode = _viewMode; + this.currentViewMode = Math.max(DateTimePicker.ViewModes.indexOf(_viewMode) - 1, this.MinViewModeNumber); + + this._showMode(); + }; + + _proto.calendarWeeks = function calendarWeeks(_calendarWeeks) { + if (arguments.length === 0) { + return this._options.calendarWeeks; + } + + if (typeof _calendarWeeks !== 'boolean') { + throw new TypeError('calendarWeeks() expects parameter to be a boolean value'); + } + + this._options.calendarWeeks = _calendarWeeks; + + this._update(); + }; + + _proto.buttons = function buttons(_buttons) { + if (arguments.length === 0) { + return $.extend({}, this._options.buttons); + } + + if (!(_buttons instanceof Object)) { + throw new TypeError('buttons() expects parameter to be an Object'); + } + + $.extend(this._options.buttons, _buttons); + + if (typeof this._options.buttons.showToday !== 'boolean') { + throw new TypeError('buttons.showToday expects a boolean parameter'); + } + + if (typeof this._options.buttons.showClear !== 'boolean') { + throw new TypeError('buttons.showClear expects a boolean parameter'); + } + + if (typeof this._options.buttons.showClose !== 'boolean') { + throw new TypeError('buttons.showClose expects a boolean parameter'); + } + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto.keepOpen = function keepOpen(_keepOpen) { + if (arguments.length === 0) { + return this._options.keepOpen; + } + + if (typeof _keepOpen !== 'boolean') { + throw new TypeError('keepOpen() expects a boolean parameter'); + } + + this._options.keepOpen = _keepOpen; + }; + + _proto.focusOnShow = function focusOnShow(_focusOnShow) { + if (arguments.length === 0) { + return this._options.focusOnShow; + } + + if (typeof _focusOnShow !== 'boolean') { + throw new TypeError('focusOnShow() expects a boolean parameter'); + } + + this._options.focusOnShow = _focusOnShow; + }; + + _proto.inline = function inline(_inline) { + if (arguments.length === 0) { + return this._options.inline; + } + + if (typeof _inline !== 'boolean') { + throw new TypeError('inline() expects a boolean parameter'); + } + + this._options.inline = _inline; + }; + + _proto.clear = function clear() { + this._setValue(null); //todo + + }; + + _proto.keyBinds = function keyBinds(_keyBinds) { + if (arguments.length === 0) { + return this._options.keyBinds; + } + + this._options.keyBinds = _keyBinds; + }; + + _proto.debug = function debug(_debug) { + if (typeof _debug !== 'boolean') { + throw new TypeError('debug() expects a boolean parameter'); + } + + this._options.debug = _debug; + }; + + _proto.allowInputToggle = function allowInputToggle(_allowInputToggle) { + if (arguments.length === 0) { + return this._options.allowInputToggle; + } + + if (typeof _allowInputToggle !== 'boolean') { + throw new TypeError('allowInputToggle() expects a boolean parameter'); + } + + this._options.allowInputToggle = _allowInputToggle; + }; + + _proto.keepInvalid = function keepInvalid(_keepInvalid) { + if (arguments.length === 0) { + return this._options.keepInvalid; + } + + if (typeof _keepInvalid !== 'boolean') { + throw new TypeError('keepInvalid() expects a boolean parameter'); + } + + this._options.keepInvalid = _keepInvalid; + }; + + _proto.datepickerInput = function datepickerInput(_datepickerInput) { + if (arguments.length === 0) { + return this._options.datepickerInput; + } + + if (typeof _datepickerInput !== 'string') { + throw new TypeError('datepickerInput() expects a string parameter'); + } + + this._options.datepickerInput = _datepickerInput; + }; + + _proto.parseInputDate = function parseInputDate(_parseInputDate2) { + if (arguments.length === 0) { + return this._options.parseInputDate; + } + + if (typeof _parseInputDate2 !== 'function') { + throw new TypeError('parseInputDate() should be as function'); + } + + this._options.parseInputDate = _parseInputDate2; + }; + + _proto.disabledTimeIntervals = function disabledTimeIntervals(_disabledTimeIntervals) { + if (arguments.length === 0) { + return this._options.disabledTimeIntervals ? $.extend({}, this._options.disabledTimeIntervals) : this._options.disabledTimeIntervals; + } + + if (!_disabledTimeIntervals) { + this._options.disabledTimeIntervals = false; + + this._update(); + + return true; + } + + if (!(_disabledTimeIntervals instanceof Array)) { + throw new TypeError('disabledTimeIntervals() expects an array parameter'); + } + + this._options.disabledTimeIntervals = _disabledTimeIntervals; + + this._update(); + }; + + _proto.disabledHours = function disabledHours(hours) { + if (arguments.length === 0) { + return this._options.disabledHours ? $.extend({}, this._options.disabledHours) : this._options.disabledHours; + } + + if (!hours) { + this._options.disabledHours = false; + + this._update(); + + return true; + } + + if (!(hours instanceof Array)) { + throw new TypeError('disabledHours() expects an array parameter'); + } + + this._options.disabledHours = this._indexGivenHours(hours); + this._options.enabledHours = false; + + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; + + while (!this._isValid(this._dates[i], 'h')) { + this._dates[i].add(1, 'h'); + + if (tries === 24) { + throw 'Tried 24 times to find a valid date'; + } + + tries++; + } + + this._setValue(this._dates[i], i); + } + } + + this._update(); + }; + + _proto.enabledHours = function enabledHours(hours) { + if (arguments.length === 0) { + return this._options.enabledHours ? $.extend({}, this._options.enabledHours) : this._options.enabledHours; + } + + if (!hours) { + this._options.enabledHours = false; + + this._update(); + + return true; + } + + if (!(hours instanceof Array)) { + throw new TypeError('enabledHours() expects an array parameter'); + } + + this._options.enabledHours = this._indexGivenHours(hours); + this._options.disabledHours = false; + + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; + + while (!this._isValid(this._dates[i], 'h')) { + this._dates[i].add(1, 'h'); + + if (tries === 24) { + throw 'Tried 24 times to find a valid date'; + } + + tries++; + } + + this._setValue(this._dates[i], i); + } + } + + this._update(); + }; + + _proto.viewDate = function viewDate(newDate) { + if (arguments.length === 0) { + return this._viewDate.clone(); + } + + if (!newDate) { + this._viewDate = (this._dates[0] || this.getMoment()).clone(); + return true; + } + + if (typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { + throw new TypeError('viewDate() parameter must be one of [string, moment or Date]'); + } + + this._viewDate = this._parseInputDate(newDate); + + this._update(); + + this._viewUpdate(DatePickerModes[this.currentViewMode] && DatePickerModes[this.currentViewMode].NAV_FUNCTION); + }; + + _proto._fillDate = function _fillDate() {}; + + _proto._useFeatherIcons = function _useFeatherIcons() { + return this._options.icons.type === 'feather'; + }; + + _proto.allowMultidate = function allowMultidate(_allowMultidate) { + if (typeof _allowMultidate !== 'boolean') { + throw new TypeError('allowMultidate() expects a boolean parameter'); + } + + this._options.allowMultidate = _allowMultidate; + }; + + _proto.multidateSeparator = function multidateSeparator(_multidateSeparator) { + if (arguments.length === 0) { + return this._options.multidateSeparator; + } + + if (typeof _multidateSeparator !== 'string') { + throw new TypeError('multidateSeparator expects a string parameter'); + } + + this._options.multidateSeparator = _multidateSeparator; + }; + + _createClass(DateTimePicker, null, [{ + key: "NAME", + get: function get() { + return NAME; + } + /** + * @return {string} + */ + + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY; + } + /** + * @return {string} + */ + + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY; + } + /** + * @return {string} + */ + + }, { + key: "DATA_API_KEY", + get: function get() { + return DATA_API_KEY; + } + }, { + key: "DatePickerModes", + get: function get() { + return DatePickerModes; + } + }, { + key: "ViewModes", + get: function get() { + return ViewModes; + } + }, { + key: "Event", + get: function get() { + return Event; + } + }, { + key: "Selector", + get: function get() { + return Selector; + } + }, { + key: "Default", + get: function get() { + return Default; + }, + set: function set(value) { + Default = value; + } + }, { + key: "ClassName", + get: function get() { + return ClassName; + } + }]); + + return DateTimePicker; + }(); + + return DateTimePicker; +}(jQuery, moment); //noinspection JSUnusedGlobalSymbols + +/* global DateTimePicker */ + +/* global feather */ + + +var TempusDominusBootstrap4 = function ($) { + // eslint-disable-line no-unused-vars + // ReSharper disable once InconsistentNaming + var JQUERY_NO_CONFLICT = $.fn[DateTimePicker.NAME], + verticalModes = ['top', 'bottom', 'auto'], + horizontalModes = ['left', 'right', 'auto'], + toolbarPlacements = ['default', 'top', 'bottom'], + getSelectorFromElement = function getSelectorFromElement($element) { + var selector = $element.data('target'), + $selector; + + if (!selector) { + selector = $element.attr('href') || ''; + selector = /^#[a-z]/i.test(selector) ? selector : null; + } + + $selector = $(selector); + + if ($selector.length === 0) { + return $element; + } + + if (!$selector.data(DateTimePicker.DATA_KEY)) { + $.extend({}, $selector.data(), $(this).data()); + } + + return $selector; + }; // ReSharper disable once InconsistentNaming + + + var TempusDominusBootstrap4 = /*#__PURE__*/function (_DateTimePicker) { + _inheritsLoose(TempusDominusBootstrap4, _DateTimePicker); + + function TempusDominusBootstrap4(element, options) { + var _this; + + _this = _DateTimePicker.call(this, element, options) || this; + + _this._init(); + + return _this; + } + + var _proto2 = TempusDominusBootstrap4.prototype; + + _proto2._init = function _init() { + if (this._element.hasClass('input-group')) { + var datepickerButton = this._element.find('.datepickerbutton'); + + if (datepickerButton.length === 0) { + this.component = this._element.find('[data-toggle="datetimepicker"]'); + } else { + this.component = datepickerButton; + } + } + }; + + _proto2._iconTag = function _iconTag(iconName) { + if (typeof feather !== 'undefined' && this._useFeatherIcons() && feather.icons[iconName]) { + return $('').html(feather.icons[iconName].toSvg()); + } else { + return $('').addClass(iconName); + } + }; + + _proto2._getDatePickerTemplate = function _getDatePickerTemplate() { + var headTemplate = $('').append($('').append($('').append($('').append($('
    ').addClass('cw').text('#')); - } - - while (currentDate.isBefore(this._viewDate.clone().endOf('w'))) { - row.append($('').addClass('dow').text(currentDate.format('dd'))); - currentDate.add(1, 'd'); - } - this.widget.find('.datepicker-days thead').append(row); - }; - - TempusDominusBootstrap4.prototype._fillMonths = function _fillMonths() { - var spans = [], - monthsShort = this._viewDate.clone().startOf('y').startOf('d'); - while (monthsShort.isSame(this._viewDate, 'y')) { - spans.push($('').attr('data-action', 'selectMonth').addClass('month').text(monthsShort.format('MMM'))); - monthsShort.add(1, 'M'); - } - this.widget.find('.datepicker-months td').empty().append(spans); - }; - - TempusDominusBootstrap4.prototype._updateMonths = function _updateMonths() { - var monthsView = this.widget.find('.datepicker-months'), - monthsViewHeader = monthsView.find('th'), - months = monthsView.find('tbody').find('span'), - self = this; - - monthsViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevYear); - monthsViewHeader.eq(1).attr('title', this._options.tooltips.selectYear); - monthsViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextYear); - - monthsView.find('.disabled').removeClass('disabled'); - - if (!this._isValid(this._viewDate.clone().subtract(1, 'y'), 'y')) { - monthsViewHeader.eq(0).addClass('disabled'); - } - - monthsViewHeader.eq(1).text(this._viewDate.year()); - - if (!this._isValid(this._viewDate.clone().add(1, 'y'), 'y')) { - monthsViewHeader.eq(2).addClass('disabled'); - } - - months.removeClass('active'); - if (this._getLastPickedDate().isSame(this._viewDate, 'y') && !this.unset) { - months.eq(this._getLastPickedDate().month()).addClass('active'); - } - - months.each(function (index) { - if (!self._isValid(self._viewDate.clone().month(index), 'M')) { - $(this).addClass('disabled'); - } - }); - }; - - TempusDominusBootstrap4.prototype._getStartEndYear = function _getStartEndYear(factor, year) { - var step = factor / 10, - startYear = Math.floor(year / factor) * factor, - endYear = startYear + step * 9, - focusValue = Math.floor(year / step) * step; - return [startYear, endYear, focusValue]; - }; - - TempusDominusBootstrap4.prototype._updateYears = function _updateYears() { - var yearsView = this.widget.find('.datepicker-years'), - yearsViewHeader = yearsView.find('th'), - yearCaps = this._getStartEndYear(10, this._viewDate.year()), - startYear = this._viewDate.clone().year(yearCaps[0]), - endYear = this._viewDate.clone().year(yearCaps[1]); - var html = ''; - - yearsViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevDecade); - yearsViewHeader.eq(1).attr('title', this._options.tooltips.selectDecade); - yearsViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextDecade); - - yearsView.find('.disabled').removeClass('disabled'); - - if (this._options.minDate && this._options.minDate.isAfter(startYear, 'y')) { - yearsViewHeader.eq(0).addClass('disabled'); - } - - yearsViewHeader.eq(1).text(startYear.year() + '-' + endYear.year()); - - if (this._options.maxDate && this._options.maxDate.isBefore(endYear, 'y')) { - yearsViewHeader.eq(2).addClass('disabled'); - } - - html += '' + (startYear.year() - 1) + ''; - while (!startYear.isAfter(endYear, 'y')) { - html += '' + startYear.year() + ''; - startYear.add(1, 'y'); - } - html += '' + startYear.year() + ''; - - yearsView.find('td').html(html); - }; - - TempusDominusBootstrap4.prototype._updateDecades = function _updateDecades() { - var decadesView = this.widget.find('.datepicker-decades'), - decadesViewHeader = decadesView.find('th'), - yearCaps = this._getStartEndYear(100, this._viewDate.year()), - startDecade = this._viewDate.clone().year(yearCaps[0]), - endDecade = this._viewDate.clone().year(yearCaps[1]); - var minDateDecade = false, - maxDateDecade = false, - endDecadeYear = void 0, - html = ''; - - decadesViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevCentury); - decadesViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextCentury); - - decadesView.find('.disabled').removeClass('disabled'); - - if (startDecade.year() === 0 || this._options.minDate && this._options.minDate.isAfter(startDecade, 'y')) { - decadesViewHeader.eq(0).addClass('disabled'); - } - - decadesViewHeader.eq(1).text(startDecade.year() + '-' + endDecade.year()); - - if (this._options.maxDate && this._options.maxDate.isBefore(endDecade, 'y')) { - decadesViewHeader.eq(2).addClass('disabled'); - } - - if (startDecade.year() - 10 < 0) { - html += ' '; - } else { - html += '' + (startDecade.year() - 10) + ''; - } - - while (!startDecade.isAfter(endDecade, 'y')) { - endDecadeYear = startDecade.year() + 11; - minDateDecade = this._options.minDate && this._options.minDate.isAfter(startDecade, 'y') && this._options.minDate.year() <= endDecadeYear; - maxDateDecade = this._options.maxDate && this._options.maxDate.isAfter(startDecade, 'y') && this._options.maxDate.year() <= endDecadeYear; - html += '' + startDecade.year() + ''; - startDecade.add(10, 'y'); - } - html += '' + startDecade.year() + ''; - - decadesView.find('td').html(html); - }; - - TempusDominusBootstrap4.prototype._fillDate = function _fillDate() { - var daysView = this.widget.find('.datepicker-days'), - daysViewHeader = daysView.find('th'), - html = []; - var currentDate = void 0, - row = void 0, - clsName = void 0, - i = void 0; - - if (!this._hasDate()) { - return; - } - - daysViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevMonth); - daysViewHeader.eq(1).attr('title', this._options.tooltips.selectMonth); - daysViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextMonth); - - daysView.find('.disabled').removeClass('disabled'); - daysViewHeader.eq(1).text(this._viewDate.format(this._options.dayViewHeaderFormat)); - - if (!this._isValid(this._viewDate.clone().subtract(1, 'M'), 'M')) { - daysViewHeader.eq(0).addClass('disabled'); - } - if (!this._isValid(this._viewDate.clone().add(1, 'M'), 'M')) { - daysViewHeader.eq(2).addClass('disabled'); - } - - currentDate = this._viewDate.clone().startOf('M').startOf('w').startOf('d'); - - for (i = 0; i < 42; i++) { - //always display 42 days (should show 6 weeks) - if (currentDate.weekday() === 0) { - row = $('
    ' + currentDate.week() + '' + currentDate.date() + '
    ' + currentHour.format(this.use24Hours ? 'HH' : 'hh') + '
    ' + currentMinute.format('mm') + '
    ' + currentSecond.format('ss') + '
    ').addClass('prev').attr('data-action', 'previous').append(this._iconTag(this._options.icons.previous))).append($('').addClass('picker-switch').attr('data-action', 'pickerSwitch').attr('colspan', "" + (this._options.calendarWeeks ? '6' : '5'))).append($('').addClass('next').attr('data-action', 'next').append(this._iconTag(this._options.icons.next)))), + contTemplate = $('
    ').attr('colspan', "" + (this._options.calendarWeeks ? '8' : '7')))); + return [$('
    ').addClass('datepicker-days').append($('').addClass('table table-sm').append(headTemplate).append($(''))), $('
    ').addClass('datepicker-months').append($('
    ').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone())), $('
    ').addClass('datepicker-years').append($('
    ').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone())), $('
    ').addClass('datepicker-decades').append($('
    ').addClass('table-condensed').append(headTemplate.clone()).append(contTemplate.clone()))]; + }; + + _proto2._getTimePickerMainTemplate = function _getTimePickerMainTemplate() { + var topRow = $(''), + middleRow = $(''), + bottomRow = $(''); + + if (this._isEnabled('h')) { + topRow.append($('
    ').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.incrementHour + }).addClass('btn').attr('data-action', 'incrementHours').append(this._iconTag(this._options.icons.up)))); + middleRow.append($('').append($('').addClass('timepicker-hour').attr({ + 'data-time-component': 'hours', + 'title': this._options.tooltips.pickHour + }).attr('data-action', 'showHours'))); + bottomRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.decrementHour + }).addClass('btn').attr('data-action', 'decrementHours').append(this._iconTag(this._options.icons.down)))); + } + + if (this._isEnabled('m')) { + if (this._isEnabled('h')) { + topRow.append($('').addClass('separator')); + middleRow.append($('').addClass('separator').html(':')); + bottomRow.append($('').addClass('separator')); + } + + topRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.incrementMinute + }).addClass('btn').attr('data-action', 'incrementMinutes').append(this._iconTag(this._options.icons.up)))); + middleRow.append($('').append($('').addClass('timepicker-minute').attr({ + 'data-time-component': 'minutes', + 'title': this._options.tooltips.pickMinute + }).attr('data-action', 'showMinutes'))); + bottomRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.decrementMinute + }).addClass('btn').attr('data-action', 'decrementMinutes').append(this._iconTag(this._options.icons.down)))); + } + + if (this._isEnabled('s')) { + if (this._isEnabled('m')) { + topRow.append($('').addClass('separator')); + middleRow.append($('').addClass('separator').html(':')); + bottomRow.append($('').addClass('separator')); + } + + topRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.incrementSecond + }).addClass('btn').attr('data-action', 'incrementSeconds').append(this._iconTag(this._options.icons.up)))); + middleRow.append($('').append($('').addClass('timepicker-second').attr({ + 'data-time-component': 'seconds', + 'title': this._options.tooltips.pickSecond + }).attr('data-action', 'showSeconds'))); + bottomRow.append($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'title': this._options.tooltips.decrementSecond + }).addClass('btn').attr('data-action', 'decrementSeconds').append(this._iconTag(this._options.icons.down)))); + } + + if (!this.use24Hours) { + topRow.append($('').addClass('separator')); + middleRow.append($('').append($('').addClass('separator')); + } + + return $('
    ').addClass('timepicker-picker').append($('').addClass('table-condensed').append([topRow, middleRow, bottomRow])); + }; + + _proto2._getTimePickerTemplate = function _getTimePickerTemplate() { + var hoursView = $('
    ').addClass('timepicker-hours').append($('
    ').addClass('table-condensed')), + minutesView = $('
    ').addClass('timepicker-minutes').append($('
    ').addClass('table-condensed')), + secondsView = $('
    ').addClass('timepicker-seconds').append($('
    ').addClass('table-condensed')), + ret = [this._getTimePickerMainTemplate()]; + + if (this._isEnabled('h')) { + ret.push(hoursView); + } + + if (this._isEnabled('m')) { + ret.push(minutesView); + } + + if (this._isEnabled('s')) { + ret.push(secondsView); + } + + return ret; + }; + + _proto2._getToolbar = function _getToolbar() { + var row = []; + + if (this._options.buttons.showToday) { + row.push($('
    ').append($('').attr({ + href: '#', + tabindex: '-1', + 'data-action': 'today', + 'title': this._options.tooltips.today + }).append(this._iconTag(this._options.icons.today)))); + } + + if (!this._options.sideBySide && this._options.collapse && this._hasDate() && this._hasTime()) { + var title, icon; + + if (this._options.viewMode === 'times') { + title = this._options.tooltips.selectDate; + icon = this._options.icons.date; + } else { + title = this._options.tooltips.selectTime; + icon = this._options.icons.time; + } + + row.push($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'data-action': 'togglePicker', + 'title': title + }).append(this._iconTag(icon)))); + } + + if (this._options.buttons.showClear) { + row.push($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'data-action': 'clear', + 'title': this._options.tooltips.clear + }).append(this._iconTag(this._options.icons.clear)))); + } + + if (this._options.buttons.showClose) { + row.push($('').append($('').attr({ + href: '#', + tabindex: '-1', + 'data-action': 'close', + 'title': this._options.tooltips.close + }).append(this._iconTag(this._options.icons.close)))); + } + + return row.length === 0 ? '' : $('').addClass('table-condensed').append($('').append($('').append(row))); + }; + + _proto2._getTemplate = function _getTemplate() { + var template = $('
    ').addClass(("bootstrap-datetimepicker-widget dropdown-menu " + (this._options.calendarWeeks ? 'tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks' : '') + " " + ((this._useFeatherIcons() ? 'tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons' : '') + " ")).trim()), + dateView = $('
    ').addClass('datepicker').append(this._getDatePickerTemplate()), + timeView = $('
    ').addClass('timepicker').append(this._getTimePickerTemplate()), + content = $('
      ').addClass('list-unstyled'), + toolbar = $('
    • ').addClass(("picker-switch" + (this._options.collapse ? ' accordion-toggle' : '') + " " + ("" + (this._useFeatherIcons() ? 'picker-switch-with-feathers-icons' : ''))).trim()).append(this._getToolbar()); + + if (this._options.inline) { + template.removeClass('dropdown-menu'); + } + + if (this.use24Hours) { + template.addClass('usetwentyfour'); + } + + if (this.input !== undefined && this.input.prop('readonly') || this._options.readonly) { + template.addClass('bootstrap-datetimepicker-widget-readonly'); + } + + if (this._isEnabled('s') && !this.use24Hours) { + template.addClass('wider'); + } + + if (this._options.sideBySide && this._hasDate() && this._hasTime()) { + template.addClass('timepicker-sbs'); + + if (this._options.toolbarPlacement === 'top') { + template.append(toolbar); + } + + template.append($('
      ').addClass('row').append(dateView.addClass('col-md-6')).append(timeView.addClass('col-md-6'))); + + if (this._options.toolbarPlacement === 'bottom' || this._options.toolbarPlacement === 'default') { + template.append(toolbar); + } + + return template; + } + + if (this._options.toolbarPlacement === 'top') { + content.append(toolbar); + } + + if (this._hasDate()) { + content.append($('
    • ').addClass(this._options.collapse && this._hasTime() ? 'collapse' : '').addClass(this._options.collapse && this._hasTime() && this._options.viewMode === 'times' ? '' : 'show').append(dateView)); + } + + if (this._options.toolbarPlacement === 'default') { + content.append(toolbar); + } + + if (this._hasTime()) { + content.append($('
    • ').addClass(this._options.collapse && this._hasDate() ? 'collapse' : '').addClass(this._options.collapse && this._hasDate() && this._options.viewMode === 'times' ? 'show' : '').append(timeView)); + } + + if (this._options.toolbarPlacement === 'bottom') { + content.append(toolbar); + } + + return template.append(content); + }; + + _proto2._place = function _place(e) { + var self = e && e.data && e.data.picker || this, + vertical = self._options.widgetPositioning.vertical, + horizontal = self._options.widgetPositioning.horizontal, + parent; + var position = (self.component && self.component.length ? self.component : self._element).position(), + offset = (self.component && self.component.length ? self.component : self._element).offset(); + + if (self._options.widgetParent) { + parent = self._options.widgetParent.append(self.widget); + } else if (self._element.is('input')) { + parent = self._element.after(self.widget).parent(); + } else if (self._options.inline) { + parent = self._element.append(self.widget); + return; + } else { + parent = self._element; + + self._element.children().first().after(self.widget); + } // Top and bottom logic + + + if (vertical === 'auto') { + //noinspection JSValidateTypes + if (offset.top + self.widget.height() * 1.5 >= $(window).height() + $(window).scrollTop() && self.widget.height() + self._element.outerHeight() < offset.top) { + vertical = 'top'; + } else { + vertical = 'bottom'; + } + } // Left and right logic + + + if (horizontal === 'auto') { + if (parent.width() < offset.left + self.widget.outerWidth() / 2 && offset.left + self.widget.outerWidth() > $(window).width()) { + horizontal = 'right'; + } else { + horizontal = 'left'; + } + } + + if (vertical === 'top') { + self.widget.addClass('top').removeClass('bottom'); + } else { + self.widget.addClass('bottom').removeClass('top'); + } + + if (horizontal === 'right') { + self.widget.addClass('float-right'); + } else { + self.widget.removeClass('float-right'); + } // find the first parent element that has a relative css positioning + + + if (parent.css('position') !== 'relative') { + parent = parent.parents().filter(function () { + return $(this).css('position') === 'relative'; + }).first(); + } + + if (parent.length === 0) { + throw new Error('datetimepicker component should be placed within a relative positioned container'); + } + + self.widget.css({ + top: vertical === 'top' ? 'auto' : position.top + self._element.outerHeight() + 'px', + bottom: vertical === 'top' ? parent.outerHeight() - (parent === self._element ? 0 : position.top) + 'px' : 'auto', + left: horizontal === 'left' ? (parent === self._element ? 0 : position.left) + 'px' : 'auto', + right: horizontal === 'left' ? 'auto' : parent.outerWidth() - self._element.outerWidth() - (parent === self._element ? 0 : position.left) + 'px' + }); + }; + + _proto2._fillDow = function _fillDow() { + var row = $('
    '), + currentDate = this._viewDate.clone().startOf('w').startOf('d'); + + if (this._options.calendarWeeks === true) { + row.append($(''); + + if (this._options.calendarWeeks) { + row.append(""); + } + + html.push(row); + } + + clsName = ''; + + if (currentDate.isBefore(this._viewDate, 'M')) { + clsName += ' old'; + } + + if (currentDate.isAfter(this._viewDate, 'M')) { + clsName += ' new'; + } + + if (this._options.allowMultidate) { + var index = this._datesFormatted.indexOf(currentDate.format('YYYY-MM-DD')); + + if (index !== -1) { + if (currentDate.isSame(this._datesFormatted[index], 'd') && !this.unset) { + clsName += ' active'; + } + } + } else { + if (currentDate.isSame(this._getLastPickedDate(), 'd') && !this.unset) { + clsName += ' active'; + } + } + + if (!this._isValid(currentDate, 'd')) { + clsName += ' disabled'; + } + + if (currentDate.isSame(this.getMoment(), 'd')) { + clsName += ' today'; + } + + if (currentDate.day() === 0 || currentDate.day() === 6) { + clsName += ' weekend'; + } + + row.append(""); + currentDate.add(1, 'd'); + } + + $('body').addClass('tempusdominus-bootstrap-datetimepicker-widget-day-click'); + $('body').append('
    '); + daysView.find('tbody').empty().append(html); + $('body').find('.tempusdominus-bootstrap-datetimepicker-widget-day-click-glass-panel').remove(); + $('body').removeClass('tempusdominus-bootstrap-datetimepicker-widget-day-click'); + + this._updateMonths(); + + this._updateYears(); + + this._updateDecades(); + }; + + _proto2._fillHours = function _fillHours() { + var table = this.widget.find('.timepicker-hours table'), + currentHour = this._viewDate.clone().startOf('d'), + html = []; + + var row = $(''); + + if (this._viewDate.hour() > 11 && !this.use24Hours) { + currentHour.hour(12); + } + + while (currentHour.isSame(this._viewDate, 'd') && (this.use24Hours || this._viewDate.hour() < 12 && currentHour.hour() < 12 || this._viewDate.hour() > 11)) { + if (currentHour.hour() % 4 === 0) { + row = $(''); + html.push(row); + } + + row.append(""); + currentHour.add(1, 'h'); + } + + table.empty().append(html); + }; + + _proto2._fillMinutes = function _fillMinutes() { + var table = this.widget.find('.timepicker-minutes table'), + currentMinute = this._viewDate.clone().startOf('h'), + html = [], + step = this._options.stepping === 1 ? 5 : this._options.stepping; + + var row = $(''); + + while (this._viewDate.isSame(currentMinute, 'h')) { + if (currentMinute.minute() % (step * 4) === 0) { + row = $(''); + html.push(row); + } + + row.append(""); + currentMinute.add(step, 'm'); + } + + table.empty().append(html); + }; + + _proto2._fillSeconds = function _fillSeconds() { + var table = this.widget.find('.timepicker-seconds table'), + currentSecond = this._viewDate.clone().startOf('m'), + html = []; + + var row = $(''); + + while (this._viewDate.isSame(currentSecond, 'm')) { + if (currentSecond.second() % 20 === 0) { + row = $(''); + html.push(row); + } + + row.append(""); + currentSecond.add(5, 's'); + } + + table.empty().append(html); + }; + + _proto2._fillTime = function _fillTime() { + var toggle, newDate; + + var timeComponents = this.widget.find('.timepicker span[data-time-component]'), + lastPickedDate = this._getLastPickedDate(); + + if (!this.use24Hours) { + toggle = this.widget.find('.timepicker [data-action=togglePeriod]'); + newDate = lastPickedDate ? lastPickedDate.clone().add(lastPickedDate.hours() >= 12 ? -12 : 12, 'h') : void 0; + lastPickedDate && toggle.text(lastPickedDate.format('A')); + + if (this._isValid(newDate, 'h')) { + toggle.removeClass('disabled'); + } else { + toggle.addClass('disabled'); + } + } + + lastPickedDate && timeComponents.filter('[data-time-component=hours]').text(lastPickedDate.format("" + (this.use24Hours ? 'HH' : 'hh'))); + lastPickedDate && timeComponents.filter('[data-time-component=minutes]').text(lastPickedDate.format('mm')); + lastPickedDate && timeComponents.filter('[data-time-component=seconds]').text(lastPickedDate.format('ss')); + + this._fillHours(); + + this._fillMinutes(); + + this._fillSeconds(); + }; + + _proto2._doAction = function _doAction(e, action) { + var lastPicked = this._getLastPickedDate(); + + if ($(e.currentTarget).is('.disabled')) { + return false; + } + + action = action || $(e.currentTarget).data('action'); + + switch (action) { + case 'next': + { + var navFnc = DateTimePicker.DatePickerModes[this.currentViewMode].NAV_FUNCTION; + + this._viewDate.add(DateTimePicker.DatePickerModes[this.currentViewMode].NAV_STEP, navFnc); + + this._fillDate(); + + this._viewUpdate(navFnc); + + break; + } + + case 'previous': + { + var _navFnc = DateTimePicker.DatePickerModes[this.currentViewMode].NAV_FUNCTION; + + this._viewDate.subtract(DateTimePicker.DatePickerModes[this.currentViewMode].NAV_STEP, _navFnc); + + this._fillDate(); + + this._viewUpdate(_navFnc); + + break; + } + + case 'pickerSwitch': + this._showMode(1); + + break; + + case 'selectMonth': + { + var month = $(e.target).closest('tbody').find('span').index($(e.target)); + + this._viewDate.month(month); + + if (this.currentViewMode === this.MinViewModeNumber) { + this._setValue(lastPicked.clone().year(this._viewDate.year()).month(this._viewDate.month()), this._getLastPickedDateIndex()); + + if (!this._options.inline) { + this.hide(); + } + } else { + this._showMode(-1); + + this._fillDate(); + } + + this._viewUpdate('M'); + + break; + } + + case 'selectYear': + { + var year = parseInt($(e.target).text(), 10) || 0; + + this._viewDate.year(year); + + if (this.currentViewMode === this.MinViewModeNumber) { + this._setValue(lastPicked.clone().year(this._viewDate.year()), this._getLastPickedDateIndex()); + + if (!this._options.inline) { + this.hide(); + } + } else { + this._showMode(-1); + + this._fillDate(); + } + + this._viewUpdate('YYYY'); + + break; + } + + case 'selectDecade': + { + var _year = parseInt($(e.target).data('selection'), 10) || 0; + + this._viewDate.year(_year); + + if (this.currentViewMode === this.MinViewModeNumber) { + this._setValue(lastPicked.clone().year(this._viewDate.year()), this._getLastPickedDateIndex()); + + if (!this._options.inline) { + this.hide(); + } + } else { + this._showMode(-1); + + this._fillDate(); + } + + this._viewUpdate('YYYY'); + + break; + } + + case 'selectDay': + { + var day = this._viewDate.clone(); + + if ($(e.target).is('.old')) { + day.subtract(1, 'M'); + } + + if ($(e.target).is('.new')) { + day.add(1, 'M'); + } + + var selectDate = day.date(parseInt($(e.target).text(), 10)), + index = 0; + + if (this._options.allowMultidate) { + index = this._datesFormatted.indexOf(selectDate.format('YYYY-MM-DD')); + + if (index !== -1) { + this._setValue(null, index); //deselect multidate + + } else { + this._setValue(selectDate, this._getLastPickedDateIndex() + 1); + } + } else { + this._setValue(selectDate, this._getLastPickedDateIndex()); + } + + if (!this._hasTime() && !this._options.keepOpen && !this._options.inline && !this._options.allowMultidate) { + this.hide(); + } + + break; + } + + case 'incrementHours': + { + if (!lastPicked) { + break; + } + + var newDate = lastPicked.clone().add(1, 'h'); + + if (this._isValid(newDate, 'h')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(newDate); + } + + this._setValue(newDate, this._getLastPickedDateIndex()); + } + + break; + } + + case 'incrementMinutes': + { + if (!lastPicked) { + break; + } + + var _newDate = lastPicked.clone().add(this._options.stepping, 'm'); + + if (this._isValid(_newDate, 'm')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate); + } + + this._setValue(_newDate, this._getLastPickedDateIndex()); + } + + break; + } + + case 'incrementSeconds': + { + if (!lastPicked) { + break; + } + + var _newDate2 = lastPicked.clone().add(1, 's'); + + if (this._isValid(_newDate2, 's')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate2); + } + + this._setValue(_newDate2, this._getLastPickedDateIndex()); + } + + break; + } + + case 'decrementHours': + { + if (!lastPicked) { + break; + } + + var _newDate3 = lastPicked.clone().subtract(1, 'h'); + + if (this._isValid(_newDate3, 'h')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate3); + } + + this._setValue(_newDate3, this._getLastPickedDateIndex()); + } + + break; + } + + case 'decrementMinutes': + { + if (!lastPicked) { + break; + } + + var _newDate4 = lastPicked.clone().subtract(this._options.stepping, 'm'); + + if (this._isValid(_newDate4, 'm')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate4); + } + + this._setValue(_newDate4, this._getLastPickedDateIndex()); + } + + break; + } + + case 'decrementSeconds': + { + if (!lastPicked) { + break; + } + + var _newDate5 = lastPicked.clone().subtract(1, 's'); + + if (this._isValid(_newDate5, 's')) { + if (this._getLastPickedDateIndex() < 0) { + this.date(_newDate5); + } + + this._setValue(_newDate5, this._getLastPickedDateIndex()); + } + + break; + } + + case 'togglePeriod': + { + this._setValue(lastPicked.clone().add(lastPicked.hours() >= 12 ? -12 : 12, 'h'), this._getLastPickedDateIndex()); + + break; + } + + case 'togglePicker': + { + var $this = $(e.target), + $link = $this.closest('a'), + $parent = $this.closest('ul'), + expanded = $parent.find('.show'), + closed = $parent.find('.collapse:not(.show)'), + $span = $this.is('span') ? $this : $this.find('span'); + var collapseData, inactiveIcon, iconTest; + + if (expanded && expanded.length) { + collapseData = expanded.data('collapse'); + + if (collapseData && collapseData.transitioning) { + return true; + } + + if (expanded.collapse) { + // if collapse plugin is available through bootstrap.js then use it + expanded.collapse('hide'); + closed.collapse('show'); + } else { + // otherwise just toggle in class on the two views + expanded.removeClass('show'); + closed.addClass('show'); + } + + if (this._useFeatherIcons()) { + $link.toggleClass(this._options.icons.time + ' ' + this._options.icons.date); + inactiveIcon = $link.hasClass(this._options.icons.time) ? this._options.icons.date : this._options.icons.time; + $link.html(this._iconTag(inactiveIcon)); + } else { + $span.toggleClass(this._options.icons.time + ' ' + this._options.icons.date); + } + + if (this._useFeatherIcons()) { + iconTest = $link.hasClass(this._options.icons.date); + } else { + iconTest = $span.hasClass(this._options.icons.date); + } + + if (iconTest) { + $link.attr('title', this._options.tooltips.selectDate); + } else { + $link.attr('title', this._options.tooltips.selectTime); + } + } + } + break; + + case 'showPicker': + this.widget.find('.timepicker > div:not(.timepicker-picker)').hide(); + this.widget.find('.timepicker .timepicker-picker').show(); + break; + + case 'showHours': + this.widget.find('.timepicker .timepicker-picker').hide(); + this.widget.find('.timepicker .timepicker-hours').show(); + break; + + case 'showMinutes': + this.widget.find('.timepicker .timepicker-picker').hide(); + this.widget.find('.timepicker .timepicker-minutes').show(); + break; + + case 'showSeconds': + this.widget.find('.timepicker .timepicker-picker').hide(); + this.widget.find('.timepicker .timepicker-seconds').show(); + break; + + case 'selectHour': + { + var hour = parseInt($(e.target).text(), 10); + + if (!this.use24Hours) { + if (lastPicked.hours() >= 12) { + if (hour !== 12) { + hour += 12; + } + } else { + if (hour === 12) { + hour = 0; + } + } + } + + this._setValue(lastPicked.clone().hours(hour), this._getLastPickedDateIndex()); + + if (!this._isEnabled('a') && !this._isEnabled('m') && !this._options.keepOpen && !this._options.inline) { + this.hide(); + } else { + this._doAction(e, 'showPicker'); + } + + break; + } + + case 'selectMinute': + this._setValue(lastPicked.clone().minutes(parseInt($(e.target).text(), 10)), this._getLastPickedDateIndex()); + + if (!this._isEnabled('a') && !this._isEnabled('s') && !this._options.keepOpen && !this._options.inline) { + this.hide(); + } else { + this._doAction(e, 'showPicker'); + } + + break; + + case 'selectSecond': + this._setValue(lastPicked.clone().seconds(parseInt($(e.target).text(), 10)), this._getLastPickedDateIndex()); + + if (!this._isEnabled('a') && !this._options.keepOpen && !this._options.inline) { + this.hide(); + } else { + this._doAction(e, 'showPicker'); + } + + break; + + case 'clear': + this.clear(); + break; + + case 'close': + this.hide(); + break; + + case 'today': + { + var todaysDate = this.getMoment(); + + if (this._isValid(todaysDate, 'd')) { + this._setValue(todaysDate, this._getLastPickedDateIndex()); + } + + break; + } + } + + return false; + } //public + ; + + _proto2.hide = function hide() { + var transitioning = false; + + if (!this.widget) { + return; + } // Ignore event if in the middle of a picker transition + + + this.widget.find('.collapse').each(function () { + var collapseData = $(this).data('collapse'); + + if (collapseData && collapseData.transitioning) { + transitioning = true; + return false; + } + + return true; + }); + + if (transitioning) { + return; + } + + if (this.component && this.component.hasClass('btn')) { + this.component.toggleClass('active'); + } + + this.widget.hide(); + $(window).off('resize', this._place); + this.widget.off('click', '[data-action]'); + this.widget.off('mousedown', false); + this.widget.remove(); + this.widget = false; + + if (this.input !== undefined && this.input.val() !== undefined && this.input.val().trim().length !== 0) { + this._setValue(this._parseInputDate(this.input.val().trim(), { + isPickerShow: false + }), 0); + } + + var lastPickedDate = this._getLastPickedDate(); + + this._notifyEvent({ + type: DateTimePicker.Event.HIDE, + date: this.unset ? null : lastPickedDate ? lastPickedDate.clone() : void 0 + }); + + if (this.input !== undefined) { + this.input.blur(); + } + + this._viewDate = lastPickedDate ? lastPickedDate.clone() : this.getMoment(); + }; + + _proto2.show = function show() { + var currentMoment, + shouldUseCurrentIfUnset = false; + var useCurrentGranularity = { + 'year': function year(m) { + return m.month(0).date(1).hours(0).seconds(0).minutes(0); + }, + 'month': function month(m) { + return m.date(1).hours(0).seconds(0).minutes(0); + }, + 'day': function day(m) { + return m.hours(0).seconds(0).minutes(0); + }, + 'hour': function hour(m) { + return m.seconds(0).minutes(0); + }, + 'minute': function minute(m) { + return m.seconds(0); + } + }; + + if (this.input !== undefined) { + if (this.input.prop('disabled') || !this._options.ignoreReadonly && this.input.prop('readonly') || this.widget) { + return; + } + + if (this.input.val() !== undefined && this.input.val().trim().length !== 0) { + this._setValue(this._parseInputDate(this.input.val().trim(), { + isPickerShow: true + }), 0); + } else { + shouldUseCurrentIfUnset = true; + } + } else { + shouldUseCurrentIfUnset = true; + } + + if (shouldUseCurrentIfUnset && this.unset && this._options.useCurrent) { + currentMoment = this.getMoment(); + + if (typeof this._options.useCurrent === 'string') { + currentMoment = useCurrentGranularity[this._options.useCurrent](currentMoment); + } + + this._setValue(currentMoment, 0); + } + + this.widget = this._getTemplate(); + + this._fillDow(); + + this._fillMonths(); + + this.widget.find('.timepicker-hours').hide(); + this.widget.find('.timepicker-minutes').hide(); + this.widget.find('.timepicker-seconds').hide(); + + this._update(); + + this._showMode(); + + $(window).on('resize', { + picker: this + }, this._place); + this.widget.on('click', '[data-action]', $.proxy(this._doAction, this)); // this handles clicks on the widget + + this.widget.on('mousedown', false); + + if (this.component && this.component.hasClass('btn')) { + this.component.toggleClass('active'); + } + + this._place(); + + this.widget.show(); + + if (this.input !== undefined && this._options.focusOnShow && !this.input.is(':focus')) { + this.input.focus(); + } + + this._notifyEvent({ + type: DateTimePicker.Event.SHOW + }); + }; + + _proto2.destroy = function destroy() { + this.hide(); //todo doc off? + + this._element.removeData(DateTimePicker.DATA_KEY); + + this._element.removeData('date'); + }; + + _proto2.disable = function disable() { + this.hide(); + + if (this.component && this.component.hasClass('btn')) { + this.component.addClass('disabled'); + } + + if (this.input !== undefined) { + this.input.prop('disabled', true); //todo disable this/comp if input is null + } + }; + + _proto2.enable = function enable() { + if (this.component && this.component.hasClass('btn')) { + this.component.removeClass('disabled'); + } + + if (this.input !== undefined) { + this.input.prop('disabled', false); //todo enable comp/this if input is null + } + }; + + _proto2.toolbarPlacement = function toolbarPlacement(_toolbarPlacement) { + if (arguments.length === 0) { + return this._options.toolbarPlacement; + } + + if (typeof _toolbarPlacement !== 'string') { + throw new TypeError('toolbarPlacement() expects a string parameter'); + } + + if (toolbarPlacements.indexOf(_toolbarPlacement) === -1) { + throw new TypeError("toolbarPlacement() parameter must be one of (" + toolbarPlacements.join(', ') + ") value"); + } + + this._options.toolbarPlacement = _toolbarPlacement; + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto2.widgetPositioning = function widgetPositioning(_widgetPositioning) { + if (arguments.length === 0) { + return $.extend({}, this._options.widgetPositioning); + } + + if ({}.toString.call(_widgetPositioning) !== '[object Object]') { + throw new TypeError('widgetPositioning() expects an object variable'); + } + + if (_widgetPositioning.horizontal) { + if (typeof _widgetPositioning.horizontal !== 'string') { + throw new TypeError('widgetPositioning() horizontal variable must be a string'); + } + + _widgetPositioning.horizontal = _widgetPositioning.horizontal.toLowerCase(); + + if (horizontalModes.indexOf(_widgetPositioning.horizontal) === -1) { + throw new TypeError("widgetPositioning() expects horizontal parameter to be one of (" + horizontalModes.join(', ') + ")"); + } + + this._options.widgetPositioning.horizontal = _widgetPositioning.horizontal; + } + + if (_widgetPositioning.vertical) { + if (typeof _widgetPositioning.vertical !== 'string') { + throw new TypeError('widgetPositioning() vertical variable must be a string'); + } + + _widgetPositioning.vertical = _widgetPositioning.vertical.toLowerCase(); + + if (verticalModes.indexOf(_widgetPositioning.vertical) === -1) { + throw new TypeError("widgetPositioning() expects vertical parameter to be one of (" + verticalModes.join(', ') + ")"); + } + + this._options.widgetPositioning.vertical = _widgetPositioning.vertical; + } + + this._update(); + }; + + _proto2.widgetParent = function widgetParent(_widgetParent) { + if (arguments.length === 0) { + return this._options.widgetParent; + } + + if (typeof _widgetParent === 'string') { + _widgetParent = $(_widgetParent); + } + + if (_widgetParent !== null && typeof _widgetParent !== 'string' && !(_widgetParent instanceof $)) { + throw new TypeError('widgetParent() expects a string or a jQuery object parameter'); + } + + this._options.widgetParent = _widgetParent; + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + _proto2.setMultiDate = function setMultiDate(multiDateArray) { + var dateFormat = this._options.format; + this.clear(); + + for (var index = 0; index < multiDateArray.length; index++) { + var date = moment(multiDateArray[index], dateFormat); + + this._setValue(date, index); + } + } //static + ; + + TempusDominusBootstrap4._jQueryHandleThis = function _jQueryHandleThis(me, option, argument) { + var data = $(me).data(DateTimePicker.DATA_KEY); + + if (typeof option === 'object') { + $.extend({}, DateTimePicker.Default, option); + } + + if (!data) { + data = new TempusDominusBootstrap4($(me), option); + $(me).data(DateTimePicker.DATA_KEY, data); + } + + if (typeof option === 'string') { + if (data[option] === undefined) { + throw new Error("No method named \"" + option + "\""); + } + + if (argument === undefined) { + return data[option](); + } else { + if (option === 'date') { + data.isDateUpdateThroughDateOptionFromClientCode = true; + } + + var ret = data[option](argument); + data.isDateUpdateThroughDateOptionFromClientCode = false; + return ret; + } + } + }; + + TempusDominusBootstrap4._jQueryInterface = function _jQueryInterface(option, argument) { + if (this.length === 1) { + return TempusDominusBootstrap4._jQueryHandleThis(this[0], option, argument); + } + + return this.each(function () { + TempusDominusBootstrap4._jQueryHandleThis(this, option, argument); + }); + }; + + return TempusDominusBootstrap4; + }(DateTimePicker); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $(document).on(DateTimePicker.Event.CLICK_DATA_API, DateTimePicker.Selector.DATA_TOGGLE, function () { + var $originalTarget = $(this), + $target = getSelectorFromElement($originalTarget), + config = $target.data(DateTimePicker.DATA_KEY); + + if ($target.length === 0) { + return; + } + + if (config._options.allowInputToggle && $originalTarget.is('input[data-toggle="datetimepicker"]')) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, 'toggle'); + }).on(DateTimePicker.Event.CHANGE, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)); + + if ($target.length === 0 || event.isInit) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, '_change', event); + }).on(DateTimePicker.Event.BLUR, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)), + config = $target.data(DateTimePicker.DATA_KEY); + + if ($target.length === 0) { + return; + } + + if (config._options.debug || window.debug) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, 'hide', event); + }).on(DateTimePicker.Event.KEYDOWN, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)); + + if ($target.length === 0) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, '_keydown', event); + }).on(DateTimePicker.Event.KEYUP, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)); + + if ($target.length === 0) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, '_keyup', event); + }).on(DateTimePicker.Event.FOCUS, "." + DateTimePicker.ClassName.INPUT, function (event) { + var $target = getSelectorFromElement($(this)), + config = $target.data(DateTimePicker.DATA_KEY); + + if ($target.length === 0) { + return; + } + + if (!config._options.allowInputToggle) { + return; + } + + TempusDominusBootstrap4._jQueryInterface.call($target, 'show', event); + }); + $.fn[DateTimePicker.NAME] = TempusDominusBootstrap4._jQueryInterface; + $.fn[DateTimePicker.NAME].Constructor = TempusDominusBootstrap4; + + $.fn[DateTimePicker.NAME].noConflict = function () { + $.fn[DateTimePicker.NAME] = JQUERY_NO_CONFLICT; + return TempusDominusBootstrap4._jQueryInterface; + }; + + return TempusDominusBootstrap4; }(jQuery); }(); diff --git a/static/babybuddy/js/vendor.js.gz b/static/babybuddy/js/vendor.js.gz index 17d9a57c..dc750387 100644 Binary files a/static/babybuddy/js/vendor.js.gz and b/static/babybuddy/js/vendor.js.gz differ diff --git a/static/staticfiles.json b/static/staticfiles.json index 4569c25c..9cba59b6 100644 --- a/static/staticfiles.json +++ b/static/staticfiles.json @@ -1 +1 @@ -{"paths": {"admin/js/vendor/select2/i18n/pt.js": "admin/js/vendor/select2/i18n/pt.33b4a3b44d43.js", "admin/js/vendor/select2/i18n/hsb.js": "admin/js/vendor/select2/i18n/hsb.fa3b55265efe.js", "admin/js/vendor/select2/i18n/vi.js": "admin/js/vendor/select2/i18n/vi.097a5b75b3e1.js", "admin/js/vendor/select2/i18n/lv.js": "admin/js/vendor/select2/i18n/lv.08e62128eac1.js", "admin/js/vendor/select2/i18n/gl.js": "admin/js/vendor/select2/i18n/gl.d99b1fedaa86.js", "admin/js/vendor/select2/i18n/pl.js": "admin/js/vendor/select2/i18n/pl.6031b4f16452.js", "admin/js/vendor/select2/i18n/el.js": "admin/js/vendor/select2/i18n/el.27097f071856.js", "admin/js/vendor/select2/i18n/dsb.js": "admin/js/vendor/select2/i18n/dsb.56372c92d2f1.js", "admin/js/vendor/select2/i18n/et.js": "admin/js/vendor/select2/i18n/et.2b96fd98289d.js", "admin/js/vendor/select2/i18n/is.js": "admin/js/vendor/select2/i18n/is.3ddd9a6a97e9.js", "admin/js/vendor/select2/i18n/sl.js": "admin/js/vendor/select2/i18n/sl.131a78bc0752.js", "admin/js/vendor/select2/i18n/ko.js": "admin/js/vendor/select2/i18n/ko.e7be6c20e673.js", "admin/js/vendor/select2/i18n/hr.js": "admin/js/vendor/select2/i18n/hr.a2b092cc1147.js", "admin/js/vendor/select2/i18n/ms.js": "admin/js/vendor/select2/i18n/ms.4ba82c9a51ce.js", "admin/js/vendor/select2/i18n/fi.js": "admin/js/vendor/select2/i18n/fi.614ec42aa9ba.js", "admin/js/vendor/select2/i18n/th.js": "admin/js/vendor/select2/i18n/th.f38c20b0221b.js", "admin/js/vendor/select2/i18n/ru.js": "admin/js/vendor/select2/i18n/ru.934aa95f5b5f.js", "admin/js/vendor/select2/i18n/eu.js": "admin/js/vendor/select2/i18n/eu.adfe5c97b72c.js", "admin/js/vendor/select2/i18n/mk.js": "admin/js/vendor/select2/i18n/mk.dabbb9087130.js", "admin/js/vendor/select2/i18n/sq.js": "admin/js/vendor/select2/i18n/sq.5636b60d29c9.js", "admin/js/vendor/select2/i18n/ja.js": "admin/js/vendor/select2/i18n/ja.170ae885d74f.js", "admin/js/vendor/select2/i18n/ka.js": "admin/js/vendor/select2/i18n/ka.2083264a54f0.js", "admin/js/vendor/select2/i18n/he.js": "admin/js/vendor/select2/i18n/he.e420ff6cd3ed.js", "admin/js/vendor/select2/i18n/bg.js": "admin/js/vendor/select2/i18n/bg.39b8be30d4f0.js", "admin/js/vendor/select2/i18n/hy.js": "admin/js/vendor/select2/i18n/hy.c7babaeef5a6.js", "admin/js/vendor/select2/i18n/sr-Cyrl.js": "admin/js/vendor/select2/i18n/sr-Cyrl.f254bb8c4c7c.js", "admin/js/vendor/select2/i18n/ne.js": "admin/js/vendor/select2/i18n/ne.3d79fd3f08db.js", "admin/js/vendor/select2/i18n/af.js": "admin/js/vendor/select2/i18n/af.4f6fcd73488c.js", "admin/js/vendor/select2/i18n/id.js": "admin/js/vendor/select2/i18n/id.04debded514d.js", "admin/js/vendor/select2/i18n/az.js": "admin/js/vendor/select2/i18n/az.270c257daf81.js", "admin/js/vendor/select2/i18n/ca.js": "admin/js/vendor/select2/i18n/ca.a166b745933a.js", "admin/js/vendor/select2/i18n/nb.js": "admin/js/vendor/select2/i18n/nb.da2fce143f27.js", "admin/js/vendor/select2/i18n/zh-CN.js": "admin/js/vendor/select2/i18n/zh-CN.2cff662ec5f9.js", "admin/js/vendor/select2/i18n/zh-TW.js": "admin/js/vendor/select2/i18n/zh-TW.04554a227c2b.js", "admin/js/vendor/select2/i18n/pt-BR.js": "admin/js/vendor/select2/i18n/pt-BR.e1b294433e7f.js", "admin/js/vendor/select2/i18n/da.js": "admin/js/vendor/select2/i18n/da.766346afe4dd.js", "admin/js/vendor/select2/i18n/fa.js": "admin/js/vendor/select2/i18n/fa.3b5bd1961cfd.js", "admin/js/vendor/select2/i18n/de.js": "admin/js/vendor/select2/i18n/de.8a1c222b0204.js", "admin/js/vendor/select2/i18n/en.js": "admin/js/vendor/select2/i18n/en.cf932ba09a98.js", "admin/js/vendor/select2/i18n/bs.js": "admin/js/vendor/select2/i18n/bs.91624382358e.js", "admin/js/vendor/select2/i18n/tk.js": "admin/js/vendor/select2/i18n/tk.7c572a68c78f.js", "admin/js/vendor/select2/i18n/sv.js": "admin/js/vendor/select2/i18n/sv.7a9c2f71e777.js", "admin/js/vendor/select2/i18n/hi.js": "admin/js/vendor/select2/i18n/hi.70640d41628f.js", "admin/js/vendor/select2/i18n/uk.js": "admin/js/vendor/select2/i18n/uk.8cede7f4803c.js", "admin/js/vendor/select2/i18n/cs.js": "admin/js/vendor/select2/i18n/cs.4f43e8e7d33a.js", "admin/js/vendor/select2/i18n/km.js": "admin/js/vendor/select2/i18n/km.c23089cb06ca.js", "admin/js/vendor/select2/i18n/fr.js": "admin/js/vendor/select2/i18n/fr.05e0542fcfe6.js", "admin/js/vendor/select2/i18n/nl.js": "admin/js/vendor/select2/i18n/nl.997868a37ed8.js", "admin/js/vendor/select2/i18n/sr.js": "admin/js/vendor/select2/i18n/sr.5ed85a48f483.js", "admin/js/vendor/select2/i18n/hu.js": "admin/js/vendor/select2/i18n/hu.6ec6039cb8a3.js", "admin/js/vendor/select2/i18n/lt.js": "admin/js/vendor/select2/i18n/lt.23c7ce903300.js", "admin/js/vendor/select2/i18n/ar.js": "admin/js/vendor/select2/i18n/ar.65aa8e36bf5d.js", "admin/js/vendor/select2/i18n/sk.js": "admin/js/vendor/select2/i18n/sk.33d02cef8d11.js", "admin/js/vendor/select2/i18n/it.js": "admin/js/vendor/select2/i18n/it.be4fe8d365b5.js", "admin/js/vendor/select2/i18n/es.js": "admin/js/vendor/select2/i18n/es.66dbc2652fb1.js", "admin/js/vendor/select2/i18n/bn.js": "admin/js/vendor/select2/i18n/bn.6d42b4dd5665.js", "admin/js/vendor/select2/i18n/ro.js": "admin/js/vendor/select2/i18n/ro.f75cb460ec3b.js", "admin/js/vendor/select2/i18n/ps.js": "admin/js/vendor/select2/i18n/ps.38dfa47af9e0.js", "admin/js/vendor/select2/i18n/tr.js": "admin/js/vendor/select2/i18n/tr.b5a0643d1545.js", "admin/css/vendor/select2/select2.min.css": "admin/css/vendor/select2/select2.min.9f54e6414f87.css", "admin/css/vendor/select2/LICENSE-SELECT2.md": "admin/css/vendor/select2/LICENSE-SELECT2.f94142512c91.md", "admin/css/vendor/select2/select2.css": "admin/css/vendor/select2/select2.a2194c262648.css", "admin/js/vendor/jquery/jquery.min.js": "admin/js/vendor/jquery/jquery.min.8fb8fee4fcc3.js", "admin/js/vendor/jquery/LICENSE.txt": "admin/js/vendor/jquery/LICENSE.de877aa6d744.txt", "admin/js/vendor/jquery/jquery.js": "admin/js/vendor/jquery/jquery.2849239b95f5.js", "admin/js/vendor/xregexp/xregexp.min.js": "admin/js/vendor/xregexp/xregexp.min.b0439563a5d3.js", "admin/js/vendor/xregexp/xregexp.js": "admin/js/vendor/xregexp/xregexp.efda034b9537.js", "admin/js/vendor/xregexp/LICENSE.txt": "admin/js/vendor/xregexp/LICENSE.bf79e414957a.txt", "admin/js/vendor/select2/LICENSE.md": "admin/js/vendor/select2/LICENSE.f94142512c91.md", "admin/js/vendor/select2/select2.full.min.js": "admin/js/vendor/select2/select2.full.min.fcd7500d8e13.js", "admin/js/vendor/select2/select2.full.js": "admin/js/vendor/select2/select2.full.c2afdeda3058.js", "babybuddy/img/core/child-placeholder.png": "babybuddy/img/core/child-placeholder.7c0a81f0d7f0.png", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/js/api.js": "rest_framework/docs/js/api.c9743eab7a4f.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "admin/js/admin/RelatedObjectLookups.js": "admin/js/admin/RelatedObjectLookups.b4d76b6aaf0b.js", "admin/js/admin/DateTimeShortcuts.js": "admin/js/admin/DateTimeShortcuts.5548f99471bf.js", "admin/img/gis/move_vertex_on.svg": "admin/img/gis/move_vertex_on.0047eba25b67.svg", "admin/img/gis/move_vertex_off.svg": "admin/img/gis/move_vertex_off.7a23bf31ef8a.svg", "babybuddy/css/app.css": "babybuddy/css/app.1b0342ed7402.css", "babybuddy/js/graph.js": "babybuddy/js/graph.dd89fe4e217b.js", "babybuddy/js/vendor.js": "babybuddy/js/vendor.b28919e31f4a.js", "babybuddy/js/tags_editor.js": "babybuddy/js/tags_editor.6fc8d69c680c.js", "babybuddy/js/app.js": "babybuddy/js/app.e8f1f5e0f058.js", "babybuddy/logo/icon.png": "babybuddy/logo/icon.df80640f0465.png", "babybuddy/logo/icon-brand.png": "babybuddy/logo/icon-brand.32cbedf6aee3.png", "babybuddy/logo/logo-sad.png": "babybuddy/logo/logo-sad.47c3d5c2d397.png", "babybuddy/logo/logo.png": "babybuddy/logo/logo.62870041cc83.png", "babybuddy/root/safari-pinned-tab.svg": "babybuddy/root/safari-pinned-tab.e8c8ac2f55f5.svg", "babybuddy/root/favicon.ico": "babybuddy/root/favicon.ee5ebcd40fb9.ico", "babybuddy/root/android-chrome-192x192.png": "babybuddy/root/android-chrome-192x192.ac7d2baba4df.png", "babybuddy/root/apple-touch-icon.png": "babybuddy/root/apple-touch-icon.bdc75cec89fa.png", "babybuddy/root/android-chrome-512x512.png": "babybuddy/root/android-chrome-512x512.e1fd38ad828c.png", "babybuddy/root/site.webmanifest": "babybuddy/root/site.c6c4158e40df.webmanifest", "babybuddy/root/mstile-150x150.png": "babybuddy/root/mstile-150x150.08524a406cf2.png", "babybuddy/root/browserconfig.xml": "babybuddy/root/browserconfig.84708aade0e5.xml", "babybuddy/root/apple-touch-startup-image.png": "babybuddy/root/apple-touch-startup-image.749726217484.png", "babybuddy/root/favicon.svg": "babybuddy/root/favicon.12fe726d0bac.svg", "babybuddy/font/babybuddy.svg": "babybuddy/font/babybuddy.ef799e0dd5c7.svg", "babybuddy/font/babybuddy.woff": "babybuddy/font/babybuddy.f20b4bab8535.woff", "babybuddy/font/babybuddy.woff2": "babybuddy/font/babybuddy.2877f94e49cb.woff2", "babybuddy/font/babybuddy.ttf": "babybuddy/font/babybuddy.c4bba6d8de47.ttf", "babybuddy/font/babybuddy.eot": "babybuddy/font/babybuddy.f4f897c49f7f.eot", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.77017a69879a.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.46ed116b0edd.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.66b84a04375e.css", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.0ea6e6052ab5.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.969930007329.js", "rest_framework/js/jquery-3.5.1.min.js": "rest_framework/js/jquery-3.5.1.min.dc5e7f18c8d3.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.e580e3854595.js", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "admin/css/widgets.css": "admin/css/widgets.694d845b2cb1.css", "admin/css/login.css": "admin/css/login.8b76a9f7cbf6.css", "admin/css/dashboard.css": "admin/css/dashboard.be83f13e4369.css", "admin/css/nav_sidebar.css": "admin/css/nav_sidebar.e32d345464bd.css", "admin/css/responsive.css": "admin/css/responsive.b9e1565b3609.css", "admin/css/autocomplete.css": "admin/css/autocomplete.4a81fc4242d0.css", "admin/css/responsive_rtl.css": "admin/css/responsive_rtl.e13ae754cceb.css", "admin/css/forms.css": "admin/css/forms.332ab41432e2.css", "admin/css/fonts.css": "admin/css/fonts.168bab448fee.css", "admin/css/rtl.css": "admin/css/rtl.4bc23eb90919.css", "admin/css/base.css": "admin/css/base.1f418065fc2c.css", "admin/css/changelists.css": "admin/css/changelists.cd4dd90ae1a1.css", "admin/js/urlify.js": "admin/js/urlify.25cc3eac8123.js", "admin/js/core.js": "admin/js/core.5d6b384a08b5.js", "admin/js/collapse.js": "admin/js/collapse.f84e7410290f.js", "admin/js/actions.js": "admin/js/actions.eac7e3441574.js", "admin/js/prepopulate.js": "admin/js/prepopulate.bd2361dfd64d.js", "admin/js/cancel.js": "admin/js/cancel.ecc4c5ca7b32.js", "admin/js/nav_sidebar.js": "admin/js/nav_sidebar.3535caba9444.js", "admin/js/autocomplete.js": "admin/js/autocomplete.c508b167ab61.js", "admin/js/inlines.js": "admin/js/inlines.fb1617228dbe.js", "admin/js/change_form.js": "admin/js/change_form.9d8ca4f96b75.js", "admin/js/SelectFilter2.js": "admin/js/SelectFilter2.d250dcb52a9a.js", "admin/js/jquery.init.js": "admin/js/jquery.init.b7781a0897fc.js", "admin/js/popup_response.js": "admin/js/popup_response.c6cc78ea5551.js", "admin/js/SelectBox.js": "admin/js/SelectBox.8161741c7647.js", "admin/js/calendar.js": "admin/js/calendar.f8a5d055eb33.js", "admin/js/prepopulate_init.js": "admin/js/prepopulate_init.e056047b7a7e.js", "admin/img/search.svg": "admin/img/search.7cf54ff789c6.svg", "admin/img/icon-calendar.svg": "admin/img/icon-calendar.ac7aea671bea.svg", "admin/img/icon-clock.svg": "admin/img/icon-clock.e1d4dfac3f2b.svg", "admin/img/icon-no.svg": "admin/img/icon-no.439e821418cd.svg", "admin/img/tooltag-add.svg": "admin/img/tooltag-add.e59d620a9742.svg", "admin/img/inline-delete.svg": "admin/img/inline-delete.fec1b761f254.svg", "admin/img/LICENSE": "admin/img/LICENSE.2c54f4e1ca1c", "admin/img/icon-changelink.svg": "admin/img/icon-changelink.18d2fd706348.svg", "admin/img/icon-unknown.svg": "admin/img/icon-unknown.a18cb4398978.svg", "admin/img/sorting-icons.svg": "admin/img/sorting-icons.3a097b59f104.svg", "admin/img/icon-viewlink.svg": "admin/img/icon-viewlink.41eb31f7826e.svg", "admin/img/icon-yes.svg": "admin/img/icon-yes.d2f9f035226a.svg", "admin/img/icon-addlink.svg": "admin/img/icon-addlink.d519b3bab011.svg", "admin/img/icon-unknown-alt.svg": "admin/img/icon-unknown-alt.81536e128bb6.svg", "admin/img/icon-deletelink.svg": "admin/img/icon-deletelink.564ef9dc3854.svg", "admin/img/README.txt": "admin/img/README.a70711a38d87.txt", "admin/img/selector-icons.svg": "admin/img/selector-icons.b4555096cea2.svg", "admin/img/calendar-icons.svg": "admin/img/calendar-icons.39b290681a8b.svg", "admin/img/tooltag-arrowright.svg": "admin/img/tooltag-arrowright.bbfb788a849e.svg", "admin/img/icon-alert.svg": "admin/img/icon-alert.034cc7d8a67f.svg", "admin/fonts/Roboto-Light-webfont.woff": "admin/fonts/Roboto-Light-webfont.c73eb1ceba33.woff", "admin/fonts/Roboto-Bold-webfont.woff": "admin/fonts/Roboto-Bold-webfont.50d75e48e0a3.woff", "admin/fonts/Roboto-Regular-webfont.woff": "admin/fonts/Roboto-Regular-webfont.35b07eb2f871.woff", "admin/fonts/README.txt": "admin/fonts/README.ab99e6b541ea.txt", "admin/fonts/LICENSE.txt": "admin/fonts/LICENSE.d273d63619c9.txt", "import_export/import.css": "import_export/import.358144dd8713.css", "import_export/action_formats.js": "import_export/action_formats.11c3e817b80a.js"}, "version": "1.0"} \ No newline at end of file +{"paths": {"admin/js/vendor/select2/i18n/pt.js": "admin/js/vendor/select2/i18n/pt.33b4a3b44d43.js", "admin/js/vendor/select2/i18n/hsb.js": "admin/js/vendor/select2/i18n/hsb.fa3b55265efe.js", "admin/js/vendor/select2/i18n/vi.js": "admin/js/vendor/select2/i18n/vi.097a5b75b3e1.js", "admin/js/vendor/select2/i18n/lv.js": "admin/js/vendor/select2/i18n/lv.08e62128eac1.js", "admin/js/vendor/select2/i18n/gl.js": "admin/js/vendor/select2/i18n/gl.d99b1fedaa86.js", "admin/js/vendor/select2/i18n/pl.js": "admin/js/vendor/select2/i18n/pl.6031b4f16452.js", "admin/js/vendor/select2/i18n/el.js": "admin/js/vendor/select2/i18n/el.27097f071856.js", "admin/js/vendor/select2/i18n/dsb.js": "admin/js/vendor/select2/i18n/dsb.56372c92d2f1.js", "admin/js/vendor/select2/i18n/et.js": "admin/js/vendor/select2/i18n/et.2b96fd98289d.js", "admin/js/vendor/select2/i18n/is.js": "admin/js/vendor/select2/i18n/is.3ddd9a6a97e9.js", "admin/js/vendor/select2/i18n/sl.js": "admin/js/vendor/select2/i18n/sl.131a78bc0752.js", "admin/js/vendor/select2/i18n/ko.js": "admin/js/vendor/select2/i18n/ko.e7be6c20e673.js", "admin/js/vendor/select2/i18n/hr.js": "admin/js/vendor/select2/i18n/hr.a2b092cc1147.js", "admin/js/vendor/select2/i18n/ms.js": "admin/js/vendor/select2/i18n/ms.4ba82c9a51ce.js", "admin/js/vendor/select2/i18n/fi.js": "admin/js/vendor/select2/i18n/fi.614ec42aa9ba.js", "admin/js/vendor/select2/i18n/th.js": "admin/js/vendor/select2/i18n/th.f38c20b0221b.js", "admin/js/vendor/select2/i18n/ru.js": "admin/js/vendor/select2/i18n/ru.934aa95f5b5f.js", "admin/js/vendor/select2/i18n/eu.js": "admin/js/vendor/select2/i18n/eu.adfe5c97b72c.js", "admin/js/vendor/select2/i18n/mk.js": "admin/js/vendor/select2/i18n/mk.dabbb9087130.js", "admin/js/vendor/select2/i18n/sq.js": "admin/js/vendor/select2/i18n/sq.5636b60d29c9.js", "admin/js/vendor/select2/i18n/ja.js": "admin/js/vendor/select2/i18n/ja.170ae885d74f.js", "admin/js/vendor/select2/i18n/ka.js": "admin/js/vendor/select2/i18n/ka.2083264a54f0.js", "admin/js/vendor/select2/i18n/he.js": "admin/js/vendor/select2/i18n/he.e420ff6cd3ed.js", "admin/js/vendor/select2/i18n/bg.js": "admin/js/vendor/select2/i18n/bg.39b8be30d4f0.js", "admin/js/vendor/select2/i18n/hy.js": "admin/js/vendor/select2/i18n/hy.c7babaeef5a6.js", "admin/js/vendor/select2/i18n/sr-Cyrl.js": "admin/js/vendor/select2/i18n/sr-Cyrl.f254bb8c4c7c.js", "admin/js/vendor/select2/i18n/ne.js": "admin/js/vendor/select2/i18n/ne.3d79fd3f08db.js", "admin/js/vendor/select2/i18n/af.js": "admin/js/vendor/select2/i18n/af.4f6fcd73488c.js", "admin/js/vendor/select2/i18n/id.js": "admin/js/vendor/select2/i18n/id.04debded514d.js", "admin/js/vendor/select2/i18n/az.js": "admin/js/vendor/select2/i18n/az.270c257daf81.js", "admin/js/vendor/select2/i18n/ca.js": "admin/js/vendor/select2/i18n/ca.a166b745933a.js", "admin/js/vendor/select2/i18n/nb.js": "admin/js/vendor/select2/i18n/nb.da2fce143f27.js", "admin/js/vendor/select2/i18n/zh-CN.js": "admin/js/vendor/select2/i18n/zh-CN.2cff662ec5f9.js", "admin/js/vendor/select2/i18n/zh-TW.js": "admin/js/vendor/select2/i18n/zh-TW.04554a227c2b.js", "admin/js/vendor/select2/i18n/pt-BR.js": "admin/js/vendor/select2/i18n/pt-BR.e1b294433e7f.js", "admin/js/vendor/select2/i18n/da.js": "admin/js/vendor/select2/i18n/da.766346afe4dd.js", "admin/js/vendor/select2/i18n/fa.js": "admin/js/vendor/select2/i18n/fa.3b5bd1961cfd.js", "admin/js/vendor/select2/i18n/de.js": "admin/js/vendor/select2/i18n/de.8a1c222b0204.js", "admin/js/vendor/select2/i18n/en.js": "admin/js/vendor/select2/i18n/en.cf932ba09a98.js", "admin/js/vendor/select2/i18n/bs.js": "admin/js/vendor/select2/i18n/bs.91624382358e.js", "admin/js/vendor/select2/i18n/tk.js": "admin/js/vendor/select2/i18n/tk.7c572a68c78f.js", "admin/js/vendor/select2/i18n/sv.js": "admin/js/vendor/select2/i18n/sv.7a9c2f71e777.js", "admin/js/vendor/select2/i18n/hi.js": "admin/js/vendor/select2/i18n/hi.70640d41628f.js", "admin/js/vendor/select2/i18n/uk.js": "admin/js/vendor/select2/i18n/uk.8cede7f4803c.js", "admin/js/vendor/select2/i18n/cs.js": "admin/js/vendor/select2/i18n/cs.4f43e8e7d33a.js", "admin/js/vendor/select2/i18n/km.js": "admin/js/vendor/select2/i18n/km.c23089cb06ca.js", "admin/js/vendor/select2/i18n/fr.js": "admin/js/vendor/select2/i18n/fr.05e0542fcfe6.js", "admin/js/vendor/select2/i18n/nl.js": "admin/js/vendor/select2/i18n/nl.997868a37ed8.js", "admin/js/vendor/select2/i18n/sr.js": "admin/js/vendor/select2/i18n/sr.5ed85a48f483.js", "admin/js/vendor/select2/i18n/hu.js": "admin/js/vendor/select2/i18n/hu.6ec6039cb8a3.js", "admin/js/vendor/select2/i18n/lt.js": "admin/js/vendor/select2/i18n/lt.23c7ce903300.js", "admin/js/vendor/select2/i18n/ar.js": "admin/js/vendor/select2/i18n/ar.65aa8e36bf5d.js", "admin/js/vendor/select2/i18n/sk.js": "admin/js/vendor/select2/i18n/sk.33d02cef8d11.js", "admin/js/vendor/select2/i18n/it.js": "admin/js/vendor/select2/i18n/it.be4fe8d365b5.js", "admin/js/vendor/select2/i18n/es.js": "admin/js/vendor/select2/i18n/es.66dbc2652fb1.js", "admin/js/vendor/select2/i18n/bn.js": "admin/js/vendor/select2/i18n/bn.6d42b4dd5665.js", "admin/js/vendor/select2/i18n/ro.js": "admin/js/vendor/select2/i18n/ro.f75cb460ec3b.js", "admin/js/vendor/select2/i18n/ps.js": "admin/js/vendor/select2/i18n/ps.38dfa47af9e0.js", "admin/js/vendor/select2/i18n/tr.js": "admin/js/vendor/select2/i18n/tr.b5a0643d1545.js", "admin/css/vendor/select2/select2.min.css": "admin/css/vendor/select2/select2.min.9f54e6414f87.css", "admin/css/vendor/select2/LICENSE-SELECT2.md": "admin/css/vendor/select2/LICENSE-SELECT2.f94142512c91.md", "admin/css/vendor/select2/select2.css": "admin/css/vendor/select2/select2.a2194c262648.css", "admin/js/vendor/jquery/jquery.min.js": "admin/js/vendor/jquery/jquery.min.8fb8fee4fcc3.js", "admin/js/vendor/jquery/LICENSE.txt": "admin/js/vendor/jquery/LICENSE.de877aa6d744.txt", "admin/js/vendor/jquery/jquery.js": "admin/js/vendor/jquery/jquery.2849239b95f5.js", "admin/js/vendor/xregexp/xregexp.min.js": "admin/js/vendor/xregexp/xregexp.min.b0439563a5d3.js", "admin/js/vendor/xregexp/xregexp.js": "admin/js/vendor/xregexp/xregexp.efda034b9537.js", "admin/js/vendor/xregexp/LICENSE.txt": "admin/js/vendor/xregexp/LICENSE.bf79e414957a.txt", "admin/js/vendor/select2/LICENSE.md": "admin/js/vendor/select2/LICENSE.f94142512c91.md", "admin/js/vendor/select2/select2.full.min.js": "admin/js/vendor/select2/select2.full.min.fcd7500d8e13.js", "admin/js/vendor/select2/select2.full.js": "admin/js/vendor/select2/select2.full.c2afdeda3058.js", "babybuddy/img/core/child-placeholder.png": "babybuddy/img/core/child-placeholder.7c0a81f0d7f0.png", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/js/api.js": "rest_framework/docs/js/api.c9743eab7a4f.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "admin/js/admin/RelatedObjectLookups.js": "admin/js/admin/RelatedObjectLookups.b4d76b6aaf0b.js", "admin/js/admin/DateTimeShortcuts.js": "admin/js/admin/DateTimeShortcuts.5548f99471bf.js", "admin/img/gis/move_vertex_on.svg": "admin/img/gis/move_vertex_on.0047eba25b67.svg", "admin/img/gis/move_vertex_off.svg": "admin/img/gis/move_vertex_off.7a23bf31ef8a.svg", "babybuddy/css/app.css": "babybuddy/css/app.af8edf6b6560.css", "babybuddy/js/graph.js": "babybuddy/js/graph.81d7e15ea5a8.js", "babybuddy/js/vendor.js": "babybuddy/js/vendor.c72a03a06acd.js", "babybuddy/js/tags_editor.js": "babybuddy/js/tags_editor.6fc8d69c680c.js", "babybuddy/js/app.js": "babybuddy/js/app.e8f1f5e0f058.js", "babybuddy/logo/icon.png": "babybuddy/logo/icon.df80640f0465.png", "babybuddy/logo/icon-brand.png": "babybuddy/logo/icon-brand.32cbedf6aee3.png", "babybuddy/logo/logo-sad.png": "babybuddy/logo/logo-sad.47c3d5c2d397.png", "babybuddy/logo/logo.png": "babybuddy/logo/logo.62870041cc83.png", "babybuddy/root/safari-pinned-tab.svg": "babybuddy/root/safari-pinned-tab.e8c8ac2f55f5.svg", "babybuddy/root/favicon.ico": "babybuddy/root/favicon.ee5ebcd40fb9.ico", "babybuddy/root/android-chrome-192x192.png": "babybuddy/root/android-chrome-192x192.ac7d2baba4df.png", "babybuddy/root/apple-touch-icon.png": "babybuddy/root/apple-touch-icon.bdc75cec89fa.png", "babybuddy/root/android-chrome-512x512.png": "babybuddy/root/android-chrome-512x512.e1fd38ad828c.png", "babybuddy/root/site.webmanifest": "babybuddy/root/site.c6c4158e40df.webmanifest", "babybuddy/root/mstile-150x150.png": "babybuddy/root/mstile-150x150.08524a406cf2.png", "babybuddy/root/browserconfig.xml": "babybuddy/root/browserconfig.84708aade0e5.xml", "babybuddy/root/apple-touch-startup-image.png": "babybuddy/root/apple-touch-startup-image.749726217484.png", "babybuddy/root/favicon.svg": "babybuddy/root/favicon.12fe726d0bac.svg", "babybuddy/font/babybuddy.svg": "babybuddy/font/babybuddy.ef799e0dd5c7.svg", "babybuddy/font/babybuddy.woff": "babybuddy/font/babybuddy.f20b4bab8535.woff", "babybuddy/font/babybuddy.woff2": "babybuddy/font/babybuddy.2877f94e49cb.woff2", "babybuddy/font/babybuddy.ttf": "babybuddy/font/babybuddy.c4bba6d8de47.ttf", "babybuddy/font/babybuddy.eot": "babybuddy/font/babybuddy.f4f897c49f7f.eot", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.77017a69879a.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.46ed116b0edd.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.66b84a04375e.css", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.0ea6e6052ab5.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.969930007329.js", "rest_framework/js/jquery-3.5.1.min.js": "rest_framework/js/jquery-3.5.1.min.dc5e7f18c8d3.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.e580e3854595.js", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "admin/css/widgets.css": "admin/css/widgets.694d845b2cb1.css", "admin/css/login.css": "admin/css/login.8b76a9f7cbf6.css", "admin/css/dashboard.css": "admin/css/dashboard.be83f13e4369.css", "admin/css/nav_sidebar.css": "admin/css/nav_sidebar.e32d345464bd.css", "admin/css/responsive.css": "admin/css/responsive.b9e1565b3609.css", "admin/css/autocomplete.css": "admin/css/autocomplete.4a81fc4242d0.css", "admin/css/responsive_rtl.css": "admin/css/responsive_rtl.e13ae754cceb.css", "admin/css/forms.css": "admin/css/forms.332ab41432e2.css", "admin/css/fonts.css": "admin/css/fonts.168bab448fee.css", "admin/css/rtl.css": "admin/css/rtl.4bc23eb90919.css", "admin/css/base.css": "admin/css/base.1f418065fc2c.css", "admin/css/changelists.css": "admin/css/changelists.cd4dd90ae1a1.css", "admin/js/urlify.js": "admin/js/urlify.25cc3eac8123.js", "admin/js/core.js": "admin/js/core.5d6b384a08b5.js", "admin/js/collapse.js": "admin/js/collapse.f84e7410290f.js", "admin/js/actions.js": "admin/js/actions.eac7e3441574.js", "admin/js/prepopulate.js": "admin/js/prepopulate.bd2361dfd64d.js", "admin/js/cancel.js": "admin/js/cancel.ecc4c5ca7b32.js", "admin/js/nav_sidebar.js": "admin/js/nav_sidebar.3535caba9444.js", "admin/js/autocomplete.js": "admin/js/autocomplete.c508b167ab61.js", "admin/js/inlines.js": "admin/js/inlines.fb1617228dbe.js", "admin/js/change_form.js": "admin/js/change_form.9d8ca4f96b75.js", "admin/js/SelectFilter2.js": "admin/js/SelectFilter2.d250dcb52a9a.js", "admin/js/jquery.init.js": "admin/js/jquery.init.b7781a0897fc.js", "admin/js/popup_response.js": "admin/js/popup_response.c6cc78ea5551.js", "admin/js/SelectBox.js": "admin/js/SelectBox.8161741c7647.js", "admin/js/calendar.js": "admin/js/calendar.f8a5d055eb33.js", "admin/js/prepopulate_init.js": "admin/js/prepopulate_init.e056047b7a7e.js", "admin/img/search.svg": "admin/img/search.7cf54ff789c6.svg", "admin/img/icon-calendar.svg": "admin/img/icon-calendar.ac7aea671bea.svg", "admin/img/icon-clock.svg": "admin/img/icon-clock.e1d4dfac3f2b.svg", "admin/img/icon-no.svg": "admin/img/icon-no.439e821418cd.svg", "admin/img/tooltag-add.svg": "admin/img/tooltag-add.e59d620a9742.svg", "admin/img/inline-delete.svg": "admin/img/inline-delete.fec1b761f254.svg", "admin/img/LICENSE": "admin/img/LICENSE.2c54f4e1ca1c", "admin/img/icon-changelink.svg": "admin/img/icon-changelink.18d2fd706348.svg", "admin/img/icon-unknown.svg": "admin/img/icon-unknown.a18cb4398978.svg", "admin/img/sorting-icons.svg": "admin/img/sorting-icons.3a097b59f104.svg", "admin/img/icon-viewlink.svg": "admin/img/icon-viewlink.41eb31f7826e.svg", "admin/img/icon-yes.svg": "admin/img/icon-yes.d2f9f035226a.svg", "admin/img/icon-addlink.svg": "admin/img/icon-addlink.d519b3bab011.svg", "admin/img/icon-unknown-alt.svg": "admin/img/icon-unknown-alt.81536e128bb6.svg", "admin/img/icon-deletelink.svg": "admin/img/icon-deletelink.564ef9dc3854.svg", "admin/img/README.txt": "admin/img/README.a70711a38d87.txt", "admin/img/selector-icons.svg": "admin/img/selector-icons.b4555096cea2.svg", "admin/img/calendar-icons.svg": "admin/img/calendar-icons.39b290681a8b.svg", "admin/img/tooltag-arrowright.svg": "admin/img/tooltag-arrowright.bbfb788a849e.svg", "admin/img/icon-alert.svg": "admin/img/icon-alert.034cc7d8a67f.svg", "admin/fonts/Roboto-Light-webfont.woff": "admin/fonts/Roboto-Light-webfont.c73eb1ceba33.woff", "admin/fonts/Roboto-Bold-webfont.woff": "admin/fonts/Roboto-Bold-webfont.50d75e48e0a3.woff", "admin/fonts/Roboto-Regular-webfont.woff": "admin/fonts/Roboto-Regular-webfont.35b07eb2f871.woff", "admin/fonts/README.txt": "admin/fonts/README.ab99e6b541ea.txt", "admin/fonts/LICENSE.txt": "admin/fonts/LICENSE.d273d63619c9.txt", "import_export/import.css": "import_export/import.358144dd8713.css", "import_export/action_formats.js": "import_export/action_formats.11c3e817b80a.js"}, "version": "1.0"} \ No newline at end of file
    ').addClass('cw').text('#')); + } + + while (currentDate.isBefore(this._viewDate.clone().endOf('w'))) { + row.append($('').addClass('dow').text(currentDate.format('dd'))); + currentDate.add(1, 'd'); + } + + this.widget.find('.datepicker-days thead').append(row); + }; + + _proto2._fillMonths = function _fillMonths() { + var spans = [], + monthsShort = this._viewDate.clone().startOf('y').startOf('d'); + + while (monthsShort.isSame(this._viewDate, 'y')) { + spans.push($('').attr('data-action', 'selectMonth').addClass('month').text(monthsShort.format('MMM'))); + monthsShort.add(1, 'M'); + } + + this.widget.find('.datepicker-months td').empty().append(spans); + }; + + _proto2._updateMonths = function _updateMonths() { + var monthsView = this.widget.find('.datepicker-months'), + monthsViewHeader = monthsView.find('th'), + months = monthsView.find('tbody').find('span'), + self = this, + lastPickedDate = this._getLastPickedDate(); + + monthsViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevYear); + monthsViewHeader.eq(1).attr('title', this._options.tooltips.selectYear); + monthsViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextYear); + monthsView.find('.disabled').removeClass('disabled'); + + if (!this._isValid(this._viewDate.clone().subtract(1, 'y'), 'y')) { + monthsViewHeader.eq(0).addClass('disabled'); + } + + monthsViewHeader.eq(1).text(this._viewDate.year()); + + if (!this._isValid(this._viewDate.clone().add(1, 'y'), 'y')) { + monthsViewHeader.eq(2).addClass('disabled'); + } + + months.removeClass('active'); + + if (lastPickedDate && lastPickedDate.isSame(this._viewDate, 'y') && !this.unset) { + months.eq(lastPickedDate.month()).addClass('active'); + } + + months.each(function (index) { + if (!self._isValid(self._viewDate.clone().month(index), 'M')) { + $(this).addClass('disabled'); + } + }); + }; + + _proto2._getStartEndYear = function _getStartEndYear(factor, year) { + var step = factor / 10, + startYear = Math.floor(year / factor) * factor, + endYear = startYear + step * 9, + focusValue = Math.floor(year / step) * step; + return [startYear, endYear, focusValue]; + }; + + _proto2._updateYears = function _updateYears() { + var yearsView = this.widget.find('.datepicker-years'), + yearsViewHeader = yearsView.find('th'), + yearCaps = this._getStartEndYear(10, this._viewDate.year()), + startYear = this._viewDate.clone().year(yearCaps[0]), + endYear = this._viewDate.clone().year(yearCaps[1]); + + var html = ''; + yearsViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevDecade); + yearsViewHeader.eq(1).attr('title', this._options.tooltips.selectDecade); + yearsViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextDecade); + yearsView.find('.disabled').removeClass('disabled'); + + if (this._options.minDate && this._options.minDate.isAfter(startYear, 'y')) { + yearsViewHeader.eq(0).addClass('disabled'); + } + + yearsViewHeader.eq(1).text(startYear.year() + "-" + endYear.year()); + + if (this._options.maxDate && this._options.maxDate.isBefore(endYear, 'y')) { + yearsViewHeader.eq(2).addClass('disabled'); + } + + html += "" + (startYear.year() - 1) + ""; + + while (!startYear.isAfter(endYear, 'y')) { + html += "" + startYear.year() + ""; + startYear.add(1, 'y'); + } + + html += "" + startYear.year() + ""; + yearsView.find('td').html(html); + }; + + _proto2._updateDecades = function _updateDecades() { + var decadesView = this.widget.find('.datepicker-decades'), + decadesViewHeader = decadesView.find('th'), + yearCaps = this._getStartEndYear(100, this._viewDate.year()), + startDecade = this._viewDate.clone().year(yearCaps[0]), + endDecade = this._viewDate.clone().year(yearCaps[1]), + lastPickedDate = this._getLastPickedDate(); + + var minDateDecade = false, + maxDateDecade = false, + endDecadeYear, + html = ''; + decadesViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevCentury); + decadesViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextCentury); + decadesView.find('.disabled').removeClass('disabled'); + + if (startDecade.year() === 0 || this._options.minDate && this._options.minDate.isAfter(startDecade, 'y')) { + decadesViewHeader.eq(0).addClass('disabled'); + } + + decadesViewHeader.eq(1).text(startDecade.year() + "-" + endDecade.year()); + + if (this._options.maxDate && this._options.maxDate.isBefore(endDecade, 'y')) { + decadesViewHeader.eq(2).addClass('disabled'); + } + + if (startDecade.year() - 10 < 0) { + html += ' '; + } else { + html += "" + (startDecade.year() - 10) + ""; + } + + while (!startDecade.isAfter(endDecade, 'y')) { + endDecadeYear = startDecade.year() + 11; + minDateDecade = this._options.minDate && this._options.minDate.isAfter(startDecade, 'y') && this._options.minDate.year() <= endDecadeYear; + maxDateDecade = this._options.maxDate && this._options.maxDate.isAfter(startDecade, 'y') && this._options.maxDate.year() <= endDecadeYear; + html += "" + startDecade.year() + ""; + startDecade.add(10, 'y'); + } + + html += "" + startDecade.year() + ""; + decadesView.find('td').html(html); + }; + + _proto2._fillDate = function _fillDate() { + _DateTimePicker.prototype._fillDate.call(this); + + var daysView = this.widget.find('.datepicker-days'), + daysViewHeader = daysView.find('th'), + html = []; + var currentDate, row, clsName, i; + + if (!this._hasDate()) { + return; + } + + daysViewHeader.eq(0).find('span').attr('title', this._options.tooltips.prevMonth); + daysViewHeader.eq(1).attr('title', this._options.tooltips.selectMonth); + daysViewHeader.eq(2).find('span').attr('title', this._options.tooltips.nextMonth); + daysView.find('.disabled').removeClass('disabled'); + daysViewHeader.eq(1).text(this._viewDate.format(this._options.dayViewHeaderFormat)); + + if (!this._isValid(this._viewDate.clone().subtract(1, 'M'), 'M')) { + daysViewHeader.eq(0).addClass('disabled'); + } + + if (!this._isValid(this._viewDate.clone().add(1, 'M'), 'M')) { + daysViewHeader.eq(2).addClass('disabled'); + } + + currentDate = this._viewDate.clone().startOf('M').startOf('w').startOf('d'); + + for (i = 0; i < 42; i++) { + //always display 42 days (should show 6 weeks) + if (currentDate.weekday() === 0) { + row = $('
    " + currentDate.week() + "" + currentDate.date() + "
    " + currentHour.format(this.use24Hours ? 'HH' : 'hh') + "
    " + currentMinute.format('mm') + "
    " + currentSecond.format('ss') + "