diff --git a/.gitignore b/.gitignore index d420165..13e0f07 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,11 @@ .settings node node_modules +/sci-types-department/target/ /sci-types-project/target/ /scientificcms/target/ /sci-publications/nbproject/ /sci-publications/target/ /scicms-bundle-devel-wildfly/target/ /sci-types-project/nbproject/ +/sci-types-department/nbproject/ diff --git a/pom.xml b/pom.xml index c08ddc3..c1a68d7 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,7 @@ + sci-types-department sci-types-project scientificcms sci-publications diff --git a/sci-types-department/package-lock.json b/sci-types-department/package-lock.json new file mode 100644 index 0000000..c1de2ed --- /dev/null +++ b/sci-types-department/package-lock.json @@ -0,0 +1,4227 @@ +{ + "name": "sci-types-department", + "version": "7.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "sci-types-department", + "version": "7.0.0", + "license": "LGPL-3.0-or-later", + "dependencies": { + "sortablejs": "^1.14.0" + }, + "devDependencies": { + "@types/sortablejs": "^1.10.7", + "npm-run-all": "^4.1.5", + "ts-loader": "^9.2.6", + "typescript": "^4.4.3", + "webpack": "^5.55.1", + "webpack-cli": "^4.8.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", + "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", + "dev": true + }, + "node_modules/@types/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-qrhtM7M41EhH4tZQTNw2/RJkxllBx3reiJpTbgWCM2Dx0U1sZ6LwKp9lfNln9uqE26ZMKUaPEYaD4rzvOWYtZw==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001414", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", + "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.270", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", + "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.6", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "node_modules/string.prototype.padend": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", + "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-loader": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-cli/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, + "dependencies": { + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/node": { + "version": "18.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", + "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", + "dev": true + }, + "@types/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-qrhtM7M41EhH4tZQTNw2/RJkxllBx3reiJpTbgWCM2Dx0U1sZ6LwKp9lfNln9uqE26ZMKUaPEYaD4rzvOWYtZw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caniuse-lite": { + "version": "1.0.30001414", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", + "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "electron-to-chromium": { + "version": "1.4.270", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", + "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.6", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "string.prototype.padend": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", + "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-loader": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } + }, + "webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/sci-types-department/package.json b/sci-types-department/package.json new file mode 100644 index 0000000..a8c9172 --- /dev/null +++ b/sci-types-department/package.json @@ -0,0 +1,26 @@ +{ + "name": "sci-types-department", + "version": "7.0.0", + "description": "JavaScript parts of the UI of sci-types-department", + "main": "index.js", + "scripts": { + "build": "npm-run-all build:*", + "build:js": "webpack" + }, + "author": "Jens Pelzetter", + "license": "LGPL-3.0-or-later", + "devDependencies": { + "@types/sortablejs": "^1.10.7", + "npm-run-all": "^4.1.5", + "ts-loader": "^9.2.6", + "typescript": "^4.4.3", + "webpack": "^5.55.1", + "webpack-cli": "^4.8.0" + }, + "dependencies": { + "sortablejs": "^1.14.0" + }, + "targets": { + "main": false + } +} \ No newline at end of file diff --git a/sci-types-department/pom.xml b/sci-types-department/pom.xml new file mode 100644 index 0000000..2611d82 --- /dev/null +++ b/sci-types-department/pom.xml @@ -0,0 +1,357 @@ + + + 4.0.0 + + + UTF-8 + ${maven.build.timestamp} + yyyy-MM-dd'T'HH:mm:ss'Z'Z + + + + org.scientificcms + scientificcms-parent + 7.0.0-SNAPSHOT + + + org.scientificcms + sci-types-department + 7.0.0-SNAPSHOT + + ScientificCMS SciDepartment Content Type + + + + + javax + javaee-api + jar + provided + + + + org.libreccm + ccm-core + ${project.parent.version} + provided + + + + org.librecms + ccm-cms + ${project.parent.version} + provided + + + + org.scientificcms + sci-types-project + ${project.parent.version} + provided + + + + org.hibernate + hibernate-core + provided + + + + org.hibernate + hibernate-envers + provided + + + + org.hibernate.validator + hibernate-validator + provided + + + + org.apache.logging.log4j + log4j-api + provided + + + + junit + junit + test + + + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + + org.libreccm + ccm-testutils + ${project.parent.version} + test + + + + nl.jqno.equalsverifier + equalsverifier + test + + + + org.jboss.arquillian.junit + arquillian-junit-container + test + + + org.jboss.arquillian.extension + arquillian-persistence-dbunit + test + + + org.jboss.shrinkwrap.resolver + shrinkwrap-resolver-impl-maven + test + + + + com.h2database + h2 + test + + + + + + sci-types-department + + + + src/main/resources + true + + + ./target/generated-resources + + + + + + src/test/resources + + + ${project.build.directory}/generated-resources + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + true + true + ${project.build.sourceEncoding} + + + + + com.github.eirslett + frontend-maven-plugin + + ../node + + + + Install node.js and NPM + + install-node-and-npm + + + v16.14.2 + + + + npm install + + npm + + + --userconfig ../libreccm.npmrc install + + + + build + + npm + + + run build + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + org.libreccm.tests.categories.UnitTest + + + + + org.jacoco + jacoco-maven-plugin + + + default-prepare-agent + + prepare-agent + + + + default-report + prepare-package + + report + + + + + + + de.jpdigital + hibernate53-ddl-maven-plugin + + + h2 + oracle12c + postgresql9 + + + org.libreccm + org.librecms + org.scientificcms + + true + ${basedir}/src/main/resources/META-INF/persistence-ddl.xml + + + + + gen-ddl + + process-classes + + + + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + true + + http://docs.oracle.com/javase/7/docs/api/ + http://docs.oracle.com/javaee/7/api/ + http://docs.jboss.org/hibernate/orm/4.3/javadocs/ + + private + true + UTF-8 + UTF-8 + UTF-8 + true + true + true + true + false + + + + + org.apache.maven.plugins + maven-jxr-plugin + + + org.apache.maven.plugins + maven-surefire-report-plugin + + + org.jacoco + jacoco-maven-plugin + + + org.codehaus.mojo + findbugs-maven-plugin + + + + org.apache.maven.plugins + maven-pmd-plugin + + true + utf-8 + 1.8 + + + + + org.codehaus.mojo + javancss-maven-plugin + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + dependencies + licenses + + + + + false + + + + + + diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/Contact.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/Contact.java new file mode 100644 index 0000000..6720fbd --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/Contact.java @@ -0,0 +1,194 @@ +package org.scientificcms.contenttypes.scidepartment; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import org.hibernate.envers.Audited; +import org.libreccm.core.CcmObjects; +import org.librecms.assets.ContactableEntity; + +import java.io.Serializable; +import java.util.Objects; +import java.util.Optional; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import static org.scientificcms.contenttypes.scidepartment.SciDepartmentConstants.DB_SCHEMA; + +/** + * + * @author Jens Pelzetter + */ +@Entity(name = "DepartmentContact") +@Audited +@Table(name = "DEPARTMENT_CONTACTS", schema = DB_SCHEMA) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + property = "uuid" +) +public class Contact implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "CONTACT_ID") + @GeneratedValue(strategy = GenerationType.AUTO) + private long contactId; + + @Column(name = "CONTACT_TYPE", length = 255, nullable = true) + private String contactType; + + @Column(name = "CONTACT_ORDER") + private long order; + + @ManyToOne + @JoinColumn(name = "DEPARTMENT_ID") + @JsonIdentityReference(alwaysAsId = true) + private SciDepartment department; + + @ManyToOne + @JoinColumn(name = "CONTACTABLE_ID") + @JsonIdentityReference(alwaysAsId = true) + private ContactableEntity contactable; + + public long getContactId() { + return contactId; + } + + protected void setContactId(final long contactId) { + this.contactId = contactId; + } + + public String getContactType() { + return contactType; + } + + public void setContactType(final String contactType) { + this.contactType = contactType; + } + + public long getOrder() { + return order; + } + + public void setOrder(final long order) { + this.order = order; + } + + public SciDepartment getDepartment() { + return department; + } + + protected void setDepartment(final SciDepartment department) { + this.department = department; + } + + public ContactableEntity getContactable() { + return contactable; + } + + protected void setContactable(final ContactableEntity contactable) { + this.contactable = contactable; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 41 * hash + (int) (contactId ^ (contactId >>> 32)); + hash = 41 * hash + Objects.hashCode(contactType); + hash = 41 * hash + (int) (order ^ (order >>> 32)); + hash = 41 * hash + CcmObjects.hashCodeUsingUuid(department); + hash = 41 * hash + CcmObjects.hashCodeUsingUuid(contactable); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof Contact)) { + return false; + } + final Contact other = (Contact) obj; + if (!other.canEqual(this)) { + return false; + } + if (contactId != other.getContactId()) { + return false; + } + if (!Objects.equals(contactType, other.getContactType())) { + return false; + } + if (!CcmObjects.equalsUsingUuid(department, other.getDepartment())) { + return false; + } + if (!CcmObjects.equalsUsingUuid(contactable, other.getContactable())) { + return false; + } + return order == other.getOrder(); + } + + public boolean canEqual(final Object obj) { + + return obj instanceof Contact; + } + + @Override + public final String toString() { + return toString(""); + } + + public String toString(final String data) { + return String.format( + "%s{ " + + "contactId = %d, " + + "contactType = \"%s\", " + + "order = %d, " + + "project = { %s } " + + "contactableUuid = %s%s" + + " }", + super.toString(), + contactId, + contactType, + order, + Optional + .ofNullable(department) + .map( + dep -> String.format( + "objectId = %d," + + "uuid = \"%s\", " + + "name = \"%s\"", + dep.getObjectId(), + dep.getUuid(), + dep.getDisplayName() + ) + ) + .orElse(""), + Optional + .ofNullable(contactable) + .map( + entity -> String.format( + "objectId = %d," + + "uuid = \"%s\", " + + "name = \"%s\"", + entity.getObjectId(), + entity.getUuid(), + entity.getDisplayName() + ) + ) + .orElse(""), + data + ); + } +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ContactRepository.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ContactRepository.java new file mode 100644 index 0000000..7baf47d --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ContactRepository.java @@ -0,0 +1,42 @@ +package org.scientificcms.contenttypes.scidepartment; + +import org.libreccm.auditing.AbstractAuditedEntityRepository; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class ContactRepository + extends AbstractAuditedEntityRepository { + + private static final long serialVersionUID = 1L; + + @Override + public Long getEntityId(final Contact contact) { + return contact.getContactId(); + } + + @Override + public Class getEntityClass() { + return Contact.class; + } + + @Override + public String getIdAttributeName() { + return "contactId"; + } + + @Override + public Long getIdOfEntity(final Contact contact) { + return contact.getContactId(); + } + + @Override + public boolean isNew(final Contact contact) { + return contact.getContactId() == 0; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentProject.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentProject.java new file mode 100644 index 0000000..814a2eb --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentProject.java @@ -0,0 +1,157 @@ +package org.scientificcms.contenttypes.scidepartment; + +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import org.hibernate.envers.Audited; +import org.libreccm.core.CcmObjects; +import org.scientificcms.contenttypes.sciproject.SciProject; + +import java.io.Serializable; +import java.util.Objects; +import java.util.Optional; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import static org.scientificcms.contenttypes.scidepartment.SciDepartmentConstants.DB_SCHEMA; + +/** + * + * @author Jens Pelzetter + */ +@Entity +@Audited +@Table(name = "DEPARTMENT_PROJECTS", schema = DB_SCHEMA) +public class DepartmentProject implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "DEPARTMENT_PROJECT_ID") + @GeneratedValue(strategy = GenerationType.AUTO) + private long departmentProjectId; + + @ManyToOne + @JoinColumn(name = "DEPARTMENT_ID") + @JsonIdentityReference(alwaysAsId = true) + private SciDepartment department; + + @ManyToOne + @JoinColumn(name = "PROJECT_ID") + @JsonIdentityReference(alwaysAsId = true) + private SciProject project; + + public long getDepartmentProjectId() { + return departmentProjectId; + } + + protected void setDepartmentProjectId(final long departmentProjectId) { + this.departmentProjectId = departmentProjectId; + } + + public SciDepartment getDepartment() { + return department; + } + + protected void setDepartment(final SciDepartment department) { + this.department = department; + } + + public SciProject getProject() { + return project; + } + + protected void setProject(final SciProject project) { + this.project = project; + } + + @Override + public int hashCode() { + int hash = 7; + hash + = 59 * hash + (int) (departmentProjectId ^ (departmentProjectId + >>> 32)); + hash = 59 * hash + CcmObjects.hashCodeUsingUuid(department); + hash = 59 * hash + CcmObjects.hashCodeUsingUuid(project); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof DepartmentProject)) { + return false; + } + final DepartmentProject other = (DepartmentProject) obj; + if (!other.canEqual(this)) { + return false; + } + + if (departmentProjectId != other.getDepartmentProjectId()) { + return false; + } + if (!CcmObjects.equalsUsingUuid(department, other.getDepartment())) { + return false; + } + return CcmObjects.equalsUsingUuid(project, other.getProject()); + } + + public boolean canEqual(final Object obj) { + return obj instanceof DepartmentProject; + } + + @Override + public String toString() { + return toString(""); + } + + public String toString(final String data) { + return String.format( + "%s{ " + + "departmentProjectId = %d, " + + "department = { %s }, " + + "project = { %s}%s" + + " }", + super.toString(), + departmentProjectId, + Optional + .ofNullable(department) + .map( + dep -> String.format( + "objectId = %d," + + "uuid = \"%s\", " + + "name = \"%s\"", + dep.getObjectId(), + dep.getUuid(), + dep.getDisplayName() + ) + ) + .orElse(""), + Optional + .ofNullable(project) + .map( + proj -> String.format( + "objectId = %d," + + "uuid = \"%s\", " + + "name = \"%s\"", + project.getObjectId(), + project.getUuid(), + project.getDisplayName() + ) + ) + .orElse(""), + data + ); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentProjectRepository.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentProjectRepository.java new file mode 100644 index 0000000..b3266c8 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentProjectRepository.java @@ -0,0 +1,42 @@ +package org.scientificcms.contenttypes.scidepartment; + +import org.libreccm.auditing.AbstractAuditedEntityRepository; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class DepartmentProjectRepository + extends AbstractAuditedEntityRepository { + + private static final long serialVersionUID = 1L; + + @Override + public Long getEntityId(final DepartmentProject project) { + return project.getDepartmentProjectId(); + } + + @Override + public Class getEntityClass() { + return DepartmentProject.class; + } + + @Override + public String getIdAttributeName() { + return "departmentProjectId"; + } + + @Override + public Long getIdOfEntity(final DepartmentProject project) { + return project.getDepartmentProjectId(); + } + + @Override + public boolean isNew(final DepartmentProject project) { + return project.getDepartmentProjectId() == 0; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentText.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentText.java new file mode 100644 index 0000000..dc1f781 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentText.java @@ -0,0 +1,185 @@ +package org.scientificcms.contenttypes.scidepartment; + +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import org.hibernate.envers.Audited; +import org.libreccm.core.CcmObjects; +import org.libreccm.l10n.LocalizedString; + +import java.io.Serializable; +import java.util.Objects; +import java.util.Optional; + +import javax.persistence.AssociationOverride; +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import static org.scientificcms.contenttypes.scidepartment.SciDepartmentConstants.DB_SCHEMA; + +/** + * + * @author Jens Pelzetter + */ +@Entity +@Audited +@Table(name = "DEPARTMENT_TEXTS", schema = DB_SCHEMA) +public class DepartmentText implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "TEXT_ID") + @GeneratedValue(strategy = GenerationType.AUTO) + private long textId; + + @Column(name = "key", length = 255, nullable = false) + private String key; + + @Column(name = "CONTACT_ORDER") + private long order; + + @ManyToOne + @JoinColumn(name = "DEPARTMENT_ID") + @JsonIdentityReference(alwaysAsId = true) + private SciDepartment department; + + @Embedded + @AssociationOverride( + name = "values", + joinTable = @JoinTable( + name = "DEPARTMENT_TEXT_VALUES", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID") + } + ) + ) + private LocalizedString text; + + public long getTextId() { + return textId; + } + + protected void setTextId(final long textId) { + this.textId = textId; + } + + public String getKey() { + return key; + } + + public void setKey(final String key) { + this.key = key; + } + + public long getOrder() { + return order; + } + + public void setOrder(final long order) { + this.order = order; + } + + public SciDepartment getDepartment() { + return department; + } + + public void setDepartment(final SciDepartment department) { + this.department = department; + } + + public LocalizedString getText() { + return text; + } + + public void setText(final LocalizedString text) { + this.text = text; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 67 * hash + (int) (textId ^ (textId >>> 32)); + hash = 67 * hash + Objects.hashCode(key); + hash = 67 * hash + (int) (order ^ (order >>> 32)); + hash = 67 * hash + CcmObjects.hashCodeUsingUuid(department); + hash = 67 * hash + Objects.hashCode(text); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof DepartmentText)) { + return false; + } + final DepartmentText other = (DepartmentText) obj; + if (!other.canEqual(this)) { + return false; + } + + if (textId != other.getTextId()) { + return false; + } + if (order != other.getOrder()) { + return false; + } + if (!Objects.equals(key, other.getKey())) { + return false; + } + if (!Objects.equals(department, other.getDepartment())) { + return false; + } + return Objects.equals(text, other.getText()); + } + + public boolean canEqual(final Object obj) { + return obj instanceof DepartmentText; + } + + @Override + public String toString() { + return toString(""); + } + + public String toString(final String data) { + return String.format( + "textId = %d, " + + "key = %s, " + + "order = %d, " + + "department = { %s }, " + + "text = { %s }%s", + textId, + key, + order, + Optional + .ofNullable(department) + .map( + dep -> String.format( + "objectId = %d," + + "uuid = \"%s\", " + + "name = \"%s\"", + dep.getObjectId(), + dep.getUuid(), + dep.getDisplayName() + ) + ) + .orElse(""), + Objects.toString(text), + data + ); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentTextRepository.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentTextRepository.java new file mode 100644 index 0000000..a0dc64b --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/DepartmentTextRepository.java @@ -0,0 +1,40 @@ +package org.scientificcms.contenttypes.scidepartment; + +import org.libreccm.auditing.AbstractAuditedEntityRepository; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class DepartmentTextRepository + extends AbstractAuditedEntityRepository { + + @Override + public Long getEntityId(final DepartmentText text) { + return text.getTextId(); + } + + @Override + public Class getEntityClass() { + return DepartmentText.class; + } + + @Override + public String getIdAttributeName() { + return "textId"; + } + + @Override + public Long getIdOfEntity(final DepartmentText text) { + return text.getTextId(); + } + + @Override + public boolean isNew(final DepartmentText text) { + return text.getTextId() == 0; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/Membership.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/Membership.java new file mode 100644 index 0000000..758fc9b --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/Membership.java @@ -0,0 +1,207 @@ +package org.scientificcms.contenttypes.scidepartment; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import org.hibernate.envers.Audited; +import org.libreccm.core.CcmObjects; +import org.librecms.assets.Person; + +import java.io.Serializable; +import java.util.Objects; +import java.util.Optional; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import static org.scientificcms.contenttypes.scidepartment.SciDepartmentConstants.DB_SCHEMA; + +/** + * + * @author Jens Pelzetter + */ +@Entity(name = "DepartmentMembership") +@Audited +@Table(name = "DEPARTMENT_MEMBERSHIPS", schema = DB_SCHEMA) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + property = "uuid" +) +public class Membership implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "MEMBERSHIP_ID") + @GeneratedValue(strategy = GenerationType.AUTO) + private long membershipId; + + @Column(name = "MEMBER_ROLE", length = 255, nullable = true) + private String role; + + @Column(name = "STATUS") + @Enumerated(EnumType.STRING) + private MembershipStatus status; + + @ManyToOne + @JoinColumn(name = "DEPARTMENT_ID") + @JsonIdentityReference(alwaysAsId = true) + private SciDepartment department; + + @ManyToOne + @JoinColumn(name = "MEMBER_ID") + @JsonIdentityReference(alwaysAsId = true) + private Person member; + + public long getMembershipId() { + return membershipId; + } + + protected void setMembershipId(final long membershipId) { + this.membershipId = membershipId; + } + + public String getRole() { + return role; + } + + public void setRole(final String role) { + this.role = role; + } + + public MembershipStatus getStatus() { + return status; + } + + public void setStatus(final MembershipStatus status) { + this.status = status; + } + + public SciDepartment getDepartment() { + return department; + } + + protected void setDepartment(final SciDepartment department) { + this.department = department; + } + + public Person getMember() { + return member; + } + + protected void setMember(final Person member) { + this.member = member; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 37 * hash + + (int) (membershipId ^ (membershipId >>> 32)); + hash = 37 * hash + Objects.hashCode(role); + hash = 37 * hash + Objects.hashCode(status); + hash = 37 * hash + CcmObjects.hashCodeUsingUuid(department); + hash = 37 * hash + CcmObjects.hashCodeUsingUuid(member); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof Membership)) { + return false; + } + final Membership other = (Membership) obj; + if (!other.canEqual(this)) { + return false; + } + + if (membershipId != other.getMembershipId()) { + return false; + } + if (!Objects.equals(role, other.getRole())) { + return false; + } + + if (!CcmObjects.equalsUsingUuid(department, other.getDepartment())) { + return false; + } + if (!CcmObjects.equalsUsingUuid(member, other.getMember())) { + return false; + } + return status == other.getStatus(); + } + + public boolean canEqual(final Object obj) { + return obj instanceof Membership; + } + + @Override + public final String toString() { + return toString(""); + } + + public String toString(final String data) { + return String.format( + "%s{ " + + "membershipId = %d, " + + "role = \"%s\", " + + "status = \"%s\"," + + "project = { %s }, " + + "member = { %s }%s" + + " }", + super.toString(), + membershipId, + role, + Objects.toString(status), + Optional + .ofNullable(department) + .map( + dep -> String.format( + "objectId = %d," + + "uuid = \"%s\", " + + "name = \"%s\"", + dep.getObjectId(), + dep.getUuid(), + dep.getDisplayName() + ) + ) + .orElse(""), + Optional + .ofNullable(member) + .map( + person -> String.format( + "objectId = %d, " + + "uuid = \"%s\", " + + "name = \"%s\", " + + "surname = \"%s\", " + + "givenName = \"%s\", " + + "prefix = \"%s\", " + + "suffix = \"%s\"", + person.getObjectId(), + person.getUuid(), + person.getDisplayName(), + person.getPersonName().getSurname(), + person.getPersonName().getGivenName(), + person.getPersonName().getPrefix(), + person.getPersonName().getSuffix()) + ) + .orElse(""), + data + ); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/MembershipRepository.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/MembershipRepository.java new file mode 100644 index 0000000..6ba1116 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/MembershipRepository.java @@ -0,0 +1,40 @@ +package org.scientificcms.contenttypes.scidepartment; + +import org.libreccm.auditing.AbstractAuditedEntityRepository; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class MembershipRepository + extends AbstractAuditedEntityRepository { + + @Override + public Long getEntityId(final Membership membership) { + return membership.getMembershipId(); + } + + @Override + public Class getEntityClass() { + return Membership.class; + } + + @Override + public String getIdAttributeName() { + return "membershipId"; + } + + @Override + public Long getIdOfEntity(final Membership membership) { + return membership.getMembershipId(); + } + + @Override + public boolean isNew(final Membership membership) { + return membership.getMembershipId() == 0; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/MembershipStatus.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/MembershipStatus.java new file mode 100644 index 0000000..f353de2 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/MembershipStatus.java @@ -0,0 +1,13 @@ +package org.scientificcms.contenttypes.scidepartment; + +/** + * + * @author Jens Pelzetter + */ +public enum MembershipStatus { + + ACTIVE, + ASSOCIATED, + FORMER, + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartment.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartment.java new file mode 100644 index 0000000..089c4a3 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartment.java @@ -0,0 +1,308 @@ +package org.scientificcms.contenttypes.scidepartment; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import org.hibernate.envers.Audited; +import org.libreccm.l10n.LocalizedString; +import org.librecms.contentsection.ContentItem; +import org.librecms.contenttypes.ContentTypeDescription; +import org.librecms.ui.contentsections.documents.MvcAuthoringKit; +import org.scientificcms.contenttypes.scidepartment.ui.SciDepartmentCreateStep; +import org.scientificcms.contenttypes.scidepartment.ui.SciDepartmentDescriptionStep; +import org.scientificcms.contenttypes.scidepartment.ui.SciDepartmentPropertiesStep; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.persistence.AssociationOverride; +import javax.persistence.CascadeType; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; +import javax.persistence.Table; + +import static org.scientificcms.contenttypes.scidepartment.SciDepartmentConstants.DB_SCHEMA; + +/** + * + * @author Jens Pelzetter + */ +@Entity +@Audited +@Table(name = "DEPARTMENTS", schema = DB_SCHEMA) +@ContentTypeDescription( + labelBundle = "org.scientificcms.contenttypes.SciDepartment", + descriptionBundle = "org.scientificcms.contenttypes.SciDepartment" +) +@MvcAuthoringKit( + createStep = SciDepartmentCreateStep.class, + authoringSteps = { + SciDepartmentPropertiesStep.class, + SciDepartmentDescriptionStep.class + } +) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = SciDepartmentIdResolver.class, + property = "uuid" +) +public class SciDepartment extends ContentItem implements Serializable { + + private static final long serialVersionUID = 1L; + + @Embedded + @AssociationOverride( + name = "values", + joinTable = @JoinTable( + name = "DEPARTMENT_SHORT_DESCS", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID") + } + ) + ) + private LocalizedString shortDescription; + + @Embedded + @AssociationOverride( + name = "values", + joinTable = @JoinTable( + name = "DEPARTMENT_DESCS", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID") + } + ) + ) + private LocalizedString departmentDescription; + + @Embedded + @AssociationOverride( + name = "values", + joinTable = @JoinTable( + name = "DEPARTMENT_ADDENDUM", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID") + } + ) + ) + private LocalizedString addendum; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "department") + @OrderBy("order ASC") + @JsonIgnore + private Map additionalTexts; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "department") + @OrderBy("order ASC") + @JsonIgnore + private List contacts; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "department") + @OrderBy("member ASC") + @JsonIgnore + private List members; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "department") + @OrderBy("project ASC") + @JsonIgnore + private List projects; + + public SciDepartment() { + super(); + + shortDescription = new LocalizedString(); + departmentDescription = new LocalizedString(); + addendum = new LocalizedString(); + additionalTexts = new HashMap<>(); + contacts = new ArrayList<>(); + members = new ArrayList<>(); + projects = new ArrayList<>(); + } + + public LocalizedString getShortDescription() { + return shortDescription; + } + + public void setShortDescription(final LocalizedString shortDescription) { + this.shortDescription = shortDescription; + } + + public LocalizedString getDepartmentDescription() { + return departmentDescription; + } + + public void setDepartmentDescription( + final LocalizedString departmentDescription + ) { + this.departmentDescription = departmentDescription; + } + + public LocalizedString getAddendum() { + return addendum; + } + + public void setAddendum(final LocalizedString addendum) { + this.addendum = addendum; + } + + public Map getAdditionalTexts() { + return Collections.unmodifiableMap(additionalTexts); + } + + protected void putAdditionalText( + final String key, final DepartmentText text + ) { + additionalTexts.put(key, text); + } + + protected void removeAdditionalText(final String key) { + additionalTexts.remove(key); + } + + protected void setAdditionalTexts( + final Map additionalTexts + ) { + this.additionalTexts = new HashMap<>(additionalTexts); + } + + public List getContacts() { + return Collections.unmodifiableList(contacts); + } + + protected void addContact(final Contact contact) { + contacts.add(contact); + } + + protected void removeContact(final Contact contact) { + contacts.remove(contact); + } + + protected void setContacts(final List contacts) { + this.contacts = new ArrayList<>(contacts); + } + + public List getMembers() { + return Collections.unmodifiableList(members); + } + + protected void addMember(final Membership member) { + members.add(member); + } + + protected void removeMember(final Membership member) { + members.remove(member); + } + + protected void setMembers(final List members) { + this.members = new ArrayList<>(members); + } + + public List getProjects() { + return Collections.unmodifiableList(projects); + } + + protected void addProject(final DepartmentProject project) { + projects.add(project); + } + + protected void removeProject(final DepartmentProject project) { + projects.remove(project); + } + + protected void setProjects(final List projects) { + this.projects = new ArrayList<>(projects); + } + + @Override + public int hashCode() { + int hash = 3; + hash = 83 * hash + Objects.hashCode(shortDescription); + hash = 83 * hash + Objects.hashCode(departmentDescription); + hash = 83 * hash + Objects.hashCode(addendum); + hash = 83 * hash + Objects.hashCode(additionalTexts); + hash = 83 * hash + Objects.hashCode(contacts); + hash = 83 * hash + Objects.hashCode(members); + hash = 83 * hash + Objects.hashCode(projects); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof SciDepartment)) { + return false; + } + final SciDepartment other = (SciDepartment) obj; + if (!other.canEqual(this)) { + return false; + } + + if (!Objects.equals(shortDescription, other.getShortDescription())) { + return false; + } + if (!Objects.equals( + departmentDescription, + other.getDepartmentDescription() + )) { + return false; + } + if (!Objects.equals(addendum, other.getAddendum())) { + return false; + } + if (!Objects.equals(additionalTexts, other.getAdditionalTexts())) { + return false; + } + if (!Objects.equals(contacts, other.getContacts())) { + return false; + } + if (!Objects.equals(members, other.getMembers())) { + return false; + } + return Objects.equals(projects, other.getProjects()); + } + + @Override + public boolean canEqual(final Object obj) { + return obj instanceof SciDepartment; + } + + @Override + public String toString(final String data) { + return super.toString( + String.format( + "shortDescription = %s, " + + "departmentDescription = %s, " + + "addendum = %s, " + + "additionalTexts = %s, " + + "contacts = %s, " + + "members = %s, " + + "projects = %s%s", + Objects.toString(shortDescription), + Objects.toString(departmentDescription), + Objects.toString(addendum), + Objects.toString(additionalTexts), + Objects.toString(contacts), + Objects.toString(members), + Objects.toString(projects), + data + ) + ); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentConfig.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentConfig.java new file mode 100644 index 0000000..4ecc976 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentConfig.java @@ -0,0 +1,63 @@ +package org.scientificcms.contenttypes.scidepartment; + +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.configuration.Configuration; +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.configuration.Setting; + +/** + * + * @author Jens Pelzetter + */ +@Configuration +public class SciDepartmentConfig { + + @Setting + private String contactTypesBundleName + = "org.scientificcms.contenttypes.scidepartment.DefaultContactTypes"; + + @Setting + private String memberRolesBundleName + = "org.scientificcms.contenttypes.scidepartment.DefaultMemberRoles"; + + @Setting + private String textKeysBundleName + = "org.scientificcms.contenttypes.scidepartment.DefaultTextKeys"; + + public static SciDepartmentConfig getConfig() { + final ConfigurationManager confManager = CdiUtil + .createCdiUtil() + .findBean(ConfigurationManager.class); + return confManager.findConfiguration(SciDepartmentConfig.class); + } + + public SciDepartmentConfig() { + super(); + } + + public String getContactTypesBundleName() { + return contactTypesBundleName; + } + + public void setContactTypesBundleName(final String contactTypesBundleName) { + this.contactTypesBundleName = contactTypesBundleName; + } + + public String getMemberRolesBundleName() { + return memberRolesBundleName; + } + + public void setMemberRolesBundleName(final String memberRolesBundleName) { + this.memberRolesBundleName = memberRolesBundleName; + } + + public String getTextKeysBundleName() { + return textKeysBundleName; + } + + public void setTextKeysBundleName(final String textKeysBundleName) { + this.textKeysBundleName = textKeysBundleName; + } + + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentConstants.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentConstants.java new file mode 100644 index 0000000..86678b9 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentConstants.java @@ -0,0 +1,18 @@ +package org.scientificcms.contenttypes.scidepartment; + +/** + * + * @author Jens Pelzetter + */ +public final class SciDepartmentConstants { + + public static final String DB_SCHEMA = "SCI_TYPES_DEPARTMENT"; + + public static final String SCI_PROJECT_BUNDLE + = "org.scientificcms.contenttypes.SciDepartmentResources"; + + private SciDepartmentConstants() { + // Nothing + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentIdResolver.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentIdResolver.java new file mode 100644 index 0000000..74eb517 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentIdResolver.java @@ -0,0 +1,57 @@ +package org.scientificcms.contenttypes.scidepartment; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; +import org.librecms.contentsection.ContentItemRepository; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class SciDepartmentIdResolver implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(ContentItemRepository.class) + .findByUuid(id.key.toString(), SciDepartment.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No SciDepartment with UUID %s found in the datbase.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new SciDepartmentIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof SciDepartmentIdResolver; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentImExporter.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentImExporter.java new file mode 100644 index 0000000..ceb6502 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentImExporter.java @@ -0,0 +1,22 @@ +package org.scientificcms.contenttypes.scidepartment; + +import org.libreccm.imexport.Processes; +import org.librecms.contentsection.AbstractContentItemImExporter; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Processes(SciDepartment.class) +public class SciDepartmentImExporter + extends AbstractContentItemImExporter{ + + @Override + public Class getEntityClass() { + return SciDepartment.class; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentManager.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentManager.java new file mode 100644 index 0000000..d5c7617 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentManager.java @@ -0,0 +1,293 @@ +package org.scientificcms.contenttypes.scidepartment; + +import org.libreccm.l10n.LocalizedString; +import org.librecms.assets.ContactableEntity; +import org.librecms.assets.Person; +import org.librecms.contentsection.ContentItemRepository; +import org.scientificcms.contenttypes.sciproject.SciProject; + +import java.io.Serializable; +import java.util.Objects; +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class SciDepartmentManager implements Serializable { + + private static final long serialVersionUID = 1L; + + @Inject + private ContactRepository contactRepo; + + @Inject + private ContentItemRepository itemRepo; + + @Inject + private DepartmentProjectRepository departmentProjectRepo; + + @Inject + private DepartmentTextRepository departmentTextRepo; + + @Inject + private MembershipRepository membershipRepo; + + @Transactional(Transactional.TxType.REQUIRED) + public void addText( + final LocalizedString text, + final SciDepartment toDepartment, + final String withKey + ) { + Objects.requireNonNull( + toDepartment, + "Can't add a text to department null" + ); + Objects.requireNonNull(text, "Can't add null as text."); + Objects.requireNonNull( + withKey, + "Can't add a text to a department with key null." + ); + if (withKey.isBlank()) { + throw new IllegalArgumentException( + "Can't add a text to a department using a blank key." + ); + } + + final DepartmentText departmentText = new DepartmentText(); + departmentText.setDepartment(toDepartment); + departmentText.setKey(withKey); + departmentText.setOrder(toDepartment.getAdditionalTexts().size()); + departmentText.setText(text); + + toDepartment.putAdditionalText(withKey, departmentText); + departmentTextRepo.save(departmentText); + itemRepo.save(toDepartment); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void removeText( + final SciDepartment fromDepartment, + final String withKey + ) { + Objects.requireNonNull( + fromDepartment, + "Can't remove a text from department null." + ); + + if (fromDepartment.getAdditionalTexts().containsKey(withKey)) { + final DepartmentText removed = fromDepartment + .getAdditionalTexts() + .get(withKey); + fromDepartment.removeAdditionalText(withKey); + itemRepo.save(fromDepartment); + departmentTextRepo.delete(removed); + } + } + + @Transactional(Transactional.TxType.REQUIRED) + public void addContact( + final ContactableEntity contactable, + final SciDepartment toDepartment, + final String withType + ) { + Objects.requireNonNull( + contactable, + "Can't add null as Contact to a SciDepartment." + ); + Objects.requireNonNull( + toDepartment, + "Can't add a Contact to a department null." + ); + + final Contact contact = new Contact(); + contact.setContactable(contactable); + contact.setDepartment(toDepartment); + contact.setContactType(withType); + contact.setOrder(toDepartment.getContacts().size()); + + toDepartment.addContact(contact); + contactRepo.save(contact); + itemRepo.save(toDepartment); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void removeContact( + final ContactableEntity contactable, + final SciDepartment fromDepartment + ) { + Objects.requireNonNull( + contactable, + "Can't remove null as Contact from a SciDepartment." + ); + Objects.requireNonNull( + fromDepartment, + "Can't remove a Contact from department null." + ); + + final Optional result = fromDepartment + .getContacts() + .stream() + .filter( + contact -> filterContact(contact, contactable, fromDepartment) + ) + .findFirst(); + + if (result.isPresent()) { + final Contact removed = result.get(); + fromDepartment.removeContact(removed); + itemRepo.save(fromDepartment); + contactRepo.delete(removed); + } + } + + @Transactional(Transactional.TxType.REQUIRED) + public void addMember( + final Person person, + final SciDepartment toDepartment, + final String withRole, + final MembershipStatus withStatus + ) { + Objects.requireNonNull( + person, + "Can't add null as a member null to a SciDepartment." + ); + Objects.requireNonNull( + toDepartment, + "Can't a member to a SciDepartment null." + ); + + final Membership membership = new Membership(); + membership.setDepartment(toDepartment); + membership.setMember(person); + membership.setRole(withRole); + membership.setStatus(withStatus); + + toDepartment.addMember(membership); + membershipRepo.save(membership); + itemRepo.save(toDepartment); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void removeMember( + final Person person, + final SciDepartment fromDepartment + ) { + Objects.requireNonNull( + person, + "Can't remove null as a member from a SciDepartment." + ); + Objects.requireNonNull( + fromDepartment, + "Can't remove a member from a SciDepartment null." + ); + + final Optional result = fromDepartment + .getMembers() + .stream() + .filter( + membership -> filterMembership( + membership, + person, + fromDepartment + ) + ) + .findFirst(); + + if (result.isPresent()) { + final Membership removed = result.get(); + fromDepartment.removeMember(removed); + itemRepo.save(fromDepartment); + membershipRepo.delete(removed); + } + } + + @Transactional(Transactional.TxType.REQUIRED) + public void addProject( + final SciProject project, + final SciDepartment toDepartment + ) { + Objects.requireNonNull( + project, + "Can't add null as a project null to a SciDepartment." + ); + Objects.requireNonNull( + toDepartment, + "Can't a project to a SciDepartment null." + ); + + final DepartmentProject departmentProject =new DepartmentProject(); + departmentProject.setDepartment(toDepartment); + departmentProject.setProject(project); + + toDepartment.addProject(departmentProject); + departmentProjectRepo.save(departmentProject); + itemRepo.save(project); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void removeProject( + final SciProject project, + final SciDepartment fromDepartment + ) { + Objects.requireNonNull( + project, + "Can't remove null as a project from a SciDepartment." + ); + Objects.requireNonNull( + fromDepartment, + "Can't remove a project from a SciDepartment null." + ); + + final Optional result = fromDepartment + .getProjects() + .stream() + .filter( + departmentProject -> filterDepartmentProject( + departmentProject, project, fromDepartment + ) + ) + .findFirst(); + + if (result.isPresent()) { + final DepartmentProject removed = result.get(); + fromDepartment.removeProject(removed); + itemRepo.save(fromDepartment); + departmentProjectRepo.delete(removed); + } + } + + private boolean filterContact( + final Contact contact, + final ContactableEntity byContactable, + final SciDepartment byDepartment + ) { + return contact.getContactable().equals(byContactable) + && contact.getDepartment().equals(byDepartment); + } + + private boolean filterMembership( + final Membership membership, + final Person byPerson, + final SciDepartment byDepartment + ) { + return membership.getMember().equals(byPerson) + && membership.getDepartment().equals(byDepartment); + } + + private boolean filterDepartmentProject( + final DepartmentProject departmentProject, + final SciProject byProject, + final SciDepartment byDepartment + + ) { + return departmentProject.getProject().equals(byProject) + && departmentProject.getDepartment().equals(byDepartment); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentModule.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentModule.java new file mode 100644 index 0000000..2ba9218 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/SciDepartmentModule.java @@ -0,0 +1,46 @@ +package org.scientificcms.contenttypes.scidepartment; + +import org.libreccm.modules.CcmModule; +import org.libreccm.modules.InitEvent; +import org.libreccm.modules.InstallEvent; +import org.libreccm.modules.RequiredModule; +import org.libreccm.modules.ShutdownEvent; +import org.libreccm.modules.UnInstallEvent; +import org.librecms.contenttypes.ContentTypes; + +/** + * + * @author Jens Pelzetter + */ +@org.libreccm.modules.Module( + requiredModules = { + @RequiredModule(module = org.libreccm.core.CcmCore.class), + @RequiredModule(module = org.librecms.Cms.class) + } +) +@ContentTypes({ + SciDepartment.class +}) +public class SciDepartmentModule implements CcmModule { + + @Override + public void install(final InstallEvent event) { + //ToDo Create initial data for the module if neccessary + } + + @Override + public void init(final InitEvent event) { + //ToDo Add initialisation logic necessary for your module + } + + @Override + public void shutdown(final ShutdownEvent event) { + //ToDo Add shutdown logic if necessary + } + + @Override + public void uninstall(final UnInstallEvent event) { + //ToDo Remove module data + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentAuthoringSteps.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentAuthoringSteps.java new file mode 100644 index 0000000..ac0d773 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentAuthoringSteps.java @@ -0,0 +1,36 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.librecms.ui.contentsections.documents.MvcAuthoringSteps; + +import java.util.Set; + +import javax.enterprise.context.ApplicationScoped; + +/** + * + * @author Jens Pelzetter + */ +@ApplicationScoped +public class SciDepartmentAuthoringSteps implements MvcAuthoringSteps { + + @Override + public Set> getClasses() { + return Set.of( + SciDepartmentPropertiesStep.class, + SciDepartmentDescriptionStep.class + ); + } + + @Override + public Set> getResourceClasses() { + return Set.of( + SciDepartmentDescriptionContacts.class, + SciDepartmentDescriptionStepResources.class, + SciDepartmentDescriptionStepService.class, + SciDepartmentTextsResources.class + ); + } + + + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContact.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContact.java new file mode 100644 index 0000000..efc22e8 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContact.java @@ -0,0 +1,67 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +/** + * DTO providing the information about a {@link Contact} of a + * {@link SciDepartment} in a form that is easy to use from a MVC template. + * + * @author Jens Pelzetter + */ +public class SciDepartmentContact { + + /** + * The ID of the {@link Contact} represented by this object. + */ + private long contactId; + + /** + * The type of the contact. + * + * @see Contact#contactType + */ + private String contactType; + + /** + * Order of contact. + */ + private long order; + + /** + * The title of the {@link ContactableEntity} + * + * @see Contact#contactable + */ + private String contactable; + + public long getContactId() { + return contactId; + } + + public void setContactId(final long contactId) { + this.contactId = contactId; + } + + public String getContactType() { + return contactType; + } + + public void setContactType(final String contactType) { + this.contactType = contactType; + } + + public long getOrder() { + return order; + } + + public void setOrder(final long order) { + this.order = order; + } + + public String getContactable() { + return contactable; + } + + public void setContactable(final String contactable) { + this.contactable = contactable; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContactModel.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContactModel.java new file mode 100644 index 0000000..92c9d51 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContactModel.java @@ -0,0 +1,67 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +/** + * DTO providing the information about a {@link Contact} of a + * {@link SciDepartment} in a form that is easy usable from a MVC template. + * + * @author Jens Pelzetter + */ +public class SciDepartmentContactModel { + + /** + * The ID of the {@link Contact} represented by this object. + */ + private long contactId; + + /** + * The type of the contact. + * + * @see Contact#contactType + */ + private String contactType; + + /** + * Order of contact. + */ + private long order; + + /** + * The title of the {@link ContactableEntity} + * + * @see Contact#contactable + */ + private String contactable; + + public long getContactId() { + return contactId; + } + + public void setContactId(final long contactId) { + this.contactId = contactId; + } + + public String getContactType() { + return contactType; + } + + public void setContactType(final String contactType) { + this.contactType = contactType; + } + + public long getOrder() { + return order; + } + + public void setOrder(final long order) { + this.order = order; + } + + public String getContactable() { + return contactable; + } + + public void setContactable(final String contactable) { + this.contactable = contactable; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContactTypes.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContactTypes.java new file mode 100644 index 0000000..2d0b312 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentContactTypes.java @@ -0,0 +1,29 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.ui.AbstractMessagesBean; +import org.scientificcms.contenttypes.scidepartment.SciDepartmentConfig; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentContactTypes") +public class SciDepartmentContactTypes extends AbstractMessagesBean { + + @Inject + private ConfigurationManager confManager; + + @Override + protected String getMessageBundle() { + return confManager + .findConfiguration(SciDepartmentConfig.class) + .getContactTypesBundleName(); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentCreateStep.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentCreateStep.java new file mode 100644 index 0000000..287e8a2 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentCreateStep.java @@ -0,0 +1,266 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.l10n.LocalizedString; +import org.libreccm.workflow.Workflow; +import org.librecms.contentsection.ContentItemManager; +import org.librecms.contentsection.ContentItemRepository; +import org.librecms.ui.contentsections.documents.AbstractMvcDocumentCreateStep; +import org.scientificcms.contenttypes.scidepartment.SciDepartment; + +import java.util.Locale; +import java.util.Map; +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.transaction.Transactional; + +/** + * Create step for a {@link SciDepartment}. + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentCreateStep") +public class SciDepartmentCreateStep + extends AbstractMvcDocumentCreateStep { + + private static final String FORM_PARAM_NAME = "name"; + + private static final String FORM_PARAM_TITLE = "title"; + + private static final String FORM_PARAM_SHORT_DESCRIPTION = "shortdesc"; + + private static final String FORM_PARAM_INITIAL_LOCALE = "locale"; + + private static final String FORM_PARAM_SELECTED_WORKFLOW = "workflow"; + + /** + * Provides functions for working with content items. + */ + @Inject + private ContentItemManager itemManager; + + /** + * Used to save the event. + */ + @Inject + private ContentItemRepository itemRepo; + + /** + * Provides functions for working with {@link LocalizedString}s. + */ + @Inject + private GlobalizationHelper globalizationHelper; + + /** + * Nmae of the department. + */ + private String name; + + /** + * Title of the department. + */ + private String title; + + /** + * The short description of the department. + */ + private String shortDescription; + + /** + * The initial locale of the department. + */ + private String initialLocale; + + /** + * The workflow to use for the new department. + */ + private String selectedWorkflow; + + @Override + public String getDocumentType() { + return SciDepartment.class.getName(); + } + + @Override + public String getDescription() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("createstep.description"); + } + + @Override + public String getBundle() { + return SciDepartmentStepsConstants.BUNDLE; + } + + public String getName() { + return name; + } + + public String getTitle() { + return title; + } + + public String getShortDescription() { + return shortDescription; + } + + public String getInitialLocale() { + return initialLocale; + } + + @Transactional(Transactional.TxType.REQUIRED) + public String getSelectedWorkflow() { + if (selectedWorkflow == null || selectedWorkflow.isEmpty()) { + return getContentSection() + .getContentTypes() + .stream() + .filter( + type -> type.getContentItemClass().equals( + SciDepartment.class.getName() + ) + ) + .findAny() + .map(type -> type.getDefaultWorkflow()) + .map( + workflow -> globalizationHelper.getValueFromLocalizedString( + workflow.getName() + ) + ) + .orElse(""); + } else { + return selectedWorkflow; + } + } + + @Override + public String showCreateStep() { + return "org/scientificcms/contenttypes/scidepartment/ui/create-scidepartment.xhtml"; + } + + @Override + public String createItem(final Map formParams) { + if (!formParams.containsKey(FORM_PARAM_NAME) + || formParams.get(FORM_PARAM_NAME) == null + || formParams.get(FORM_PARAM_NAME).length == 0) { + addMessage( + "danger", + globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("createstep.name.error.missing") + ); + return showCreateStep(); + } + + name = formParams.get(FORM_PARAM_NAME)[0]; + if (!name.matches("^([a-zA-Z0-9_-]*)$")) { + addMessage( + "danger", + globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("createstep.name.error.invalid") + ); + return showCreateStep(); + } + + if (!formParams.containsKey(FORM_PARAM_TITLE) + || formParams.get(FORM_PARAM_TITLE) == null + || formParams.get(FORM_PARAM_TITLE).length == 0) { + addMessage( + "danger", + globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("createstep.title.error.missing") + ); + return showCreateStep(); + } + title = formParams.get(FORM_PARAM_TITLE)[0]; + + if (!formParams.containsKey(FORM_PARAM_SHORT_DESCRIPTION) + || formParams.get(FORM_PARAM_SHORT_DESCRIPTION) == null + || formParams.get(FORM_PARAM_SHORT_DESCRIPTION).length == 0) { + addMessage( + "danger", + globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("createstep.summary.error.missing") + ); + return showCreateStep(); + } + shortDescription = formParams.get(FORM_PARAM_SHORT_DESCRIPTION)[0]; + + if (!formParams.containsKey(FORM_PARAM_INITIAL_LOCALE) + || formParams.get(FORM_PARAM_INITIAL_LOCALE) == null + || formParams.get(FORM_PARAM_INITIAL_LOCALE).length == 0) { + addMessage( + "danger", + globalizationHelper.getLocalizedTextsUtil( + getBundle() + ).getText("createstep.initial_locale.error.missing") + ); + return showCreateStep(); + } + final Locale locale = new Locale( + formParams.get(FORM_PARAM_INITIAL_LOCALE)[0] + ); + + if (!formParams.containsKey(FORM_PARAM_SELECTED_WORKFLOW) + || formParams.get(FORM_PARAM_SELECTED_WORKFLOW) == null + || formParams.get(FORM_PARAM_SELECTED_WORKFLOW).length == 0) { + addMessage( + "danger", + globalizationHelper.getLocalizedTextsUtil( + getBundle() + ).getText("createstep.workflow.none_selected") + ); + return showCreateStep(); + } + + selectedWorkflow = formParams.get(FORM_PARAM_SELECTED_WORKFLOW)[0]; + + final Optional workflowResult = getContentSection() + .getWorkflowTemplates() + .stream() + .filter(template -> template.getUuid().equals(selectedWorkflow)) + .findAny(); + + if (!workflowResult.isPresent()) { + addMessage( + "danger", + globalizationHelper.getLocalizedTextsUtil( + getBundle() + ).getText("createstep.workflow.error.not_available") + ); + return showCreateStep(); + } + + if (!getMessages().isEmpty()) { + return showCreateStep(); + } + + final SciDepartment department = itemManager.createContentItem( + name, + getContentSection(), + getFolder(), + workflowResult.get(), + SciDepartment.class, + locale + ); + + department.getTitle().putValue(locale, title); + department.getShortDescription().putValue(locale, shortDescription); + itemRepo.save(department); + + return String.format( + "redirect:%s/documents/%s/%s/@scidepartment-basicproperties", + getContentSectionLabel(), + getFolderPath(), + name + ); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionContacts.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionContacts.java new file mode 100644 index 0000000..a0887d5 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionContacts.java @@ -0,0 +1,101 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentItemRepository; +import org.librecms.contentsection.ContentSection; +import org.librecms.ui.contentsections.ContentSectionsUi; +import org.librecms.ui.contentsections.documents.MvcAuthoringSteps; +import org.scientificcms.contenttypes.scidepartment.Contact; +import org.scientificcms.contenttypes.scidepartment.ContactRepository; +import org.scientificcms.contenttypes.scidepartment.SciDepartment; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; +import javax.ws.rs.Consumes; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAuthoringSteps.PATH_PREFIX + "scidepartment-description-contacts") +public class SciDepartmentDescriptionContacts { + + @Inject + private ContactRepository contactRepo; + + @Inject + private ContentItemRepository itemRepo; + + @Inject + private ContentSectionsUi sectionsUi; + + @POST + @Path("/save-order") + @Consumes(MediaType.APPLICATION_JSON) + @Transactional(Transactional.TxType.REQUIRED) + public Response saveOrder( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + final List order + ) { + final ContentSection contentSection = sectionsUi + .findContentSection(sectionIdentifier) + .orElseThrow( + () -> new NotFoundException( + String.format( + "No content identifed by %s found.", + sectionIdentifier + ) + ) + ); + + final ContentItem document = itemRepo + .findByPath(contentSection, documentPath) + .orElseThrow( + () -> new NotFoundException( + String.format( + "No document for path %s in section %s.", + documentPath, + contentSection.getLabel() + ) + ) + ); + + if (!(document instanceof SciDepartment)) { + throw new NotFoundException( + String.format( + "No SciDepartment for path %s in section %s.", + documentPath, + contentSection.getLabel() + ) + ); + } + + final Map orderMap = new HashMap<>(); + for (int i = 0; i < order.size(); i++) { + orderMap.put(Long.parseLong(order.get(i)), (long) i); + } + + final SciDepartment department = (SciDepartment)document; + for (final Contact contact : department.getContacts()) { + contact.setOrder(orderMap.get(contact.getContactId())); + contactRepo.save(contact); + } + + return Response.ok().build(); + } +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionContactsModel.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionContactsModel.java new file mode 100644 index 0000000..c48c68c --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionContactsModel.java @@ -0,0 +1,57 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.librecms.assets.Organization; +import org.librecms.assets.Person; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentDescriptionContacts") +public class SciDepartmentDescriptionContactsModel { + + private boolean canEdit; + + private List contacts; + + private String baseUrl; + + public boolean getCanEdit() { + return canEdit; + } + + protected void setCanEdit(final boolean canEdit) { + this.canEdit = canEdit; + } + + public List getContacts() { + return Collections.unmodifiableList(contacts); + } + + protected void setContacts(final List contacts) { + this.contacts = new ArrayList<>(contacts); + } + + public String getContactableTypes() { + return String.join( + ",", Person.class.getName(), Organization.class.getName() + ); + } + + public String getBaseUrl() { + return baseUrl; + } + + protected void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionMembersModel.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionMembersModel.java new file mode 100644 index 0000000..62fb18a --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionMembersModel.java @@ -0,0 +1,66 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.librecms.assets.Person; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentDescriptionMembers") +public class SciDepartmentDescriptionMembersModel { + + private boolean canEdit; + + private List members; + + private Map statusValues; + + private String baseUrl; + + public String getMemberType() { + return Person.class.getName(); + } + + public boolean getCanEdit() { + return canEdit; + } + + protected void setCanEdit(final boolean canEdit) { + this.canEdit = canEdit; + } + + public List getMembers() { + return Collections.unmodifiableList(members); + } + + protected void setMembers(final List members) { + this.members = new ArrayList<>(members); + } + + public Map getStatusValues() { + return Collections.unmodifiableMap(statusValues); + } + + protected void setStatusValues(final Map statusValues) { + this.statusValues = new LinkedHashMap<>(statusValues); + } + + public String getBaseUrl() { + return baseUrl; + } + + protected void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionModel.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionModel.java new file mode 100644 index 0000000..240206b --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionModel.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2022 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.librecms.ui.contentsections.documents.CmsEditorLocaleVariantRow; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentDescriptionModel") +public class SciDepartmentDescriptionModel { + + private boolean canEdit; + + private Map descriptionValues; + + private List variants; + + private List unusedLocales; + + private String selectedLocale; + + public Map getDescriptionValues() { + return Optional + .ofNullable(descriptionValues) + .map(Collections::unmodifiableMap) + .orElse(Collections.emptyMap()); + } + + protected void setDescriptionValues( + final Map descriptionValues + ) { + this.descriptionValues = Optional + .ofNullable(descriptionValues) + .map(values -> new HashMap<>(values)) + .map(values -> (Map) values) + .orElse(Collections.emptyMap()); + } + + public List getVariants() { + return Optional + .ofNullable(variants) + .map(Collections::unmodifiableList) + .orElse(Collections.emptyList()); + } + + protected void setVariants(final List variants) { + this.variants = Optional + .ofNullable(variants) + .map(list -> new ArrayList<>(list)) + .map(list -> (List) list) + .orElse(Collections.emptyList()); + } + + public List getUnusedLocales() { + return Optional + .ofNullable(unusedLocales) + .map(Collections::unmodifiableList) + .orElse(Collections.emptyList()); + } + + protected void setUnusedLocales(final List unusedLocales) { + this.unusedLocales = Optional + .ofNullable(unusedLocales) + .map(list -> new ArrayList<>(list)) + .map(list -> (List) list) + .orElse(Collections.emptyList()); + } + + public String getSelectedLocale() { + return selectedLocale; + } + + protected void setSelectedLocale(final String selectedLocale) { + this.selectedLocale = selectedLocale; + } + + public boolean getCanEdit() { + return canEdit; + } + + protected void setCanEdit(final boolean canEdit) { + this.canEdit = canEdit; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStep.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStep.java new file mode 100644 index 0000000..e3e569a --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStep.java @@ -0,0 +1,1229 @@ +/* + * Copyright (C) 2022 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.scientificcms.contenttypes.scidepartment.ui; + +import com.arsdigita.kernel.KernelConfig; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.l10n.LocalizedString; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.ui.BaseUrl; +import org.librecms.assets.ContactableEntity; +import org.librecms.assets.Person; +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.AssetRepository; +import org.librecms.contentsection.ContentItemRepository; +import org.librecms.ui.contentsections.ContentSectionNotFoundException; +import org.librecms.ui.contentsections.ItemPermissionChecker; +import org.librecms.ui.contentsections.documents.AbstractMvcAuthoringStep; +import org.librecms.ui.contentsections.documents.CmsEditorUtil; +import org.librecms.ui.contentsections.documents.DocumentNotFoundException; +import org.librecms.ui.contentsections.documents.DocumentUi; +import org.librecms.ui.contentsections.documents.MvcAuthoringStepDef; +import org.librecms.ui.contentsections.documents.MvcAuthoringSteps; +import org.scientificcms.contenttypes.scidepartment.Contact; +import org.scientificcms.contenttypes.scidepartment.ContactRepository; +import org.scientificcms.contenttypes.scidepartment.DepartmentText; +import org.scientificcms.contenttypes.scidepartment.DepartmentTextRepository; +import org.scientificcms.contenttypes.scidepartment.Membership; +import org.scientificcms.contenttypes.scidepartment.MembershipRepository; +import org.scientificcms.contenttypes.scidepartment.MembershipStatus; +import org.scientificcms.contenttypes.scidepartment.SciDepartment; +import org.scientificcms.contenttypes.scidepartment.SciDepartmentManager; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.servlet.http.HttpServletRequest; +import javax.transaction.Transactional; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Context; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAuthoringSteps.PATH_PREFIX + "scidepartment-description") +@Controller +@MvcAuthoringStepDef( + bundle = SciDepartmentStepsConstants.BUNDLE, + descriptionKey = "authoringsteps.description.description", + labelKey = "authoringsteps.description.label", + supportedDocumentType = SciDepartment.class +) +public class SciDepartmentDescriptionStep extends AbstractMvcAuthoringStep { + + @Inject + private AssetRepository assetRepo; + + @Inject + private BaseUrl baseUrl; + + @Inject + private ConfigurationManager confManager; + + @Inject + private ContentItemRepository itemRepo; + + @Inject + private ContactRepository contactRepo; + + @Inject + private DepartmentTextRepository departmentTextRepo; + + @Inject + private DocumentUi documentUi; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private IdentifierParser identifierParser; + + @Context + private HttpServletRequest request; + + @Inject + private ItemPermissionChecker itemPermissionChecker; + + @Inject + private MembershipRepository membershipRepo; + + @Inject + private Models models; + + @Inject + private SciDepartmentManager departmentManager; + + @Inject + private SciDepartmentDescriptionModel descriptionModel; + + @Inject + private SciDepartmentDescriptionContactsModel contactsModel; + + @Inject + private SciDepartmentDescriptionMembersModel membersModel; + + @Inject + private SciDepartmentMessageBundle messageBundle; + + @Inject + private SciDepartmentTextsModel textsModel; + + @Inject + private SciDepartmentTexts texts; + + @Override + public Class getStepClass() { + return SciDepartmentDescriptionStep.class; + } + + @GET + @Path("/") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String showStep( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + return "org/scientificcms/contenttypes/scidepartment/ui/scidepartment-description.xhtml"; + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @GET + @Path("/description/view/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String viewDescription( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + descriptionModel.setSelectedLocale( + new Locale(localeParam).toString() + ); + + return "org/scientificcms/contenttypes/scidepartment/ui/description/view.xhtml"; + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/description/add") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String addDescriptionValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final String value; + if (getDepartment().getDepartmentDescription().getAvailableLocales() + .isEmpty()) { + value = ""; + } else { + value = globalizationHelper.getValueFromLocalizedString( + getDepartment().getDepartmentDescription() + ); + } + final Locale locale = new Locale(localeParam); + getDepartment().getDepartmentDescription().putValue(locale, value); + itemRepo.save(getDepartment()); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @GET + @Path("/description/edit/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String editDescriptionValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + descriptionModel.setSelectedLocale( + new Locale(localeParam).toString() + ); + + return "org/scientificcms/contenttypes/scidepartment/ui/description/edit.xhtml"; + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/description/edit/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String editDescriptionValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Locale locale = new Locale(localeParam); + getDepartment().getDepartmentDescription().putValue(locale, value); + itemRepo.save(getDepartment()); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/description/remove/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String removeDescriptionValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Locale locale = new Locale(localeParam); + getDepartment().getDepartmentDescription().removeValue(locale); + itemRepo.save(getDepartment()); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + +// @GET +// @Path("/texts/view/{textKey}") +// @Transactional(Transactional.TxType.REQUIRED) +// @AuthorizationRequired +// public String viewDepartmentText( +// @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) +// final String sectionIdentifier, +// @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) +// final String documentPath, +// @PathParam("textKey") +// final String textKey +// ) { +// try { +// init(); +// } catch (ContentSectionNotFoundException ex) { +// return ex.showErrorMessage(); +// } catch (DocumentNotFoundException ex) { +// return ex.showErrorMessage(); +// } +// +// if (itemPermissionChecker.canEditItem(getDepartment())) { +// textsModel.setSelectedText(textKey); +// +// return "org/scientificcms/contenttypes/scidepartment/ui/texts/view-values.xhtml"; +// } else { +// return documentUi.showAccessDenied( +// getContentSection(), +// getDepartment(), +// messageBundle.getMessage("scidepartment.edit.denied") +// ); +// } +// } + @GET + @Path("/texts/view/{textKey}/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String viewDepartmentText( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("textKey") final String textKey, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + textsModel.setSelectedText(textKey); + textsModel.setSelectedLocale(new Locale(localeParam).toString()); + + return "org/scientificcms/contenttypes/scidepartment/ui/texts/view.xhtml"; + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/texts/add") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String addText( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("textKey") final String textKey + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Locale locale = confManager + .findConfiguration(KernelConfig.class) + .getDefaultLocale(); + final LocalizedString text = new LocalizedString(); + text.putValue(locale, ""); + + departmentManager.addText(text, getDepartment(), textKey); + itemRepo.save(getDepartment()); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/texts/add/{textKey}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String addTextValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("textKey") final String textKey, + @FormParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + if (!getDepartment().getAdditionalTexts().containsKey(textKey)) { + models.put("dpartmentTextNotFound", textKey); + return showStep(sectionIdentifier, documentPath); + } + + final DepartmentText departmentText = getDepartment() + .getAdditionalTexts() + .get(textKey); + + final String value; + if (departmentText.getText().getAvailableLocales().isEmpty()) { + value = ""; + } else { + value = globalizationHelper.getValueFromLocalizedString( + departmentText.getText() + ); + } + final Locale locale = new Locale(localeParam); + departmentText.getText().putValue(locale, value); + departmentTextRepo.save(departmentText); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @GET + @Path("/texts/edit/{textKey}/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String editTextValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("textKey") final String textKey, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + if (!getDepartment().getAdditionalTexts().containsKey(textKey)) { + models.put("dpartmentTextNotFound", textKey); + return showStep(sectionIdentifier, documentPath); + } + + textsModel.setSelectedText(textKey); + textsModel.setSelectedLocale( + new Locale(localeParam).toString() + ); + + return "org/scientificcms/contenttypes/scidepartment/ui/texts/edit.xhtml"; + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/texts/edit/{textKey}/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String editTextValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("textKey") final String textKey, + @PathParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + if (!getDepartment().getAdditionalTexts().containsKey(textKey)) { + models.put("dpartmentTextNotFound", textKey); + return showStep(sectionIdentifier, documentPath); + } + + final DepartmentText departmentText = getDepartment() + .getAdditionalTexts() + .get(textKey); + + final Locale locale = new Locale(localeParam); + departmentText.getText().putValue(locale, value); + departmentTextRepo.save(departmentText); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/texts/remove/{textKey}/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String removeTextValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("textKey") final String textKey, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + if (!getDepartment().getAdditionalTexts().containsKey(textKey)) { + models.put("dpartmentTextNotFound", textKey); + return showStep(sectionIdentifier, documentPath); + } + + final DepartmentText departmentText = getDepartment() + .getAdditionalTexts() + .get(textKey); + + final Locale locale = new Locale(localeParam); + departmentText.getText().removeValue(locale); + departmentTextRepo.save(departmentText); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/texts/remove/{textKey}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String removeText( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("textKey") final String textKey + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + if (!getDepartment().getAdditionalTexts().containsKey(textKey)) { + models.put("dpartmentTextNotFound", textKey); + return showStep(sectionIdentifier, documentPath); + } + + departmentManager.removeText(getDepartment(), textKey); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/contacts/add") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String addContact( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("contactableUuid") + final String contactableUuid, + @FormParam("type") + final String type + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Optional result; + final Identifier identifier = identifierParser.parseIdentifier( + contactableUuid + ); + switch (identifier.getType()) { + case ID: + result = assetRepo.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = assetRepo.findByUuid( + identifier.getIdentifier() + ); + break; + default: + models.put("contactableNotFound", contactableUuid); + return showStep(sectionIdentifier, documentPath); + } + + if (!result.isPresent() + || !(result.get() instanceof ContactableEntity)) { + models.put("contactableNotFound", contactableUuid); + return showStep(sectionIdentifier, documentPath); + } + + final ContactableEntity contactable = (ContactableEntity) result + .get(); + departmentManager.addContact(contactable, getDepartment(), type); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/contacts/edit/{contactId}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String editContact( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("contactId") + final String contactId, + @FormParam("type") + final String type + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Optional result = getDepartment() + .getContacts() + .stream() + .filter( + contact -> Long + .toString(contact.getContactId()) + .equals(contactId) + ) + .findFirst(); + + if (!result.isPresent()) { + models.put("contactNotFound", contactId); + return showStep(sectionIdentifier, documentPath); + } + + final Contact contact = result.get(); + contact.setContactType(type); + contactRepo.save(contact); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/contacts/{contactId}/remove") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String removeContact( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("contactId") + final String contactId + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Optional result = getDepartment() + .getContacts() + .stream() + .filter( + contact -> Long + .toString(contact.getContactId()) + .equals(contactId) + ) + .findFirst(); + + if (result.isPresent()) { + departmentManager.removeContact( + result.get().getContactable(), + getDepartment() + ); + } + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/members/add") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String addMembership( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("personUuid") + final String personUuid, + @FormParam("role") + final String role, + @FormParam("status") + final String statusParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Optional result; + final Identifier personIdentifier = identifierParser + .parseIdentifier(personUuid); + switch (personIdentifier.getType()) { + case ID: + result = assetRepo.findById( + Long.parseLong(personIdentifier.getIdentifier()), + Person.class + ); + break; + case UUID: + result = assetRepo + .findByUuidAndType( + personIdentifier.getIdentifier(), + Person.class + ); + break; + default: + models.put("personNotFound", personUuid); + return showStep(sectionIdentifier, documentPath); + + } + + if (!result.isPresent()) { + models.put("personNotFound", personUuid); + return showStep(sectionIdentifier, documentPath); + } + + final Person person = result.get(); + final MembershipStatus status; + try { + status = MembershipStatus.valueOf(statusParam); + } catch (IllegalArgumentException ex) { + models.put("illegalStatusValue", statusParam); + return showStep(sectionIdentifier, documentPath); + } + + departmentManager.addMember(person, getDepartment(), role, status); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/members/edit/{membershipId}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String editMembership( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("membershipId") + final String membershipId, + @FormParam("role") + final String role, + @FormParam("status") + final String statusParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Optional result = getDepartment() + .getMembers() + .stream() + .filter( + member -> Long + .toString(member.getMembershipId()) + .equals(membershipId) + ) + .findFirst(); + + if (!result.isPresent()) { + models.put("membershipNotFound", membershipId); + return showStep(sectionIdentifier, documentPath); + } + + final Membership membership = result.get(); + membership.setRole(role); + membership.setStatus(MembershipStatus.valueOf(statusParam)); + membershipRepo.save(membership); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @POST + @Path("/members/remove/{membershipId}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String removeMembership( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("membershipId") + final String membershipId + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDepartment())) { + final Optional result = getDepartment() + .getMembers() + .stream() + .filter( + member -> Long + .toString(member.getMembershipId()) + .equals(membershipId) + ) + .findFirst(); + + if (result.isPresent()) { + departmentManager.removeMember( + result.get().getMember(), + getDepartment() + ); + } + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDepartment(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + @Override + public void init() throws ContentSectionNotFoundException, + DocumentNotFoundException { + super.init(); + + final boolean canEdit = itemPermissionChecker.canEditItem( + getDepartment() + ); + if (canEdit) { + descriptionModel.setCanEdit(canEdit); + descriptionModel.setDescriptionValues( + getDepartment() + .getDepartmentDescription() + .getValues() + .entrySet() + .stream() + .collect( + Collectors.toMap( + entry -> entry.getKey().toString(), + Map.Entry::getValue + ) + ) + ); + descriptionModel.setVariants( + getDepartment() + .getDepartmentDescription() + .getValues() + .entrySet() + .stream() + .map(CmsEditorUtil::buildVariantRow) + .collect(Collectors.toList()) + ); + final Set descriptionLocales = getDepartment() + .getDepartmentDescription() + .getAvailableLocales(); + descriptionModel.setUnusedLocales( + globalizationHelper + .getAvailableLocales() + .stream() + .filter(locale -> !descriptionLocales.contains(locale)) + .map(Locale::toString) + .collect(Collectors.toList()) + ); + + textsModel.setCanEdit(canEdit); + textsModel.setTexts( + getDepartment() + .getAdditionalTexts() + .entrySet() + .stream() + .collect( + Collectors.toMap( + entry -> entry.getKey(), + entry -> buildTextModel(entry.getValue()) + ) + ) + ); + textsModel.setAvailableTextKeys( + texts + .entrySet() + .stream() + .filter(entry -> !textsModel.getTexts().containsKey(entry + .getKey())) + .collect( + Collectors.toMap( + entry -> entry.getKey(), + entry -> entry.getValue() + ) + ) + ); + + contactsModel.setCanEdit(canEdit); + contactsModel.setContacts( + getDepartment() + .getContacts() + .stream() + .map(this::buildContactModel) + .collect(Collectors.toList()) + ); + contactsModel.setBaseUrl(baseUrl.getBaseUrl(request)); + + membersModel.setCanEdit(canEdit); + membersModel.setMembers( + getDepartment() + .getMembers() + .stream() + .map(this::buildMembershipModel) + .collect(Collectors.toList()) + ); + membersModel.setStatusValues( + Arrays + .stream(MembershipStatus.values()) + .collect( + Collectors.toMap( + status -> status.toString(), + status -> messageBundle.getMessage( + String.format( + "members.status.%s", + status.toString().toLowerCase() + ) + ), + (value1, value2) -> value1, + LinkedHashMap::new + ) + ) + ); + membersModel.setBaseUrl(baseUrl.getBaseUrl(request)); + } + } + + private SciDepartment getDepartment() { + return (SciDepartment) getDocument(); + } + + private SciDepartmentContactModel buildContactModel(final Contact contact) { + final SciDepartmentContactModel model = new SciDepartmentContactModel(); + model.setContactId(contact.getContactId()); + model.setContactType(contact.getContactType()); + model.setContactable( + contact.getContactable().getTitle().getValue( + globalizationHelper.getNegotiatedLocale() + ) + ); + model.setOrder(contact.getOrder()); + + return model; + } + + private SciDepartmentMembershipModel buildMembershipModel( + final Membership membership + ) { + final SciDepartmentMembershipModel model + = new SciDepartmentMembershipModel(); + model.setGivenName( + membership.getMember().getPersonName().getGivenName() + ); + model.setMembershipId(membership.getMembershipId()); + model.setPrefix( + membership.getMember().getPersonName().getPrefix() + ); + model.setRole(membership.getRole()); + model.setStatus( + Optional + .ofNullable(membership.getStatus()) + .map(status -> status.toString()) + .map(String::toLowerCase) + .map(status -> String.format("members.status.%s", status)) + .map(status -> messageBundle.get(status)) + .orElse("") + ); + model.setSuffix( + membership.getMember().getPersonName().getSuffix() + ); + model.setSurname( + membership.getMember().getPersonName().getSurname() + ); + + return model; + } + + private SciDepartmentTextModel buildTextModel(final DepartmentText text) { + final SciDepartmentTextModel model = new SciDepartmentTextModel(); + model.setKey(text.getKey()); + model.setTextValues( + text + .getText() + .getValues() + .entrySet() + .stream() + .collect( + Collectors.toMap( + entry -> entry.getKey().toString(), + entry -> entry.getValue() + ) + ) + ); + model.setUnusedLocales( + globalizationHelper + .getAvailableLocales() + .stream() + .filter( + locale -> !text.getText().getAvailableLocales().contains( + locale + ) + ) + .map(Locale::toString) + .collect(Collectors.toList()) + ); + model.setVariants( + text + .getText() + .getValues() + .entrySet() + .stream() + .map(CmsEditorUtil::buildVariantRow) + .collect(Collectors.toList()) + ); + + return model; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStepResources.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStepResources.java new file mode 100644 index 0000000..383b41d --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStepResources.java @@ -0,0 +1,123 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentItemRepository; +import org.librecms.contentsection.ContentSection; +import org.librecms.ui.contentsections.ContentSectionsUi; +import org.librecms.ui.contentsections.ItemPermissionChecker; +import org.librecms.ui.contentsections.documents.MvcAuthoringSteps; +import org.scientificcms.contenttypes.scidepartment.SciDepartment; + +import java.util.Locale; +import java.util.StringTokenizer; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; +import javax.ws.rs.ForbiddenException; +import javax.ws.rs.GET; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAuthoringSteps.PATH_PREFIX + "scidepartment-description-resources") +public class SciDepartmentDescriptionStepResources { + + @Inject + private ContentItemRepository itemRepo; + + @Inject + private ContentSectionsUi sectionsUi; + + @Inject + private ItemPermissionChecker itemPermissionChecker; + + @GET + @Path("/department-description/wordcount/{locale}") + @Produces(MediaType.TEXT_HTML) + @Transactional(Transactional.TxType.REQUIRED) + public String getDepartmentDescriptionWordCount( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPathParam, + @PathParam("locale") final String localeParam + ) { + final ContentSection contentSection = sectionsUi + .findContentSection(sectionIdentifier) + .orElseThrow( + () -> new NotFoundException() + ); + + final ContentItem document = itemRepo + .findByPath(contentSection, documentPathParam) + .orElseThrow( + () -> new NotFoundException() + ); + + if (!(document instanceof SciDepartment)) { + throw new NotFoundException(); + } + + final SciDepartment department = (SciDepartment) document; + if (itemPermissionChecker.canEditItem(department)) { + final String text = department + .getDepartmentDescription() + .getValue(new Locale(localeParam)); + final Document jsoupDoc = Jsoup.parseBodyFragment(text); + final long result = new StringTokenizer( + jsoupDoc.body().text() + ).countTokens(); + return Long.toString(result); + } else { + throw new ForbiddenException(); + } + } + + @GET + @Path("/department-description/{locale}") + @Produces(MediaType.TEXT_HTML) + @Transactional(Transactional.TxType.REQUIRED) + public String viewDepartmentDescriptionValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPathParam, + @PathParam("locale") final String localeParam + ) { + final ContentSection contentSection = sectionsUi + .findContentSection(sectionIdentifier) + .orElseThrow( + () -> new NotFoundException() + ); + + final ContentItem document = itemRepo + .findByPath(contentSection, documentPathParam) + .orElseThrow( + () -> new NotFoundException() + ); + + if (!(document instanceof SciDepartment)) { + throw new NotFoundException(); + } + + final SciDepartment department = (SciDepartment) document; + if (itemPermissionChecker.canEditItem(department)) { + return department.getDepartmentDescription().getValue( + new Locale(localeParam) + ); + } else { + throw new ForbiddenException(); + } + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStepService.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStepService.java new file mode 100644 index 0000000..f914d36 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentDescriptionStepService.java @@ -0,0 +1,130 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentItemRepository; +import org.librecms.contentsection.ContentSection; +import org.librecms.ui.contentsections.ContentSectionsUi; +import org.librecms.ui.contentsections.documents.MvcAuthoringSteps; +import org.scientificcms.contenttypes.scidepartment.Contact; +import org.scientificcms.contenttypes.scidepartment.ContactRepository; +import org.scientificcms.contenttypes.scidepartment.SciDepartment; + +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; +import javax.ws.rs.BadRequestException; +import javax.ws.rs.Consumes; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAuthoringSteps.PATH_PREFIX + "scidepartment-description-service") +public class SciDepartmentDescriptionStepService { + + @Inject + private ContactRepository contactRepo; + + @Inject + private ContentItemRepository itemRepo; + + @Inject + private ContentSectionsUi sectionsUi; + + @POST + @Path("/contacts/save-order") + @Consumes(MediaType.APPLICATION_JSON) + @Transactional(Transactional.TxType.REQUIRED) + public Response saveContactsOrder( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + final List contactsOrder + ) { + final ContentSection contentSection = sectionsUi + .findContentSection(sectionIdentifier) + .orElseThrow( + () -> new NotFoundException( + String.format( + "No content identifed by %s found.", + sectionIdentifier + ) + ) + ); + + final ContentItem document = itemRepo + .findByPath(contentSection, documentPath) + .orElseThrow( + () -> new NotFoundException( + String.format( + "No document for path %s in section %s.", + documentPath, + contentSection.getLabel() + ) + ) + ); + + if (!(document instanceof SciDepartment)) { + throw new BadRequestException( + String.format( + "Document %s is not a %s.", + documentPath, + SciDepartment.class.getSimpleName() + ) + ); + } + + final SciDepartment department = (SciDepartment) document; + + final List contacts = department.getContacts(); + + if (contactsOrder.size() != contacts.size()) { + throw new BadRequestException( + String.format( + "Number of contacts of the SciDepartment %s does " + + "not match the number of values in the order " + + "list. Number of contactas: %d, number of values in " + + "the contacts order list: %d", + documentPath, + contacts.size(), + contactsOrder.size() + ) + ); + } + + for (int i = 0; i < contactsOrder.size(); i++) { + final String contactIdParam = contactsOrder.get(i); + final long contactId = Long.parseLong(contactIdParam); + final Contact contact = contacts + .stream() + .filter(con -> con.getContactId() == contactId) + .findAny() + .orElseThrow( + () -> new BadRequestException( + String.format( + "contactsOrder has an entry for contact with " + + "ID %d, but there is not contact with that " + + "ID.", + contactId + ) + ) + ); + + contact.setOrder(i); + contactRepo.save(contact); + } + + return Response.ok().build(); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentMembershipModel.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentMembershipModel.java new file mode 100644 index 0000000..db39d13 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentMembershipModel.java @@ -0,0 +1,143 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.scientificcms.contenttypes.scidepartment.Membership; +import org.scientificcms.contenttypes.scidepartment.SciDepartment; + +/** + * DTO providing the information about a {@link Membership} of a + * {@link SciDepartment} in an form that easy usable from a MVC template. + * + * @author Jens Pelzetter + */ +public class SciDepartmentMembershipModel { + + /** + * The ID of the {@link Membership}. + */ + private long membershipId; + + /** + * The role of the member. + * + * @see Membership#role + */ + private String role; + + /** + * The status of the membership. + * + * @see Membership#status + */ + private String status; + + /** + * The given name of the member. + * + * @see PersonName#givenName + */ + private String givenName; + + /** + * The surname of the member. + * + * @see PersonName#surname + */ + private String surname; + + /** + * An optional prefix for the name of the member. + * + * @see PersonName#prefix + */ + private String prefix; + + /** + * An optional suffix for the name of the member. + * + * @see PersonName#suffix + */ + private String suffix; + + public long getMembershipId() { + return membershipId; + } + + public void setMembershipId(final long membershipId) { + this.membershipId = membershipId; + } + + public String getRole() { + return role; + } + + public void setRole(final String role) { + this.role = role; + } + + public String getStatus() { + return status; + } + + public void setStatus(final String status) { + this.status = status; + } + + public String getName() { + final StringBuilder builder = new StringBuilder(); + if (prefix != null && !prefix.isBlank()) { + builder.append(prefix); + builder.append(" "); + } + if (surname != null && !surname.isBlank()) { + builder.append(surname); + } + if (surname != null + && !surname.isBlank() + && givenName != null + && !givenName.isBlank()) { + builder.append(", "); + } + if (givenName != null && !givenName.isBlank()) { + builder.append(givenName); + } + if (suffix != null && !suffix.isBlank()) { + builder.append(" "); + builder.append(suffix); + } + + return builder.toString(); + } + + public String getGivenName() { + return givenName; + } + + public void setGivenName(final String givenName) { + this.givenName = givenName; + } + + public String getSurname() { + return surname; + } + + public void setSurname(final String surname) { + this.surname = surname; + } + + public String getPrefix() { + return prefix; + } + + public void setPrefix(final String prefix) { + this.prefix = prefix; + } + + public String getSuffix() { + return suffix; + } + + public void setSuffix(final String suffix) { + this.suffix = suffix; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentMessageBundle.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentMessageBundle.java new file mode 100644 index 0000000..8f0e840 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentMessageBundle.java @@ -0,0 +1,21 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.libreccm.ui.AbstractMessagesBean; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentMessageBundle") +public class SciDepartmentMessageBundle extends AbstractMessagesBean { + + @Override + protected String getMessageBundle() { + return SciDepartmentStepsConstants.BUNDLE; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentPropertiesStep.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentPropertiesStep.java new file mode 100644 index 0000000..e894add --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentPropertiesStep.java @@ -0,0 +1,492 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.l10n.LocalizedString; +import org.libreccm.security.AuthorizationRequired; +import org.librecms.contentsection.ContentItemRepository; +import org.librecms.ui.contentsections.ContentSectionNotFoundException; +import org.librecms.ui.contentsections.ItemPermissionChecker; +import org.librecms.ui.contentsections.documents.AbstractMvcAuthoringStep; +import org.librecms.ui.contentsections.documents.DocumentNotFoundException; +import org.librecms.ui.contentsections.documents.DocumentUi; +import org.librecms.ui.contentsections.documents.MvcAuthoringStepDef; +import org.librecms.ui.contentsections.documents.MvcAuthoringSteps; +import org.scientificcms.contenttypes.scidepartment.SciDepartment; + +import java.util.Locale; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.transaction.Transactional; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAuthoringSteps.PATH_PREFIX + "scidepartment-basicproperties") +@Controller +@MvcAuthoringStepDef( + bundle = SciDepartmentStepsConstants.BUNDLE, + descriptionKey = "authoringsteps.basicproperties.description", + labelKey = "authoringsteps.basicproperties.label", + supportedDocumentType = SciDepartment.class +) +public class SciDepartmentPropertiesStep extends AbstractMvcAuthoringStep { + + @Inject + private SciDepartmentMessageBundle messageBundle; + + /** + * Used for retrieving and saving the departments. + */ + @Inject + private ContentItemRepository itemRepo; + + @Inject + private DocumentUi documentUi; + + /** + * Provides functions for working with {@link LocalizedString}s. + */ + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private ItemPermissionChecker itemPermissionChecker; + + @Inject + private SciDepartmentPropertiesStepModel propertiesStepModel; + + @Inject + private Models models; + + @Override + public Class getStepClass() { + return SciDepartmentPropertiesStep.class; + } + + @Override + @Transactional(Transactional.TxType.REQUIRED) + protected void init() throws ContentSectionNotFoundException, + DocumentNotFoundException { + super.init(); + + propertiesStepModel.setName(getDocument().getDisplayName()); + + final Set titleLocales = getDocument() + .getTitle() + .getAvailableLocales(); + + propertiesStepModel.setTitleValues( + getDocument() + .getTitle() + .getValues() + .entrySet() + .stream() + .collect( + Collectors.toMap( + entry -> entry.getKey().toString(), + entry -> entry.getValue() + ) + ) + ); + + propertiesStepModel.setUnusedTitleLocales( + globalizationHelper + .getAvailableLocales() + .stream() + .filter(locale -> !titleLocales.contains(locale)) + .map(Locale::toString) + .collect(Collectors.toList()) + ); + + final SciDepartment department = (SciDepartment) getDocument(); + + propertiesStepModel.setShortDescriptionValues( + department + .getShortDescription() + .getValues() + .entrySet() + .stream() + .collect( + Collectors.toMap( + entry -> entry.getKey().toString(), + entry -> entry.getValue() + ) + ) + ); + final Set shortDescriptionLocales = department + .getShortDescription() + .getAvailableLocales(); + + propertiesStepModel.setUnusedShortDescriptionLocales( + globalizationHelper + .getAvailableLocales() + .stream() + .filter(locale -> !shortDescriptionLocales.contains(locale)) + .map(Locale::toString) + .collect(Collectors.toList()) + ); + } + + @GET + @Path("/") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String showStep( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + if (itemPermissionChecker.canEditItem(getDocument())) { + return "org/scientificcms/contenttypes/scidepartment/ui/scidepartment-basic-properties.xhtml"; + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + messageBundle.getMessage("scidepartment.edit.denied") + ); + } + } + + /** + * Updates the name of the current department. + * + * @param sectionIdentifier + * @param documentPath + * @param name + * + * @return A redirect to this authoring step. + */ + @POST + @Path("/name") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String updateName( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("name") @DefaultValue("") final String name + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + if (name.isBlank()) { + models.put("nameMissing", true); + + return showStep(sectionIdentifier, documentPath); + } + + getDocument().setDisplayName(name); + itemRepo.save(getDocument()); + + updateDocumentPath(); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + /** + * Updates a localized title of the department. + * + * @param sectionIdentifier + * @param documentPath + * @param localeParam The locale to update. + * @param value The updated title value. + * + * @return A redirect to this authoring step. + */ + @POST + @Path("/title/@add") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String addTitle( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + final Locale locale = new Locale(localeParam); + getDocument().getTitle().putValue(locale, value); + itemRepo.save(getDocument()); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + /** + * Updates a localized title of the department. + * + * @param sectionIdentifier + * @param documentPath + * @param localeParam The locale to update. + * @param value The updated title value. + * + * @return A redirect to this authoring step. + */ + @POST + @Path("/title/@edit/{locale}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String editTitle( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + final Locale locale = new Locale(localeParam); + getDocument().getTitle().putValue(locale, value); + itemRepo.save(getDocument()); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + /** + * Removes a localized title of the department. + * + * @param sectionIdentifier + * @param documentPath + * @param localeParam The locale to remove. + * + * @return A redirect to this authoring step. + */ + @POST + @Path("/title/@remove/{locale}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String removeTitle( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + final Locale locale = new Locale(localeParam); + getDocument().getTitle().removeValue(locale); + itemRepo.save(getDocument()); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + /** + * Adds a localized short description to the department. + * + * @param sectionIdentifier + * @param documentPath + * @param localeParam The locale of the description. + * @param value The description value. + * + * @return A redirect to this authoring step. + */ + @POST + @Path("/short-description/@add") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String addShortDescription( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + final Locale locale = new Locale(localeParam); + final SciDepartment department = (SciDepartment) getDocument(); + department.getShortDescription().putValue(locale, value); + + itemRepo.save(department); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + /** + * Updates a localized short description to the department. + * + * @param sectionIdentifier + * @param documentPath + * @param localeParam The locale to update. + * @param value The description value. + * + * @return A redirect to this authoring step. + */ + @POST + @Path("/short-description/@edit/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String editShortDescription( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + final Locale locale = new Locale(localeParam); + final SciDepartment department = (SciDepartment) getDocument(); + department.getShortDescription().putValue(locale, value); + + itemRepo.save(department); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + /** + * Removes a localized short description from the department. + * + * @param sectionIdentifier + * @param documentPath + * @param localeParam The locale to remove. + * + * @return A redirect to this authoring step. + */ + @POST + @Path("/short-description/@remove/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + public String removeShortDescription( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + final Locale locale = new Locale(localeParam); + final SciDepartment department = (SciDepartment) getDocument(); + department.getShortDescription().removeValue(locale); + itemRepo.save(department); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentPropertiesStepModel.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentPropertiesStepModel.java new file mode 100644 index 0000000..ebc788f --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentPropertiesStepModel.java @@ -0,0 +1,76 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentPropertiesStep") +public class SciDepartmentPropertiesStepModel { + + private String name; + + private Map titleValues; + + private List unusedTitleLocales; + + private Map shortDescriptionValues; + + private List unusedShortDescriptionLocales; + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public Map getTitleValues() { + return Collections.unmodifiableMap(titleValues); + } + + public void setTitleValues(final Map titleValues) { + this.titleValues = new HashMap<>(titleValues); + } + + public List getUnusedTitleLocales() { + return Collections.unmodifiableList(unusedTitleLocales); + } + + public void setUnusedTitleLocales(final List unusedTitleLocales) { + this.unusedTitleLocales = new ArrayList<>(unusedTitleLocales); + } + + public Map getShortDescriptionValues() { + return Collections.unmodifiableMap(shortDescriptionValues); + } + + public void setShortDescriptionValues( + final Map shortDescriptionValues + ) { + this.shortDescriptionValues = new HashMap<>(shortDescriptionValues); + } + + public List getUnusedShortDescriptionLocales() { + return Collections.unmodifiableList(unusedShortDescriptionLocales); + } + + public void setUnusedShortDescriptionLocales( + final List unusedShortDescriptionLocales + ) { + this.unusedShortDescriptionLocales = new ArrayList<>( + unusedShortDescriptionLocales + ); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentRoles.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentRoles.java new file mode 100644 index 0000000..32e5229 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentRoles.java @@ -0,0 +1,29 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.ui.AbstractMessagesBean; +import org.scientificcms.contenttypes.scidepartment.SciDepartmentConfig; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentRoles") +public class SciDepartmentRoles extends AbstractMessagesBean { + + @Inject + private ConfigurationManager confManager; + + @Override + protected String getMessageBundle() { + return confManager + .findConfiguration(SciDepartmentConfig.class) + .getMemberRolesBundleName(); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentStepsConstants.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentStepsConstants.java new file mode 100644 index 0000000..9a0b90d --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentStepsConstants.java @@ -0,0 +1,16 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +/** + * + * @author Jens Pelzetter + */ +public final class SciDepartmentStepsConstants { + + private SciDepartmentStepsConstants() { + // Nothing + } + + public static final String BUNDLE + = "org.scientificcms.contenttypes.scidepartment.ui.SciDepartmentBundle"; + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextModel.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextModel.java new file mode 100644 index 0000000..48ed08f --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextModel.java @@ -0,0 +1,100 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.librecms.ui.contentsections.documents.CmsEditorLocaleVariantRow; +import org.scientificcms.contenttypes.scidepartment.DepartmentText; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * DTO providing the data of a {@link DepartmentText} in a form that is easy + * usable from the view. + * + * @author Jens Pelzetter + */ +public class SciDepartmentTextModel { + + private String key; + + + + private Map textValues; + + private List variants; + + private List unusedLocales; + + private long order; + + public Map getTextValues() { + return Optional + .ofNullable(textValues) + .map(Collections::unmodifiableMap) + .orElse(Collections.emptyMap()); + } + + protected void setTextValues( + final Map textValues + ) { + this.textValues = Optional + .ofNullable(textValues) + .map(values -> new HashMap<>(values)) + .map(values -> (Map) values) + .orElse(Collections.emptyMap()); + } + + public List getVariants() { + return Optional + .ofNullable(variants) + .map(Collections::unmodifiableList) + .orElse(Collections.emptyList()); + } + + protected void setVariants(final List variants) { + this.variants = Optional + .ofNullable(variants) + .map(list -> new ArrayList<>(list)) + .map(list -> (List) list) + .orElse(Collections.emptyList()); + } + + public List getUnusedLocales() { + return Optional + .ofNullable(unusedLocales) + .map(Collections::unmodifiableList) + .orElse(Collections.emptyList()); + } + + protected void setUnusedLocales(final List unusedLocales) { + this.unusedLocales = Optional + .ofNullable(unusedLocales) + .map(list -> new ArrayList<>(list)) + .map(list -> (List) list) + .orElse(Collections.emptyList()); + } + + public String getKey() { + return key; + } + + protected void setKey(final String key) { + this.key = key; + } + + public String getKeyId() { + return key.replace('.', '-'); + } + + public long getOrder() { + return order; + } + + protected void setOrder(final long order) { + this.order = order; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTexts.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTexts.java new file mode 100644 index 0000000..96d1d70 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTexts.java @@ -0,0 +1,29 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.ui.AbstractMessagesBean; +import org.scientificcms.contenttypes.scidepartment.SciDepartmentConfig; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentTexts") +public class SciDepartmentTexts extends AbstractMessagesBean { + + @Inject + private ConfigurationManager confManager; + + @Override + protected String getMessageBundle() { + return confManager + .findConfiguration(SciDepartmentConfig.class) + .getTextKeysBundleName(); + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextsModel.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextsModel.java new file mode 100644 index 0000000..2ee4060 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextsModel.java @@ -0,0 +1,72 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.SortedMap; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciDepartmentTextsModel") +public class SciDepartmentTextsModel { + + private boolean canEdit; + + private Map availableTextKeys; + + private Map texts; + + private String selectedText; + + private String selectedLocale; + + public boolean getCanEdit() { + return canEdit; + } + + protected void setCanEdit(final boolean canEdit) { + this.canEdit = canEdit; + } + + public Map getAvailableTextKeys() { + return Collections.unmodifiableMap(availableTextKeys); + } + + protected void setAvailableTextKeys( + final Map availableTextKeys + ) { + this.availableTextKeys = new LinkedHashMap<>(availableTextKeys); + } + + public Map getTexts() { + return Collections.unmodifiableMap(texts); + } + + protected void setTexts(final Map texts) { + this.texts = new LinkedHashMap<>(texts); + } + + public String getSelectedText() { + return selectedText; + } + + public void setSelectedText(final String selectedText) { + this.selectedText = selectedText; + } + + public String getSelectedLocale() { + return selectedLocale; + } + + protected void setSelectedLocale(final String selectedLocale) { + this.selectedLocale = selectedLocale; + } + +} diff --git a/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextsResources.java b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextsResources.java new file mode 100644 index 0000000..b10b5a4 --- /dev/null +++ b/sci-types-department/src/main/java/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentTextsResources.java @@ -0,0 +1,125 @@ +package org.scientificcms.contenttypes.scidepartment.ui; + +import org.jsoup.Jsoup; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentItemRepository; +import org.librecms.contentsection.ContentSection; +import org.librecms.ui.contentsections.ContentSectionsUi; +import org.librecms.ui.contentsections.ItemPermissionChecker; +import org.librecms.ui.contentsections.documents.MvcAuthoringSteps; +import org.scientificcms.contenttypes.scidepartment.SciDepartment; + +import java.util.Locale; +import java.util.Optional; +import java.util.StringTokenizer; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; +import javax.ws.rs.ForbiddenException; +import javax.ws.rs.GET; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAuthoringSteps.PATH_PREFIX + "scidepartment-texts-resources") +public class SciDepartmentTextsResources { + + @Inject + private ContentItemRepository itemRepo; + + @Inject + private ContentSectionsUi sectionsUi; + + @Inject + private ItemPermissionChecker itemPermissionChecker; + + @GET + @Path("/department-texts/{textKey}/wordcount/{locale}") + @Produces(MediaType.TEXT_HTML) + @Transactional(Transactional.TxType.REQUIRED) + public String getDepartmentDescriptionWordCount( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPathParam, + @PathParam("textKey") final String textKey, + @PathParam("locale") final String localeParam + ) { + final ContentSection contentSection = sectionsUi + .findContentSection(sectionIdentifier) + .orElseThrow( + () -> new NotFoundException() + ); + + final ContentItem document = itemRepo + .findByPath(contentSection, documentPathParam) + .orElseThrow( + () -> new NotFoundException() + ); + + if (!(document instanceof SciDepartment)) { + throw new NotFoundException(); + } + + final SciDepartment department = (SciDepartment) document; + if (itemPermissionChecker.canEditItem(department)) { + return Optional + .ofNullable(department.getAdditionalTexts().get(textKey)) + .map(text -> text.getText().getValue(new Locale(localeParam))) + .map(text -> Jsoup.parseBodyFragment(text)) + .map(jsoupDoc -> jsoupDoc.body().text()) + .map(text -> new StringTokenizer(text).countTokens()) + .map(Long::toString) + .orElseThrow(() -> new NotFoundException()); + } else { + throw new ForbiddenException(); + } + } + + @GET + @Path("/department-texts/{textKey}/{locale}") + @Produces(MediaType.TEXT_HTML) + @Transactional(Transactional.TxType.REQUIRED) + public String viewDepartmentDescriptionValue( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPathParam, + @PathParam("textKey") final String textKey, + @PathParam("locale") final String localeParam + ) { + final ContentSection contentSection = sectionsUi + .findContentSection(sectionIdentifier) + .orElseThrow( + () -> new NotFoundException() + ); + + final ContentItem document = itemRepo + .findByPath(contentSection, documentPathParam) + .orElseThrow( + () -> new NotFoundException() + ); + + if (!(document instanceof SciDepartment)) { + throw new NotFoundException(); + } + + final SciDepartment department = (SciDepartment) document; + if (itemPermissionChecker.canEditItem(department)) { + return Optional + .ofNullable(department.getAdditionalTexts().get(textKey)) + .map(text -> text.getText().getValue(new Locale(localeParam))) + .orElseThrow(() -> new NotFoundException()); + } else { + throw new ForbiddenException(); + } + } +} diff --git a/sci-types-department/src/main/resources/META-INF/persistence-ddl.xml b/sci-types-department/src/main/resources/META-INF/persistence-ddl.xml new file mode 100644 index 0000000..d28eae8 --- /dev/null +++ b/sci-types-department/src/main/resources/META-INF/persistence-ddl.xml @@ -0,0 +1,42 @@ + + + + + + + + + org.hibernate.jpa.HibernatePersistenceProvider + + java:/comp/env/jdbc/scientificcms/db + + + + + + + + + + + + + + + diff --git a/sci-types-department/src/main/resources/META-INF/services/org.libreccm.modules.CcmModule b/sci-types-department/src/main/resources/META-INF/services/org.libreccm.modules.CcmModule new file mode 100644 index 0000000..1fefd10 --- /dev/null +++ b/sci-types-department/src/main/resources/META-INF/services/org.libreccm.modules.CcmModule @@ -0,0 +1 @@ +org.scientificcms.contenttypes.scidepartment.SciDepartmentModule diff --git a/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/create-scidepartment.xhtml b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/create-scidepartment.xhtml new file mode 100644 index 0000000..5070c91 --- /dev/null +++ b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/create-scidepartment.xhtml @@ -0,0 +1,86 @@ +]> + + + + +
+

#{SciDepartmentMessageBundle['createstep.title']}

+ + + + + +
+ + + + + + + + + + + + #{SciDepartmentMessageBundle['createform.cancel']} + + + + +
+
+ +
+ diff --git a/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/description/edit.xhtml b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/description/edit.xhtml new file mode 100644 index 0000000..d9e1571 --- /dev/null +++ b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/description/edit.xhtml @@ -0,0 +1,44 @@ +]> + + + + +
+ + + #{SciDepartmentMessageBundle['description_step.back']} + + +

#{SciDepartmentMessageBundle['description_step.description.header.edit']}

+
+ + + + + +
+ + + + + + +
+ diff --git a/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/description/view.xhtml b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/description/view.xhtml new file mode 100644 index 0000000..a6e66b0 --- /dev/null +++ b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/description/view.xhtml @@ -0,0 +1,39 @@ +]> + + + + +
+ + + #{SciDepartmentMessageBundle['description_step.back']} + + +

