- prettier formatting
All checks were successful
CI Pipeline / japa-tests (push) Successful in 51s

- npm updates
- new SearchMap.vue component
This commit is contained in:
Kaimbacher 2023-10-31 15:38:43 +01:00
parent 7bc9f90cca
commit a7142f694f
74 changed files with 3360 additions and 3577 deletions

View File

@ -19,15 +19,11 @@
"./start/kernel",
{
"file": "./start/inertia",
"environment": [
"web"
]
"environment": ["web"]
},
{
"file": "./start/validator",
"environment": [
"web"
]
"environment": ["web"]
}
],
"providers": [
@ -53,21 +49,15 @@
"reloadServer": false
}
],
"aceProviders": [
"@adonisjs/repl"
],
"aceProviders": ["@adonisjs/repl"],
"tests": {
"suites": [
{
"name": "functional",
"files": [
"tests/functional/**/*.spec(.ts|.js)"
],
"files": ["tests/functional/**/*.spec(.ts|.js)"],
"timeout": 60000
}
]
},
"testProviders": [
"@japa/preset-adonis/TestsProvider"
]
"testProviders": ["@japa/preset-adonis/TestsProvider"]
}

View File

@ -1,24 +1,14 @@
{
"extends": [
"plugin:adonis/typescriptApp",
"prettier"
],
"plugins": [
"prettier"
],
"extends": ["plugin:adonis/typescriptApp", "prettier"],
"plugins": ["prettier"],
"rules": {
"prettier/prettier": [
"error",
{ "singleQuote": true }
],
"prettier/prettier": ["error", { "singleQuote": true }],
"@typescript-eslint/indent": ["error", 4, { "ignoredNodes": ["PropertyDefinition", "TSUnionType"] }],
"@typescript-eslint/naming-convention": [
"warn",
{
"selector": "interface",
"format": [
"PascalCase"
],
"format": ["PascalCase"],
"custom": {
"regex": "^I[A-Z]",
"match": false

View File

@ -28,7 +28,6 @@ jobs:
# Set health checks to wait until postgres has started
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps:
# this will check out the current branch (https://github.com/actions/checkout#Push-a-commit-using-the-built-in-token)
- name: 1 Check out repository code

View File

@ -7,10 +7,17 @@
},
"commandPath": "./commands/IndexDatasets",
"commandName": "index:datasets",
"description": "",
"description": "Index datasets based on publish_id",
"args": [],
"aliases": [],
"flags": []
"flags": [
{
"name": "publish-id",
"propertyName": "publish_id",
"type": "number",
"alias": "p"
}
]
},
"validate:checksum": {
"settings": {

View File

@ -9,7 +9,7 @@ import { transform } from 'saxon-js';
import { Client } from '@opensearch-project/opensearch';
const opensearchNode = process.env.OPENSEARCH_HOST || 'localhost';
const client = new Client({ node: `http://${opensearchNode}:9200` }); // replace with your OpenSearch endpoint
const client = new Client({ node: `http://${opensearchNode}` }); // replace with your OpenSearch endpoint
export default class IndexDatasets extends BaseCommand {
public static commandName = 'index:datasets';
@ -87,7 +87,7 @@ export default class IndexDatasets extends BaseCommand {
});
Logger.info(`dataset with publish_id ${dataset.publish_id} successfully indexed`);
} catch (error) {
Logger.error(`An error occurred while uindexing datsaet with publish_id ${dataset.publish_id}.`);
Logger.error(`An error occurred while indexing datsaet with publish_id ${dataset.publish_id}.`);
}
}

621
package-lock.json generated
View File

@ -2682,9 +2682,9 @@
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz",
"integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==",
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@ -2826,9 +2826,9 @@
"dev": true
},
"node_modules/@inertiajs/core": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.0.12.tgz",
"integrity": "sha512-N9RBmkL7p6N81NT4pBJpU6CmLqO1/VrTdVjIoEjnOpqTjNJnX6Zyq4j8ld2tqLDEd7FZ2tITY30AV1ncvI7B6g==",
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.0.13.tgz",
"integrity": "sha512-xPvogbRgAXbogP16EBnGduEmVtImdncEBNQF9etRFF5Ne2nrJafeFgM0FZHqsSqCDvA4jjk8b8Ezt6gZRPK9hg==",
"dependencies": {
"axios": "^1.2.0",
"deepmerge": "^4.0.0",
@ -2837,9 +2837,9 @@
}
},
"node_modules/@inertiajs/core/node_modules/axios": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
"integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
"integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
@ -2857,11 +2857,11 @@
}
},
"node_modules/@inertiajs/vue3": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.0.12.tgz",
"integrity": "sha512-ycMtiCequV/IyPhzXQAnS0uFXTBVkmaXqygAADrLNtkLczGqpCuazULXp3lIArJfotjtx10kEQ8ojTHcQ4bg1g==",
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.0.13.tgz",
"integrity": "sha512-KtUZBP0qRjAHX+ZKpBRFrAwwxUpq51eNhfxxp8A7NAn0OpajfQB8cwVkB4368JGOdjkGFLhDJkMpzfxe0qlPPg==",
"dependencies": {
"@inertiajs/core": "1.0.12",
"@inertiajs/core": "1.0.13",
"lodash.clonedeep": "^4.5.0",
"lodash.isequal": "^4.5.0"
},
@ -3964,9 +3964,9 @@
}
},
"node_modules/@types/estree": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz",
"integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==",
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz",
"integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==",
"dev": true,
"peer": true
},
@ -4122,11 +4122,20 @@
"dev": true
},
"node_modules/@types/node": {
"version": "20.8.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz",
"integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==",
"version": "20.8.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz",
"integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==",
"dependencies": {
"undici-types": "~5.25.1"
"undici-types": "~5.26.4"
}
},
"node_modules/@types/node-forge": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz",
"integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/pino": {
@ -4545,36 +4554,36 @@
"dev": true
},
"node_modules/@vue/compiler-core": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.6.tgz",
"integrity": "sha512-2JNjemwaNwf+MkkatATVZi7oAH1Hx0B04DdPH3ZoZ8vKC1xZVP7nl4HIsk8XYd3r+/52sqqoz9TWzYc3yE9dqA==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz",
"integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==",
"dependencies": {
"@babel/parser": "^7.23.0",
"@vue/shared": "3.3.6",
"@vue/shared": "3.3.7",
"estree-walker": "^2.0.2",
"source-map-js": "^1.0.2"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.6.tgz",
"integrity": "sha512-1MxXcJYMHiTPexjLAJUkNs/Tw2eDf2tY3a0rL+LfuWyiKN2s6jvSwywH3PWD8bKICjfebX3GWx2Os8jkRDq3Ng==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz",
"integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==",
"dependencies": {
"@vue/compiler-core": "3.3.6",
"@vue/shared": "3.3.6"
"@vue/compiler-core": "3.3.7",
"@vue/shared": "3.3.7"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.6.tgz",
"integrity": "sha512-/Kms6du2h1VrXFreuZmlvQej8B1zenBqIohP0690IUBkJjsFvJxY0crcvVRJ0UhMgSR9dewB+khdR1DfbpArJA==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz",
"integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==",
"dependencies": {
"@babel/parser": "^7.23.0",
"@vue/compiler-core": "3.3.6",
"@vue/compiler-dom": "3.3.6",
"@vue/compiler-ssr": "3.3.6",
"@vue/reactivity-transform": "3.3.6",
"@vue/shared": "3.3.6",
"@vue/compiler-core": "3.3.7",
"@vue/compiler-dom": "3.3.7",
"@vue/compiler-ssr": "3.3.7",
"@vue/reactivity-transform": "3.3.7",
"@vue/shared": "3.3.7",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.5",
"postcss": "^8.4.31",
@ -4582,12 +4591,12 @@
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.6.tgz",
"integrity": "sha512-QTIHAfDCHhjXlYGkUg5KH7YwYtdUM1vcFl/FxFDlD6d0nXAmnjizka3HITp8DGudzHndv2PjKVS44vqqy0vP4w==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz",
"integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==",
"dependencies": {
"@vue/compiler-dom": "3.3.6",
"@vue/shared": "3.3.6"
"@vue/compiler-dom": "3.3.7",
"@vue/shared": "3.3.7"
}
},
"node_modules/@vue/devtools-api": {
@ -4597,41 +4606,41 @@
"dev": true
},
"node_modules/@vue/reactivity": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.6.tgz",
"integrity": "sha512-gtChAumfQz5lSy5jZXfyXbKrIYPf9XEOrIr6rxwVyeWVjFhJwmwPLtV6Yis+M9onzX++I5AVE9j+iPH60U+B8Q==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz",
"integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==",
"dependencies": {
"@vue/shared": "3.3.6"
"@vue/shared": "3.3.7"
}
},
"node_modules/@vue/reactivity-transform": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.6.tgz",
"integrity": "sha512-RlJl4dHfeO7EuzU1iJOsrlqWyJfHTkJbvYz/IOJWqu8dlCNWtxWX377WI0VsbAgBizjwD+3ZjdnvSyyFW1YVng==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz",
"integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==",
"dependencies": {
"@babel/parser": "^7.23.0",
"@vue/compiler-core": "3.3.6",
"@vue/shared": "3.3.6",
"@vue/compiler-core": "3.3.7",
"@vue/shared": "3.3.7",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.5"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.6.tgz",
"integrity": "sha512-qp7HTP1iw1UW2ZGJ8L3zpqlngrBKvLsDAcq5lA6JvEXHmpoEmjKju7ahM9W2p/h51h0OT5F2fGlP/gMhHOmbUA==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz",
"integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==",
"dependencies": {
"@vue/reactivity": "3.3.6",
"@vue/shared": "3.3.6"
"@vue/reactivity": "3.3.7",
"@vue/shared": "3.3.7"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.6.tgz",
"integrity": "sha512-AoX3Cp8NqMXjLbIG9YR6n/pPLWE9TiDdk6wTJHFnl2GpHzDFH1HLBC9wlqqQ7RlnvN3bVLpzPGAAH00SAtOxHg==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz",
"integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==",
"dependencies": {
"@vue/runtime-core": "3.3.6",
"@vue/shared": "3.3.6",
"@vue/runtime-core": "3.3.7",
"@vue/shared": "3.3.7",
"csstype": "^3.1.2"
}
},
@ -4641,21 +4650,21 @@
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
},
"node_modules/@vue/server-renderer": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.6.tgz",
"integrity": "sha512-kgLoN43W4ERdZ6dpyy+gnk2ZHtcOaIr5Uc/WUP5DRwutgvluzu2pudsZGoD2b7AEJHByUVMa9k6Sho5lLRCykw==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz",
"integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==",
"dependencies": {
"@vue/compiler-ssr": "3.3.6",
"@vue/shared": "3.3.6"
"@vue/compiler-ssr": "3.3.7",
"@vue/shared": "3.3.7"
},
"peerDependencies": {
"vue": "3.3.6"
"vue": "3.3.7"
}
},
"node_modules/@vue/shared": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.6.tgz",
"integrity": "sha512-Xno5pEqg8SVhomD0kTSmfh30ZEmV/+jZtyh39q6QflrjdJCXah5lrnOLi9KB6a5k5aAHXMXjoMnxlzUkCNfWLQ=="
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz",
"integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg=="
},
"node_modules/@vue/tsconfig": {
"version": "0.4.0",
@ -4914,9 +4923,9 @@
}
},
"node_modules/acorn": {
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
"version": "8.11.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
"bin": {
"acorn": "bin/acorn"
},
@ -4997,9 +5006,9 @@
}
},
"node_modules/acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz",
"integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==",
"engines": {
"node": ">=0.4.0"
}
@ -5816,13 +5825,13 @@
}
},
"node_modules/babel-plugin-polyfill-corejs3": {
"version": "0.8.5",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz",
"integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==",
"version": "0.8.6",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz",
"integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==",
"dev": true,
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.4.3",
"core-js-compat": "^3.32.2"
"core-js-compat": "^3.33.1"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@ -6290,9 +6299,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001553",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz",
"integrity": "sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==",
"version": "1.0.30001559",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz",
"integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==",
"dev": true,
"funding": [
{
@ -6523,75 +6532,17 @@
"node": ">=0.10.0"
}
},
"node_modules/class-utils/node_modules/is-accessor-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"dependencies": {
"is-buffer": "^1.1.5"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/class-utils/node_modules/is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"dependencies": {
"is-buffer": "^1.1.5"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/class-utils/node_modules/is-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
"dev": true,
"dependencies": {
"is-accessor-descriptor": "^0.1.6",
"is-data-descriptor": "^0.1.4",
"kind-of": "^5.0.0"
"is-accessor-descriptor": "^1.0.1",
"is-data-descriptor": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/class-utils/node_modules/kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
"node": ">= 0.4"
}
},
"node_modules/clean-stack": {
@ -6958,9 +6909,9 @@
}
},
"node_modules/core-js-compat": {
"version": "3.33.1",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz",
"integrity": "sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==",
"version": "3.33.2",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz",
"integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==",
"dev": true,
"dependencies": {
"browserslist": "^4.22.1"
@ -8152,9 +8103,9 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"node_modules/electron-to-chromium": {
"version": "1.4.563",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz",
"integrity": "sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==",
"version": "1.4.571",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.571.tgz",
"integrity": "sha512-Sc+VtKwKCDj3f/kLBjdyjMpNzoZsU6WuL/wFb6EH8USmHEcebxRXcRrVpOpayxd52tuey4RUDpUsw5OS5LhJqg==",
"dev": true
},
"node_modules/emittery": {
@ -8751,66 +8702,17 @@
"node": ">=0.10.0"
}
},
"node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"dependencies": {
"is-buffer": "^1.1.5"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/expand-brackets/node_modules/is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"dependencies": {
"is-buffer": "^1.1.5"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/expand-brackets/node_modules/is-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
"dev": true,
"dependencies": {
"is-accessor-descriptor": "^0.1.6",
"is-data-descriptor": "^0.1.4",
"kind-of": "^5.0.0"
"is-accessor-descriptor": "^1.0.1",
"is-data-descriptor": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
"node": ">= 0.4"
}
},
"node_modules/expand-brackets/node_modules/is-extendable": {
@ -8822,15 +8724,6 @@
"node": ">=0.10.0"
}
},
"node_modules/expand-brackets/node_modules/kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/expand-brackets/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -10428,15 +10321,15 @@
}
},
"node_modules/is-accessor-descriptor": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
"integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
"dev": true,
"dependencies": {
"kind-of": "^6.0.0"
"hasown": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
"node": ">= 0.10"
}
},
"node_modules/is-arrayish": {
@ -10474,29 +10367,28 @@
}
},
"node_modules/is-data-descriptor": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
"integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
"dev": true,
"dependencies": {
"kind-of": "^6.0.0"
"hasown": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
"node": ">= 0.4"
}
},
"node_modules/is-descriptor": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
"integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
"dev": true,
"dependencies": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
"kind-of": "^6.0.2"
"is-accessor-descriptor": "^1.0.1",
"is-data-descriptor": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
"node": ">= 0.4"
}
},
"node_modules/is-docker": {
@ -11150,9 +11042,9 @@
}
},
"node_modules/jiti": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz",
"integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==",
"version": "1.21.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
"integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
"dev": true,
"bin": {
"jiti": "bin/jiti.js"
@ -12423,51 +12315,17 @@
"node": ">=0.10.0"
}
},
"node_modules/object-copy/node_modules/is-accessor-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-copy/node_modules/is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-copy/node_modules/is-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
"dev": true,
"dependencies": {
"is-accessor-descriptor": "^0.1.6",
"is-data-descriptor": "^0.1.4",
"kind-of": "^5.0.0"
"is-accessor-descriptor": "^1.0.1",
"is-data-descriptor": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
"node": ">= 0.4"
}
},
"node_modules/object-copy/node_modules/kind-of": {
@ -14206,9 +14064,9 @@
}
},
"node_modules/punycode": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"engines": {
"node": ">=6"
@ -14798,9 +14656,9 @@
}
},
"node_modules/saxon-js/node_modules/axios": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
"integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
"integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
@ -14878,11 +14736,12 @@
"dev": true
},
"node_modules/selfsigned": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
"integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
"integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
"dev": true,
"dependencies": {
"@types/node-forge": "^1.3.0",
"node-forge": "^1"
},
"engines": {
@ -15383,66 +15242,17 @@
"node": ">=0.10.0"
}
},
"node_modules/snapdragon/node_modules/is-accessor-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"dependencies": {
"is-buffer": "^1.1.5"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/snapdragon/node_modules/is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"dependencies": {
"is-buffer": "^1.1.5"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/snapdragon/node_modules/is-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
"dev": true,
"dependencies": {
"is-accessor-descriptor": "^0.1.6",
"is-data-descriptor": "^0.1.4",
"kind-of": "^5.0.0"
"is-accessor-descriptor": "^1.0.1",
"is-data-descriptor": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
"node": ">= 0.4"
}
},
"node_modules/snapdragon/node_modules/is-extendable": {
@ -15454,15 +15264,6 @@
"node": ">=0.10.0"
}
},
"node_modules/snapdragon/node_modules/kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/snapdragon/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -15670,75 +15471,17 @@
"node": ">=0.10.0"
}
},
"node_modules/static-extend/node_modules/is-accessor-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"dependencies": {
"is-buffer": "^1.1.5"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/static-extend/node_modules/is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
"dev": true,
"dependencies": {
"kind-of": "^3.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
"dev": true,
"dependencies": {
"is-buffer": "^1.1.5"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/static-extend/node_modules/is-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
"dev": true,
"dependencies": {
"is-accessor-descriptor": "^0.1.6",
"is-data-descriptor": "^0.1.4",
"kind-of": "^5.0.0"
"is-accessor-descriptor": "^1.0.1",
"is-data-descriptor": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/static-extend/node_modules/kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
"node": ">= 0.4"
}
},
"node_modules/statuses": {
@ -16204,9 +15947,9 @@
}
},
"node_modules/tailwindcss": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
"integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz",
"integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==",
"dev": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
@ -16214,10 +15957,10 @@
"chokidar": "^3.5.3",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.12",
"fast-glob": "^3.3.0",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.18.2",
"jiti": "^1.19.1",
"lilconfig": "^2.1.0",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
@ -16269,9 +16012,9 @@
}
},
"node_modules/terser": {
"version": "5.22.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz",
"integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==",
"version": "5.23.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.23.0.tgz",
"integrity": "sha512-Iyy83LN0uX9ZZLCX4Qbu5JiHiWjOCTwrmM9InWOzVeM++KNWEsqV4YgN9U9E8AlohQ6Gs42ztczlWOG/lwDAMA==",
"dev": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@ -16767,9 +16510,9 @@
}
},
"node_modules/undici-types": {
"version": "5.25.3",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz",
"integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA=="
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
@ -17064,15 +16807,15 @@
}
},
"node_modules/vue": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.3.6.tgz",
"integrity": "sha512-jJIDETeWJnoY+gfn4ZtMPMS5KtbP4ax+CT4dcQFhTnWEk8xMupFyQ0JxL28nvT/M4+p4a0ptxaV2WY0LiIxvRg==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz",
"integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==",
"dependencies": {
"@vue/compiler-dom": "3.3.6",
"@vue/compiler-sfc": "3.3.6",
"@vue/runtime-dom": "3.3.6",
"@vue/server-renderer": "3.3.6",
"@vue/shared": "3.3.6"
"@vue/compiler-dom": "3.3.7",
"@vue/compiler-sfc": "3.3.7",
"@vue/runtime-dom": "3.3.7",
"@vue/server-renderer": "3.3.7",
"@vue/shared": "3.3.7"
},
"peerDependencies": {
"typescript": "*"
@ -17093,9 +16836,9 @@
}
},
"node_modules/vue-loader": {
"version": "17.3.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.3.0.tgz",
"integrity": "sha512-VUURABiN0TIUz0yvJJ/V/rZjGUh10JZtD+IDI5bXFslzFi9mV6ebKkPzoqiSi8e0vh8Ip7JHJx+I0AzAG0KsCA==",
"version": "17.3.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.3.1.tgz",
"integrity": "sha512-nmVu7KU8geOyzsStyyaxID/uBGDMS8BkPXb6Lu2SNkMawriIbb+hYrNtgftHMKxOSkjjjTF5OSSwPo3KP59egg==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0",
@ -17686,9 +17429,9 @@
}
},
"node_modules/xslt3/node_modules/axios": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
"integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
"integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
"dev": true,
"dependencies": {
"follow-redirects": "^1.15.0",

View File

@ -117,7 +117,6 @@
"publisher_place": {
"type": "text"
},
"geo_location": {
"type": "geo_shape",
"tree": "quadtree",
@ -136,8 +135,6 @@
"type": "float"
},
"status": {
"type": "keyword"
}

View File

@ -3,6 +3,7 @@
Welcome to the Tethys Research Repository Backend System! This is the backend component responsible for managing datasets, users, and the core functionality of the Tethys Data Research Repository.
## Table of Contents
- [Getting Started](#getting-started)
- [Prerequisites](#prerequisites)
- [Installation](#installation)
@ -29,3 +30,4 @@ Before you begin, ensure you have met the following requirements:
```bash
git clone https://gitea.geologie.ac.at/geolba/tethys.backend.git
```

View File

@ -1,11 +1,8 @@
<script setup>
import { Link } from "@inertiajs/vue3"
import BaseButton from "@/Components/BaseButton.vue"
import BaseButtons from "@/Components/BaseButtons.vue"
import {
mdiSquareEditOutline,
mdiTrashCan,
} from "@mdi/js"
import { Link } from '@inertiajs/vue3';
import BaseButton from '@/Components/BaseButton.vue';
import BaseButtons from '@/Components/BaseButtons.vue';
import { mdiSquareEditOutline, mdiTrashCan } from '@mdi/js';
const props = defineProps({
item: {
@ -22,9 +19,9 @@ const props = defineProps({
},
level: {
type: Number,
default: 0
default: 0,
},
})
});
</script>
<template>
@ -40,8 +37,13 @@ const props = defineProps({
</td>
<td v-if="can.edit || can.delete" class="before:hidden lg:w-1 whitespace-nowrap">
<BaseButtons type="justify-start lg:justify-end" no-wrap>
<BaseButton v-if="can.edit" :route-name="route('menu.item.edit', { menu: menu.id, item: item.id })"
color="info" :icon="mdiSquareEditOutline" small />
<BaseButton
v-if="can.edit"
:route-name="route('menu.item.edit', { menu: menu.id, item: item.id })"
color="info"
:icon="mdiSquareEditOutline"
small
/>
<BaseButton v-if="can.delete" color="danger" :icon="mdiTrashCan" small @click="destroy(item.id)" />
</BaseButtons>
</td>

View File

@ -59,24 +59,33 @@ total:
<template>
<!-- <nav v-if="data.links.length > 3" -->
<nav v-if="data.total > 3" role="navigation" aria-label="Pagination Navigation"
class="flex items-center justify-between">
<nav v-if="data.total > 3" role="navigation" aria-label="Pagination Navigation" class="flex items-center justify-between">
<div class="flex justify-between flex-1 sm:hidden">
<span v-if="data.current_page <= 1"
class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md">
<span
v-if="data.current_page <= 1"
class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md"
>
Previous
</span>
<Link v-else :href="data.previous_page_url"
class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
<Link
v-else
:href="data.previous_page_url"
class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150"
>
Previous
</Link>
<Link v-if="data.current_page < data.last_page" :href="data.next_page_url"
class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
<Link
v-if="data.current_page < data.last_page"
:href="data.next_page_url"
class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150"
>
Next
</Link>
<span v-else
class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md">
<span
v-else
class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md"
>
Next
</span>
</div>
@ -99,23 +108,32 @@ total:
<span v-if="props.data.current_page <= 1" aria-disabled="true" aria-label="Previous">
<span
class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default rounded-l-md leading-5"
aria-hidden="true">
aria-hidden="true"
>
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd"
<path
fill-rule="evenodd"
d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
clip-rule="evenodd" />
clip-rule="evenodd"
/>
</svg>
</span>
</span>
<!-- <Link v-else :href="data.previous_page_url" rel="prev" -->
<Link v-else :href="prevPageLink" rel="prev"
<Link
v-else
:href="prevPageLink"
rel="prev"
class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-l-md leading-5 hover:text-gray-400 focus:z-10 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150"
aria-label="Previous">
aria-label="Previous"
>
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd"
<path
fill-rule="evenodd"
d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
clip-rule="evenodd" />
clip-rule="evenodd"
/>
</svg>
</Link>
@ -133,24 +151,33 @@ total:
</template>
</template> -->
<Link v-if="props.data.current_page < props.data.last_page" :href="nextPageLink" rel="next"
<Link
v-if="props.data.current_page < props.data.last_page"
:href="nextPageLink"
rel="next"
class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-r-md leading-5 hover:text-gray-400 focus:z-10 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150"
aria-label="Next">
aria-label="Next"
>
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd"
<path
fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd" />
clip-rule="evenodd"
/>
</svg>
</Link>
<!-- else disabled link -->
<span v-else aria-disabled="true" aria-label="Next">
<span
class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default rounded-r-md leading-5"
aria-hidden="true">
aria-hidden="true"
>
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd"
<path
fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd" />
clip-rule="evenodd"
/>
</svg>
</span>
</span>

View File

@ -51,24 +51,10 @@ const sortLink = computed(() => {
{{ label }}
</Link>
<div class="flex flex-col">
<svg
class="inline-block"
xmlns="http://www.w3.org/2000/svg"
width="15px"
height="15px"
viewBox="0 0 15 15"
fill="none"
>
<svg class="inline-block" xmlns="http://www.w3.org/2000/svg" width="15px" height="15px" viewBox="0 0 15 15" fill="none">
<path d="M7.5 3L15 11H0L7.5 3Z" :fill="upFill" />
</svg>
<svg
class="inline-block"
xmlns="http://www.w3.org/2000/svg"
width="15px"
height="15px"
viewBox="0 0 15 15"
fill="none"
>
<svg class="inline-block" xmlns="http://www.w3.org/2000/svg" width="15px" height="15px" viewBox="0 0 15 15" fill="none">
<path d="M7.49988 12L-0.00012207 4L14.9999 4L7.49988 12Z" :fill="downFill" />
</svg>
</div>

View File

@ -3,7 +3,7 @@
// import { usePage } from '@inertiajs/vue3'
// import { usePage } from '@inertiajs/inertia-vue3';
import { LayoutService } from '@/Stores/layout';
import menu from '@/menu'
import menu from '@/menu';
import AsideMenuLayer from '@/Components/AsideMenuLayer.vue';
import OverlayLayer from '@/Components/OverlayLayer.vue';

View File

@ -18,7 +18,7 @@ const props = defineProps({
isDropdownList: Boolean,
});
const itemRoute = computed(() => (props.item && props.item.route ? stardust.route(props.item.route): ''));
const itemRoute = computed(() => (props.item && props.item.route ? stardust.route(props.item.route) : ''));
// const isCurrentRoute = computed(() => (props.item && props.item.route ? stardust.isCurrent(props.item.route): false));
const itemHref = computed(() => (props.item && props.item.href ? props.item.href : ''));
@ -49,46 +49,56 @@ const activeInactiveStyle = computed(() => {
if (props.item.route && stardust.isCurrent(props.item.route)) {
// console.log(props.item.route);
return styleService.asideMenuItemActiveStyle;
}
else {
} else {
return null;
}
});
const is = computed(() => {
if (props.item.href) {
return 'a'
return 'a';
}
if (props.item.route) {
return Link
return Link;
}
return 'div'
})
return 'div';
});
// props.routeName && stardust.isCurrent(props.routeName) ? props.activeColor : null
</script>
<!-- :target="props.item.target ?? null" -->
<template>
<li>
<!-- <component :is="itemHref ? 'div' : Link" :href="itemHref ? itemHref : itemRoute" -->
<component :is="is" :href="itemRoute ? stardust.route(props.item.route) : props.item.href"
class="flex cursor-pointer dark:text-slate-300 dark:hover:text-white" :class="componentClass"
@click="menuClick" v-bind:target="props.item.target ?? null">
<BaseIcon v-if="item.icon" :path="item.icon" class="flex-none" :class="activeInactiveStyle" w="w-16"
:size="18" />
<component
:is="is"
:href="itemRoute ? stardust.route(props.item.route) : props.item.href"
class="flex cursor-pointer dark:text-slate-300 dark:hover:text-white"
:class="componentClass"
@click="menuClick"
v-bind:target="props.item.target ?? null"
>
<BaseIcon v-if="item.icon" :path="item.icon" class="flex-none" :class="activeInactiveStyle" w="w-16" :size="18" />
<span class="grow text-ellipsis line-clamp-1" :class="activeInactiveStyle">
{{ item.label }}
</span>
<!-- plus icon for expanding sub menu -->
<BaseIcon v-if="hasDropdown" :path="isDropdownActive ? mdiMinus : mdiPlus" class="flex-none"
:class="activeInactiveStyle" w="w-12" @click.prevent="menuClick"/>
<BaseIcon
v-if="hasDropdown"
:path="isDropdownActive ? mdiMinus : mdiPlus"
class="flex-none"
:class="activeInactiveStyle"
w="w-12"
@click.prevent="menuClick"
/>
</component>
<AsideMenuList v-if="hasDropdown" :menu="item.children" :class="[
styleService.asideMenuDropdownStyle,
isDropdownActive ? 'block dark:bg-slate-800/50' : 'hidden',
]" is-dropdown-list />
<AsideMenuList
v-if="hasDropdown"
:menu="item.children"
:class="[styleService.asideMenuDropdownStyle, isDropdownActive ? 'block dark:bg-slate-800/50' : 'hidden']"
is-dropdown-list
/>
</li>
</template>

View File

@ -1,5 +1,5 @@
<script setup>
import { router } from '@inertiajs/vue3'
import { router } from '@inertiajs/vue3';
// import { Inertia } from '@inertiajs/inertia';
import { stardust } from '@eidellev/adonis-stardust/client';
import { mdiLogout, mdiClose } from '@mdi/js';
@ -13,7 +13,7 @@ import BaseIcon from '@/Components/BaseIcon.vue';
defineProps({
menu: {
type: Object,
default: () => { },
default: () => {},
},
});
@ -44,8 +44,7 @@ const menuClick = (event, item) => {
<template>
<aside id="aside" class="lg:py-2 lg:pl-2 w-60 fixed flex z-40 top-0 h-screen transition-position overflow-hidden">
<div :class="styleStore.asideStyle" class="lg:rounded-xl flex-1 flex flex-col overflow-hidden dark:bg-slate-900">
<div :class="styleStore.asideBrandStyle"
class="flex flex-row h-14 items-center justify-between dark:bg-slate-900">
<div :class="styleStore.asideBrandStyle" class="flex flex-row h-14 items-center justify-between dark:bg-slate-900">
<div class="text-center flex-1 lg:text-left lg:pl-6 xl:text-center xl:pl-0">
<b class="font-black">Menu</b>
</div>
@ -53,8 +52,10 @@ const menuClick = (event, item) => {
<BaseIcon :path="mdiClose" />
</button>
</div>
<div :class="styleStore.darkMode ? 'aside-scrollbars-[slate]' : styleStore.asideScrollbarsStyle"
class="flex-1 overflow-y-auto overflow-x-hidden">
<div
:class="styleStore.darkMode ? 'aside-scrollbars-[slate]' : styleStore.asideScrollbarsStyle"
class="flex-1 overflow-y-auto overflow-x-hidden"
>
<AsideMenuList v-bind:menu="menu" @menu-click="menuClick" />
</div>
<!-- <p class="menu-label">About</p>> -->

View File

@ -1,5 +1,5 @@
<script>
import { h, defineComponent } from 'vue'
import { h, defineComponent } from 'vue';
export default defineComponent({
name: 'BaseButtons',
@ -7,49 +7,45 @@ export default defineComponent({
noWrap: Boolean,
type: {
type: String,
default: 'justify-start'
default: 'justify-start',
},
classAddon: {
type: String,
default: 'mr-3 last:mr-0 mb-3'
default: 'mr-3 last:mr-0 mb-3',
},
mb: {
type: String,
default: '-mb-3'
}
default: '-mb-3',
},
render () {
const hasSlot = this.$slots && this.$slots.default
},
render() {
const hasSlot = this.$slots && this.$slots.default;
const parentClass = [
'flex',
'items-center',
this.type,
this.noWrap ? 'flex-nowrap' : 'flex-wrap'
]
const parentClass = ['flex', 'items-center', this.type, this.noWrap ? 'flex-nowrap' : 'flex-wrap'];
if (this.mb) {
parentClass.push(this.mb)
parentClass.push(this.mb);
}
return h(
'div',
{ class: parentClass },
hasSlot
? this.$slots.default().map(element => {
? this.$slots.default().map((element) => {
if (element && element.children && typeof element.children === 'object') {
return h(
element,
{},
element.children.map(child => {
return h(child, { class: [this.classAddon] })
}))
element.children.map((child) => {
return h(child, { class: [this.classAddon] });
}),
);
}
return h(element, { class: [this.classAddon] })
return h(element, { class: [this.classAddon] });
})
: null
)
}
})
: null,
);
},
});
</script>

View File

@ -1,12 +1,12 @@
<script setup>
const props = defineProps({
navBar: Boolean
})
navBar: Boolean,
});
</script>
<template>
<hr
:class="props.navBar ? 'hidden lg:block lg:my-0.5 dark:border-slate-700' : 'my-6 -mx-6 dark:border-slate-800'"
class="border-t border-gray-100"
>
/>
</template>

View File

@ -4,37 +4,29 @@ import { computed } from 'vue';
const props = defineProps({
path: {
type: String,
required: true
required: true,
},
w: {
type: String,
default: 'w-6'
default: 'w-6',
},
h: {
type: String,
default: 'h-6'
default: 'h-6',
},
size: {
type: [String, Number],
default: 16
}
})
default: 16,
},
});
const spanClass = computed(() => `inline-flex justify-center items-center ${props.w} ${props.h}`)
const spanClass = computed(() => `inline-flex justify-center items-center ${props.w} ${props.h}`);
</script>
<template>
<span :class="spanClass">
<svg
viewBox="0 0 24 24"
:width="size"
:height="size"
class="inline-block"
>
<path
fill="currentColor"
:d="path"
/>
<svg viewBox="0 0 24 24" :width="size" :height="size" class="inline-block">
<path fill="currentColor" :d="path" />
</svg>
</span>
</template>

