mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2024-11-21 16:27:39 -06:00
Replace charting library Flotr2 with ChartJS using React. Fixes #3904
This commit is contained in:
parent
5820b9521e
commit
f715373218
277
DEPENDENCIES
277
DEPENDENCIES
@ -40,11 +40,11 @@ speaklater 1.3
|
||||
sqlparse 0.2.4 BSD https://github.com/andialbrecht/sqlparse
|
||||
WTForms 2.2.1 BSD https://wtforms.readthedocs.io/
|
||||
Flask-Paranoid 0.2.0 MIT http://github.com/miguelgrinberg/flask-paranoid/
|
||||
psutil 5.7.0 BSD https://github.com/giampaolo/psutil
|
||||
psutil 5.7.2 BSD https://github.com/giampaolo/psutil
|
||||
psycopg2 2.8.5 LGPL with exceptions https://psycopg.org/
|
||||
python-dateutil 2.8.1 Dual License https://dateutil.readthedocs.io
|
||||
SQLAlchemy 1.3.17 MIT http://www.sqlalchemy.org
|
||||
Flask-Security-Too 3.4.3 MIT https://github.com/Flask-Middleware/flask-security
|
||||
SQLAlchemy 1.3.18 MIT http://www.sqlalchemy.org
|
||||
Flask-Security-Too 3.4.4 MIT https://github.com/Flask-Middleware/flask-security
|
||||
sshtunnel 0.1.5 MIT https://github.com/pahaz/sshtunnel
|
||||
ldap3 2.7 LGPL v3 https://github.com/cannatag/ldap3
|
||||
|
||||
@ -57,32 +57,50 @@ Name Version
|
||||
---- ------- ------- ---
|
||||
@babel/cli 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/code-frame 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/code-frame 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/core 7.6.4 MIT https://github.com/babel/babel/tree/master/packages/babel-core
|
||||
@babel/generator 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/generator 7.10.2 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-annotate-as-pure 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-annotate-as-pure 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-builder-binary-assignment-operator-visitor 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-builder-react-jsx 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-builder-react-jsx-experimental 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-create-class-features-plugin 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-create-regexp-features-plugin 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-define-map 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-explode-assignable-expression 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-function-name 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-function-name 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-get-function-arity 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-get-function-arity 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-hoist-variables 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-member-expression-to-functions 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-member-expression-to-functions 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-module-imports 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-module-imports 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-module-transforms 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-optimise-call-expression 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-optimise-call-expression 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-plugin-utils 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-plugin-utils 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-regex 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-remap-async-to-generator 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-replace-supers 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-replace-supers 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-simple-access 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-split-export-declaration 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-split-export-declaration 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-validator-identifier 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-validator-identifier 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helper-wrap-function 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/helpers 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/highlight 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/highlight 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/parser 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/parser 7.10.2 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-proposal-async-generator-functions 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-proposal-class-properties 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-proposal-dynamic-import 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-proposal-json-strings 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-proposal-object-rest-spread 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@ -91,6 +109,7 @@ Name Version
|
||||
@babel/plugin-syntax-async-generators 7.8.4 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators
|
||||
@babel/plugin-syntax-dynamic-import 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import
|
||||
@babel/plugin-syntax-json-strings 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings
|
||||
@babel/plugin-syntax-jsx 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-syntax-object-rest-spread 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread
|
||||
@babel/plugin-syntax-optional-catch-binding 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding
|
||||
@babel/plugin-transform-arrow-functions 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@ -116,6 +135,12 @@ Name Version
|
||||
@babel/plugin-transform-object-super 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-parameters 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-property-literals 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-react-display-name 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-react-jsx 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-react-jsx-development 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-react-jsx-self 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-react-jsx-source 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-react-pure-annotations 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-regenerator 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-reserved-words 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-shorthand-properties 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@ -125,10 +150,14 @@ Name Version
|
||||
@babel/plugin-transform-typeof-symbol 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/plugin-transform-unicode-regex 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/preset-env 7.6.3 MIT https://github.com/babel/babel/tree/master/packages/babel-preset-env
|
||||
@babel/preset-react 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/runtime 7.10.2 MIT https://github.com/babel/babel.git
|
||||
@babel/template 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/template 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/traverse 7.10.1 MIT https://github.com/babel/babel.git
|
||||
@babel/traverse 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@babel/types 7.10.2 MIT https://github.com/babel/babel.git
|
||||
@babel/types 7.10.4 MIT https://github.com/babel/babel.git
|
||||
@simonwep/pickr 1.6.0 MIT https://github.com/Simonwep/pickr.git
|
||||
@sindresorhus/is 0.7.0 MIT https://github.com/sindresorhus/is.git
|
||||
@types/json-schema 7.0.5 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git
|
||||
@ -159,6 +188,7 @@ acorn-jsx 5.2.0
|
||||
acorn-walk 7.1.1 MIT https://github.com/acornjs/acorn.git
|
||||
after 0.8.2 MIT git://github.com/Raynos/after.git
|
||||
aggregate-error 3.0.1 MIT https://github.com/sindresorhus/aggregate-error.git
|
||||
airbnb-prop-types 2.16.0 MIT git+https://github.com/airbnb/prop-types.git
|
||||
ajv 6.12.2 MIT https://github.com/epoberezkin/ajv.git
|
||||
ajv-errors 1.0.1 MIT git+https://github.com/epoberezkin/ajv-errors.git
|
||||
ajv-keywords 3.4.1 MIT git+https://github.com/epoberezkin/ajv-keywords.git
|
||||
@ -177,18 +207,23 @@ argparse 1.0.10
|
||||
arr-diff 4.0.0 MIT https://github.com/jonschlinkert/arr-diff.git
|
||||
arr-flatten 1.1.0 MIT https://github.com/jonschlinkert/arr-flatten.git
|
||||
arr-union 3.1.0 MIT https://github.com/jonschlinkert/arr-union.git
|
||||
array-filter 1.0.0 MIT git://github.com/juliangruber/array-filter.git
|
||||
array-find-index 1.0.2 MIT https://github.com/sindresorhus/array-find-index.git
|
||||
array-flatten 1.1.1 MIT git://github.com/blakeembrey/array-flatten.git
|
||||
array-includes 3.1.1 MIT git://github.com/es-shims/array-includes.git
|
||||
array-union 1.0.2 MIT https://github.com/sindresorhus/array-union.git
|
||||
array-uniq 1.0.3 MIT https://github.com/sindresorhus/array-uniq.git
|
||||
array-unique 0.3.2 MIT https://github.com/jonschlinkert/array-unique.git
|
||||
array.prototype.find 2.1.1 MIT git://github.com/paulmillr/Array.prototype.find.git
|
||||
array.prototype.flat 1.2.3 MIT git://github.com/es-shims/Array.prototype.flat.git
|
||||
array.prototype.flatmap 1.2.3 MIT git://github.com/es-shims/Array.prototype.flatMap.git
|
||||
arraybuffer.slice 0.0.7 MIT git@github.com:rase-/arraybuffer.slice.git
|
||||
asn1.js 4.10.1 MIT git@github.com:indutny/asn1.js
|
||||
assert 1.5.0 MIT git://github.com/browserify/commonjs-assert.git
|
||||
assign-symbols 1.0.0 MIT https://github.com/jonschlinkert/assign-symbols.git
|
||||
astral-regex 1.0.0 MIT https://github.com/kevva/astral-regex.git
|
||||
async 3.2.0 MIT https://github.com/caolan/async.git
|
||||
async 2.6.3 MIT https://github.com/caolan/async.git
|
||||
async 3.2.0 MIT https://github.com/caolan/async.git
|
||||
async-each 1.0.3 MIT git://github.com/paulmillr/async-each.git
|
||||
async-limiter 1.0.1 MIT https://github.com/strml/async-limiter.git
|
||||
autoprefixer 9.8.0 MIT https://github.com/postcss/autoprefixer.git
|
||||
@ -239,8 +274,8 @@ babel-traverse 6.26.0
|
||||
babel-types 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-types
|
||||
babelify 10.0.0 MIT https://github.com/babel/babelify.git
|
||||
babylon 6.18.0 MIT https://github.com/babel/babylon
|
||||
backbone 1.4.0 MIT https://github.com/jashkenas/backbone.git
|
||||
backbone 1.2.3 MIT https://github.com/jashkenas/backbone.git
|
||||
backbone 1.4.0 MIT https://github.com/jashkenas/backbone.git
|
||||
backbone 1.3.3 MIT https://github.com/jashkenas/backbone.git
|
||||
backform 0.2.0 MIT https://github.com/AmiliaApp/backform
|
||||
backgrid 0.3.8 MIT http://github.com/cloudflare/backgrid
|
||||
@ -262,14 +297,14 @@ bin-check 4.1.0
|
||||
bin-version 3.1.0 MIT https://github.com/sindresorhus/bin-version.git
|
||||
bin-version-check 4.0.0 MIT https://github.com/sindresorhus/bin-version-check.git
|
||||
bin-wrapper 4.1.0 MIT https://github.com/kevva/bin-wrapper.git
|
||||
binary-extensions 1.13.1 MIT https://github.com/sindresorhus/binary-extensions.git
|
||||
binary-extensions 2.0.0 MIT https://github.com/sindresorhus/binary-extensions.git
|
||||
binary-extensions 1.13.1 MIT https://github.com/sindresorhus/binary-extensions.git
|
||||
bindings 1.5.0 MIT git://github.com/TooTallNate/node-bindings.git
|
||||
bl 1.2.2 MIT https://github.com/rvagg/bl.git
|
||||
blob 0.0.5 MIT git://github.com/webmodules/blob.git
|
||||
bluebird 3.7.2 MIT git://github.com/petkaantonov/bluebird.git
|
||||
bn.js 5.1.2 MIT git@github.com:indutny/bn.js
|
||||
bn.js 4.11.9 MIT git@github.com:indutny/bn.js
|
||||
bn.js 5.1.2 MIT git@github.com:indutny/bn.js
|
||||
body-parser 1.19.0 MIT https://github.com/expressjs/body-parser.git
|
||||
bootstrap 4.5.0 MIT git+https://github.com/twbs/bootstrap.git
|
||||
bootstrap4-toggle 3.4.0 MIT https://github.com/gitbrent/bootstrap4-toggle.git
|
||||
@ -302,21 +337,26 @@ cacheable-request 2.1.4
|
||||
cached-path-relative 1.0.2 MIT git://github.com/ashaffer/cached-path-relative.git
|
||||
caller-callsite 2.0.0 MIT https://github.com/sindresorhus/caller-callsite.git
|
||||
caller-path 2.0.0 MIT https://github.com/sindresorhus/caller-path.git
|
||||
callsites 2.0.0 MIT https://github.com/sindresorhus/callsites.git
|
||||
callsites 3.1.0 MIT https://github.com/sindresorhus/callsites.git
|
||||
camelcase 2.1.1 MIT https://github.com/sindresorhus/camelcase.git
|
||||
callsites 2.0.0 MIT https://github.com/sindresorhus/callsites.git
|
||||
camelcase 5.3.1 MIT https://github.com/sindresorhus/camelcase.git
|
||||
camelcase 2.1.1 MIT https://github.com/sindresorhus/camelcase.git
|
||||
camelcase-keys 2.1.0 MIT https://github.com/sindresorhus/camelcase-keys.git
|
||||
caniuse-api 3.0.0 MIT https://github.com/nyalab/caniuse-api.git
|
||||
caw 2.0.1 MIT https://github.com/kevva/caw.git
|
||||
chalk 2.4.2 MIT https://github.com/chalk/chalk.git
|
||||
chalk 1.1.3 MIT https://github.com/chalk/chalk.git
|
||||
chalk 2.4.2 MIT https://github.com/chalk/chalk.git
|
||||
chardet 0.7.0 MIT git@github.com:runk/node-chardet.git
|
||||
chart.js 2.9.3 MIT https://github.com/chartjs/Chart.js.git
|
||||
chartjs-color 2.4.1 MIT https://github.com/chartjs/chartjs-color.git
|
||||
chartjs-color-string 0.6.0 MIT https://github.com/chartjs/chartjs-color-string.git
|
||||
check-types 8.0.3 MIT https://gitlab.com/philbooth/check-types.js.git
|
||||
chokidar 3.4.0 MIT git+https://github.com/paulmillr/chokidar.git
|
||||
cheerio 1.0.0-rc.3 MIT git://github.com/cheeriojs/cheerio.git
|
||||
chokidar 2.1.8 MIT https://github.com/paulmillr/chokidar.git
|
||||
chokidar 3.4.0 MIT git+https://github.com/paulmillr/chokidar.git
|
||||
chrome-trace-event 1.0.2 MIT github.com:samccone/chrome-trace-event
|
||||
cipher-base 1.0.4 MIT git+https://github.com/crypto-browserify/cipher-base.git
|
||||
circular-json-es6 2.0.2 MIT git+https://github.com/yyx990803/circular-json-es6.git
|
||||
class-utils 0.3.6 MIT https://github.com/jonschlinkert/class-utils.git
|
||||
clean-stack 2.2.0 MIT https://github.com/sindresorhus/clean-stack.git
|
||||
cli-cursor 2.1.0 MIT https://github.com/sindresorhus/cli-cursor.git
|
||||
@ -331,9 +371,9 @@ color-name 1.1.3
|
||||
color-string 1.5.3 MIT https://github.com/Qix-/color-string.git
|
||||
colors 1.4.0 MIT http://github.com/Marak/colors.js.git
|
||||
combine-source-map 0.8.0 MIT git://github.com/thlorenz/combine-source-map.git
|
||||
commander 4.1.1 MIT https://github.com/tj/commander.js.git
|
||||
commander 5.1.0 MIT https://github.com/tj/commander.js.git
|
||||
commander 2.8.1 MIT https://github.com/tj/commander.js.git
|
||||
commander 4.1.1 MIT https://github.com/tj/commander.js.git
|
||||
commander 2.20.3 MIT https://github.com/tj/commander.js.git
|
||||
commondir 1.0.1 MIT http://github.com/substack/node-commondir.git
|
||||
component-emitter 1.2.1 MIT https://github.com/component/emitter.git
|
||||
@ -352,8 +392,8 @@ cookie 0.3.1
|
||||
cookie-signature 1.0.6 MIT https://github.com/visionmedia/node-cookie-signature.git
|
||||
copy-descriptor 0.1.1 MIT https://github.com/jonschlinkert/copy-descriptor.git
|
||||
copy-webpack-plugin 5.1.1 MIT https://github.com/webpack-contrib/copy-webpack-plugin.git
|
||||
core-js 3.6.5 MIT https://github.com/zloirock/core-js.git
|
||||
core-js 2.6.11 MIT https://github.com/zloirock/core-js.git
|
||||
core-js 3.6.5 MIT https://github.com/zloirock/core-js.git
|
||||
core-js-compat 3.6.5 MIT https://github.com/zloirock/core-js.git
|
||||
core-util-is 1.0.2 MIT git://github.com/isaacs/core-util-is
|
||||
cosmiconfig 5.2.1 MIT git+https://github.com/davidtheclark/cosmiconfig.git
|
||||
@ -368,8 +408,8 @@ css-color-names 0.0.4
|
||||
css-declaration-sorter 4.0.1 MIT https://github.com/Siilwyn/css-declaration-sorter.git
|
||||
css-loader 2.1.0 MIT https://github.com/webpack-contrib/css-loader.git
|
||||
css-select-base-adapter 0.1.1 MIT https://github.com/nrkn/css-select-base-adapter.git
|
||||
css-tree 1.0.0-alpha.39 MIT https://github.com/csstree/csstree.git
|
||||
css-tree 1.0.0-alpha.37 MIT https://github.com/csstree/csstree.git
|
||||
css-tree 1.0.0-alpha.39 MIT https://github.com/csstree/csstree.git
|
||||
cssesc 3.0.0 MIT https://github.com/mathiasbynens/cssesc.git
|
||||
cssnano 4.1.10 MIT https://github.com/cssnano/cssnano.git
|
||||
cssnano-preset-default 4.0.7 MIT https://github.com/cssnano/cssnano.git
|
||||
@ -384,9 +424,9 @@ custom-event 1.0.1
|
||||
cwebp-bin 5.1.0 MIT https://github.com/imagemin/cwebp-bin.git
|
||||
cyclist 1.0.1 MIT git://github.com/mafintosh/cyclist
|
||||
date-format 2.1.0 MIT https://github.com/nomiddlename/date-format.git
|
||||
debug 3.1.0 MIT git://github.com/visionmedia/debug.git
|
||||
debug 3.2.6 MIT git://github.com/visionmedia/debug.git
|
||||
debug 2.6.9 MIT git://github.com/visionmedia/debug.git
|
||||
debug 3.1.0 MIT git://github.com/visionmedia/debug.git
|
||||
debug 4.1.1 MIT git://github.com/visionmedia/debug.git
|
||||
decamelize 1.2.0 MIT https://github.com/sindresorhus/decamelize.git
|
||||
decode-uri-component 0.2.0 MIT https://github.com/SamVerschueren/decode-uri-component.git
|
||||
@ -396,10 +436,11 @@ decompress-tar 4.1.1
|
||||
decompress-tarbz2 4.1.1 MIT https://github.com/kevva/decompress-tarbz2.git
|
||||
decompress-targz 4.1.1 MIT https://github.com/kevva/decompress-targz.git
|
||||
decompress-unzip 4.0.1 MIT https://github.com/kevva/decompress-unzip.git
|
||||
deep-equal-ident 1.1.1 MIT http://github.com/fkling/deep-equal-ident.git
|
||||
deep-is 0.1.3 MIT http://github.com/thlorenz/deep-is.git
|
||||
define-properties 1.1.3 MIT git://github.com/ljharb/define-properties.git
|
||||
define-property 0.2.5 MIT https://github.com/jonschlinkert/define-property.git
|
||||
define-property 2.0.2 MIT https://github.com/jonschlinkert/define-property.git
|
||||
define-property 0.2.5 MIT https://github.com/jonschlinkert/define-property.git
|
||||
define-property 1.0.0 MIT https://github.com/jonschlinkert/define-property.git
|
||||
defined 1.0.0 MIT git://github.com/substack/defined.git
|
||||
depd 1.1.2 MIT https://github.com/dougwilson/nodejs-depd.git
|
||||
@ -411,7 +452,9 @@ detective 5.2.0
|
||||
di 0.0.1 MIT git://github.com/vojtajina/node-di.git
|
||||
diffie-hellman 5.0.3 MIT https://github.com/crypto-browserify/diffie-hellman.git
|
||||
dir-glob 2.2.2 MIT https://github.com/kevva/dir-glob.git
|
||||
discontinuous-range 1.0.0 MIT https://github.com/dtudury/discontinuous-range.git
|
||||
dom-serialize 2.2.1 MIT git://github.com/webmodules/dom-serialize.git
|
||||
dom-serializer 0.1.1 MIT git://github.com/cheeriojs/dom-renderer.git
|
||||
dom-serializer 0.2.2 MIT git://github.com/cheeriojs/dom-renderer.git
|
||||
domain-browser 1.2.0 MIT https://github.com/bevry/domain-browser.git
|
||||
dot-prop 5.2.0 MIT https://github.com/sindresorhus/dot-prop.git
|
||||
@ -423,16 +466,21 @@ duplexify 3.7.1
|
||||
ee-first 1.1.1 MIT https://github.com/jonathanong/ee-first.git
|
||||
elliptic 6.5.2 MIT git@github.com:indutny/elliptic
|
||||
emoji-regex 7.0.3 MIT https://github.com/mathiasbynens/emoji-regex.git
|
||||
emojis-list 2.1.0 MIT git+https://github.com/kikobeats/emojis-list.git
|
||||
emojis-list 3.0.0 MIT git+https://github.com/kikobeats/emojis-list.git
|
||||
emojis-list 2.1.0 MIT git+https://github.com/kikobeats/emojis-list.git
|
||||
encodeurl 1.0.2 MIT https://github.com/pillarjs/encodeurl.git
|
||||
end-of-stream 1.4.4 MIT git://github.com/mafintosh/end-of-stream.git
|
||||
engine.io 3.2.1 MIT git@github.com:socketio/engine.io.git
|
||||
engine.io-client 3.2.1 MIT https://github.com/socketio/engine.io-client.git
|
||||
engine.io-parser 2.1.3 MIT git@github.com:socketio/engine.io-parser.git
|
||||
enhanced-resolve 4.1.0 MIT git://github.com/webpack/enhanced-resolve.git
|
||||
enhanced-resolve 4.2.0 MIT git://github.com/webpack/enhanced-resolve.git
|
||||
enhanced-resolve 4.1.0 MIT git://github.com/webpack/enhanced-resolve.git
|
||||
ent 2.2.0 MIT https://github.com/substack/node-ent.git
|
||||
enzyme 3.11.0 MIT https://github.com/airbnb/enzyme.git
|
||||
enzyme-adapter-react-16 1.15.2 MIT https://github.com/airbnb/enzyme.git
|
||||
enzyme-adapter-utils 1.13.0 MIT https://github.com/airbnb/enzyme.git
|
||||
enzyme-matchers 7.1.2 MIT git+https://github.com/FormidableLabs/enzyme-matchers.git
|
||||
enzyme-shallow-equal 1.0.1 MIT https://github.com/airbnb/enzyme.git
|
||||
errno 0.1.7 MIT https://github.com/rvagg/node-errno.git
|
||||
error-ex 1.3.2 MIT https://github.com/qix-/node-error-ex.git
|
||||
es-abstract 1.17.6 MIT git://github.com/ljharb/es-abstract.git
|
||||
@ -440,16 +488,17 @@ es-to-primitive 1.2.1
|
||||
escape-html 1.0.3 MIT https://github.com/component/escape-html.git
|
||||
escape-string-regexp 1.0.5 MIT https://github.com/sindresorhus/escape-string-regexp.git
|
||||
eslint 5.15.1 MIT https://github.com/eslint/eslint.git
|
||||
eslint-plugin-react 7.20.3 MIT https://github.com/yannickcr/eslint-plugin-react
|
||||
eslint-utils 1.4.3 MIT git+https://github.com/mysticatea/eslint-utils.git
|
||||
etag 1.8.1 MIT https://github.com/jshttp/etag.git
|
||||
eventemitter3 4.0.4 MIT git://github.com/primus/eventemitter3.git
|
||||
events 2.1.0 MIT git://github.com/Gozala/events.git
|
||||
events 3.1.0 MIT git://github.com/Gozala/events.git
|
||||
events 2.1.0 MIT git://github.com/Gozala/events.git
|
||||
evp_bytestokey 1.0.3 MIT https://github.com/crypto-browserify/EVP_BytesToKey.git
|
||||
exec-buffer 3.2.0 MIT https://github.com/kevva/exec-buffer.git
|
||||
execa 0.7.0 MIT https://github.com/sindresorhus/execa.git
|
||||
execa 1.0.0 MIT https://github.com/sindresorhus/execa.git
|
||||
execa 0.10.0 MIT https://github.com/sindresorhus/execa.git
|
||||
execa 1.0.0 MIT https://github.com/sindresorhus/execa.git
|
||||
execa 0.7.0 MIT https://github.com/sindresorhus/execa.git
|
||||
executable 4.1.1 MIT https://github.com/kevva/executable.git
|
||||
expand-brackets 2.1.4 MIT https://github.com/jonschlinkert/expand-brackets.git
|
||||
expand-tilde 2.0.2 MIT https://github.com/jonschlinkert/expand-tilde.git
|
||||
@ -458,8 +507,8 @@ express 4.17.1
|
||||
ext-list 2.2.2 MIT https://github.com/kevva/ext-list.git
|
||||
ext-name 5.0.0 MIT https://github.com/kevva/ext-name.git
|
||||
extend 3.0.2 MIT https://github.com/justmoon/node-extend.git
|
||||
extend-shallow 3.0.2 MIT https://github.com/jonschlinkert/extend-shallow.git
|
||||
extend-shallow 2.0.1 MIT https://github.com/jonschlinkert/extend-shallow.git
|
||||
extend-shallow 3.0.2 MIT https://github.com/jonschlinkert/extend-shallow.git
|
||||
external-editor 3.1.0 MIT git+https://github.com/mrkmg/node-external-editor.git
|
||||
extglob 2.0.4 MIT https://github.com/micromatch/extglob.git
|
||||
fast-deep-equal 3.1.3 MIT git+https://github.com/epoberezkin/fast-deep-equal.git
|
||||
@ -471,28 +520,27 @@ figures 1.7.0
|
||||
figures 2.0.0 MIT https://github.com/sindresorhus/figures.git
|
||||
file-entry-cache 5.0.1 MIT https://github.com/royriojas/file-entry-cache.git
|
||||
file-loader 3.0.1 MIT https://github.com/webpack-contrib/file-loader.git
|
||||
file-type 5.2.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 3.9.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 8.1.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 6.2.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 4.4.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 8.1.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 5.2.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 10.11.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 6.2.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-type 3.9.0 MIT https://github.com/sindresorhus/file-type.git
|
||||
file-uri-to-path 1.0.0 MIT git://github.com/TooTallNate/file-uri-to-path.git
|
||||
filename-reserved-regex 2.0.0 MIT https://github.com/sindresorhus/filename-reserved-regex.git
|
||||
filenamify 2.1.0 MIT https://github.com/sindresorhus/filenamify.git
|
||||
fill-range 7.0.1 MIT https://github.com/jonschlinkert/fill-range.git
|
||||
fill-range 4.0.0 MIT https://github.com/jonschlinkert/fill-range.git
|
||||
fill-range 7.0.1 MIT https://github.com/jonschlinkert/fill-range.git
|
||||
finalhandler 1.1.2 MIT https://github.com/pillarjs/finalhandler.git
|
||||
find-cache-dir 3.3.1 MIT https://github.com/avajs/find-cache-dir.git
|
||||
find-cache-dir 2.1.0 MIT https://github.com/avajs/find-cache-dir.git
|
||||
find-up 3.0.0 MIT https://github.com/sindresorhus/find-up.git
|
||||
find-up 1.1.2 MIT https://github.com/sindresorhus/find-up.git
|
||||
find-up 4.1.0 MIT https://github.com/sindresorhus/find-up.git
|
||||
find-cache-dir 3.3.1 MIT https://github.com/avajs/find-cache-dir.git
|
||||
find-up 2.1.0 MIT https://github.com/sindresorhus/find-up.git
|
||||
find-up 3.0.0 MIT https://github.com/sindresorhus/find-up.git
|
||||
find-up 4.1.0 MIT https://github.com/sindresorhus/find-up.git
|
||||
find-up 1.1.2 MIT https://github.com/sindresorhus/find-up.git
|
||||
find-versions 3.2.0 MIT https://github.com/sindresorhus/find-versions.git
|
||||
findup-sync 3.0.0 MIT https://github.com/gulpjs/findup-sync.git
|
||||
flat-cache 2.0.1 MIT https://github.com/royriojas/flat-cache.git
|
||||
flotr2 0.1.0 MIT https://github.com/HumbleSoftware/Flotr2.git
|
||||
flush-write-stream 1.1.1 MIT https://github.com/mafintosh/flush-write-stream.git
|
||||
follow-redirects 1.5.10 MIT git@github.com:follow-redirects/follow-redirects.git
|
||||
for-in 1.0.2 MIT https://github.com/jonschlinkert/for-in.git
|
||||
@ -507,12 +555,14 @@ fs-readdir-recursive 1.1.0
|
||||
fsevents 2.1.3 MIT https://github.com/fsevents/fsevents.git
|
||||
fsevents 1.2.13 MIT https://github.com/strongloop/fsevents.git
|
||||
function-bind 1.1.1 MIT git://github.com/Raynos/function-bind.git
|
||||
function.prototype.name 1.1.2 MIT git://github.com/es-shims/Function.prototype.name.git
|
||||
functional-red-black-tree 1.0.1 MIT git://github.com/mikolalysenko/functional-red-black-tree.git
|
||||
functions-have-names 1.2.1 MIT git+https://github.com/ljharb/functions-have-names.git
|
||||
geometry-interfaces 1.1.4 MIT https://github.com/trusktr/geometry-interfaces.git
|
||||
get-proxy 2.1.0 MIT https://github.com/kevva/get-proxy.git
|
||||
get-stdin 4.0.1 MIT https://github.com/sindresorhus/get-stdin.git
|
||||
get-stream 2.3.1 MIT https://github.com/sindresorhus/get-stream.git
|
||||
get-stream 3.0.0 MIT https://github.com/sindresorhus/get-stream.git
|
||||
get-stream 2.3.1 MIT https://github.com/sindresorhus/get-stream.git
|
||||
get-stream 4.1.0 MIT https://github.com/sindresorhus/get-stream.git
|
||||
get-value 2.0.6 MIT https://github.com/jonschlinkert/get-value.git
|
||||
gifsicle 4.0.1 MIT https://github.com/imagemin/gifsicle-bin.git
|
||||
@ -520,8 +570,8 @@ global-modules 1.0.0
|
||||
global-modules 2.0.0 MIT https://github.com/jonschlinkert/global-modules.git
|
||||
global-prefix 3.0.0 MIT https://github.com/jonschlinkert/global-prefix.git
|
||||
global-prefix 1.0.2 MIT https://github.com/jonschlinkert/global-prefix.git
|
||||
globals 11.12.0 MIT https://github.com/sindresorhus/globals.git
|
||||
globals 9.18.0 MIT https://github.com/sindresorhus/globals.git
|
||||
globals 11.12.0 MIT https://github.com/sindresorhus/globals.git
|
||||
globby 6.1.0 MIT https://github.com/sindresorhus/globby.git
|
||||
globby 7.1.1 MIT https://github.com/sindresorhus/globby.git
|
||||
got 8.3.2 MIT https://github.com/sindresorhus/got.git
|
||||
@ -539,8 +589,8 @@ has-symbols 1.0.1
|
||||
has-to-string-tag-x 1.4.1 MIT https://github.com/Xotic750/has-to-string-tag-x.git
|
||||
has-value 0.3.1 MIT https://github.com/jonschlinkert/has-value.git
|
||||
has-value 1.0.0 MIT https://github.com/jonschlinkert/has-value.git
|
||||
has-values 0.1.4 MIT https://github.com/jonschlinkert/has-values.git
|
||||
has-values 1.0.0 MIT https://github.com/jonschlinkert/has-values.git
|
||||
has-values 0.1.4 MIT https://github.com/jonschlinkert/has-values.git
|
||||
hash-base 3.1.0 MIT https://github.com/crypto-browserify/hash-base.git
|
||||
hash.js 1.1.7 MIT git@github.com:indutny/hash.js
|
||||
hat 0.0.3 MIT http://github.com/substack/node-hat.git
|
||||
@ -551,7 +601,9 @@ hoopy 0.1.4
|
||||
hsl-regex 1.0.0 MIT https://github.com/regexps/hsl-regex.git
|
||||
hsla-regex 1.0.0 MIT https://github.com/regexps/hsla-regex.git
|
||||
html-comment-regex 1.1.2 MIT https://github.com/stevemao/html-comment-regex.git
|
||||
html-element-map 1.2.0 MIT git+https://github.com/ljharb/html-element-map.git
|
||||
htmlescape 1.1.1 MIT git://github.com/zertosh/htmlescape.git
|
||||
htmlparser2 3.10.1 MIT git://github.com/fb55/htmlparser2.git
|
||||
http-errors 1.7.2 MIT https://github.com/jshttp/http-errors.git
|
||||
http-proxy 1.18.1 MIT https://github.com/http-party/node-http-proxy.git
|
||||
https-browserify 1.0.0 MIT git://github.com/substack/https-browserify.git
|
||||
@ -577,12 +629,13 @@ import-lazy 3.1.0
|
||||
import-local 2.0.0 MIT https://github.com/sindresorhus/import-local.git
|
||||
imports-loader 0.8.0 MIT https://github.com/webpack-contrib/imports-loader
|
||||
imurmurhash 0.1.4 MIT https://github.com/jensyt/imurmurhash-js
|
||||
indent-string 4.0.0 MIT https://github.com/sindresorhus/indent-string.git
|
||||
indent-string 2.1.0 MIT https://github.com/sindresorhus/indent-string.git
|
||||
indent-string 4.0.0 MIT https://github.com/sindresorhus/indent-string.git
|
||||
indexes-of 1.0.1 MIT git://github.com/dominictarr/indexes-of.git
|
||||
inline-source-map 0.6.2 MIT git://github.com/thlorenz/inline-source-map.git
|
||||
inquirer 6.5.2 MIT https://github.com/SBoudrias/Inquirer.js.git
|
||||
insert-module-globals 7.2.0 MIT git://github.com/browserify/insert-module-globals.git
|
||||
internal-slot 1.0.2 MIT git+https://github.com/ljharb/internal-slot.git
|
||||
interpret 1.2.0 MIT https://github.com/gulpjs/interpret.git
|
||||
into-stream 3.1.0 MIT https://github.com/sindresorhus/into-stream.git
|
||||
invariant 2.2.4 MIT https://github.com/zertosh/invariant
|
||||
@ -592,10 +645,11 @@ ipaddr.js 1.9.1
|
||||
is-absolute-url 2.1.0 MIT https://github.com/sindresorhus/is-absolute-url.git
|
||||
is-accessor-descriptor 0.1.6 MIT https://github.com/jonschlinkert/is-accessor-descriptor.git
|
||||
is-accessor-descriptor 1.0.0 MIT https://github.com/jonschlinkert/is-accessor-descriptor.git
|
||||
is-arrayish 0.2.1 MIT https://github.com/qix-/node-is-arrayish.git
|
||||
is-arrayish 0.3.2 MIT https://github.com/qix-/node-is-arrayish.git
|
||||
is-binary-path 2.1.0 MIT https://github.com/sindresorhus/is-binary-path.git
|
||||
is-arrayish 0.2.1 MIT https://github.com/qix-/node-is-arrayish.git
|
||||
is-binary-path 1.0.1 MIT https://github.com/sindresorhus/is-binary-path.git
|
||||
is-binary-path 2.1.0 MIT https://github.com/sindresorhus/is-binary-path.git
|
||||
is-boolean-object 1.0.1 MIT git://github.com/ljharb/is-boolean-object.git
|
||||
is-buffer 2.0.4 MIT git://github.com/feross/is-buffer.git
|
||||
is-buffer 1.1.6 MIT git://github.com/feross/is-buffer.git
|
||||
is-callable 1.2.0 MIT git://github.com/ljharb/is-callable.git
|
||||
@ -603,8 +657,8 @@ is-color-stop 1.1.0
|
||||
is-data-descriptor 1.0.0 MIT https://github.com/jonschlinkert/is-data-descriptor.git
|
||||
is-data-descriptor 0.1.4 MIT https://github.com/jonschlinkert/is-data-descriptor.git
|
||||
is-date-object 1.0.2 MIT git://github.com/ljharb/is-date-object.git
|
||||
is-descriptor 0.1.6 MIT https://github.com/jonschlinkert/is-descriptor.git
|
||||
is-descriptor 1.0.2 MIT https://github.com/jonschlinkert/is-descriptor.git
|
||||
is-descriptor 0.1.6 MIT https://github.com/jonschlinkert/is-descriptor.git
|
||||
is-directory 0.3.1 MIT https://github.com/jonschlinkert/is-directory.git
|
||||
is-docker 1.1.0 MIT https://github.com/sindresorhus/is-docker.git
|
||||
is-extendable 1.0.1 MIT https://github.com/jonschlinkert/is-extendable.git
|
||||
@ -613,12 +667,13 @@ is-extglob 2.1.1
|
||||
is-finite 1.1.0 MIT https://github.com/sindresorhus/is-finite.git
|
||||
is-fullwidth-code-point 2.0.0 MIT https://github.com/sindresorhus/is-fullwidth-code-point.git
|
||||
is-gif 3.0.0 MIT https://github.com/sindresorhus/is-gif.git
|
||||
is-glob 3.1.0 MIT https://github.com/jonschlinkert/is-glob.git
|
||||
is-glob 4.0.1 MIT https://github.com/micromatch/is-glob.git
|
||||
is-glob 3.1.0 MIT https://github.com/jonschlinkert/is-glob.git
|
||||
is-jpg 2.0.0 MIT https://github.com/sindresorhus/is-jpg.git
|
||||
is-natural-number 4.0.1 MIT https://github.com/shinnn/is-natural-number.js.git
|
||||
is-number 3.0.0 MIT https://github.com/jonschlinkert/is-number.git
|
||||
is-number 7.0.0 MIT https://github.com/jonschlinkert/is-number.git
|
||||
is-number 3.0.0 MIT https://github.com/jonschlinkert/is-number.git
|
||||
is-number-object 1.0.4 MIT git://github.com/inspect-js/is-number-object.git
|
||||
is-obj 2.0.0 MIT https://github.com/sindresorhus/is-obj.git
|
||||
is-object 1.0.1 MIT git://github.com/ljharb/is-object.git
|
||||
is-plain-obj 1.1.0 MIT https://github.com/sindresorhus/is-plain-obj.git
|
||||
@ -627,6 +682,8 @@ is-png 1.1.0
|
||||
is-regex 1.1.0 MIT git://github.com/ljharb/is-regex.git
|
||||
is-retry-allowed 1.2.0 MIT https://github.com/floatdrop/is-retry-allowed.git
|
||||
is-stream 1.1.0 MIT https://github.com/sindresorhus/is-stream.git
|
||||
is-string 1.0.5 MIT git://github.com/ljharb/is-string.git
|
||||
is-subset 0.1.1 MIT git@github.com:studio-b12/is-subset.git
|
||||
is-svg 4.2.1 MIT https://github.com/sindresorhus/is-svg.git
|
||||
is-svg 3.0.0 MIT https://github.com/sindresorhus/is-svg.git
|
||||
is-symbol 1.0.3 MIT git://github.com/inspect-js/is-symbol.git
|
||||
@ -634,21 +691,22 @@ is-utf8 0.2.1
|
||||
is-windows 1.0.2 MIT https://github.com/jonschlinkert/is-windows.git
|
||||
is-wsl 1.1.0 MIT https://github.com/sindresorhus/is-wsl.git
|
||||
isarray 0.0.1 MIT git://github.com/juliangruber/isarray.git
|
||||
isarray 1.0.0 MIT git://github.com/juliangruber/isarray.git
|
||||
isarray 2.0.1 MIT git://github.com/juliangruber/isarray.git
|
||||
isarray 1.0.0 MIT git://github.com/juliangruber/isarray.git
|
||||
isbinaryfile 3.0.3 MIT https://github.com/gjtorikian/isBinaryFile
|
||||
isobject 2.1.0 MIT https://github.com/jonschlinkert/isobject.git
|
||||
isobject 3.0.1 MIT https://github.com/jonschlinkert/isobject.git
|
||||
isobject 2.1.0 MIT https://github.com/jonschlinkert/isobject.git
|
||||
isurl 1.0.0 MIT https://github.com/stevenvachon/isurl.git
|
||||
jasmine-core 3.3.0 MIT https://github.com/jasmine/jasmine.git
|
||||
jasmine-enzyme 7.1.2 MIT https://github.com/FormidableLabs/enzyme-matchers.git
|
||||
jest-worker 25.5.0 MIT https://github.com/facebook/jest.git
|
||||
jquery 3.5.1 MIT https://github.com/jquery/jquery.git
|
||||
jquery-contextmenu 2.9.2 MIT git://github.com/swisnl/jQuery-contextMenu.git
|
||||
jquery-ui 1.12.1 MIT git://github.com/jquery/jquery-ui.git
|
||||
js-levenshtein 1.1.6 MIT https://github.com/gustf/js-levenshtein.git
|
||||
js-string-escape 1.0.1 MIT https://github.com/joliss/js-string-escape
|
||||
js-tokens 4.0.0 MIT https://github.com/lydell/js-tokens.git
|
||||
js-tokens 3.0.2 MIT https://github.com/lydell/js-tokens.git
|
||||
js-tokens 4.0.0 MIT https://github.com/lydell/js-tokens.git
|
||||
js-yaml 3.14.0 MIT https://github.com/nodeca/js-yaml.git
|
||||
jsbn 1.1.0 MIT https://github.com/andyperlitch/jsbn.git
|
||||
jsesc 0.5.0 MIT https://github.com/mathiasbynens/jsesc.git
|
||||
@ -659,10 +717,11 @@ json-parse-better-errors 1.0.2
|
||||
json-schema-traverse 0.4.1 MIT git+https://github.com/epoberezkin/json-schema-traverse.git
|
||||
json-stable-stringify 0.0.1 MIT git://github.com/substack/json-stable-stringify.git
|
||||
json-stable-stringify-without-jsonify 1.0.1 MIT git://github.com/samn/json-stable-stringify.git
|
||||
json5 1.0.1 MIT git+https://github.com/json5/json5.git
|
||||
json5 2.1.3 MIT git+https://github.com/json5/json5.git
|
||||
json5 1.0.1 MIT git+https://github.com/json5/json5.git
|
||||
jsonfile 4.0.0 MIT git@github.com:jprichardson/node-jsonfile.git
|
||||
jsonparse 1.3.1 MIT http://github.com/creationix/jsonparse.git
|
||||
jsx-ast-utils 2.4.1 MIT https://github.com/evcohen/jsx-ast-utils
|
||||
karma 4.4.1 MIT git://github.com/karma-runner/karma.git
|
||||
karma-browserify 6.0.0 MIT git@github.com:nikku/karma-browserify.git
|
||||
karma-chrome-launcher 2.2.0 MIT git://github.com/karma-runner/karma-chrome-launcher.git
|
||||
@ -673,36 +732,48 @@ karma-source-map-support 1.4.0
|
||||
karma-sourcemap-loader 0.3.7 MIT git@github.com:demerzel3/karma-sourcemap-loader.git
|
||||
karma-webpack 4.0.2 MIT https://github.com/webpack-contrib/karma-webpack.git
|
||||
keyv 3.0.0 MIT git+https://github.com/lukechilds/keyv.git
|
||||
kind-of 6.0.3 MIT https://github.com/jonschlinkert/kind-of.git
|
||||
kind-of 3.2.2 MIT https://github.com/jonschlinkert/kind-of.git
|
||||
kind-of 5.1.0 MIT https://github.com/jonschlinkert/kind-of.git
|
||||
kind-of 6.0.3 MIT https://github.com/jonschlinkert/kind-of.git
|
||||
kind-of 4.0.0 MIT https://github.com/jonschlinkert/kind-of.git
|
||||
kind-of 5.1.0 MIT https://github.com/jonschlinkert/kind-of.git
|
||||
labeled-stream-splicer 2.0.2 MIT git://github.com/browserify/labeled-stream-splicer.git
|
||||
last-call-webpack-plugin 3.0.0 MIT http://github.com/NMFR/last-call-webpack-plugin.git
|
||||
lcid 2.0.0 MIT https://github.com/sindresorhus/lcid.git
|
||||
levn 0.3.0 MIT git://github.com/gkz/levn.git
|
||||
load-json-file 1.1.0 MIT https://github.com/sindresorhus/load-json-file.git
|
||||
loader-runner 2.4.0 MIT git+https://github.com/webpack/loader-runner.git
|
||||
loader-utils 1.2.3 MIT https://github.com/webpack/loader-utils.git
|
||||
loader-utils 1.4.0 MIT https://github.com/webpack/loader-utils.git
|
||||
locate-path 5.0.0 MIT https://github.com/sindresorhus/locate-path.git
|
||||
loader-utils 1.2.3 MIT https://github.com/webpack/loader-utils.git
|
||||
locate-path 2.0.0 MIT https://github.com/sindresorhus/locate-path.git
|
||||
locate-path 5.0.0 MIT https://github.com/sindresorhus/locate-path.git
|
||||
locate-path 3.0.0 MIT https://github.com/sindresorhus/locate-path.git
|
||||
lodash 4.17.19 MIT https://github.com/lodash/lodash.git
|
||||
lodash 4.17.15 MIT https://github.com/lodash/lodash.git
|
||||
lodash.memoize 4.1.2 MIT https://github.com/lodash/lodash.git
|
||||
lodash._baseisequal 3.0.7 MIT https://github.com/lodash/lodash.git
|
||||
lodash._bindcallback 3.0.1 MIT https://github.com/lodash/lodash.git
|
||||
lodash._getnative 3.9.1 MIT https://github.com/lodash/lodash.git
|
||||
lodash.escape 4.0.1 MIT https://github.com/lodash/lodash.git
|
||||
lodash.flattendeep 4.4.0 MIT https://github.com/lodash/lodash.git
|
||||
lodash.isarguments 3.1.0 MIT https://github.com/lodash/lodash.git
|
||||
lodash.isarray 3.0.4 MIT https://github.com/lodash/lodash.git
|
||||
lodash.isequal 4.5.0 MIT https://github.com/lodash/lodash.git
|
||||
lodash.isequal 3.0.4 MIT https://github.com/lodash/lodash.git
|
||||
lodash.istypedarray 3.0.6 MIT https://github.com/lodash/lodash.git
|
||||
lodash.keys 3.1.2 MIT https://github.com/lodash/lodash.git
|
||||
lodash.memoize 3.0.4 MIT https://github.com/lodash/lodash.git
|
||||
lodash.memoize 4.1.2 MIT https://github.com/lodash/lodash.git
|
||||
lodash.uniq 4.5.0 MIT https://github.com/lodash/lodash.git
|
||||
logalot 2.1.0 MIT https://github.com/imagemin/logalot.git
|
||||
longest 1.0.1 MIT https://github.com/jonschlinkert/longest.git
|
||||
loose-envify 1.4.0 MIT git://github.com/zertosh/loose-envify.git
|
||||
loud-rejection 1.6.0 MIT https://github.com/sindresorhus/loud-rejection.git
|
||||
lowercase-keys 1.0.1 MIT https://github.com/sindresorhus/lowercase-keys.git
|
||||
lowercase-keys 1.0.0 MIT https://github.com/sindresorhus/lowercase-keys.git
|
||||
lowercase-keys 1.0.1 MIT https://github.com/sindresorhus/lowercase-keys.git
|
||||
lpad-align 1.1.2 MIT https://github.com/kevva/lpad-align.git
|
||||
lunr 0.7.2 MIT https://github.com/olivernn/lunr.js.git
|
||||
make-dir 2.1.0 MIT https://github.com/sindresorhus/make-dir.git
|
||||
make-dir 1.3.0 MIT https://github.com/sindresorhus/make-dir.git
|
||||
make-dir 3.1.0 MIT https://github.com/sindresorhus/make-dir.git
|
||||
make-dir 2.1.0 MIT https://github.com/sindresorhus/make-dir.git
|
||||
map-age-cleaner 0.1.3 MIT https://github.com/SamVerschueren/map-age-cleaner.git
|
||||
map-cache 0.2.2 MIT https://github.com/jonschlinkert/map-cache.git
|
||||
map-obj 1.0.1 MIT https://github.com/sindresorhus/map-obj.git
|
||||
@ -729,21 +800,23 @@ mimic-fn 1.2.0
|
||||
mimic-response 1.0.1 MIT https://github.com/sindresorhus/mimic-response.git
|
||||
mini-css-extract-plugin 0.5.0 MIT https://github.com/webpack-contrib/mini-css-extract-plugin.git
|
||||
minimalistic-crypto-utils 1.0.1 MIT git+ssh://git@github.com/indutny/minimalistic-crypto-utils.git
|
||||
minimist 1.2.5 MIT git://github.com/substack/minimist.git
|
||||
minimist 0.0.10 MIT git://github.com/substack/minimist.git
|
||||
minimist 1.2.5 MIT git://github.com/substack/minimist.git
|
||||
mixin-deep 1.3.2 MIT https://github.com/jonschlinkert/mixin-deep.git
|
||||
mkdirp 0.5.5 MIT https://github.com/substack/node-mkdirp.git
|
||||
module-deps 6.2.2 MIT git://github.com/browserify/module-deps.git
|
||||
moment 2.26.0 MIT https://github.com/moment/moment.git
|
||||
moment-timezone 0.5.31 MIT https://github.com/moment/moment-timezone.git
|
||||
moment 2.27.0 MIT https://github.com/moment/moment.git
|
||||
moment-timezone 0.4.1 MIT https://github.com/moment/moment-timezone.git
|
||||
moment-timezone 0.5.31 MIT https://github.com/moment/moment-timezone.git
|
||||
mozjpeg 6.0.1 MIT https://github.com/imagemin/mozjpeg-bin.git
|
||||
ms 2.1.2 MIT https://github.com/zeit/ms.git
|
||||
ms 2.0.0 MIT https://github.com/zeit/ms.git
|
||||
ms 2.1.1 MIT https://github.com/zeit/ms.git
|
||||
ms 2.0.0 MIT https://github.com/zeit/ms.git
|
||||
nan 2.14.1 MIT git://github.com/nodejs/nan.git
|
||||
nanomatch 1.2.13 MIT https://github.com/micromatch/nanomatch.git
|
||||
natural-compare 1.4.0 MIT git://github.com/litejs/natural-compare-lite.git
|
||||
nearley 2.19.5 MIT https://github.com/hardmath123/nearley.git
|
||||
neatequal 1.0.0 MIT git@github.com:nfroidure/neatequal.git
|
||||
negotiator 0.6.2 MIT https://github.com/jshttp/negotiator.git
|
||||
neo-async 2.6.1 MIT git@github.com:suguru03/neo-async.git
|
||||
@ -762,9 +835,12 @@ num2fraction 1.2.2
|
||||
object-assign 4.1.1 MIT https://github.com/sindresorhus/object-assign.git
|
||||
object-copy 0.1.0 MIT https://github.com/jonschlinkert/object-copy.git
|
||||
object-inspect 1.7.0 MIT git://github.com/substack/object-inspect.git
|
||||
object-is 1.1.2 MIT git://github.com/es-shims/object-is.git
|
||||
object-keys 1.1.1 MIT git://github.com/ljharb/object-keys.git
|
||||
object-visit 1.0.1 MIT https://github.com/jonschlinkert/object-visit.git
|
||||
object.assign 4.1.0 MIT git://github.com/ljharb/object.assign.git
|
||||
object.entries 1.1.2 MIT git://github.com/es-shims/Object.entries.git
|
||||
object.fromentries 2.0.2 MIT git://github.com/es-shims/Object.fromEntries.git
|
||||
object.getownpropertydescriptors 2.1.0 MIT git://github.com/es-shims/object.getownpropertydescriptors.git
|
||||
object.pick 1.3.0 MIT https://github.com/jonschlinkert/object.pick.git
|
||||
object.values 1.1.1 MIT git://github.com/es-shims/Object.values.git
|
||||
@ -788,11 +864,11 @@ p-event 2.3.1
|
||||
p-finally 1.0.0 MIT https://github.com/sindresorhus/p-finally.git
|
||||
p-is-promise 1.1.0 MIT https://github.com/sindresorhus/p-is-promise.git
|
||||
p-is-promise 2.1.0 MIT https://github.com/sindresorhus/p-is-promise.git
|
||||
p-limit 1.3.0 MIT https://github.com/sindresorhus/p-limit.git
|
||||
p-limit 2.3.0 MIT https://github.com/sindresorhus/p-limit.git
|
||||
p-limit 1.3.0 MIT https://github.com/sindresorhus/p-limit.git
|
||||
p-locate 2.0.0 MIT https://github.com/sindresorhus/p-locate.git
|
||||
p-locate 4.1.0 MIT https://github.com/sindresorhus/p-locate.git
|
||||
p-locate 3.0.0 MIT https://github.com/sindresorhus/p-locate.git
|
||||
p-locate 2.0.0 MIT https://github.com/sindresorhus/p-locate.git
|
||||
p-map 3.0.0 MIT https://github.com/sindresorhus/p-map.git
|
||||
p-map-series 1.0.0 MIT https://github.com/sindresorhus/p-map-series.git
|
||||
p-pipe 1.2.0 MIT https://github.com/sindresorhus/p-pipe.git
|
||||
@ -804,18 +880,19 @@ p-try 2.2.0
|
||||
parallel-transform 1.2.0 MIT git://github.com/mafintosh/parallel-transform
|
||||
parent-module 1.0.1 MIT https://github.com/sindresorhus/parent-module.git
|
||||
parents 1.0.1 MIT git://github.com/substack/node-parents.git
|
||||
parse-json 4.0.0 MIT https://github.com/sindresorhus/parse-json.git
|
||||
parse-json 2.2.0 MIT https://github.com/sindresorhus/parse-json.git
|
||||
parse-json 4.0.0 MIT https://github.com/sindresorhus/parse-json.git
|
||||
parse-passwd 1.0.0 MIT https://github.com/doowb/parse-passwd.git
|
||||
parse5 3.0.3 MIT git://github.com/inikulin/parse5.git
|
||||
parseqs 0.0.5 MIT https://github.com/get/querystring.git
|
||||
parseuri 0.0.5 MIT https://github.com/get/parseuri.git
|
||||
parseurl 1.3.3 MIT https://github.com/pillarjs/parseurl.git
|
||||
pascalcase 0.1.1 MIT https://github.com/jonschlinkert/pascalcase.git
|
||||
path-browserify 0.0.1 MIT git://github.com/substack/path-browserify.git
|
||||
path-dirname 1.0.2 MIT https://github.com/es128/path-dirname.git
|
||||
path-exists 3.0.0 MIT https://github.com/sindresorhus/path-exists.git
|
||||
path-exists 4.0.0 MIT https://github.com/sindresorhus/path-exists.git
|
||||
path-exists 2.1.0 MIT https://github.com/sindresorhus/path-exists.git
|
||||
path-exists 4.0.0 MIT https://github.com/sindresorhus/path-exists.git
|
||||
path-exists 3.0.0 MIT https://github.com/sindresorhus/path-exists.git
|
||||
path-is-absolute 1.0.1 MIT https://github.com/sindresorhus/path-is-absolute.git
|
||||
path-key 2.0.1 MIT https://github.com/sindresorhus/path-key.git
|
||||
path-parse 1.0.6 MIT https://github.com/jbgutierrez/path-parse.git
|
||||
@ -825,10 +902,11 @@ path-type 3.0.0
|
||||
path-type 1.1.0 MIT https://github.com/sindresorhus/path-type.git
|
||||
pbkdf2 3.1.1 MIT https://github.com/crypto-browserify/pbkdf2.git
|
||||
pend 1.2.0 MIT git://github.com/andrewrk/node-pend.git
|
||||
performance-now 2.1.0 MIT git://github.com/braveg1rl/performance-now.git
|
||||
picomatch 2.2.2 MIT https://github.com/micromatch/picomatch.git
|
||||
pify 2.3.0 MIT https://github.com/sindresorhus/pify.git
|
||||
pify 4.0.1 MIT https://github.com/sindresorhus/pify.git
|
||||
pify 3.0.0 MIT https://github.com/sindresorhus/pify.git
|
||||
pify 4.0.1 MIT https://github.com/sindresorhus/pify.git
|
||||
pinkie 2.0.4 MIT https://github.com/floatdrop/pinkie.git
|
||||
pinkie-promise 2.0.1 MIT https://github.com/floatdrop/pinkie-promise.git
|
||||
pkg-dir 4.2.0 MIT https://github.com/sindresorhus/pkg-dir.git
|
||||
@ -837,8 +915,8 @@ pkg-up 2.0.0
|
||||
pngquant-bin 5.0.2 MIT https://github.com/imagemin/pngquant-bin.git
|
||||
popper.js 1.16.1 MIT git+https://github.com/FezVrasta/popper.js.git
|
||||
posix-character-classes 0.1.1 MIT https://github.com/jonschlinkert/posix-character-classes.git
|
||||
postcss 7.0.32 MIT https://github.com/postcss/postcss.git
|
||||
postcss 7.0.27 MIT https://github.com/postcss/postcss.git
|
||||
postcss 7.0.32 MIT https://github.com/postcss/postcss.git
|
||||
postcss-calc 7.0.2 MIT https://github.com/postcss/postcss-calc.git
|
||||
postcss-colormin 4.0.3 MIT https://github.com/cssnano/cssnano.git
|
||||
postcss-convert-values 4.0.1 MIT https://github.com/cssnano/cssnano.git
|
||||
@ -867,8 +945,8 @@ postcss-normalize-whitespace 4.0.2
|
||||
postcss-ordered-values 4.1.2 MIT https://github.com/cssnano/cssnano.git
|
||||
postcss-reduce-initial 4.0.3 MIT https://github.com/cssnano/cssnano.git
|
||||
postcss-reduce-transforms 4.0.2 MIT https://github.com/cssnano/cssnano.git
|
||||
postcss-selector-parser 3.1.2 MIT https://github.com/postcss/postcss-selector-parser.git
|
||||
postcss-selector-parser 6.0.2 MIT https://github.com/postcss/postcss-selector-parser.git
|
||||
postcss-selector-parser 3.1.2 MIT https://github.com/postcss/postcss-selector-parser.git
|
||||
postcss-svgo 4.0.2 MIT https://github.com/cssnano/cssnano.git
|
||||
postcss-unique-selectors 4.0.1 MIT https://github.com/cssnano/cssnano.git
|
||||
postcss-value-parser 4.1.0 MIT https://github.com/TrySound/postcss-value-parser.git
|
||||
@ -880,40 +958,50 @@ private 0.1.8
|
||||
process 0.11.10 MIT git://github.com/shtylman/node-process.git
|
||||
process-nextick-args 2.0.1 MIT https://github.com/calvinmetcalf/process-nextick-args.git
|
||||
progress 2.0.3 MIT git://github.com/visionmedia/node-progress
|
||||
prop-types 15.7.2 MIT https://github.com/facebook/prop-types.git
|
||||
prop-types-exact 1.2.0 MIT git+https://github.com/airbnb/prop-types-exact.git
|
||||
proxy-addr 2.0.6 MIT https://github.com/jshttp/proxy-addr.git
|
||||
prr 1.0.1 MIT https://github.com/rvagg/prr.git
|
||||
public-encrypt 4.0.3 MIT https://github.com/crypto-browserify/publicEncrypt.git
|
||||
pump 3.0.0 MIT git://github.com/mafintosh/pump.git
|
||||
pump 2.0.1 MIT git://github.com/mafintosh/pump.git
|
||||
pump 3.0.0 MIT git://github.com/mafintosh/pump.git
|
||||
pumpify 1.5.1 MIT git://github.com/mafintosh/pumpify
|
||||
punycode 1.4.1 MIT https://github.com/bestiejs/punycode.js.git
|
||||
punycode 1.3.2 MIT https://github.com/bestiejs/punycode.js.git
|
||||
punycode 2.1.1 MIT https://github.com/bestiejs/punycode.js.git
|
||||
punycode 1.4.1 MIT https://github.com/bestiejs/punycode.js.git
|
||||
q 1.5.1 MIT git://github.com/kriskowal/q.git
|
||||
qjobs 1.2.0 MIT git://github.com/franck34/qjobs.git
|
||||
query-string 5.1.1 MIT https://github.com/sindresorhus/query-string.git
|
||||
querystring 0.2.0 MIT git://github.com/Gozala/querystring.git
|
||||
querystring-es3 0.2.1 MIT git://github.com/mike-spainhower/querystring.git
|
||||
raf 3.4.1 MIT git://github.com/chrisdickinson/raf.git
|
||||
randexp 0.4.6 MIT git://github.com/fent/randexp.js.git
|
||||
randombytes 2.1.0 MIT git@github.com:crypto-browserify/randombytes.git
|
||||
randomfill 1.0.4 MIT https://github.com/crypto-browserify/randomfill.git
|
||||
range-parser 1.2.1 MIT https://github.com/jshttp/range-parser.git
|
||||
raw-body 2.4.0 MIT https://github.com/stream-utils/raw-body.git
|
||||
raw-loader 1.0.0 MIT https://github.com/webpack-contrib/raw-loader.git
|
||||
react 16.13.1 MIT https://github.com/facebook/react.git
|
||||
react-dom 16.13.1 MIT https://github.com/facebook/react.git
|
||||
react-is 16.13.1 MIT https://github.com/facebook/react.git
|
||||
react-test-renderer 16.13.1 MIT https://github.com/facebook/react.git
|
||||
read-only-stream 2.0.0 MIT git://github.com/substack/read-only-stream.git
|
||||
read-pkg 1.1.0 MIT https://github.com/sindresorhus/read-pkg.git
|
||||
read-pkg-up 1.0.1 MIT https://github.com/sindresorhus/read-pkg-up.git
|
||||
readable-stream 1.1.14 MIT git://github.com/isaacs/readable-stream
|
||||
readable-stream 3.6.0 MIT git://github.com/nodejs/readable-stream
|
||||
readable-stream 2.3.7 MIT git://github.com/nodejs/readable-stream
|
||||
readdirp 2.2.1 MIT git://github.com/paulmillr/readdirp.git
|
||||
readable-stream 3.6.0 MIT git://github.com/nodejs/readable-stream
|
||||
readdirp 3.4.0 MIT git://github.com/paulmillr/readdirp.git
|
||||
readdirp 2.2.1 MIT git://github.com/paulmillr/readdirp.git
|
||||
redent 1.0.0 MIT https://github.com/sindresorhus/redent.git
|
||||
reflect.ownkeys 0.2.0 MIT https://github.com/glenjamin/Reflect.ownKeys.git
|
||||
regenerate 1.4.1 MIT https://github.com/mathiasbynens/regenerate.git
|
||||
regenerate-unicode-properties 8.2.0 MIT https://github.com/mathiasbynens/regenerate-unicode-properties.git
|
||||
regenerator-runtime 0.11.1 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime
|
||||
regenerator-runtime 0.13.5 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime
|
||||
regenerator-transform 0.14.4 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-transform
|
||||
regex-not 1.0.2 MIT https://github.com/jonschlinkert/regex-not.git
|
||||
regexp.prototype.flags 1.3.0 MIT git://github.com/es-shims/RegExp.prototype.flags.git
|
||||
regexpp 2.0.1 MIT git+https://github.com/mysticatea/regexpp.git
|
||||
regexpu-core 4.7.0 MIT https://github.com/mathiasbynens/regexpu-core.git
|
||||
regexpu-core 2.0.0 MIT https://github.com/mathiasbynens/regexpu-core.git
|
||||
@ -926,12 +1014,12 @@ replace-ext 1.0.1
|
||||
require-directory 2.1.1 MIT git://github.com/troygoode/node-require-directory.git
|
||||
requirejs 2.3.6 MIT https://github.com/jrburke/r.js.git
|
||||
requires-port 1.0.0 MIT https://github.com/unshiftio/requires-port
|
||||
resolve 1.1.7 MIT git://github.com/substack/node-resolve.git
|
||||
resolve 1.17.0 MIT git://github.com/browserify/resolve.git
|
||||
resolve 1.1.7 MIT git://github.com/substack/node-resolve.git
|
||||
resolve-cwd 2.0.0 MIT https://github.com/sindresorhus/resolve-cwd.git
|
||||
resolve-dir 1.0.1 MIT https://github.com/jonschlinkert/resolve-dir.git
|
||||
resolve-from 3.0.0 MIT https://github.com/sindresorhus/resolve-from.git
|
||||
resolve-from 4.0.0 MIT https://github.com/sindresorhus/resolve-from.git
|
||||
resolve-from 3.0.0 MIT https://github.com/sindresorhus/resolve-from.git
|
||||
resolve-url 0.2.1 MIT https://github.com/lydell/resolve-url.git
|
||||
responselike 1.0.2 MIT https://github.com/lukechilds/responselike.git
|
||||
restore-cursor 2.0.0 MIT https://github.com/sindresorhus/restore-cursor.git
|
||||
@ -941,13 +1029,14 @@ rgb-regex 1.0.1
|
||||
rgba-regex 1.0.0 MIT https://github.com/johnotander/rgba-regex.git
|
||||
ripemd160 2.0.2 MIT https://github.com/crypto-browserify/ripemd160
|
||||
run-async 2.4.1 MIT https://github.com/SBoudrias/run-async.git
|
||||
safe-buffer 5.2.1 MIT git://github.com/feross/safe-buffer.git
|
||||
safe-buffer 5.1.2 MIT git://github.com/feross/safe-buffer.git
|
||||
safe-buffer 5.2.1 MIT git://github.com/feross/safe-buffer.git
|
||||
safe-regex 1.1.0 MIT git://github.com/substack/safe-regex.git
|
||||
safer-buffer 2.1.2 MIT git+https://github.com/ChALkeR/safer-buffer.git
|
||||
sass 1.26.8 MIT https://github.com/sass/dart-sass
|
||||
sass-loader 7.3.1 MIT https://github.com/webpack-contrib/sass-loader.git
|
||||
sass-resources-loader 2.0.3 MIT https://github.com/shakacode/sass-resources-loader.git
|
||||
scheduler 0.19.1 MIT https://github.com/facebook/react.git
|
||||
schema-utils 2.7.0 MIT https://github.com/webpack/schema-utils.git
|
||||
schema-utils 1.0.0 MIT https://github.com/webpack-contrib/schema-utils
|
||||
seek-bzip 1.0.5 MIT https://github.com/cscott/seek-bzip.git
|
||||
@ -964,6 +1053,7 @@ shebang-command 1.2.0
|
||||
shebang-regex 1.0.0 MIT https://github.com/sindresorhus/shebang-regex.git
|
||||
shell-quote 1.7.2 MIT http://github.com/substack/node-shell-quote.git
|
||||
shim-loader 1.0.1 MIT https://github.com/zinserjan/shim-loader
|
||||
side-channel 1.0.2 MIT git+https://github.com/ljharb/side-channel.git
|
||||
simple-concat 1.0.0 MIT git://github.com/feross/simple-concat.git
|
||||
simple-swizzle 0.2.2 MIT https://github.com/qix-/node-simple-swizzle.git
|
||||
slash 1.0.0 MIT https://github.com/sindresorhus/slash.git
|
||||
@ -980,8 +1070,8 @@ socket.io-parser 3.2.0
|
||||
sort-keys 1.1.2 MIT https://github.com/sindresorhus/sort-keys.git
|
||||
sort-keys 2.0.0 MIT https://github.com/sindresorhus/sort-keys.git
|
||||
sort-keys-length 1.0.1 MIT https://github.com/kevva/sort-keys-length.git
|
||||
source-list-map 2.0.1 MIT https://github.com/webpack/source-list-map.git
|
||||
source-list-map 1.1.2 MIT https://github.com/webpack/source-list-map.git
|
||||
source-list-map 2.0.1 MIT https://github.com/webpack/source-list-map.git
|
||||
source-map-resolve 0.5.3 MIT https://github.com/lydell/source-map-resolve.git
|
||||
source-map-support 0.5.19 MIT https://github.com/evanw/node-source-map-support
|
||||
source-map-url 0.4.0 MIT https://github.com/lydell/source-map-url.git
|
||||
@ -1000,18 +1090,20 @@ stream-shift 1.0.1
|
||||
stream-splicer 2.0.1 MIT git://github.com/browserify/stream-splicer.git
|
||||
streamroller 1.0.6 MIT https://github.com/nomiddlename/streamroller.git
|
||||
strict-uri-encode 1.1.0 MIT https://github.com/kevva/strict-uri-encode.git
|
||||
string_decoder 1.3.0 MIT git://github.com/nodejs/string_decoder.git
|
||||
string_decoder 1.1.1 MIT git://github.com/nodejs/string_decoder.git
|
||||
string_decoder 0.10.31 MIT git://github.com/rvagg/string_decoder.git
|
||||
string-width 3.1.0 MIT https://github.com/sindresorhus/string-width.git
|
||||
string_decoder 1.1.1 MIT git://github.com/nodejs/string_decoder.git
|
||||
string_decoder 1.3.0 MIT git://github.com/nodejs/string_decoder.git
|
||||
string-width 2.1.1 MIT https://github.com/sindresorhus/string-width.git
|
||||
string-width 3.1.0 MIT https://github.com/sindresorhus/string-width.git
|
||||
string.fromcodepoint 0.2.1 MIT https://github.com/mathiasbynens/String.fromCodePoint.git
|
||||
string.prototype.codepointat 0.2.1 MIT https://github.com/mathiasbynens/String.prototype.codePointAt.git
|
||||
string.prototype.matchall 4.0.2 MIT git+https://github.com/ljharb/String.prototype.matchAll.git
|
||||
string.prototype.trim 1.2.1 MIT git://github.com/es-shims/String.prototype.trim.git
|
||||
string.prototype.trimend 1.0.1 MIT git://github.com/es-shims/String.prototype.trimEnd.git
|
||||
string.prototype.trimstart 1.0.1 MIT git://github.com/es-shims/String.prototype.trimStart.git
|
||||
strip-ansi 3.0.1 MIT https://github.com/chalk/strip-ansi.git
|
||||
strip-ansi 5.2.0 MIT https://github.com/chalk/strip-ansi.git
|
||||
strip-ansi 4.0.0 MIT https://github.com/chalk/strip-ansi.git
|
||||
strip-ansi 3.0.1 MIT https://github.com/chalk/strip-ansi.git
|
||||
strip-bom 2.0.0 MIT https://github.com/sindresorhus/strip-bom.git
|
||||
strip-dirs 2.1.0 MIT https://github.com/shinnn/node-strip-dirs.git
|
||||
strip-eof 1.0.0 MIT https://github.com/sindresorhus/strip-eof.git
|
||||
@ -1021,10 +1113,10 @@ strip-outer 1.0.1
|
||||
style-loader 0.23.1 MIT https://github.com/webpack-contrib/style-loader.git
|
||||
stylehacks 4.0.3 MIT https://github.com/cssnano/cssnano.git
|
||||
subarg 1.0.0 MIT git://github.com/substack/subarg.git
|
||||
supports-color 5.5.0 MIT https://github.com/chalk/supports-color.git
|
||||
supports-color 2.0.0 MIT https://github.com/chalk/supports-color.git
|
||||
supports-color 6.1.0 MIT https://github.com/chalk/supports-color.git
|
||||
supports-color 7.1.0 MIT https://github.com/chalk/supports-color.git
|
||||
supports-color 6.1.0 MIT https://github.com/chalk/supports-color.git
|
||||
supports-color 5.5.0 MIT https://github.com/chalk/supports-color.git
|
||||
svg-pathdata 5.0.5 MIT https://github.com/nfroidure/svg-pathdata.git
|
||||
svg2ttf 4.3.0 MIT https://github.com/fontello/svg2ttf.git
|
||||
svgicons2svgfont 9.1.1 MIT git://github.com/nfroidure/svgicons2svgfont
|
||||
@ -1037,21 +1129,21 @@ temp-dir 1.0.0
|
||||
tempfile 2.0.0 MIT https://github.com/sindresorhus/tempfile.git
|
||||
tempusdominus-bootstrap-4 5.1.2 MIT https://github.com/tempusdominus/bootstrap-4.git
|
||||
tempusdominus-core 5.0.3 MIT https://github.com/tempusdominus/core.git
|
||||
terser-webpack-plugin 2.3.7 MIT https://github.com/webpack-contrib/terser-webpack-plugin.git
|
||||
terser-webpack-plugin 1.4.4 MIT https://github.com/webpack-contrib/terser-webpack-plugin.git
|
||||
terser-webpack-plugin 2.3.7 MIT https://github.com/webpack-contrib/terser-webpack-plugin.git
|
||||
text-table 0.2.0 MIT git://github.com/substack/text-table.git
|
||||
through 2.3.8 MIT https://github.com/dominictarr/through.git
|
||||
through2 2.0.5 MIT https://github.com/rvagg/through2.git
|
||||
timed-out 4.0.1 MIT https://github.com/floatdrop/timed-out.git
|
||||
timers-browserify 1.4.2 MIT git://github.com/jryans/timers-browserify.git
|
||||
timers-browserify 2.0.11 MIT git://github.com/jryans/timers-browserify.git
|
||||
timers-browserify 1.4.2 MIT git://github.com/jryans/timers-browserify.git
|
||||
timsort 0.3.0 MIT https://github.com/mziccard/node-timsort.git
|
||||
tmp 0.0.33 MIT https://github.com/raszi/node-tmp.git
|
||||
to-array 0.1.4 MIT git://github.com/Raynos/to-array.git
|
||||
to-arraybuffer 1.0.1 MIT git://github.com/jhiesey/to-arraybuffer.git
|
||||
to-buffer 1.1.1 MIT https://github.com/mafintosh/to-buffer.git
|
||||
to-fast-properties 2.0.0 MIT https://github.com/sindresorhus/to-fast-properties.git
|
||||
to-fast-properties 1.0.3 MIT https://github.com/sindresorhus/to-fast-properties.git
|
||||
to-fast-properties 2.0.0 MIT https://github.com/sindresorhus/to-fast-properties.git
|
||||
to-object-path 0.3.0 MIT https://github.com/jonschlinkert/to-object-path.git
|
||||
to-regex 3.0.2 MIT https://github.com/jonschlinkert/to-regex.git
|
||||
to-regex-range 2.1.1 MIT https://github.com/micromatch/to-regex-range.git
|
||||
@ -1091,9 +1183,9 @@ url-parse-lax 1.0.0
|
||||
url-to-options 1.0.1 MIT https://github.com/stevenvachon/url-to-options.git
|
||||
use 3.1.1 MIT https://github.com/jonschlinkert/use.git
|
||||
useragent 2.3.0 MIT http://github.com/3rd-Eden/useragent.git
|
||||
util 0.10.4 MIT git://github.com/defunctzombie/node-util
|
||||
util 0.10.3 MIT git://github.com/defunctzombie/node-util
|
||||
util 0.11.1 MIT git://github.com/defunctzombie/node-util
|
||||
util 0.10.3 MIT git://github.com/defunctzombie/node-util
|
||||
util 0.10.4 MIT git://github.com/defunctzombie/node-util
|
||||
util-deprecate 1.0.2 MIT git://github.com/TooTallNate/util-deprecate.git
|
||||
util.promisify 1.0.1 MIT git+https://github.com/ljharb/util.promisify.git
|
||||
utils-merge 1.0.1 MIT git://github.com/jaredhanson/utils-merge.git
|
||||
@ -1112,8 +1204,8 @@ webpack-cli 3.3.11
|
||||
webpack-dev-middleware 3.7.2 MIT https://github.com/webpack/webpack-dev-middleware.git
|
||||
webpack-log 2.0.0 MIT https://github.com/webpack-contrib/webpack-log.git
|
||||
webpack-require-from 1.8.1 MIT https://github.com/agoldis/webpack-require-from.git
|
||||
webpack-sources 0.2.3 MIT git+https://github.com/webpack/webpack-sources.git
|
||||
webpack-sources 1.4.3 MIT git+https://github.com/webpack/webpack-sources.git
|
||||
webpack-sources 0.2.3 MIT git+https://github.com/webpack/webpack-sources.git
|
||||
wkx 0.4.8 MIT http://github.com/cschwarz/wkx.git
|
||||
word-wrap 1.2.3 MIT https://github.com/jonschlinkert/word-wrap.git
|
||||
wordwrap 0.0.3 MIT git://github.com/substack/node-wordwrap.git
|
||||
@ -1134,8 +1226,8 @@ anymatch 2.0.0
|
||||
aproba 1.2.0 ISC https://github.com/iarna/aproba
|
||||
boolbase 1.0.0 ISC https://github.com/fb55/boolbase
|
||||
browserify-sign 4.2.0 ISC https://github.com/crypto-browserify/browserify-sign.git
|
||||
cacache 12.0.4 ISC https://github.com/npm/cacache
|
||||
cacache 13.0.1 ISC https://github.com/npm/cacache
|
||||
cacache 12.0.4 ISC https://github.com/npm/cacache
|
||||
chownr 1.1.4 ISC git://github.com/isaacs/chownr.git
|
||||
cli-width 2.2.1 ISC git@github.com:knownasilya/cli-width.git
|
||||
cliui 5.0.0 ISC http://github.com/yargs/cliui.git
|
||||
@ -1157,8 +1249,8 @@ icss-utils 4.1.1
|
||||
infer-owner 1.0.4 ISC https://github.com/npm/infer-owner
|
||||
inflight 1.0.6 ISC https://github.com/npm/inflight.git
|
||||
inherits 2.0.1 ISC git://github.com/isaacs/inherits
|
||||
inherits 2.0.3 ISC git://github.com/isaacs/inherits
|
||||
inherits 2.0.4 ISC git://github.com/isaacs/inherits
|
||||
inherits 2.0.3 ISC git://github.com/isaacs/inherits
|
||||
ini 1.3.5 ISC git://github.com/isaacs/ini.git
|
||||
is-resolvable 1.1.0 ISC https://github.com/shinnn/is-resolvable.git
|
||||
isexe 2.0.0 ISC git+https://github.com/isaacs/isexe.git
|
||||
@ -1187,9 +1279,9 @@ rimraf 2.7.1
|
||||
rimraf 2.6.3 ISC git://github.com/isaacs/rimraf.git
|
||||
run-queue 1.0.3 ISC git+https://github.com/iarna/run-queue.git
|
||||
sax 1.2.4 ISC git://github.com/isaacs/sax-js.git
|
||||
semver 7.0.0 ISC https://github.com/npm/node-semver
|
||||
semver 6.3.0 ISC https://github.com/npm/node-semver
|
||||
semver 5.7.1 ISC https://github.com/npm/node-semver
|
||||
semver 7.0.0 ISC https://github.com/npm/node-semver
|
||||
set-blocking 2.0.0 ISC git+https://github.com/yargs/set-blocking.git
|
||||
setprototypeof 1.1.1 ISC https://github.com/wesleytodd/setprototypeof.git
|
||||
signal-exit 3.0.3 ISC https://github.com/tapjs/signal-exit.git
|
||||
@ -1211,7 +1303,9 @@ duplexer3 0.1.4
|
||||
esquery 1.3.1 BSD-3-Clause https://github.com/estools/esquery.git
|
||||
filesize 3.6.1 BSD-3-Clause git://github.com/avoidwork/filesize.js.git
|
||||
ieee754 1.1.13 BSD-3-Clause git://github.com/feross/ieee754.git
|
||||
moo 0.5.1 BSD-3-Clause https://github.com/tjvr/moo.git
|
||||
qs 6.7.0 BSD-3-Clause https://github.com/ljharb/qs.git
|
||||
rst-selector-parser 2.2.3 BSD-3-Clause https://github.com/aweary/rst-selector-parser
|
||||
serialize-javascript 3.1.0 BSD-3-Clause git+https://github.com/yahoo/serialize-javascript.git
|
||||
serialize-javascript 2.1.2 BSD-3-Clause git+https://github.com/yahoo/serialize-javascript.git
|
||||
source-map 0.7.3 BSD-3-Clause http://github.com/mozilla/source-map.git
|
||||
@ -1225,6 +1319,7 @@ table 5.4.6
|
||||
acorn-node 1.8.2 Apache-2.0 https://github.com/browserify/acorn-node.git
|
||||
bootstrap-datepicker 1.9.0 Apache-2.0 https://github.com/uxsolutions/bootstrap-datepicker.git
|
||||
dash-ast 1.0.0 Apache-2.0 https://github.com/goto-bus-stop/dash-ast.git
|
||||
doctrine 2.1.0 Apache-2.0 https://github.com/eslint/doctrine.git
|
||||
doctrine 3.0.0 Apache-2.0 https://github.com/eslint/doctrine.git
|
||||
ejs 2.7.4 Apache-2.0 git://github.com/mde/ejs.git
|
||||
ejs 3.0.2 Apache-2.0 git://github.com/mde/ejs.git
|
||||
@ -1249,11 +1344,16 @@ object-component 0.0.3
|
||||
precond 0.2.3 MIT* https://github.com/MathieuTurcotte/node-precond.git
|
||||
webcabin-docker 2.2.4-dev MIT* Unknown
|
||||
caniuse-lite 1.0.30001081 CC-BY-4.0 https://github.com/ben-eb/caniuse-lite.git
|
||||
css-select 1.2.0 BSD-2-Clause git://github.com/fb55/css-select.git
|
||||
css-select 2.1.0 BSD-2-Clause git://github.com/fb55/css-select.git
|
||||
css-what 3.3.0 BSD-2-Clause https://github.com/fb55/css-what
|
||||
css-what 2.1.3 BSD-2-Clause https://github.com/fb55/css-what
|
||||
domelementtype 2.0.1 BSD-2-Clause git://github.com/fb55/domelementtype.git
|
||||
domelementtype 1.3.1 BSD-2-Clause git://github.com/fb55/domelementtype.git
|
||||
domhandler 2.4.2 BSD-2-Clause git://github.com/fb55/DomHandler.git
|
||||
domutils 1.7.0 BSD-2-Clause git://github.com/FB55/domutils.git
|
||||
domutils 1.5.1 BSD-2-Clause git://github.com/FB55/domutils.git
|
||||
entities 1.1.2 BSD-2-Clause git://github.com/fb55/entities.git
|
||||
entities 2.0.3 BSD-2-Clause git://github.com/fb55/entities.git
|
||||
eslint-scope 4.0.3 BSD-2-Clause https://github.com/eslint/eslint-scope.git
|
||||
espree 5.0.1 BSD-2-Clause https://github.com/eslint/espree.git
|
||||
@ -1267,8 +1367,8 @@ leaflet 1.6.0
|
||||
mississippi 3.0.0 BSD-2-Clause git+https://github.com/maxogden/mississippi.git
|
||||
normalize-package-data 2.5.0 BSD-2-Clause git://github.com/npm/normalize-package-data.git
|
||||
nth-check 1.0.2 BSD-2-Clause https://github.com/fb55/nth-check
|
||||
regjsparser 0.1.5 BSD-2-Clause git@github.com:jviereck/regjsparser.git
|
||||
regjsparser 0.6.4 BSD-2-Clause git@github.com:jviereck/regjsparser.git
|
||||
regjsparser 0.1.5 BSD-2-Clause git@github.com:jviereck/regjsparser.git
|
||||
terser 4.8.0 BSD-2-Clause https://github.com/terser/terser
|
||||
uri-js 4.2.2 BSD-2-Clause http://github.com/garycourt/uri-js
|
||||
FileSaver 0.10.0 UNKNOWN Unknown
|
||||
@ -1277,6 +1377,7 @@ font-awesome 4.7.0
|
||||
is-cwebp-readable 2.0.1 CC0-1.0 https://github.com/shinnn/is-cwebp-readable.git
|
||||
mdn-data 2.0.6 CC0-1.0 https://github.com/mdn/data.git
|
||||
mdn-data 2.0.4 CC0-1.0 https://github.com/mdn/data.git
|
||||
railroad-diagrams 1.0.0 CC0-1.0 https://github.com/tabatkins/railroad-diagrams.git
|
||||
spdx-license-ids 3.0.5 CC0-1.0 https://github.com/shinnn/spdx-license-ids.git
|
||||
jsonify 0.0.0 Public Domain http://github.com/substack/jsonify.git
|
||||
mousetrap 1.6.5 Apache-2.0 WITH LLVM-exception git://github.com/ccampbell/mousetrap.git
|
||||
@ -1290,5 +1391,5 @@ tablesorter 2.31.3
|
||||
tslib 1.13.0 0BSD https://github.com/Microsoft/tslib.git
|
||||
xmldom 0.1.31 (LGPL-2.0 or MIT) git://github.com/xmldom/xmldom.git
|
||||
|
||||
1234 dependencies listed.
|
||||
1335 dependencies listed.
|
||||
|
||||
|
@ -9,7 +9,8 @@ This release contains a number of bug fixes and new features since the release o
|
||||
New features
|
||||
************
|
||||
|
||||
| `Issue #5610 <https://redmine.postgresql.org/issues/5610>`_ - Add a --yes command line option to setup-web.sh to allow non-interactive use.
|
||||
| `Issue #3904 <https://redmine.postgresql.org/issues/3904>`_ - Replace charting library Flotr2 with ChartJS using React.
|
||||
| `Issue #5610 <https://redmine.postgresql.org/issues/5610>`_ - Add a --yes command line option to setup-web.sh to allow non-interactive use.
|
||||
|
||||
Housekeeping
|
||||
************
|
||||
|
@ -16,12 +16,17 @@ module.exports = {
|
||||
},
|
||||
'extends': [
|
||||
'eslint:recommended',
|
||||
'plugin:react/recommended',
|
||||
],
|
||||
'parserOptions': {
|
||||
'ecmaVersion': 2018,
|
||||
'ecmaFeatures': {
|
||||
'jsx': true
|
||||
},
|
||||
'sourceType': 'module',
|
||||
},
|
||||
'plugins': [
|
||||
'react'
|
||||
],
|
||||
'globals': {
|
||||
'_': true,
|
||||
@ -49,4 +54,9 @@ module.exports = {
|
||||
// We need to exclude below for RegEx case
|
||||
"no-useless-escape": 0,
|
||||
},
|
||||
'settings': {
|
||||
'react': {
|
||||
'version': 'detect',
|
||||
},
|
||||
}
|
||||
};
|
||||
|
@ -16,12 +16,16 @@
|
||||
"copy-webpack-plugin": "^5.1.0",
|
||||
"core-js": "^3.2.1",
|
||||
"cross-env": "^5.2.0",
|
||||
"enzyme": "^3.11.0",
|
||||
"enzyme-adapter-react-16": "^1.15.2",
|
||||
"eslint": "5.15.1",
|
||||
"eslint-plugin-react": "^7.20.3",
|
||||
"file-loader": "^3.0.1",
|
||||
"iconfont-webpack-plugin": "^4.2.1",
|
||||
"image-webpack-loader": "^4.6.0",
|
||||
"is-docker": "^1.1.0",
|
||||
"jasmine-core": "~3.3.0",
|
||||
"jasmine-enzyme": "^7.1.2",
|
||||
"karma": "^4.0.1",
|
||||
"karma-babel-preprocessor": "^8.0.0",
|
||||
"karma-browserify": "~6.0.0",
|
||||
@ -36,6 +40,7 @@
|
||||
"optimize-css-assets-webpack-plugin": "^5.0.1",
|
||||
"popper.js": "^1.14.7",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"prop-types": "^15.7.2",
|
||||
"raw-loader": "^1.0.0",
|
||||
"sass": "^1.24.4",
|
||||
"sass-loader": "^7.1.0",
|
||||
@ -50,6 +55,8 @@
|
||||
"yarn-audit-html": "^1.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/plugin-proposal-class-properties": "^7.10.4",
|
||||
"@babel/preset-react": "^7.10.4",
|
||||
"@simonwep/pickr": "^1.5.1",
|
||||
"acitree": "git+https://github.com/imsurinder90/jquery-aciTree.git#rc.7",
|
||||
"alertifyjs": "git+https://github.com/EnterpriseDB/AlertifyJS/#72c1d794f5b6d4ec13a68d123c08f19021afe263",
|
||||
@ -67,12 +74,12 @@
|
||||
"bootstrap4-toggle": "3.4.0",
|
||||
"bowser": "2.1.2",
|
||||
"browserify": "~16.2.3",
|
||||
"chart.js": "^2.9.3",
|
||||
"codemirror": "^5.54.0",
|
||||
"css-loader": "2.1.0",
|
||||
"cssnano": "^4.1.10",
|
||||
"dropzone": "^5.5.1",
|
||||
"exports-loader": "~0.7.0",
|
||||
"flotr2": "git+https://github.com/EnterpriseDB/Flotr2.git",
|
||||
"font-awesome": "^4.7.0",
|
||||
"immutability-helper": "^3.0.0",
|
||||
"imports-loader": "^0.8.0",
|
||||
@ -85,6 +92,8 @@
|
||||
"moment": "^2.24.0",
|
||||
"moment-timezone": "^0.5.23",
|
||||
"mousetrap": "^1.6.3",
|
||||
"react": "^16.13.1",
|
||||
"react-dom": "^16.13.1",
|
||||
"requirejs": "~2.3.6",
|
||||
"select2": "^4.0.6-rc.1",
|
||||
"shim-loader": "^1.0.1",
|
||||
|
@ -24,11 +24,6 @@
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.graph-container {
|
||||
margin-top: 10px;
|
||||
height: 150px;
|
||||
}
|
||||
|
||||
.icon-postgres:before {
|
||||
height: 43px;
|
||||
margin-top: 13px;
|
||||
|
51
web/pgadmin/dashboard/static/js/ChartsDOM.jsx
Normal file
51
web/pgadmin/dashboard/static/js/ChartsDOM.jsx
Normal file
@ -0,0 +1,51 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import Graphs from './Graphs';
|
||||
|
||||
export default class ChartsDOM {
|
||||
constructor(container, preferences, sid, did, pageVisible=true) {
|
||||
this.container = container;
|
||||
this.preferences = preferences;
|
||||
this.sid = sid;
|
||||
this.did = did;
|
||||
this.pageVisible = pageVisible;
|
||||
}
|
||||
|
||||
mount() {
|
||||
if(this.container && this.preferences.show_graphs) {
|
||||
ReactDOM.render(<Graphs sid={this.sid} did={this.did} preferences={this.preferences} pageVisible={this.pageVisible}/>, this.container);
|
||||
}
|
||||
}
|
||||
|
||||
unmount() {
|
||||
this.container && ReactDOM.unmountComponentAtNode(this.container);
|
||||
}
|
||||
|
||||
setSidDid(sid, did) {
|
||||
this.sid = sid;
|
||||
this.did = did;
|
||||
this.mount();
|
||||
}
|
||||
|
||||
reflectPreferences(preferences) {
|
||||
this.preferences = preferences;
|
||||
if(preferences.show_graphs) {
|
||||
this.mount();
|
||||
} else {
|
||||
this.unmount();
|
||||
}
|
||||
}
|
||||
|
||||
setPageVisible(visible) {
|
||||
this.pageVisible = visible;
|
||||
this.mount();
|
||||
}
|
||||
}
|
388
web/pgadmin/dashboard/static/js/Graphs.jsx
Normal file
388
web/pgadmin/dashboard/static/js/Graphs.jsx
Normal file
@ -0,0 +1,388 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useEffect, useRef, useState, useReducer, useCallback, useMemo } from 'react';
|
||||
import {LineChart} from 'sources/chartjs';
|
||||
import {ChartContainer, DashboardRowCol, DashboardRow} from './dashboard_components';
|
||||
import url_for from 'sources/url_for';
|
||||
import axios from 'axios';
|
||||
import gettext from 'sources/gettext';
|
||||
import {getGCD, getEpoch} from 'sources/utils';
|
||||
import {useInterval, usePrevious} from 'sources/custom_hooks';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
export const X_AXIS_LENGTH = 75;
|
||||
export const POINT_SIZE = 2;
|
||||
|
||||
/* Transform the labels data to suit ChartJS */
|
||||
export function transformData(labels, refreshRate) {
|
||||
const colors = ['#00BCD4', '#9CCC65', '#E64A19'];
|
||||
let datasets = Object.keys(labels).map((label, i)=>{
|
||||
return {
|
||||
label: label,
|
||||
data: labels[label] || [],
|
||||
borderColor: colors[i],
|
||||
backgroundColor: colors[i],
|
||||
pointHitRadius: POINT_SIZE,
|
||||
};
|
||||
}) || [];
|
||||
|
||||
return {
|
||||
labels: [...Array(X_AXIS_LENGTH).keys()],
|
||||
datasets: datasets,
|
||||
refreshRate: refreshRate,
|
||||
};
|
||||
}
|
||||
|
||||
/* Custom ChartJS legend callback */
|
||||
export function legendCallback(chart) {
|
||||
var text = [];
|
||||
text.push('<div class="' + chart.id + '-legend d-flex">');
|
||||
for (var i = 0; i < chart.data.datasets.length; i++) {
|
||||
text.push('<div class="legend-value"><span style="background-color:' + chart.data.datasets[i].backgroundColor + '"> </span>');
|
||||
if (chart.data.datasets[i].label) {
|
||||
text.push('<span class="legend-label">' + chart.data.datasets[i].label + '</span>');
|
||||
}
|
||||
text.push('</div>');
|
||||
}
|
||||
text.push('</div>');
|
||||
return text.join('');
|
||||
}
|
||||
|
||||
/* URL for fetching graphs data */
|
||||
export function getStatsUrl(sid=-1, did=-1, chart_names=[]) {
|
||||
let base_url = url_for('dashboard.dashboard_stats');
|
||||
base_url += '/' + sid;
|
||||
base_url += (did > 0) ? ('/' + did) : '';
|
||||
base_url += '?chart_names=' + chart_names.join(',');
|
||||
return base_url;
|
||||
}
|
||||
|
||||
/* This will process incoming charts data add it the the previous charts
|
||||
* data to get the new state.
|
||||
*/
|
||||
export function statsReducer(state, action) {
|
||||
let newState = {};
|
||||
|
||||
if(action.reset) {
|
||||
return action.reset;
|
||||
}
|
||||
|
||||
if(!action.incoming) {
|
||||
return state;
|
||||
}
|
||||
|
||||
if(!action.counterData) {
|
||||
action.counterData = action.incoming;
|
||||
}
|
||||
|
||||
Object.keys(action.incoming).forEach(label => {
|
||||
if(state[label]) {
|
||||
if(state[label].length >= X_AXIS_LENGTH) {
|
||||
state[label].unshift();
|
||||
}
|
||||
newState[label] = [
|
||||
action.counter ? action.incoming[label] - action.counterData[label] : action.incoming[label],
|
||||
...state[label],
|
||||
];
|
||||
} else {
|
||||
newState[label] = [
|
||||
action.counter ? action.incoming[label] - action.counterData[label] : action.incoming[label],
|
||||
];
|
||||
}
|
||||
});
|
||||
return newState;
|
||||
}
|
||||
|
||||
const chartsDefault = {
|
||||
'session_stats': {'Total': [], 'Active': [], 'Idle': []},
|
||||
'tps_stats': {'Transactions': [], 'Commits': [], 'Rollbacks': []},
|
||||
'ti_stats': {'Inserts': [], 'Updates': [], 'Delete': []},
|
||||
'to_stats': {'Fetched': [], 'Returned': []},
|
||||
'bio_stats': {'Reads': [], 'Hits': []},
|
||||
};
|
||||
|
||||
export default function Graphs({preferences, sid, did, pageVisible, enablePoll=true}) {
|
||||
const refreshOn = useRef(null);
|
||||
const prevPrefernces = usePrevious(preferences);
|
||||
|
||||
const [sessionStats, sessionStatsReduce] = useReducer(statsReducer, chartsDefault['session_stats']);
|
||||
const [tpsStats, tpsStatsReduce] = useReducer(statsReducer, chartsDefault['tps_stats']);
|
||||
const [tiStats, tiStatsReduce] = useReducer(statsReducer, chartsDefault['ti_stats']);
|
||||
const [toStats, toStatsReduce] = useReducer(statsReducer, chartsDefault['to_stats']);
|
||||
const [bioStats, bioStatsReduce] = useReducer(statsReducer, chartsDefault['bio_stats']);
|
||||
|
||||
const [counterData, setCounterData] = useState({});
|
||||
|
||||
const [errorMsg, setErrorMsg] = useState(null);
|
||||
const [pollDelay, setPollDelay] = useState(1000);
|
||||
const [chartDrawnOnce, setChartDrawnOnce] = useState(false);
|
||||
|
||||
useEffect(()=>{
|
||||
let calcPollDelay = false;
|
||||
if(prevPrefernces) {
|
||||
if(prevPrefernces['session_stats_refresh'] != preferences['session_stats_refresh']) {
|
||||
sessionStatsReduce({reset: chartsDefault['session_stats']});
|
||||
calcPollDelay = true;
|
||||
}
|
||||
if(prevPrefernces['tps_stats_refresh'] != preferences['tps_stats_refresh']) {
|
||||
tpsStatsReduce({reset:chartsDefault['tps_stats']});
|
||||
calcPollDelay = true;
|
||||
}
|
||||
if(prevPrefernces['ti_stats_refresh'] != preferences['ti_stats_refresh']) {
|
||||
tiStatsReduce({reset:chartsDefault['ti_stats']});
|
||||
calcPollDelay = true;
|
||||
}
|
||||
if(prevPrefernces['to_stats_refresh'] != preferences['to_stats_refresh']) {
|
||||
toStatsReduce({reset:chartsDefault['to_stats']});
|
||||
calcPollDelay = true;
|
||||
}
|
||||
if(prevPrefernces['bio_stats_refresh'] != preferences['bio_stats_refresh']) {
|
||||
bioStatsReduce({reset:chartsDefault['bio_stats']});
|
||||
calcPollDelay = true;
|
||||
}
|
||||
} else {
|
||||
calcPollDelay = true;
|
||||
}
|
||||
if(calcPollDelay) {
|
||||
setPollDelay(
|
||||
getGCD(Object.keys(chartsDefault).map((name)=>preferences[name+'_refresh']))*1000
|
||||
);
|
||||
}
|
||||
}, [preferences]);
|
||||
|
||||
useEffect(()=>{
|
||||
/* Charts rendered are not visible when, the dashboard is hidden but later visible */
|
||||
if(pageVisible && !chartDrawnOnce) {
|
||||
setChartDrawnOnce(true);
|
||||
}
|
||||
}, [pageVisible]);
|
||||
|
||||
useInterval(()=>{
|
||||
const currEpoch = getEpoch();
|
||||
if(refreshOn.current === null) {
|
||||
let tmpRef = {};
|
||||
Object.keys(chartsDefault).forEach((name)=>{
|
||||
tmpRef[name] = currEpoch;
|
||||
});
|
||||
refreshOn.current = tmpRef;
|
||||
}
|
||||
|
||||
let getFor = [];
|
||||
Object.keys(chartsDefault).forEach((name)=>{
|
||||
if(currEpoch >= refreshOn.current[name]) {
|
||||
getFor.push(name);
|
||||
refreshOn.current[name] = currEpoch + preferences[name+'_refresh'];
|
||||
}
|
||||
});
|
||||
|
||||
let path = getStatsUrl(sid, did, getFor);
|
||||
axios.get(path)
|
||||
.then((resp)=>{
|
||||
let data = resp.data;
|
||||
setErrorMsg(null);
|
||||
sessionStatsReduce({incoming: data['session_stats']});
|
||||
tpsStatsReduce({incoming: data['tps_stats'], counter: true, counterData: counterData['tps_stats']});
|
||||
tiStatsReduce({incoming: data['ti_stats'], counter: true, counterData: counterData['ti_stats']});
|
||||
toStatsReduce({incoming: data['to_stats'], counter: true, counterData: counterData['to_stats']});
|
||||
bioStatsReduce({incoming: data['bio_stats'], counter: true, counterData: counterData['bio_stats']});
|
||||
|
||||
setCounterData((prevCounterData)=>{
|
||||
return {
|
||||
...prevCounterData,
|
||||
...data,
|
||||
};
|
||||
});
|
||||
})
|
||||
.catch((error)=>{
|
||||
if(!errorMsg) {
|
||||
sessionStatsReduce({reset: chartsDefault['session_stats']});
|
||||
tpsStatsReduce({reset:chartsDefault['tps_stats']});
|
||||
tiStatsReduce({reset:chartsDefault['ti_stats']});
|
||||
toStatsReduce({reset:chartsDefault['to_stats']});
|
||||
bioStatsReduce({reset:chartsDefault['bio_stats']});
|
||||
setCounterData({});
|
||||
if(error.response) {
|
||||
if (error.response.status === 428) {
|
||||
setErrorMsg(gettext('Please connect to the selected server to view the graph.'));
|
||||
} else {
|
||||
setErrorMsg(gettext('An error occurred whilst rendering the graph.'));
|
||||
}
|
||||
} else if(error.request) {
|
||||
setErrorMsg(gettext('Not connected to the server or the connection to the server has been closed.'));
|
||||
return;
|
||||
} else {
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
});
|
||||
}, enablePoll ? pollDelay : -1);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div data-testid='graph-poll-delay' className='d-none'>{pollDelay}</div>
|
||||
{chartDrawnOnce &&
|
||||
<GraphsWrapper
|
||||
sessionStats={transformData(sessionStats, preferences['session_stats_refresh'])}
|
||||
tpsStats={transformData(tpsStats, preferences['tps_stats_refresh'])}
|
||||
tiStats={transformData(tiStats, preferences['ti_stats_refresh'])}
|
||||
toStats={transformData(toStats, preferences['to_stats_refresh'])}
|
||||
bioStats={transformData(bioStats, preferences['bio_stats_refresh'])}
|
||||
errorMsg={errorMsg}
|
||||
showTooltip={preferences['graph_mouse_track']}
|
||||
showDataPoints={preferences['graph_data_points']}
|
||||
isDatabase={did > 0}
|
||||
/>
|
||||
}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
Graphs.propTypes = {
|
||||
preferences: PropTypes.object.isRequired,
|
||||
sid: PropTypes.oneOfType([
|
||||
PropTypes.string.isRequired,
|
||||
PropTypes.number.isRequired,
|
||||
]),
|
||||
did: PropTypes.oneOfType([
|
||||
PropTypes.string.isRequired,
|
||||
PropTypes.number.isRequired,
|
||||
]),
|
||||
enablePoll: PropTypes.bool,
|
||||
};
|
||||
|
||||
export function GraphsWrapper(props) {
|
||||
const sessionStatsLegendRef = useRef();
|
||||
const tpsStatsLegendRef = useRef();
|
||||
const tiStatsLegendRef = useRef();
|
||||
const toStatsLegendRef = useRef();
|
||||
const bioStatsLegendRef = useRef();
|
||||
const options = useMemo(()=>({
|
||||
legendCallback: legendCallback,
|
||||
animation: {
|
||||
duration: 0,
|
||||
},
|
||||
hover: {
|
||||
animationDuration: 0,
|
||||
},
|
||||
responsiveAnimationDuration: 0,
|
||||
legend: {
|
||||
display: false,
|
||||
},
|
||||
elements: {
|
||||
point: {
|
||||
radius: props.showDataPoints ? POINT_SIZE : 0,
|
||||
},
|
||||
},
|
||||
tooltips: {
|
||||
enabled: props.showTooltip,
|
||||
callbacks: {
|
||||
title: function(tooltipItem, data) {
|
||||
let title = '';
|
||||
try {
|
||||
title = parseInt(tooltipItem[0].xLabel)*data.refreshRate + gettext(' seconds ago');
|
||||
} catch (error) {
|
||||
title = '';
|
||||
}
|
||||
return title;
|
||||
},
|
||||
},
|
||||
},
|
||||
scales: {
|
||||
yAxes: [{
|
||||
ticks: {
|
||||
min: 0,
|
||||
userCallback: function(label) {
|
||||
if (Math.floor(label) === label) {
|
||||
return label;
|
||||
}
|
||||
},
|
||||
fontColor: getComputedStyle(document.documentElement).getPropertyValue('--color-fg'),
|
||||
},
|
||||
gridLines: {
|
||||
drawBorder: false,
|
||||
zeroLineColor: getComputedStyle(document.documentElement).getPropertyValue('--border-color'),
|
||||
color: getComputedStyle(document.documentElement).getPropertyValue('--border-color'),
|
||||
},
|
||||
}],
|
||||
xAxes: [{
|
||||
display: false,
|
||||
gridLines: {
|
||||
display: false,
|
||||
},
|
||||
ticks: {
|
||||
display: false,
|
||||
reverse: true,
|
||||
},
|
||||
}],
|
||||
},
|
||||
}), [props.showTooltip, props.showDataPoints]);
|
||||
const updateOptions = useMemo(()=>({duration: 0}), []);
|
||||
|
||||
const onInitCallback = useCallback(
|
||||
(legendRef)=>(chart)=>{
|
||||
legendRef.current.innerHTML = chart.generateLegend();
|
||||
}
|
||||
);
|
||||
|
||||
return (
|
||||
<>
|
||||
<DashboardRow>
|
||||
<DashboardRowCol breakpoint='md' parts={6}>
|
||||
<ChartContainer id='sessions-graph' title={props.isDatabase ? gettext('Database sessions') : gettext('Server sessions')} legendRef={sessionStatsLegendRef} errorMsg={props.errorMsg}>
|
||||
<LineChart options={options} data={props.sessionStats} updateOptions={updateOptions}
|
||||
onInit={onInitCallback(sessionStatsLegendRef)}/>
|
||||
</ChartContainer>
|
||||
</DashboardRowCol>
|
||||
<DashboardRowCol breakpoint='md' parts={6}>
|
||||
<ChartContainer id='tps-graph' title={gettext('Transactions per second')} legendRef={tpsStatsLegendRef} errorMsg={props.errorMsg}>
|
||||
<LineChart options={options} data={props.tpsStats} updateOptions={updateOptions}
|
||||
onInit={onInitCallback(tpsStatsLegendRef)}/>
|
||||
</ChartContainer>
|
||||
</DashboardRowCol>
|
||||
</DashboardRow>
|
||||
<DashboardRow>
|
||||
<DashboardRowCol breakpoint='md' parts={4}>
|
||||
<ChartContainer id='ti-graph' title={gettext('Tuples in')} legendRef={tiStatsLegendRef} errorMsg={props.errorMsg}>
|
||||
<LineChart options={options} data={props.tiStats} updateOptions={updateOptions}
|
||||
onInit={onInitCallback(tiStatsLegendRef)}/>
|
||||
</ChartContainer>
|
||||
</DashboardRowCol>
|
||||
<DashboardRowCol breakpoint='md' parts={4}>
|
||||
<ChartContainer id='to-graph' title={gettext('Tuples out')} legendRef={toStatsLegendRef} errorMsg={props.errorMsg}>
|
||||
<LineChart options={options} data={props.toStats} updateOptions={updateOptions}
|
||||
onInit={onInitCallback(toStatsLegendRef)}/>
|
||||
</ChartContainer>
|
||||
</DashboardRowCol>
|
||||
<DashboardRowCol breakpoint='md' parts={4}>
|
||||
<ChartContainer id='bio-graph' title={gettext('Block I/O')} legendRef={bioStatsLegendRef} errorMsg={props.errorMsg}>
|
||||
<LineChart options={options} data={props.bioStats} updateOptions={updateOptions}
|
||||
onInit={onInitCallback(bioStatsLegendRef)}/>
|
||||
</ChartContainer>
|
||||
</DashboardRowCol>
|
||||
</DashboardRow>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
const propTypeStats = PropTypes.shape({
|
||||
labels: PropTypes.array.isRequired,
|
||||
datasets: PropTypes.array,
|
||||
refreshRate: PropTypes.number.isRequired,
|
||||
});
|
||||
GraphsWrapper.propTypes = {
|
||||
sessionStats: propTypeStats.isRequired,
|
||||
tpsStats: propTypeStats.isRequired,
|
||||
tiStats: propTypeStats.isRequired,
|
||||
toStats: propTypeStats.isRequired,
|
||||
bioStats: propTypeStats.isRequired,
|
||||
errorMsg: PropTypes.string,
|
||||
showTooltip: PropTypes.bool.isRequired,
|
||||
showDataPoints: PropTypes.bool.isRequired,
|
||||
isDatabase: PropTypes.bool.isRequired,
|
||||
};
|
@ -1,121 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
export class Chart {
|
||||
constructor(container, options) {
|
||||
let self = this;
|
||||
|
||||
require.ensure(['flotr2'], function(require) {
|
||||
self.chartApi = require('flotr2');
|
||||
}, function(error){
|
||||
throw(error);
|
||||
}, 'chart');
|
||||
|
||||
/* Html Node where the graph goes */
|
||||
this._container = container;
|
||||
/* Graph library options */
|
||||
this._options = {};
|
||||
this._defaultOptions = {
|
||||
legend: {
|
||||
position: 'nw',
|
||||
backgroundColor: '#D2E8FF',
|
||||
},
|
||||
lines: {
|
||||
show: true,
|
||||
lineWidth: 2,
|
||||
},
|
||||
shadowSize: 0,
|
||||
resolution : 3,
|
||||
grid: {
|
||||
color: 'transparent',
|
||||
tickColor: '#8f8f8f',
|
||||
},
|
||||
};
|
||||
|
||||
this._dataset = null;
|
||||
this._tooltipFormatter = null;
|
||||
/* Just to store other data related to charts. Used nowhere here in the module */
|
||||
this._otherData = {};
|
||||
this.setOptions(options);
|
||||
}
|
||||
|
||||
getContainer() {
|
||||
return this._container;
|
||||
}
|
||||
|
||||
getContainerDimensions() {
|
||||
return {
|
||||
height: this._container.clientHeight,
|
||||
width: this._container.clientWidth,
|
||||
};
|
||||
}
|
||||
|
||||
getOptions() {
|
||||
return this._options;
|
||||
}
|
||||
|
||||
/* This should be changed if library changed */
|
||||
setOptions(options, mergeOptions=true) {
|
||||
/* If mergeOptions then merge the options, else replace existing options */
|
||||
if(mergeOptions) {
|
||||
this._options = {...this._defaultOptions, ...this._options, ...options};
|
||||
} else {
|
||||
this._options = {...this._defaultOptions, ...options};
|
||||
}
|
||||
}
|
||||
|
||||
removeOptions(optionKey) {
|
||||
if(this._options[optionKey]) {
|
||||
delete this._options[optionKey];
|
||||
}
|
||||
}
|
||||
|
||||
getOtherData(key) {
|
||||
if(this._otherData[key]) {
|
||||
return this._otherData[key];
|
||||
}
|
||||
}
|
||||
|
||||
setOtherData(key, value) {
|
||||
this._otherData[key] = value;
|
||||
}
|
||||
|
||||
isVisible() {
|
||||
let dim = this.getContainerDimensions();
|
||||
return (dim.height > 0 && dim.width > 0);
|
||||
}
|
||||
|
||||
isInPage() {
|
||||
return (this._container === document.body) ? false : document.body.contains(this._container);
|
||||
}
|
||||
|
||||
setTooltipFormatter(tooltipFormatter) {
|
||||
let opt = this.getOptions();
|
||||
|
||||
this._tooltipFormatter = tooltipFormatter;
|
||||
|
||||
if(this._tooltipFormatter) {
|
||||
this.setOptions({
|
||||
mouse: {
|
||||
...opt.mouse,
|
||||
trackFormatter: this._tooltipFormatter,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
draw(dataset) {
|
||||
this._dataset = dataset;
|
||||
if(this._container) {
|
||||
if(this.chartApi) {
|
||||
this.chartApi.draw(this._container, this._dataset, this._options);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -9,12 +9,12 @@
|
||||
|
||||
define('pgadmin.dashboard', [
|
||||
'sources/url_for', 'sources/gettext', 'require', 'jquery', 'underscore',
|
||||
'sources/pgadmin', 'backbone', 'backgrid', './charting',
|
||||
'sources/pgadmin', 'backbone', 'backgrid',
|
||||
'pgadmin.alertifyjs', 'pgadmin.backform', 'sources/nodes/dashboard',
|
||||
'sources/utils', 'sources/window', 'pgadmin.browser', 'bootstrap', 'wcdocker',
|
||||
'sources/window', './ChartsDOM', 'pgadmin.browser', 'bootstrap', 'wcdocker',
|
||||
], function(
|
||||
url_for, gettext, r, $, _, pgAdmin, Backbone, Backgrid, charting,
|
||||
Alertify, Backform, NodesDashboard, commonUtils, pgWindow
|
||||
url_for, gettext, r, $, _, pgAdmin, Backbone, Backgrid,
|
||||
Alertify, Backform, NodesDashboard, pgWindow, ChartsDOM
|
||||
) {
|
||||
|
||||
pgAdmin.Browser = pgAdmin.Browser || {};
|
||||
@ -203,6 +203,7 @@ define('pgadmin.dashboard', [
|
||||
return;
|
||||
|
||||
this.initialized = true;
|
||||
this.chartsDomObj = null;
|
||||
|
||||
this.sid = this.did = -1;
|
||||
this.version = -1;
|
||||
@ -221,10 +222,6 @@ define('pgadmin.dashboard', [
|
||||
// Load the default welcome dashboard
|
||||
var url = url_for('dashboard.index');
|
||||
|
||||
/* Store the chart objects, refresh freq and next refresh time */
|
||||
this.chart_store = {};
|
||||
this.charts_poller_int_id = -1;
|
||||
|
||||
var dashboardPanel = pgBrowser.panels['dashboard'].panel;
|
||||
if (dashboardPanel) {
|
||||
var div = dashboardPanel.layout().scene().find('.pg-panel-content');
|
||||
@ -283,18 +280,7 @@ define('pgadmin.dashboard', [
|
||||
object_selected: function(item, itemData, node) {
|
||||
let self = this;
|
||||
|
||||
if (dashboardVisible === false) {
|
||||
/*
|
||||
* Clear all the interval functions, even when dashboard is not
|
||||
* visible (in case of connection of the object got disconnected).
|
||||
*/
|
||||
if (
|
||||
!_.isUndefined(itemData.connected) &&
|
||||
itemData.connected !== true
|
||||
) {
|
||||
self.clearChartFromStore();
|
||||
}
|
||||
} else if (itemData && itemData._type) {
|
||||
if (dashboardVisible && itemData && itemData._type) {
|
||||
var treeHierarchy = node.getTreeNodeHierarchy(item),
|
||||
url = NodesDashboard.url(itemData, item, treeHierarchy);
|
||||
|
||||
@ -355,11 +341,9 @@ define('pgadmin.dashboard', [
|
||||
$(dashboardPanel).data('server_status') == false
|
||||
)
|
||||
) {
|
||||
this.chartsDomObj && this.chartsDomObj.unmount();
|
||||
$(div).empty();
|
||||
|
||||
/* Clear all the charts previous dashboards */
|
||||
self.clearChartFromStore();
|
||||
|
||||
let ajaxHook = function() {
|
||||
$.ajax({
|
||||
url: url,
|
||||
@ -393,14 +377,8 @@ define('pgadmin.dashboard', [
|
||||
$(dashboardPanel).data('server_status', true);
|
||||
}
|
||||
} else {
|
||||
this.chartsDomObj && this.chartsDomObj.unmount();
|
||||
$(div).empty();
|
||||
if (
|
||||
!_.isUndefined(itemData.connected) &&
|
||||
itemData.connected !== true
|
||||
) {
|
||||
/* Clear all the charts previous dashboards */
|
||||
self.clearChartFromStore();
|
||||
}
|
||||
$(div).html(
|
||||
'<div class="pg-panel-message" role="alert">' + gettext('Please connect to the selected server to view the dashboard.') + '</div>'
|
||||
);
|
||||
@ -413,218 +391,6 @@ define('pgadmin.dashboard', [
|
||||
}
|
||||
},
|
||||
|
||||
// Render the charts
|
||||
renderCharts: function(charts_config) {
|
||||
|
||||
let self = this,
|
||||
tooltipFormatter = function(refresh, currVal) {
|
||||
return(`Seconds ago: ${parseInt(currVal.x * refresh)}</br>
|
||||
Value: ${currVal.y}`);
|
||||
},
|
||||
curr_epoch=commonUtils.getEpoch();
|
||||
|
||||
self.stopChartsPoller();
|
||||
|
||||
charts_config.map((chart_config) => {
|
||||
if(self.chart_store[chart_config.chart_name]
|
||||
&& self.old_preferences[chart_config.refresh_pref_name] !=
|
||||
self.preferences[chart_config.refresh_pref_name]) {
|
||||
self.clearChartFromStore(chart_config.chart_name);
|
||||
}
|
||||
|
||||
if(self.chart_store[chart_config.chart_name]) {
|
||||
let chart_obj = self.chart_store[chart_config.chart_name].chart_obj;
|
||||
chart_obj.setOptions(chart_config.options, false);
|
||||
chart_obj.setTooltipFormatter(
|
||||
tooltipFormatter.bind(null, self.preferences[chart_config.refresh_pref_name])
|
||||
);
|
||||
}
|
||||
|
||||
if(!self.chart_store[chart_config.chart_name]) {
|
||||
let chart_obj = new charting.Chart(chart_config.container, chart_config.options);
|
||||
|
||||
chart_obj.setTooltipFormatter(
|
||||
tooltipFormatter.bind(null, self.preferences[chart_config.refresh_pref_name])
|
||||
);
|
||||
|
||||
chart_obj.setOtherData('counter', chart_config.counter);
|
||||
|
||||
self.chart_store[chart_config.chart_name] = {
|
||||
'chart_obj' : chart_obj,
|
||||
'refresh_on': curr_epoch,
|
||||
'refresh_rate': self.preferences[chart_config.refresh_pref_name],
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
self.startChartsPoller(self.chart_store, self.sid, self.did);
|
||||
},
|
||||
|
||||
getStatsUrl: function(sid=-1, did=-1, chart_names=[]) {
|
||||
let base_url = url_for('dashboard.dashboard_stats');
|
||||
base_url += '/' + sid;
|
||||
base_url += (did > 0) ? ('/' + did) : '';
|
||||
base_url += '?chart_names=' + chart_names.join(',');
|
||||
return base_url;
|
||||
},
|
||||
|
||||
updateChart: function(chart_obj, new_data){
|
||||
// Dataset format:
|
||||
// [
|
||||
// { data: [[0, y0], [1, y1]...], label: 'Label 1', [options] },
|
||||
// { data: [[0, y0], [1, y1]...], label: 'Label 2', [options] },
|
||||
// { data: [[0, y0], [1, y1]...], label: 'Label 3', [options] }
|
||||
// ]
|
||||
let dataset = chart_obj.getOtherData('dataset') || [],
|
||||
counter_prev_data = chart_obj.getOtherData('counter_prev_data') || new_data,
|
||||
counter = chart_obj.getOtherData('counter') || false;
|
||||
|
||||
if (dataset.length == 0) {
|
||||
// Create the initial data structure
|
||||
for (let label in new_data) {
|
||||
dataset.push({
|
||||
'data': [
|
||||
[0, counter ? (new_data[label] - counter_prev_data[label]) : new_data[label]],
|
||||
],
|
||||
'label': label,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
Object.keys(new_data).forEach((label, label_ind) => {
|
||||
// Push new values onto the existing data structure
|
||||
// If this is a counter stat, we need to subtract the previous value
|
||||
if (!counter) {
|
||||
dataset[label_ind]['data'].unshift([0, new_data[label]]);
|
||||
} else {
|
||||
// Store the current value, minus the previous one we stashed.
|
||||
// It's possible the tab has been reloaded, in which case out previous values are gone
|
||||
if (_.isUndefined(counter_prev_data))
|
||||
return;
|
||||
|
||||
dataset[label_ind]['data'].unshift([0, new_data[label] - counter_prev_data[label]]);
|
||||
}
|
||||
|
||||
// Reset the time index to get a proper scrolling display
|
||||
for (var time_ind = 0; time_ind < dataset[label_ind]['data'].length; time_ind++) {
|
||||
dataset[label_ind]['data'][time_ind][0] = time_ind;
|
||||
}
|
||||
});
|
||||
counter_prev_data = new_data;
|
||||
}
|
||||
|
||||
// Remove old data points
|
||||
for (let label_ind = 0; label_ind < dataset.length; label_ind++) {
|
||||
if (dataset[label_ind]['data'].length > 101) {
|
||||
dataset[label_ind]['data'].pop();
|
||||
}
|
||||
}
|
||||
|
||||
chart_obj.setOtherData('dataset', dataset);
|
||||
chart_obj.setOtherData('counter_prev_data', counter_prev_data);
|
||||
|
||||
if (chart_obj.isInPage()) {
|
||||
if (chart_obj.isVisible()) {
|
||||
chart_obj.draw(dataset);
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
stopChartsPoller: function() {
|
||||
clearInterval(this.charts_poller_int_id);
|
||||
},
|
||||
|
||||
startChartsPoller: function(chart_store, sid, did) {
|
||||
let self = this;
|
||||
/* polling will the greatest common divisor of the refresh rates*/
|
||||
let poll_interval = commonUtils.getGCD(
|
||||
Object.values(chart_store).map(item => item.refresh_rate)
|
||||
);
|
||||
const WAIT_COUNTER = 3;
|
||||
let last_poll_wait_counter = 0;
|
||||
let resp_not_received_counter = 0;
|
||||
|
||||
/* Stop if running, only one poller lives */
|
||||
self.stopChartsPoller();
|
||||
|
||||
var thePollingFunc = function() {
|
||||
let curr_epoch = commonUtils.getEpoch();
|
||||
let chart_names_to_get = [];
|
||||
|
||||
for(let chart_name in chart_store) {
|
||||
/* when its time to get the data */
|
||||
if(chart_store[chart_name].refresh_on <= curr_epoch) {
|
||||
/* set the next trigger point */
|
||||
chart_store[chart_name].refresh_on = curr_epoch + chart_store[chart_name].refresh_rate;
|
||||
chart_names_to_get.push(chart_name);
|
||||
}
|
||||
}
|
||||
|
||||
/* If none of the chart wants data, don't trouble
|
||||
* If response not received from prev poll, don't trouble !!
|
||||
*/
|
||||
if(chart_names_to_get.length == 0 || last_poll_wait_counter > 0 || resp_not_received_counter >= WAIT_COUNTER) {
|
||||
/* reduce the number of tries, request should be sent if last_poll_wait_counter
|
||||
* completes WAIT_COUNTER times.*/
|
||||
last_poll_wait_counter--;
|
||||
return;
|
||||
}
|
||||
|
||||
var path = self.getStatsUrl(sid, did, chart_names_to_get);
|
||||
resp_not_received_counter++;
|
||||
$.ajax({
|
||||
url: path,
|
||||
type: 'GET',
|
||||
})
|
||||
.done(function(resp) {
|
||||
for(let chart_name in resp) {
|
||||
let chart_obj = chart_store[chart_name].chart_obj;
|
||||
$(chart_obj.getContainer()).removeClass('graph-error');
|
||||
self.updateChart(chart_obj, resp[chart_name]);
|
||||
}
|
||||
})
|
||||
.fail(function(xhr) {
|
||||
let err = '';
|
||||
let msg = '';
|
||||
let cls = 'info';
|
||||
|
||||
if (xhr.readyState === 0) {
|
||||
msg = gettext('Not connected to the server or the connection to the server has been closed.');
|
||||
} else {
|
||||
err = JSON.parse(xhr.responseText);
|
||||
msg = err.errormsg;
|
||||
|
||||
// If we get a 428, it means the server isn't connected
|
||||
if (xhr.status === 428) {
|
||||
if (_.isUndefined(msg) || _.isNull(msg)) {
|
||||
msg = gettext('Please connect to the selected server to view the graph.');
|
||||
}
|
||||
} else {
|
||||
msg = gettext('An error occurred whilst rendering the graph.');
|
||||
cls = 'error';
|
||||
}
|
||||
}
|
||||
|
||||
for(let chart_name in chart_store) {
|
||||
let chart_obj = chart_store[chart_name].chart_obj;
|
||||
$(chart_obj.getContainer()).addClass('graph-error');
|
||||
$(chart_obj.getContainer()).html(
|
||||
'<div class="pg-panel-' + cls + ' pg-panel-message" role="alert">' + msg + '</div>'
|
||||
);
|
||||
}
|
||||
})
|
||||
.always(function() {
|
||||
last_poll_wait_counter = 0;
|
||||
resp_not_received_counter--;
|
||||
});
|
||||
last_poll_wait_counter = WAIT_COUNTER;
|
||||
};
|
||||
/* Execute once for the first time as setInterval will not do */
|
||||
thePollingFunc();
|
||||
self.charts_poller_int_id = setInterval(thePollingFunc, poll_interval * 1000);
|
||||
},
|
||||
|
||||
// Handler function to support the "Add Server" link
|
||||
add_new_server: function() {
|
||||
if (pgBrowser && pgBrowser.tree) {
|
||||
@ -759,23 +525,18 @@ define('pgadmin.dashboard', [
|
||||
});
|
||||
},
|
||||
|
||||
clearChartFromStore: function(chartName) {
|
||||
var self = this;
|
||||
if(!chartName){
|
||||
self.stopChartsPoller();
|
||||
_.each(self.chart_store, function(chart, key) {
|
||||
delete self.chart_store[key];
|
||||
});
|
||||
}
|
||||
else {
|
||||
delete self.chart_store[chartName];
|
||||
}
|
||||
},
|
||||
|
||||
// Rock n' roll on the dashboard
|
||||
init_dashboard: function() {
|
||||
let self = this;
|
||||
|
||||
this.chartsDomObj = new ChartsDOM.default(
|
||||
document.getElementById('dashboard-graphs'),
|
||||
self.preferences,
|
||||
self.sid,
|
||||
self.did,
|
||||
$('.dashboard-container')[0].clientHeight <=0 ? false : true
|
||||
);
|
||||
|
||||
/* Cache may take time to load for the first time
|
||||
* Keep trying till available
|
||||
*/
|
||||
@ -796,81 +557,14 @@ define('pgadmin.dashboard', [
|
||||
pgBrowser.onPreferencesChange('dashboards', function() {
|
||||
self.reflectPreferences();
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
reflectPreferences: function() {
|
||||
var self = this;
|
||||
var tickColor = getComputedStyle(document.documentElement).getPropertyValue('--border-color');
|
||||
|
||||
/* We will use old preferences for selective graph updates on preference change */
|
||||
if(self.preferences) {
|
||||
self.old_preferences = self.preferences;
|
||||
self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards');
|
||||
}
|
||||
else {
|
||||
self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards');
|
||||
self.old_preferences = self.preferences;
|
||||
}
|
||||
self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards');
|
||||
this.chartsDomObj.reflectPreferences(self.preferences);
|
||||
|
||||
if(is_server_dashboard || is_database_dashboard) {
|
||||
/* Common things can come here */
|
||||
var div_sessions = $('.dashboard-container').find('#graph-sessions')[0];
|
||||
var div_tps = $('.dashboard-container').find('#graph-tps')[0];
|
||||
var div_ti = $('.dashboard-container').find('#graph-ti')[0];
|
||||
var div_to = $('.dashboard-container').find('#graph-to')[0];
|
||||
var div_bio = $('.dashboard-container').find('#graph-bio')[0];
|
||||
var options_line = {
|
||||
parseFloat: false,
|
||||
xaxis: {
|
||||
min: 100,
|
||||
max: 0,
|
||||
autoscale: 0,
|
||||
},
|
||||
yaxis: {
|
||||
autoscale: 1,
|
||||
},
|
||||
grid: {
|
||||
color: 'transparent',
|
||||
tickColor: tickColor,
|
||||
},
|
||||
};
|
||||
|
||||
if(self.preferences.graph_data_points) {
|
||||
/* Merge data points related options */
|
||||
options_line = {
|
||||
...options_line,
|
||||
...{
|
||||
points: {
|
||||
show:true,
|
||||
radius: 1,
|
||||
hitRadius: 3,
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
if(self.preferences.graph_mouse_track) {
|
||||
/* Merge mouse track related options */
|
||||
options_line = {
|
||||
...options_line,
|
||||
...{
|
||||
mouse: {
|
||||
track:true,
|
||||
position: 'sw',
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
if(self.preferences.show_graphs && $('#dashboard-graphs').hasClass('dashboard-hidden')) {
|
||||
$('#dashboard-graphs').removeClass('dashboard-hidden');
|
||||
}
|
||||
else if(!self.preferences.show_graphs) {
|
||||
$('#dashboard-graphs').addClass('dashboard-hidden');
|
||||
self.clearChartFromStore();
|
||||
}
|
||||
|
||||
if (self.preferences.show_activity && $('#dashboard-activity').hasClass('dashboard-hidden')) {
|
||||
$('#dashboard-activity').removeClass('dashboard-hidden');
|
||||
}
|
||||
@ -878,46 +572,11 @@ define('pgadmin.dashboard', [
|
||||
$('#dashboard-activity').addClass('dashboard-hidden');
|
||||
}
|
||||
|
||||
if(self.preferences.show_graphs) {
|
||||
// Render the graphs
|
||||
pgAdmin.Dashboard.renderCharts([{
|
||||
chart_name: 'session_stats',
|
||||
container: div_sessions,
|
||||
options: options_line,
|
||||
counter: false,
|
||||
refresh_pref_name: 'session_stats_refresh',
|
||||
}, {
|
||||
chart_name: 'tps_stats',
|
||||
container: div_tps,
|
||||
options: options_line,
|
||||
counter: true,
|
||||
refresh_pref_name: 'tps_stats_refresh',
|
||||
}, {
|
||||
chart_name: 'ti_stats',
|
||||
container: div_ti,
|
||||
options: options_line,
|
||||
counter: true,
|
||||
refresh_pref_name: 'ti_stats_refresh',
|
||||
}, {
|
||||
chart_name: 'to_stats',
|
||||
container: div_to,
|
||||
options: options_line,
|
||||
counter: true,
|
||||
refresh_pref_name: 'to_stats_refresh',
|
||||
}, {
|
||||
chart_name: 'bio_stats',
|
||||
container: div_bio,
|
||||
options: options_line,
|
||||
counter: true,
|
||||
refresh_pref_name: 'bio_stats_refresh',
|
||||
}]);
|
||||
if (self.preferences.show_activity && $('#dashboard-activity').hasClass('dashboard-hidden')) {
|
||||
$('#dashboard-activity').removeClass('dashboard-hidden');
|
||||
}
|
||||
|
||||
if(!self.preferences.show_graphs && !self.preferences.show_activity) {
|
||||
$('#dashboard-none-show').removeClass('dashboard-hidden');
|
||||
}
|
||||
else {
|
||||
$('#dashboard-none-show').addClass('dashboard-hidden');
|
||||
else if(!self.preferences.show_activity) {
|
||||
$('#dashboard-activity').addClass('dashboard-hidden');
|
||||
}
|
||||
|
||||
/* Dashboard specific preferences can be updated in the
|
||||
@ -1440,7 +1099,9 @@ define('pgadmin.dashboard', [
|
||||
toggleVisibility: function(visible, closed=false) {
|
||||
dashboardVisible = visible;
|
||||
if(closed) {
|
||||
this.clearChartFromStore();
|
||||
this.chartsDomObj && this.chartsDomObj.unmount();
|
||||
} else {
|
||||
this.chartsDomObj && this.chartsDomObj.setPageVisible(dashboardVisible);
|
||||
}
|
||||
},
|
||||
can_take_action: function(m) {
|
||||
|
74
web/pgadmin/dashboard/static/js/dashboard_components.jsx
Normal file
74
web/pgadmin/dashboard/static/js/dashboard_components.jsx
Normal file
@ -0,0 +1,74 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
export function ChartContainer(props) {
|
||||
return (
|
||||
<div className="card dashboard-graph" role="object-document" tabIndex="0" aria-labelledby={props.id}>
|
||||
<div className="card-header">
|
||||
<div className="d-flex">
|
||||
<div id={props.id}>{props.title}</div>
|
||||
<div className="ml-auto my-auto legend" ref={props.legendRef}></div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="card-body dashboard-graph-body">
|
||||
<div className={'chart-wrapper ' + (props.errorMsg ? 'd-none': '')}>
|
||||
{props.children}
|
||||
</div>
|
||||
<ChartError message={props.errorMsg} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
ChartContainer.propTypes = {
|
||||
id: PropTypes.string.isRequired,
|
||||
title: PropTypes.string.isRequired,
|
||||
legendRef: PropTypes.oneOfType([
|
||||
PropTypes.func,
|
||||
PropTypes.shape({ current: PropTypes.any }),
|
||||
]).isRequired,
|
||||
children: PropTypes.node.isRequired,
|
||||
errorMsg: PropTypes.string,
|
||||
};
|
||||
|
||||
export function ChartError(props) {
|
||||
if(props.message === null) {
|
||||
return <></>;
|
||||
}
|
||||
return (
|
||||
<div className="pg-panel-error pg-panel-message" role="alert">{props.message}</div>
|
||||
);
|
||||
}
|
||||
|
||||
ChartError.propTypes = {
|
||||
message: PropTypes.string,
|
||||
};
|
||||
|
||||
export function DashboardRow({children}) {
|
||||
return (
|
||||
<div className="row dashboard-row">{children}</div>
|
||||
);
|
||||
}
|
||||
DashboardRow.propTypes = {
|
||||
children: PropTypes.node.isRequired,
|
||||
};
|
||||
|
||||
export function DashboardRowCol({breakpoint, parts, children}) {
|
||||
return (
|
||||
<div className={`col-${breakpoint}-${parts}`}>{children}</div>
|
||||
);
|
||||
}
|
||||
|
||||
DashboardRowCol.propTypes = {
|
||||
breakpoint: PropTypes.oneOf(['xs', 'sm', 'md', 'lg', 'xl']).isRequired,
|
||||
parts: PropTypes.number.isRequired,
|
||||
children: PropTypes.node.isRequired,
|
||||
};
|
@ -35,8 +35,22 @@
|
||||
color: $color-fg;
|
||||
}
|
||||
|
||||
.dashboard-graph {
|
||||
& .legend {
|
||||
font-size: $tree-font-size;
|
||||
& .legend-value {
|
||||
font-weight: normal;
|
||||
margin-left: 0.25rem;
|
||||
& .legend-label {
|
||||
margin-left: 0.25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dashboard-graph-body {
|
||||
padding: 0.25rem 0.5rem;
|
||||
height: 175px;
|
||||
|
||||
& .flotr-labels {
|
||||
color: $color-fg !important;
|
||||
|
@ -1,60 +1,5 @@
|
||||
<div class="container-fluid dashboard-container negative-space">
|
||||
<div id="dashboard-graphs" class="dashboard-hidden">
|
||||
<div class="row dashboard-row">
|
||||
<div class="col-md-6 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="database-session-graph">
|
||||
<div class="card-header" id="database-session-graph">
|
||||
{{ _('Database sessions') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-sessions" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="transactions-per-second-graph">
|
||||
<div class="card-header" id="transactions-per-second-graph">
|
||||
{{ _('Transactions per second') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-tps" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row dashboard-row">
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="tuples-in-graph">
|
||||
<div class="card-header" id="tuples-in-graph">
|
||||
{{ _('Tuples in') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-ti" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="tuples-out-graph">
|
||||
<div class="card-header" id="tuples-out-graph">
|
||||
{{ _('Tuples out') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-to" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="block-io-graph">
|
||||
<div class="card-header" id="block-io-graph">
|
||||
{{ _('Block I/O') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-bio" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="dashboard-graphs"></div>
|
||||
<div id="dashboard-activity" class="card dashboard-row dashboard-hidden">
|
||||
<div class="card-header">
|
||||
<span id="dashboard-activity-header">{{ _('Server activity') }}</span>
|
||||
|
@ -1,59 +1,5 @@
|
||||
<div class="container-fluid dashboard-container negative-space">
|
||||
<div id="dashboard-graphs" class="dashboard-hidden">
|
||||
<div class="row dashboard-row">
|
||||
<div class="col-md-6 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="server-sessions-graph">
|
||||
<div class="card-header" id="server-sessions-graph">
|
||||
{{ _('Server sessions') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-sessions" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="transactions-per-second-graph">
|
||||
<div class="card-header" id="transactions-per-second-graph">
|
||||
{{ _('Transactions per second') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-tps" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row dashboard-row">
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="tuples-in-graph">
|
||||
<div class="card-header" id="tuples-in-graph">
|
||||
{{ _('Tuples in') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-ti" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="tuples-out-graph">
|
||||
<div class="card-header" id="tuples-out-graph">
|
||||
{{ _('Tuples out') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-to" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 col-12">
|
||||
<div class="card" role="object-document" tabindex="0" aria-labelledby="block-o-graph">
|
||||
<div class="card-header" id="block-o-graph">
|
||||
{{ _('Block I/O') }}
|
||||
</div>
|
||||
<div class="card-body dashboard-graph-body">
|
||||
<div id="graph-bio" class="graph-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="dashboard-graphs">
|
||||
</div>
|
||||
<div id="dashboard-activity" class="card dashboard-row dashboard-hidden">
|
||||
<div class="card-header">
|
||||
|
95
web/pgadmin/static/js/chartjs/index.jsx
Normal file
95
web/pgadmin/static/js/chartjs/index.jsx
Normal file
@ -0,0 +1,95 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import React, { useEffect } from 'react';
|
||||
import Chart from 'chart.js';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
const defaultOptions = {
|
||||
responsive: true,
|
||||
maintainAspectRatio: false,
|
||||
elements: {
|
||||
line: {
|
||||
tension: 0,
|
||||
borderWidth: 2,
|
||||
fill: false,
|
||||
},
|
||||
},
|
||||
layout: {
|
||||
padding: 8,
|
||||
},
|
||||
hover: {
|
||||
animationDuration:0,
|
||||
},
|
||||
};
|
||||
|
||||
export default function BaseChart({type='line', id, options, data, redraw=false, ...props}) {
|
||||
const chartRef = React.useRef();
|
||||
const chartObj = React.useRef();
|
||||
let optionsMerged = Chart.helpers.configMerge(defaultOptions, options);
|
||||
|
||||
const initChart = function() {
|
||||
let chartContext = chartRef.current.getContext('2d');
|
||||
chartObj.current = new Chart(chartContext, {
|
||||
type: type,
|
||||
data: data,
|
||||
options: optionsMerged,
|
||||
});
|
||||
props.onInit && props.onInit(chartObj.current);
|
||||
}
|
||||
|
||||
const destroyChart = function() {
|
||||
chartObj.current && chartObj.current.destroy();
|
||||
}
|
||||
|
||||
useEffect(()=>{
|
||||
initChart();
|
||||
return destroyChart;
|
||||
}, []);
|
||||
|
||||
useEffect(()=>{
|
||||
if(typeof(chartObj.current) != 'undefined') {
|
||||
chartObj.current.data = data;
|
||||
for(let i=0; i<chartObj.current.data.datasets.length; i++) {
|
||||
chartObj.current.data.datasets[i] = {
|
||||
...chartObj.current.data.datasets[i],
|
||||
...data.datasets[i],
|
||||
};
|
||||
}
|
||||
chartObj.current.options = optionsMerged;
|
||||
chartObj.current.update(props.updateOptions || {});
|
||||
props.onUpdate && props.onUpdate(chartObj.current);
|
||||
}
|
||||
}, [data, options]);
|
||||
|
||||
useEffect(()=>{
|
||||
if(redraw) {
|
||||
destroyChart();
|
||||
initChart();
|
||||
}
|
||||
}, [redraw])
|
||||
|
||||
return (
|
||||
<canvas id={id} ref={chartRef}></canvas>
|
||||
);
|
||||
}
|
||||
|
||||
BaseChart.propTypes = {
|
||||
type: PropTypes.string.isRequired,
|
||||
data: PropTypes.object.isRequired,
|
||||
options: PropTypes.object,
|
||||
updateOptions: PropTypes.object,
|
||||
onInit: PropTypes.func,
|
||||
onUpdate: PropTypes.func,
|
||||
};
|
||||
|
||||
export function LineChart(props) {
|
||||
return (
|
||||
<BaseChart {...props} type='line'/>
|
||||
);
|
||||
}
|
29
web/pgadmin/static/js/custom_hooks.js
Normal file
29
web/pgadmin/static/js/custom_hooks.js
Normal file
@ -0,0 +1,29 @@
|
||||
import {useRef, useEffect} from 'react';
|
||||
|
||||
/* React hook for setInterval */
|
||||
export function useInterval(callback, delay) {
|
||||
const savedCallback = useRef();
|
||||
|
||||
useEffect(() => {
|
||||
savedCallback.current = callback;
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
function tick() {
|
||||
savedCallback.current();
|
||||
}
|
||||
|
||||
if(delay > -1) {
|
||||
let id = setInterval(tick, delay);
|
||||
return () => clearInterval(id);
|
||||
}
|
||||
}, [delay]);
|
||||
}
|
||||
|
||||
export function usePrevious(value) {
|
||||
const ref = useRef();
|
||||
useEffect(() => {
|
||||
ref.current = value;
|
||||
});
|
||||
return ref.current;
|
||||
}
|
@ -7,6 +7,7 @@ $theme-colors: (
|
||||
|
||||
/* Certain variables are required in JS directly */
|
||||
:root {
|
||||
--color-fg: #{$color-fg};
|
||||
--border-color: #{$border-color};
|
||||
}
|
||||
|
||||
|
@ -1,100 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import $ from 'jquery';
|
||||
import {Chart} from 'top/dashboard/static/js/charting';
|
||||
|
||||
describe('In charting related testcases', ()=> {
|
||||
let chartObj = undefined,
|
||||
chartDiv = undefined,
|
||||
options = {};
|
||||
|
||||
beforeEach(()=> {
|
||||
$('body').append(
|
||||
'<div id="charting-test-container"></div>'
|
||||
);
|
||||
chartDiv = $('#charting-test-container')[0];
|
||||
chartObj = new Chart(chartDiv, options);
|
||||
});
|
||||
|
||||
it('Return the correct container', ()=>{
|
||||
expect(chartObj.getContainer()).toEqual(chartDiv);
|
||||
});
|
||||
|
||||
it('Returns the container dimensions', ()=>{
|
||||
let dim = chartObj.getContainerDimensions();
|
||||
expect(dim.height).toBeDefined();
|
||||
expect(dim.width).toBeDefined();
|
||||
});
|
||||
|
||||
it('Check if options are set', ()=>{
|
||||
chartObj.setOptions({
|
||||
mouse: {
|
||||
track:true,
|
||||
},
|
||||
});
|
||||
|
||||
let opt = chartObj.getOptions();
|
||||
|
||||
expect(opt.mouse).toBeDefined();
|
||||
});
|
||||
|
||||
it('Check if options are set with mergeOptions false', ()=>{
|
||||
let overOpt = {
|
||||
mouse: {
|
||||
track:true,
|
||||
},
|
||||
};
|
||||
chartObj.setOptions(overOpt, false);
|
||||
|
||||
let newOptShouldBe = {...chartObj._defaultOptions, ...overOpt};
|
||||
|
||||
let opt = chartObj.getOptions();
|
||||
expect(JSON.stringify(opt)).toEqual(JSON.stringify(newOptShouldBe));
|
||||
});
|
||||
|
||||
it('Check if other data is set', ()=>{
|
||||
chartObj.setOtherData('some_val', 1);
|
||||
expect(chartObj._otherData['some_val']).toEqual(1);
|
||||
});
|
||||
|
||||
it('Check if other data is get', ()=>{
|
||||
chartObj.setOtherData('some_val', 1);
|
||||
expect(chartObj.getOtherData('some_val')).toEqual(1);
|
||||
});
|
||||
|
||||
it('Check if other data returns undefined for not set', ()=>{
|
||||
expect(chartObj.getOtherData('some_val_not_set')).toEqual(undefined);
|
||||
});
|
||||
|
||||
it('Check if isVisible returns correct', ()=>{
|
||||
let dimSpy = spyOn(chartObj, 'getContainerDimensions');
|
||||
|
||||
dimSpy.and.returnValue({
|
||||
height: 1, width: 1,
|
||||
});
|
||||
expect(chartObj.isVisible()).toEqual(true);
|
||||
dimSpy.and.stub();
|
||||
|
||||
dimSpy.and.returnValue({
|
||||
height: 0, width: 0,
|
||||
});
|
||||
expect(chartObj.isVisible()).toEqual(false);
|
||||
});
|
||||
|
||||
it('Check if isInPage returns correct', ()=>{
|
||||
expect(chartObj.isInPage()).toEqual(true);
|
||||
$('body').find('#charting-test-container').remove();
|
||||
expect(chartObj.isInPage()).toEqual(false);
|
||||
});
|
||||
|
||||
afterEach(()=>{
|
||||
$('body').find('#charting-test-container').remove();
|
||||
});
|
||||
});
|
169
web/regression/javascript/dashboard/graphs_spec.js
Normal file
169
web/regression/javascript/dashboard/graphs_spec.js
Normal file
@ -0,0 +1,169 @@
|
||||
import jasmineEnzyme from 'jasmine-enzyme';
|
||||
import React from 'react';
|
||||
import {mount} from 'enzyme';
|
||||
import '../helper/enzyme.helper';
|
||||
|
||||
import Graphs, {GraphsWrapper} from '../../../pgadmin/dashboard/static/js/Graphs';
|
||||
import {X_AXIS_LENGTH, POINT_SIZE, transformData, legendCallback,
|
||||
getStatsUrl, statsReducer} from '../../../pgadmin/dashboard/static/js/Graphs';
|
||||
|
||||
describe('Graphs.js', ()=>{
|
||||
it('transformData', ()=>{
|
||||
expect(transformData({'Label1': [], 'Label2': []}, 1)).toEqual({
|
||||
labels: [...Array(X_AXIS_LENGTH).keys()],
|
||||
datasets: [{
|
||||
label: 'Label1',
|
||||
data: [],
|
||||
borderColor: '#00BCD4',
|
||||
backgroundColor: '#00BCD4',
|
||||
pointHitRadius: POINT_SIZE,
|
||||
},{
|
||||
label: 'Label2',
|
||||
data: [],
|
||||
borderColor: '#9CCC65',
|
||||
backgroundColor: '#9CCC65',
|
||||
pointHitRadius: POINT_SIZE,
|
||||
}],
|
||||
refreshRate: 1,
|
||||
});
|
||||
});
|
||||
|
||||
it('legendCallback', ()=>{
|
||||
expect(legendCallback({
|
||||
id: 1,
|
||||
data: {
|
||||
datasets: [{
|
||||
label: 'Label1',
|
||||
backgroundColor: '#00BCD4',
|
||||
},{
|
||||
label: 'Label2',
|
||||
backgroundColor: '#9CCC65',
|
||||
}],
|
||||
},
|
||||
})).toEqual([
|
||||
'<div class="1-legend d-flex">',
|
||||
'<div class="legend-value"><span style="background-color:#00BCD4"> </span>',
|
||||
'<span class="legend-label">Label1</span>',
|
||||
'</div>',
|
||||
'<div class="legend-value"><span style="background-color:#9CCC65"> </span>',
|
||||
'<span class="legend-label">Label2</span>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
].join(''));
|
||||
});
|
||||
|
||||
describe('getStatsUrl', ()=>{
|
||||
it('for server', ()=>{
|
||||
expect(getStatsUrl(432, -1, ['chart1'])).toEqual('/dashboard/dashboard_stats/432?chart_names=chart1');
|
||||
});
|
||||
it('for database', ()=>{
|
||||
expect(getStatsUrl(432, 123, ['chart1'])).toEqual('/dashboard/dashboard_stats/432/123?chart_names=chart1');
|
||||
});
|
||||
it('for multiple graphs', ()=>{
|
||||
expect(getStatsUrl(432, 123, ['chart1', 'chart2'])).toEqual('/dashboard/dashboard_stats/432/123?chart_names=chart1,chart2');
|
||||
});
|
||||
});
|
||||
|
||||
describe('statsReducer', ()=>{
|
||||
it('with incoming no counter', ()=>{
|
||||
let state = {
|
||||
'Label1': [], 'Label2': [],
|
||||
};
|
||||
let action = {
|
||||
incoming: {
|
||||
'Label1': 1, 'Label2': 2,
|
||||
},
|
||||
};
|
||||
let newState = {
|
||||
'Label1': [1], 'Label2': [2],
|
||||
};
|
||||
state = statsReducer(state, action);
|
||||
expect(state).toEqual(newState);
|
||||
});
|
||||
|
||||
it('with incoming with counter', ()=>{
|
||||
let state = {
|
||||
'Label1': [1], 'Label2': [2],
|
||||
};
|
||||
let action = {
|
||||
incoming: {
|
||||
'Label1': 1, 'Label2': 3,
|
||||
},
|
||||
counter: true,
|
||||
counterData: {'Label1': 1, 'Label2': 2},
|
||||
};
|
||||
let newState = {
|
||||
'Label1': [0, 1], 'Label2': [1, 2],
|
||||
};
|
||||
state = statsReducer(state, action);
|
||||
expect(state).toEqual(newState);
|
||||
});
|
||||
|
||||
it('with reset', ()=>{
|
||||
let state = {
|
||||
'Label1': [0, 1], 'Label2': [1, 2],
|
||||
};
|
||||
let action = {
|
||||
reset: {
|
||||
'Label1': [2], 'Label2': [2],
|
||||
},
|
||||
};
|
||||
let newState = {
|
||||
'Label1': [2], 'Label2': [2],
|
||||
};
|
||||
state = statsReducer(state, action);
|
||||
expect(state).toEqual(newState);
|
||||
});
|
||||
});
|
||||
|
||||
describe('<Graphs /> component', ()=>{
|
||||
let graphComp = null;
|
||||
let sid = 1;
|
||||
let did = 1;
|
||||
beforeEach(()=>{
|
||||
jasmineEnzyme();
|
||||
let dashboardPref = {
|
||||
session_stats_refresh: 1,
|
||||
tps_stats_refresh: 1,
|
||||
ti_stats_refresh: 1,
|
||||
to_stats_refresh: 1,
|
||||
bio_stats_refresh: 1,
|
||||
show_graphs: true,
|
||||
graph_data_points: true,
|
||||
graph_mouse_track: true,
|
||||
};
|
||||
|
||||
graphComp = mount(<Graphs preferences={dashboardPref} sid={sid} did={did} enablePoll={false} pageVisible={true} />);
|
||||
});
|
||||
|
||||
it('GraphsWrapper is rendered', (done)=>{
|
||||
let found = graphComp.find(GraphsWrapper);
|
||||
expect(found.length).toBe(1);
|
||||
done();
|
||||
});
|
||||
|
||||
it('pollDelay is set', (done)=>{
|
||||
let found = graphComp.find('[data-testid="graph-poll-delay"]');
|
||||
expect(found).toHaveClassName('d-none');
|
||||
expect(found).toHaveText('1000');
|
||||
done();
|
||||
});
|
||||
|
||||
it('pollDelay on preference update', (done)=>{
|
||||
let dashboardPref = {
|
||||
session_stats_refresh: 5,
|
||||
tps_stats_refresh: 10,
|
||||
ti_stats_refresh: 5,
|
||||
to_stats_refresh: 10,
|
||||
bio_stats_refresh: 10,
|
||||
show_graphs: true,
|
||||
graph_data_points: true,
|
||||
graph_mouse_track: true,
|
||||
};
|
||||
graphComp.setProps({preferences: dashboardPref});
|
||||
let found = graphComp.find('[data-testid="graph-poll-delay"]');
|
||||
expect(found).toHaveText('5000');
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
90
web/regression/javascript/dashboard/graphs_wrapper_spec.js
Normal file
90
web/regression/javascript/dashboard/graphs_wrapper_spec.js
Normal file
@ -0,0 +1,90 @@
|
||||
import jasmineEnzyme from 'jasmine-enzyme';
|
||||
import React from 'react';
|
||||
import {mount} from 'enzyme';
|
||||
import '../helper/enzyme.helper';
|
||||
|
||||
import {GraphsWrapper, X_AXIS_LENGTH, POINT_SIZE} from '../../../pgadmin/dashboard/static/js/Graphs';
|
||||
|
||||
describe('<GraphsWrapper /> component', ()=>{
|
||||
let graphComp = null;
|
||||
let defaultStats = {
|
||||
labels: [...Array(X_AXIS_LENGTH).keys()],
|
||||
datasets: [{
|
||||
label: 'Label1',
|
||||
data: [],
|
||||
borderColor: '#00BCD4',
|
||||
backgroundColor: '#00BCD4',
|
||||
pointHitRadius: POINT_SIZE,
|
||||
},{
|
||||
label: 'Label2',
|
||||
data: [],
|
||||
borderColor: '#9CCC65',
|
||||
backgroundColor: '#9CCC65',
|
||||
pointHitRadius: POINT_SIZE,
|
||||
}],
|
||||
refreshRate: 1,
|
||||
};
|
||||
beforeEach(()=>{
|
||||
jasmineEnzyme();
|
||||
graphComp = mount(<GraphsWrapper sessionStats={defaultStats}
|
||||
tpsStats={defaultStats}
|
||||
tiStats={defaultStats}
|
||||
toStats={defaultStats}
|
||||
bioStats={defaultStats}
|
||||
errorMsg={null}
|
||||
showTooltip={true}
|
||||
showDataPoints={true}
|
||||
isDatabase={false} />);
|
||||
});
|
||||
|
||||
it('graph containers are rendered', (done)=>{
|
||||
let found = graphComp.find('.card.dashboard-graph');
|
||||
expect(found.length).toBe(5);
|
||||
done();
|
||||
});
|
||||
|
||||
it('graph headers are correct', (done)=>{
|
||||
let found = graphComp.find('.card.dashboard-graph');
|
||||
expect(found.at(0)).toIncludeText('Server sessions');
|
||||
expect(found.at(1)).toIncludeText('Transactions per second');
|
||||
expect(found.at(2)).toIncludeText('Tuples in');
|
||||
expect(found.at(3)).toIncludeText('Tuples out');
|
||||
expect(found.at(4)).toIncludeText('Block I/O');
|
||||
done();
|
||||
});
|
||||
|
||||
it('graph headers when database', (done)=>{
|
||||
let found = graphComp.find('.card.dashboard-graph');
|
||||
graphComp.setProps({isDatabase: true});
|
||||
expect(found.at(0)).toIncludeText('Database sessions');
|
||||
done();
|
||||
});
|
||||
|
||||
it('graph body has the canvas', (done)=>{
|
||||
let found = graphComp.find('.card.dashboard-graph .dashboard-graph-body canvas');
|
||||
expect(found.at(0).length).toBe(1);
|
||||
expect(found.at(1).length).toBe(1);
|
||||
expect(found.at(2).length).toBe(1);
|
||||
expect(found.at(3).length).toBe(1);
|
||||
expect(found.at(4).length).toBe(1);
|
||||
done();
|
||||
});
|
||||
|
||||
it('graph body shows the error', (done)=>{
|
||||
graphComp.setProps({errorMsg: 'Some error occurred'});
|
||||
let found = graphComp.find('.card.dashboard-graph .dashboard-graph-body .chart-wrapper');
|
||||
expect(found.at(0)).toHaveClassName('d-none');
|
||||
expect(found.at(1)).toHaveClassName('d-none');
|
||||
expect(found.at(2)).toHaveClassName('d-none');
|
||||
expect(found.at(3)).toHaveClassName('d-none');
|
||||
expect(found.at(4)).toHaveClassName('d-none');
|
||||
|
||||
found = graphComp.find('.card.dashboard-graph .dashboard-graph-body .pg-panel-error.pg-panel-message');
|
||||
expect(found.at(0)).toIncludeText('Some error occurred');
|
||||
expect(found.at(1)).toIncludeText('Some error occurred');
|
||||
expect(found.at(2)).toIncludeText('Some error occurred');
|
||||
expect(found.at(3)).toIncludeText('Some error occurred');
|
||||
expect(found.at(4)).toIncludeText('Some error occurred');
|
||||
done();
|
||||
});
|
||||
});
|
@ -21,5 +21,6 @@ define(function () {
|
||||
'datagrid.panel': '/panel/<int:trans_id>',
|
||||
'search_objects.types': '/search_objects/types/<int:sid>/<int:did>',
|
||||
'search_objects.search': '/search_objects/search/<int:sid>/<int:did>',
|
||||
'dashboard.dashboard_stats': '/dashboard/dashboard_stats',
|
||||
};
|
||||
});
|
||||
|
4
web/regression/javascript/helper/enzyme.helper.js
Normal file
4
web/regression/javascript/helper/enzyme.helper.js
Normal file
@ -0,0 +1,4 @@
|
||||
import Enzyme from 'enzyme';
|
||||
import Adapter from 'enzyme-adapter-react-16';
|
||||
|
||||
Enzyme.configure({adapter: new Adapter()});
|
@ -309,11 +309,6 @@ var getThemeWebpackConfig = function(theme_name) {
|
||||
// Module and Rules: https://webpack.js.org/configuration/module/
|
||||
// Loaders: https://webpack.js.org/loaders/
|
||||
//
|
||||
// imports-loader: it adds dependent modules(use:imports-loader?module1)
|
||||
// at the beginning of module it is dependency of like:
|
||||
// var jQuery = require('jquery'); var browser = require('pgadmin.browser')
|
||||
// It solves number of problems
|
||||
// Ref: http:/github.com/webpack-contrib/imports-loader/
|
||||
rules: themeCssRules(theme_name),
|
||||
},
|
||||
resolve: {
|
||||
@ -393,12 +388,13 @@ module.exports = [{
|
||||
// It solves number of problems
|
||||
// Ref: http:/github.com/webpack-contrib/imports-loader/
|
||||
rules: [{
|
||||
test: /\.js$/,
|
||||
test: /\.jsx?$/,
|
||||
exclude: [/node_modules/, /vendor/],
|
||||
use: {
|
||||
loader: 'babel-loader',
|
||||
options: {
|
||||
presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}]],
|
||||
presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}], '@babel/preset-react'],
|
||||
plugins: ['@babel/plugin-proposal-class-properties'],
|
||||
},
|
||||
},
|
||||
}, {
|
||||
@ -420,6 +416,11 @@ module.exports = [{
|
||||
query: webpackShimConfig,
|
||||
include: path.join(__dirname, '/pgadmin/browser'),
|
||||
}, {
|
||||
// imports-loader: it adds dependent modules(use:imports-loader?module1)
|
||||
// at the beginning of module it is dependency of like:
|
||||
// var jQuery = require('jquery'); var browser = require('pgadmin.browser')
|
||||
// It solves number of problems
|
||||
// Ref: http:/github.com/webpack-contrib/imports-loader/
|
||||
test: require.resolve('./pgadmin/tools/datagrid/static/js/datagrid'),
|
||||
use: {
|
||||
loader: 'imports-loader?' +
|
||||
@ -517,7 +518,7 @@ module.exports = [{
|
||||
resolve: {
|
||||
alias: webpackShimConfig.resolveAlias,
|
||||
modules: ['node_modules', '.'],
|
||||
extensions: ['.js'],
|
||||
extensions: ['.js', '.jsx'],
|
||||
unsafeCache: true,
|
||||
},
|
||||
// Watch mode Configuration: After initial build, webpack will watch for
|
||||
|
@ -82,9 +82,6 @@ var webpackShimConfig = {
|
||||
'deps': ['jquery', 'jquery.ui', 'jquery.event.drag'],
|
||||
'exports': 'Slick',
|
||||
},
|
||||
'flotr2': {
|
||||
deps: ['bean'],
|
||||
},
|
||||
'alertify': {
|
||||
'exports': 'alertify',
|
||||
},
|
||||
@ -141,8 +138,6 @@ var webpackShimConfig = {
|
||||
'moment': path.join(__dirname, './node_modules/moment/moment'),
|
||||
'jquery.event.drag': path.join(__dirname, './node_modules/slickgrid/lib/jquery.event.drag-2.3.0'),
|
||||
'jquery.ui': path.join(__dirname, './node_modules/slickgrid/lib/jquery-ui-1.11.3'),
|
||||
'flotr2': path.join(__dirname, './node_modules/flotr2/flotr2.amd'),
|
||||
'bean': path.join(__dirname, './node_modules/flotr2/lib/bean'),
|
||||
'jqueryui.position': path.join(__dirname, './node_modules/jquery-contextmenu/dist/jquery.ui.position'),
|
||||
'jquery.contextmenu': path.join(__dirname, './node_modules/jquery-contextmenu/dist/jquery.contextMenu'),
|
||||
'dropzone': path.join(__dirname, './node_modules/dropzone/dist/dropzone'),
|
||||
|
@ -31,12 +31,13 @@ module.exports = {
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.js$/,
|
||||
test: /\.jsx?$/,
|
||||
exclude: [/node_modules/, /vendor/],
|
||||
use: {
|
||||
loader: 'babel-loader',
|
||||
options: {
|
||||
presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}]],
|
||||
presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}], '@babel/preset-react'],
|
||||
plugins: ['@babel/plugin-proposal-class-properties'],
|
||||
sourceMap: 'inline',
|
||||
},
|
||||
},
|
||||
@ -68,7 +69,7 @@ module.exports = {
|
||||
},
|
||||
|
||||
resolve: {
|
||||
extensions: ['.js'],
|
||||
extensions: ['.js', '.jsx'],
|
||||
alias: {
|
||||
'top': path.join(__dirname, './pgadmin'),
|
||||
'jquery': path.join(__dirname, './node_modules/jquery/dist/jquery'),
|
||||
@ -90,8 +91,6 @@ module.exports = {
|
||||
'slickgrid': nodeModulesDir + '/slickgrid/',
|
||||
'slickgrid.plugins': nodeModulesDir + '/slickgrid/plugins/',
|
||||
'slickgrid.grid': nodeModulesDir + '/slickgrid/slick.grid',
|
||||
'bean': path.join(__dirname, './node_modules/flotr2/lib/bean'),
|
||||
'flotr2': path.join(__dirname, './node_modules/flotr2/flotr2.amd'),
|
||||
'moment': path.join(__dirname, './node_modules/moment/moment'),
|
||||
'browser': path.resolve(__dirname, 'pgadmin/browser/static/js'),
|
||||
'pgadmin': sourcesDir + '/js/pgadmin',
|
||||
|
854
web/yarn.lock
854
web/yarn.lock
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user