Feature/virtual fields and alternative sections (#123)

* refactor: Fix name of the exported function in this file

* feat(virtualFields): increase qqq-frontend-core patch version

* fix(widgetBlocks): avoid NPE on missing text

* fix(widgetBlocks): Add IconBlock

* feat(fieldAdornmentWidgets): Initial checkin

* feat(virtualFieldsAndAlternativeSections): Support for alternative sections in a table, virtual fields, and AdornmentType.WIDGET (to render FieldValueAsWidget)

* feat(fieldAdornmentWidgets): Switch to use DashboardWidgets to (in theory) support any widget type...  with new omitPaddingOnWidget param, to pass through to the <Widget>

* feat(fieldAdornmentWidgets): Update to use a virtual field for the view screen, in an alternate section - to display the json of the filter (as the test expected), since now view screen tries to render the widget (but doesn't quite have the right data for it).  this could improve, but this proves the point, and gets us passing again
This commit was merged in pull request #123.
This commit is contained in:
Darin Kelkhoff authored and GitHub committed 2026-01-09 12:32:27 -06:00
1 parent 92c6b464c8
commit 161c40faa7
12 files changed
+753 -261

No files matched your search

+285 -235
View File
@@ -19,7 +19,7 @@
"@mui/x-data-grid-pro": "5.17.23",
"@mui/x-date-pickers": "7.1.1",
"@mui/x-license-pro": "5.12.3",
"@qrunio/qqq-frontend-core": "1.3.7-SNAPSHOT",
"@qrunio/qqq-frontend-core": "1.3.8-SNAPSHOT",
"@react-jvectormap/core": "1.0.1",
"@react-jvectormap/unitedstates": "1.0.1",
"@react-oauth/google": "0.2.8",
@@ -3626,9 +3626,9 @@
}
},
"node_modules/@mui/utils/node_modules/react-is": {
"version": "19.2.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.0.tgz",
"integrity": "sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==",
"version": "19.2.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.1.tgz",
"integrity": "sha512-L7BnWgRbMwzMAubQcS7sXdPdNLmKlucPlopgAzx7FtYbksWZgEWiuYM5x9T6UqS2Ne0rsgQTq5kY2SGqpzUkYA==",
"license": "MIT"
},
"node_modules/@mui/x-data-grid": {
@@ -3878,9 +3878,9 @@
}
},
"node_modules/@mui/x-date-pickers/node_modules/react-is": {
"version": "19.2.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.0.tgz",
"integrity": "sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==",
"version": "19.2.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.1.tgz",
"integrity": "sha512-L7BnWgRbMwzMAubQcS7sXdPdNLmKlucPlopgAzx7FtYbksWZgEWiuYM5x9T6UqS2Ne0rsgQTq5kY2SGqpzUkYA==",
"license": "MIT"
},
"node_modules/@mui/x-license-pro": {
@@ -4024,9 +4024,9 @@
}
},
"node_modules/@qrunio/qqq-frontend-core": {
"version": "1.3.7-SNAPSHOT",
"resolved": "https://registry.npmjs.org/@qrunio/qqq-frontend-core/-/qqq-frontend-core-1.3.7-SNAPSHOT.tgz",
"integrity": "sha512-Y59lQBAvElzv4lazDSBPfXgdVWWrrHPza+1ih/kVNRr5x9MzDS10K4SVd4RMCmhlrwwhXWK4B4IT5MXzTi+KtA==",
"version": "1.3.8-SNAPSHOT",
"resolved": "https://registry.npmjs.org/@qrunio/qqq-frontend-core/-/qqq-frontend-core-1.3.8-SNAPSHOT.tgz",
"integrity": "sha512-NgjvJbZx54q2VA8ot5uKKLo5tdsJcP1zQfWTiOEnuVFm+aAusUFcnEQchMCC0Y6vzvnBcXw1BTrLP1PzNLmxiQ==",
"license": "ISC",
"dependencies": {
"axios": "0.28.1",
@@ -4791,13 +4791,13 @@
}
},
"node_modules/@swagger-api/apidom-ast": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-rc.4.tgz",
"integrity": "sha512-IaXz00VLMq0Kw5vh5f2MX4gNWzPy8ujBl5FInM5w+1mezoyrwTnVRiKO7sf611OthmNmnK5cWy3hjqURAT9wCQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.1.tgz",
"integrity": "sha512-inTGo5b49XkHs/Vq48VafXnCzZrwwE+KTNcdfMybdm3RQTbfVFbvSUrS54WoHoaSbef1GsB9rnS/oXoXfNr72g==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4805,14 +4805,14 @@
}
},
"node_modules/@swagger-api/apidom-core": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-rc.4.tgz",
"integrity": "sha512-dSvq/FmUffmv9nqBO8LZ5+ESFWPe/y7UsatRiwpqh6M7vBHy9xBuKdn6A/7QtmZnetjigkx3h4CXc4Mi30RZCg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.1.tgz",
"integrity": "sha512-biA53spAUphP2IMJSPdqcRFjvLbvLspv1mJQrZpePUq4XGxGOKOHof7dUc1bXJuYvl6OOxOwnVniv5oK2Wyblw==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-ast": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ast": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@types/ramda": "~0.30.0",
"minim": "~0.23.8",
"ramda": "~0.30.0",
@@ -4822,37 +4822,37 @@
}
},
"node_modules/@swagger-api/apidom-error": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-rc.4.tgz",
"integrity": "sha512-uakMfKYyLgGjLrVaaUKWyl0D+wGxza+nh1Ct4fOFRiy0Dm91I4AD4HwsG3Uvk5gLrvqlf/OutKYzKt8Ufhlyig==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.1.tgz",
"integrity": "sha512-uwduVNLg9a2qA+Pl4b8gPERH6Xhvm/Ilv4iKMUOpUicLwNmYjrlcRsyYxLvFiNlTghm70xuI3hap1iaXbrer4A==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.20.7"
}
},
"node_modules/@swagger-api/apidom-json-pointer": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-rc.4.tgz",
"integrity": "sha512-5bB6nemgzkWs440a8PX+lS3fGtEtJt2iYhK0Xf9E+9qU6d1eR9aiETPdAVjbdL8vLhyZvmgvZie/7q0l6bbLJg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.1.tgz",
"integrity": "sha512-Dgxd9hl1AiCIM1b5f4dSfmP+rGtASUso8Lw51+az605hqrohgykxt8voiQtaJxKySWYbS1J9Vz2xjLwrEmfTKg==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@swaggerexpert/json-pointer": "^2.10.1"
}
},
"node_modules/@swagger-api/apidom-ns-api-design-systems": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-rc.4.tgz",
"integrity": "sha512-JlOD1H2jSl/XxdFwa/zPOvRZh8rk/O/2B2xkoKaxhTmkVTKq2Y1rHsey8cyU9qrfQSkLpPm1cxXeIfqmhdPmqQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.1.tgz",
"integrity": "sha512-frRfiLjcufeBgqnHQOcXgl6dnvcIdP4+18pWb+qT3N+dv87geJBk1CbXo6RjW9AEQX/7BtvWYkfSMLrh8q2TZA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@swagger-api/apidom-ns-openapi-3-1": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4860,15 +4860,15 @@
}
},
"node_modules/@swagger-api/apidom-ns-arazzo-1": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-rc.4.tgz",
"integrity": "sha512-sKep7qCvJa2zB4q67e9zinLKjVx0vhV/e40OLEg3JeECMWcRrW3oI2JB3jSJ7ZZwCgvatfBc6/ucFsX/1oKpkg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.1.tgz",
"integrity": "sha512-gJJY0vmi3TJtlCYNPsZahQnP6GA9GtJX1a9jEUASaYYxz6cBBfY39y8C5tQTo0Jvc7QEff/UZ8iGX0kltcwlzA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4876,15 +4876,31 @@
}
},
"node_modules/@swagger-api/apidom-ns-asyncapi-2": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-rc.4.tgz",
"integrity": "sha512-RDNKv4kCAzQ+aA02VjgxS9Cve0UgnRkcFNEUxYEHWNbqVcMmxcck6GLQo4OuwhgJczEyZC3TB5idfxphRhaybg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.1.tgz",
"integrity": "sha512-d8HBr2EVB2gK8FKrxj0Wsss6Qeael//WxnNv1ZtmNeCe1l83iC9RO/hjjq/OFob94ZTOfpPRNwGqZBd4tMxOnA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
"ts-mixer": "^6.0.3"
}
},
"node_modules/@swagger-api/apidom-ns-asyncapi-3": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.0.1.tgz",
"integrity": "sha512-vonGt1ScMlT+GbbSGa/+oe874Zl7NVylX3ZoMAhMkRyqu49vmWB6dXUcWw6ZsZu2GxVphjNTm+D52Ikw8UAMWg==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-asyncapi-2": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4892,15 +4908,15 @@
}
},
"node_modules/@swagger-api/apidom-ns-json-schema-2019-09": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-rc.4.tgz",
"integrity": "sha512-kgIo3d9VZjBFg30Cg0asokbBGVb4WvVckkf9U2T8/6wh2o1J+KMqvdRauo2Xz+o5EubLpGyZjrwOzMbFJv/viA==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.1.tgz",
"integrity": "sha512-wtVkFhkM7a0ybjAR0HCQyXzAwIWWcaoHmXiZGAS7wTpI2sDMLwCrBXBuISa7BoRkG4ieA2odDF5Eac73knWUbA==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4908,15 +4924,15 @@
}
},
"node_modules/@swagger-api/apidom-ns-json-schema-2020-12": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-rc.4.tgz",
"integrity": "sha512-0mpBu8iXq8GaY+KDQGWSU+8Xvd1Kd5EXKOpW8tDgJINBgeYm7F3m8iP3irP0OMeCyX9ISMq+bDgXg+YjS8kYzA==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.1.tgz",
"integrity": "sha512-YBE5kYKARFWi+8HAiUVJxF9WpkdlW2ebH6K4oZt6mnOWROkPS+30Kjjxlz+Q994KhSZGBHKK0d3TU11xXUqyAQ==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4924,14 +4940,14 @@
}
},
"node_modules/@swagger-api/apidom-ns-json-schema-draft-4": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-rc.4.tgz",
"integrity": "sha512-FOqR+EMMt5QPXmQv/gJ/syzp+G5QCrb+5n3tkmVwBNKhiPHcX4kOHt6/8wZo/6V++hhv1IzCt1JwGJGiNEuK9A==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.1.tgz",
"integrity": "sha512-OR3D7EXVq2H07n9uPKpNCikKC5857Pggbi1g5rt9X0znaUgxTtkYu8unPfbEcjQgFVglzIwqbGhMnahUFXYaTA==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-ast": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ast": "^1.0.1",
"@swagger-api/apidom-core": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4939,15 +4955,15 @@
}
},
"node_modules/@swagger-api/apidom-ns-json-schema-draft-6": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-rc.4.tgz",
"integrity": "sha512-OQonOTVyPzKUvE2+6AB+JK7rkqqd0AG0QyarSyPJH+vbt2Nsj2tUaEXNY3WeP9OX1xvbtUysR74fefsOkjzO1Q==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.1.tgz",
"integrity": "sha512-J9/aSU9/YwiRU/avkSN1APYPs9sYVyrzaMpfq7XIY8xMFC4buwrPzCymrqshSOLbn1Qzr9Ruavcqx5Bwt0EuRg==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4955,15 +4971,15 @@
}
},
"node_modules/@swagger-api/apidom-ns-json-schema-draft-7": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-rc.4.tgz",
"integrity": "sha512-p1YbbkHQDD0REbz30F/vMXjPjsh7j7jIjaHNgFv3zC+KZN776GkOwQIpdP56lwneWFdMj9jOSRhwBKp34h9iXw==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.1.tgz",
"integrity": "sha512-b8pNff3epzweot5Edoa05mM/jBMgvjqajvNTOvOa8SNPWHWLjSJNYkBT2jI3BnFqqEMMo7litEfKnblblFuDtQ==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4971,16 +4987,16 @@
}
},
"node_modules/@swagger-api/apidom-ns-openapi-2": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-rc.4.tgz",
"integrity": "sha512-Wil2egcmJJIrgEDYGZVaDIMGlnLhcBw8I5ZjWBgyU8nLocuqdKVE8I1TwPO+7830dnfjCaXs+nUzfgkBcGefMg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.1.tgz",
"integrity": "sha512-XZ1xHHvsZZaNNHkqk0KWggZxMM2Av5eJdjbxwLij7TFWjodYVJAMZLyWG15llDBjnTXQYtpFIVLGjndf2oC7Xg==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -4988,15 +5004,15 @@
}
},
"node_modules/@swagger-api/apidom-ns-openapi-3-0": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-rc.4.tgz",
"integrity": "sha512-t4ZX6I76fcrCsV1Aj8Um6LiIceVCKNgakg5MIuBiRZaA0q8fZPerLSD1KIYMLWPd+cV5ptKZyv+bugzhlhQtTg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.1.tgz",
"integrity": "sha512-BAypZcl8NO+jYpAmAXJVCLVe4f+v3ZoZN21Oxu03N2lsv+qz/P9vpl+6C0dOfta6X8fACkuGr4KIGU6leUPpJg==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -5004,17 +5020,17 @@
}
},
"node_modules/@swagger-api/apidom-ns-openapi-3-1": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-rc.4.tgz",
"integrity": "sha512-Ibv8PP0npBb8QupINmluQmLCZ1IhANlRUic8K7k32Lbc9ejMGTLCKGl2J3hPPeKsER3zqfEjHAhkins9r/CJcw==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.1.tgz",
"integrity": "sha512-nIkgyIW8XTV+zjzLKxP1JaA/lpgmtsRBLshh1mL+Fspd+RYAhyMpRDRNvBOmkIhva9Dst9LNYyMjBP9ssfKUwg==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-ast": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-json-pointer": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-rc.4",
"@swagger-api/apidom-ast": "^1.0.1",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-json-pointer": "^1.0.1",
"@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.1",
"@swagger-api/apidom-ns-openapi-3-0": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -5022,112 +5038,144 @@
}
},
"node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-rc.4.tgz",
"integrity": "sha512-/K9xj7tL6RB6B+krFf5JlzEGb3bebVt5c6t9a0ZZps+4TjcAQ3M1B9Gs3+ngR6Hy2RwtqIPKWKl0fhgfpArmnw==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.1.tgz",
"integrity": "sha512-Udj6vJ6Au+fcqZJZtgHlUi1Y/ImLHo8fx4ICSas7hewA7z1/eZ7Y3Yp8YSGZ7ZwqXHS6nnm5fBHws0DgAplnDA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-api-design-systems": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-api-design-systems": "^1.0.1",
"@swagger-api/apidom-parser-adapter-json": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-rc.4.tgz",
"integrity": "sha512-+J4hMSe7+cKxuDDEVxyF7MGfvAFv7cbFdyBKUDkvkKjtdkh40+5msTJ2ePuSxibNqZTJFGZhaJBIaPOfbqLpUQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.1.tgz",
"integrity": "sha512-YZ2IuTEzUGXRF8oFuHHGZpM15hRnSI/rZnweGT984bX53HXi1NFpZdNxOz49vmkhFz6XJgxRXp1R3EDN/98urg==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-api-design-systems": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-api-design-systems": "^1.0.1",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-rc.4.tgz",
"integrity": "sha512-7sDeZgV1SVwiWQmckvRgBwEBZXUavxvJr5m8C2daEge9DTM9LE3qNBAjWdwvd5E4sPeDdslSiCWT9Ipi+aiBsg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.1.tgz",
"integrity": "sha512-Re8EcgYOITyTXvGeJyE/4ZNsprkSrkXVmHzyM9hqTWoMpDILnqOtbrjc0YwLkbe9awBkUMWJ51CEFLYALSYfDA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-arazzo-1": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-arazzo-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-json": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-rc.4.tgz",
"integrity": "sha512-UnU6RLRKNMm0qbHjINbfrFgKQd6tD2pRKySWgR9HxLVS+VTL3J4Oid2Tt3ND5xy6nE4qZrV5vusZNkdDewZk7A==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.1.tgz",
"integrity": "sha512-++BB47Vf9sarAf+YCvlt9V2OqFd8O5AZMr/xXBKTls4SzwpUcLf4oIQJpHcr/rl+bgI4CKwxKXHvnhg2vhEVmg==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-arazzo-1": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-arazzo-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-rc.4.tgz",
"integrity": "sha512-fZJgQWRXQxPcZurKxiY2IcdtuS33CxuJyFD9Z+72v3OvVWFEII6mWGC6NdqevzYaD7WUVXhsQjAqibBNIcyJiQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.1.tgz",
"integrity": "sha512-dd8djfZy2utM1xO7oxDPB/dmExSFgEA2l71gjHaKmhJw7O5NB8E/1663w9lD4NElj2Ft8kuGLLDsqyKNhXW/9w==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-asyncapi-2": "^1.0.1",
"@swagger-api/apidom-parser-adapter-json": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-3": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.0.1.tgz",
"integrity": "sha512-qD+gbnSnc9PlZ8b45knyWihrWOMKhnAHDnvzRllX+NiyM3XdBJ7B6yLn8dl6gZuKjTBHoMORLEefoTGvmskneA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-asyncapi-3": "^1.0.1",
"@swagger-api/apidom-parser-adapter-json": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-rc.4.tgz",
"integrity": "sha512-WNmlRSHiCLu9uCsadnoaWYxzV/aagUHAeVTY+Zgq+4bSNWx9DZTX5X1v/IW4aD5MAW6j1Inz8U5qdxWnrEdBBg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.1.tgz",
"integrity": "sha512-G5RS0pCFCOIsFflKvWbH+DblunmcAdVi5X9ETTTkGLa1IF5s0DIdjU46WxJAzEQpCXOvmUhpDspjaAYXxGTYpQ==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-asyncapi-2": "^1.0.1",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.0.1.tgz",
"integrity": "sha512-hzgUkTsuKYraY0NXQlaYe/j1/LkvNF/8r30Iz7/1B27BYLOKIwHoFGN6jUa8UBA9/0qSp8QPzSwVWFLrgNiqJQ==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-asyncapi-3": "^1.0.1",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-json": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-rc.4.tgz",
"integrity": "sha512-UuYtpZtXoWuukny/1WIz2szlfKc6XDNh0W1E8PtZqhFOUDgaq0qXB7OBB7E/lDAJAIzlWfJu1lR87C2pwbJSRw==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.1.tgz",
"integrity": "sha512-95V2aMBGZ76rYXcod/PCJpVEMK+9mPk/gDgsDKEq2ka+YVMTtR1tUkPUIBmWlNC+brh5reks1QocyQL8B4f3TQ==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-ast": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ast": "^1.0.1",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0",
@@ -5157,112 +5205,112 @@
}
},
"node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-rc.4.tgz",
"integrity": "sha512-2OgY9MO0U2Ma7OiIOvsT7cn0J5XbfWy9JnOEGm6DCh+b1m+NGWSXuPKGB9o/R3DJu5Jar9ol7Mu+oyb6ENJKdg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.1.tgz",
"integrity": "sha512-Gp02eAA32SN+hAgVDc82xpkUthHn0oAdLdri5g3co4pa45XVRsBSHS3L/H3NEbhDJ8wpXjcg+FLs/OAwcm42yw==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-openapi-2": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-openapi-2": "^1.0.1",
"@swagger-api/apidom-parser-adapter-json": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-rc.4.tgz",
"integrity": "sha512-XvZsBuUO2UY5qXsizw03A+dy745ZWvekwS0J3o5RmPoEuJ1eeRNXsUn+JoAHascX81vzlkam71Xp9XpcAlybYQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.1.tgz",
"integrity": "sha512-Ls3U0stAtMqvzesy981crjDa7vwqGHlCoulHIsWQ/V74dHg3Nl1Vg9AgerefKg8LHxxLiYTZJITfsWQMYsnlkA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-openapi-3-0": "^1.0.1",
"@swagger-api/apidom-parser-adapter-json": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-rc.4.tgz",
"integrity": "sha512-cydbVKumtVTTfTnbtvfw1kayYRbQyTS6iZ5s/Y6xyZb7ro5VNi6XZy6htOu0EvXUBS/NJjY9YDeWcVKGUEuohw==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.1.tgz",
"integrity": "sha512-Xsf3jUCfgqZqZjiABWifPynBDLPkW54V210Oa4SvgyI7ZWgubcy5/Wgd68wvhq4knauRXqRmbgKc+WRm0UP3xw==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-openapi-3-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-json": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-rc.4.tgz",
"integrity": "sha512-pqoPgMFOvJJ2v4qA9MKMnTlhOYST+o2WhYmY34GMCoZrRrHue0rnvjtsAyH9BQNk9WEmS1gdonKpyHl6a5bewQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.1.tgz",
"integrity": "sha512-SygtOXG9XF6lYveg6rymk4u1Twgk1VTxzyVkQ8I6eQoGyBoYfJC00sI6qep9bGU/VnsaRaN/H8+N0vXBeAOsPg==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-openapi-2": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-openapi-2": "^1.0.1",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-rc.4.tgz",
"integrity": "sha512-7J+iWKNC6pjWGAsOy5it2FDJGYyiDJ+rvIrUFAiK3Giqk9t70/s6PmH54DtVnb8rzmpX/udd8PVxTE6uImru1Q==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.1.tgz",
"integrity": "sha512-xm8tY1NYe329tGF01WCtCi7uepppORWs3WpwzskSiZnDAmyjIu5ez3R0RFPCiXnMRGgj4wO6UzjawSrKGTJHjA==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-openapi-3-0": "^1.0.1",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-rc.4.tgz",
"integrity": "sha512-N3ehKEKvEWkZjL6QAV4Fwepa+2lSSun8DYN1h+ScVMa/QSWQh558vSXv6cF49ClYIO+IQjZg1fsbDoVg7qjlcA==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.1.tgz",
"integrity": "sha512-p0G3g63Jcd4Z5Y2hStNB0NgjwYJg9VBLhkDcmFdmKCbz9vYA45rMN+wn62pqkWQE7KBZ1F1zY0wacRlUy0VuuQ==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.4",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-ns-openapi-3-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
"ramda-adjunct": "^5.0.0"
}
},
"node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-rc.4.tgz",
"integrity": "sha512-go/s36rTmkgVIBt4Q/oAJzwRTwRjVdFQPeQGnuS6eX5mxMUWxzVrsKKLJ2qul5y8DVkzZsZ6K897RI5H0fUuuQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.1.tgz",
"integrity": "sha512-ppNo8mncbGA3TchroLmcDv1WUw9vruHa4M96WbWqI7cwH3zdJ1UddwfHkZ5IaCOUU08Iyo2uzMMRaarALAsl8g==",
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-ast": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-ast": "^1.0.1",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1",
"@types/ramda": "~0.30.0",
"ramda": "~0.30.0",
@@ -5272,14 +5320,14 @@
}
},
"node_modules/@swagger-api/apidom-reference": {
"version": "1.0.0-rc.4",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-rc.4.tgz",
"integrity": "sha512-H0eVImmOEp8TjRBcVQuyBsCcUCR5094POMcgvcipUyKwAus62PwMivn1eQc+e/wyZSm7qqEbv1ksOcDLHltykA==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.1.tgz",
"integrity": "sha512-FvM6cooFx1ppWN9gKXSLFG2Y4u3SRdv1FIJxj+5VC/6V3++BF2LUFkb7hK0IOaAjw2vQ7G0NUyP+5UY/3qKBjA==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "^7.26.10",
"@swagger-api/apidom-core": "^1.0.0-rc.4",
"@swagger-api/apidom-error": "^1.0.0-rc.4",
"@swagger-api/apidom-core": "^1.0.1",
"@swagger-api/apidom-error": "^1.0.1",
"@types/ramda": "~0.30.0",
"axios": "^1.12.2",
"minimatch": "^7.4.3",
@@ -5288,26 +5336,28 @@
"ramda-adjunct": "^5.0.0"
},
"optionalDependencies": {
"@swagger-api/apidom-json-pointer": "^1.0.0-rc.0",
"@swagger-api/apidom-ns-arazzo-1": "^1.0.0-rc.0",
"@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-rc.0",
"@swagger-api/apidom-ns-openapi-2": "^1.0.0-rc.0",
"@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-rc.0",
"@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-rc.0",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.0"
"@swagger-api/apidom-json-pointer": "^1.0.1",
"@swagger-api/apidom-ns-arazzo-1": "^1.0.1",
"@swagger-api/apidom-ns-asyncapi-2": "^1.0.1",
"@swagger-api/apidom-ns-openapi-2": "^1.0.1",
"@swagger-api/apidom-ns-openapi-3-0": "^1.0.1",
"@swagger-api/apidom-ns-openapi-3-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.1",
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.1",
"@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.1",
"@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.0.1",
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.1",
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.0.1",
"@swagger-api/apidom-parser-adapter-json": "^1.0.1",
"@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.1",
"@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.1",
"@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.1",
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.1",
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.1",
"@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1"
}
},
"node_modules/@swagger-api/apidom-reference/node_modules/axios": {
@@ -5718,9 +5768,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "24.10.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
"integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
"version": "24.10.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz",
"integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -7439,9 +7489,9 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
"version": "2.8.32",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.32.tgz",
"integrity": "sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==",
"version": "2.9.5",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz",
"integrity": "sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==",
"devOptional": true,
"license": "Apache-2.0",
"bin": {
@@ -7615,9 +7665,9 @@
}
},
"node_modules/browserslist": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
"integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==",
"version": "4.28.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
"integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
"devOptional": true,
"funding": [
{
@@ -7636,11 +7686,11 @@
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.25",
"caniuse-lite": "^1.0.30001754",
"electron-to-chromium": "^1.5.249",
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
"electron-to-chromium": "^1.5.263",
"node-releases": "^2.0.27",
"update-browserslist-db": "^1.1.4"
"update-browserslist-db": "^1.2.0"
},
"bin": {
"browserslist": "cli.js"
@@ -7819,9 +7869,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001757",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz",
"integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==",
"version": "1.0.30001760",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz",
"integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==",
"devOptional": true,
"funding": [
{
@@ -9455,9 +9505,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.262",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz",
"integrity": "sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==",
"version": "1.5.267",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
"integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
"devOptional": true,
"license": "ISC"
},
@@ -10604,9 +10654,9 @@
}
},
"node_modules/express": {
"version": "4.22.0",
"resolved": "https://registry.npmjs.org/express/-/express-4.22.0.tgz",
"integrity": "sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ==",
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
"integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -15890,9 +15940,9 @@
}
},
"node_modules/node-forge": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz",
"integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==",
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz",
"integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==",
"dev": true,
"license": "(BSD-3-Clause OR GPL-2.0)",
"engines": {
@@ -15984,9 +16034,9 @@
}
},
"node_modules/nwsapi": {
"version": "2.2.22",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz",
"integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==",
"version": "2.2.23",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz",
"integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==",
"dev": true,
"license": "MIT"
},
@@ -21003,9 +21053,9 @@
}
},
"node_modules/terser-webpack-plugin": {
"version": "5.3.14",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
"integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
"version": "5.3.15",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.15.tgz",
"integrity": "sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -21721,9 +21771,9 @@
}
},
"node_modules/update-browserslist-db": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
"integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz",
"integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==",
"devOptional": true,
"funding": [
{
+1 -1
View File
@@ -15,7 +15,7 @@
"@mui/x-data-grid-pro": "5.17.23",
"@mui/x-date-pickers": "7.1.1",
"@mui/x-license-pro": "5.12.3",
"@qrunio/qqq-frontend-core": "1.3.7-SNAPSHOT",
"@qrunio/qqq-frontend-core": "1.3.8-SNAPSHOT",
"@react-jvectormap/core": "1.0.1",
"@react-jvectormap/unitedstates": "1.0.1",
"@react-oauth/google": "0.2.8",
@@ -75,6 +75,7 @@ interface Props
entityPrimaryKey?: string;
record?: QRecord;
omitWrappingGridContainer: boolean;
omitPaddingOnWidget: boolean;
areChildren?: boolean;
childUrlParams?: string;
parentWidgetMetaData?: QWidgetMetaData;
@@ -90,6 +91,7 @@ DashboardWidgets.defaultProps = {
tableName: null,
entityPrimaryKey: null,
omitWrappingGridContainer: false,
omitPaddingOnWidget: false,
areChildren: false,
childUrlParams: "",
parentWidgetMetaData: null,
@@ -100,7 +102,7 @@ DashboardWidgets.defaultProps = {
screen: "dashboard",
};
function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, record, omitWrappingGridContainer, areChildren, childUrlParams, parentWidgetMetaData, wrapWidgetsInTabPanels, actionCallback, initialWidgetDataList, values, screen}: Props): JSX.Element
function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, record, omitWrappingGridContainer, omitPaddingOnWidget, areChildren, childUrlParams, parentWidgetMetaData, wrapWidgetsInTabPanels, actionCallback, initialWidgetDataList, values, screen}: Props): JSX.Element
{
const [widgetData, setWidgetData] = useState(initialWidgetDataList == null ? [] as any[] : initialWidgetDataList);
const [errorsLoading, setErrorsLoading] = useState([] as any[]);
@@ -468,12 +470,12 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
message = "Error: " + e.message;
}
return (<Widget widgetMetaData={widgetMetaData}>
return (<Widget widgetMetaData={widgetMetaData} omitPadding={omitPaddingOnWidget}>
<Alert severity="error">{message}</Alert>
</Widget>);
}
return (<Widget widgetMetaData={widgetMetaData}>
return (<Widget widgetMetaData={widgetMetaData} omitPadding={omitPaddingOnWidget}>
{
skeleton ? skeleton : <Skeleton></Skeleton>
}
@@ -596,6 +598,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
isChild={areChildren}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<StackedBarChart data={widgetData[i]?.chartData} chartSubheaderData={widgetData[i]?.chartSubheaderData} />
</Widget>
@@ -610,6 +613,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
showReloadControl={false}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<div className="widgetProcessMidDiv" style={{height: "100%"}}>
<ProcessRun process={widgetData[i]?.processMetaData} defaultProcessValues={widgetData[i]?.defaultValues} isWidget={true} forceReInit={widgetCounter} />
@@ -625,6 +629,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
reloadWidgetCallback={(data) => reloadWidget(i, data)}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<Box sx={{alignItems: "stretch", flexGrow: 1, display: "flex", marginTop: "0px", paddingTop: "0px"}}>
<Box padding="1rem" sx={{width: "100%"}}>
@@ -642,6 +647,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
widgetData={widgetData[i]}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<Box>
<MDTypography component="div" variant="button" color="text" fontWeight="light">
@@ -675,6 +681,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
reloadWidgetCallback={(data) => reloadWidget(i, data)}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<StatisticsCard
widgetMetaData={widgetMetaData}
@@ -718,6 +725,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
isChild={areChildren}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<div>
<PieChart
@@ -753,6 +761,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
isChild={areChildren}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<DefaultLineChart sx={{alignItems: "center"}}
data={widgetData[i]?.chartData}
@@ -797,6 +806,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
isChild={areChildren}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<CompositeWidget widgetMetaData={widgetMetaData} data={widgetData[i]} actionCallback={actionCallback} values={values} />
</Widget>
@@ -811,6 +821,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
isChild={areChildren}
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelAdditionalComponentsLeft={labelAdditionalComponentsLeft}
omitPadding={omitPaddingOnWidget}
>
<WidgetBlock widgetMetaData={widgetMetaData} block={widgetData[i]} />
</Widget>
@@ -819,7 +830,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
{
widgetMetaData.type === "dataBagViewer" && (
widgetData && widgetData[i] && widgetData[i].queryParams &&
<Widget widgetMetaData={widgetMetaData}>
<Widget widgetMetaData={widgetMetaData} omitPadding={omitPaddingOnWidget}>
<DataBagViewer dataBagId={widgetData[i].queryParams.id} />
</Widget>
)
@@ -827,7 +838,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
{
widgetMetaData.type === "scriptViewer" && (
widgetData && widgetData[i] && widgetData[i].queryParams &&
<Widget widgetMetaData={widgetMetaData}>
<Widget widgetMetaData={widgetMetaData} omitPadding={omitPaddingOnWidget}>
<ScriptViewer scriptId={widgetData[i].queryParams.id} />
</Widget>
)
@@ -880,7 +891,7 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, reco
{
widgetMetaData.type === "customComponent" && (
widgetData && widgetData[i] &&
<Widget widgetMetaData={widgetMetaData}>
<Widget widgetMetaData={widgetMetaData} omitPadding={omitPaddingOnWidget}>
<CustomComponentWidget widgetMetaData={widgetMetaData} widgetData={widgetData[i]} record={record} />
</Widget>
)
@@ -24,6 +24,7 @@ import {QWidgetMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QWid
import {Alert, Skeleton} from "@mui/material";
import ButtonBlock from "qqq/components/widgets/blocks/ButtonBlock";
import AudioBlock from "qqq/components/widgets/blocks/AudioBlock";
import IconBlock from "qqq/components/widgets/blocks/IconBlock";
import InputFieldBlock from "qqq/components/widgets/blocks/InputFieldBlock";
import React from "react";
import BigNumberBlock from "qqq/components/widgets/blocks/BigNumberBlock";
@@ -97,6 +98,8 @@ export default function WidgetBlock({widgetMetaData, block, actionCallback, valu
return (<AudioBlock widgetMetaData={widgetMetaData} data={block} />);
case "IMAGE":
return (<ImageBlock widgetMetaData={widgetMetaData} data={block} actionCallback={actionCallback} />);
case "ICON":
return (<IconBlock widgetMetaData={widgetMetaData} data={block} actionCallback={actionCallback} />);
default:
return (<Alert sx={{m: "0.5rem"}} color="warning">Unsupported block type: {block.blockTypeName}</Alert>)
}
@@ -0,0 +1,41 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2024. 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 Icon from "@mui/material/Icon";
import BlockElementWrapper from "qqq/components/widgets/blocks/BlockElementWrapper";
import {StandardBlockComponentProps} from "qqq/components/widgets/blocks/BlockModels";
import React from "react";
/*******************************************************************************
** Block that renders ... an <Icon> tag
**
** <Icon>{name}</Icon>
*******************************************************************************/
export default function IconBlock({widgetMetaData, data}: StandardBlockComponentProps): JSX.Element
{
return (
<BlockElementWrapper metaData={widgetMetaData} data={data} slot="">
<span style={{color: data.styles?.color, lineHeight: 0, fontSize: data.styles?.fontSize}}>
<Icon color={data.styles?.color}>{data.values?.name}</Icon>
</span>
</BlockElementWrapper>
);
}
@@ -30,7 +30,7 @@ import React from "react";
**
** <audio src=${path} ${autoPlay} ${showControls} />
*******************************************************************************/
export default function AudioBlock({widgetMetaData, data}: StandardBlockComponentProps): JSX.Element
export default function ImageBlock({widgetMetaData, data}: StandardBlockComponentProps): JSX.Element
{
let imageStyle: any = {};
@@ -138,7 +138,7 @@ export default function TextBlock({widgetMetaData, data}: StandardBlockComponent
}
const text = data.values.interpolatedText ?? data.values.text;
const lines = text.split("\n");
const lines = (text ?? "").split("\n");
const startIcon = data.values.startIcon?.name ? <Icon>{data.values.startIcon.name}</Icon> : null;
const endIcon = data.values.endIcon?.name ? <Icon>{data.values.endIcon.name}</Icon> : null;
@@ -0,0 +1,124 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2025. 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, Skeleton} from "@mui/material";
import {AdornmentType} from "@qrunio/qqq-frontend-core/lib/model/metaData/AdornmentType";
import {QFieldMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QFieldMetaData";
import {QWidgetMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QWidgetMetaData";
import {QRecord} from "@qrunio/qqq-frontend-core/lib/model/QRecord";
import DashboardWidgets from "qqq/components/widgets/DashboardWidgets";
import Client from "qqq/utils/qqq/Client";
import React, {useEffect, useRef, useState} from "react";
const qController = Client.getInstance();
interface Props
{
field: QFieldMetaData;
record: QRecord;
}
/***************************************************************************
* Render a field for a view-only screen (e.g., not a form), using a widget.
* The field is expected to have an adornment of type WIDGET, with a value
* "widgetName", which should be a valid widget name within the qInstance.
***************************************************************************/
export function FieldValueAsWidget({field, record}: Props): JSX.Element
{
const [widgetName] = useState(field?.getAdornment(AdornmentType.WIDGET)?.getValue("widgetName"));
const [widgetMetaData, setWidgetMetaData] = useState(null as QWidgetMetaData);
const [error, setError] = useState(null as string);
const [ready, setReady] = useState(false);
const skeletonWrapperRef = useRef();
const widgetData = record.values.get(field.name);
useEffect(() =>
{
(async () =>
{
try
{
const metaData = await qController.loadMetaData();
const widgetMetaData = metaData.widgets.get(widgetName);
if (!widgetMetaData)
{
setError(`Could not load widget [${widgetName}]`);
}
else
{
setWidgetMetaData(widgetMetaData);
setReady(true);
}
}
catch (e)
{
setError(`${e}`);
}
})();
}, []);
///////////////////////
// if error, show it //
///////////////////////
if (error)
{
return (<span className="FieldValueAsWidget" style={{color: "red", fontSize: "0.875rem"}}>
<span>Error: {error}</span>
</span>
);
}
///////////////////////////////////////////////////////////////////////////////////////
// make skeleton fade in after a bit, so if content is fast enough, it doesn't flash //
///////////////////////////////////////////////////////////////////////////////////////
setTimeout(() =>
{
try
{
if (skeletonWrapperRef.current)
{
//@ts-ignore
skeletonWrapperRef.current.style.opacity = "100";
}
}
catch (e)
{
// ignore
}
}, 250);
/////////////////////////////////
// if not ready, show skeleton //
/////////////////////////////////
if (!ready)
{
return (<div ref={skeletonWrapperRef} id="it" style={{opacity: 0, transition: "opacity 0.75s ease"}}><Skeleton /></div>);
}
/////////////////////////////////////////////
// assuming all is good, render the widget //
/////////////////////////////////////////////
return (<Box component="span" sx={{"& .widget": {padding: "0 !important", display: "inline-block"}}}>
<DashboardWidgets key={`field:${field.name}`} widgetMetaDataList={[widgetMetaData]} initialWidgetDataList={[widgetData]} omitWrappingGridContainer={true} omitPaddingOnWidget={true} screen="recordView" />
</Box>);
}
+35 -12
View File
@@ -19,16 +19,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {QException} from "@qrunio/qqq-frontend-core/lib/exceptions/QException";
import {Capability} from "@qrunio/qqq-frontend-core/lib/model/metaData/Capability";
import {QFieldMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QFieldMetaData";
import {QInstance} from "@qrunio/qqq-frontend-core/lib/model/metaData/QInstance";
import {QProcessMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QProcessMetaData";
import {QTableMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QTableMetaData";
import {QTableSection} from "@qrunio/qqq-frontend-core/lib/model/metaData/QTableSection";
import {QTableVariant} from "@qrunio/qqq-frontend-core/lib/model/metaData/QTableVariant";
import {QRecord} from "@qrunio/qqq-frontend-core/lib/model/QRecord";
import {QueryJoin} from "@qrunio/qqq-frontend-core/lib/model/query/QueryJoin";
import {Alert, Typography} from "@mui/material";
import Avatar from "@mui/material/Avatar";
import Box from "@mui/material/Box";
@@ -48,6 +38,17 @@ import MenuItem from "@mui/material/MenuItem";
import Modal from "@mui/material/Modal";
import Tooltip from "@mui/material/Tooltip/Tooltip";
import {SxProps} from "@mui/system";
import {QException} from "@qrunio/qqq-frontend-core/lib/exceptions/QException";
import {AdornmentType} from "@qrunio/qqq-frontend-core/lib/model/metaData/AdornmentType";
import {Capability} from "@qrunio/qqq-frontend-core/lib/model/metaData/Capability";
import {QFieldMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QFieldMetaData";
import {QInstance} from "@qrunio/qqq-frontend-core/lib/model/metaData/QInstance";
import {QProcessMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QProcessMetaData";
import {QTableMetaData} from "@qrunio/qqq-frontend-core/lib/model/metaData/QTableMetaData";
import {QTableSection} from "@qrunio/qqq-frontend-core/lib/model/metaData/QTableSection";
import {QTableVariant} from "@qrunio/qqq-frontend-core/lib/model/metaData/QTableVariant";
import {QRecord} from "@qrunio/qqq-frontend-core/lib/model/QRecord";
import {QueryJoin} from "@qrunio/qqq-frontend-core/lib/model/query/QueryJoin";
import QContext from "QContext";
import colors from "qqq/assets/theme/base/colors";
import AuditBody from "qqq/components/audits/AuditBody";
@@ -61,6 +62,7 @@ import ShareModal from "qqq/components/sharing/ShareModal";
import DashboardWidgets from "qqq/components/widgets/DashboardWidgets";
import BaseLayout from "qqq/layouts/BaseLayout";
import ProcessRun from "qqq/pages/processes/ProcessRun";
import {FieldValueAsWidget} from "qqq/pages/records/view/FieldValueAsWidget";
import HistoryUtils from "qqq/utils/HistoryUtils";
import HtmlUtils from "qqq/utils/HtmlUtils";
import Client from "qqq/utils/qqq/Client";
@@ -100,6 +102,14 @@ export function renderSectionOfFields(key: string, fieldNames: string[], tableMe
{
let [field, tableForField] = tableMetaData ? TableUtils.getFieldAndTable(tableMetaData, fieldName) : fieldMap ? [fieldMap[fieldName], null] : [null, null];
if(field == null)
{
if(tableMetaData?.virtualFields?.has(fieldName))
{
field = tableMetaData.virtualFields.get(fieldName);
}
}
if (field != null)
{
let label = field.label;
@@ -111,6 +121,13 @@ export function renderSectionOfFields(key: string, fieldNames: string[], tableMe
const labelElement = <Typography variant="button" textTransform="none" fontWeight="bold" pr={1} color="rgb(52, 71, 103)" sx={{cursor: "default", ...(styleOverrides?.label ?? {})}}>{label}:</Typography>;
if(field.hasAdornment(AdornmentType.WIDGET))
{
return (<Grid item key={fieldName} lg={gridColumns} flexDirection="column" pr={2}>
<FieldValueAsWidget field={field} record={record} />
</Grid>);
}
return (
<Grid item key={fieldName} lg={gridColumns} flexDirection="column" pr={2}>
<>
@@ -594,7 +611,7 @@ function RecordView({table, record: overrideRecord, launchProcess}: Props): JSX.
/////////////////////////////////////////////////
// define the sections, e.g., for the left-bar //
/////////////////////////////////////////////////
const tableSections = TableUtils.getSectionsForRecordSidebar(tableMetaData);
const tableSections = TableUtils.getSectionsForRecordSidebar(tableMetaData, null, undefined, "RECORD_VIEW");
setTableSections(tableSections);
////////////////////////////////////////////////////
@@ -604,7 +621,13 @@ function RecordView({table, record: overrideRecord, launchProcess}: Props): JSX.
const nonT1TableSections = [];
for (let i = 0; i < tableSections.length; i++)
{
const section = tableSections[i];
let section = tableSections[i];
if(section.alternatives?.has("RECORD_VIEW"))
{
section = section.alternatives.get("RECORD_VIEW")
}
if (section.isHidden)
{
continue;
+9 -3
View File
@@ -44,7 +44,7 @@ class TableUtils
** By default sections w/ widget names are excluded -- but -- to include them,
** provide the metaData plus list of allowedWidgetTypes.
*******************************************************************************/
public static getSectionsForRecordSidebar(tableMetaData: QTableMetaData, allowedFieldNames: any = null, additionalInclusionPredicate?: (section: QTableSection) => boolean): QTableSection[]
public static getSectionsForRecordSidebar(tableMetaData: QTableMetaData, allowedFieldNames: any = null, additionalInclusionPredicate?: (section: QTableSection) => boolean, alternativeType?: string): QTableSection[]
{
/////////////////////////////////////////////////////////////////
// if the table has sections, then filter them and return some //
@@ -72,7 +72,12 @@ class TableUtils
const allowedSections: QTableSection[] = [];
for (let i = 0; i < tableMetaData.sections.length; i++)
{
const section = tableMetaData.sections[i];
let section = tableMetaData.sections[i];
if(alternativeType && section.alternatives?.has(alternativeType))
{
section = section.alternatives.get(alternativeType);
}
let includeSection = false;
for (let j = 0; j < section.fieldNames?.length; j++)
@@ -101,8 +106,9 @@ class TableUtils
////////////////////////////////////////////////////////////////
// if there are no filters to apply, then return all sections //
// (potentially mapped to an alternative, by the type) //
////////////////////////////////////////////////////////////////
return (tableMetaData.sections);
return (tableMetaData.sections.map((section) => section.alternatives?.get(alternativeType) ?? section));
}
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -23,9 +23,12 @@ package com.kingsrook.qqq.frontend.materialdashboard.seleniumwithqapplication.te
import java.util.List;
import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizerInterface;
import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizers;
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.AbstractWidgetRenderer;
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.QueryOrGetInputInterface;
import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput;
import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput;
import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput;
@@ -39,8 +42,10 @@ import com.kingsrook.qqq.backend.core.model.metadata.fields.AdornmentType;
import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldAdornment;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QVirtualFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.layout.QIcon;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSectionAlternativeType;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qqq.frontend.materialdashboard.junit.TestUtils;
@@ -85,8 +90,11 @@ public class FilterWidgetOnFieldIT extends QBaseSeleniumWithQApplicationTest
.withFieldAdornment(new FieldAdornment(AdornmentType.WIDGET)
.withValue(AdornmentType.WidgetValues.WIDGET_NAME, widget.getName())))
.withSection(new QFieldSection("identity", new QIcon(), Tier.T1, List.of("id", "name")))
.withSection(new QFieldSection("filter", new QIcon(), Tier.T2, List.of("filterJSON")))
.withPrimaryKeyField("id");
.withSection(new QFieldSection("filter", new QIcon(), Tier.T2, List.of("filterJSON"))
.withAlternative(QFieldSectionAlternativeType.RECORD_VIEW, (s) -> s.setFieldNames(List.of("filterVirtual"))))
.withVirtualField(new QVirtualFieldMetaData("filterVirtual", QFieldType.STRING).withLabel("Person Filter"))
.withPrimaryKeyField("id")
.withCustomizer(TableCustomizers.POST_QUERY_RECORD, new QCodeReference(TableCustomizer.class));
qInstance.addTable(table);
PeopleAppProducer.addTableToGreetingsApp(qInstance, table.getName());
@@ -122,6 +130,25 @@ public class FilterWidgetOnFieldIT extends QBaseSeleniumWithQApplicationTest
/***************************************************************************
*
***************************************************************************/
public static class TableCustomizer implements TableCustomizerInterface
{
@Override
public List<QRecord> postQuery(QueryOrGetInputInterface queryInput, List<QRecord> records) throws QException
{
for(QRecord record : records)
{
record.setValue("filterVirtual", record.getValueString("filterJSON"));
}
return (records);
}
}
/*******************************************************************************
**
*******************************************************************************/
@@ -0,0 +1,207 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2024. 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/>.
*/
package com.kingsrook.qqq.frontend.materialdashboard.seleniumwithqapplication.tests;
import java.time.LocalDate;
import java.util.List;
import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizerInterface;
import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizers;
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.AbstractWidgetRenderer;
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.QueryOrGetInputInterface;
import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput;
import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput;
import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput;
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.CompositeWidgetData;
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType;
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.blocks.base.BaseStyles;
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.blocks.icon.IconBlockData;
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.blocks.icon.IconValues;
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.blocks.text.TextBlockData;
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.blocks.text.TextValues;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.fields.AdornmentType;
import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldAdornment;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QVirtualFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.layout.QIcon;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSectionAlternativeType;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qqq.frontend.materialdashboard.seleniumwithqapplication.lib.QBaseSeleniumWithQApplicationTest;
import com.kingsrook.qqq.frontend.materialdashboard.seleniumwithqapplication.metadata.MemoryBackendProducer;
import com.kingsrook.qqq.frontend.materialdashboard.seleniumwithqapplication.metadata.PeopleAppProducer;
import org.junit.jupiter.api.Test;
/*******************************************************************************
* Tests for some new features being added together:
* 1) virtual field on a table
* 2) used in an alternative section
* 3) rendered as a widget on the view screen
*******************************************************************************/
public class VirtualFieldInAlternativeSectionViewedAsWidgetIT extends QBaseSeleniumWithQApplicationTest
{
private static final String TABLE_NAME = "tableWithVirtualFieldInAlternativeSectionViewedAsWidget";
/***************************************************************************
*
***************************************************************************/
@Override
protected void customizeQInstance(QInstance qInstance) throws QException
{
QWidgetMetaData widget = new QWidgetMetaData()
.withName("genericCompositeWidget")
.withType(WidgetType.COMPOSITE.getType())
.withCodeReference(new QCodeReference(NoopWidgetRenderer.class));
qInstance.addWidget(widget);
QTableMetaData table = new QTableMetaData()
.withName(TABLE_NAME)
.withBackendName(MemoryBackendProducer.NAME)
.withRecordLabelFormatAndFields("%s", "name")
.withField(new QFieldMetaData("id", QFieldType.INTEGER).withIsEditable(false))
.withField(new QFieldMetaData("name", QFieldType.STRING).withIsRequired(true))
.withField(new QFieldMetaData("type", QFieldType.STRING))
.withField(new QFieldMetaData("homeTown", QFieldType.STRING))
.withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withIsEditable(false))
.withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withIsEditable(false))
.withSection(new QFieldSection("identity", new QIcon(), Tier.T1, List.of("id", "name", "homeTown"))
.withAlternative(QFieldSectionAlternativeType.RECORD_VIEW, (s) -> s.setFieldNames(List.of("mergedField", "homeTown"))))
.withSection(new QFieldSection("hidden", new QIcon(), Tier.T2, List.of("type"))
.withAlternative(QFieldSectionAlternativeType.RECORD_VIEW, (s) -> s.setIsHidden(true)))
.withSection(new QFieldSection("dates", new QIcon(), Tier.T3, List.of("createDate", "modifyDate"))
.withAlternative(QFieldSectionAlternativeType.RECORD_VIEW, (s) -> s.getFieldNames().add(0, "currentDate")))
.withPrimaryKeyField("id");
table.withVirtualField(new QVirtualFieldMetaData("mergedField", QFieldType.STRING)
.withFieldAdornment(new FieldAdornment().withType(AdornmentType.WIDGET)
.withValue(AdornmentType.WidgetValues.WIDGET_NAME, widget.getName())));
table.withVirtualField(new QVirtualFieldMetaData("currentDate", QFieldType.DATE));
table.withCustomizer(TableCustomizers.POST_QUERY_RECORD, new QCodeReference(TableCustomizer.class));
qInstance.addTable(table);
PeopleAppProducer.addTableToGreetingsApp(qInstance, table.getName());
}
/***************************************************************************
*
***************************************************************************/
@Override
protected void setupTestData() throws QException
{
new InsertAction().execute(new InsertInput(TABLE_NAME).withRecord(new QRecord()
.withValue("id", 1)
.withValue("name", "Homer")
.withValue("type", "Cartoon")
.withValue("homeTown", "Springville")
));
}
/***************************************************************************
*
***************************************************************************/
public static class NoopWidgetRenderer extends AbstractWidgetRenderer
{
/***************************************************************************
**
***************************************************************************/
@Override
public RenderWidgetOutput render(RenderWidgetInput input) throws QException
{
return null;
}
}
/***************************************************************************
*
***************************************************************************/
public static class TableCustomizer implements TableCustomizerInterface
{
/***************************************************************************
*
***************************************************************************/
@Override
public List<QRecord> postQuery(QueryOrGetInputInterface queryInput, List<QRecord> records)
{
for(QRecord record : records)
{
CompositeWidgetData widgetData = new CompositeWidgetData().withLayout(CompositeWidgetData.Layout.FLEX_ROW_WRAPPED)
.withStyles(new BaseStyles().withPadding(BaseStyles.Directional.ofY("8")))
.withBlocks(List.of(
new IconBlockData().withValues(new IconValues().withName("gavel")),
new TextBlockData().withValues(new TextValues(record.getValueString("id") + "|" + record.getValueString("name") + "|" + record.getValueString("type")))
));
record.setValue("mergedField", widgetData);
record.setValue("currentDate", LocalDate.parse("2025-12-09"));
}
return records;
}
}
/*******************************************************************************
**
*******************************************************************************/
@Test
void test()
{
qSeleniumLib.gotoAndWaitForBreadcrumbHeaderToContain("/peopleApp/greetingsApp/" + TABLE_NAME + "/1", "Homer");
qSeleniumLib.waitForSelectorContaining(".material-icons-round", "gavel");
qSeleniumLib.waitForSelectorContaining(".compositeWidget", "1|Homer|Cartoon");
qSeleniumLib.waitForSelectorContaining(".sidebar-section", "Identity");
qSeleniumLib.waitForSelectorContainingToNotExist(".sidebar-section", "Hidden");
qSeleniumLib.waitForSelectorContaining(".sidebar-section", "Dates");
qSeleniumLib.waitForSelectorContainingToNotExist("h6", "Hidden");
qSeleniumLib.waitForSelectorContaining("h6", "Dates");
qfmdSeleniumLib.waitForViewScreenFieldValue("Home Town", "Springville");
qfmdSeleniumLib.waitForViewScreenFieldValue("Current Date", "2025-12-09");
// qSeleniumLib.waitForever();
}
}