View File

@ -1,61 +1,60 @@
<script setup>
import { computed } from 'vue'
import { mdiTrendingDown, mdiTrendingUp, mdiTrendingNeutral } from '@mdi/js'
import CardBox from '@/Components/CardBox.vue'
import BaseLevel from '@/Components/BaseLevel.vue'
import PillTag from '@/Components/PillTag.vue'
import UserAvatar from '@/Components/UserAvatar.vue'
import { computed } from 'vue';
import { mdiTrendingDown, mdiTrendingUp, mdiTrendingNeutral } from '@mdi/js';
import CardBox from '@/Components/CardBox.vue';
import BaseLevel from '@/Components/BaseLevel.vue';
import PillTag from '@/Components/PillTag.vue';
import UserAvatar from '@/Components/UserAvatar.vue';
const props = defineProps({
name: {
type: String,
required: true
required: true,
},
login: {
type: String,
required: false
required: false,
},
email: {
type: String,
required: false
required: false,
},
date: {
type: String,
required: false
required: false,
},
progress: {
type: Number,
default: 0
default: 0,
},
text: {
type: String,
default: null
default: null,
},
type: {
type: String,
default: null
}
})
default: null,
},
});
const pillType = computed(() => {
if (props.type) {
return props.type
return props.type;
}
if (props.progress) {
if (props.progress >= 60) {
return 'success'
return 'success';
}
if (props.progress >= 40) {
return 'warning'
return 'warning';
}
return 'danger'
return 'danger';
}
return 'info'
})
return 'info';
});
const pillIcon = computed(() => {
return {
@ -63,25 +62,19 @@ const pillIcon = computed(() => {
warning: mdiTrendingNeutral,
danger: mdiTrendingDown,
info: mdiTrendingNeutral,
}[pillType.value]
})
}[pillType.value];
});
const pillText = computed(() => props.text ?? `${props.progress}%`)
const pillText = computed(() => props.text ?? `${props.progress}%`);
</script>
<template>
<CardBox
class="mb-6 last:mb-0"
hoverable
>
<CardBox class="mb-6 last:mb-0" hoverable>
<BaseLevel>
<BaseLevel type="justify-start">
<UserAvatar
class="w-12 h-12 mr-6"
:username="props.name"
/>
<UserAvatar class="w-12 h-12 mr-6" :username="props.name" />
<div class="text-center md:text-left overflow-hidden">
<h4 class="text-xl text-ellipsis ">
<h4 class="text-xl text-ellipsis">
{{ name }}
</h4>
<p class="text-gray-500 dark:text-slate-400">
@ -90,12 +83,7 @@ const pillText = computed(() => props.text ?? `${props.progress}%`)
</p>
</div>
</BaseLevel>
<PillTag
:type="pillType"
:text="pillText"
small
:icon="pillIcon"
/>
<PillTag :type="pillType" :text="pillText" small :icon="pillIcon" />
</BaseLevel>
</CardBox>
</template>

