SPRINT-20: several widget updates, saved filters updates, updates unified widget/view/edit record screen section/widget headers

This commit is contained in:
Tim Chamberlain
2023-02-08 22:42:21 -06:00
parent 54e3b82ad5
commit 60cd1c190d
22 changed files with 398 additions and 633 deletions

440
package-lock.json generated
View File

@ -11,7 +11,7 @@
"@auth0/auth0-react": "1.10.2", "@auth0/auth0-react": "1.10.2",
"@emotion/react": "11.7.1", "@emotion/react": "11.7.1",
"@emotion/styled": "11.6.0", "@emotion/styled": "11.6.0",
"@kingsrook/qqq-frontend-core": "1.0.48", "@kingsrook/qqq-frontend-core": "1.0.51",
"@mui/icons-material": "5.4.1", "@mui/icons-material": "5.4.1",
"@mui/material": "5.11.1", "@mui/material": "5.11.1",
"@mui/styles": "5.11.1", "@mui/styles": "5.11.1",
@ -542,9 +542,9 @@
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.20.13", "version": "7.20.15",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz",
"integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==",
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
}, },
@ -1175,9 +1175,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-block-scoping": { "node_modules/@babel/plugin-transform-block-scoping": {
"version": "7.20.14", "version": "7.20.15",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.14.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz",
"integrity": "sha512-sMPepQtsOs5fM1bwNvuJJHvaCfOEQfmc01FGw0ELlTpTJj5Ql/zuNRRldYhAPys4ghXdBIQJbRVYi44/7QflQQ==", "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^7.20.2" "@babel/helper-plugin-utils": "^7.20.2"
@ -1909,6 +1909,12 @@
"@babel/core": "^7.0.0-0" "@babel/core": "^7.0.0-0"
} }
}, },
"node_modules/@babel/regjsgen": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
"integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
"dev": true
},
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.20.13", "version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
@ -3354,9 +3360,9 @@
} }
}, },
"node_modules/@kingsrook/qqq-frontend-core": { "node_modules/@kingsrook/qqq-frontend-core": {
"version": "1.0.48", "version": "1.0.51",
"resolved": "https://npm.pkg.github.com/download/@Kingsrook/qqq-frontend-core/1.0.48/27c1a09d17eccc82cf07c76db8c74ee89a92161e", "resolved": "https://npm.pkg.github.com/download/@Kingsrook/qqq-frontend-core/1.0.51/b4c2324c74f5171123cb87b87e52f4b3d45b5ab9",
"integrity": "sha512-781sx4RxIh6x5azNh+Nh5wtP5dPZ8nprTYVPNrBH0XsPB397bxgF3+bjfdtDFpaBkRAWuCiKoVEcz5eJZtT9dg==", "integrity": "sha512-Elpb+t1pLlpKTkFNiy1xaHPt8cloDRFe7ud6w48I9wIhYAOkObXPlXz+ubo+gIh7GJ4dLqsp+RqIcQQGnOCBTg==",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"axios": "0.27.2", "axios": "0.27.2",
@ -3402,9 +3408,9 @@
} }
}, },
"node_modules/@mui/core-downloads-tracker": { "node_modules/@mui/core-downloads-tracker": {
"version": "5.11.7", "version": "5.11.8",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.7.tgz", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.8.tgz",
"integrity": "sha512-lZgX7XQTk0zVcpwEa80r+T4y09dosnUxWvFPSikU/2Hh5wnyNOek8WfJwGCNsaRiXJHMi5eHY+z8oku4u5lgNw==", "integrity": "sha512-n/uJRIwZAaJaROaOA4VzycxDo27cusnrRzfycnAkAP5gBndwOJQ1CXjd1Y7hJe5eorj/ukixC7IZD+qCClMCMg==",
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/mui" "url": "https://opencollective.com/mui"
@ -3506,11 +3512,11 @@
} }
}, },
"node_modules/@mui/styled-engine": { "node_modules/@mui/styled-engine": {
"version": "5.11.0", "version": "5.11.8",
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.0.tgz", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.8.tgz",
"integrity": "sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ==", "integrity": "sha512-iSpZp9AoeictsDi5xAQ4PGXu7mKtQyzMl7ZaWpHIGMFpsNnfY3NQNg+wkj/gpsAZ+Zg+IIyD+t+ig71Kr9fa0w==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.6", "@babel/runtime": "^7.20.7",
"@emotion/cache": "^11.10.5", "@emotion/cache": "^11.10.5",
"csstype": "^3.1.1", "csstype": "^3.1.1",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
@ -4378,9 +4384,9 @@
"integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow=="
}, },
"node_modules/@types/eslint": { "node_modules/@types/eslint": {
"version": "8.4.10", "version": "8.21.0",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz",
"integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/estree": "*", "@types/estree": "*",
@ -4404,13 +4410,13 @@
"dev": true "dev": true
}, },
"node_modules/@types/express": { "node_modules/@types/express": {
"version": "4.17.16", "version": "4.17.17",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
"integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
"devOptional": true, "devOptional": true,
"dependencies": { "dependencies": {
"@types/body-parser": "*", "@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.31", "@types/express-serve-static-core": "^4.17.33",
"@types/qs": "*", "@types/qs": "*",
"@types/serve-static": "*" "@types/serve-static": "*"
} }
@ -4805,12 +4811,12 @@
"dev": true "dev": true
}, },
"node_modules/@typescript-eslint/experimental-utils": { "node_modules/@typescript-eslint/experimental-utils": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.51.0.tgz",
"integrity": "sha512-gZIhzNRivy0RVqcxjKnQ+ipGc0qolilhBeNmvH+Dvu7Vymug+IfiYxTj2zM7mIlHsw6Q5aH7L7WmuTE3tZyzag==", "integrity": "sha512-8/3+ZyBENl2aog1/QB3S39ptkZ2oRhDB+sJt15UWXBE3skgwL1C8BN9RjpOyhTejwR2hVrvqEjcYcNY6qtZ7nw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/utils": "5.50.0" "@typescript-eslint/utils": "5.51.0"
}, },
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -4824,13 +4830,13 @@
} }
}, },
"node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz",
"integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/visitor-keys": "5.50.0" "@typescript-eslint/visitor-keys": "5.51.0"
}, },
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -4841,9 +4847,9 @@
} }
}, },
"node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz",
"integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -4854,13 +4860,13 @@
} }
}, },
"node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz",
"integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/visitor-keys": "5.50.0", "@typescript-eslint/visitor-keys": "5.51.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -4881,16 +4887,16 @@
} }
}, },
"node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/utils": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz",
"integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/json-schema": "^7.0.9", "@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.50.0", "@typescript-eslint/scope-manager": "5.51.0",
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/typescript-estree": "5.50.0", "@typescript-eslint/typescript-estree": "5.51.0",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"semver": "^7.3.7" "semver": "^7.3.7"
@ -4907,12 +4913,12 @@
} }
}, },
"node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz",
"integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
}, },
"engines": { "engines": {
@ -6529,9 +6535,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001450", "version": "1.0.30001451",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz",
"integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -8226,9 +8232,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.284", "version": "1.4.291",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.291.tgz",
"integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" "integrity": "sha512-8vk4rSMBh9LRfZKE6wcxOLmlfA4Xsa4v0RRwB6VJkAH703klC9XfZIocmTk2gLBzW31P6XbuNeMt1aB5aAu/2g=="
}, },
"node_modules/emittery": { "node_modules/emittery": {
"version": "0.8.1", "version": "0.8.1",
@ -8897,9 +8903,9 @@
} }
}, },
"node_modules/eslint-plugin-testing-library": { "node_modules/eslint-plugin-testing-library": {
"version": "5.10.0", "version": "5.10.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.1.tgz",
"integrity": "sha512-aTOsCAEI9trrX3TLOnsskfhe57DmsjP/yMKLPqg4ftdRvfR4qut2PGWUa8TwP7whZbwMzJjh98tgAPcE8vdHow==", "integrity": "sha512-GRy87AqUi2Ij69pe0YnOXm3oGBCgnFwfIv+Hu9q/kT3jL0pX1cXA7aO+oJnvdpbJy2+riOPqGsa3iAkL888NLg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/utils": "^5.43.0" "@typescript-eslint/utils": "^5.43.0"
@ -8913,13 +8919,13 @@
} }
}, },
"node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": { "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz",
"integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/visitor-keys": "5.50.0" "@typescript-eslint/visitor-keys": "5.51.0"
}, },
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -8930,9 +8936,9 @@
} }
}, },
"node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz",
"integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -8943,13 +8949,13 @@
} }
}, },
"node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz",
"integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/visitor-keys": "5.50.0", "@typescript-eslint/visitor-keys": "5.51.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -8970,16 +8976,16 @@
} }
}, },
"node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/utils": { "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/utils": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz",
"integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/json-schema": "^7.0.9", "@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.50.0", "@typescript-eslint/scope-manager": "5.51.0",
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/typescript-estree": "5.50.0", "@typescript-eslint/typescript-estree": "5.51.0",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"semver": "^7.3.7" "semver": "^7.3.7"
@ -8996,12 +9002,12 @@
} }
}, },
"node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz",
"integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
}, },
"engines": { "engines": {
@ -15051,9 +15057,9 @@
"dev": true "dev": true
}, },
"node_modules/node-releases": { "node_modules/node-releases": {
"version": "2.0.9", "version": "2.0.10",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
"integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==" "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="
}, },
"node_modules/normalize-path": { "node_modules/normalize-path": {
"version": "3.0.0", "version": "3.0.0",
@ -15297,9 +15303,9 @@
} }
}, },
"node_modules/open": { "node_modules/open": {
"version": "8.4.0", "version": "8.4.1",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz",
"integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"define-lazy-prop": "^2.0.0", "define-lazy-prop": "^2.0.0",
@ -16151,9 +16157,9 @@
} }
}, },
"node_modules/postcss-js": { "node_modules/postcss-js": {
"version": "4.0.0", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"camelcase-css": "^2.0.1" "camelcase-css": "^2.0.1"
@ -16166,7 +16172,7 @@
"url": "https://opencollective.com/postcss/" "url": "https://opencollective.com/postcss/"
}, },
"peerDependencies": { "peerDependencies": {
"postcss": "^8.3.3" "postcss": "^8.4.21"
} }
}, },
"node_modules/postcss-lab-function": { "node_modules/postcss-lab-function": {
@ -17752,14 +17758,14 @@
} }
}, },
"node_modules/regexpu-core": { "node_modules/regexpu-core": {
"version": "5.2.2", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz",
"integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/regjsgen": "^0.8.0",
"regenerate": "^1.4.2", "regenerate": "^1.4.2",
"regenerate-unicode-properties": "^10.1.0", "regenerate-unicode-properties": "^10.1.0",
"regjsgen": "^0.7.1",
"regjsparser": "^0.9.1", "regjsparser": "^0.9.1",
"unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-ecmascript": "^2.0.0",
"unicode-match-property-value-ecmascript": "^2.1.0" "unicode-match-property-value-ecmascript": "^2.1.0"
@ -17768,12 +17774,6 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/regjsgen": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz",
"integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==",
"dev": true
},
"node_modules/regjsparser": { "node_modules/regjsparser": {
"version": "0.9.1", "version": "0.9.1",
"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
@ -19081,9 +19081,9 @@
"dev": true "dev": true
}, },
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "3.2.4", "version": "3.2.6",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.6.tgz",
"integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", "integrity": "sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"arg": "^5.0.2", "arg": "^5.0.2",
@ -19100,12 +19100,12 @@
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"object-hash": "^3.0.0", "object-hash": "^3.0.0",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
"postcss": "^8.4.18", "postcss": "^8.0.9",
"postcss-import": "^14.1.0", "postcss-import": "^14.1.0",
"postcss-js": "^4.0.0", "postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.4", "postcss-load-config": "^3.1.4",
"postcss-nested": "6.0.0", "postcss-nested": "6.0.0",
"postcss-selector-parser": "^6.0.10", "postcss-selector-parser": "^6.0.11",
"postcss-value-parser": "^4.2.0", "postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1", "quick-lru": "^5.1.1",
"resolve": "^1.22.1" "resolve": "^1.22.1"
@ -19192,9 +19192,9 @@
} }
}, },
"node_modules/terser": { "node_modules/terser": {
"version": "5.16.2", "version": "5.16.3",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.16.2.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz",
"integrity": "sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg==", "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@jridgewell/source-map": "^0.3.2", "@jridgewell/source-map": "^0.3.2",
@ -21147,9 +21147,9 @@
} }
}, },
"@babel/parser": { "@babel/parser": {
"version": "7.20.13", "version": "7.20.15",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz",
"integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==" "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg=="
}, },
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.18.6", "version": "7.18.6",
@ -21561,9 +21561,9 @@
} }
}, },
"@babel/plugin-transform-block-scoping": { "@babel/plugin-transform-block-scoping": {
"version": "7.20.14", "version": "7.20.15",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.14.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz",
"integrity": "sha512-sMPepQtsOs5fM1bwNvuJJHvaCfOEQfmc01FGw0ELlTpTJj5Ql/zuNRRldYhAPys4ghXdBIQJbRVYi44/7QflQQ==", "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-plugin-utils": "^7.20.2" "@babel/helper-plugin-utils": "^7.20.2"
@ -22052,6 +22052,12 @@
"@babel/plugin-transform-typescript": "^7.18.6" "@babel/plugin-transform-typescript": "^7.18.6"
} }
}, },
"@babel/regjsgen": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
"integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
"dev": true
},
"@babel/runtime": { "@babel/runtime": {
"version": "7.20.13", "version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
@ -23098,9 +23104,9 @@
} }
}, },
"@kingsrook/qqq-frontend-core": { "@kingsrook/qqq-frontend-core": {
"version": "1.0.48", "version": "1.0.51",
"resolved": "https://npm.pkg.github.com/download/@Kingsrook/qqq-frontend-core/1.0.48/27c1a09d17eccc82cf07c76db8c74ee89a92161e", "resolved": "https://npm.pkg.github.com/download/@Kingsrook/qqq-frontend-core/1.0.51/b4c2324c74f5171123cb87b87e52f4b3d45b5ab9",
"integrity": "sha512-781sx4RxIh6x5azNh+Nh5wtP5dPZ8nprTYVPNrBH0XsPB397bxgF3+bjfdtDFpaBkRAWuCiKoVEcz5eJZtT9dg==", "integrity": "sha512-Elpb+t1pLlpKTkFNiy1xaHPt8cloDRFe7ud6w48I9wIhYAOkObXPlXz+ubo+gIh7GJ4dLqsp+RqIcQQGnOCBTg==",
"requires": { "requires": {
"axios": "0.27.2", "axios": "0.27.2",
"form-data": "4.0.0" "form-data": "4.0.0"
@ -23128,9 +23134,9 @@
} }
}, },
"@mui/core-downloads-tracker": { "@mui/core-downloads-tracker": {
"version": "5.11.7", "version": "5.11.8",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.7.tgz", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.8.tgz",
"integrity": "sha512-lZgX7XQTk0zVcpwEa80r+T4y09dosnUxWvFPSikU/2Hh5wnyNOek8WfJwGCNsaRiXJHMi5eHY+z8oku4u5lgNw==" "integrity": "sha512-n/uJRIwZAaJaROaOA4VzycxDo27cusnrRzfycnAkAP5gBndwOJQ1CXjd1Y7hJe5eorj/ukixC7IZD+qCClMCMg=="
}, },
"@mui/icons-material": { "@mui/icons-material": {
"version": "5.4.1", "version": "5.4.1",
@ -23170,11 +23176,11 @@
} }
}, },
"@mui/styled-engine": { "@mui/styled-engine": {
"version": "5.11.0", "version": "5.11.8",
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.0.tgz", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.8.tgz",
"integrity": "sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ==", "integrity": "sha512-iSpZp9AoeictsDi5xAQ4PGXu7mKtQyzMl7ZaWpHIGMFpsNnfY3NQNg+wkj/gpsAZ+Zg+IIyD+t+ig71Kr9fa0w==",
"requires": { "requires": {
"@babel/runtime": "^7.20.6", "@babel/runtime": "^7.20.7",
"@emotion/cache": "^11.10.5", "@emotion/cache": "^11.10.5",
"csstype": "^3.1.1", "csstype": "^3.1.1",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
@ -23719,9 +23725,9 @@
"integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow=="
}, },
"@types/eslint": { "@types/eslint": {
"version": "8.4.10", "version": "8.21.0",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz",
"integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/estree": "*", "@types/estree": "*",
@ -23745,13 +23751,13 @@
"dev": true "dev": true
}, },
"@types/express": { "@types/express": {
"version": "4.17.16", "version": "4.17.17",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
"integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
"devOptional": true, "devOptional": true,
"requires": { "requires": {
"@types/body-parser": "*", "@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.31", "@types/express-serve-static-core": "^4.17.33",
"@types/qs": "*", "@types/qs": "*",
"@types/serve-static": "*" "@types/serve-static": "*"
} }
@ -24123,38 +24129,38 @@
} }
}, },
"@typescript-eslint/experimental-utils": { "@typescript-eslint/experimental-utils": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.51.0.tgz",
"integrity": "sha512-gZIhzNRivy0RVqcxjKnQ+ipGc0qolilhBeNmvH+Dvu7Vymug+IfiYxTj2zM7mIlHsw6Q5aH7L7WmuTE3tZyzag==", "integrity": "sha512-8/3+ZyBENl2aog1/QB3S39ptkZ2oRhDB+sJt15UWXBE3skgwL1C8BN9RjpOyhTejwR2hVrvqEjcYcNY6qtZ7nw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/utils": "5.50.0" "@typescript-eslint/utils": "5.51.0"
}, },
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": { "@typescript-eslint/scope-manager": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz",
"integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/visitor-keys": "5.50.0" "@typescript-eslint/visitor-keys": "5.51.0"
} }
}, },
"@typescript-eslint/types": { "@typescript-eslint/types": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz",
"integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==",
"dev": true "dev": true
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz",
"integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/visitor-keys": "5.50.0", "@typescript-eslint/visitor-keys": "5.51.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -24163,28 +24169,28 @@
} }
}, },
"@typescript-eslint/utils": { "@typescript-eslint/utils": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz",
"integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/json-schema": "^7.0.9", "@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.50.0", "@typescript-eslint/scope-manager": "5.51.0",
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/typescript-estree": "5.50.0", "@typescript-eslint/typescript-estree": "5.51.0",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"semver": "^7.3.7" "semver": "^7.3.7"
} }
}, },
"@typescript-eslint/visitor-keys": { "@typescript-eslint/visitor-keys": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz",
"integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
} }
}, },
@ -25390,9 +25396,9 @@
} }
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001450", "version": "1.0.30001451",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz",
"integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==" "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w=="
}, },
"case-sensitive-paths-webpack-plugin": { "case-sensitive-paths-webpack-plugin": {
"version": "2.4.0", "version": "2.4.0",
@ -26665,9 +26671,9 @@
} }
}, },
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.4.284", "version": "1.4.291",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.291.tgz",
"integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" "integrity": "sha512-8vk4rSMBh9LRfZKE6wcxOLmlfA4Xsa4v0RRwB6VJkAH703klC9XfZIocmTk2gLBzW31P6XbuNeMt1aB5aAu/2g=="
}, },
"emittery": { "emittery": {
"version": "0.8.1", "version": "0.8.1",
@ -27259,38 +27265,38 @@
"requires": {} "requires": {}
}, },
"eslint-plugin-testing-library": { "eslint-plugin-testing-library": {
"version": "5.10.0", "version": "5.10.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.1.tgz",
"integrity": "sha512-aTOsCAEI9trrX3TLOnsskfhe57DmsjP/yMKLPqg4ftdRvfR4qut2PGWUa8TwP7whZbwMzJjh98tgAPcE8vdHow==", "integrity": "sha512-GRy87AqUi2Ij69pe0YnOXm3oGBCgnFwfIv+Hu9q/kT3jL0pX1cXA7aO+oJnvdpbJy2+riOPqGsa3iAkL888NLg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/utils": "^5.43.0" "@typescript-eslint/utils": "^5.43.0"
}, },
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": { "@typescript-eslint/scope-manager": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz",
"integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/visitor-keys": "5.50.0" "@typescript-eslint/visitor-keys": "5.51.0"
} }
}, },
"@typescript-eslint/types": { "@typescript-eslint/types": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz",
"integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==",
"dev": true "dev": true
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz",
"integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/visitor-keys": "5.50.0", "@typescript-eslint/visitor-keys": "5.51.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -27299,28 +27305,28 @@
} }
}, },
"@typescript-eslint/utils": { "@typescript-eslint/utils": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz",
"integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/json-schema": "^7.0.9", "@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.50.0", "@typescript-eslint/scope-manager": "5.51.0",
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"@typescript-eslint/typescript-estree": "5.50.0", "@typescript-eslint/typescript-estree": "5.51.0",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"semver": "^7.3.7" "semver": "^7.3.7"
} }
}, },
"@typescript-eslint/visitor-keys": { "@typescript-eslint/visitor-keys": {
"version": "5.50.0", "version": "5.51.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz",
"integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.50.0", "@typescript-eslint/types": "5.51.0",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
} }
}, },
@ -31759,9 +31765,9 @@
"dev": true "dev": true
}, },
"node-releases": { "node-releases": {
"version": "2.0.9", "version": "2.0.10",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
"integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==" "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="
}, },
"normalize-path": { "normalize-path": {
"version": "3.0.0", "version": "3.0.0",
@ -31933,9 +31939,9 @@
} }
}, },
"open": { "open": {
"version": "8.4.0", "version": "8.4.1",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz",
"integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==",
"dev": true, "dev": true,
"requires": { "requires": {
"define-lazy-prop": "^2.0.0", "define-lazy-prop": "^2.0.0",
@ -32488,9 +32494,9 @@
"requires": {} "requires": {}
}, },
"postcss-js": { "postcss-js": {
"version": "4.0.0", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
"dev": true, "dev": true,
"requires": { "requires": {
"camelcase-css": "^2.0.1" "camelcase-css": "^2.0.1"
@ -33598,25 +33604,19 @@
"dev": true "dev": true
}, },
"regexpu-core": { "regexpu-core": {
"version": "5.2.2", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz",
"integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/regjsgen": "^0.8.0",
"regenerate": "^1.4.2", "regenerate": "^1.4.2",
"regenerate-unicode-properties": "^10.1.0", "regenerate-unicode-properties": "^10.1.0",
"regjsgen": "^0.7.1",
"regjsparser": "^0.9.1", "regjsparser": "^0.9.1",
"unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-ecmascript": "^2.0.0",
"unicode-match-property-value-ecmascript": "^2.1.0" "unicode-match-property-value-ecmascript": "^2.1.0"
} }
}, },
"regjsgen": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz",
"integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==",
"dev": true
},
"regjsparser": { "regjsparser": {
"version": "0.9.1", "version": "0.9.1",
"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
@ -34609,9 +34609,9 @@
"dev": true "dev": true
}, },
"tailwindcss": { "tailwindcss": {
"version": "3.2.4", "version": "3.2.6",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.6.tgz",
"integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", "integrity": "sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==",
"dev": true, "dev": true,
"requires": { "requires": {
"arg": "^5.0.2", "arg": "^5.0.2",
@ -34628,12 +34628,12 @@
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"object-hash": "^3.0.0", "object-hash": "^3.0.0",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
"postcss": "^8.4.18", "postcss": "^8.0.9",
"postcss-import": "^14.1.0", "postcss-import": "^14.1.0",
"postcss-js": "^4.0.0", "postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.4", "postcss-load-config": "^3.1.4",
"postcss-nested": "6.0.0", "postcss-nested": "6.0.0",
"postcss-selector-parser": "^6.0.10", "postcss-selector-parser": "^6.0.11",
"postcss-value-parser": "^4.2.0", "postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1", "quick-lru": "^5.1.1",
"resolve": "^1.22.1" "resolve": "^1.22.1"
@ -34690,9 +34690,9 @@
} }
}, },
"terser": { "terser": {
"version": "5.16.2", "version": "5.16.3",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.16.2.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz",
"integrity": "sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg==", "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"@jridgewell/source-map": "^0.3.2", "@jridgewell/source-map": "^0.3.2",

View File

@ -6,7 +6,7 @@
"@auth0/auth0-react": "1.10.2", "@auth0/auth0-react": "1.10.2",
"@emotion/react": "11.7.1", "@emotion/react": "11.7.1",
"@emotion/styled": "11.6.0", "@emotion/styled": "11.6.0",
"@kingsrook/qqq-frontend-core": "1.0.50", "@kingsrook/qqq-frontend-core": "1.0.51",
"@mui/icons-material": "5.4.1", "@mui/icons-material": "5.4.1",
"@mui/material": "5.11.1", "@mui/material": "5.11.1",
"@mui/styles": "5.11.1", "@mui/styles": "5.11.1",

View File

@ -511,7 +511,7 @@ function EntityForm(props: Props): JSX.Element
{formFields && nonT1Sections.length ? nonT1Sections.map((section: QTableSection) => ( {formFields && nonT1Sections.length ? nonT1Sections.map((section: QTableSection) => (
<Box key={`edit-card-${section.name}`} pb={3}> <Box key={`edit-card-${section.name}`} pb={3}>
<Card id={section.name} sx={{overflow: "visible", scrollMarginTop: "100px"}} elevation={cardElevation}> <Card id={section.name} sx={{overflow: "visible", scrollMarginTop: "100px"}} elevation={cardElevation}>
<MDTypography variant="h5" p={3} pb={1}> <MDTypography variant="h6" p={3} pb={1}>
{section.label} {section.label}
</MDTypography> </MDTypography>
<Box pb={1} px={3}> <Box pb={1} px={3}>

View File

@ -98,8 +98,6 @@ const navbarContainer = ({breakpoints}: Theme): any => ({
flexDirection: "column", flexDirection: "column",
alignItems: "flex-start", alignItems: "flex-start",
justifyContent: "space-between", justifyContent: "space-between",
pt: 0.5,
pb: 0.5,
[breakpoints.up("md")]: { [breakpoints.up("md")]: {
flexDirection: "row", flexDirection: "row",

View File

@ -25,11 +25,9 @@ import {QTableMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QT
import {QJobComplete} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobComplete"; import {QJobComplete} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobComplete";
import {QJobError} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobError"; import {QJobError} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobError";
import {QRecord} from "@kingsrook/qqq-frontend-core/lib/model/QRecord"; import {QRecord} from "@kingsrook/qqq-frontend-core/lib/model/QRecord";
import {FiberManualRecord, KeyboardArrowDown} from "@mui/icons-material"; import {FiberManualRecord} from "@mui/icons-material";
import {Alert, ClickAwayListener, Grow, MenuList, Paper, Popper} from "@mui/material"; import {Alert} from "@mui/material";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Button from "@mui/material/Button";
import ButtonGroup from "@mui/material/ButtonGroup";
import Dialog from "@mui/material/Dialog"; import Dialog from "@mui/material/Dialog";
import DialogActions from "@mui/material/DialogActions"; import DialogActions from "@mui/material/DialogActions";
import DialogContent from "@mui/material/DialogContent"; import DialogContent from "@mui/material/DialogContent";
@ -425,61 +423,6 @@ function SavedFilters({qController, metaData, tableMetaData, currentSavedFilter,
) )
} }
</Box> </Box>
<Box pl={2} m={0} sx={{display: "flex", alignItems: "center"}}>
<ButtonGroup variant="text" ref={anchorRef}>
{
hasStorePermission && (
<Button sx={{minHeight: 1, margin: 0, padding: 0, minWidth: "initial !important", border: "0 !important"}} onClick={() => handleDropdownOptionClick(SAVE_OPTION)}>{SAVE_OPTION}</Button>
)
}
{
currentSavedFilter && (
<Button sx={{minHeight: 1, margin: 0, padding: 0, minWidth: "20px !important", border: 0}} onClick={handleToggleSaveOptions} >
<KeyboardArrowDown />
</Button>
)
}
</ButtonGroup>
<Popper
sx={{
zIndex: 10,
marginLeft: "100px !important"
}}
open={saveOptionsOpen}
anchorEl={anchorRef.current}
transition
disablePortal
role={undefined}
nonce={undefined}
onResizeCapture={undefined}
onResize={null}>
{({TransitionProps, placement}) => (
<Grow
{...TransitionProps}
style={{
transformOrigin: "inherit",
}}
>
<Paper>
<ClickAwayListener onClickAway={handleSaveOptionsMenuClose}>
<MenuList id="split-button-menu" autoFocusItem>
{dropdownOptions.map((option, index) => (
(option === CLEAR_OPTION || ((option !== DELETE_OPTION || hasDeletePermission) && (option !== DUPLICATE_OPTION || hasStorePermission))) && (
<MenuItem
key={option}
onClick={() => handleDropdownOptionClick(option)}
>
{option}
</MenuItem>
)
))}
</MenuList>
</ClickAwayListener>
</Paper>
</Grow>
)}
</Popper>
</Box>
</Box> </Box>
{ {
<Dialog <Dialog

View File

@ -21,13 +21,11 @@
import {QWidgetMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QWidgetMetaData"; import {QWidgetMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QWidgetMetaData";
import {Skeleton} from "@mui/material"; import {Skeleton} from "@mui/material";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Card from "@mui/material/Card";
import Grid from "@mui/material/Grid"; import Grid from "@mui/material/Grid";
import parse from "html-react-parser"; import parse from "html-react-parser";
import React, {useEffect, useReducer, useState} from "react"; import React, {useEffect, useReducer, useState} from "react";
import {useLocation} from "react-router-dom"; import {useLocation} from "react-router-dom";
import colors from "qqq/assets/theme/base/colors"; import colors from "qqq/assets/theme/base/colors";
import MDBadgeDot from "qqq/components/legacy/MDBadgeDot";
import MDTypography from "qqq/components/legacy/MDTypography"; import MDTypography from "qqq/components/legacy/MDTypography";
import BarChart from "qqq/components/widgets/charts/barchart/BarChart"; import BarChart from "qqq/components/widgets/charts/barchart/BarChart";
import HorizontalBarChart from "qqq/components/widgets/charts/barchart/HorizontalBarChart"; import HorizontalBarChart from "qqq/components/widgets/charts/barchart/HorizontalBarChart";
@ -44,7 +42,6 @@ import StepperCard from "qqq/components/widgets/misc/StepperCard";
import USMapWidget from "qqq/components/widgets/misc/USMapWidget"; import USMapWidget from "qqq/components/widgets/misc/USMapWidget";
import ParentWidget from "qqq/components/widgets/ParentWidget"; import ParentWidget from "qqq/components/widgets/ParentWidget";
import MultiStatisticsCard from "qqq/components/widgets/statistics/MultiStatisticsCard"; import MultiStatisticsCard from "qqq/components/widgets/statistics/MultiStatisticsCard";
import SimpleStatisticsCard from "qqq/components/widgets/statistics/SimpleStatisticsCard";
import StatisticsCard from "qqq/components/widgets/statistics/StatisticsCard"; import StatisticsCard from "qqq/components/widgets/statistics/StatisticsCard";
import TableCard from "qqq/components/widgets/tables/TableCard"; import TableCard from "qqq/components/widgets/tables/TableCard";
import Widget, {WIDGET_DROPDOWN_SELECTION_LOCAL_STORAGE_KEY_ROOT} from "qqq/components/widgets/Widget"; import Widget, {WIDGET_DROPDOWN_SELECTION_LOCAL_STORAGE_KEY_ROOT} from "qqq/components/widgets/Widget";
@ -62,6 +59,7 @@ interface Props
omitWrappingGridContainer: boolean; omitWrappingGridContainer: boolean;
areChildren?: boolean areChildren?: boolean
childUrlParams?: string childUrlParams?: string
parentWidgetMetaData?: QWidgetMetaData
} }
DashboardWidgets.defaultProps = { DashboardWidgets.defaultProps = {
@ -70,10 +68,11 @@ DashboardWidgets.defaultProps = {
entityPrimaryKey: null, entityPrimaryKey: null,
omitWrappingGridContainer: false, omitWrappingGridContainer: false,
areChildren: false, areChildren: false,
childUrlParams: "" childUrlParams: "",
parentWidgetMetaData: null
}; };
function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omitWrappingGridContainer, areChildren, childUrlParams}: Props): JSX.Element function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omitWrappingGridContainer, areChildren, childUrlParams, parentWidgetMetaData}: Props): JSX.Element
{ {
const location = useLocation(); const location = useLocation();
const [widgetData, setWidgetData] = useState([] as any[]); const [widgetData, setWidgetData] = useState([] as any[]);
@ -103,18 +102,10 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
setWidgetData(widgetData); setWidgetData(widgetData);
}, [widgetMetaDataList]); }, [widgetMetaDataList]);
useEffect(() => const reloadWidget = async (index: number, data: string) =>
{ {
setWidgetData([] as any[]); widgetData[index] = await qController.widget(widgetMetaDataList[index].name, getQueryParams(null, data));
}, [location.pathname]); forceUpdate();
const reloadWidget = (index: number, data: string) =>
{
setTimeout(async () =>
{
widgetData[index] = await qController.widget(widgetMetaDataList[index].name, getQueryParams(null, data));
setWidgetCounter(widgetCounter + 1);
}, 1);
}; };
function getQueryParams(widgetMetaData: QWidgetMetaData, extraParams: string): string function getQueryParams(widgetMetaData: QWidgetMetaData, extraParams: string): string
@ -146,12 +137,15 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
// see if local storage is used for any widget dropdowns, if so, look them // // see if local storage is used for any widget dropdowns, if so, look them //
// up and append to the query string // // up and append to the query string //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
if(widgetMetaData && widgetMetaData.storeDropdownSelections && widgetMetaData.dropdowns) let thisWidgetHasDropdowns = widgetMetaData && widgetMetaData.storeDropdownSelections && widgetMetaData.dropdowns;
let parentWidgetHasDropdowns = parentWidgetMetaData && parentWidgetMetaData.storeDropdownSelections && parentWidgetMetaData.dropdowns;
if(thisWidgetHasDropdowns || parentWidgetHasDropdowns)
{ {
for(let i = 0; i< widgetMetaData.dropdowns.length; i++) const metaDataToUse = (thisWidgetHasDropdowns) ? widgetMetaData : parentWidgetMetaData;
for(let i = 0; i< metaDataToUse.dropdowns.length; i++)
{ {
const dropdownName = widgetMetaData.dropdowns[i].possibleValueSourceName; const dropdownName = metaDataToUse.dropdowns[i].possibleValueSourceName;
const localStorageKey = `${WIDGET_DROPDOWN_SELECTION_LOCAL_STORAGE_KEY_ROOT}.${widgetMetaData.name}.${dropdownName}`; const localStorageKey = `${WIDGET_DROPDOWN_SELECTION_LOCAL_STORAGE_KEY_ROOT}.${metaDataToUse.name}.${dropdownName}`;
const json = JSON.parse(localStorage.getItem(localStorageKey)); const json = JSON.parse(localStorage.getItem(localStorageKey));
if(json) if(json)
{ {
@ -235,18 +229,15 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
} }
{ {
widgetMetaData.type === "stepper" && ( widgetMetaData.type === "stepper" && (
<Card sx={{alignItems: "stretch", flexGrow: 1, display: "flex", marginTop: "0px", paddingTop: "0px"}}> <Widget
<Box padding="1rem"> widgetMetaData={widgetMetaData}
{ widgetData={widgetData[i]}>
widgetMetaData.label && ( <Box sx={{alignItems: "stretch", flexGrow: 1, display: "flex", marginTop: "0px", paddingTop: "0px"}}>
<MDTypography variant="h5" textTransform="capitalize"> <Box padding="1rem" sx={{width: "100%"}}>
{widgetMetaData.label} <StepperCard data={widgetData[i]} />
</MDTypography> </Box>
)
}
<StepperCard data={widgetData[i]} />
</Box> </Box>
</Card> </Widget>
) )
} }
{ {
@ -282,11 +273,10 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
widgetMetaData={widgetMetaData} widgetMetaData={widgetMetaData}
widgetData={widgetData[i]} widgetData={widgetData[i]}
isChild={areChildren} isChild={areChildren}
reloadWidgetCallback={(data) => reloadWidget(i, data)}>
// reloadWidgetCallback={(data) => reloadWidget(i, data)}
>
<StatisticsCard <StatisticsCard
title={widgetMetaData.label}
color={colors.info.main}
icon={widgetMetaData.icon}
data={widgetData[i]} data={widgetData[i]}
increaseIsGood={true} increaseIsGood={true}
/> />
@ -294,18 +284,6 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
) )
) )
} }
{
widgetMetaData.type === "simpleStatistics" && (
widgetData && widgetData[i] && (
<SimpleStatisticsCard
title={widgetMetaData.label}
data={widgetData[i]}
increaseIsGood={widgetData[i].increaseIsGood}
isCurrency={widgetData[i].isCurrency}
/>
)
)
}
{ {
widgetMetaData.type === "multiStatistics" && ( widgetMetaData.type === "multiStatistics" && (
<MultiStatisticsCard <MultiStatisticsCard
@ -337,8 +315,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
widgetMetaData={widgetMetaData} widgetMetaData={widgetMetaData}
widgetData={widgetData[i]} widgetData={widgetData[i]}
isChild={areChildren} isChild={areChildren}
reloadWidgetCallback={(data) => reloadWidget(i, data)}> >
<div> <div>
<PieChart <PieChart
chartData={widgetData[i]?.chartData} chartData={widgetData[i]?.chartData}
@ -367,26 +344,15 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
} }
{ {
widgetMetaData.type === "lineChart" && ( widgetMetaData.type === "lineChart" && (
widgetData && widgetData[i] && widgetData[i].chartData && widgetData[i].chartData?.datasets ? ( <Widget
widgetMetaData={widgetMetaData}
widgetData={widgetData[i]}
isChild={areChildren}>
<DefaultLineChart sx={{alignItems: "center"}} <DefaultLineChart sx={{alignItems: "center"}}
title={widgetData[i].title} data={widgetData[i]?.chartData}
description={( isYAxisCurrency={widgetData[i]?.isYAxisCurrency}
<Box display="flex" justifyContent="space-between">
<Box display="flex" ml={-1}>
{
widgetData[i].chartData.datasets.map((dataSet: any) => (
<MDBadgeDot key={dataSet.label} color={dataSet.color} size="sm" badgeContent={dataSet.label} />
))
}
</Box>
<Box mt={-4} mr={-1} position="absolute" right="1.5rem" />
</Box>
)}
data={widgetData[i].chartData as { labels: string[]; datasets: { label: string; color: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "light" | "dark"; data: number[]; }[]; }}
isYAxisCurrency={widgetData[i].isYAxisCurrency}
isChild={areChildren}
/> />
) : null </Widget>
) )
} }
{ {

View File

@ -41,6 +41,7 @@ export interface ParentWidgetData
}[][]; }[][];
childWidgetNameList: string[]; childWidgetNameList: string[];
dropdownNeedsSelectedText?: string; dropdownNeedsSelectedText?: string;
storeDropdownSelections?: boolean;
icon?: string; icon?: string;
} }
@ -93,7 +94,6 @@ function ParentWidget({urlParams, widgetMetaData, widgetIndex, data, reloadWidge
const parentReloadWidgetCallback = (data: string) => const parentReloadWidgetCallback = (data: string) =>
{ {
setChildUrlParams(data); setChildUrlParams(data);
reloadWidgetCallback(widgetIndex, data); reloadWidgetCallback(widgetIndex, data);
} }
@ -107,7 +107,7 @@ function ParentWidget({urlParams, widgetMetaData, widgetIndex, data, reloadWidge
reloadWidgetCallback={parentReloadWidgetCallback} reloadWidgetCallback={parentReloadWidgetCallback}
> >
<Box sx={{height: "100%", width: "100%"}}> <Box sx={{height: "100%", width: "100%"}}>
<DashboardWidgets widgetMetaDataList={widgets} entityPrimaryKey={entityPrimaryKey} tableName={tableName} childUrlParams={childUrlParams} areChildren={true} /> <DashboardWidgets widgetMetaDataList={widgets} entityPrimaryKey={entityPrimaryKey} tableName={tableName} childUrlParams={childUrlParams} areChildren={true} parentWidgetMetaData={widgetMetaData}/>
</Box> </Box>
</Widget> </Widget>
) : null ) : null

View File

@ -41,6 +41,7 @@ export interface WidgetData
label: string label: string
}[][]; }[][];
dropdownNeedsSelectedText?: string; dropdownNeedsSelectedText?: string;
hasPermission?: boolean;
} }
@ -172,9 +173,8 @@ function Widget(props: React.PropsWithChildren<Props>): JSX.Element
const dropdown = component as Dropdown const dropdown = component as Dropdown
return ( return (
<Box my={2} mr={2} sx={{float: "right"}}> <Box my={2} sx={{float: "right"}}>
<DropdownMenu <DropdownMenu
localStorageKey={localStorageKey}
defaultValue={defaultValue} defaultValue={defaultValue}
sx={{width: 200, marginLeft: "15px"}} sx={{width: 200, marginLeft: "15px"}}
label={`Select ${dropdown.label}`} label={`Select ${dropdown.label}`}
@ -283,75 +283,103 @@ function Widget(props: React.PropsWithChildren<Props>): JSX.Element
} }
}, [counter]); }, [counter]);
const hasPermission = props.widgetData?.hasPermission === undefined || props.widgetData?.hasPermission === true;
const widgetContent = const widgetContent =
<Box sx={{width: "100%"}}> <Box sx={{width: "100%"}}>
<Box display="flex" justifyContent="space-between" alignItems="center" sx={{width: "100%"}}> <Box pr={3} display="flex" justifyContent="space-between" alignItems="flex-start" sx={{width: "100%"}}>
<Box pt={2}> <Box pt={2}>
{ {
props.widgetMetaData?.icon && ( hasPermission ?
<Box props.widgetMetaData?.icon && (
ml={3} <Box
mt={-4} ml={3}
sx={{ mt={-4}
display: "flex", sx={{
justifyContent: "center", display: "flex",
alignItems: "center", justifyContent: "center",
width: "64px", alignItems: "center",
height: "64px", width: "64px",
borderRadius: "8px", height: "64px",
background: colors.info.main, borderRadius: "8px",
color: "#ffffff", background: colors.info.main,
float: "left" color: "#ffffff",
}} float: "left"
> }}
<Icon fontSize="medium" color="inherit"> >
{props.widgetMetaData.icon} <Icon fontSize="medium" color="inherit">
</Icon> {props.widgetMetaData.icon}
</Box> </Icon>
</Box>
) ) : (
<Box
ml={3}
mt={-4}
sx={{
display: "flex",
justifyContent: "center",
alignItems: "center",
width: "64px",
height: "64px",
borderRadius: "8px",
background: colors.info.main,
color: "#ffffff",
float: "left"
}}
>
<Icon fontSize="medium" color="inherit">lock</Icon>
</Box>
)
} }
{ {
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// first look for a label in the widget data, which would override that in the metadata // // first look for a label in the widget data, which would override that in the metadata //
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
props.widgetData?.label? ( hasPermission && props.widgetData?.label? (
<Typography variant="h5" fontWeight="medium" pl={3} display="inline"> <Typography sx={{position: "relative", top: -4}} variant="h6" fontWeight="medium" pl={2} display="inline">
{props.widgetData.label} {props.widgetData.label}
</Typography> </Typography>
) : ( ) : (
props.widgetMetaData?.label && ( hasPermission && props.widgetMetaData?.label && (
<Typography variant="h5" fontWeight="medium" pl={3} display="inline"> <Typography sx={{position: "relative", top: -4}} variant="h6" fontWeight="medium" pl={3} display="inline">
{props.widgetMetaData.label} {props.widgetMetaData.label}
</Typography> </Typography>
) )
) )
} }
{ {
props.labelAdditionalComponentsLeft.map((component, i) => hasPermission && (
{ props.labelAdditionalComponentsLeft.map((component, i) =>
return (<span key={i}>{renderComponent(component, i)}</span>); {
}) return (<span key={i}>{renderComponent(component, i)}</span>);
})
)
} }
</Box> </Box>
<Box> <Box>
{ {
effectiveLabelAdditionalComponentsRight.map((component, i) => hasPermission && (
{ effectiveLabelAdditionalComponentsRight.map((component, i) =>
return (<span key={i}>{renderComponent(component, i)}</span>); {
}) return (<span key={i}>{renderComponent(component, i)}</span>);
})
)
} }
</Box> </Box>
</Box> </Box>
{ {
props.widgetData?.dropdownNeedsSelectedText ? ( hasPermission && props.widgetData?.dropdownNeedsSelectedText ? (
<Box pb={3} pr={3} sx={{width: "100%", textAlign: "right"}}> <Box pb={3} pr={3} sx={{width: "100%", textAlign: "right"}}>
<Typography variant="body2"> <Typography variant="body2">
{props.widgetData?.dropdownNeedsSelectedText} {props.widgetData?.dropdownNeedsSelectedText}
</Typography> </Typography>
</Box> </Box>
) : ( ) : (
props.children hasPermission ? (
props.children
) : (
<Box mt={2} mb={5} sx={{display: "flex", justifyContent: "center"}}><Typography variant="body2">You do not have permission to view this data.</Typography></Box>
)
) )
} }
</Box>; </Box>;

View File

@ -20,6 +20,7 @@
*/ */
import {Skeleton} from "@mui/material";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import {BarElement, CategoryScale, Chart as ChartJS, Legend, LinearScale, Title, Tooltip,} from "chart.js"; import {BarElement, CategoryScale, Chart as ChartJS, Legend, LinearScale, Title, Tooltip,} from "chart.js";
import React, {useEffect, useState} from "react"; import React, {useEffect, useState} from "react";
@ -92,8 +93,8 @@ function StackedBarChart({data}: Props): JSX.Element
return data ? ( return data ? (
<Box p={3}><Bar data={data} options={options} /></Box> <Box p={3}><Bar data={data} options={options} getElementsAtEvent={handleClick} /></Box>
) : null; ) : <Skeleton sx={{marginLeft: "20px", marginRight: "20px", height: "200px"}} /> ;
} }
export default StackedBarChart; export default StackedBarChart;

