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

View File

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

View File

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

View File

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

View File

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

View File

@ -117,7 +117,6 @@
"publisher_place": { "publisher_place": {
"type": "text" "type": "text"
}, },
"geo_location": { "geo_location": {
"type": "geo_shape", "type": "geo_shape",
"tree": "quadtree", "tree": "quadtree",
@ -136,8 +135,6 @@
"type": "float" "type": "float"
}, },
"status": { "status": {
"type": "keyword" "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. 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 ## Table of Contents
- [Getting Started](#getting-started) - [Getting Started](#getting-started)
- [Prerequisites](#prerequisites) - [Prerequisites](#prerequisites)
- [Installation](#installation) - [Installation](#installation)
@ -29,3 +30,4 @@ Before you begin, ensure you have met the following requirements:
```bash ```bash
git clone https://gitea.geologie.ac.at/geolba/tethys.backend.git git clone https://gitea.geologie.ac.at/geolba/tethys.backend.git
```

View File

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

View File

@ -59,24 +59,33 @@ total:
<template> <template>
<!-- <nav v-if="data.links.length > 3" --> <!-- <nav v-if="data.links.length > 3" -->
<nav v-if="data.total > 3" role="navigation" aria-label="Pagination Navigation" <nav v-if="data.total > 3" role="navigation" aria-label="Pagination Navigation" class="flex items-center justify-between">
class="flex items-center justify-between">
<div class="flex justify-between flex-1 sm:hidden"> <div class="flex justify-between flex-1 sm:hidden">
<span v-if="data.current_page <= 1" <span
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"> 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 Previous
</span> </span>
<Link v-else :href="data.previous_page_url" <Link
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"> 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 Previous
</Link> </Link>
<Link v-if="data.current_page < data.last_page" :href="data.next_page_url" <Link
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"> 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 Next
</Link> </Link>
<span v-else <span
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"> 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 Next
</span> </span>
</div> </div>
@ -99,23 +108,32 @@ total:
<span v-if="props.data.current_page <= 1" aria-disabled="true" aria-label="Previous"> <span v-if="props.data.current_page <= 1" aria-disabled="true" aria-label="Previous">
<span <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" 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"> <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" 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> </svg>
</span> </span>
</span> </span>
<!-- <Link v-else :href="data.previous_page_url" rel="prev" --> <!-- <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" 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"> <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" 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> </svg>
</Link> </Link>
@ -133,24 +151,33 @@ total:
</template> </template>
</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" 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"> <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" 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> </svg>
</Link> </Link>
<!-- else disabled link --> <!-- else disabled link -->
<span v-else aria-disabled="true" aria-label="Next"> <span v-else aria-disabled="true" aria-label="Next">
<span <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" 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"> <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" 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> </svg>
</span> </span>
</span> </span>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,37 +4,29 @@ import { computed } from 'vue';
const props = defineProps({ const props = defineProps({
path: { path: {
type: String, type: String,
required: true required: true,
}, },
w: { w: {
type: String, type: String,
default: 'w-6' default: 'w-6',
}, },
h: { h: {
type: String, type: String,
default: 'h-6' default: 'h-6',
}, },
size: { size: {
type: [String, Number], 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> </script>
<template> <template>
<span :class="spanClass"> <span :class="spanClass">
<svg <svg viewBox="0 0 24 24" :width="size" :height="size" class="inline-block">
viewBox="0 0 24 24" <path fill="currentColor" :d="path" />
:width="size"
:height="size"
class="inline-block"
>
<path
fill="currentColor"
:d="path"
/>
</svg> </svg>
</span> </span>
</template> </template>

View File

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

View File

@ -30,8 +30,8 @@ const props = defineProps({
}, },
deleteId: { deleteId: {
type: Number, type: Number,
default: null default: null,
} },
}); });
const emit = defineEmits(['update:modelValue', 'cancel', 'confirm']); const emit = defineEmits(['update:modelValue', 'cancel', 'confirm']);
@ -49,7 +49,6 @@ const confirmCancel = (mode) => {
} else { } else {
emit(mode); emit(mode);
} }
}; };
const confirm = () => confirmCancel('confirm'); const confirm = () => confirmCancel('confirm');

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -21,7 +21,8 @@
</div> </div>
</div> </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="flex-auto border-t-2 transition duration-500 ease-in-out invisible sm:visible"
:class="[isChecked ? 'border-teal-600' : 'border-gray-300']" :class="[isChecked ? 'border-teal-600' : 'border-gray-300']"
></div> ></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> <fa-icon [icon]="faSearchLocation"></fa-icon>
</button> --> </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" 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']" type="button"
@click.prevent="toggleDraw"> :class="[_enabled ? 'cursor-not-allowed bg-cyan-200' : 'bg-teal-50 is-active']"
@click.prevent="toggleDraw"
>
<BaseIcon v-if="mdiDrawPen" :path="mdiDrawPen" /> <BaseIcon v-if="mdiDrawPen" :path="mdiDrawPen" />
</button> </button>
</div> </div>
@ -53,15 +56,14 @@ export default class DrawControlComponent extends Vue {
metric: true, // Whether to use the metric measurement system or imperial metric: true, // Whether to use the metric measurement system or imperial
}; };
@Prop() public mapId: string; @Prop() public mapId: string;
// @Prop() public map: Map; // @Prop() public map: Map;
@Prop public southWest: LatLngBounds; @Prop public southWest: LatLngBounds;
@Prop public northEast: LatLngBounds; @Prop public northEast: LatLngBounds;
@Prop({ @Prop({
default: true default: true,
}) public preserve: boolean; })
public preserve: boolean;
mapService = MapService(); mapService = MapService();
public _enabled; public _enabled;
@ -97,7 +99,6 @@ export default class DrawControlComponent extends Vue {
// @Ref('inputDraw') private _inputDraw: HTMLElement; // @Ref('inputDraw') private _inputDraw: HTMLElement;
private addHooks() { private addHooks() {
// L.Draw.Feature.prototype.addHooks.call(this); // L.Draw.Feature.prototype.addHooks.call(this);
this._map = this.mapService.getMap(this.mapId); this._map = this.mapService.getMap(this.mapId);

View File

@ -1,8 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { usePage, router } from '@inertiajs/vue3' import { usePage, router } from '@inertiajs/vue3';
// import { usePage } from '@inertiajs/inertia-vue3'; // import { usePage } from '@inertiajs/inertia-vue3';
// import { Inertia } from '@inertiajs/inertia'; // import { Inertia } from '@inertiajs/inertia';
import {ComputedRef} from "vue"; import { ComputedRef } from 'vue';
import { computed, ref } from 'vue'; import { computed, ref } from 'vue';
import { containerMaxW } from '@/config.js'; import { containerMaxW } from '@/config.js';
@ -34,13 +34,11 @@ import UserAvatarCurrentUser from '@/Components/UserAvatarCurrentUser.vue';
import BaseIcon from '@/Components/BaseIcon.vue'; import BaseIcon from '@/Components/BaseIcon.vue';
import NavBarSearch from '@/Components/NavBarSearch.vue'; import NavBarSearch from '@/Components/NavBarSearch.vue';
import { stardust } from '@eidellev/adonis-stardust/client'; 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 mainStore = MainService();
// const userName = computed(() =>mainStore.userName); // const userName = computed(() =>mainStore.userName);
const styleService = StyleService(); const styleService = StyleService();
// const props = defineProps({ // const props = defineProps({
// user: { // user: {
@ -82,16 +80,11 @@ const logout = async() => {
</script> </script>
<template> <template>
<nav <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">
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 lg:items-stretch" :class="containerMaxW">
<div class="flex-1 items-stretch flex h-14"> <div class="flex-1 items-stretch flex h-14">
<NavBarItem type="flex lg:hidden" @click.prevent="layoutStore.asideMobileToggle()"> <NavBarItem type="flex lg:hidden" @click.prevent="layoutStore.asideMobileToggle()">
<BaseIcon <BaseIcon :path="layoutStore.isAsideMobileExpanded ? mdiBackburger : mdiForwardburger" size="24" />
:path="layoutStore.isAsideMobileExpanded ? mdiBackburger : mdiForwardburger"
size="24"
/>
</NavBarItem> </NavBarItem>
<NavBarItem type="hidden lg:flex xl:hidden" @click.prevent="menuOpenLg"> <NavBarItem type="hidden lg:flex xl:hidden" @click.prevent="menuOpenLg">
<BaseIcon :path="mdiMenu" size="24" /> <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="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']" :class="[isMenuNavBarActive ? 'block' : 'hidden']"
> >
<div <div class="max-h-screen-menu overflow-y-auto lg:overflow-visible lg:flex lg:items-stretch lg:justify-end lg:ml-auto">
class="max-h-screen-menu overflow-y-auto lg:overflow-visible lg:flex lg:items-stretch lg:justify-end lg:ml-auto"
>
<NavBarMenu> <NavBarMenu>
<NavBarItemLabel :icon="mdiMenu" label="Help menu" /> <NavBarItemLabel :icon="mdiMenu" label="Help menu" />
<template #dropdown> <template #dropdown>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,9 +4,10 @@ import { Link } from '@inertiajs/vue3';
const props = defineProps(['href', 'active']); 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-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> </script>

View File

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

View File

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

View File

@ -2,8 +2,8 @@
defineProps({ defineProps({
custom: Boolean, custom: Boolean,
first: Boolean, first: Boolean,
last: Boolean last: Boolean,
}) });
</script> </script>
<template> <template>
@ -12,10 +12,7 @@ defineProps({
: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" /> <slot v-if="custom" />
<h1 <h1 v-else class="text-2xl text-gray-500 dark:text-slate-400">
v-else
class="text-2xl text-gray-500 dark:text-slate-400"
>
<slot /> <slot />
</h1> </h1>
</section> </section>

View File

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

View File

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

View File

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

View File

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

View File

@ -19,7 +19,7 @@ const props = defineProps({
const avatar = computed( 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/${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> <template>
<div> <div>
<img <img :src="avatar" :alt="username" class="rounded-full block h-auto w-full max-w-full bg-gray-100 dark:bg-slate-800" />
:src="avatar"
:alt="username"
class="rounded-full block h-auto w-full max-w-full bg-gray-100 dark:bg-slate-800"
/>
</div> </div>
</template> </template>

View File

@ -15,5 +15,10 @@ onMounted(() => {
</script> </script>
<template> <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> </template>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -32,12 +32,11 @@ import FormControl from '@/Components/FormControl.vue';
<template> <template>
<LayoutGuest> <LayoutGuest>
<Head title="Login" /> <Head title="Login" />
<SectionFullScreen v-slot="{ cardClass }"> <SectionFullScreen v-slot="{ cardClass }">
<a class="text-2xl font-semibold flex justify-center items-center mb-8 lg:mb-10"> <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> --> <!-- <span class="self-center text-2xl font-bold whitespace-nowrap">Tethys</span> -->
</a> </a>
<!-- Card --> <!-- Card -->
@ -49,13 +48,18 @@ import FormControl from '@/Components/FormControl.vue';
</NotificationBarInCard> </NotificationBarInCard>
<FormField label="Email" label-for="email" help="Please enter your email"> <FormField label="Email" label-for="email" help="Please enter your email">
<FormControl v-model="form.email" :icon="mdiAccount" id="email" autocomplete="email" type="email" <FormControl v-model="form.email" :icon="mdiAccount" id="email" autocomplete="email" type="email" required />
required />
</FormField> </FormField>
<FormField label="Password" label-for="password" help="Please enter your password"> <FormField label="Password" label-for="password" help="Please enter your password">
<FormControl v-model="form.password" :icon="mdiAsterisk" type="password" id="password" <FormControl
autocomplete="current-password" required /> v-model="form.password"
:icon="mdiAsterisk"
type="password"
id="password"
autocomplete="current-password"
required
/>
</FormField> </FormField>
<FormCheckRadioGroup v-model="form.remember" name="remember" :options="{ remember: 'Remember' }" /> <FormCheckRadioGroup v-model="form.remember" name="remember" :options="{ remember: 'Remember' }" />
@ -78,8 +82,12 @@ import FormControl from '@/Components/FormControl.vue';
<BaseButtons> <BaseButtons>
<!-- <BaseButton type="submit" color="info" label="Login" :class="{ 'opacity-25': form.processing }" <!-- <BaseButton type="submit" color="info" label="Login" :class="{ 'opacity-25': form.processing }"
v-bind:disabled="form.processing" /> --> v-bind:disabled="form.processing" /> -->
<button type="submit" v-bind:disabled="form.processing" :class="{ 'opacity-25': form.processing }" <button
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"> 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 Login to your account
</button> </button>
<!-- <BaseButton v-if="canResetPassword" :route-name="route('password.request')" color="info" outline <!-- <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 { Inertia } from '@inertiajs/inertia';
// import { NButton, NInput } from 'naive-ui'; // import { NButton, NInput } from 'naive-ui';
// import { useForm } from '@inertiajs/inertia-vue3' // import { useForm } from '@inertiajs/inertia-vue3'
import FormInput from '@/Components/FormInput.vue' import FormInput from '@/Components/FormInput.vue';
export default { export default {
layout: AuthLayout, layout: AuthLayout,
@ -31,7 +31,7 @@ export default {
components: { components: {
NButton, NButton,
// NInput, // NInput,
FormInput FormInput,
}, },
setup() { setup() {

View File

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

View File

@ -1,116 +1,42 @@
<script setup lang="ts"> <script setup lang="ts">
import { Head } from '@inertiajs/vue3'; import { Head } from '@inertiajs/vue3';
import { onMounted, onUnmounted, ref, Ref } from 'vue'; import { ref, Ref } from 'vue';
// import { MainService } from '@/Stores/main';; import { mdiChartTimelineVariant } from '@mdi/js';
import {
mdiChartTimelineVariant
} from '@mdi/js';
import LayoutGuest from '@/Layouts/LayoutGuest.vue'; import LayoutGuest from '@/Layouts/LayoutGuest.vue';
import SectionMain from '@/Components/SectionMain.vue'; import SectionMain from '@/Components/SectionMain.vue';
// import CardBox from '@/Components/CardBox.vue';
import BaseButton from '@/Components/BaseButton.vue'; import BaseButton from '@/Components/BaseButton.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.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 { 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 { stardust } from '@eidellev/adonis-stardust/client';
import DrawControlComponent from '@/Components/Map/draw.component.vue'; import SearchMap from '@/Components/Map/SearchMap.vue';
import { MapService } from '@/Stores/map.service';
import { LayerGroup } from 'leaflet/src/layer/LayerGroup'
import { OpensearchDocument } from '@/Dataset'; import { OpensearchDocument } from '@/Dataset';
Map.include({ // const fitBounds: LatLngBoundsExpression = [
// @namespace Map; @method getRenderer(layer: Path): Renderer // [46.4318173285, 9.47996951665],
// Returns the instance of `Renderer` that should be used to render the given // [49.0390742051, 16.9796667823],
// `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) { // const mapId = 'map';
renderer = this._renderer = this._createRenderer();
}
if (!this.hasLayer(renderer)) { // const coverage = {
this.addLayer(renderer); // x_min: undefined,
} // y_min: undefined,
return renderer; // 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 // Replace with your actual data
const datasets: Ref<OpensearchDocument[]> = ref([]); const datasets: Ref<OpensearchDocument[]> = ref([]);
const openAccessLicences: Array<string> = ['CC-BY-4.0', 'CC-BY-SA-4.0'];
onMounted(() => {
initMap();
});
onUnmounted(() => {
map.off('zoomend zoomlevelschange');
});
const mapOptions: MapOptions = { const mapOptions: MapOptions = {
center: [48.208174, 16.373819], center: [48.208174, 16.373819],
@ -118,155 +44,10 @@ const mapOptions: MapOptions = {
zoomControl: false, zoomControl: false,
attributionControl: 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> </script>
<template> <template>
<LayoutGuest> <LayoutGuest>
<Head title="Map" /> <Head title="Map" />
<!-- <section class="p-6" v-bind:class="containerMaxW"> --> <!-- <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 /> <BaseButton :route-name="stardust.route('app.login.show')" label="Login" color="white" rounded-full small />
</SectionTitleLineWithButton> </SectionTitleLineWithButton>
<!-- <SectionBannerStarOnGitea /> -->
<!-- <SectionBannerStarOnGitHub /> -->
<!-- <CardBox> --> <!-- <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" <DrawControlComponent ref="draw" :preserve="false" :mapId="mapId" :southWest="southWest"
:northEast="northEast"> :northEast="northEast">
</DrawControlComponent> </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 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"> <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> <p class="text-gray-700 mb-2">{{ dataset.abstract_output }}</p>
<div class="text-sm text-gray-600"> <div class="text-sm text-gray-600">
<div v-for="author in dataset.author" :key="author" class="mb-1">{{ author }}</div> <div v-for="author in dataset.author" :key="author" class="mb-1">{{ author }}</div>
</div> </div>
<div class="mt-4"> <div class="mt-4">
<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">
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 }}
dataset.year }}</span> </span>
<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">
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 }}
dataset.language }}</span> </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>
</div> </div>
</div>
</SectionMain> </SectionMain>
<!-- </section> --> <!-- </section> -->
</LayoutGuest></template> </LayoutGuest>
</template>