View File

@ -30,8 +30,8 @@ const props = defineProps({
},
deleteId: {
type: Number,
default: null
}
default: null,
},
});
const emit = defineEmits(['update:modelValue', 'cancel', 'confirm']);
@ -43,13 +43,12 @@ const value = computed({
// mode = cancel or confirm
const confirmCancel = (mode) => {
value.value = false;//close
if (props.deleteId){
value.value = false; //close
if (props.deleteId) {
emit(mode, props.deleteId);
} else {
emit(mode);
}
};
const confirm = () => confirmCancel('confirm');

View File

@ -1,79 +1,70 @@
<script setup>
import { computed } from 'vue'
import { mdiCashMinus, mdiCashPlus, mdiReceipt, mdiCreditCardOutline } from '@mdi/js'
import CardBox from '@/Components/CardBox.vue'
import BaseLevel from '@/Components/BaseLevel.vue'
import PillTag from '@/Components/PillTag.vue'
import IconRounded from '@/Components/IconRounded.vue'
import { computed } from 'vue';
import { mdiCashMinus, mdiCashPlus, mdiReceipt, mdiCreditCardOutline } from '@mdi/js';
import CardBox from '@/Components/CardBox.vue';
import BaseLevel from '@/Components/BaseLevel.vue';
import PillTag from '@/Components/PillTag.vue';
import IconRounded from '@/Components/IconRounded.vue';
const props = defineProps({
amount: {
type: Number,
required: true
required: true,
},
date: {
type: String,
required: true
required: true,
},
business: {
type: String,
required: true
required: true,
},
type: {
type: String,
required: true
required: true,
},
name: {
type: String,
required: true
required: true,
},
account: {
type: String,
required: true
}
})
required: true,
},
});
const icon = computed(() => {
if (props.type === 'withdrawal') {
return {
icon: mdiCashMinus,
type: 'danger'
}
type: 'danger',
};
} else if (props.type === 'deposit') {
return {
icon: mdiCashPlus,
type: 'success'
}
type: 'success',
};
} else if (props.type === 'invoice') {
return {
icon: mdiReceipt,
type: 'warning'
}
type: 'warning',
};
}
return {
icon: mdiCreditCardOutline,
type: 'info'
}
})
type: 'info',
};
});
</script>
<template>
<CardBox
class="mb-6 last:mb-0"
hoverable
>
<CardBox class="mb-6 last:mb-0" hoverable>
<BaseLevel>
<BaseLevel type="justify-start">
<IconRounded
:icon="icon.icon"
:type="icon.type"
class="md:mr-6"
/>
<IconRounded :icon="icon.icon" :type="icon.type" class="md:mr-6" />
<div class="text-center space-y-1 md:text-left md:mr-6">
<h4 class="text-xl">
${{ amount }}
</h4>
<h4 class="text-xl">${{ amount }}</h4>
<p class="text-gray-500 dark:text-slate-400">
<b>{{ date }}</b> via {{ business }}
</p>
@ -84,11 +75,7 @@ const icon = computed(() => {
{{ name }}
</p>
<div>
<PillTag
:type="icon.type"
:text="type"
small
/>
<PillTag :type="icon.type" :text="type" small />
</div>
</div>
</BaseLevel>

View File

@ -1,46 +1,46 @@
<script setup>
import { mdiCog } from '@mdi/js'
import CardBox from '@/Components/CardBox.vue'
import NumberDynamic from '@/Components/NumberDynamic.vue'
import BaseIcon from '@/Components/BaseIcon.vue'
import BaseLevel from '@/Components/BaseLevel.vue'
import PillTagTrend from '@/Components/PillTagTrend.vue'
import BaseButton from '@/Components/BaseButton.vue'
import { mdiCog } from '@mdi/js';
import CardBox from '@/Components/CardBox.vue';
import NumberDynamic from '@/Components/NumberDynamic.vue';
import BaseIcon from '@/Components/BaseIcon.vue';
import BaseLevel from '@/Components/BaseLevel.vue';
import PillTagTrend from '@/Components/PillTagTrend.vue';
import BaseButton from '@/Components/BaseButton.vue';
defineProps({
number: {
type: Number,
default: 0
default: 0,
},
icon: {
type: String,
default: null
default: null,
},
prefix: {
type: String,
default: null
default: null,
},
suffix: {
type: String,
default: null
default: null,
},
label: {
type: String,
default: null
default: null,
},
color: {
type: String,
default: null
default: null,
},
trend: {
type: String,
default: null
default: null,
},
trendType: {
type: String,
default: null
}
})
default: null,
},
});
</script>
<template>

View File

@ -1,27 +1,19 @@
<script setup>
import { ref, watch, computed, onMounted } from 'vue'
import {
Chart,
LineElement,
PointElement,
LineController,
LinearScale,
CategoryScale,
Tooltip
} from 'chart.js'
import { ref, watch, computed, onMounted } from 'vue';
import { Chart, LineElement, PointElement, LineController, LinearScale, CategoryScale, Tooltip } from 'chart.js';
const props = defineProps({
data: {
type: Object,
required: true
}
})
required: true,
},
});
const root = ref(null)
const root = ref(null);
let chart
let chart;
Chart.register(LineElement, PointElement, LineController, LinearScale, CategoryScale, Tooltip)
Chart.register(LineElement, PointElement, LineController, LinearScale, CategoryScale, Tooltip);
onMounted(() => {
chart = new Chart(root.value, {
@ -32,29 +24,29 @@ onMounted(() => {
maintainAspectRatio: false,
scales: {
y: {
display: false
display: false,
},
x: {
display: true
}
display: true,
},
},
plugins: {
legend: {
display: false
}
}
}
})
})
display: false,
},
},
},
});
});
const chartData = computed(() => props.data)
const chartData = computed(() => props.data);
watch(chartData, data => {
watch(chartData, (data) => {
if (chart) {
chart.data = data
chart.update()
chart.data = data;
chart.update();
}
})
});
</script>
<template>

View File

@ -1,18 +1,17 @@
<script setup>
import { computed } from 'vue'
import { computed } from 'vue';
import { containerMaxW } from '@/config.js';
import BaseLevel from '@/Components/BaseLevel.vue'
import JustboilLogo from '@/Components/JustboilLogo.vue'
import BaseLevel from '@/Components/BaseLevel.vue';
import JustboilLogo from '@/Components/JustboilLogo.vue';
const year = computed(() => new Date().getFullYear())
const year = computed(() => new Date().getFullYear());
</script>
<template>
<footer class="py-2 px-6">
<BaseLevel :class="containerMaxW">
<div class="text-center md:text-left">
<b>&copy;{{ year }}, <a href="https://tethys.at/" target="_blank">
Tethys.at</a>.</b>
<b>&copy;{{ year }}, <a href="https://tethys.at/" target="_blank"> Tethys.at</a>.</b>
<!-- Get more with <a href="https://tailwind-vue.justboil.me/" target="_blank" class="text-blue-600">Premium
version</a> -->
</div>

View File

@ -4,47 +4,39 @@ import { computed } from 'vue';
const props = defineProps({
name: {
type: String,
required: true
required: true,
},
type: {
type: String,
default: 'checkbox',
validator: value => ['checkbox', 'radio', 'switch'].includes(value)
validator: (value) => ['checkbox', 'radio', 'switch'].includes(value),
},
label: {
type: String,
default: null
default: null,
},
modelValue: {
type: [Array, String, Number, Boolean],
default: null
default: null,
},
inputValue: {
type: [String, Number, Boolean],
required: true
}
})
const emit = defineEmits(['update:modelValue'])
required: true,
},
});
const emit = defineEmits(['update:modelValue']);
const computedValue = computed({
get: () => props.modelValue,
set: value => {
emit('update:modelValue', value)
}
})
const inputType = computed(() => props.type === 'radio' ? 'radio' : 'checkbox')
set: (value) => {
emit('update:modelValue', value);
},
});
const inputType = computed(() => (props.type === 'radio' ? 'radio' : 'checkbox'));
</script>
<template>
<label
:class="type"
class="mr-6 mb-3 last:mr-0"
>
<input
v-model="computedValue"
:type="inputType"
:name="name"
:value="inputValue"
>
<label :class="type" class="mr-6 mb-3 last:mr-0">
<input v-model="computedValue" :type="inputType" :name="name" :value="inputValue" />
<span class="check" />
<span class="pl-2">{{ label }}</span>
</label>

View File

@ -1,44 +1,41 @@
<script setup>
import { computed } from 'vue'
import FormCheckRadio from '@/Components/FormCheckRadio.vue'
import { computed } from 'vue';
import FormCheckRadio from '@/Components/FormCheckRadio.vue';
const props = defineProps({
options: {
type: Object,
default: () => {}
default: () => {},
},
name: {
type: String,
required: true
required: true,
},
type: {
type: String,
default: 'checkbox',
validator: value => ['checkbox', 'radio', 'switch'].includes(value)
validator: (value) => ['checkbox', 'radio', 'switch'].includes(value),
},
componentClass: {
type: String,
default: null
default: null,
},
isColumn: Boolean,
modelValue: {
type: [Array, String, Number, Boolean, Object],
default: null
}
})
const emit = defineEmits(['update:modelValue'])
default: null,
},
});
const emit = defineEmits(['update:modelValue']);
const computedValue = computed({
get: () => props.modelValue,
set: value => {
emit('update:modelValue', value)
}
})
set: (value) => {
emit('update:modelValue', value);
},
});
</script>
<template>
<div
class="flex justify-start flex-wrap -mb-3"
:class="{ 'flex-col': isColumn }"
>
<div class="flex justify-start flex-wrap -mb-3" :class="{ 'flex-col': isColumn }">
<!-- :input-value="key" -->
<!-- :label="value" -->
<!-- :input-value="value.id"

View File

@ -9,7 +9,7 @@ import NotificationBarInCard from '@/Components/NotificationBarInCard.vue';
const props = defineProps({
errors: Object,
});
const hasErrors = computed(() =>{
const hasErrors = computed(() => {
return props.errors != null && Object.keys(props.errors).length > 0;
});
</script>

View File

@ -1,6 +1,5 @@
<template>
<div class="bg-slate-100 py-3 px-6 flex justify-between items-center mb-6">
<div class="flex items-center space-x-6">
<h3 class="font-bold">AdonisJS InertiaJS Example</h3>
<nav class="flex items-center text-sm">
@ -26,7 +25,7 @@ export default {
},
components: {
Link
}
}
Link,
},
};
</script>

View File

@ -21,7 +21,8 @@
</div>
</div>
</div>
<div v-if="!isLastStep"
<div
v-if="!isLastStep"
class="flex-auto border-t-2 transition duration-500 ease-in-out invisible sm:visible"
:class="[isChecked ? 'border-teal-600' : 'border-gray-300']"
></div>

View File