View File

@ -161,7 +161,7 @@ function BarChart({color, title, description, date, data}: Props): JSX.Element
[data, color] [data, color]
)} )}
<Box pt={3} pb={1} px={1}> <Box pt={3} pb={1} px={1}>
<MDTypography variant="h5" textTransform="capitalize"> <MDTypography variant="h6" textTransform="capitalize">
{title} {title}
</MDTypography> </MDTypography>
<MDTypography component="div" variant="button" color="text" fontWeight="light"> <MDTypography component="div" variant="button" color="text" fontWeight="light">

View File

@ -20,13 +20,10 @@
*/ */
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Card from "@mui/material/Card";
import Icon from "@mui/material/Icon";
import React, {ReactNode, useMemo} from "react"; import React, {ReactNode, useMemo} from "react";
import {Line} from "react-chartjs-2"; import {Line} from "react-chartjs-2";
import colors from "qqq/assets/theme/base/colors"; import colors from "qqq/assets/theme/base/colors";
import MDBadgeDot from "qqq/components/legacy/MDBadgeDot"; import MDBadgeDot from "qqq/components/legacy/MDBadgeDot";
import MDTypography from "qqq/components/legacy/MDTypography";
////////////////////////////////////////// //////////////////////////////////////////
// structure of default line chart data // // structure of default line chart data //
@ -128,10 +125,9 @@ interface Props
color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "light" | "dark"; color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "light" | "dark";
component: ReactNode; component: ReactNode;
}; };
title?: string;
height?: string | number; height?: string | number;
description?: any;
isYAxisCurrency?: boolean; isYAxisCurrency?: boolean;
isChild?: boolean;
data: DefaultLineChartData; data: DefaultLineChartData;
[key: string]: any; [key: string]: any;
@ -139,12 +135,11 @@ interface Props
DefaultLineChart.defaultProps = { DefaultLineChart.defaultProps = {
icon: {color: "info", component: ""}, icon: {color: "info", component: ""},
title: "",
height: "19.125rem", height: "19.125rem",
}; };
function DefaultLineChart({icon, title, height, data, isYAxisCurrency, isChild}: Props): JSX.Element function DefaultLineChart({data, height, isYAxisCurrency}: Props): JSX.Element
{ {
const allBackgroundColors = ["info", "warning", "primary", "success", "error", "secondary", "dark"]; const allBackgroundColors = ["info", "warning", "primary", "success", "error", "secondary", "dark"];
if (data && data.datasets) if (data && data.datasets)
@ -156,6 +151,19 @@ function DefaultLineChart({icon, title, height, data, isYAxisCurrency, isChild}:
}); });
} }
const description= (
<Box display="flex" justifyContent="space-between">
<Box display="flex" ml={-1}>
{
data?.datasets?.map((dataSet: any) => (
<MDBadgeDot key={dataSet.label} color={dataSet.color} size="sm" badgeContent={dataSet.label} />
))
}
</Box>
<Box mt={-4} mr={-1} position="absolute" right="1.5rem" />
</Box>
);
const chartDatasets = data && data.datasets const chartDatasets = data && data.datasets
? data.datasets.map((dataset) => ({ ? data.datasets.map((dataset) => ({
...dataset, ...dataset,
@ -204,55 +212,9 @@ function DefaultLineChart({icon, title, height, data, isYAxisCurrency, isChild}:
}; };
} }
const renderChart = ( return (
<Box py={2} pr={2} pl={icon.component ? 1 : 2}> <Box py={2} pr={2} pl={2}>
{description}
{title ? (
<Box display="flex" px={0} pt={0}>
{icon.component && (
<Box
width="4rem"
height="4rem"
borderRadius="xl"
display="flex"
justifyContent="center"
alignItems="center"
color="white"
mt={-5}
mr={2}
sx={{backgroundColor: icon.color || "info"}}
>
<Icon fontSize="medium">{icon.component}</Icon>
</Box>
)}
<Box mt={icon.component ? -2 : 0}>
{isChild ? (
title && <MDTypography variant="h6">{title}</MDTypography>
) : (
title && <MDTypography variant="h5">{title}</MDTypography>
)
}
<Box mb={2}>
<MDTypography component="div" variant="button" color="text">
<Box display="flex" justifyContent="space-between">
<Box display="flex" ml={-1}>
{
data && data.lineLabels ? (
(data.lineLabels.map((label: string, index: number) => (
<Box key={index}>
<MDBadgeDot color={allBackgroundColors[index]} size="sm" badgeContent={label} />
</Box>
)
))) : null
}
</Box>
</Box>
</MDTypography>
</Box>
</Box>
</Box>
) : null}
{useMemo( {useMemo(
() => ( () => (
<Box height={height}> <Box height={height}>
@ -264,12 +226,6 @@ function DefaultLineChart({icon, title, height, data, isYAxisCurrency, isChild}:
)} )}
</Box> </Box>
); );
return title ?
<Card sx={{alignItems: "stretch", flexGrow: 1, display: "flex", marginTop: "0px", paddingTop: "0px"}}>
{renderChart}
</Card>
: renderChart;
} }
export default DefaultLineChart; export default DefaultLineChart;

View File

@ -77,7 +77,7 @@ function SmallLineChart({color, title, description, date, chart}: Props): JSX.El
[chart, color] [chart, color]
)} )}
<Box pt={3} pb={1} px={1}> <Box pt={3} pb={1} px={1}>
<MDTypography variant="h5" textTransform="capitalize"> <MDTypography variant="h6" textTransform="capitalize">
{title} {title}
</MDTypography> </MDTypography>
<MDTypography component="div" variant="button" color="text" fontWeight="light"> <MDTypography component="div" variant="button" color="text" fontWeight="light">