#{SciDepartmentMessageBundle['description_step.description.header.view']}

+
+ + + + +
+ +
+
+ +
+ + + diff --git a/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/scidepartment-basic-properties.xhtml b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/scidepartment-basic-properties.xhtml new file mode 100644 index 0000000..97774e6 --- /dev/null +++ b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/scidepartment-basic-properties.xhtml @@ -0,0 +1,149 @@ +]> + + + + + + +

#{SciDepartmentMessageBundle.getMessage('basicproperties.header', [SciDepartmentPropertiesStep.name])}

+ +

#{SciDepartmentMessageBundle['basicproperties.name.header']}

+
+
#{SciDepartmentPropertiesStep.name}
+ + + +
+ + + + + + + + + +
+ +
+ diff --git a/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/scidepartment-description.xhtml b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/scidepartment-description.xhtml new file mode 100644 index 0000000..4bbaa0b --- /dev/null +++ b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/scidepartment-description.xhtml @@ -0,0 +1,457 @@ +]> + + + + + + +

#{SciDepartmentMessageBundle['description_step.header']}

+ + + + + + + + + + + + + + + + +
+ + + +

#{SciDepartmentMessageBundle['contacts.header']}

+
+
+ +
+
+ + + + + + +

#{SciDepartmentMessageBundle['contacts.none']}