@ -0,0 +1,295 @@
<script setup lang="ts">
import { onMounted, onUnmounted, ref, Ref, defineProps, computed } from 'vue';
import SectionMain from '@/Components/SectionMain.vue';
import { Map } from 'leaflet/src/map/index';
import { Rectangle } from 'leaflet';
import { canvas } from 'leaflet/src/layer/vector/Canvas';
import { svg } from 'leaflet/src/layer/vector/SVG';
import axios from 'axios';
import { LatLngBoundsExpression } from 'leaflet/src/geo/LatLngBounds';
// import { tileLayerWMS } from 'leaflet/src/layer/tile/TileLayer.WMS';
import { TileLayer } from 'leaflet/src/layer/tile/TileLayer';
import { Attribution } from 'leaflet/src/control/Control.Attribution';
import DrawControlComponent from '@/Components/Map/draw.component.vue';
import ZoomControlComponent from '@/Components/Map/zoom.component.vue';
import { MapService } from '@/Stores/map.service';
import { LayerGroup } from 'leaflet/src/layer/LayerGroup';
import { OpensearchDocument } from '@/Dataset';
Map.include({
// @namespace Map; @method getRenderer(layer: Path): Renderer
// Returns the instance of `Renderer` that should be used to render the given
// `Path`. It will ensure that the `renderer` options of the map and paths
// are respected, and that the renderers do exist on the map.
getRenderer: function (layer) {
// @namespace Path; @option renderer: Renderer
// Use this specific instance of `Renderer` for this path. Takes
// precedence over the map's [default renderer](#map-renderer).
var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;
if (!renderer) {
renderer = this._renderer = this._createRenderer();
}
if (!this.hasLayer(renderer)) {
this.addLayer(renderer);
}
return renderer;
},
_getPaneRenderer: function (name) {
if (name === 'overlayPane' || name === undefined) {
return false;
}
var renderer = this._paneRenderers[name];
if (renderer === undefined) {
renderer = this._createRenderer({ pane: name });
this._paneRenderers[name] = renderer;
}
return renderer;
},
_createRenderer: function (options) {
// @namespace Map; @option preferCanvas: Boolean = false
// Whether `Path`s should be rendered on a `Canvas` renderer.
// By default, all `Path`s are rendered in a `SVG` renderer.
return (this.options.preferCanvas && canvas(options)) || svg(options);
},
});
const DEFAULT_BASE_LAYER_NAME = 'BaseLayer';
const DEFAULT_BASE_LAYER_ATTRIBUTION = '&copy; <a target="_blank" href="http://osm.org/copyright">OpenStreetMap</a> contributors';
// const OPEN_SEARCH_HOST = 'http://localhost:9200';
const OPEN_SEARCH_HOST = 'http://192.168.21.18';
let map: Map;
const props = defineProps({
dheckable: Boolean,
datasets: {
type: Array<OpensearchDocument>,
default: () => [],
},
mapId: {
type: String,
default: 'map',
},
mapOptions: {
type: Object,
default: () => ({
center: [48.208174, 16.373819],
zoom: 3,
zoomControl: false,
attributionControl: false,
}),
},
});
const items = computed({
get() {
return props.datasets;
},
// setter
set(value) {
// Note: we are using destructuring assignment syntax here.
props.datasets.length = 0;
props.datasets.push(...value);
},
});
const fitBounds: LatLngBoundsExpression = [
[46.4318173285, 9.47996951665],
[49.0390742051, 16.9796667823],
];
// const mapId = 'map';
const drawControl: Ref<DrawControlComponent | null> = ref(null);
const southWest = ref(null);
const northEast = ref(null);
const mapService = MapService();
// const coverage = {
// x_min: undefined,
// y_min: undefined,
// x_max: undefined,
// y_max: undefined,
// elevation_min: undefined,
// elevation_max: undefined,
// elevation_absolut: undefined,
// depth_min: undefined,
// depth_max: undefined,
// depth_absolut: undefined,
// time_min: undefined,
// time_max: undefined,
// time_absolut: undefined,
// };
const filterLayerGroup = new LayerGroup();
// Replace with your actual data
// const datasets: Ref<OpensearchDocument[]> = ref([]);
onMounted(() => {
initMap();
});
onUnmounted(() => {
map.off('zoomend zoomlevelschange');
});
const initMap = async () => {
// init leaflet map
map = new Map('map', props.mapOptions);
mapService.setMap(props.mapId, map);
map.scrollWheelZoom.disable();
map.fitBounds(fitBounds);
drawControl.value?.toggleDraw();
map.addLayer(filterLayerGroup);
const attributionControl = new Attribution().addTo(map);
attributionControl.setPrefix(false);
// let osmGgray = tileLayerWMS('https://ows.terrestris.de/osm-gray/service', {
// format: 'image/png',
// attribution: DEFAULT_BASE_LAYER_ATTRIBUTION,
// layers: 'OSM-WMS',
// });
let baseAt = new TileLayer('https://{s}.wien.gv.at/basemap/bmapgrau/normal/google3857/{z}/{y}/{x}.png', {
subdomains: ['maps', 'maps1', 'maps2', 'maps3', 'maps4'],
attribution: DEFAULT_BASE_LAYER_ATTRIBUTION,
});
let layerOptions = {
label: DEFAULT_BASE_LAYER_NAME,
visible: true,
layer: baseAt,
};
layerOptions.layer.addTo(map);
map.on('Draw.Event.CREATED', handleDrawEventCreated);
// // const query = {
// // query: {
// // term: {
// // id: "103"
// // }
// // }
// // };
// // to do : call extra method:
// const query = {
// // q: 'id:103'
// // q: 'author:"Iglseder, Christoph" OR title:"Datensatz"',
// // q: 'author:"Iglseder"',
// q: '*',
// _source: 'author,bbox_xmin,bbox_xmax,bbox_ymin,bbox_ymax,abstract,title',
// size: 1000
// // qf:"title^3 author^2 subject^1",
// }
// try {
// let response = await axios({
// method: 'GET',
// url: OPEN_SEARCH_HOST + '/tethys-records/_search',
// headers: { 'Content-Type': 'application/json' },
// params: query
// });
// // Loop through the hits in the response
// response.data.hits.hits.forEach(hit => {
// // Get the geo_location attribute
// // var geo_location = hit._source.geo_location;
// let xMin = hit._source.bbox_xmin;
// let xMax = hit._source.bbox_xmax;
// let yMin = hit._source.bbox_ymin;
// let yMax = hit._source.bbox_ymax;
// var bbox: LatLngBoundsExpression = [[yMin, xMin], [yMax, xMax]];
// // Parse the WKT string to get the bounding box coordinates
// // var bbox = wktToBbox(geo_location);
// // // Add the bounding box to the map as a rectangle
// new Rectangle(bbox, { color: "#ff7800", weight: 1 }).addTo(map);
// // console.log(hit._source);
// });
// } catch (error) {
// console.error(error);
// }
};
const handleDrawEventCreated = async (event) => {
filterLayerGroup.clearLayers();
items.value = [];
let layer = event.layer;
let bounds = layer.getBounds();
// coverage.x_min = bounds.getSouthWest().lng;
// coverage.y_min = bounds.getSouthWest().lat;
// coverage.x_max = bounds.getNorthEast().lng;
// coverage.y_max = bounds.getNorthEast().lat;
try {
let response = await axios({
method: 'POST',
url: OPEN_SEARCH_HOST + '/tethys-records/_search',
headers: { 'Content-Type': 'application/json' },
data: {
size: 1000,
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_shape: {
geo_location: {
// replace 'location' with your geo-point field name
shape: {
type: 'envelope',
coordinates: [
[bounds.getSouthWest().lng, bounds.getNorthEast().lat],
[bounds.getNorthEast().lng, bounds.getSouthWest().lat],
],
},
relation: 'within',
},
},
},
// _source: 'author,bbox_xmin,bbox_xmax,bbox_ymin,bbox_ymax,abstract,title',
// "size": 1000
},
},
},
});
// Loop through the hits in the response
response.data.hits.hits.forEach((hit) => {
// Get the geo_location attribute
// var geo_location = hit._source.geo_location;
let xMin = hit._source.bbox_xmin;
let xMax = hit._source.bbox_xmax;
let yMin = hit._source.bbox_ymin;
let yMax = hit._source.bbox_ymax;
var bbox: LatLngBoundsExpression = [
[yMin, xMin],
[yMax, xMax],
];
// Parse the WKT string to get the bounding box coordinates
// var bbox = wktToBbox(geo_location);
// // Add the bounding box to the map as a rectangle
let rect = new Rectangle(bbox, { color: '#ff7800', weight: 1 });
filterLayerGroup.addLayer(rect);
// add to result list
items.value.push(hit._source);
});
} catch (error) {
console.error(error);
}
};
</script>
<template>
<SectionMain>
<div id="map" class="map-container mapDesktop mt-6 mb-6 rounded-2xl py-12 px-6 text-center">
<ZoomControlComponent ref="zoomControl" :mapId="mapId"></ZoomControlComponent>
<DrawControlComponent ref="drawControl" :preserve="false" :mapId="mapId" :southWest="southWest" :northEast="northEast">
</DrawControlComponent>
</div>
</SectionMain>
<!-- </section> -->
</template>

View File

@ -4,10 +4,13 @@
<fa-icon [icon]="faSearchLocation"></fa-icon>
</button> -->
<!-- -->
<button ref="inputDraw"
<button
ref="inputDraw"
class="inline-flex cursor-pointer justify-center items-center whitespace-nowrap focus:outline-none transition-colors duration-150 border rounded ring-blue-700 text-black border-teal-50 hover:bg-gray-200 text-sm p-1"
type="button" :class="[_enabled ? 'cursor-not-allowed bg-cyan-200' : 'bg-teal-50 is-active']"
@click.prevent="toggleDraw">
type="button"
:class="[_enabled ? 'cursor-not-allowed bg-cyan-200' : 'bg-teal-50 is-active']"
@click.prevent="toggleDraw"
>
<BaseIcon v-if="mdiDrawPen" :path="mdiDrawPen" />
</button>
</div>
@ -53,15 +56,14 @@ export default class DrawControlComponent extends Vue {
metric: true, // Whether to use the metric measurement system or imperial
};
@Prop() public mapId: string;
// @Prop() public map: Map;
@Prop public southWest: LatLngBounds;
@Prop public northEast: LatLngBounds;
@Prop({
default: true
}) public preserve: boolean;
default: true,
})
public preserve: boolean;
mapService = MapService();
public _enabled;
@ -97,7 +99,6 @@ export default class DrawControlComponent extends Vue {
// @Ref('inputDraw') private _inputDraw: HTMLElement;
private addHooks() {
// L.Draw.Feature.prototype.addHooks.call(this);
this._map = this.mapService.getMap(this.mapId);

View File

@ -1,8 +1,8 @@
<script lang="ts" setup>
import { usePage, router } from '@inertiajs/vue3'
import { usePage, router } from '@inertiajs/vue3';
// import { usePage } from '@inertiajs/inertia-vue3';
// import { Inertia } from '@inertiajs/inertia';
import {ComputedRef} from "vue";
import { ComputedRef } from 'vue';
import { computed, ref } from 'vue';
import { containerMaxW } from '@/config.js';
@ -34,13 +34,11 @@ import UserAvatarCurrentUser from '@/Components/UserAvatarCurrentUser.vue';
import BaseIcon from '@/Components/BaseIcon.vue';
import NavBarSearch from '@/Components/NavBarSearch.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
import type User from "App/Models/User";
import type User from 'App/Models/User';
// const mainStore = MainService();
// const userName = computed(() =>mainStore.userName);
const styleService = StyleService();
// const props = defineProps({
// user: {
@ -50,7 +48,7 @@ const styleService = StyleService();
// });
// const userName = computed(() => usePage().props.user.login)
const user: ComputedRef<User>= computed(() => {
const user: ComputedRef<User> = computed(() => {
return usePage().props.authUser as User;
});
// const userName = computed(() => props.user.login)
@ -75,23 +73,18 @@ const menuOpenLg = () => {
// // router.post(route('logout'))
// Inertia.get(stardust.route('app.index'));
// };
const logout = async() => {
const logout = async () => {
// router.post(route('logout'));
await router.post(stardust.route('logout'));
};
</script>
<template>
<nav
class="top-0 left-0 right-0 fixed bg-gray-50 h-14 z-40 w-screen transition-position xl:pl-60 lg:w-auto dark:bg-slate-800"
>
<nav class="top-0 left-0 right-0 fixed bg-gray-50 h-14 z-40 w-screen transition-position xl:pl-60 lg:w-auto dark:bg-slate-800">
<div class="flex lg:items-stretch" :class="containerMaxW">
<div class="flex-1 items-stretch flex h-14">
<NavBarItem type="flex lg:hidden" @click.prevent="layoutStore.asideMobileToggle()">
<BaseIcon
:path="layoutStore.isAsideMobileExpanded ? mdiBackburger : mdiForwardburger"
size="24"
/>
<BaseIcon :path="layoutStore.isAsideMobileExpanded ? mdiBackburger : mdiForwardburger" size="24" />
</NavBarItem>
<NavBarItem type="hidden lg:flex xl:hidden" @click.prevent="menuOpenLg">
<BaseIcon :path="mdiMenu" size="24" />
@ -109,9 +102,7 @@ const logout = async() => {
class="absolute w-screen top-14 left-0 bg-gray-50 shadow lg:w-auto lg:items-stretch lg:flex lg:grow lg:static lg:border-b-0 lg:overflow-visible lg:shadow-none dark:bg-slate-800"
:class="[isMenuNavBarActive ? 'block' : 'hidden']"
>
<div
class="max-h-screen-menu overflow-y-auto lg:overflow-visible lg:flex lg:items-stretch lg:justify-end lg:ml-auto"
>
<div class="max-h-screen-menu overflow-y-auto lg:overflow-visible lg:flex lg:items-stretch lg:justify-end lg:ml-auto">
<NavBarMenu>
<NavBarItemLabel :icon="mdiMenu" label="Help menu" />
<template #dropdown>
@ -139,7 +130,7 @@ const logout = async() => {
<template #dropdown>
<!-- <NavBarItem> -->
<!-- <NavBarItem route-name="admin.account.info"> -->
<NavBarItem :route-name="'admin.account.info'" >
<NavBarItem :route-name="'admin.account.info'">
<NavBarItemLabel :icon="mdiAccount" label="My Profile" />
</NavBarItem>
<NavBarItem :route-name="'settings'">

View File

@ -1,55 +1,55 @@
<script setup>
import { StyleService } from '@/Stores/style'
import { StyleService } from '@/Stores/style';
// import { Link } from '@inertiajs/vue3'
import { Link } from '@inertiajs/vue3'
import { computed } from 'vue'
import { Link } from '@inertiajs/vue3';
import { computed } from 'vue';
import { stardust } from '@eidellev/adonis-stardust/client';
const props = defineProps({
href: {
type: String,
default: null
default: null,
},
routeName: {
type: String,
default: null
default: null,
},
param:{
type:Number
param: {
type: Number,
},
type: {
type: String,
default: 'flex'
default: 'flex',
},
activeColor: {
type: String,
default: null
default: null,
},
isDesktopIconOnly: Boolean,
dropdown: Boolean,
active: Boolean
})
active: Boolean,
});
const is = computed(() => {
if (props.href) {
return 'a'
return 'a';
}
if (props.routeName) {
return Link
return Link;
}
return 'div'
})
return 'div';
});
const styleStore = StyleService()
const styleStore = StyleService();
const activeColor = props.activeColor ?? `${styleStore.navBarItemLabelActiveColorStyle} dark:text-slate-400`
const activeColor = props.activeColor ?? `${styleStore.navBarItemLabelActiveColorStyle} dark:text-slate-400`;
const activeClass = computed(
// () => props.routeName && route().current(props.routeName) == true ? props.activeColor : null
() => props.routeName && stardust.isCurrent(props.routeName) ? props.activeColor : null
)
// () => props.routeName && route().current(props.routeName) == true ? props.activeColor : null
() => (props.routeName && stardust.isCurrent(props.routeName) ? props.activeColor : null),
);
// const itemRoute = computed(() => (props.routeName ? stardust.route(props.routeName): ''));
const componentClass = computed(() => {
@ -57,25 +57,25 @@ const componentClass = computed(() => {
props.type,
props.active
? activeColor
: `${styleStore.navBarItemLabelStyle} dark:text-white dark:hover:text-slate-400 ${styleStore.navBarItemLabelHoverStyle}`
]
: `${styleStore.navBarItemLabelStyle} dark:text-white dark:hover:text-slate-400 ${styleStore.navBarItemLabelHoverStyle}`,
];
if (props.type === 'block') {
base.push('lg:flex')
base.push('lg:flex');
}
if (!props.dropdown) {
base.push('py-2', 'px-3')
base.push('py-2', 'px-3');
} else {
base.push('p-0', 'lg:py-2', 'lg:px-3')
base.push('p-0', 'lg:py-2', 'lg:px-3');
}
if (props.isDesktopIconOnly) {
base.push('lg:w-16', 'lg:justify-center')
base.push('lg:w-16', 'lg:justify-center');
}
return base
})
return base;
});
</script>
<template>

View File

@ -1,28 +1,21 @@
<script setup>
import BaseIcon from '@/Components/BaseIcon.vue'
import BaseIcon from '@/Components/BaseIcon.vue';
defineProps({
icon: {
type: String,
default: null
default: null,
},
label: {
type: String,
required: true
required: true,
},
isDesktopIconOnly: Boolean
})
isDesktopIconOnly: Boolean,
});
</script>
<template>
<slot />
<BaseIcon
v-if="icon"
:path="icon"
class="transition-colors"
/>
<span
class="px-2 transition-colors"
:class="{ 'lg:hidden':isDesktopIconOnly && icon }"
>{{ label }}</span>
<BaseIcon v-if="icon" :path="icon" class="transition-colors" />
<span class="px-2 transition-colors" :class="{ 'lg:hidden': isDesktopIconOnly && icon }">{{ label }}</span>
</template>

View File