View File

@ -19,12 +19,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Card} from "@mui/material"; import {Card, Skeleton} from "@mui/material";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Divider from "@mui/material/Divider"; import Divider from "@mui/material/Divider";
import Grid from "@mui/material/Grid"; import Grid from "@mui/material/Grid";
import parse from "html-react-parser"; import parse from "html-react-parser";
import React, {useMemo} from "react"; import React, {useEffect, useMemo, useState} from "react";
import {Pie} from "react-chartjs-2"; import {Pie} from "react-chartjs-2";
import {useNavigate} from "react-router-dom"; import {useNavigate} from "react-router-dom";
import MDTypography from "qqq/components/legacy/MDTypography"; import MDTypography from "qqq/components/legacy/MDTypography";
@ -59,14 +59,22 @@ interface Props
function PieChart({description, chartData}: Props): JSX.Element function PieChart({description, chartData}: Props): JSX.Element
{ {
const navigate = useNavigate(); const navigate = useNavigate();
const [dataLoaded, setDataLoaded] = useState(false);
if (chartData && chartData.dataset) if (chartData && chartData.dataset)
{ {
chartData.dataset.backgroundColors = chartColors; chartData.dataset.backgroundColors = chartColors;
} }
const {data, options} = configs(chartData?.labels || [], chartData?.dataset || {}); const {data, options} = configs(chartData?.labels || [], chartData?.dataset || {});
useEffect(() =>
{
if(chartData)
{
setDataLoaded(true);
}
}, [chartData]);
const handleClick = (e: Array<{}>) => const handleClick = (e: Array<{}>) =>
{ {
if(e && e.length > 0 && chartData?.dataset?.urls && chartData?.dataset?.urls.length) if(e && e.length > 0 && chartData?.dataset?.urls && chartData?.dataset?.urls.length)
@ -89,6 +97,19 @@ function PieChart({description, chartData}: Props): JSX.Element
[chartData] [chartData]
)} )}
</Box> </Box>
{
! chartData && (
<Box sx={{
position: "absolute",
top: "40%",
left: "50%",
transform: "translate(-50%, -50%)",
display: "flex",
justifyContent: "center"}}>
<Skeleton sx={{width: "150px", height: "150px"}} variant="circular"/>
</Box>
)
}
</Grid> </Grid>
</Grid> </Grid>
<Divider /> <Divider />