+
+ + + + + + + + + + + + + + + + + + + +
#{SciDepartmentMessageBundle['contacts.cols.contactable']}#{SciDepartmentMessageBundle['contacts.cols.type']}#{SciDepartmentMessageBundle['contacts.cols.actions']}
+ + + + #{contact.contactable} + #{SciDepartmentContactTypes[contact.contactType]} + + + + +
+
+
+ +

#{SciDepartmentMessageBundle['memberships.header']}

+
+
+ +
+
+ + + + + + + + + +

#{SciDepartmentMessageBundle['memberships.none']}

+
+ + + + + + + + + + + + + + + + + + + + + +
#{SciDepartmentMessageBundle['memberships.cols.name']}#{SciDepartmentMessageBundle['memberships.cols.role']}#{SciDepartmentMessageBundle['memberships.cols.status']}#{SciDepartmentMessageBundle['memberships.cols.actions']}
+ #{member.name} + + #{SciDepartmentRoles[member.role]} + + #{member.status} + + + + + +
+
+
+ +

+ #{SciDepartmentMessageBundle['texts.header']} + +

+ + + +

#{SciDepartmentMessageBundle['texts.none']}

+
+ + +
+

#{SciDepartmentTexts[text.key]}

+ +
+ +
+
+
+ +
+ + + + + +
+ + diff --git a/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/texts/view.xhtml b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/texts/view.xhtml new file mode 100644 index 0000000..b7336b7 --- /dev/null +++ b/sci-types-department/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/scidepartment/ui/texts/view.xhtml @@ -0,0 +1,37 @@ +]> + + + + +
+ + + #{SciDepartmentMessageBundle['description_step.back']} + + +