@ -1,60 +1,49 @@
<script setup>
import { StyleService } from '@/Stores/style'
import { computed, ref, onMounted, onBeforeUnmount } from 'vue'
import { mdiChevronUp, mdiChevronDown } from '@mdi/js'
import NavBarItem from '@/Components/NavBarItem.vue'
import BaseIcon from '@/Components/BaseIcon.vue'
import { StyleService } from '@/Stores/style';
import { computed, ref, onMounted, onBeforeUnmount } from 'vue';
import { mdiChevronUp, mdiChevronDown } from '@mdi/js';
import NavBarItem from '@/Components/NavBarItem.vue';
import BaseIcon from '@/Components/BaseIcon.vue';
const styleStore = StyleService()
const styleStore = StyleService();
const isDropdownActive = ref(false)
const isDropdownActive = ref(false);
const toggleDropdownIcon = computed(() => isDropdownActive.value ? mdiChevronUp : mdiChevronDown)
const toggleDropdownIcon = computed(() => (isDropdownActive.value ? mdiChevronUp : mdiChevronDown));
const toggle = () => {
isDropdownActive.value = !isDropdownActive.value
}
isDropdownActive.value = !isDropdownActive.value;
};
const root = ref(null)
const root = ref(null);
const forceClose = event => {
const forceClose = (event) => {
if (!root.value.$el.contains(event.target)) {
isDropdownActive.value = false
isDropdownActive.value = false;
}
}
};
onMounted(() => {
window.addEventListener('click', forceClose)
})
window.addEventListener('click', forceClose);
});
onBeforeUnmount(() => {
window.removeEventListener('click', forceClose)
})
window.removeEventListener('click', forceClose);
});
</script>
<template>
<NavBarItem
ref="root"
type="block"
:active="isDropdownActive"
dropdown
@click="toggle"
>
<NavBarItem ref="root" type="block" :active="isDropdownActive" dropdown @click="toggle">
<a
class="flex items-center py-2 px-3 dark:bg-slate-800 lg:bg-transparent lg:dark:bg-transparent"
:class="styleStore.navBarMenuListUpperLabelStyle"
>
<slot />
<BaseIcon
:path="toggleDropdownIcon"
class="hidden lg:inline-flex transition-colors"
/>
<BaseIcon :path="toggleDropdownIcon" class="hidden lg:inline-flex transition-colors" />
</a>
<div
class="-mx-px text-sm border-b border-gray-100 lg:border lg:bg-white lg:absolute
lg:top-full lg:left-0 lg:min-w-full lg:z-20 lg:rounded-b lg:dark:bg-slate-800
dark:border-slate-700"
:class="{'lg:hidden':!isDropdownActive}"
class="-mx-px text-sm border-b border-gray-100 lg:border lg:bg-white lg:absolute lg:top-full lg:left-0 lg:min-w-full lg:z-20 lg:rounded-b lg:dark:bg-slate-800 dark:border-slate-700"
:class="{ 'lg:hidden': !isDropdownActive }"
>
<slot name="dropdown" />
</div>

View File

@ -3,11 +3,5 @@ import FormControl from '@/Components/FormControl.vue';
</script>
<template>
<FormControl
ref="root"
placeholder="Search (ctrl+k)"
ctrl-k-focus
transparent
borderless
/>
<FormControl ref="root" placeholder="Search (ctrl+k)" ctrl-k-focus transparent borderless />
</template>

View File

@ -1,68 +1,45 @@
<script setup>
import { ref, computed, useSlots } from 'vue'
import { mdiClose } from '@mdi/js'
import { colorsBgLight, colorsOutline } from '@/colors.js'
import BaseLevel from '@/Components/BaseLevel.vue'
import BaseIcon from '@/Components/BaseIcon.vue'
import BaseButton from '@/Components/BaseButton.vue'
import { ref, computed, useSlots } from 'vue';
import { mdiClose } from '@mdi/js';
import { colorsBgLight, colorsOutline } from '@/colors.js';
import BaseLevel from '@/Components/BaseLevel.vue';
import BaseIcon from '@/Components/BaseIcon.vue';
import BaseButton from '@/Components/BaseButton.vue';
const props = defineProps({
icon: {
type: String,
default: null
default: null,
},
outline: Boolean,
color: {
type: String,
required: true
}
})
required: true,
},
});
const componentClass = computed(() => props.outline
? colorsOutline[props.color]
: colorsBgLight[props.color]
)
const componentClass = computed(() => (props.outline ? colorsOutline[props.color] : colorsBgLight[props.color]));
const isDismissed = ref(false)
const isDismissed = ref(false);
const dismiss = () => {
isDismissed.value = true
}
isDismissed.value = true;
};
const slots = useSlots()
const slots = useSlots();
const hasRightSlot = computed(() => slots.right)
const hasRightSlot = computed(() => slots.right);
</script>
<template>
<div
v-if="!isDismissed"
:class="componentClass"
class="px-3 py-6 md:py-3 mb-6 last:mb-0 border rounded transition-colors duration-150"
>
<div v-if="!isDismissed" :class="componentClass" class="px-3 py-6 md:py-3 mb-6 last:mb-0 border rounded transition-colors duration-150">
<BaseLevel>
<div class="flex flex-col md:flex-row items-center">
<BaseIcon
v-if="icon"
:path="icon"
w="w-10 md:w-5"
h="h-10 md:h-5"
size="24"
class="md:mr-2"
/>
<BaseIcon v-if="icon" :path="icon" w="w-10 md:w-5" h="h-10 md:h-5" size="24" class="md:mr-2" />
<span class="text-center md:text-left"><slot /></span>
</div>
<slot
v-if="hasRightSlot"
name="right"
/>
<BaseButton
v-else
:icon="mdiClose"
:outline="outline"
small
@click="dismiss"
/>
<slot v-if="hasRightSlot" name="right" />
<BaseButton v-else :icon="mdiClose" :outline="outline" small @click="dismiss" />
</BaseLevel>
</div>
</template>

View File

@ -14,10 +14,7 @@ defineProps({
<template>
<div class="flex flex-col mb-6 -mt-6 -mr-6 -ml-6 animate-fade-in">
<div
:class="[colorsBgLight[color], { 'rounded-t-xl': !isPlacedWithHeader }]"
class="flex flex-col p-6 transition-colors"
>
<div :class="[colorsBgLight[color], { 'rounded-t-xl': !isPlacedWithHeader }]" class="flex flex-col p-6 transition-colors">
<slot />
</div>
</div>

View File

@ -1,61 +1,59 @@
<script setup>
import { computed, ref, watch, onMounted } from 'vue'
import numeral from 'numeral'
import { computed, ref, watch, onMounted } from 'vue';
import numeral from 'numeral';
const props = defineProps({
prefix: {
type: String,
default: null
default: null,
},
suffix: {
type: String,
default: null
default: null,
},
value: {
type: Number,
default: 0
default: 0,
},
duration: {
type: Number,
default: 500
}
})
default: 500,
},
});
const newValue = ref(0)
const newValue = ref(0);
const newValueFormatted = computed(
() => newValue.value < 1000 ? newValue.value : numeral(newValue.value).format('0,0')
)
const newValueFormatted = computed(() => (newValue.value < 1000 ? newValue.value : numeral(newValue.value).format('0,0')));
const value = computed(() => props.value)
const value = computed(() => props.value);
const grow = m => {
const v = Math.ceil(newValue.value + m)
const grow = (m) => {
const v = Math.ceil(newValue.value + m);
if (v > value.value) {
newValue.value = value.value
return false
newValue.value = value.value;
return false;
}
newValue.value = v
newValue.value = v;
setTimeout(() => {
grow(m)
}, 25)
}
grow(m);
}, 25);
};
const growInit = () => {
newValue.value = 0
grow(props.value / (props.duration / 25))
}
newValue.value = 0;
grow(props.value / (props.duration / 25));
};
watch(value, () => {
growInit()
})
growInit();
});
onMounted(() => {
growInit()
})
growInit();
});
</script>
<template>

View File

@ -4,29 +4,41 @@ import { StyleService } from '@/Stores/style';
defineProps({
zIndex: {
type: String,
default: 'z-50'
}
})
default: 'z-50',
},
});
const emit = defineEmits(['overlay-click'])
const emit = defineEmits(['overlay-click']);
const overlayClick = event => {
emit('overlay-click', event)
}
const overlayClick = (event) => {
emit('overlay-click', event);
};
const styleStore = StyleService()
const styleStore = StyleService();
</script>
<template>
<div class="flex items-center flex-col justify-center overflow-hidden fixed inset-0" :class="zIndex">
<transition enter-active-class="transition duration-150 ease-in" enter-from-class="opacity-0"
enter-to-class="opacity-100" leave-active-class="transition duration-150 ease-in" leave-from-class="opacity-100"
leave-to-class="opacity-0">
<div class="absolute inset-0 bg-gradient-to-tr opacity-90 dark:from-gray-700 dark:via-gray-900 dark:to-gray-700"
:class="styleStore.overlayStyle" @click="overlayClick" />
<transition
enter-active-class="transition duration-150 ease-in"
enter-from-class="opacity-0"
enter-to-class="opacity-100"
leave-active-class="transition duration-150 ease-in"
leave-from-class="opacity-100"
leave-to-class="opacity-0"
>
<div
class="absolute inset-0 bg-gradient-to-tr opacity-90 dark:from-gray-700 dark:via-gray-900 dark:to-gray-700"
:class="styleStore.overlayStyle"
@click="overlayClick"
/>
</transition>
<transition enter-active-class="transition duration-100 ease-out" enter-from-class="transform scale-95 opacity-0"
enter-to-class="transform scale-100 opacity-100" leave-active-class="animate-fade-out">
<transition
enter-active-class="transition duration-100 ease-out"
enter-from-class="transform scale-95 opacity-0"
enter-to-class="transform scale-100 opacity-100"
leave-active-class="animate-fade-out"
>
<slot />
</transition>
</div>

View File

@ -1,53 +1,48 @@
<script setup>
import { computed } from 'vue'
import { mdiChevronUp, mdiChevronDown, mdiAlertCircleOutline } from '@mdi/js'
import PillTag from '@/Components/PillTag.vue'
import { computed } from 'vue';
import { mdiChevronUp, mdiChevronDown, mdiAlertCircleOutline } from '@mdi/js';
import PillTag from '@/Components/PillTag.vue';
const props = defineProps({
trend: {
type: String,
required: true
required: true,
},
trendType: {
type: String,
default: null
default: null,
},
small: Boolean
})
small: Boolean,
});
const trendStyle = computed(() => {
if (props.trendType === 'up') {
return {
icon: mdiChevronUp,
style: 'success'
}
style: 'success',
};
}
if (props.trendType === 'down') {
return {
icon: mdiChevronDown,
style: 'danger'
}
style: 'danger',
};
}
if (props.trendType === 'alert') {
return {
icon: mdiAlertCircleOutline,
style: 'warning'
}
style: 'warning',
};
}
return {
style: 'info'
}
})
style: 'info',
};
});
</script>
<template>
<PillTag
:text="trend"
:type="trendStyle.style"
:icon="trendStyle.icon"
:small="small"
/>
<PillTag :text="trend" :type="trendStyle.style" :icon="trendStyle.icon" :small="small" />
</template>

View File

@ -4,9 +4,10 @@ import { Link } from '@inertiajs/vue3';
const props = defineProps(['href', 'active']);
const classes = computed(() => props.active
const classes = computed(() =>
props.active
? 'block pl-3 pr-4 py-2 border-l-4 border-indigo-400 text-base font-medium text-indigo-700 bg-indigo-50 focus:outline-none focus:text-indigo-800 focus:bg-indigo-100 focus:border-indigo-700 transition duration-150 ease-in-out'
: 'block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out'
: 'block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out',
);
</script>

View File

@ -167,7 +167,6 @@ watch(search, async () => {
await onChange();
});
// function onChange() {
// if (!props.source || !data.search) {
// return false;

View File

@ -7,13 +7,7 @@ import SectionBanner from '@/Components/SectionBanner.vue';
<SectionBanner bg="greenBlue">
<h1 class="text-3xl text-white mb-6">Like the project? Please star on <b>Gitea</b>!</h1>
<div>
<BaseButton
href="https://gitea.geologie.ac.at/geolba/tethys"
:icon="mdiGithub"
label="Gitea"
target="_blank"
rounded-full
/>
<BaseButton href="https://gitea.geologie.ac.at/geolba/tethys" :icon="mdiGithub" label="Gitea" target="_blank" rounded-full />
</div>
</SectionBanner>
</template>

View File

@ -2,20 +2,17 @@
defineProps({
custom: Boolean,
first: Boolean,
last: Boolean
})
last: Boolean,
});
</script>
<template>
<section
class="py-24 px-6 lg:px-0 lg:max-w-2xl lg:mx-auto text-center"
:class="{ '-mb-6':first, '-mt-6':last, '-my-6':!first && !last }"
:class="{ '-mb-6': first, '-mt-6': last, '-my-6': !first && !last }"
>
<slot v-if="custom" />
<h1
v-else
class="text-2xl text-gray-500 dark:text-slate-400"
>
<h1 v-else class="text-2xl text-gray-500 dark:text-slate-400">
<slot />
</h1>
</section>

View File

@ -1,56 +1,35 @@
<script setup>
import { mdiCog } from '@mdi/js'
import { useSlots, computed } from 'vue'
import BaseIcon from '@/Components/BaseIcon.vue'
import BaseButton from '@/Components/BaseButton.vue'
import IconRounded from '@/Components/IconRounded.vue'
import { mdiCog } from '@mdi/js';
import { useSlots, computed } from 'vue';
import BaseIcon from '@/Components/BaseIcon.vue';
import BaseButton from '@/Components/BaseButton.vue';
import IconRounded from '@/Components/IconRounded.vue';
defineProps({
icon: {
type: String,
default: null
default: null,
},
title: {
type: String,
required: true
required: true,
},
main: Boolean
})
main: Boolean,
});
const hasSlot = computed(() => useSlots().default)
const hasSlot = computed(() => useSlots().default);
</script>
<template>
<section
:class="{'pt-6':!main}"
class="mb-6 flex items-center justify-between"
>
<section :class="{ 'pt-6': !main }" class="mb-6 flex items-center justify-between">
<div class="flex items-center justify-start">
<IconRounded
v-if="icon && main"
:icon="icon"
type="light"
class="mr-3"
bg
/>
<BaseIcon
v-else-if="icon"
:path="icon"
class="mr-2"
size="20"
/>
<h1
:class="main ? 'text-3xl' : 'text-2xl'"
class="leading-tight"
>
<IconRounded v-if="icon && main" :icon="icon" type="light" class="mr-3" bg />
<BaseIcon v-else-if="icon" :path="icon" class="mr-2" size="20" />
<h1 :class="main ? 'text-3xl' : 'text-2xl'" class="leading-tight">
{{ title }}
</h1>
</div>
<slot v-if="hasSlot" />
<BaseButton
v-else
:icon="mdiCog"
small
/>
<BaseButton v-else :icon="mdiCog" small />
</section>
</template>

View File

@ -1,32 +1,26 @@
<script setup>
import { ref, watch } from 'vue'
import { ref, watch } from 'vue';
defineProps({
type: {
type: String,
default: 'td'
}
})
default: 'td',
},
});
const emit = defineEmits(['checked'])
const emit = defineEmits(['checked']);
const checked = ref(false)
const checked = ref(false);
watch(checked, newVal => {
emit('checked', newVal)
})
watch(checked, (newVal) => {
emit('checked', newVal);
});
</script>
<template>
<component
:is="type"
class="lg:w-1"
>
<component :is="type" class="lg:w-1">
<label class="checkbox">
<input
v-model="checked"
type="checkbox"
>
<input v-model="checked" type="checkbox" />
<span class="check" />
</label>
</component>

View File