View File

@ -23,7 +23,6 @@ import {Theme} from "@mui/material";
import Autocomplete from "@mui/material/Autocomplete"; import Autocomplete from "@mui/material/Autocomplete";
import TextField from "@mui/material/TextField"; import TextField from "@mui/material/TextField";
import {SxProps} from "@mui/system"; import {SxProps} from "@mui/system";
import React from "react";
export interface DropdownOption export interface DropdownOption
@ -38,18 +37,17 @@ export interface DropdownOption
interface Props interface Props
{ {
defaultValue?: any; defaultValue?: any;
localStorageKey?: string;
label?: string; label?: string;
dropdownOptions?: DropdownOption[]; dropdownOptions?: DropdownOption[];
onChangeCallback?: (dropdownLabel: string, data: any) => void; onChangeCallback?: (dropdownLabel: string, data: any) => void;
sx?: SxProps<Theme>; sx?: SxProps<Theme>;
} }
function DropdownMenu({localStorageKey, defaultValue, label, dropdownOptions, onChangeCallback, sx}: Props): JSX.Element function DropdownMenu({defaultValue, label, dropdownOptions, onChangeCallback, sx}: Props): JSX.Element
{ {
const handleOnChange = (event: any, value: any, reason: string) => const handleOnChange = (event: any, newValue: any, reason: string) =>
{ {
onChangeCallback(label, value); onChangeCallback(label, newValue);
} }
return ( return (

View File

@ -72,7 +72,7 @@ function StepperCard({data}: Props): JSX.Element
// console.log(`data ${JSON.stringify(data)}`); // console.log(`data ${JSON.stringify(data)}`);
return ( return (
<Stepper connector={<CustomizedConnector />} activeStep={activeStep} alternativeLabel sx={{paddingBottom: "0px", boxShadow: "none", background: "white"}}> <Stepper connector={<CustomizedConnector />} activeStep={activeStep} alternativeLabel sx={{paddingBottom: "0px", boxShadow: "none", background: "none"}}>
{ {
data && data.steps ? ( data && data.steps ? (
data.steps.map((step, index) => ( data.steps.map((step, index) => (

View File

@ -70,7 +70,7 @@ function MultiStatisticsCard({title, data}: Props): JSX.Element
<Grid container> <Grid container>
<Grid item xs={12}> <Grid item xs={12}>
<Box pt={3} px={3}> <Box pt={3} px={3}>
<MDTypography variant="h5" fontWeight="medium"> <MDTypography variant="h6" fontWeight="medium">
{title} {title}
</MDTypography> </MDTypography>
</Box> </Box>
@ -105,7 +105,13 @@ function MultiStatisticsCard({title, data}: Props): JSX.Element
statisticsGroup.statisticList.map((stat, i2) => statisticsGroup.statisticList.map((stat, i2) =>
<Box key={`stat-${i1}-${i2}`}> <Box key={`stat-${i1}-${i2}`}>
<MDTypography variant="subtitle2"> <MDTypography variant="subtitle2">
{stat.label}: <NavLink to={stat.url}>{stat.value.toLocaleString()}</NavLink> {
stat && stat.url ? (
<Box>{stat.label}: <NavLink to={stat?.url}>{stat.value.toLocaleString()}</NavLink></Box>
):(
<Box>{stat.label}: {stat.value.toLocaleString()}</Box>
)
}
</MDTypography> </MDTypography>
</Box> </Box>
) )

View File

@ -1,149 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2022. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import Box from "@mui/material/Box";
import Card from "@mui/material/Card";
import Grid from "@mui/material/Grid";
import {ReactNode} from "react";
import MDTypography from "qqq/components/legacy/MDTypography";
import {StatisticsCardData} from "qqq/components/widgets/statistics/StatisticsCard";
interface Props
{
title: string;
data: StatisticsCardData;
increaseIsGood: boolean;
isCurrency?: boolean;
dropdown?: {
action: (...args: any) => void;
menu: ReactNode;
value: string;
};
[key: string]: any;
}
function SimpleStatisticsCard({title, data, increaseIsGood, isCurrency, dropdown}: Props): JSX.Element
{
const {count, percentageAmount, percentageLabel} = data;
let percentageString = "";
if (percentageAmount)
{
percentageString = percentageAmount.toLocaleString() + "%";
if (percentageAmount > 0)
{
percentageString = "+" + percentageString;
}
}
let percentColor: string;
if (increaseIsGood)
{
percentColor = (percentageAmount > 0) ? "success" : "warning";
}
else
{
percentColor = (percentageAmount < 0) ? "success" : "warning";
}
return (
<Card sx={{height: "fit-content", alignItems: "stretch", flexGrow: 1, display: "flex", marginTop: "0px", paddingTop: "0px"}}>
<Box p={2}>
<Grid container>
<Grid item xs={12}>
<Box mb={0.5} lineHeight={1}>
<MDTypography
variant="button"
fontWeight="medium"
color="text"
textTransform="capitalize"
>
{title}
</MDTypography>
</Box>
<Box lineHeight={1}>
{
count !== undefined ? (
isCurrency ? (
<MDTypography variant="h5" fontWeight="bold">
{count.toLocaleString("en-US", {style: "currency", currency: "USD"})}
</MDTypography>
) : (
<MDTypography variant="h5" fontWeight="bold">
{count.toLocaleString()}
</MDTypography>
)
) : null
}
{
count !== undefined ? (
<MDTypography variant="button" fontWeight="bold" color={percentColor}>
{percentageString}&nbsp;
<MDTypography
variant="button"
fontWeight="regular"
color={"secondary"}
>
{percentageLabel}
</MDTypography>
</MDTypography>
):(
<MDTypography variant="button" fontWeight="regular">
<i>Loading.</i>
</MDTypography>
)
}
</Box>
</Grid>
{dropdown && (
<Grid item xs={5}>
<Box width="100%" textAlign="right" lineHeight={1}>
<MDTypography
variant="caption"
color="secondary"
fontWeight="regular"
sx={{cursor: "pointer"}}
onClick={dropdown.action}
>
{dropdown.value}
</MDTypography>
{dropdown.menu}
</Box>
</Grid>
)}
</Grid>
</Box>
</Card>
);
}
SimpleStatisticsCard.defaultProps = {
percentage: {
color: "success",
value: "",
label: "",
},
dropdown: false,
};
export default SimpleStatisticsCard;

View File

@ -22,7 +22,7 @@
import {CircularProgress, Typography} from "@mui/material"; import {CircularProgress, Typography} from "@mui/material";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Divider from "@mui/material/Divider"; import Divider from "@mui/material/Divider";
import React, {ReactNode} from "react"; import React from "react";
import {NavLink} from "react-router-dom"; import {NavLink} from "react-router-dom";
import MDTypography from "qqq/components/legacy/MDTypography"; import MDTypography from "qqq/components/legacy/MDTypography";
@ -44,15 +44,7 @@ export interface StatisticsCardData
interface Props interface Props
{ {
data: StatisticsCardData; data: StatisticsCardData;
color?: "primary" | "secondary" | "info" | "success" | "warning" | "error" | "light" | "dark";
icon: ReactNode;
increaseIsGood: boolean; increaseIsGood: boolean;
dropdown?: {
action: (...args: any) => void;
menu: ReactNode;
value: string;
};
[key: string]: any; [key: string]: any;
} }
@ -61,7 +53,7 @@ StatisticsCard.defaultProps = {
increaseIsGood: true increaseIsGood: true
}; };
function StatisticsCard({data, color, icon, increaseIsGood}: Props): JSX.Element function StatisticsCard({data, increaseIsGood}: Props): JSX.Element
{ {
const {count, percentageAmount, percentageLabel} = data; const {count, percentageAmount, percentageLabel} = data;
@ -94,7 +86,7 @@ function StatisticsCard({data, color, icon, increaseIsGood}: Props): JSX.Element
<Box mt={0} display="flex" justifyContent="center"> <Box mt={0} display="flex" justifyContent="center">
{ {
count !== undefined ? ( count !== undefined ? (
<Typography mt={0} sx={{color: "#344767", display: "flex", alignContent: "flex-end", fontSize: data?.countFontSize ? data?.countFontSize : "40px"}}> <Typography pb={1} mt={0} sx={{color: "#344767", display: "flex", alignContent: "flex-end", fontSize: data?.countFontSize ? data?.countFontSize : "30px"}}>
{ {
data.countURL ? ( data.countURL ? (
<NavLink to={data.countURL}>{count.toLocaleString()}</NavLink> <NavLink to={data.countURL}>{count.toLocaleString()}</NavLink>

View File

@ -21,6 +21,7 @@
// Declaring props types for ProductCell // Declaring props types for ProductCell
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import React from "react";
import MDTypography from "qqq/components/legacy/MDTypography"; import MDTypography from "qqq/components/legacy/MDTypography";
interface Props interface Props
@ -35,8 +36,12 @@ function ImageCell({imageUrl, label, total, totalType}: Props): JSX.Element
{ {
return ( return (
<Box display="flex" alignItems="center" pr={2}> <Box display="flex" alignItems="center" pr={2}>
<Box mr={2}> <Box sx={{width: "50px"}} mr={2}>
<img src={imageUrl} alt={label} /> {
imageUrl && imageUrl !== "" && (
<img src={imageUrl} alt={label} />
)
}
</Box> </Box>
<Box display="flex" flexDirection="column"> <Box display="flex" flexDirection="column">
<MDTypography variant="button" fontWeight="medium"> <MDTypography variant="button" fontWeight="medium">

View File

@ -83,7 +83,7 @@ function BaseLayout({stickyNavbar, children}: Props): JSX.Element
return ( return (
<DashboardLayout> <DashboardLayout>
<NavBar /> <NavBar />
<Box mt={stickyNavbar ? 3 : 6}>{children}</Box> <Box>{children}</Box>
<Footer company={{href: metaData?.branding?.companyUrl, name: metaData?.branding?.companyName}} /> <Footer company={{href: metaData?.branding?.companyUrl, name: metaData?.branding?.companyName}} />
</DashboardLayout> </DashboardLayout>
); );

View File

@ -200,7 +200,7 @@ function AppHome({app}: Props): JSX.Element
return ( return (
<BaseLayout> <BaseLayout>
<Box mt={4} mb={4}> <Box>
{app.widgets && ( {app.widgets && (
<DashboardWidgets widgetMetaDataList={widgets} /> <DashboardWidgets widgetMetaDataList={widgets} />
)} )}

View File

@ -390,7 +390,7 @@ function RecordView({table, launchProcess}: Props): JSX.Element
<Grid id={section.name} key={section.name} item lg={12} xs={12} sx={{display: "flex", alignItems: "stretch", scrollMarginTop: "100px"}}> <Grid id={section.name} key={section.name} item lg={12} xs={12} sx={{display: "flex", alignItems: "stretch", scrollMarginTop: "100px"}}>
<Box width="100%"> <Box width="100%">
<Card id={section.name} sx={{overflow: "visible", scrollMarginTop: "100px"}}> <Card id={section.name} sx={{overflow: "visible", scrollMarginTop: "100px"}}>
<Typography variant="h5" p={3} pb={1}> <Typography variant="h6" p={3} pb={1}>
{section.label} {section.label}
</Typography> </Typography>
<Box p={3} pt={0} flexDirection="column"> <Box p={3} pt={0} flexDirection="column">
@ -621,7 +621,7 @@ function RecordView({table, launchProcess}: Props): JSX.Element
<Box pb={3}> <Box pb={3}>
{ {
successMessage ? successMessage ?
<Alert color="success" sx={{mb: 3}} onClose={() => <Alert color="success" sx={{mb: 3}} onClose={() =>
{ {
setSuccessMessage(null); setSuccessMessage(null);
}}> }}>