#{SciDepartmentMessageBundle.getMessage('description_step.texts.header.view', [SciDepartmentTexts[SciDepartmentTextsModel.selectedText]])}

+
+ + + + +
+ +
+
+ +
+ diff --git a/sci-types-department/src/main/resources/db/migrations/org/scientificcms/sci_types_department/h2/V7_0_0_0__create_tables.sql b/sci-types-department/src/main/resources/db/migrations/org/scientificcms/sci_types_department/h2/V7_0_0_0__create_tables.sql new file mode 100644 index 0000000..19db44a --- /dev/null +++ b/sci-types-department/src/main/resources/db/migrations/org/scientificcms/sci_types_department/h2/V7_0_0_0__create_tables.sql @@ -0,0 +1,302 @@ +create table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM ( + OBJECT_ID bigint not null, + LOCALIZED_VALUE varchar(2147483647), + LOCALE varchar(255) not null, + primary key (OBJECT_ID, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM_AUD ( + REV integer not null, + OBJECT_ID bigint not null, + LOCALIZED_VALUE varchar(2147483647) not null, + LOCALE varchar(255) not null, + REVTYPE tinyint, + REVEND integer, + primary key (REV, OBJECT_ID, LOCALIZED_VALUE, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS ( + CONTACT_ID bigint not null, + CONTACT_TYPE varchar(255), + CONTACT_ORDER bigint, + CONTACTABLE_ID bigint, + DEPARTMENT_ID bigint, + primary key (CONTACT_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS_AUD ( + CONTACT_ID bigint not null, + REV integer not null, + REVTYPE tinyint, + REVEND integer, + CONTACT_TYPE varchar(255), + CONTACT_ORDER bigint, + CONTACTABLE_ID bigint, + DEPARTMENT_ID bigint, + primary key (CONTACT_ID, REV) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS ( + OBJECT_ID bigint not null, + LOCALIZED_VALUE varchar(2147483647), + LOCALE varchar(255) not null, + primary key (OBJECT_ID, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS_AUD ( + REV integer not null, + OBJECT_ID bigint not null, + LOCALIZED_VALUE varchar(2147483647) not null, + LOCALE varchar(255) not null, + REVTYPE tinyint, + REVEND integer, + primary key (REV, OBJECT_ID, LOCALIZED_VALUE, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS ( + MEMBERSHIP_ID bigint not null, + MEMBER_ROLE varchar(255), + STATUS varchar(255), + DEPARTMENT_ID bigint, + MEMBER_ID bigint, + primary key (MEMBERSHIP_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS_AUD ( + MEMBERSHIP_ID bigint not null, + REV integer not null, + REVTYPE tinyint, + REVEND integer, + MEMBER_ROLE varchar(255), + STATUS varchar(255), + DEPARTMENT_ID bigint, + MEMBER_ID bigint, + primary key (MEMBERSHIP_ID, REV) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS ( + DEPARTMENT_PROJECT_ID bigint not null, + DEPARTMENT_ID bigint, + PROJECT_ID bigint, + primary key (DEPARTMENT_PROJECT_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS_AUD ( + DEPARTMENT_PROJECT_ID bigint not null, + REV integer not null, + REVTYPE tinyint, + REVEND integer, + DEPARTMENT_ID bigint, + PROJECT_ID bigint, + primary key (DEPARTMENT_PROJECT_ID, REV) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS ( + OBJECT_ID bigint not null, + LOCALIZED_VALUE varchar(2147483647), + LOCALE varchar(255) not null, + primary key (OBJECT_ID, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS_AUD ( + REV integer not null, + OBJECT_ID bigint not null, + LOCALIZED_VALUE varchar(2147483647) not null, + LOCALE varchar(255) not null, + REVTYPE tinyint, + REVEND integer, + primary key (REV, OBJECT_ID, LOCALIZED_VALUE, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES ( + OBJECT_ID bigint not null, + LOCALIZED_VALUE varchar(2147483647), + LOCALE varchar(255) not null, + primary key (OBJECT_ID, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES_AUD ( + REV integer not null, + OBJECT_ID bigint not null, + LOCALIZED_VALUE varchar(2147483647) not null, + LOCALE varchar(255) not null, + REVTYPE tinyint, + REVEND integer, + primary key (REV, OBJECT_ID, LOCALIZED_VALUE, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS ( + TEXT_ID bigint not null, + key varchar(255) not null, + CONTACT_ORDER bigint, + DEPARTMENT_ID bigint, + additionalTexts_KEY varchar(255), + primary key (TEXT_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS_AUD ( + TEXT_ID bigint not null, + REV integer not null, + REVTYPE tinyint, + REVEND integer, + key varchar(255), + CONTACT_ORDER bigint, + DEPARTMENT_ID bigint, + primary key (TEXT_ID, REV) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENTS ( + OBJECT_ID bigint not null, + primary key (OBJECT_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENTS_AUD ( + OBJECT_ID bigint not null, + REV integer not null, + primary key (OBJECT_ID, REV) + ); + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM + add constraint FKkr6pwbcsp0qxafbxbgwqa11ay + foreign key (OBJECT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM_AUD + add constraint FKelrcnq39r31r0l519afl15qay + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM_AUD + add constraint FKl2uuj3krtky6ouk99n1vaujs4 + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS + add constraint FK61b1pvrsuxxt0ajyhmu6vgp8f + foreign key (CONTACTABLE_ID) + references CCM_CMS.CONTACTABLE_ENTITIES; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS + add constraint FK2rk6b5rwwhypbhlwxfvfg34bp + foreign key (DEPARTMENT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS_AUD + add constraint FK7hxnvivdkm7ullkb3x33w89qa + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS_AUD + add constraint FKe2m5dgvrbh28yuetflg847k9p + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS + add constraint FKtkxxxyb2r0oeljttm3vg1ek1c + foreign key (OBJECT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS_AUD + add constraint FKtfrxdrq4x3fvne2qnum009h9m + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS_AUD + add constraint FKfoygb3t7vg4a6kwedec9gnfgc + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS + add constraint FKswvausrj6rpiuewwky4966o8w + foreign key (DEPARTMENT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS + add constraint FKl7xexed4rkmd8849fs87wcikf + foreign key (MEMBER_ID) + references CCM_CMS.PERSONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS_AUD + add constraint FKnueow1dk4s148ddigm1smh5l6 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS_AUD + add constraint FKb4k1r14kxplvq5yvls3mc9wg7 + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS + add constraint FK44ec63uxo6tfkbicbx7m0au9x + foreign key (DEPARTMENT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS + add constraint FKqo3qvk46erndngcg3s9g5g0y2 + foreign key (PROJECT_ID) + references SCI_TYPES_PROJECT.PROJECTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS_AUD + add constraint FKg2wdr3xj8vmctvusi9dmu6nby + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS_AUD + add constraint FKaail9qrssr6m2whdi85ill2xn + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS + add constraint FKhjjjhfgyubyc7dqv7cwylynib + foreign key (OBJECT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS_AUD + add constraint FK1avu0wp25u2qol0h6u8gv5itg + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS_AUD + add constraint FKjv8lhvqcodppyow6x7qqodbe4 + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES + add constraint FKq9e443yyn5x582n0gv8dkox2q + foreign key (OBJECT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES_AUD + add constraint FKbtj714r1oclsq27js49fpsfx1 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES_AUD + add constraint FKimyfv8v61io9kox2atqswk7iy + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS + add constraint FKc5fi9md95eldjfpeaqtfplqab + foreign key (DEPARTMENT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS_AUD + add constraint FKb8ani402kr1vng8kdqhvaxum6 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS_AUD + add constraint FK1r1yt6d7l6g1xqgbmu6s2pdb4 + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENTS + add constraint FKmya9o3si7s3wu50quhlapy5dc + foreign key (OBJECT_ID) + references CCM_CMS.CONTENT_ITEMS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENTS_AUD + add constraint FKet2pdc2rct7iisg420vtworwm + foreign key (OBJECT_ID, REV) + references CCM_CMS.CONTENT_ITEMS_AUD; diff --git a/sci-types-department/src/main/resources/db/migrations/org/scientificcms/sci_types_department/pgsql/V7_0_0_0__create_tables.sql b/sci-types-department/src/main/resources/db/migrations/org/scientificcms/sci_types_department/pgsql/V7_0_0_0__create_tables.sql new file mode 100644 index 0000000..b7b5cdd --- /dev/null +++ b/sci-types-department/src/main/resources/db/migrations/org/scientificcms/sci_types_department/pgsql/V7_0_0_0__create_tables.sql @@ -0,0 +1,302 @@ + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM ( + OBJECT_ID int8 not null, + LOCALIZED_VALUE text, + LOCALE varchar(255) not null, + primary key (OBJECT_ID, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM_AUD ( + REV int4 not null, + OBJECT_ID int8 not null, + LOCALIZED_VALUE text not null, + LOCALE varchar(255) not null, + REVTYPE int2, + REVEND int4, + primary key (REV, OBJECT_ID, LOCALIZED_VALUE, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS ( + CONTACT_ID int8 not null, + CONTACT_TYPE varchar(255), + CONTACT_ORDER int8, + CONTACTABLE_ID int8, + DEPARTMENT_ID int8, + primary key (CONTACT_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS_AUD ( + CONTACT_ID int8 not null, + REV int4 not null, + REVTYPE int2, + REVEND int4, + CONTACT_TYPE varchar(255), + CONTACT_ORDER int8, + CONTACTABLE_ID int8, + DEPARTMENT_ID int8, + primary key (CONTACT_ID, REV) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS ( + OBJECT_ID int8 not null, + LOCALIZED_VALUE text, + LOCALE varchar(255) not null, + primary key (OBJECT_ID, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS_AUD ( + REV int4 not null, + OBJECT_ID int8 not null, + LOCALIZED_VALUE text not null, + LOCALE varchar(255) not null, + REVTYPE int2, + REVEND int4, + primary key (REV, OBJECT_ID, LOCALIZED_VALUE, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS ( + MEMBERSHIP_ID int8 not null, + MEMBER_ROLE varchar(255), + STATUS varchar(255), + DEPARTMENT_ID int8, + MEMBER_ID int8, + primary key (MEMBERSHIP_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS_AUD ( + MEMBERSHIP_ID int8 not null, + REV int4 not null, + REVTYPE int2, + REVEND int4, + MEMBER_ROLE varchar(255), + STATUS varchar(255), + DEPARTMENT_ID int8, + MEMBER_ID int8, + primary key (MEMBERSHIP_ID, REV) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS ( + DEPARTMENT_PROJECT_ID int8 not null, + DEPARTMENT_ID int8, + PROJECT_ID int8, + primary key (DEPARTMENT_PROJECT_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS_AUD ( + DEPARTMENT_PROJECT_ID int8 not null, + REV int4 not null, + REVTYPE int2, + REVEND int4, + DEPARTMENT_ID int8, + PROJECT_ID int8, + primary key (DEPARTMENT_PROJECT_ID, REV) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS ( + OBJECT_ID int8 not null, + LOCALIZED_VALUE text, + LOCALE varchar(255) not null, + primary key (OBJECT_ID, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS_AUD ( + REV int4 not null, + OBJECT_ID int8 not null, + LOCALIZED_VALUE text not null, + LOCALE varchar(255) not null, + REVTYPE int2, + REVEND int4, + primary key (REV, OBJECT_ID, LOCALIZED_VALUE, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES ( + OBJECT_ID int8 not null, + LOCALIZED_VALUE text, + LOCALE varchar(255) not null, + primary key (OBJECT_ID, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES_AUD ( + REV int4 not null, + OBJECT_ID int8 not null, + LOCALIZED_VALUE text not null, + LOCALE varchar(255) not null, + REVTYPE int2, + REVEND int4, + primary key (REV, OBJECT_ID, LOCALIZED_VALUE, LOCALE) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS ( + TEXT_ID int8 not null, + key varchar(255) not null, + CONTACT_ORDER int8, + DEPARTMENT_ID int8, + additionalTexts_KEY varchar(255), + primary key (TEXT_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS_AUD ( + TEXT_ID int8 not null, + REV int4 not null, + REVTYPE int2, + REVEND int4, + key varchar(255), + CONTACT_ORDER int8, + DEPARTMENT_ID int8, + primary key (TEXT_ID, REV) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENTS ( + OBJECT_ID int8 not null, + primary key (OBJECT_ID) + ); + + create table SCI_TYPES_DEPARTMENT.DEPARTMENTS_AUD ( + OBJECT_ID int8 not null, + REV int4 not null, + primary key (OBJECT_ID, REV) + ); + +alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM + add constraint FKkr6pwbcsp0qxafbxbgwqa11ay + foreign key (OBJECT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM_AUD + add constraint FKelrcnq39r31r0l519afl15qay + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_ADDENDUM_AUD + add constraint FKl2uuj3krtky6ouk99n1vaujs4 + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS + add constraint FK61b1pvrsuxxt0ajyhmu6vgp8f + foreign key (CONTACTABLE_ID) + references CCM_CMS.CONTACTABLE_ENTITIES; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS + add constraint FK2rk6b5rwwhypbhlwxfvfg34bp + foreign key (DEPARTMENT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS_AUD + add constraint FK7hxnvivdkm7ullkb3x33w89qa + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_CONTACTS_AUD + add constraint FKe2m5dgvrbh28yuetflg847k9p + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS + add constraint FKtkxxxyb2r0oeljttm3vg1ek1c + foreign key (OBJECT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS_AUD + add constraint FKtfrxdrq4x3fvne2qnum009h9m + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_DESCS_AUD + add constraint FKfoygb3t7vg4a6kwedec9gnfgc + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS + add constraint FKswvausrj6rpiuewwky4966o8w + foreign key (DEPARTMENT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS + add constraint FKl7xexed4rkmd8849fs87wcikf + foreign key (MEMBER_ID) + references CCM_CMS.PERSONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS_AUD + add constraint FKnueow1dk4s148ddigm1smh5l6 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_MEMBERSHIPS_AUD + add constraint FKb4k1r14kxplvq5yvls3mc9wg7 + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS + add constraint FK44ec63uxo6tfkbicbx7m0au9x + foreign key (DEPARTMENT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS + add constraint FKqo3qvk46erndngcg3s9g5g0y2 + foreign key (PROJECT_ID) + references SCI_TYPES_PROJECT.PROJECTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS_AUD + add constraint FKg2wdr3xj8vmctvusi9dmu6nby + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_PROJECTS_AUD + add constraint FKaail9qrssr6m2whdi85ill2xn + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS + add constraint FKhjjjhfgyubyc7dqv7cwylynib + foreign key (OBJECT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS_AUD + add constraint FK1avu0wp25u2qol0h6u8gv5itg + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_SHORT_DESCS_AUD + add constraint FKjv8lhvqcodppyow6x7qqodbe4 + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES + add constraint FKq9e443yyn5x582n0gv8dkox2q + foreign key (OBJECT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES_AUD + add constraint FKbtj714r1oclsq27js49fpsfx1 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXT_VALUES_AUD + add constraint FKimyfv8v61io9kox2atqswk7iy + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS + add constraint FKc5fi9md95eldjfpeaqtfplqab + foreign key (DEPARTMENT_ID) + references SCI_TYPES_DEPARTMENT.DEPARTMENTS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS_AUD + add constraint FKb8ani402kr1vng8kdqhvaxum6 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENT_TEXTS_AUD + add constraint FK1r1yt6d7l6g1xqgbmu6s2pdb4 + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENTS + add constraint FKmya9o3si7s3wu50quhlapy5dc + foreign key (OBJECT_ID) + references CCM_CMS.CONTENT_ITEMS; + + alter table SCI_TYPES_DEPARTMENT.DEPARTMENTS_AUD + add constraint FKet2pdc2rct7iisg420vtworwm + foreign key (OBJECT_ID, REV) + references CCM_CMS.CONTENT_ITEMS_AUD; \ No newline at end of file diff --git a/sci-types-department/src/main/resources/module-info/org.scientificcms.contenttypes.scidepartment.SciDepartmentModule.properties b/sci-types-department/src/main/resources/module-info/org.scientificcms.contenttypes.scidepartment.SciDepartmentModule.properties new file mode 100644 index 0000000..b9f3b36 --- /dev/null +++ b/sci-types-department/src/main/resources/module-info/org.scientificcms.contenttypes.scidepartment.SciDepartmentModule.properties @@ -0,0 +1,4 @@ +groupId=${project.groupId} +artifactId=${project.artifactId} +version=${project.version} +build.date=${timestamp} diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/SciDepartment.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/SciDepartment.properties new file mode 100644 index 0000000..85689ad --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/SciDepartment.properties @@ -0,0 +1,3 @@ + +label=Department +description=Describes a department. diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/SciDepartment_de.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/SciDepartment_de.properties new file mode 100644 index 0000000..15c3876 --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/SciDepartment_de.properties @@ -0,0 +1,3 @@ + +label=Abteillung +description=Beschreibung einer Abteilung oder eines Lehrstuhls. diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultContactTypes.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultContactTypes.properties new file mode 100644 index 0000000..e72b04d --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultContactTypes.properties @@ -0,0 +1 @@ +sciproject.contact=Contact diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultContactTypes_de.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultContactTypes_de.properties new file mode 100644 index 0000000..aaf69df --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultContactTypes_de.properties @@ -0,0 +1 @@ +sciproject.contact=Kontakt diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultMemberRoles.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultMemberRoles.properties new file mode 100644 index 0000000..edc05b1 --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultMemberRoles.properties @@ -0,0 +1,5 @@ + +member=Member +head=Department head +deputy_head=Deputy department head +associated_member=Associated member diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultMemberRoles_de.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultMemberRoles_de.properties new file mode 100644 index 0000000..c410b04 --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultMemberRoles_de.properties @@ -0,0 +1,5 @@ + +member=Mitglied +head=Abteilungsleitung +deputy_head=Stellvertretende Abteilungsleitung +associated_member=Assoziertes Mitglied diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultTextKeys.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultTextKeys.properties new file mode 100644 index 0000000..c43c21b --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultTextKeys.properties @@ -0,0 +1,3 @@ + +scidepartment.research=Research +scidepartment.concept=Concept diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultTextKeys_de.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultTextKeys_de.properties new file mode 100644 index 0000000..f608bfa --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/DefaultTextKeys_de.properties @@ -0,0 +1,3 @@ + +scidepartment.research=Forschung +scidepartment.concept=Leitkonzept diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentBundle.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentBundle.properties new file mode 100644 index 0000000..c62d6de --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentBundle.properties @@ -0,0 +1,150 @@ + +createstep.description=Creates a new SciDepartment. +authoringsteps.description.description=Description of the department. +authoringsteps.description.label=Description +scidepartment.edit.denied=Access denied. +authoringsteps.basicproperties.description=Basicproperties of the department. +authoringsteps.basicproperties.label=Basic Properties +createstep.title=Create a new department description +createform.name.help=The name of the new department description. Also used as URL fragment. +createform.name.label=Name +createform.initial_locale.help=The initial locale of the department description. +createform.initial_locale.label=Summary +createform.title.help=The title of the department. +createform.title.label=Title +createform.summary.help=A summary of the description of the department. +createform.summary.label=Summary +createform.workflow.help=The workflow to use for the department description. +createform.workflow.label=Workflow +createform.cancel=Cancel +createform.submit=Create department +basicproperties.header=Edit basic properties of department {0} +basicproperties.name.header=Name +basicproperties.name.edit=Edit name +basicproperties.name.edit.title=Edit name +basicproperties.name.edit.close=Cancel +basicproperties.name.help=The name of the department. Also used as URL fragment. +basicproperties.name.label=Name +basicproperties.title.add=Add a localized title +basicproperties.title.add.cancel=Cancel +basicproperties.title.add.locale.help=The locale of the localized title. +basicproperties.title.add.locale.label=Locale +basicproperties.title.add.submit=Add +basicproperties.title.add.header=Add localized title +basicproperties.title.add.value.help=The localized title. +basicproperties.title.add.value.label=Title +basicproperties.title.edit=Edit +basicproperties.title.edit.cancel=Cancel +basicproperties.title.edit.submit=Save +basicproperties.title.edit.header=Edit localized title +basicproperties.title.edit.value.help=The localized title. +basicproperties.title.edit.value.label=Title +basicproperties.title.remove=Remove +basicproperties.title.remove.cancel=Cancel +basicproperties.title.remove.submit=Remove +basicproperties.title.remove.text=Are you sure to remove this localized title? +basicproperties.title.remove.header=Confirm removal of localized title +basicproperties.title.header=Title +basicproperties.shortdescription.add=Add +basicproperties.shortdescription.add.cancel=Cancel +basicproperties.shortdescription.add.locale.help=The locale of the localized short description. +basicproperties.shortdescription.add.locale.label=Locale +basicproperties.shortdescription.add.submit=Add +basicproperties.shortdescription.add.header=Add a localized short description +basicproperties.shortdescription.add.value.help=The localized short description. +basicproperties.shortdescription.add.value.label=Short description +basicproperties.shortdescription.edit=Edit +basicproperties.shortdescription.edit.cancel=Cancel +basicproperties.shortdescription.edit.submit=Save +basicproperties.shortdescription.edit.header=Edit localized short description +basicproperties.shortdescription.edit.value.help=The localized short description. +basicproperties.shortdescription.edit.value.label=Short description +basicproperties.shortdescription.remove=Remove +basicproperties.shortdescription.remove.cancel=Cancel +basicproperties.shortdescription.remove.submit=Remove +basicproperties.shortdescription.remove.text=Are you sure to remove this localized short description? +basicproperties.shortdescription.remove.header=Confirm removal of localized short description +basicproperties.shortdescription.header=Short description +description_step.header=Department Description +description_step.errors.contactable_not_found=The selected contactable entity {0} was not found. +description_step.errors.person_not_found=The selected person was not found. +description_step.errors.illegal_member_status_value=Illegal member status. +contacts.sort.errors.general=Error while sorting contacts. +contacts.sort.errors.save=Error while saving contact order. +description.editor.add_variant=Add localized description +description.editor.add.locale.help=The locale of the localized description. +description.editor.header=Description +contacts.header=Contacts +contacts.add_button.label=Add contact +contact.add.title=Add contact +contacts.type.help=The type of the contact. +contacts.type.label=Type +contacts.order.save.inprogress=Saving contacts order... +contacts.none=No contacts have been added yet. +contacts.cols.contactable=Contact +contacts.cols.type=Type +contacts.cols.actions=Actions +contacts.move.button=Move +contacts.edit.label=Edit +contacts.edit.title=Edit contact +contacts.edit.cancel=Cancel +contacts.edit.type.help=The type of the contact. +contacts.edit.type.label=Type +contacts.edit.submit=Save +contacts.delete.label=Remove +contacts.delete.cancel=Cancel +contacts.delete.confirm=Remove +contacts.delete.title=Confirm Removeal of Contact +contacts.delete.message=Are you sure to remove the contact {0} with type {1}? +memberships.header=Members +memberships.add_button.label=Add member +memberships.add.title=Add member +memberships.role.help=The role of the member. +memberships.role.label=Role +memberships.status.help=The status of the member. +memberships.status.label=Status +memberships.none=No member have been added yet. +memberships.cols.name=Name +memberships.cols.role=Role +memberships.cols.status=Status +memberships.cols.actions=Actions +memberships.edit.label=Edit +memberships.edit.cancel=Cancel +memberships.edit.role.help=The role of the member. +memberships.edit.role.label=Role +memberships.edit.status.help=The status of the member. +memberships.edit.status.label=Status +members.edit.cancel=Cancel +members.edit.submit=Save +memberships.delete.label=Remove +memberships.delete.cancel=Cancel +memberships.delete.confirm=Remove +memberships.delete.title=Confirm Removal of Member +memberships.delete.message=Are you sure to remove the member {0}? +texts.header=Additional texts +texts.add.label=Add text +texts.add.dialog.title=Add text +texts.add.cancel=Cancel +texts.add.key.help=The identifier of the text. +texts.add.key.label=Identifier +texts.add.submit=Add text +texts.none=No texts have been added yet. +texts.delete.label=Remove text +texts.delete.cancel=Cancel +texts.delete.confirm=Remove text +texts.delete.title=Confirm Removal of Text +texts.delete.message=Are you sure to remove the text {0}? +texts.editor.add_variant=Add localization +texts.editor.add.locale.help=The locale of the localized text. +texts.editor.header=Edit text {0} +description_step.back=Back +description_step.description.header.edit=Edit description +description_step.text.header.edit=Edit text {0} +description_step.texts.header.view=View text {0} +description_step.edit=Edit +description_step.description.header.view=Description +basicproperties.name.edit.submit=Save +contacts.order.save=Save order +members.status.active=Active +members.status.associated=Associated +members.status.former=Former diff --git a/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentBundle_de.properties b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentBundle_de.properties new file mode 100644 index 0000000..a77659d --- /dev/null +++ b/sci-types-department/src/main/resources/org/scientificcms/contenttypes/scidepartment/ui/SciDepartmentBundle_de.properties @@ -0,0 +1,150 @@ + +createstep.description=Erstellt eine neue Abteilung. +authoringsteps.description.description=Beschreibung der Abteilung. +authoringsteps.description.label=Beschreibung +scidepartment.edit.denied=Zugriff verweigert. +authoringsteps.basicproperties.description=Basiseigenschaften der Abteilung. +authoringsteps.basicproperties.label=Basiseigenschaften +createstep.title=Neue Abteilungsbeschriebung anlegen +createform.name.help=Der Name des neuen Abteilungsbeschreibung. Wird auch als URL-Fragment genutzt. +createform.name.label=Name +createform.initial_locale.help=Die initiale Sprache der Abteilungsbeschreibung. +createform.initial_locale.label=Zusammenfassung +createform.title.help=Der Titel des Abteilung. +createform.title.label=Titel +createform.summary.help=Eine Zusammenfassung der Beschreibung der Abteilung +createform.summary.label=Zusammenfassung +createform.workflow.help=Der Arbeitsablauf, der f\u00fcr die Abteilungsbeschreibung genutzt werden soll. +createform.workflow.label=Arbeitsablauf +createform.cancel=Abbrechen +createform.submit=Abteilung anlegen +basicproperties.header=Basiseigenschaften der Abteilung {0} bearbeiten +basicproperties.name.header=Name +basicproperties.name.edit=Name bearbeiten +basicproperties.name.edit.title=Name bearbeiten +basicproperties.name.edit.close=Abbrechen +basicproperties.name.help=Der Name der Abteilung. Wird auch als URL Fragment verwendet. +basicproperties.name.label=Name +basicproperties.title.add=Lokalisierten Titel hinzuf\u00fcgen +basicproperties.title.add.cancel=Abbrechen +basicproperties.title.add.locale.help=Die Sprache des lokalisierten Titels. +basicproperties.title.add.locale.label=Sprache +basicproperties.title.add.submit=Hinzuf\u00fcgen +basicproperties.title.add.header=Lokalisierten Titel hinzuf\u00fcgen +basicproperties.title.add.value.help=Der lokalisierte Titel. +basicproperties.title.add.value.label=Titel +basicproperties.title.edit=Bearbeiten +basicproperties.title.edit.cancel=Abbrechen +basicproperties.title.edit.submit=Speichern +basicproperties.title.edit.header=Lokalisierten Titel bearbeiten +basicproperties.title.edit.value.help=Der lokalisierte Titel +basicproperties.title.edit.value.label=Titel +basicproperties.title.remove=Entfernen +basicproperties.title.remove.cancel=Abbrechen +basicproperties.title.remove.submit=Entfernen +basicproperties.title.remove.text=Sind Sie sicher dass Sie diesen lokalisierten Titel entfernen wollen? +basicproperties.title.remove.header=Entfernen eines lokalisierten Titels best\u00e4tigen +basicproperties.title.header=Titel +basicproperties.shortdescription.add=Hinzuf\u00fcgen +basicproperties.shortdescription.add.cancel=Abbrechen +basicproperties.shortdescription.add.locale.help=Die Sprache der lokaliserten Kurzbeschreibung. +basicproperties.shortdescription.add.locale.label=Sprache +basicproperties.shortdescription.add.submit=Hinzuf\u00fcgen +basicproperties.shortdescription.add.header=Eine lokaliserte Kurzbeschreibung hinzuf\u00fcgen +basicproperties.shortdescription.add.value.help=Die lokalisierte Kurzbeschreibung. +basicproperties.shortdescription.add.value.label=Kurzbeschreibung +basicproperties.shortdescription.edit=Bearbeiten +basicproperties.shortdescription.edit.cancel=Abbrechen +basicproperties.shortdescription.edit.submit=Speichern +basicproperties.shortdescription.edit.header=Lokalisierte Kurzbeschreibung bearbeiten +basicproperties.shortdescription.edit.value.help=Die lokalisierte Kurzbeschreibung. +basicproperties.shortdescription.edit.value.label=Kurzbeschreibung +basicproperties.shortdescription.remove=Entfernen +basicproperties.shortdescription.remove.cancel=Abbrechen +basicproperties.shortdescription.remove.submit=Entfernen +basicproperties.shortdescription.remove.text=Sind Sie sicher, dass Sie diese lokaliserte Kurzbeschreibung entfernen wollen? +basicproperties.shortdescription.remove.header=Entfernen einer lokalisierten Kurzbeschreibung best\u00e4tigen +basicproperties.shortdescription.header=Kurzbeschreibung +description_step.header=Beschreibung der Abteilung +description_step.errors.contactable_not_found=Die ausgew\u00e4hlte Person oder Organisation {0} konnte nicht gefunden werden. +description_step.errors.person_not_found=Die ausgew\u00e4hlte Person konnte nicht gefunden werden. +description_step.errors.illegal_member_status_value=Fehlerhafter Status f\u00fcr Mitglied. +contacts.sort.errors.general=Fehler beim Sortieren der Kontakte. +contacts.sort.errors.save=Die Sortierung der Kontakte konnte nicht gespeichert werden. +description.editor.add_variant=Lokalisierte Beschreibung hinzuf\u00fcgen +description.editor.add.locale.help=Die Sprache der lokalisierten Beschreibung. +description.editor.header=Beschreibung +contacts.header=Kontakte +contacts.add_button.label=Kontakt hinzuf\u00fcgen +contact.add.title=Kontakt hinzuf\u00fcgen +contacts.type.help=Der Typ des Kontakts. +contacts.type.label=Typ +contacts.order.save.inprogress=Speichere Sortierung der Kontakte... +contacts.none=Es wurden noch keine Kontakte hinzugef\u00fcgt. +contacts.cols.contactable=Kontakt +contacts.cols.type=Typ +contacts.cols.actions=Aktionen +contacts.move.button=Verschieben +contacts.edit.label=Bearbeiten +contacts.edit.title=Kontakt bearbeiten +contacts.edit.cancel=Abbrechen +contacts.edit.type.help=Der Typ des Kontakts. +contacts.edit.type.label=Typ +contacts.edit.submit=Speichern +contacts.delete.label=Entfernen +contacts.delete.cancel=Abbrechen +contacts.delete.confirm=Entfernen +contacts.delete.title=Entfernen des Kontaktes best\u00e4tigen +contacts.delete.message=Sind Sie sicher das Sie den Kontakt {0} (Typ: {1}) entfernen wollen? +memberships.header=Mitglieder +memberships.add_button.label=Mitglied hinzuf\u00fcgen +memberships.add.title=Mitglied hinzuf\u00fcgen +memberships.role.help=Die Rolle des Mitglieds. +memberships.role.label=Rolle +memberships.status.help=Der Status des Mitglieds. +memberships.status.label=Status +memberships.none=Es wurden noch keine Mitglieder hinzugef\u00fcgt. +memberships.cols.name=Name +memberships.cols.role=Rolle +memberships.cols.status=Status +memberships.cols.actions=Aktionen +memberships.edit.label=Bearbeiten +memberships.edit.cancel=Abbrechen +memberships.edit.role.help=Die Rolle des Mitglieds. +memberships.edit.role.label=Rolle +memberships.edit.status.help=Der Status des Mitglieds. +memberships.edit.status.label=Status +members.edit.cancel=Abbrechen +members.edit.submit=Speichern +memberships.delete.label=Entfernen +memberships.delete.cancel=Abbrechen +memberships.delete.confirm=Entfernen +memberships.delete.title=Entfernen des Mitglieds best\u00e4tigen +memberships.delete.message=Sind Sie sicher, dass Sie das Mitglied {0} entfernen wollen? +texts.header=Weitere Texte +texts.add.label=Text hinzuf\u00fcgen +texts.add.dialog.title=Text hinzuf\u00fcgen +texts.add.cancel=Abbrechen +texts.add.key.help=Bezeichner des Textes. +texts.add.key.label=Bezeichner +texts.add.submit=Text hinzuf\u00fcgen +texts.none=Es wurden noch keine Texte hinzugef\u00fcgt. +texts.delete.label=Text entfernen +texts.delete.cancel=Abbrechen +texts.delete.confirm=Text entfernen +texts.delete.title=Entfernen des Textes best\u00e4tigen +texts.delete.message=Sind Sie sicher, dass Sie den Text {0} entfernen wollen? +texts.editor.add_variant=\u00dcbersetzung hinzuf\u00fcgen +texts.editor.add.locale.help=Die Sprache der \u00dcbersetzung. +texts.editor.header=Text {0} bearbeiten +description_step.back=Zur\u00fcck +description_step.description.header.edit=Beschreibung bearbeiten +description_step.text.header.edit=Text {0} bearbeiten +description_step.texts.header.view=Text {0} +description_step.edit=Bearbeiten +description_step.description.header.view=Beschreibung +basicproperties.name.edit.submit=Speichern +contacts.order.save=Sortierung speichern +members.status.active=Aktiv +members.status.associated=Assoziert +members.status.former=Ehemalig diff --git a/sci-types-department/src/main/typescript/scidepartment-contacts.ts b/sci-types-department/src/main/typescript/scidepartment-contacts.ts new file mode 100644 index 0000000..77bcda6 --- /dev/null +++ b/sci-types-department/src/main/typescript/scidepartment-contacts.ts @@ -0,0 +1,152 @@ +import Sortable, { SortableEvent } from "sortablejs"; + +let contactsSortable: Sortable; + +document.addEventListener("DOMContentLoaded", function (event) { + const contactsTable = document.querySelector( + "#scidepartment-contacts-table tbody" + ); + + if (contactsTable) { + contactsSortable = initContactsTable(contactsTable as HTMLElement); + } + + const saveOrderButtons = document.querySelectorAll( + ".contacts-save-order-button" + ); + for (let i = 0; i < saveOrderButtons.length; i++) { + saveOrderButtons[i].addEventListener("click", saveOrder); + } +}); + +function initContactsTable(contactsTable: HTMLElement): Sortable { + return new Sortable(contactsTable, { + animation: 150, + group: "scidepartment-contact", + handle: ".cms-sort-handle", + onEnd: enableSaveButton, + }); +} + +function enableSaveButton(event: SortableEvent) { + const saveOrderButtons = document.querySelectorAll( + ".contacts-save-order-button" + ); + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + saveOrderButton.disabled = false; + } +} + +function saveOrder() { + const contactsTable = document.querySelector("#scidepartment-contacts-table"); + + if (!contactsTable) { + showGeneralError(); + throw Error("scidepartment-contacts-table not found"); + } + + const saveUrl = contactsTable.getAttribute("data-saveUrl"); + if (!saveUrl) { + showGeneralError(); + throw Error( + "data-saveUrl on scidepartment-contacts-table container is missing or empty" + ); + } + + const saveOrderButtons = document.querySelectorAll( + ".contacts-save-order-button" + ); + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + saveOrderButton.disabled = true; + const saveIcon = saveOrderButton.querySelector(".save-icon"); + const spinner = saveOrderButton.querySelector(".save-spinner"); + saveIcon?.classList.toggle("d-none"); + spinner?.classList.toggle("d-none"); + } + + const headers = new Headers(); + headers.append("Content-Type", "application/json"); + fetch(saveUrl, { + credentials: "include", + body: JSON.stringify(contactsSortable.toArray()), + headers, + method: "POST", + }) + .then((response) => { + if (response.ok) { + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + const saveIcon = + saveOrderButton.querySelector(".save-icon"); + const spinner = + saveOrderButton.querySelector(".save-spinner"); + saveIcon?.classList.toggle("d-none"); + spinner?.classList.toggle("d-none"); + } + } else { + showSaveError(); + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + saveOrderButton.disabled = false; + const saveIcon = + saveOrderButton.querySelector(".save-icon"); + const spinner = + saveOrderButton.querySelector(".save-spinner"); + saveIcon?.classList.toggle("d-none"); + spinner?.classList.toggle("d-none"); + } + throw Error( + `Failed to save contacts order. Response status: ${response.status}, statusText: ${response.statusText}` + ); + } + }) + .catch((error) => { + showSaveError(); + for (let i = 0; i < saveOrderButtons.length; i++) { + const saveOrderButton: HTMLButtonElement = saveOrderButtons[ + i + ] as HTMLButtonElement; + saveOrderButton.disabled = false; + const saveIcon = saveOrderButton.querySelector(".save-icon"); + const spinner = saveOrderButton.querySelector(".save-spinner"); + saveIcon?.classList.toggle("d-none"); + spinner?.classList.toggle("d-none"); + } + throw new Error(`Failed to save contacts order: ${error}`); + }); +} + +function showGeneralError(): void { + const alertTemplate = document.querySelector( + "#scidepartment-contacts-sort-error-general" + ) as HTMLTemplateElement; + const alert = alertTemplate.content.cloneNode(true) as Element; + + const container = document.querySelector("#messages"); + if (container) { + container.appendChild(alert); + } +} + +function showSaveError(): void { + const alertTemplate = document.querySelector( + "#scidepartment-contacts-sort-error-save" + ) as HTMLTemplateElement; + const alert = alertTemplate.content.cloneNode(true) as Element; + + const container = document.querySelector("#messages"); + if (container) { + container.appendChild(alert); + } +} + diff --git a/sci-types-department/tsconfig.json b/sci-types-department/tsconfig.json new file mode 100644 index 0000000..8f36d06 --- /dev/null +++ b/sci-types-department/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "declaration": true, + "lib": [ + "DOM", + "ES2016" + ], + "module": "commonjs", + "moduleResolution": "node", + "outDir": "target/generated-resources/assets/@scidepartment", + "sourceMap": true, + "strict": true, + "target": "ES6" + }, + "include": [ + "src/main/typescript/**/*" + ] + } + \ No newline at end of file diff --git a/sci-types-department/webpack.config.js b/sci-types-department/webpack.config.js new file mode 100644 index 0000000..5dee535 --- /dev/null +++ b/sci-types-department/webpack.config.js @@ -0,0 +1,23 @@ +module.exports = { + mode: "development", + devtool: "source-map", + optimization: { + chunkIds: false + }, + entry: { + "scidepartment-contacts": "./src/main/typescript/scidepartment-contacts.ts" + }, + output: { + filename: "[name].js", + path: __dirname + "/target/generated-resources/assets/@scidepartment" + }, + resolve: { + extensions: [".tsx", ".ts", ".js", ".json"] + }, + module: { + rules: [ + // all files with a '.ts' or '.tsx' extension will be handled by 'ts-loader' + { test: /\.tsx?$/, use: ["ts-loader"], exclude: /node_modules/ } + ] + } +} \ No newline at end of file diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java index 1186f54..ee1e076 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java @@ -30,7 +30,7 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*; * * @author Jens Pelzetter */ -@Entity +@Entity(name = "ProjectContact") @Audited @Table(name = "PROJECT_CONTACTS", schema = DB_SCHEMA) @JsonIdentityInfo( diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java index d0ab075..e22b97f 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java @@ -32,7 +32,7 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*; * * @author Jens Pelzetter */ -@Entity +@Entity(name = "PROJECT_MEMBERSHIP") @Audited @Table(name = "PROJECT_MEMBERSHIPS", schema = DB_SCHEMA) @JsonIdentityInfo( diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProject.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProject.java index 7fc269a..512b534 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProject.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProject.java @@ -7,7 +7,6 @@ package org.scientificcms.contenttypes.sciproject; import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import javax.persistence.Entity; @@ -89,7 +88,7 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*; ), @NamedQuery( name = "SciProject.findByMember", - query = "SELECT p FROM SciProject p JOIN Membership m " + query = "SELECT p FROM SciProject p JOIN p.members m " + "WHERE m.member = :member" ) }) diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectConfig.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectConfig.java index 733a819..5ce4336 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectConfig.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectConfig.java @@ -23,7 +23,7 @@ public class SciProjectConfig { @Setting private String memberRolesBundleName - = "org.scientificcms.contenttypes.sciproject.MemberRoles"; + = "org.scientificcms.contenttypes.sciproject.DefaultMemberRoles"; @Setting private boolean enableSponsor = true; diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectMananger.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectMananger.java index a005391..e84ce57 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectMananger.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectMananger.java @@ -9,7 +9,6 @@ import org.librecms.assets.ContactableEntity; import org.librecms.assets.Organization; import org.librecms.assets.Person; import org.librecms.contentsection.ContentItemRepository; -import org.librecms.ui.contentsections.ContentSectionsUi; import java.io.Serializable; import java.util.Objects; diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectRepository.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectRepository.java index 030a9b1..8420cfb 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectRepository.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectRepository.java @@ -11,7 +11,6 @@ import org.librecms.contentsection.ContentItemRepository; import java.io.Serializable; import java.time.LocalDate; import java.util.List; -import java.util.Optional; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectContactTypes.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectContactTypes.java new file mode 100644 index 0000000..fad252e --- /dev/null +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectContactTypes.java @@ -0,0 +1,29 @@ +package org.scientificcms.contenttypes.sciproject.ui; + +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.ui.AbstractMessagesBean; +import org.scientificcms.contenttypes.sciproject.SciProjectConfig; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciProjectContactTypes") +public class SciProjectContactTypes extends AbstractMessagesBean { + + @Inject + private ConfigurationManager confManager; + + @Override + protected String getMessageBundle() { + return confManager + .findConfiguration(SciProjectConfig.class) + .getContactTypesBundleName(); + } + +} diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionStepService.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionStepService.java index ae66eac..35f9e92 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionStepService.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectDescriptionStepService.java @@ -76,7 +76,7 @@ public class SciProjectDescriptionStepService { ) ); - if ((document instanceof SciProject)) { + if (!(document instanceof SciProject)) { throw new BadRequestException( String.format( "Document %s is not a %s.", diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectRoles.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectRoles.java new file mode 100644 index 0000000..d99a155 --- /dev/null +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/ui/SciProjectRoles.java @@ -0,0 +1,29 @@ +package org.scientificcms.contenttypes.sciproject.ui; + +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.ui.AbstractMessagesBean; +import org.scientificcms.contenttypes.sciproject.SciProjectConfig; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SciProjectRoles") +public class SciProjectRoles extends AbstractMessagesBean { + + @Inject + private ConfigurationManager confManager; + + @Override + protected String getMessageBundle() { + return confManager + .findConfiguration(SciProjectConfig.class) + .getMemberRolesBundleName(); + } + +} diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/view.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/view.xhtml index 346d2ca..15e6423 100644 --- a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/view.xhtml +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/description/view.xhtml @@ -31,6 +31,7 @@ + diff --git a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/sciproject-description.xhtml b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/sciproject-description.xhtml index ce62f3e..de9fcd5 100644 --- a/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/sciproject-description.xhtml +++ b/sci-types-project/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/sciproject/ui/sciproject-description.xhtml @@ -18,13 +18,13 @@ #{SciProjectMessageBundle.getMessage('description_step.errors.contactable_not_found', [contactableNotFound])} - + - +