@ -120,8 +120,7 @@ const removeItem = (key) => {
<UserAvatar :username="client.value" class="w-24 h-24 mx-auto lg:w-6 lg:h-6" />
</td> -->
<td data-label="Type" scope="row">
<FormControl required v-model="item.type" :type="'select'" placeholder="[Enter Language]"
:options="props.subjectTypes">
<FormControl required v-model="item.type" :type="'select'" placeholder="[Enter Language]" :options="props.subjectTypes">
<div class="text-red-400 text-sm" v-if="errors[`subjects.${index}.type`]">
{{ errors[`subjects.${index}.type`].join(', ') }}
</div>
@ -129,17 +128,21 @@ const removeItem = (key) => {
</td>
<td data-label="Value" scope="row">
<SearchCategoryAutocomplete v-if="item.type !== 'uncontrolled'" v-model="item.value" @subject="(language) => {
<SearchCategoryAutocomplete
v-if="item.type !== 'uncontrolled'"
v-model="item.value"
@subject="
(language) => {
item.language = language;
}
">
"
>
<div class="text-red-400 text-sm" v-if="errors[`subjects.${index}.value`]">
{{ errors[`subjects.${index}.value`].join(', ') }}
</div>
</SearchCategoryAutocomplete>
<FormControl v-else required v-model="item.value" type="text" placeholder="[enter keyword value]"
:borderless="true">
<FormControl v-else required v-model="item.value" type="text" placeholder="[enter keyword value]" :borderless="true">
<div class="text-red-400 text-sm" v-if="errors[`subjects.${index}.value`]">
{{ errors[`subjects.${index}.value`].join(', ') }}
</div>
@ -147,8 +150,14 @@ const removeItem = (key) => {
</td>
<td data-label="Language" scope="row">
<FormControl required v-model="item.language" :type="'select'" placeholder="[Enter Lang]"
:options="{ de: 'de', en: 'en' }" :is-read-only="item.type != 'uncontrolled'">
<FormControl
required
v-model="item.language"
:type="'select'"
placeholder="[Enter Lang]"
:options="{ de: 'de', en: 'en' }"
:is-read-only="item.type != 'uncontrolled'"
>
<div class="text-red-400 text-sm" v-if="errors[`subjects.${index}.language`]">
{{ errors[`subjects.${index}.language`].join(', ') }}
</div>
@ -157,8 +166,7 @@ const removeItem = (key) => {
<td class="before:hidden lg:w-1 whitespace-nowrap" scope="row">
<BaseButtons type="justify-start lg:justify-end" no-wrap>
<!-- <BaseButton color="info" :icon="mdiEye" small @click="isModalActive = true" /> -->
<BaseButton v-if="index > 2" color="danger" :icon="mdiTrashCan" small
@click.prevent="removeItem(index)" />
<BaseButton v-if="index > 2" color="danger" :icon="mdiTrashCan" small @click.prevent="removeItem(index)" />
</BaseButtons>
</td>
</tr>
@ -169,8 +177,15 @@ const removeItem = (key) => {
<div class="p-3 lg:px-6 border-t border-gray-100 dark:border-slate-800">
<BaseLevel>
<BaseButtons>
<BaseButton v-for="page in pagesList" :key="page" :active="page === currentPage" :label="page + 1" small
:outline="styleService.darkMode" @click="currentPage = page" />
<BaseButton
v-for="page in pagesList"
:key="page"
:active="page === currentPage"
:label="page + 1"
small
:outline="styleService.darkMode"
@click="currentPage = page"
/>
</BaseButtons>
<small>Page {{ currentPageHuman }} of {{ numPages }}</small>
</BaseLevel>
@ -182,7 +197,6 @@ const removeItem = (key) => {
</template>
<style scoped>
/* tr:nth-child(even) {
background: gray;
}

View File

@ -169,10 +169,17 @@ const removeAuthor = (key) => {
{{ option }}
</option>
</select> -->
<FormControl required v-model="element.pivot_contributor_type" type="select"
:options="contributortypes" placeholder="[relation type]">
<div class="text-red-400 text-sm"
v-if="errors && Array.isArray(errors[`contributors.${index}.pivot_contributor_type`])">
<FormControl
required
v-model="element.pivot_contributor_type"
type="select"
:options="contributortypes"
placeholder="[relation type]"
>
<div
class="text-red-400 text-sm"
v-if="errors && Array.isArray(errors[`contributors.${index}.pivot_contributor_type`])"
>
{{ errors[`contributors.${index}.pivot_contributor_type`].join(', ') }}
</div>
</FormControl>

View File

@ -24,9 +24,7 @@ const perPage = ref(5);
const currentPage = ref(0);
const checkedRows = ref([]);
const itemsPaginated = computed(() =>
items.value.slice(perPage.value * currentPage.value, perPage.value * (currentPage.value + 1))
);
const itemsPaginated = computed(() => items.value.slice(perPage.value * currentPage.value, perPage.value * (currentPage.value + 1)));
const numPages = computed(() => Math.ceil(items.value.length / perPage.value));
@ -75,8 +73,11 @@ const checked = (isChecked, client) => {
</CardBoxModal>
<div v-if="checkedRows.length" class="p-3 bg-gray-100/50 dark:bg-slate-800">
<span v-for="checkedRow in checkedRows" :key="checkedRow.id"
class="inline-block px-2 py-1 rounded-sm mr-2 text-sm bg-gray-100 dark:bg-slate-700">
<span
v-for="checkedRow in checkedRows"
:key="checkedRow.id"
class="inline-block px-2 py-1 rounded-sm mr-2 text-sm bg-gray-100 dark:bg-slate-700"
>
{{ checkedRow.name }}
</span>
</div>
@ -115,9 +116,7 @@ const checked = (isChecked, client) => {
</progress>
</td>
<td data-label="Created" class="lg:w-1 whitespace-nowrap">
<small class="text-gray-500 dark:text-slate-400" :title="client.created">{{
client.created
}}</small>
<small class="text-gray-500 dark:text-slate-400" :title="client.created">{{ client.created }}</small>
</td>
<td class="before:hidden lg:w-1 whitespace-nowrap">
<BaseButtons type="justify-start lg:justify-end" no-wrap>
@ -131,8 +130,15 @@ const checked = (isChecked, client) => {
<div class="p-3 lg:px-6 border-t border-gray-100 dark:border-slate-800">
<BaseLevel>
<BaseButtons>
<BaseButton v-for="page in pagesList" :key="page" :active="page === currentPage" :label="page + 1" small
:outline="styleService.darkMode" @click="currentPage = page" />
<BaseButton
v-for="page in pagesList"
:key="page"
:active="page === currentPage"
:label="page + 1"
small
:outline="styleService.darkMode"
@click="currentPage = page"
/>
</BaseButtons>
<small>Page {{ currentPageHuman }} of {{ numPages }}</small>
</BaseLevel>

View File

@ -19,7 +19,7 @@ const props = defineProps({
const avatar = computed(
// () => props.avatar ?? `https://avatars.dicebear.com/api/${props.api}/${props.username?.replace(/[^a-z0-9]+/i, '-')}.svg`
() => props.avatar ?? `https://avatars.dicebear.com/api/initials/${props.username}.svg`
() => props.avatar ?? `https://avatars.dicebear.com/api/initials/${props.username}.svg`,
// () => {
@ -32,10 +32,6 @@ const username = computed(() => props.username);
<template>
<div>
<img
:src="avatar"
:alt="username"
class="rounded-full block h-auto w-full max-w-full bg-gray-100 dark:bg-slate-800"
/>
<img :src="avatar" :alt="username" class="rounded-full block h-auto w-full max-w-full bg-gray-100 dark:bg-slate-800" />
</div>
</template>

View File

@ -15,5 +15,10 @@ onMounted(() => {
</script>
<template>
<input class="border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 rounded-md shadow-sm" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" ref="input">
<input
class="border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 rounded-md shadow-sm"
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
ref="input"
/>
</template>

View File

@ -1,20 +1,16 @@
<script setup>
import { Head, Link, useForm, router } from "@inertiajs/vue3"
import {
mdiAccountKey,
mdiArrowLeftBoldOutline,
mdiAccount, mdiNoteText, mdiFormTextarea
} from "@mdi/js"
import LayoutAuthenticated from "@/Layouts/LayoutAuthenticated.vue"
import SectionMain from "@/Components/SectionMain.vue"
import SectionTitleLineWithButton from "@/Components/SectionTitleLineWithButton.vue"
import CardBox from "@/Components/CardBox.vue"
import FormField from '@/Components/FormField.vue'
import FormControl from '@/Components/FormControl.vue'
import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue'
import BaseDivider from '@/Components/BaseDivider.vue'
import BaseButton from '@/Components/BaseButton.vue'
import BaseButtons from '@/Components/BaseButtons.vue'
import { Head, Link, useForm, router } from '@inertiajs/vue3';
import { mdiAccountKey, mdiArrowLeftBoldOutline, mdiAccount, mdiNoteText, mdiFormTextarea } from '@mdi/js';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
import CardBox from '@/Components/CardBox.vue';
import FormField from '@/Components/FormField.vue';
import FormControl from '@/Components/FormControl.vue';
import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue';
import BaseDivider from '@/Components/BaseDivider.vue';
import BaseButton from '@/Components/BaseButton.vue';
import BaseButtons from '@/Components/BaseButtons.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
const props = defineProps({
@ -28,7 +24,7 @@ const form = useForm({
name: '',
display_name: '',
description: '',
permissions: []
permissions: [],
});
const submit = async () => {
@ -38,16 +34,20 @@ const submit = async () => {
<template>
<LayoutAuthenticated>
<Head title="Add role" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiAccountKey" title="Add role" main>
<BaseButton :route-name="stardust.route('role.index')" :icon="mdiArrowLeftBoldOutline" label="Back" color="white"
rounded-full small />
<BaseButton
:route-name="stardust.route('role.index')"
:icon="mdiArrowLeftBoldOutline"
label="Back"
color="white"
rounded-full
small
/>
</SectionTitleLineWithButton>
<!-- <CardBox form @submit.prevent="form.post(stardust.route('role.store'))"> -->
<CardBox form @submit.prevent="submit()">
<FormField label="Name" help="Required. Role name" :class="{ 'text-red-400': form.errors.name }">
<FormControl v-model="form.name" type="text" placeholder="Enter Name" required :error="form.errors.name">
<div class="text-red-400 text-sm" v-if="form.errors.name">
@ -64,8 +64,18 @@ const submit = async () => {
</FormControl>
</FormField>
<FormField label="Description" help="Optional. Description of new role" :class="{ 'text-red-400': form.errors.description }">
<FormControl v-model="form.description" v-bind:icon="mdiFormTextarea" name="display_name" :type="'textarea'" :error="form.errors.description">
<FormField
label="Description"
help="Optional. Description of new role"
:class="{ 'text-red-400': form.errors.description }"
>
<FormControl
v-model="form.description"
v-bind:icon="mdiFormTextarea"
name="display_name"
:type="'textarea'"
:error="form.errors.description"
>
<div class="text-red-400 text-sm" v-if="form.errors.description">
{{ form.errors.description }}
</div>
@ -84,8 +94,13 @@ const submit = async () => {
<template #footer>
<BaseButtons>
<BaseButton type="submit" color="info" label="Submit" :class="{ 'opacity-25': form.processing }"
:disabled="form.processing" />
<BaseButton
type="submit"
color="info"
label="Submit"
:class="{ 'opacity-25': form.processing }"
:disabled="form.processing"
/>
</BaseButtons>
</template>
</CardBox>

View File

@ -1,20 +1,16 @@
<script setup>
import { Head, Link, useForm } from "@inertiajs/vue3"
import {
mdiAccountKey,
mdiArrowLeftBoldOutline,
mdiFormTextarea
} from "@mdi/js"
import LayoutAuthenticated from "@/Layouts/LayoutAuthenticated.vue"
import SectionMain from "@/Components/SectionMain.vue"
import SectionTitleLineWithButton from "@/Components/SectionTitleLineWithButton.vue"
import CardBox from "@/Components/CardBox.vue"
import FormField from '@/Components/FormField.vue'
import FormControl from '@/Components/FormControl.vue'
import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue'
import BaseDivider from '@/Components/BaseDivider.vue'
import BaseButton from '@/Components/BaseButton.vue'
import BaseButtons from '@/Components/BaseButtons.vue'
import { Head, Link, useForm } from '@inertiajs/vue3';
import { mdiAccountKey, mdiArrowLeftBoldOutline, mdiFormTextarea } from '@mdi/js';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
import CardBox from '@/Components/CardBox.vue';
import FormField from '@/Components/FormField.vue';
import FormControl from '@/Components/FormControl.vue';
import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue';
import BaseDivider from '@/Components/BaseDivider.vue';
import BaseButton from '@/Components/BaseButton.vue';
import BaseButtons from '@/Components/BaseButtons.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
const props = defineProps({
@ -29,15 +25,15 @@ const props = defineProps({
roleHasPermissions: {
type: Object,
default: () => ({}),
}
})
},
});
const form = useForm({
_method: 'put',
name: props.role.name,
description: props.role.description,
permissions: props.roleHasPermissions
})
permissions: props.roleHasPermissions,
});
const submit = async () => {
// await Inertia.post(stardust.route('user.store'), form);
@ -47,16 +43,20 @@ const submit = async () => {
<template>
<LayoutAuthenticated>
<Head title="Update role" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiAccountKey" title="Update role" main>
<BaseButton :route-name="stardust.route('role.index')" :icon="mdiArrowLeftBoldOutline" label="Back" color="white"
rounded-full small />
<BaseButton
:route-name="stardust.route('role.index')"
:icon="mdiArrowLeftBoldOutline"
label="Back"
color="white"
rounded-full
small
/>
</SectionTitleLineWithButton>
<!-- <CardBox form @submit.prevent="form.put(stardust.route('role.update', [props.role.id]))"> -->
<CardBox form @submit.prevent="submit()">
<FormField label="Name" :class="{ 'text-red-400': form.errors.name }">
<FormControl v-model="form.name" type="text" placeholder="Enter Name" required :error="form.errors.name">
<div class="text-red-400 text-sm" v-if="form.errors.name">
@ -65,8 +65,18 @@ const submit = async () => {
</FormControl>
</FormField>
<FormField label="Description" help="Optional. Description of new role" :class="{ 'text-red-400': form.errors.description }">
<FormControl v-model="form.description" v-bind:icon="mdiFormTextarea" name="display_name" :type="'textarea'" :error="form.errors.description">
<FormField
label="Description"
help="Optional. Description of new role"
:class="{ 'text-red-400': form.errors.description }"
>
<FormControl
v-model="form.description"
v-bind:icon="mdiFormTextarea"
name="display_name"
:type="'textarea'"
:error="form.errors.description"
>
<div class="text-red-400 text-sm" v-if="form.errors.description">
{{ form.errors.description }}
</div>
@ -81,8 +91,13 @@ const submit = async () => {
<template #footer>
<BaseButtons>
<BaseButton type="submit" color="info" label="Submit" :class="{ 'opacity-25': form.processing }"
:disabled="form.processing" />
<BaseButton
type="submit"
color="info"
label="Submit"
:class="{ 'opacity-25': form.processing }"
:disabled="form.processing"
/>
</BaseButtons>
</template>
</CardBox>

View File

@ -1,14 +1,11 @@
<script setup>
import { Head, Link, useForm } from "@inertiajs/vue3"
import {
mdiAccountKey,
mdiArrowLeftBoldOutline,
} from "@mdi/js"
import LayoutAuthenticated from "@/Layouts/LayoutAuthenticated.vue"
import SectionMain from "@/Components/SectionMain.vue"
import SectionTitleLineWithButton from "@/Components/SectionTitleLineWithButton.vue"
import CardBox from "@/Components/CardBox.vue"
import BaseButton from "@/Components/BaseButton.vue"
import { Head, Link, useForm } from '@inertiajs/vue3';
import { mdiAccountKey, mdiArrowLeftBoldOutline } from '@mdi/js';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
import CardBox from '@/Components/CardBox.vue';
import BaseButton from '@/Components/BaseButton.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
const props = defineProps({
@ -23,49 +20,41 @@ const props = defineProps({
roleHasPermissions: {
type: Object,
default: () => ({}),
}
})
},
});
</script>
<template>
<LayoutAuthenticated>
<Head title="View role" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiAccountKey" title="View role" main>
<BaseButton :route-name="stardust.route('role.index')" :icon="mdiArrowLeftBoldOutline" label="Back" color="white"
rounded-full small />
<BaseButton
:route-name="stardust.route('role.index')"
:icon="mdiArrowLeftBoldOutline"
label="Back"
color="white"
rounded-full
small
/>
</SectionTitleLineWithButton>
<CardBox class="mb-6">
<table>
<tbody>
<tr>
<td class="p-4 pl-8 text-slate-500 dark:text-slate-400 hidden lg:block">
Name
</td>
<td class="p-4 pl-8 text-slate-500 dark:text-slate-400 hidden lg:block">Name</td>
<td data-label="Name">
{{ role.name }}
</td>
</tr>
<tr>
<td class="p-4 pl-8 text-slate-500 dark:text-slate-400 hidden lg:block">
Name
</td>
<td class="p-4 pl-8 text-slate-500 dark:text-slate-400 hidden lg:block">Name</td>
<td data-label="Description">
{{ role.description }}
</td>
</tr>
<tr>
<td class="
p-4
pl-8
text-slate-500
dark:text-slate-400
hidden
lg:block
">
Created
</td>
<td class="p-4 pl-8 text-slate-500 dark:text-slate-400 hidden lg:block">Created</td>
<td data-label="Created">
<!-- {{ new Date(role.created_at).toLocaleString() }} -->
{{ role.created_at }}

View File

@ -40,12 +40,17 @@ const submit = async () => {
<template>
<LayoutAuthenticated>
<Head title="Add user" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiAccountKey" title="Add user" main>
<BaseButton :route-name="stardust.route('user.index')" :icon="mdiArrowLeftBoldOutline" label="Back"
color="modern" rounded-full small />
<BaseButton
:route-name="stardust.route('user.index')"
:icon="mdiArrowLeftBoldOutline"
label="Back"
color="modern"
rounded-full
small
/>
</SectionTitleLineWithButton>
<!-- @submit.prevent="form.post(stardust.route('user.store'))" -->
<CardBox form @submit.prevent="submit()">
@ -68,8 +73,7 @@ const submit = async () => {
</FormField>
<FormField label="Password" :class="{ 'text-red-400': errors.password }">
<FormControl v-model="form.password" type="password" placeholder="Enter Password"
:errors="errors.password">
<FormControl v-model="form.password" type="password" placeholder="Enter Password" :errors="errors.password">
<div class="text-red-400 text-sm" v-if="errors.password && Array.isArray(errors.password)">
<!-- {{ errors.password }} -->
{{ errors.password.join(', ') }}
@ -78,10 +82,16 @@ const submit = async () => {
</FormField>
<FormField label="Password Confirmation" :class="{ 'text-red-400': errors.password_confirmation }">
<FormControl v-model="form.password_confirmation" type="password"
placeholder="Enter Password Confirmation" :errors="errors.password">
<div class="text-red-400 text-sm"
v-if="errors.password_confirmation && Array.isArray(errors.password_confirmation)">
<FormControl
v-model="form.password_confirmation"
type="password"
placeholder="Enter Password Confirmation"
:errors="errors.password"
>
<div
class="text-red-400 text-sm"
v-if="errors.password_confirmation && Array.isArray(errors.password_confirmation)"
>
<!-- {{ errors.password_confirmation }} -->
{{ errors.password_confirmation.join(', ') }}
</div>
@ -100,8 +110,13 @@ const submit = async () => {
<template #footer>
<BaseButtons>
<BaseButton type="submit" color="info" label="Submit" :class="{ 'opacity-25': form.processing }"
:disabled="form.processing" />
<BaseButton
type="submit"
color="info"
label="Submit"
:class="{ 'opacity-25': form.processing }"
:disabled="form.processing"
/>
</BaseButtons>
</template>
</CardBox>

View File

@ -1,19 +1,16 @@
<script setup lang="ts">
import { Head, useForm, router } from "@inertiajs/vue3"
import {
mdiAccountKey,
mdiArrowLeftBoldOutline
} from "@mdi/js"
import LayoutAuthenticated from "@/Layouts/LayoutAuthenticated.vue"
import SectionMain from "@/Components/SectionMain.vue"
import SectionTitleLineWithButton from "@/Components/SectionTitleLineWithButton.vue"
import CardBox from "@/Components/CardBox.vue"
import FormField from '@/Components/FormField.vue'
import FormControl from '@/Components/FormControl.vue'
import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue'
import BaseDivider from '@/Components/BaseDivider.vue'
import BaseButton from '@/Components/BaseButton.vue'
import BaseButtons from '@/Components/BaseButtons.vue'
import { Head, useForm, router } from '@inertiajs/vue3';
import { mdiAccountKey, mdiArrowLeftBoldOutline } from '@mdi/js';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
import CardBox from '@/Components/CardBox.vue';
import FormField from '@/Components/FormField.vue';
import FormControl from '@/Components/FormControl.vue';
import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue';
import BaseDivider from '@/Components/BaseDivider.vue';
import BaseButton from '@/Components/BaseButton.vue';
import BaseButtons from '@/Components/BaseButtons.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
// import { Inertia } from '@inertiajs/inertia';
@ -34,7 +31,7 @@ const props = defineProps({
type: Object,
default: () => ({}),
},
})
});
const form = useForm({
_method: 'put',
@ -43,7 +40,7 @@ const form = useForm({
password: '',
password_confirmation: '',
roles: props.userHasRoles, // fill actual user roles from db
})
});
const submit = async () => {
// await Inertia.post(stardust.route('user.store'), form);
@ -53,16 +50,20 @@ const submit = async () => {
<template>
<LayoutAuthenticated>
<Head title="Update user" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiAccountKey" title="Update user" main>
<BaseButton :route-name="stardust.route('user.index')" :icon="mdiArrowLeftBoldOutline" label="Back"
color="white" rounded-full small />
<BaseButton
:route-name="stardust.route('user.index')"
:icon="mdiArrowLeftBoldOutline"
label="Back"
color="white"
rounded-full
small
/>
</SectionTitleLineWithButton>
<!-- <CardBox form @submit.prevent="form.put(stardust.route('user.update', [props.user.id]))"> -->
<CardBox form @submit.prevent="submit()">
<FormField label="Enter Login" :class="{ 'text-red-400': errors.name }">
<FormControl v-model="form.login" type="text" placeholder="Name" :errors="errors.login">
<div class="text-red-400 text-sm" v-if="errors.login">
@ -88,9 +89,16 @@ const submit = async () => {
</FormField>
<FormField label="Password Confirmation" :class="{ 'text-red-400': errors.password_confirmation }">
<FormControl v-model="form.password_confirmation" type="password" placeholder="Enter Password Confirmation"
:errors="errors.password">
<div class="text-red-400 text-sm" v-if="errors.password_confirmation && Array.isArray(errors.password_confirmation)">
<FormControl
v-model="form.password_confirmation"
type="password"
placeholder="Enter Password Confirmation"
:errors="errors.password"
>
<div
class="text-red-400 text-sm"
v-if="errors.password_confirmation && Array.isArray(errors.password_confirmation)"
>
{{ errors.password_confirmation.join(', ') }}
</div>
</FormControl>
@ -108,8 +116,13 @@ const submit = async () => {
<template #footer>
<BaseButtons>
<BaseButton type="submit" color="info" label="Submit" :class="{ 'opacity-25': form.processing }"
:disabled="form.processing" />
<BaseButton
type="submit"
color="info"
label="Submit"
:class="{ 'opacity-25': form.processing }"
:disabled="form.processing"
/>
</BaseButtons>
</template>
</CardBox>

View File

@ -2,13 +2,7 @@
// import { Head, Link, useForm, usePage } from '@inertiajs/inertia-vue3';
import { Head, Link, useForm, usePage } from '@inertiajs/vue3';
import { ComputedRef } from 'vue';
import {
mdiAccountKey,
mdiPlus,
mdiSquareEditOutline,
mdiTrashCan,
mdiAlertBoxOutline,
} from '@mdi/js';
import { mdiAccountKey, mdiPlus, mdiSquareEditOutline, mdiTrashCan, mdiAlertBoxOutline } from '@mdi/js';
import { computed } from 'vue';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
@ -62,19 +56,23 @@ const destroy = async (id) => {
if (confirm('Are you sure you want to delete?')) {
await formDelete.delete(stardust.route('user.destroy', [id]));
}
}
};
</script>
<template>
<LayoutAuthenticated>
<Head title="Users" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiAccountKey" title="Tethys Users" main>
<BaseButton v-if="can.create" :route-name="stardust.route('user.create')" :icon="mdiPlus" label="Add"
color="modern" rounded-full small />
<BaseButton
v-if="can.create"
:route-name="stardust.route('user.create')"
:icon="mdiPlus"
label="Add"
color="modern"
rounded-full
small
/>
</SectionTitleLineWithButton>
<!-- <label>{{ form.search }}</label> -->
<NotificationBar v-if="flash.message" color="success" :icon="mdiAlertBoxOutline">
@ -85,11 +83,13 @@ const destroy = async (id) => {
<form @submit.prevent="form.get(stardust.route('user.index'))">
<div class="py-2 flex">
<div class="flex pl-4">
<input type="search" v-model="form.search"
<input
type="search"
v-model="form.search"
class="rounded-md shadow-sm border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"
placeholder="Search" />
<BaseButton label="Search" type="submit" color="modern"
class="ml-4 inline-flex items-center px-4 py-2" />
placeholder="Search"
/>
<BaseButton label="Search" type="submit" color="modern" class="ml-4 inline-flex items-center px-4 py-2" />
</div>
</div>
</form>
@ -112,8 +112,10 @@ const destroy = async (id) => {
<tbody>
<tr v-for="user in users.data" :key="user.id">
<td data-label="Login">
<Link v-bind:href="stardust.route('user.show', [user.id])"
class="no-underline hover:underline text-cyan-600 dark:text-cyan-400">
<Link
v-bind:href="stardust.route('user.show', [user.id])"
class="no-underline hover:underline text-cyan-600 dark:text-cyan-400"
>
{{ user.login }}
</Link>
<!-- {{ user.id }} -->
@ -130,13 +132,7 @@ const destroy = async (id) => {
:icon="mdiSquareEditOutline"
small
/>
<BaseButton
v-if="can.delete"
color="danger"
:icon="mdiTrashCan"
small
@click="destroy(user.id)"
/>
<BaseButton v-if="can.delete" color="danger" :icon="mdiTrashCan" small @click="destroy(user.id)" />
</BaseButtons>
</td>
</tr>

View File

@ -52,9 +52,9 @@ export default {
}
</script> -->
<script lang ="ts">
<script lang="ts">
import { Component, Vue, Prop } from 'vue-facing-decorator';
import type User from "App/Models/User";
import type User from 'App/Models/User';
import { Link } from '@inertiajs/vue3';
import DefaultLayout from '@/Layouts/Default.vue';
// import { NInput, NButton } from 'naive-ui';
@ -74,13 +74,13 @@ export default class AppComponent extends Vue {
// Component Property
@Prop({
type: String,
default: () => (""),
default: () => '',
})
testing: string;
@Prop({
type: Array,
default: () => ([]),
default: () => [],
})
users: Array<User>;
}

View File

@ -32,12 +32,11 @@ import FormControl from '@/Components/FormControl.vue';
<template>
<LayoutGuest>
<Head title="Login" />
<SectionFullScreen v-slot="{ cardClass }">
<a class="text-2xl font-semibold flex justify-center items-center mb-8 lg:mb-10">
<img src="/logo.svg" class="h-10 mr-4" alt="Windster Logo">
<img src="/logo.svg" class="h-10 mr-4" alt="Windster Logo" />
<!-- <span class="self-center text-2xl font-bold whitespace-nowrap">Tethys</span> -->
</a>
<!-- Card -->
@ -49,13 +48,18 @@ import FormControl from '@/Components/FormControl.vue';
</NotificationBarInCard>
<FormField label="Email" label-for="email" help="Please enter your email">
<FormControl v-model="form.email" :icon="mdiAccount" id="email" autocomplete="email" type="email"
required />
<FormControl v-model="form.email" :icon="mdiAccount" id="email" autocomplete="email" type="email" required />
</FormField>
<FormField label="Password" label-for="password" help="Please enter your password">
<FormControl v-model="form.password" :icon="mdiAsterisk" type="password" id="password"
autocomplete="current-password" required />
<FormControl
v-model="form.password"
:icon="mdiAsterisk"
type="password"
id="password"
autocomplete="current-password"
required
/>
</FormField>
<FormCheckRadioGroup v-model="form.remember" name="remember" :options="{ remember: 'Remember' }" />
@ -78,8 +82,12 @@ import FormControl from '@/Components/FormControl.vue';
<BaseButtons>
<!-- <BaseButton type="submit" color="info" label="Login" :class="{ 'opacity-25': form.processing }"
v-bind:disabled="form.processing" /> -->
<button type="submit" v-bind:disabled="form.processing" :class="{ 'opacity-25': form.processing }"
class="text-white bg-cyan-600 hover:bg-cyan-700 focus:ring-4 focus:ring-cyan-200 font-medium rounded-lg text-base px-5 py-3 w-full sm:w-auto text-center">
<button
type="submit"
v-bind:disabled="form.processing"
:class="{ 'opacity-25': form.processing }"
class="text-white bg-cyan-600 hover:bg-cyan-700 focus:ring-4 focus:ring-cyan-200 font-medium rounded-lg text-base px-5 py-3 w-full sm:w-auto text-center"
>
Login to your account
</button>
<!-- <BaseButton v-if="canResetPassword" :route-name="route('password.request')" color="info" outline

View File

@ -23,7 +23,7 @@ import { useForm } from '@inertiajs/vue3';
import { Inertia } from '@inertiajs/inertia';
// import { NButton, NInput } from 'naive-ui';
// import { useForm } from '@inertiajs/inertia-vue3'
import FormInput from '@/Components/FormInput.vue'
import FormInput from '@/Components/FormInput.vue';
export default {
layout: AuthLayout,
@ -31,7 +31,7 @@ export default {
components: {
NButton,
// NInput,
FormInput
FormInput,
},
setup() {

View File

@ -58,44 +58,81 @@ const datasets = computed(() => mainService.datasets);
<template>
<LayoutAuthenticated>
<Head title="Dashboard" />
<!-- <section class="p-6" v-bind:class="containerMaxW"> -->
<SectionMain>
<SectionTitleLineWithButton v-bind:icon="mdiChartTimelineVariant" title="Overview" main>
<BaseButton href="https://gitea.geologie.ac.at/geolba/tethys" target="_blank" :icon="mdiGithub"
label="Star on Gitea" color="contrast" rounded-full small />
<BaseButton
href="https://gitea.geologie.ac.at/geolba/tethys"
target="_blank"
:icon="mdiGithub"
label="Star on Gitea"
color="contrast"
rounded-full
small
/>
</SectionTitleLineWithButton>
<div class="grid grid-cols-1 gap-6 lg:grid-cols-3 mb-6">
<CardBoxWidget trend="12%" trend-type="up" color="text-emerald-500" :icon="mdiAccountMultiple"
:number="authors.length" label="Authors" />
<CardBoxWidget trend="193" trend-type="info" color="text-blue-500" :icon="mdiDatabaseOutline"
:number="datasets.length" label="Publications" />
<CardBoxWidget
trend="12%"
trend-type="up"
color="text-emerald-500"
:icon="mdiAccountMultiple"
:number="authors.length"
label="Authors"
/>
<CardBoxWidget
trend="193"
trend-type="info"
color="text-blue-500"
:icon="mdiDatabaseOutline"
:number="datasets.length"
label="Publications"
/>
<!-- <CardBoxWidget trend="193" trend-type="info" color="text-blue-500" :icon="mdiCartOutline" :number="datasets.length"
prefix="$" label="Publications" /> -->
<CardBoxWidget trend="Overflow" trend-type="alert" color="text-red-500" :icon="mdiChartTimelineVariant"
:number="256" suffix="%" label="Performance" />
<CardBoxWidget
trend="Overflow"
trend-type="alert"
color="text-red-500"
:icon="mdiChartTimelineVariant"
:number="256"
suffix="%"
label="Performance"
/>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
<div class="flex flex-col justify-between">
<CardBoxClient v-for="client in authorBarItems" :key="client.id" :name="client.name"
:email="client.email" :date="client.created_at" :text="client.datasetCount" />
<CardBoxClient
v-for="client in authorBarItems"
:key="client.id"
:name="client.name"
:email="client.email"
:date="client.created_at"
:text="client.datasetCount"
/>
</div>
<div class="flex flex-col justify-between">
<CardBoxTransaction v-for="(transaction, index) in transactionBarItems" :key="index"
:amount="transaction.amount" :date="transaction.date" :business="transaction.business"
:type="transaction.type" :name="transaction.name" :account="transaction.account" />
<CardBoxTransaction
v-for="(transaction, index) in transactionBarItems"
:key="index"
:amount="transaction.amount"
:date="transaction.date"
:business="transaction.business"
:type="transaction.type"
:name="transaction.name"
:account="transaction.account"
/>
</div>
</div>
<SectionBannerStarOnGitHub />
<SectionTitleLineWithButton :icon="mdiChartPie" title="Trends overview (to do publications per year)" />
<CardBox title="Performance" :icon="mdiFinance" :header-icon="mdiReload" class="mb-6"
@header-icon-click="fillChartData">
<CardBox title="Performance" :icon="mdiFinance" :header-icon="mdiReload" class="mb-6" @header-icon-click="fillChartData">
<div v-if="chartData">
<line-chart :data="chartData" class="h-96" />
</div>
@ -103,9 +140,7 @@ const datasets = computed(() => mainService.datasets);
<SectionTitleLineWithButton :icon="mdiAccountMultiple" title="Submitters (to do)" />
<NotificationBar color="info" :icon="mdiMonitorCellphone">
<b>Responsive table.</b> Collapses on mobile
</NotificationBar>
<NotificationBar color="info" :icon="mdiMonitorCellphone"> <b>Responsive table.</b> Collapses on mobile </NotificationBar>
<CardBox :icon="mdiMonitorCellphone" title="Responsive table" has-table>
<TableSampleClients />
@ -113,32 +148,23 @@ const datasets = computed(() => mainService.datasets);
<CardBox>
<p class="mb-3 text-gray-500 dark:text-gray-400">
Discover the power of Tethys, the cutting-edge web backend solution that revolutionizes the way you
handle
research data. At the heart of Tethys lies our meticulously developed research data repository, which
leverages state-of-the-art CI/CD techniques to deliver a seamless and efficient experience.
Discover the power of Tethys, the cutting-edge web backend solution that revolutionizes the way you handle research
data. At the heart of Tethys lies our meticulously developed research data repository, which leverages state-of-the-art
CI/CD techniques to deliver a seamless and efficient experience.
</p>
<p class="mb-3 text-gray-500 dark:text-gray-400">
CI/CD, or Continuous Integration and Continuous Deployment, is a modern software development approach
that
ensures your code undergoes automated testing, continuous integration, and frequent deployment. By
embracing
CI/CD techniques, we ensure that every code change in our research data repository is thoroughly
validated,
enhancing reliability and accelerating development cycles.
CI/CD, or Continuous Integration and Continuous Deployment, is a modern software development approach that ensures your
code undergoes automated testing, continuous integration, and frequent deployment. By embracing CI/CD techniques, we
ensure that every code change in our research data repository is thoroughly validated, enhancing reliability and
accelerating development cycles.
</p>
<p class="mb-3 text-gray-500 dark:text-gray-400">
With Tethys, you can say goodbye to the complexities of manual deployments and embrace a streamlined
process
that eliminates errors and minimizes downtime. Our CI/CD pipeline automatically verifies each code
commit,
runs comprehensive tests, and deploys the repository seamlessly, ensuring that your research data is
always
up-to-date and accessible.
With Tethys, you can say goodbye to the complexities of manual deployments and embrace a streamlined process that
eliminates errors and minimizes downtime. Our CI/CD pipeline automatically verifies each code commit, runs comprehensive
tests, and deploys the repository seamlessly, ensuring that your research data is always up-to-date and accessible.
</p>
</CardBox>
</SectionMain>
<!-- </section> -->
</LayoutAuthenticated>
</template>

View File

@ -1,116 +1,42 @@
<script setup lang="ts">
import { Head } from '@inertiajs/vue3';
import { onMounted, onUnmounted, ref, Ref } from 'vue';
// import { MainService } from '@/Stores/main';;
import {
mdiChartTimelineVariant
} from '@mdi/js';
import { ref, Ref } from 'vue';
import { mdiChartTimelineVariant } from '@mdi/js';
import LayoutGuest from '@/Layouts/LayoutGuest.vue';
import SectionMain from '@/Components/SectionMain.vue';
// import CardBox from '@/Components/CardBox.vue';
import BaseButton from '@/Components/BaseButton.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
// import SectionBannerStarOnGitHub from '@/Components/SectionBannerStarOnGitea.vue';
import { Map } from 'leaflet/src/map/index';
import { Rectangle } from 'leaflet';
import { canvas } from 'leaflet/src/layer/vector/Canvas';
import { svg } from 'leaflet/src/layer/vector/SVG';
import { MapOptions } from '@/Components/Map/MapOptions';
import axios from 'axios';
import { LatLngBoundsExpression } from 'leaflet/src/geo/LatLngBounds';
import { tileLayerWMS } from 'leaflet/src/layer/tile/TileLayer.WMS';
import { Attribution } from 'leaflet/src/control/Control.Attribution';
import { stardust } from '@eidellev/adonis-stardust/client';
import DrawControlComponent from '@/Components/Map/draw.component.vue';
import { MapService } from '@/Stores/map.service';
import { LayerGroup } from 'leaflet/src/layer/LayerGroup'
import SearchMap from '@/Components/Map/SearchMap.vue';
import { OpensearchDocument } from '@/Dataset';
Map.include({
// @namespace Map; @method getRenderer(layer: Path): Renderer
// Returns the instance of `Renderer` that should be used to render the given
// `Path`. It will ensure that the `renderer` options of the map and paths
// are respected, and that the renderers do exist on the map.
getRenderer: function (layer) {
// @namespace Path; @option renderer: Renderer
// Use this specific instance of `Renderer` for this path. Takes
// precedence over the map's [default renderer](#map-renderer).
var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;
// const fitBounds: LatLngBoundsExpression = [
// [46.4318173285, 9.47996951665],
// [49.0390742051, 16.9796667823],
// ];
if (!renderer) {
renderer = this._renderer = this._createRenderer();
}
// const mapId = 'map';
if (!this.hasLayer(renderer)) {
this.addLayer(renderer);
}
return renderer;
},
// const coverage = {
// x_min: undefined,
// y_min: undefined,
// x_max: undefined,
// y_max: undefined,
// elevation_min: undefined,
// elevation_max: undefined,
// elevation_absolut: undefined,
// depth_min: undefined,
// depth_max: undefined,
// depth_absolut: undefined,
// time_min: undefined,
// time_max: undefined,
// time_absolut: undefined,
// };
_getPaneRenderer: function (name) {
if (name === 'overlayPane' || name === undefined) {
return false;
}
var renderer = this._paneRenderers[name];
if (renderer === undefined) {
renderer = this._createRenderer({ pane: name });
this._paneRenderers[name] = renderer;
}
return renderer;
},
_createRenderer: function (options) {
// @namespace Map; @option preferCanvas: Boolean = false
// Whether `Path`s should be rendered on a `Canvas` renderer.
// By default, all `Path`s are rendered in a `SVG` renderer.
return (this.options.preferCanvas && canvas(options)) || svg(options);
},
});
const DEFAULT_BASE_LAYER_NAME = 'BaseLayer';
const DEFAULT_BASE_LAYER_ATTRIBUTION = '&copy; <a target="_blank" href="http://osm.org/copyright">OpenStreetMap</a> contributors';
const OPEN_SEARCH_HOST = 'http://192.168.21.18';
let map: Map;
const fitBounds: LatLngBoundsExpression = [
[46.4318173285, 9.47996951665],
[49.0390742051, 16.9796667823],
];
const mapId = 'map';
const draw: Ref<DrawControlComponent | null> = ref(null);
const southWest = ref(null);
const northEast = ref(null);
const mapService = MapService();
const coverage = {
x_min: undefined,
y_min: undefined,
x_max: undefined,
y_max: undefined,
elevation_min: undefined,
elevation_max: undefined,
elevation_absolut: undefined,
depth_min: undefined,
depth_max: undefined,
depth_absolut: undefined,
time_min: undefined,
time_max: undefined,
time_absolut: undefined,
};
const filterLayerGroup = new LayerGroup();
// Replace with your actual data
const datasets: Ref<OpensearchDocument[]> = ref([]);
onMounted(() => {
initMap();
});
onUnmounted(() => {
map.off('zoomend zoomlevelschange');
});
const openAccessLicences: Array<string> = ['CC-BY-4.0', 'CC-BY-SA-4.0'];
const mapOptions: MapOptions = {
center: [48.208174, 16.373819],
@ -118,155 +44,10 @@ const mapOptions: MapOptions = {
zoomControl: false,
attributionControl: false,
};
const initMap = async () => {
// init leaflet map
map = new Map('map', mapOptions);
mapService.setMap(mapId, map);
map.scrollWheelZoom.disable();
map.fitBounds(fitBounds);
draw.value?.toggleDraw();
map.addLayer(filterLayerGroup);
const attributionControl = new Attribution().addTo(map);
attributionControl.setPrefix(false);
let osmGgray = tileLayerWMS('https://ows.terrestris.de/osm-gray/service', {
format: 'image/png',
attribution: DEFAULT_BASE_LAYER_ATTRIBUTION,
layers: 'OSM-WMS',
});
let layerOptions = {
label: DEFAULT_BASE_LAYER_NAME,
visible: true,
layer: osmGgray,
};
layerOptions.layer.addTo(map);
map.on('Draw.Event.CREATED', handleDrawEventCreated);
// // const query = {
// // query: {
// // term: {
// // id: "103"
// // }
// // }
// // };
// // to do : call extra method:
// const query = {
// // q: 'id:103'
// // q: 'author:"Iglseder, Christoph" OR title:"Datensatz"',
// // q: 'author:"Iglseder"',
// q: '*',
// _source: 'author,bbox_xmin,bbox_xmax,bbox_ymin,bbox_ymax,abstract,title',
// size: 1000
// // qf:"title^3 author^2 subject^1",
// }
// try {
// let response = await axios({
// method: 'GET',
// url: OPEN_SEARCH_HOST + '/tethys-records/_search',
// headers: { 'Content-Type': 'application/json' },
// params: query
// });
// // Loop through the hits in the response
// response.data.hits.hits.forEach(hit => {
// // Get the geo_location attribute
// // var geo_location = hit._source.geo_location;
// let xMin = hit._source.bbox_xmin;
// let xMax = hit._source.bbox_xmax;
// let yMin = hit._source.bbox_ymin;
// let yMax = hit._source.bbox_ymax;
// var bbox: LatLngBoundsExpression = [[yMin, xMin], [yMax, xMax]];
// // Parse the WKT string to get the bounding box coordinates
// // var bbox = wktToBbox(geo_location);
// // // Add the bounding box to the map as a rectangle
// new Rectangle(bbox, { color: "#ff7800", weight: 1 }).addTo(map);
// // console.log(hit._source);
// });
// } catch (error) {
// console.error(error);
// }
};
const handleDrawEventCreated = async (event) => {
filterLayerGroup.clearLayers();
datasets.value = [];
let layer = event.layer;
let bounds = layer.getBounds();
// coverage.x_min = bounds.getSouthWest().lng;
// coverage.y_min = bounds.getSouthWest().lat;
// coverage.x_max = bounds.getNorthEast().lng;
// coverage.y_max = bounds.getNorthEast().lat;
try {
let response = await axios({
method: 'POST',
url: OPEN_SEARCH_HOST + '/tethys-records/_search',
headers: { 'Content-Type': 'application/json' },
data: {
"size": 1000,
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"geo_location": { // replace 'location' with your geo-point field name
"top_left": {
"lat": bounds.getNorthEast().lat,
"lon": bounds.getSouthWest().lng
},
"bottom_right": {
"lat": bounds.getSouthWest().lat,
"lon": bounds.getNorthEast().lng
}
}
}
}
}
// _source: 'author,bbox_xmin,bbox_xmax,bbox_ymin,bbox_ymax,abstract,title',
// "size": 1000
}
}
});
// Loop through the hits in the response
response.data.hits.hits.forEach(hit => {
// Get the geo_location attribute
// var geo_location = hit._source.geo_location;
let xMin = hit._source.bbox_xmin;
let xMax = hit._source.bbox_xmax;
let yMin = hit._source.bbox_ymin;
let yMax = hit._source.bbox_ymax;
var bbox: LatLngBoundsExpression = [[yMin, xMin], [yMax, xMax]];
// Parse the WKT string to get the bounding box coordinates
// var bbox = wktToBbox(geo_location);
// // Add the bounding box to the map as a rectangle
let rect = new Rectangle(bbox, { color: "#ff7800", weight: 1 });
filterLayerGroup.addLayer(rect);
datasets.value.push(hit._source);
});
} catch (error) {
console.error(error);
}
};
</script>
<template>
<LayoutGuest>
<Head title="Map" />
<!-- <section class="p-6" v-bind:class="containerMaxW"> -->
@ -277,36 +58,46 @@ const handleDrawEventCreated = async (event) => {
<BaseButton :route-name="stardust.route('app.login.show')" label="Login" color="white" rounded-full small />
</SectionTitleLineWithButton>
<!-- <SectionBannerStarOnGitHub /> -->
<!-- <SectionBannerStarOnGitea /> -->
<!-- <CardBox> -->
<div id="map" class="map-container mapDesktop mt-6 mb-6 rounded-2xl py-12 px-6 text-center">
<!-- <div id="map" class="map-container mapDesktop mt-6 mb-6 rounded-2xl py-12 px-6 text-center">
<DrawControlComponent ref="draw" :preserve="false" :mapId="mapId" :southWest="southWest"
:northEast="northEast">
</DrawControlComponent>
</div>
</div> -->
<SearchMap :datasets="datasets" :map-options="mapOptions"></SearchMap>
<div d="search-result-list-wrapper" class="flex flex-wrap col-span-24">
<div d="search-result-list-wrapper" class="flex flex-wrap col-span-24 h-full">
<div v-for="dataset in datasets" :key="dataset.id" class="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 p-4">
<div class="bg-white rounded shadow p-6">
<h2 class="text-xl font-bold mb-2">{{ dataset.title_output }}</h2>
<h3 class="text-lg leading-tight text-gray-500 dark:text-slate-400">
{{ dataset.title_output }}
</h3>
<!-- <h2 class="text-xl font-bold mb-2">{{ dataset.title_output }}</h2> -->
<p class="text-gray-700 mb-2">{{ dataset.abstract_output }}</p>
<div class="text-sm text-gray-600">
<div v-for="author in dataset.author" :key="author" class="mb-1">{{ author }}</div>
</div>
<div class="mt-4">
<span
class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">{{
dataset.year }}</span>
<span
class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">{{
dataset.language }}</span>
<span class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">
{{ dataset.year }}
</span>
<span class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">
{{ dataset.language }}
</span>
</div>
<p>
<span class="label"><i class="fas fa-file"></i> {{ dataset.doctype }}</span>
<!-- <span>Licence: {{ document.licence }}</span> -->
<span v-if="openAccessLicences.includes(dataset.licence)" class="label titlecase"
><i class="fas fa-lock-open"></i> Open Access</span
>
</p>
</div>
</div>
</div>
</div>
</SectionMain>
<!-- </section> -->
</LayoutGuest></template>
</LayoutGuest>
</template>

View File

@ -12,7 +12,7 @@
<!-- <form-input v-bind:label="'Password'" v-bind:type="'password'" v-model="form.password" /> -->
<form-input v-bind:label="'Emai22l'" v-bind:type="'email'" v-model="form.email" :errors="errors.email" />
<form-input v-bind:label="'Password'" v-bind:type="'password'" v-model="form.password" :errors="errors.password"/>
<form-input v-bind:label="'Password'" v-bind:type="'password'" v-model="form.password" :errors="errors.password" />
<n-button attr-type="submit"> Register </n-button>
</form>
@ -20,12 +20,11 @@
</template>
<script lang="ts">
import RegisterViewComponent from "@/Pages/register-view/register-view-component";
import RegisterViewComponent from '@/Pages/register-view/register-view-component';
// import RegisterViewComponent from "./register-view-component";
// const test = RegisterViewComponent;
export default RegisterViewComponent;
// import { Component, Vue, Prop } from "vue-facing-decorator";
// import AuthLayout from '@/Layouts/Auth.vue';
// // import { reactive } from 'vue';
@ -34,8 +33,6 @@ export default RegisterViewComponent;
// import FormInput from '@/Components/FormInput.vue';// @/Components/FormInput.vue'
// // import { defineComponent } from 'vue';
// export default {
// layout: AuthLayout,
@ -115,10 +112,10 @@ export default RegisterViewComponent;
// await Inertia.post('/app/register', this.form);
// }
// }
// </script>
//
</script>
<!-- <style scoped>
.greeting {

View File

@ -2,7 +2,7 @@
"extends": "adonis-preset-ts/tsconfig.json",
"include": [
// "**/*",
"**/*",
"**/*"
// "./resources/js/**/*"
// "./resources/js/**/*.vue",
// "./resources/js/**/*.ts",
@ -30,22 +30,12 @@
"esModuleInterop": true, //neu
"allowSyntheticDefaultImports": true, //neu,
"paths": {
"App/*": [
"./app/*"
],
"Config/*": [
"./config/*"
],
"Contracts/*": [
"./contracts/*"
],
"Database/*": [
"./database/*"
],
"App/*": ["./app/*"],
"Config/*": ["./config/*"],
"Contracts/*": ["./contracts/*"],
"Database/*": ["./database/*"],
// "@/*": ["./resources/js/"],
"@/*": [
"./resources/js/*"
]
"@/*": ["./resources/js/*"]
// "vue$": ["vue/dist/vue.runtime.esm-bundler.js"],
},
"types": [
@ -61,7 +51,5 @@
"@adonisjs/auth"
]
},
"files": [
"index.d.ts"
]
"files": ["index.d.ts"]
}