View File

@ -20,12 +20,11 @@
</template> </template>
<script lang="ts"> <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"; // import RegisterViewComponent from "./register-view-component";
// const test = RegisterViewComponent; // const test = RegisterViewComponent;
export default RegisterViewComponent; export default RegisterViewComponent;
// import { Component, Vue, Prop } from "vue-facing-decorator"; // import { Component, Vue, Prop } from "vue-facing-decorator";
// import AuthLayout from '@/Layouts/Auth.vue'; // import AuthLayout from '@/Layouts/Auth.vue';
// // import { reactive } from 'vue'; // // import { reactive } from 'vue';
@ -34,8 +33,6 @@ export default RegisterViewComponent;
// import FormInput from '@/Components/FormInput.vue';// @/Components/FormInput.vue' // import FormInput from '@/Components/FormInput.vue';// @/Components/FormInput.vue'
// // import { defineComponent } from 'vue'; // // import { defineComponent } from 'vue';
// export default { // export default {
// layout: AuthLayout, // layout: AuthLayout,
@ -115,10 +112,10 @@ export default RegisterViewComponent;
// await Inertia.post('/app/register', this.form); // await Inertia.post('/app/register', this.form);
// } // }
// } // }
// </script> //
</script>
<!-- <style scoped> <!-- <style scoped>
.greeting { .greeting {

View File

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