feat: update to vite.js, Refactor configuration files, remove unused assets, and clean up commented code:
All checks were successful
CI / container-job (push) Successful in 43s

- ace.js: use ts-node-maintained
- adonisrc.ts: load vite_provider, sett assetBundler to false, addd hooks property
- Dockerfile: change to node version 22
- package.json: remove babel depencies; add @swc/wasm, add vitejs/plugin-vue, add hot-hook, add vite,  update eslint-config-prettier, tailwindcss, ts-node-maintained
- new vite.config.js and config/vite.ts
- inertia.js
- improved own vinejs_provider.ts
- adapted app.css needed for vitejs
- adapted app.ts: new resolve method neede for vitejs
relocated resources/js/logo.svg
- remove Buffer import into FileUpload.vue
- Create.vue: improved submit needed for @inertiajs/vue3 form helper
- Edit.vue: mproved submit needed for @inertiajs/vue3 form helper
- kernel.ts: load vite_middleware
- formated rotes.ts file
- rewritten allowed_extensions_mimetypes.ts file (removed typescript errors)
This commit is contained in:
Kaimbacher 2025-02-07 10:14:57 +01:00
parent 8d47a58d29
commit 4c5a8f5a42
40 changed files with 1647 additions and 4926 deletions

View file

@ -1,7 +1,7 @@
################## First Stage - Creating base ######################### ################## First Stage - Creating base #########################
# Created a variable to hold our node base image # Created a variable to hold our node base image
ARG NODE_IMAGE=node:20-bookworm-slim ARG NODE_IMAGE=node:22-bookworm-slim
FROM $NODE_IMAGE AS base FROM $NODE_IMAGE AS base
# Install dumb-init and ClamAV, and perform ClamAV database update # Install dumb-init and ClamAV, and perform ClamAV database update

5
ace.js
View file

@ -15,8 +15,9 @@
/** /**
* Register hook to process TypeScript files using ts-node * Register hook to process TypeScript files using ts-node
*/ */
import { register } from 'node:module'; // import { register } from 'node:module';
register('ts-node/esm', import.meta.url); // register('ts-node/esm', import.meta.url);
import 'ts-node-maintained/register/esm';
/** /**
* Import ace console entrypoint * Import ace console entrypoint

View file

@ -1,7 +1,7 @@
import { defineConfig } from '@adonisjs/core/app' import { defineConfig } from '@adonisjs/core/app';
export default defineConfig({ export default defineConfig({
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Commands | Commands
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -10,12 +10,11 @@ export default defineConfig({
| will be scanned automatically from the "./commands" directory. | will be scanned automatically from the "./commands" directory.
*/ */
commands: [ commands: [
() => import('@adonisjs/core/commands'), () => import('@adonisjs/core/commands'),
() => import('@adonisjs/lucid/commands'), () => import('@adonisjs/lucid/commands'),
() => import('@adonisjs/mail/commands') () => import('@adonisjs/mail/commands')],
], /*
/*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Preloads | Preloads
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -23,20 +22,20 @@ export default defineConfig({
| List of modules to import before starting the application. | List of modules to import before starting the application.
| |
*/ */
preloads: [ preloads: [
() => import('./start/routes.js'), () => import('./start/routes.js'),
() => import('./start/kernel.js'), () => import('./start/kernel.js'),
() => import('#start/validator'), () => import('#start/validator'),
() => import('#start/rules/unique'), () => import('#start/rules/unique'),
() => import('#start/rules/translated_language'), () => import('#start/rules/translated_language'),
() => import('#start/rules/unique_person'), () => import('#start/rules/unique_person'),
() => import('#start/rules/file_length'), () => import('#start/rules/file_length'),
() => import('#start/rules/file_scan'), () => import('#start/rules/file_scan'),
() => import('#start/rules/allowed_extensions_mimetypes'), () => import('#start/rules/allowed_extensions_mimetypes'),
() => import('#start/rules/dependent_array_min_length'), () => import('#start/rules/dependent_array_min_length'),
() => import('#start/rules/referenceValidation') () => import('#start/rules/referenceValidation'),
], ],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Service providers | Service providers
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -45,48 +44,48 @@ export default defineConfig({
| application | application
| |
*/ */
providers: [ providers: [
// () => import('./providers/AppProvider.js'), // () => import('./providers/AppProvider.js'),
() => import('@adonisjs/core/providers/app_provider'), () => import('@adonisjs/core/providers/app_provider'),
() => import('@adonisjs/core/providers/hash_provider'), () => import('@adonisjs/core/providers/hash_provider'),
{ {
file: () => import('@adonisjs/core/providers/repl_provider'), file: () => import('@adonisjs/core/providers/repl_provider'),
environment: ['repl', 'test'], environment: ['repl', 'test'],
}, },
() => import('@adonisjs/session/session_provider'), () => import('@adonisjs/session/session_provider'),
() => import('@adonisjs/core/providers/edge_provider'), () => import('@adonisjs/core/providers/edge_provider'),
() => import('@adonisjs/shield/shield_provider'), () => import('@adonisjs/shield/shield_provider'),
// () => import('@eidellev/inertia-adonisjs'), // () => import('@eidellev/inertia-adonisjs'),
// () => import('@adonisjs/inertia/inertia_provider'), // () => import('@adonisjs/inertia/inertia_provider'),
() => import('#providers/app_provider'), () => import('#providers/app_provider'),
() => import('#providers/inertia_provider'), () => import('#providers/inertia_provider'),
() => import('@adonisjs/lucid/database_provider'), () => import('@adonisjs/lucid/database_provider'),
() => import('@adonisjs/auth/auth_provider'), () => import('@adonisjs/auth/auth_provider'),
// () => import('@eidellev/adonis-stardust'), // () => import('@eidellev/adonis-stardust'),
() => import('@adonisjs/redis/redis_provider'), () => import('@adonisjs/redis/redis_provider'),
() => import('@adonisjs/encore/encore_provider'), // () => import('@adonisjs/encore/encore_provider'),
() => import('@adonisjs/static/static_provider'), () => import('@adonisjs/static/static_provider'),
() => import('#providers/stardust_provider'), () => import('#providers/stardust_provider'),
() => import('#providers/query_builder_provider'), () => import('#providers/query_builder_provider'),
() => import('#providers/token_worker_provider'), () => import('#providers/token_worker_provider'),
// () => import('#providers/validator_provider'), // () => import('#providers/validator_provider'),
() => import('#providers/drive/provider/drive_provider'), () => import('#providers/drive/provider/drive_provider'),
// () => import('@adonisjs/core/providers/vinejs_provider'), // () => import('@adonisjs/core/providers/vinejs_provider'),
() => import('#providers/vinejs_provider'), () => import('#providers/vinejs_provider'),
() => import('@adonisjs/mail/mail_provider') () => import('@adonisjs/mail/mail_provider'),
// () => import('#providers/mail_provider'), () => import('@adonisjs/vite/vite_provider'),
], ],
metaFiles: [ metaFiles: [
{ {
pattern: 'public/**', pattern: 'public/**',
reloadServer: false, reloadServer: false,
}, },
{ {
pattern: 'resources/views/**/*.edge', pattern: 'resources/views/**/*.edge',
reloadServer: false, reloadServer: false,
}, },
], ],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Tests | Tests
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -95,22 +94,24 @@ export default defineConfig({
| and add additional suites. | and add additional suites.
| |
*/ */
tests: { tests: {
suites: [ suites: [
{ {
files: ['tests/unit/**/*.spec(.ts|.js)'], files: ['tests/unit/**/*.spec(.ts|.js)'],
name: 'unit', name: 'unit',
timeout: 2000, timeout: 2000,
}, },
{ {
files: ['tests/functional/**/*.spec(.ts|.js)'], files: ['tests/functional/**/*.spec(.ts|.js)'],
name: 'functional', name: 'functional',
timeout: 30000, timeout: 30000,
}, },
], ],
forceExit: false, forceExit: false,
}, },
assetsBundler: false,
hooks: {
onBuildStarting: [() => import('@adonisjs/vite/build_hook')],
}) },
// assetsBundler: false
});

View file

@ -6,7 +6,7 @@ import DoiClientException from '#app/exceptions/DoiClientException';
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import logger from '@adonisjs/core/services/logger'; import logger from '@adonisjs/core/services/logger';
import { AxiosResponse } from 'axios'; import { AxiosResponse } from 'axios';
import axios from 'axios'; import { default as axios } from 'axios';
export class DoiClient implements DoiClientContract { export class DoiClient implements DoiClientContract {
public username: string; public username: string;
@ -50,7 +50,7 @@ export class DoiClient implements DoiClientContract {
'Content-Type': 'application/xml;charset=UTF-8', 'Content-Type': 'application/xml;charset=UTF-8',
}; };
try { try {
const metadataResponse = await axios.default.put(`${this.serviceUrl}/metadata/${doiValue}`, xmlMeta, { auth, headers }); const metadataResponse = await axios.put(`${this.serviceUrl}/metadata/${doiValue}`, xmlMeta, { auth, headers });
// Response Codes // Response Codes
// 201 Created: operation successful // 201 Created: operation successful
@ -65,7 +65,7 @@ export class DoiClient implements DoiClientContract {
throw new DoiClientException(metadataResponse.status, message); throw new DoiClientException(metadataResponse.status, message);
} }
const doiResponse = await axios.default.put(`${this.serviceUrl}/doi/${doiValue}`, `doi=${doiValue}\nurl=${landingPageUrl}`, { const doiResponse = await axios.put(`${this.serviceUrl}/doi/${doiValue}`, `doi=${doiValue}\nurl=${landingPageUrl}`, {
auth, auth,
headers, headers,
}); });

View file

@ -3,7 +3,6 @@ import { column, hasMany, belongsTo, SnakeCaseNamingStrategy, computed } from '@
import HashValue from './hash_value.js'; import HashValue from './hash_value.js';
import Dataset from './dataset.js'; import Dataset from './dataset.js';
import BaseModel from './base_model.js'; import BaseModel from './base_model.js';
// import { Buffer } from 'buffer';
import * as fs from 'fs'; import * as fs from 'fs';
import crypto from 'crypto'; import crypto from 'crypto';
// import Drive from '@ioc:Adonis/Core/Drive'; // import Drive from '@ioc:Adonis/Core/Drive';

View file

@ -1,7 +1,8 @@
import { defineConfig } from '@adonisjs/inertia'; import { defineConfig } from '@adonisjs/inertia';
import type { HttpContext } from '@adonisjs/core/http'; import type { HttpContext } from '@adonisjs/core/http';
import type { InferSharedProps } from '@adonisjs/inertia/types'
export default defineConfig({ const inertiaConfig = defineConfig({
/** /**
* Path to the Edge view that will be used as the root view for Inertia responses * Path to the Edge view that will be used as the root view for Inertia responses
*/ */
@ -52,6 +53,12 @@ export default defineConfig({
}, },
}); });
export default inertiaConfig
declare module '@adonisjs/inertia/types' {
export interface SharedProps extends InferSharedProps<typeof inertiaConfig> {}
}
// import { InertiaConfig } from '@ioc:EidelLev/Inertia'; // import { InertiaConfig } from '@ioc:EidelLev/Inertia';
// /* // /*

29
config/vite.ts Normal file
View file

@ -0,0 +1,29 @@
import { defineConfig } from '@adonisjs/vite';
const viteBackendConfig = defineConfig({
/**
* The output of vite will be written inside this
* directory. The path should be relative from
* the application root.
*/
buildDirectory: 'public/assets',
/**
* The path to the manifest file generated by the
* "vite build" command.
*/
manifestFile: 'public/assets/.vite/manifest.json',
/**
* Feel free to change the value of the "assetsUrl" to
* point to a CDN in production.
*/
assetsUrl: '/assets',
// neu
// scriptAttributes: {
// defer: true,
// },
});
export default viteBackendConfig;

5149
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,8 @@
"private": true, "private": true,
"scripts": { "scripts": {
"type-check": "tsc --noEmit", "type-check": "tsc --noEmit",
"dev": "node ace serve --watch", "dev": "node ace serve",
"devInspect": "node ace serve --watch --node-args='--inspect'",
"compress:xslt": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/datasetxml2oai-pmh.xslt -export:public/assets2/datasetxml2oai.sef.json -t -nogo '-ns:##html5'", "compress:xslt": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/datasetxml2oai-pmh.xslt -export:public/assets2/datasetxml2oai.sef.json -t -nogo '-ns:##html5'",
"compress:solr": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/solr.xslt -export:public/assets2/solr.sef.json -t -nogo '-ns:##html5'", "compress:solr": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/solr.xslt -export:public/assets2/solr.sef.json -t -nogo '-ns:##html5'",
"compress:doi": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/doi_datacite.xslt -export:public/assets2/doi_datacite.sef.json -t -nogo '-ns:##html5'", "compress:doi": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/doi_datacite.xslt -export:public/assets2/doi_datacite.sef.json -t -nogo '-ns:##html5'",
@ -26,23 +27,17 @@
"devDependencies": { "devDependencies": {
"@adonisjs/assembler": "^7.1.1", "@adonisjs/assembler": "^7.1.1",
"@adonisjs/tsconfig": "^1.4.0", "@adonisjs/tsconfig": "^1.4.0",
"@babel/core": "^7.20.12",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-decorators": "^7.20.13",
"@babel/plugin-transform-runtime": "^7.19.6",
"@babel/preset-env": "^7.20.2",
"@babel/preset-typescript": "^7.18.6",
"@japa/assert": "^4.0.1", "@japa/assert": "^4.0.1",
"@japa/plugin-adonisjs": "^4.0.0", "@japa/plugin-adonisjs": "^4.0.0",
"@japa/runner": "^4.2.0", "@japa/runner": "^4.2.0",
"@mdi/js": "^7.1.96", "@mdi/js": "^7.1.96",
"@poppinss/utils": "^6.7.2", "@poppinss/utils": "^6.7.2",
"@swc/core": "^1.10.1", "@swc/wasm": "^1.10.14",
"@symfony/webpack-encore": "^5.0.1",
"@tailwindcss/forms": "^0.5.2", "@tailwindcss/forms": "^0.5.2",
"@types/bcryptjs": "^2.4.6", "@types/bcryptjs": "^2.4.6",
"@types/clamscan": "^2.0.4", "@types/clamscan": "^2.0.4",
"@types/escape-html": "^1.0.4", "@types/escape-html": "^1.0.4",
"@types/fs-extra": "^11.0.4",
"@types/leaflet": "^1.9.3", "@types/leaflet": "^1.9.3",
"@types/luxon": "^3.4.2", "@types/luxon": "^3.4.2",
"@types/node": "^22.10.2", "@types/node": "^22.10.2",
@ -51,24 +46,27 @@
"@types/source-map-support": "^0.5.6", "@types/source-map-support": "^0.5.6",
"@types/sprintf-js": "^1.1.4", "@types/sprintf-js": "^1.1.4",
"@types/supertest": "^6.0.2", "@types/supertest": "^6.0.2",
"@vitejs/plugin-vue": "^5.2.1",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"babel-preset-typescript-vue3": "^2.0.17", "babel-preset-typescript-vue3": "^2.0.17",
"chart.js": "^4.2.0", "chart.js": "^4.2.0",
"dotenv-webpack": "^8.0.1", "dotenv-webpack": "^8.0.1",
"eslint": "^8.57.1", "eslint": "^8.57.1",
"eslint-config-prettier": "^9.0.0", "eslint-config-prettier": "^10.0.1",
"eslint-plugin-adonis": "^2.1.1", "eslint-plugin-adonis": "^2.1.1",
"eslint-plugin-prettier": "^5.0.0-alpha.2", "eslint-plugin-prettier": "^5.0.0-alpha.2",
"hot-hook": "^0.4.0",
"numeral": "^2.0.6", "numeral": "^2.0.6",
"pinia": "^2.0.30", "pinia": "^2.0.30",
"pino-pretty": "^13.0.0", "pino-pretty": "^13.0.0",
"postcss-loader": "^8.1.1", "postcss-loader": "^8.1.1",
"prettier": "^3.4.2", "prettier": "^3.4.2",
"supertest": "^6.3.3", "supertest": "^6.3.3",
"tailwindcss": "^3.2.4", "tailwindcss": "^3.4.17",
"ts-loader": "^9.4.2", "ts-loader": "^9.4.2",
"ts-node": "^10.9.2", "ts-node-maintained": "^10.9.5",
"typescript": "~5.7", "typescript": "~5.7",
"vite": "^6.0.11",
"vue": "^3.4.26", "vue": "^3.4.26",
"vue-facing-decorator": "^3.0.0", "vue-facing-decorator": "^3.0.0",
"vue-loader": "^17.0.1", "vue-loader": "^17.0.1",
@ -80,7 +78,6 @@
"@adonisjs/core": "^6.17.0", "@adonisjs/core": "^6.17.0",
"@adonisjs/cors": "^2.2.1", "@adonisjs/cors": "^2.2.1",
"@adonisjs/drive": "^3.2.0", "@adonisjs/drive": "^3.2.0",
"@adonisjs/encore": "^1.0.0",
"@adonisjs/inertia": "^2.1.3", "@adonisjs/inertia": "^2.1.3",
"@adonisjs/lucid": "^21.5.1", "@adonisjs/lucid": "^21.5.1",
"@adonisjs/mail": "^9.2.2", "@adonisjs/mail": "^9.2.2",
@ -94,7 +91,7 @@
"@fontsource/inter": "^5.0.1", "@fontsource/inter": "^5.0.1",
"@inertiajs/inertia": "^0.11.1", "@inertiajs/inertia": "^0.11.1",
"@inertiajs/vue3": "^2.0.3", "@inertiajs/vue3": "^2.0.3",
"@opensearch-project/opensearch": "^2.4.0", "@opensearch-project/opensearch": "^3.2.0",
"@phc/format": "^1.0.0", "@phc/format": "^1.0.0",
"@poppinss/manager": "^5.0.2", "@poppinss/manager": "^5.0.2",
"@vinejs/vine": "^3.0.0", "@vinejs/vine": "^3.0.0",
@ -102,7 +99,6 @@
"bcrypt": "^5.1.1", "bcrypt": "^5.1.1",
"bcryptjs": "^2.4.3", "bcryptjs": "^2.4.3",
"clamscan": "^2.1.2", "clamscan": "^2.1.2",
"crypto": "^1.0.1",
"dayjs": "^1.11.7", "dayjs": "^1.11.7",
"deep-email-validator": "^0.1.21", "deep-email-validator": "^0.1.21",
"edge.js": "^6.0.1", "edge.js": "^6.0.1",
@ -125,6 +121,12 @@
"vuedraggable": "^4.1.0", "vuedraggable": "^4.1.0",
"xmlbuilder2": "^3.1.1" "xmlbuilder2": "^3.1.1"
}, },
"hotHook": {
"boundaries": [
"./app/Controllers/**/*.ts",
"./app/middleware/*.ts"
]
},
"type": "module", "type": "module",
"imports": { "imports": {
"#controllers/*": "./app/Controllers/*.js", "#controllers/*": "./app/Controllers/*.js",

View file

@ -1,7 +1,10 @@
module.exports = { module.exports = {
plugins: { plugins: {
// 'postcss-import': {}, // 'postcss-import': {},
'tailwindcss/nesting': {}, // 'postcss-nesting': {},
'tailwindcss/nesting': {},
// "@tailwindcss/postcss": {},
// tailwindcss: {},
tailwindcss: {}, tailwindcss: {},
autoprefixer: {}, autoprefixer: {},
}, },

View file

@ -4,7 +4,7 @@
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
|*/ |*/
import type { ApplicationService } from '@adonisjs/core/types'; import type { ApplicationService } from '@adonisjs/core/types';
import vine, { BaseLiteralType, Vine } from '@vinejs/vine'; import vine, { symbols, BaseLiteralType, Vine } from '@vinejs/vine';
import type { FieldContext, FieldOptions } from '@vinejs/vine/types'; import type { FieldContext, FieldOptions } from '@vinejs/vine/types';
// import type { MultipartFile, FileValidationOptions } from '@adonisjs/bodyparser/types'; // import type { MultipartFile, FileValidationOptions } from '@adonisjs/bodyparser/types';
import type { MultipartFile } from '@adonisjs/core/bodyparser'; import type { MultipartFile } from '@adonisjs/core/bodyparser';
@ -12,6 +12,7 @@ import type { FileValidationOptions } from '@adonisjs/core/types/bodyparser';
import { Request, RequestValidator } from '@adonisjs/core/http'; import { Request, RequestValidator } from '@adonisjs/core/http';
import MimeType from '#models/mime_type'; import MimeType from '#models/mime_type';
/** /**
* Validation options accepted by the "file" rule * Validation options accepted by the "file" rule
*/ */
@ -101,7 +102,20 @@ const isMultipartFile = vine.createRule(async (file: MultipartFile | unknown, op
}); });
}); });
const MULTIPART_FILE: typeof symbols.SUBTYPE = symbols.SUBTYPE;
export class VineMultipartFile extends BaseLiteralType<MultipartFile, MultipartFile, MultipartFile> { export class VineMultipartFile extends BaseLiteralType<MultipartFile, MultipartFile, MultipartFile> {
[MULTIPART_FILE]: string;
// constructor(validationOptions?: FileRuleValidationOptions, options?: FieldOptions) {
// super(options, [isMultipartFile(validationOptions || {})]);
// this.validationOptions = validationOptions;
// this.#private = true;
// }
// clone(): this {
// return new VineMultipartFile(this.validationOptions, this.cloneOptions()) as this;
// }
// #private; // #private;
// constructor(validationOptions?: FileRuleValidationOptions, options?: FieldOptions, validations?: Validation<any>[]); // constructor(validationOptions?: FileRuleValidationOptions, options?: FieldOptions, validations?: Validation<any>[]);
// clone(): this; // clone(): this;
@ -153,7 +167,10 @@ export default class VinejsProvider {
* The validate method can be used to validate the request * The validate method can be used to validate the request
* data for the current request using VineJS validators * data for the current request using VineJS validators
*/ */
Request.macro('validateUsing', function (...args) { Request.macro('validateUsing', function (this: Request, ...args) {
if (!this.ctx) {
throw new Error('HttpContext is not available');
}
return new RequestValidator(this.ctx).validateUsing(...args); return new RequestValidator(this.ctx).validateUsing(...args);
}); });
} }

View file

@ -1,12 +0,0 @@
{
"entrypoints": {
"app": {
"css": [
"http://localhost:8080/assets/app.css"
],
"js": [
"http://localhost:8080/assets/app.js"
]
}
}
}

View file

@ -1,102 +0,0 @@
{
"assets/app.css": "http://localhost:8080/assets/app.css",
"assets/app.js": "http://localhost:8080/assets/app.js",
"assets/resources_js_apps_settings_l18n_de_js.js": "http://localhost:8080/assets/resources_js_apps_settings_l18n_de_js.js",
"assets/resources_js_apps_settings_l18n_en_js.js": "http://localhost:8080/assets/resources_js_apps_settings_l18n_en_js.js",
"assets/resources_js_Pages_Admin_License_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_License_Index_vue.js",
"assets/resources_js_Pages_Admin_Mimetype_Create_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Mimetype_Create_vue.js",
"assets/resources_js_Pages_Admin_Mimetype_Delete_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Mimetype_Delete_vue.js",
"assets/resources_js_Pages_Admin_Mimetype_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Mimetype_Index_vue.js",
"assets/resources_js_Pages_Admin_Permission_Create_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Permission_Create_vue.js",
"assets/resources_js_Pages_Admin_Permission_Edit_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Permission_Edit_vue.js",
"assets/resources_js_Pages_Admin_Permission_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Permission_Index_vue.js",
"assets/resources_js_Pages_Admin_Permission_Show_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Permission_Show_vue.js",
"assets/resources_js_Pages_Admin_Role_Create_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Role_Create_vue.js",
"assets/resources_js_Pages_Admin_Role_Edit_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Role_Edit_vue.js",
"assets/resources_js_Pages_Admin_Role_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Role_Index_vue.js",
"assets/resources_js_Pages_Admin_Role_Show_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Role_Show_vue.js",
"assets/resources_js_Pages_Admin_Settings_vue-resources_js_utils_toast_css.css": "http://localhost:8080/assets/resources_js_Pages_Admin_Settings_vue-resources_js_utils_toast_css.css",
"assets/resources_js_Pages_Admin_Settings_vue-resources_js_utils_toast_css.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Settings_vue-resources_js_utils_toast_css.js",
"assets/resources_js_Pages_Admin_User_Create_vue-resources_js_Components_SimplePasswordMeter_password-f3312a.css": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Create_vue-resources_js_Components_SimplePasswordMeter_password-f3312a.css",
"assets/resources_js_Pages_Admin_User_Create_vue-resources_js_Components_SimplePasswordMeter_password-f3312a.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Create_vue-resources_js_Components_SimplePasswordMeter_password-f3312a.js",
"assets/resources_js_Pages_Admin_User_Edit_vue-resources_js_Components_SimplePasswordMeter_password-m-6dc207.css": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Edit_vue-resources_js_Components_SimplePasswordMeter_password-m-6dc207.css",
"assets/resources_js_Pages_Admin_User_Edit_vue-resources_js_Components_SimplePasswordMeter_password-m-6dc207.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Edit_vue-resources_js_Components_SimplePasswordMeter_password-m-6dc207.js",
"assets/resources_js_Pages_Admin_User_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Index_vue.js",
"assets/resources_js_Pages_Admin_User_Show_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Show_vue.js",
"assets/resources_js_Pages_App_vue.js": "http://localhost:8080/assets/resources_js_Pages_App_vue.js",
"assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css-resources_js_Components_-06c7b5.css": "http://localhost:8080/assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css-resources_js_Components_-06c7b5.css",
"assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css-resources_js_Components_-06c7b5.js": "http://localhost:8080/assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css-resources_js_Components_-06c7b5.js",
"assets/resources_js_Pages_Auth_Login_vue.js": "http://localhost:8080/assets/resources_js_Pages_Auth_Login_vue.js",
"assets/resources_js_Pages_Auth_Register_vue.js": "http://localhost:8080/assets/resources_js_Pages_Auth_Register_vue.js",
"assets/resources_js_Pages_Dashboard_vue.js": "http://localhost:8080/assets/resources_js_Pages_Dashboard_vue.js",
"assets/resources_js_Pages_Editor_Dataset_Approve_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Approve_vue.js",
"assets/resources_js_Pages_Editor_Dataset_Doi_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Doi_vue.js",
"assets/resources_js_Pages_Editor_Dataset_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Index_vue.js",
"assets/resources_js_Pages_Editor_Dataset_Publish_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Publish_vue.js",
"assets/resources_js_Pages_Editor_Dataset_Receive_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Receive_vue.js",
"assets/resources_js_Pages_Editor_Dataset_Reject_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Reject_vue.js",
"assets/resources_js_Pages_Error_vue.js": "http://localhost:8080/assets/resources_js_Pages_Error_vue.js",
"assets/resources_js_Pages_Errors_ServerError_vue.js": "http://localhost:8080/assets/resources_js_Pages_Errors_ServerError_vue.js",
"assets/resources_js_Pages_Errors_not_found_vue.js": "http://localhost:8080/assets/resources_js_Pages_Errors_not_found_vue.js",
"assets/resources_js_Pages_Map_vue-resources_js_Components_Map_draw_component_vue-resources_js_Compon-b0925c.css": "http://localhost:8080/assets/resources_js_Pages_Map_vue-resources_js_Components_Map_draw_component_vue-resources_js_Compon-b0925c.css",
"assets/resources_js_Pages_Map_vue-resources_js_Components_Map_draw_component_vue-resources_js_Compon-b0925c.js": "http://localhost:8080/assets/resources_js_Pages_Map_vue-resources_js_Components_Map_draw_component_vue-resources_js_Compon-b0925c.js",
"assets/resources_js_Pages_ProfileView_vue.js": "http://localhost:8080/assets/resources_js_Pages_ProfileView_vue.js",
"assets/resources_js_Pages_Reviewer_Dataset_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Index_vue.js",
"assets/resources_js_Pages_Reviewer_Dataset_Reject_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Reject_vue.js",
"assets/resources_js_Pages_Reviewer_Dataset_Review_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Review_vue.js",
"assets/resources_js_Pages_Submitter_Dataset_Category_vue.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Category_vue.css",
"assets/resources_js_Pages_Submitter_Dataset_Category_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Category_vue.js",
"assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-03a898.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-03a898.css",
"assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-03a898.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-03a898.js",
"assets/resources_js_Pages_Submitter_Dataset_Delete_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Delete_vue.js",
"assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-a37b65.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-a37b65.css",
"assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-a37b65.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-a37b65.js",
"assets/resources_js_Pages_Submitter_Dataset_Index_vue.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Index_vue.css",
"assets/resources_js_Pages_Submitter_Dataset_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Index_vue.js",
"assets/resources_js_Pages_Submitter_Dataset_Release_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Release_vue.js",
"assets/resources_js_Pages_Submitter_Person_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Person_Index_vue.js",
"assets/resources_js_Pages_register-view_register-view-component_vue.js": "http://localhost:8080/assets/resources_js_Pages_register-view_register-view-component_vue.js",
"assets/vendors-node_modules_mdi_js_mdi_js-node_modules_vue-loader_dist_exportHelper_js.js": "http://localhost:8080/assets/vendors-node_modules_mdi_js_mdi_js-node_modules_vue-loader_dist_exportHelper_js.js",
"assets/vendors-node_modules_focus-trap_dist_focus-trap_esm_js-node_modules_notiwind_dist_index_esm_js.js": "http://localhost:8080/assets/vendors-node_modules_focus-trap_dist_focus-trap_esm_js-node_modules_notiwind_dist_index_esm_js.js",
"assets/vendors-node_modules_vue-facing-decorator_dist_esm_utils_js.js": "http://localhost:8080/assets/vendors-node_modules_vue-facing-decorator_dist_esm_utils_js.js",
"assets/vendors-node_modules_toastify-js_src_toastify_js.js": "http://localhost:8080/assets/vendors-node_modules_toastify-js_src_toastify_js.js",
"assets/vendors-node_modules_leaflet_dist_leaflet-src_js-node_modules_leaflet_src_control_Control_Att-adabdc.js": "http://localhost:8080/assets/vendors-node_modules_leaflet_dist_leaflet-src_js-node_modules_leaflet_src_control_Control_Att-adabdc.js",
"assets/vendors-node_modules_buffer_index_js-node_modules_vuedraggable_dist_vuedraggable_umd_js.js": "http://localhost:8080/assets/vendors-node_modules_buffer_index_js-node_modules_vuedraggable_dist_vuedraggable_umd_js.js",
"assets/vendors-node_modules_mime_dist_src_index_js.js": "http://localhost:8080/assets/vendors-node_modules_mime_dist_src_index_js.js",
"assets/vendors-node_modules_numeral_numeral_js-node_modules_chart_js_dist_chart_js.js": "http://localhost:8080/assets/vendors-node_modules_numeral_numeral_js-node_modules_chart_js_dist_chart_js.js",
"assets/resources_js_Components_BaseButton_vue.js": "http://localhost:8080/assets/resources_js_Components_BaseButton_vue.js",
"assets/resources_js_Stores_main_ts-resources_js_Components_BaseDivider_vue-resources_js_Components_C-b45805.js": "http://localhost:8080/assets/resources_js_Stores_main_ts-resources_js_Components_BaseDivider_vue-resources_js_Components_C-b45805.js",
"assets/resources_js_Layouts_LayoutAuthenticated_vue.css": "http://localhost:8080/assets/resources_js_Layouts_LayoutAuthenticated_vue.css",
"assets/resources_js_Layouts_LayoutAuthenticated_vue.js": "http://localhost:8080/assets/resources_js_Layouts_LayoutAuthenticated_vue.js",
"assets/resources_js_Components_BaseButtons_vue-resources_js_Components_FormControl_vue-resources_js_-d830d6.js": "http://localhost:8080/assets/resources_js_Components_BaseButtons_vue-resources_js_Components_FormControl_vue-resources_js_-d830d6.js",
"assets/resources_js_Components_Admin_Pagination_vue-resources_js_Components_BaseButtons_vue-resource-6f3a70.js": "http://localhost:8080/assets/resources_js_Components_Admin_Pagination_vue-resources_js_Components_BaseButtons_vue-resource-6f3a70.js",
"assets/resources_js_utils_toast_ts-resources_js_Components_NotificationBar_vue.js": "http://localhost:8080/assets/resources_js_utils_toast_ts-resources_js_Components_NotificationBar_vue.js",
"assets/resources_js_Components_Map_draw_component_vue-resources_js_Components_Map_zoom_component_vue-058bcc.js": "http://localhost:8080/assets/resources_js_Components_Map_draw_component_vue-resources_js_Components_Map_zoom_component_vue-058bcc.js",
"assets/resources_js_Components_SectionMain_vue-resources_js_Components_SectionTitleLineWithButton_vu-764dfe.js": "http://localhost:8080/assets/resources_js_Components_SectionMain_vue-resources_js_Components_SectionTitleLineWithButton_vu-764dfe.js",
"assets/resources_js_Components_BaseButtons_vue-resources_js_Components_NotificationBar_vue-resources-7e06d8.js": "http://localhost:8080/assets/resources_js_Components_BaseButtons_vue-resources_js_Components_NotificationBar_vue-resources-7e06d8.js",
"assets/resources_js_Components_Admin_Sort_vue-resources_js_Components_SectionTitleLineWithButton_vue.js": "http://localhost:8080/assets/resources_js_Components_Admin_Sort_vue-resources_js_Components_SectionTitleLineWithButton_vue.js",
"assets/resources_js_Components_CardBoxModal_vue.js": "http://localhost:8080/assets/resources_js_Components_CardBoxModal_vue.js",
"assets/resources_js_Components_FileUpload_vue-resources_js_Components_FormCheckRadioGroup_vue-resour-25e686.js": "http://localhost:8080/assets/resources_js_Components_FileUpload_vue-resources_js_Components_FormCheckRadioGroup_vue-resour-25e686.js",
"assets/fonts/inter-latin-ext-400-normal.woff": "http://localhost:8080/assets/fonts/inter-latin-ext-400-normal.1c20f7dc.woff",
"assets/fonts/inter-latin-400-normal.woff": "http://localhost:8080/assets/fonts/inter-latin-400-normal.b0c8fe9d.woff",
"assets/fonts/inter-latin-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-latin-ext-400-normal.3d10c85f.woff2",
"assets/fonts/inter-latin-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-latin-400-normal.9698cc7d.woff2",
"assets/fonts/archivo-black-latin-400-normal.woff2": "http://localhost:8080/assets/fonts/archivo-black-latin-400-normal.fc847a1f.woff2",
"assets/fonts/archivo-black-latin-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/archivo-black-latin-ext-400-normal.21761451.woff2",
"assets/fonts/inter-cyrillic-ext-400-normal.woff": "http://localhost:8080/assets/fonts/inter-cyrillic-ext-400-normal.e8945162.woff",
"assets/fonts/archivo-black-latin-400-normal.woff": "http://localhost:8080/assets/fonts/archivo-black-latin-400-normal.58a301a6.woff",
"assets/fonts/inter-cyrillic-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-cyrillic-ext-400-normal.fd1478dc.woff2",
"assets/fonts/inter-cyrillic-400-normal.woff": "http://localhost:8080/assets/fonts/inter-cyrillic-400-normal.e2841352.woff",
"assets/fonts/inter-greek-400-normal.woff": "http://localhost:8080/assets/fonts/inter-greek-400-normal.a42da273.woff",
"assets/fonts/archivo-black-latin-ext-400-normal.woff": "http://localhost:8080/assets/fonts/archivo-black-latin-ext-400-normal.5ab5ba92.woff",
"assets/fonts/inter-greek-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-greek-400-normal.a8de720a.woff2",
"assets/fonts/inter-cyrillic-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-cyrillic-400-normal.cb04b2ee.woff2",
"assets/fonts/inter-greek-ext-400-normal.woff": "http://localhost:8080/assets/fonts/inter-greek-ext-400-normal.b9e1e894.woff",
"assets/fonts/inter-vietnamese-400-normal.woff": "http://localhost:8080/assets/fonts/inter-vietnamese-400-normal.96f8adc7.woff",
"assets/fonts/inter-greek-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-greek-ext-400-normal.f2fa0d9e.woff2",
"assets/fonts/inter-vietnamese-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-vietnamese-400-normal.44c9df13.woff2",
"assets/images/marker-icon.png": "http://localhost:8080/assets/images/marker-icon.2b3e1faf.png",
"assets/images/layers-2x.png": "http://localhost:8080/assets/images/layers-2x.8f2c4d11.png",
"assets/images/layers.png": "http://localhost:8080/assets/images/layers.416d9136.png",
"assets/images/Close.svg": "http://localhost:8080/assets/images/Close.e4887675.svg"
}

View file

@ -1,19 +1,20 @@
/* @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500&display=swap'); */ /* @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500&display=swap'); */
/* @import url('https://fonts.googleapis.com/css?family=Roboto:400,400i,600,700'); */ /* @import url('https://fonts.googleapis.com/css?family=Roboto:400,400i,600,700'); */
@tailwind base;
@tailwind components;
@tailwind utilities;
@import '_checkbox-radio-switch.css'; @import '_checkbox-radio-switch.css';
@import '_progress.css'; @import '_progress.css';
@import '_scrollbars.css'; @import '_scrollbars.css';
@import '_table.css'; @import '_table.css';
@import '~leaflet/dist/leaflet.css'; /* @import '~leaflet/dist/leaflet.css'; */
@import '~/leaflet/dist/leaflet.css';
@import '@fontsource/inter/index.css'; @import '@fontsource/inter/index.css';
@import '@fontsource/archivo-black/index.css'; @import '@fontsource/archivo-black/index.css';
@tailwind base;
@tailwind components;
@tailwind utilities;
:root { :root {
--color-main-background: #ffffff; --color-main-background: #ffffff;
--color-main-background-rgb: 255,255,255; --color-main-background-rgb: 255,255,255;

View file

@ -198,7 +198,7 @@ import DeleteIcon from '@/Components/Icons/Delete.vue';
import RefreshIcon from '@/Components/Icons/Refresh.vue'; import RefreshIcon from '@/Components/Icons/Refresh.vue';
// import { Page, PageProps, Errors, ErrorBag } from '@inertiajs/inertia'; // import { Page, PageProps, Errors, ErrorBag } from '@inertiajs/inertia';
import Draggable from 'vuedraggable'; import Draggable from 'vuedraggable';
import { Buffer } from 'buffer'; // import { Buffer } from 'buffer';
import { TethysFile } from '@/Dataset'; import { TethysFile } from '@/Dataset';
// lastModified: 1691759507591 // lastModified: 1691759507591
@ -445,18 +445,19 @@ class FileUploadComponent extends Vue {
let localUrl: string = ''; let localUrl: string = '';
if (file instanceof File) { if (file instanceof File) {
localUrl = URL.createObjectURL(file as Blob); localUrl = URL.createObjectURL(file as Blob);
} else if (file.fileData) {
// const blob = new Blob([file.fileData]);
// localUrl = URL.createObjectURL(blob);
const parsed = JSON.parse(file.fileData);
file.fileData = '';
// retrieve the original buffer of data
const buff = Buffer.from(parsed.blob, 'base64');
const blob = new Blob([buff], { type: 'application/octet-stream' });
// file.blob = blob;
localUrl = URL.createObjectURL(blob);
file.fileSrc = localUrl;
} }
// else if (file.fileData) {
// // const blob = new Blob([file.fileData]);
// // localUrl = URL.createObjectURL(blob);
// const parsed = JSON.parse(file.fileData);
// file.fileData = '';
// // retrieve the original buffer of data
// const buff = Buffer.from(parsed.blob, 'base64');
// const blob = new Blob([buff], { type: 'application/octet-stream' });
// // file.blob = blob;
// localUrl = URL.createObjectURL(blob);
// file.fileSrc = localUrl;
// }
// setTimeout(() => { // setTimeout(() => {
// URL.revokeObjectURL(localUrl); // URL.revokeObjectURL(localUrl);

View file

@ -28,7 +28,7 @@ const form = useForm({
}); });
const submit = async () => { const submit = async () => {
await form.post(stardust.route('settings.role.store'), form); await form.post(stardust.route('settings.role.store'));
}; };
</script> </script>

View file

@ -1,5 +1,5 @@
<script setup> <script setup lang="ts">
import { Head, Link, useForm } from '@inertiajs/vue3'; import { Head, useForm } from '@inertiajs/vue3';
import { mdiAccountKey, mdiArrowLeftBoldOutline, mdiFormTextarea } from '@mdi/js'; import { mdiAccountKey, mdiArrowLeftBoldOutline, mdiFormTextarea } from '@mdi/js';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue'; import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue'; import SectionMain from '@/Components/SectionMain.vue';
@ -29,15 +29,15 @@ const props = defineProps({
}); });
const form = useForm({ const form = useForm({
_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); old
await form.put(stardust.route('settings.role.update', [props.role.id]), form); await form.put(stardust.route('settings.role.update', [props.role.id]));
// await router.put(stardust.route('settings.role.update', [props.role.id]), form);
}; };
</script> </script>
@ -58,7 +58,7 @@ const submit = async () => {
<!-- <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" is-read-only="true"> <FormControl v-model="form.name" type="text" placeholder="Enter Name" required :error="form.errors.name" :is-read-only=true>
<div class="text-red-400 text-sm" v-if="form.errors.name"> <div class="text-red-400 text-sm" v-if="form.errors.name">
{{ form.errors.name }} {{ form.errors.name }}
</div> </div>

View file

@ -6,7 +6,7 @@
<!-- <SectionFullScreen v-slot="{ cardClass }" :bg="'greenBlue'"> --> <!-- <SectionFullScreen v-slot="{ cardClass }" :bg="'greenBlue'"> -->
<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>

View file

@ -4,10 +4,10 @@
<h1 class="text-xl font-bold">SKOS Browser</h1> <h1 class="text-xl font-bold">SKOS Browser</h1>
<div class="flex space-x-2"> <div class="flex space-x-2">
<button @click="updateApp" title="Update the application"> <button @click="updateApp" title="Update the application">
<img src="/Resources/Images/refresh.png" alt="Update" class="w-4 h-4" /> <!-- <img src="/Resources/Images/refresh.png" alt="Update" class="w-4 h-4" /> -->
</button> </button>
<button @click="showInfo" title="Info"> <button @click="showInfo" title="Info">
<img src="/Resources/Images/info.png" alt="Info" class="w-4 h-4" /> <!-- <img src="/Resources/Images/info.png" alt="Info" class="w-4 h-4" /> -->
</button> </button>
</div> </div>
</header> </header>

View file

@ -45,7 +45,7 @@ import { LayerOptions } from '@/Components/Map/LayerOptions';
import TableKeywords from '@/Components/TableKeywords.vue'; import TableKeywords from '@/Components/TableKeywords.vue';
import NotificationBar from '@/Components/NotificationBar.vue'; import NotificationBar from '@/Components/NotificationBar.vue';
import FileUploadComponent from '@/Components/FileUpload.vue'; import FileUploadComponent from '@/Components/FileUpload.vue';
import Person from '#models/person'; import type Person from '#models/person';
const props = defineProps({ const props = defineProps({
licenses: { licenses: {

View file

@ -9,8 +9,8 @@ import { StyleService } from '@/Stores/style.service';
import { LayoutService } from '@/Stores/layout'; import { LayoutService } from '@/Stores/layout';
import { LocaleStore } from '@/Stores/locale'; import { LocaleStore } from '@/Stores/locale';
import { darkModeKey, styleKey } from '@/config'; import { darkModeKey, styleKey } from '@/config';
// import type { DefineComponent } from 'vue'; import type { DefineComponent } from 'vue';
// import { resolvePageComponent } from '@adonisjs/inertia/helpers'; import { resolvePageComponent } from '@adonisjs/inertia/helpers';
const pinia = createPinia(); const pinia = createPinia();
// import i18n from './i18n'; // import i18n from './i18n';
import { EmitterPlugin } from '@/EmitterDirective'; import { EmitterPlugin } from '@/EmitterDirective';
@ -38,31 +38,18 @@ createInertiaApp({
color: '#22C55E', color: '#22C55E',
}, },
// Webpack // Webpack
// resolve: (name) => require(`./Pages/${name}`), // resolve: async (name: string) => {
// resolve: (name) => require(`./Pages/${name}.vue`), // // Dynamically import the Vue component using import
// add default layout // const { default: page } = await import(`./Pages/${name}.vue`);
// resolve: (name) => { // // const page = require(`./Pages/${name}.vue`).default;
// const page = require(`./Pages/${name}.vue`).default;
// // if (!page.layout) { // // if (!page.layout) {
// // page.layout = DefaultLayout; // // page.layout = DefaultLayout;
// // } // // }
// return page; // return page;
// }, // },
resolve: async (name: string) => { resolve: (name) => {
// Dynamically import the Vue component using import return resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob<DefineComponent>('./Pages/**/*.vue'));
const { default: page } = await import(`./Pages/${name}.vue`);
// const page = require(`./Pages/${name}.vue`).default;
// if (!page.layout) {
// page.layout = DefaultLayout;
// }
return page;
}, },
// resolve: (name) => {
// return resolvePageComponent(
// `./Pages/${name}.vue`,
// import.meta.glob<DefineComponent>('./pages/**/*.vue'),
// )
// },
setup({ el, App, props, plugin }) { setup({ el, App, props, plugin }) {
const app = createApp({ render: () => h(App, props) }) const app = createApp({ render: () => h(App, props) })
@ -72,21 +59,16 @@ createInertiaApp({
.use(EmitterPlugin); .use(EmitterPlugin);
// .component('inertia-link', Link) // .component('inertia-link', Link)
// Listen for navigation event to handle layout changes
// Listen for navigation event to handle layout changes // window.addEventListener('inertia:navigate', () => {
// window.addEventListener('inertia:navigate', () => { // layoutService.isAsideMobileExpanded = false;
// layoutService.isAsideMobileExpanded = false; // layoutService.isAsideLgActive = false;
// layoutService.isAsideLgActive = false; // });
// });
asyncPlugin.install('settings').then(() => { asyncPlugin.install('settings').then(() => {
app.mount(el); app.mount(el);
}); });
}, },
}); });
const styleService = StyleService(pinia); const styleService = StyleService(pinia);

183
resources/js/logo.svg Normal file
View file

@ -0,0 +1,183 @@
<!-- <svg width="60" height="59" viewBox="0 0 60 59" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M22.0604 27.0103C29.7333 23.0893 35.8474 16.6142 39.6254 8.51905C40.1123 7.47585 39.871 6.25371 39.3648 5.21976C38.1966 2.83369 37.9273 0.35731 31.5792 1.07481L29.0769 1.19405C30.0128 1.19405 29.5449 1.19405 29.0769 1.19405C26.2213 9.83921 20.8705 16.9667 13.0175 20.9078C7.54419 23.7048 3.49869 28.7902 1.59493 34.8927L1.08063 36.5412C1.02718 36.7125 0.953783 36.7439 1.03271 36.905V36.905C1.69551 38.2585 2.41237 37.8338 1.24774 36.8773C-0.0162787 35.8391 4.54649 41.9692 8.20235 42.3859C8.98846 42.4755 9.62624 41.8869 9.99718 41.188C12.8897 35.7384 16.5983 29.7497 22.0604 27.0103Z"
fill="#3798A6" />
<path
d="M54.293 18.2545C52.9177 18.0829 51.6326 19.0064 50.8501 20.1503C46.5712 26.4051 40.9276 31.4619 34.0992 34.9362C28.0309 37.9875 23.3905 43.7085 21.2488 50.5738V50.5738C20.8823 51.9051 21.321 53.3053 22.0817 54.4577C22.8541 55.6279 23.2013 56.5055 25.0387 57.2056C25.2331 57.2797 25.4363 57.33 25.6412 57.3659L29.6561 58.0696C30.1014 58.1477 30.5803 57.9029 30.6385 57.4546V57.4546C30.6522 57.3488 30.6656 57.26 30.6995 57.1589C33.5732 48.5843 39.3809 41.6511 47.1875 37.7332C52.0449 35.251 56.5674 29.4173 58.7712 23.8703C59.2774 22.5963 58.9189 21.1675 57.9822 20.1666V20.1666C57.743 19.9111 57.4687 19.6866 57.1678 19.5079C55.698 18.635 54.964 18.3382 54.293 18.2545Z"
fill="#3798A6" />
<path
d="M17.8462 46.7817C18.4399 48.0437 20.2086 47.5179 20.8231 46.2658C23.9715 39.8511 29.07 34.8495 35.2979 31.6915C41.4799 28.5111 46.6705 23.683 50.3399 17.7735C50.6236 17.3166 50.7683 16.7849 50.7594 16.2472C50.658 10.1604 49.3958 9.67645 47.3183 8.9339C45.5442 8.29976 43.3135 8.84337 42.332 10.4516C37.9465 17.6372 31.7406 23.4608 24.3513 27.2417C19.6664 29.5615 15.8593 33.5228 13.4571 38.3374C13.2609 38.7306 13.1639 39.1681 13.1742 39.6074C13.3408 46.715 16.2215 43.2109 17.84 46.768C17.8439 46.7766 17.8422 46.773 17.8462 46.7817V46.7817Z"
fill="#3798A6" />
</svg> -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 626.4 224.7" style="enable-background:new 0 0 626.4 224.7;" xml:space="preserve">
<style type="text/css">
.st0 {
fill: #336699;
}
.st1 {
fill: #00FFFF;
}
.st2 {
fill: #30D5C8;
}
.st3 {
opacity: 0.8;
fill: #336699;
}
.st4 {
opacity: 0.5;
fill: #336699;
}
.st5 {
fill: #393939;
}
</style>
<g>
<g>
<path class="st0"
d="M215.3,69.1l-4.4,19.2h-47.1l-4.2,18h43.7l-4.5,19.2h-43.6l-5.9,25.4h47L192,170h-73.1l23.3-100.9H215.3z" />
<path class="st0" d="M311.6,88.6h-31.4L261.4,170h-26.1L254,88.6h-31.5l4.5-19.5h89L311.6,88.6z" />
<path class="st0" d="M422.1,69.1L398.9,170h-26.1l10.3-44.6h-38.3L334.4,170h-26.1l23.3-100.9h26.1l-8.6,37.1h38.3l8.6-37.1H422.1
z" />
<path class="st0"
d="M536.7,69.1l-51.4,61.9l-9.1,39h-26.2l8.8-37.8l-23.2-63.1h27.9l13,39.6l30.2-39.6H536.7z" />
<path class="st0" d="M563.8,171.8c-8.6,0-16.3-0.7-23.1-2.2c-6.8-1.5-12.6-3.3-17.5-5.6l5.2-24.2h2.8c4.7,4.2,10.1,7.5,16.4,9.9
c6.3,2.3,13,3.5,20.3,3.5c7.4,0,12.9-1,16.3-3c3.5-2,5.2-4.9,5.2-8.6c0-1.4-0.3-2.6-0.8-3.6c-0.6-1-1.7-2-3.3-3
c-1.6-1-3.9-2-6.7-2.9c-2.8-1-6.5-2.1-10.9-3.4c-4.9-1.4-9.3-2.8-13.2-4.4c-3.9-1.6-7.2-3.5-10-5.6c-2.8-2.2-4.8-4.8-6.3-7.7
c-1.4-2.9-2.1-6.3-2.1-10.4c0-10.1,4.5-18.2,13.4-24.2c8.9-6,21.1-9,36.6-9c7.5,0,14.5,0.6,21.1,1.8c6.6,1.2,12.2,2.9,16.8,4.9
l-4.9,23.2h-2.8c-3.5-3.2-8.2-5.9-13.9-8.1c-5.8-2.2-12.1-3.3-18.9-3.3c-6.7,0-11.9,1-15.5,2.9c-3.7,1.9-5.5,4.6-5.5,8
c0,1.6,0.3,2.9,0.8,3.9c0.5,1,1.6,2.1,3.3,3c1.4,0.9,3.7,1.9,6.8,2.9c3.1,1.1,6.8,2.2,11,3.3c11.3,3,19.4,6.6,24.2,10.6
s7.2,9.6,7.2,16.5c0,5.8-1.3,11-3.9,15.4c-2.6,4.4-6.2,8-10.8,10.8c-4.8,2.9-10.3,5.1-16.5,6.4
C578.5,171.1,571.6,171.8,563.8,171.8z" />
</g>
<path class="st1" d="M539.2,37.1" />
<path class="st1" d="M539.2,37.1" />
<polygon class="st2" points="24,213.8 57.7,213.8 98.2,44.6 12.5,45.1 3.7,81 56.7,80.6 " />
<polygon class="st0" points="72.1,170.5 112.4,2.8 199.8,2.8 192.4,39.2 137.1,39.2 105.8,170.1 " />
<polygon class="st0" points="207,2.6 225.9,2.6 218.6,39 199.9,39 " />
<polygon class="st3" points="233.2,2.9 252.1,2.9 244.7,39.4 226.1,39.4 " />
<polygon class="st4" points="259.2,2.9 278.1,2.9 270.8,39.4 252.1,39.4 " />
<g>
<path class="st5" d="M97.4,213.7h-4.7l-8-12.1h-5.8l-2.8,12.1H72l7-30.2h8.3c1.9,0,3.4,0.1,4.5,0.4c1.2,0.2,2.2,0.7,3,1.3
c0.8,0.6,1.4,1.2,1.8,2c0.4,0.8,0.7,1.8,0.7,2.9c0,2.5-0.8,4.7-2.4,6.6c-1.6,1.9-3.7,3.2-6.2,4L97.4,213.7z M92.9,191
c0-0.7-0.1-1.3-0.3-1.8c-0.2-0.5-0.6-0.9-1-1.3c-0.5-0.4-1.2-0.7-1.9-0.9c-0.7-0.2-1.7-0.2-2.8-0.2h-4.6l-2.7,11.6h4.3
c1.3,0,2.5-0.1,3.5-0.4c1-0.2,1.9-0.7,2.7-1.3c0.9-0.7,1.6-1.5,2.1-2.5C92.6,193.2,92.9,192.1,92.9,191z" />
<path class="st5" d="M111.5,214.2c-3.2,0-5.6-0.7-7.4-2.2c-1.8-1.5-2.7-3.6-2.7-6.5c0-4.2,1.3-7.7,4-10.7c2.6-3,5.9-4.5,9.8-4.5
c2.6,0,4.6,0.6,5.9,1.9c1.4,1.3,2.1,3.1,2.1,5.4c0,0.4-0.1,1-0.2,1.9c-0.1,0.9-0.3,1.9-0.6,3.1h-16.8c-0.1,0.4-0.1,0.8-0.2,1.2
c0,0.4-0.1,0.7-0.1,1.1c0,1.9,0.6,3.4,1.8,4.5c1.2,1.1,2.8,1.6,5,1.6c1.5,0,3-0.3,4.6-0.9s2.9-1.2,4-2h0.2l-0.8,4.1
c-0.7,0.2-1.3,0.5-1.8,0.7c-0.5,0.2-1.2,0.4-2.1,0.6c-0.8,0.2-1.6,0.4-2.2,0.5C113.3,214.2,112.5,214.2,111.5,214.2z M119.2,199.9
c0.1-0.4,0.1-0.7,0.1-1c0-0.3,0-0.6,0-0.9c0-1.4-0.4-2.6-1.2-3.4c-0.8-0.8-2.1-1.2-3.8-1.2c-1.9,0-3.6,0.6-5.1,1.8
c-1.5,1.2-2.5,2.8-3,4.7H119.2z" />
<path class="st5" d="M132.8,214.3c-1.7,0-3.2-0.2-4.6-0.6s-2.5-0.9-3.4-1.4l0.9-4.1h0.2c0.3,0.2,0.7,0.5,1.1,0.9
c0.5,0.3,1,0.7,1.7,1c0.6,0.3,1.4,0.6,2.2,0.8c0.8,0.2,1.7,0.3,2.6,0.3c1.9,0,3.4-0.4,4.5-1.1c1.1-0.7,1.6-1.7,1.6-3.1
c0-0.7-0.3-1.3-0.8-1.7c-0.6-0.4-1.4-0.7-2.4-0.9c-0.5-0.1-1.2-0.3-1.9-0.4c-0.7-0.1-1.5-0.3-2.3-0.5c-1.6-0.4-2.8-1.1-3.5-1.9
c-0.8-0.8-1.1-1.9-1.1-3.1c0-1.1,0.2-2,0.7-3c0.5-0.9,1.1-1.8,2.1-2.5c0.9-0.7,2-1.3,3.3-1.8c1.3-0.5,2.8-0.7,4.5-0.7
c1.4,0,2.7,0.2,4.1,0.5c1.4,0.3,2.5,0.8,3.3,1.3l-0.8,3.9h-0.2c-0.2-0.2-0.5-0.4-1-0.7c-0.4-0.3-1-0.6-1.7-0.9
c-0.6-0.3-1.3-0.5-2.1-0.7c-0.8-0.2-1.6-0.3-2.4-0.3c-1.7,0-3.1,0.4-4.1,1.1s-1.6,1.7-1.6,2.9c0,0.7,0.3,1.2,0.8,1.7
c0.5,0.5,1.3,0.8,2.4,1.1c0.7,0.2,1.4,0.3,2.1,0.5c0.7,0.1,1.4,0.3,2.1,0.5c1.6,0.4,2.8,1,3.6,1.8s1.2,1.9,1.2,3.1
c0,1-0.2,2.1-0.7,3.1c-0.5,1-1.2,1.9-2.2,2.6c-1,0.8-2.1,1.4-3.5,1.8C136,214,134.5,214.3,132.8,214.3z" />
<path class="st5" d="M158.2,214.2c-3.2,0-5.6-0.7-7.4-2.2c-1.8-1.5-2.7-3.6-2.7-6.5c0-4.2,1.3-7.7,4-10.7c2.6-3,5.9-4.5,9.8-4.5
c2.6,0,4.6,0.6,5.9,1.9c1.4,1.3,2.1,3.1,2.1,5.4c0,0.4-0.1,1-0.2,1.9c-0.1,0.9-0.3,1.9-0.6,3.1h-16.8c-0.1,0.4-0.1,0.8-0.2,1.2
c0,0.4-0.1,0.7-0.1,1.1c0,1.9,0.6,3.4,1.8,4.5c1.2,1.1,2.8,1.6,5,1.6c1.5,0,3-0.3,4.6-0.9c1.6-0.6,2.9-1.2,4-2h0.2l-0.8,4.1
c-0.7,0.2-1.3,0.5-1.8,0.7c-0.5,0.2-1.2,0.4-2.1,0.6c-0.8,0.2-1.6,0.4-2.2,0.5C160,214.2,159.2,214.2,158.2,214.2z M165.9,199.9
c0.1-0.4,0.1-0.7,0.1-1c0-0.3,0-0.6,0-0.9c0-1.4-0.4-2.6-1.2-3.4c-0.8-0.8-2.1-1.2-3.8-1.2c-1.9,0-3.6,0.6-5.1,1.8
c-1.5,1.2-2.5,2.8-3,4.7H165.9z" />
<path class="st5"
d="M186.8,211.3c-0.4,0.2-0.9,0.5-1.5,0.9c-0.6,0.4-1.3,0.7-1.9,1c-0.7,0.3-1.5,0.6-2.3,0.8
c-0.9,0.2-1.8,0.3-3,0.3c-1.8,0-3.3-0.5-4.4-1.6c-1.1-1-1.7-2.4-1.7-4.1c0-1.8,0.4-3.3,1.2-4.6c0.8-1.2,2-2.2,3.5-3
c1.5-0.8,3.4-1.3,5.6-1.7c2.2-0.3,4.6-0.6,7.4-0.6c0.1-0.4,0.2-0.7,0.2-1c0.1-0.3,0.1-0.6,0.1-0.9c0-0.6-0.1-1.2-0.4-1.6
c-0.3-0.4-0.6-0.7-1.1-1c-0.5-0.2-1-0.4-1.7-0.5c-0.6-0.1-1.3-0.1-2.1-0.1c-1.2,0-2.5,0.2-4,0.6c-1.5,0.4-2.7,0.7-3.6,1.1H177
l0.8-3.8c0.8-0.2,1.9-0.4,3.4-0.7c1.5-0.3,2.9-0.4,4.3-0.4c2.8,0,5,0.4,6.4,1.3c1.4,0.9,2.1,2.3,2.1,4.2c0,0.4,0,0.8-0.1,1.2
s-0.1,0.8-0.2,1.2l-3.6,15.4h-3.8L186.8,211.3z M189.1,201.8c-2.1,0.1-4,0.2-5.6,0.5c-1.6,0.2-3,0.6-4,1c-1.1,0.4-1.9,1.1-2.5,1.8
c-0.6,0.8-0.9,1.7-0.9,2.9c0,1,0.3,1.7,1,2.2c0.7,0.5,1.7,0.8,3.1,0.8c1.2,0,2.5-0.3,3.8-0.8c1.3-0.5,2.5-1.2,3.6-2L189.1,201.8z" />
<path class="st5" d="M215.9,195.1h-0.2c-0.5-0.1-1-0.2-1.5-0.3c-0.5-0.1-1-0.1-1.7-0.1c-1.3,0-2.5,0.3-3.8,0.9
c-1.3,0.6-2.5,1.3-3.6,2.1l-3.7,16.1h-3.9l5.2-22.7h3.9l-0.8,3.3c1.8-1.3,3.3-2.1,4.6-2.6c1.3-0.5,2.5-0.7,3.6-0.7
c0.7,0,1.2,0,1.4,0.1c0.3,0,0.7,0.1,1.3,0.2L215.9,195.1z" />
<path class="st5" d="M225.2,214.2c-1.4,0-2.7-0.2-3.8-0.5c-1.1-0.3-2.1-0.9-2.9-1.6c-0.8-0.7-1.4-1.6-1.9-2.7
c-0.4-1.1-0.7-2.3-0.7-3.7c0-2.1,0.3-4.1,1-5.9c0.7-1.8,1.6-3.5,2.8-4.9c1.2-1.4,2.6-2.4,4.4-3.2c1.7-0.8,3.6-1.2,5.6-1.2
c1.3,0,2.6,0.2,3.8,0.5c1.2,0.4,2.2,0.8,3.1,1.3l-0.8,4.1h-0.2c-0.3-0.2-0.6-0.5-1-0.8c-0.4-0.3-0.9-0.6-1.4-0.9
c-0.6-0.3-1.2-0.5-1.9-0.7c-0.7-0.2-1.5-0.3-2.3-0.3c-2.6,0-4.8,1.1-6.5,3.3c-1.7,2.2-2.5,4.9-2.5,8.1c0,1.9,0.5,3.4,1.5,4.4
c1,1,2.4,1.5,4.2,1.5c0.9,0,1.7-0.1,2.6-0.4c0.9-0.2,1.6-0.5,2.2-0.8c0.7-0.3,1.3-0.6,1.9-1c0.6-0.3,1-0.6,1.2-0.8h0.2l-0.8,4.2
c-1.2,0.5-2.4,1-3.8,1.4C227.9,214,226.5,214.2,225.2,214.2z" />
<path class="st5" d="M259.9,196.2c0,0.3,0,0.8-0.1,1.3c-0.1,0.6-0.1,1-0.3,1.5l-3.4,14.7h-3.8l3-12.9c0.2-0.7,0.3-1.3,0.4-1.9
c0.1-0.5,0.1-1.1,0.1-1.6c0-1.1-0.3-2-0.9-2.6c-0.6-0.6-1.6-0.9-3.1-0.9c-1,0-2.2,0.3-3.4,0.9c-1.2,0.6-2.5,1.2-3.7,2l-3.9,16.9
h-3.8l7.3-31.6h3.8l-2.7,11.4c1.5-1,2.8-1.8,4.1-2.3c1.3-0.5,2.6-0.8,3.9-0.8c2,0,3.5,0.5,4.6,1.5
C259.4,192.9,259.9,194.3,259.9,196.2z" />
<path class="st5" d="M308.1,195.1c0,3.3-0.8,6.4-2.5,9.4c-1.7,3-4,5.2-6.9,6.8c-1.8,1-3.6,1.6-5.5,1.9c-1.9,0.3-4,0.5-6.4,0.5
h-8.2l7-30.2h7.1c2.2,0,4.2,0.2,6,0.5c1.8,0.3,3.5,1,5,2c1.4,1,2.5,2.2,3.3,3.8C307.7,191.2,308.1,193,308.1,195.1z M303.8,195.4
c0-1.5-0.3-2.9-0.8-4c-0.6-1.1-1.4-2-2.5-2.8c-1.1-0.7-2.3-1.2-3.5-1.5c-1.3-0.2-2.8-0.4-4.8-0.4h-3.4l-5.5,23.6h4.2
c1.9,0,3.7-0.2,5.2-0.5c1.5-0.3,3-0.9,4.3-1.6c2.2-1.2,3.9-3,5-5.4C303.3,200.6,303.8,198.1,303.8,195.4z" />
<path class="st5"
d="M324.7,211.3c-0.4,0.2-0.9,0.5-1.5,0.9c-0.6,0.4-1.3,0.7-1.9,1c-0.7,0.3-1.5,0.6-2.3,0.8
c-0.9,0.2-1.8,0.3-3,0.3c-1.8,0-3.3-0.5-4.4-1.6c-1.1-1-1.7-2.4-1.7-4.1c0-1.8,0.4-3.3,1.2-4.6c0.8-1.2,2-2.2,3.5-3
c1.5-0.8,3.4-1.3,5.6-1.7c2.2-0.3,4.6-0.6,7.4-0.6c0.1-0.4,0.2-0.7,0.2-1c0.1-0.3,0.1-0.6,0.1-0.9c0-0.6-0.1-1.2-0.4-1.6
c-0.3-0.4-0.6-0.7-1.1-1c-0.5-0.2-1-0.4-1.7-0.5c-0.6-0.1-1.3-0.1-2.1-0.1c-1.2,0-2.5,0.2-4,0.6c-1.5,0.4-2.7,0.7-3.6,1.1h-0.2
l0.8-3.8c0.8-0.2,1.9-0.4,3.4-0.7c1.5-0.3,2.9-0.4,4.3-0.4c2.8,0,5,0.4,6.4,1.3c1.4,0.9,2.1,2.3,2.1,4.2c0,0.4,0,0.8-0.1,1.2
s-0.1,0.8-0.2,1.2l-3.6,15.4h-3.8L324.7,211.3z M327,201.8c-2.1,0.1-4,0.2-5.6,0.5c-1.6,0.2-3,0.6-4,1c-1.1,0.4-1.9,1.1-2.5,1.8
c-0.6,0.8-0.9,1.7-0.9,2.9c0,1,0.3,1.7,1,2.2c0.7,0.5,1.7,0.8,3.1,0.8c1.2,0,2.5-0.3,3.8-0.8c1.3-0.5,2.5-1.2,3.6-2L327,201.8z" />
<path class="st5" d="M352.5,191l-0.7,3.1h-7.9l-2.4,10.5c-0.1,0.5-0.3,1.1-0.4,1.8c-0.1,0.7-0.2,1.2-0.2,1.6c0,1,0.3,1.7,0.8,2.2
c0.5,0.5,1.4,0.7,2.8,0.7c0.6,0,1.2-0.1,2-0.3c0.8-0.2,1.3-0.3,1.6-0.4h0.2l-0.7,3.3c-0.8,0.2-1.6,0.3-2.4,0.5
c-0.9,0.1-1.6,0.2-2.3,0.2c-1.9,0-3.3-0.4-4.4-1.2c-1-0.8-1.5-2.1-1.5-3.9c0-0.4,0-0.9,0.1-1.3c0.1-0.4,0.1-0.9,0.3-1.5l2.8-12.2
h-2.6l0.7-3.1h2.6l1.5-6.5h3.9l-1.5,6.5H352.5z" />
<path class="st5"
d="M366.3,211.3c-0.4,0.2-0.9,0.5-1.5,0.9c-0.6,0.4-1.3,0.7-1.9,1c-0.7,0.3-1.5,0.6-2.3,0.8
c-0.9,0.2-1.8,0.3-3,0.3c-1.8,0-3.3-0.5-4.4-1.6c-1.1-1-1.7-2.4-1.7-4.1c0-1.8,0.4-3.3,1.2-4.6c0.8-1.2,2-2.2,3.5-3
c1.5-0.8,3.4-1.3,5.6-1.7c2.2-0.3,4.6-0.6,7.4-0.6c0.1-0.4,0.2-0.7,0.2-1c0.1-0.3,0.1-0.6,0.1-0.9c0-0.6-0.1-1.2-0.4-1.6
c-0.3-0.4-0.6-0.7-1.1-1c-0.5-0.2-1-0.4-1.7-0.5c-0.6-0.1-1.3-0.1-2.1-0.1c-1.2,0-2.5,0.2-4,0.6c-1.5,0.4-2.7,0.7-3.6,1.1h-0.2
l0.8-3.8c0.8-0.2,1.9-0.4,3.4-0.7c1.5-0.3,2.9-0.4,4.3-0.4c2.8,0,5,0.4,6.4,1.3c1.4,0.9,2.1,2.3,2.1,4.2c0,0.4,0,0.8-0.1,1.2
s-0.1,0.8-0.2,1.2l-3.6,15.4h-3.8L366.3,211.3z M368.5,201.8c-2.1,0.1-4,0.2-5.6,0.5c-1.6,0.2-3,0.6-4,1c-1.1,0.4-1.9,1.1-2.5,1.8
c-0.6,0.8-0.9,1.7-0.9,2.9c0,1,0.3,1.7,1,2.2c0.7,0.5,1.7,0.8,3.1,0.8c1.2,0,2.5-0.3,3.8-0.8c1.3-0.5,2.5-1.2,3.6-2L368.5,201.8z" />
<path class="st5" d="M417.4,213.7h-4.7l-8-12.1h-5.8l-2.8,12.1H392l7-30.2h8.3c1.9,0,3.4,0.1,4.5,0.4c1.2,0.2,2.2,0.7,3,1.3
c0.8,0.6,1.4,1.2,1.8,2c0.4,0.8,0.7,1.8,0.7,2.9c0,2.5-0.8,4.7-2.4,6.6c-1.6,1.9-3.7,3.2-6.2,4L417.4,213.7z M412.8,191
c0-0.7-0.1-1.3-0.3-1.8c-0.2-0.5-0.6-0.9-1-1.3c-0.5-0.4-1.2-0.7-1.9-0.9c-0.7-0.2-1.7-0.2-2.8-0.2h-4.6l-2.7,11.6h4.3
c1.3,0,2.5-0.1,3.5-0.4c1-0.2,1.9-0.7,2.7-1.3c0.9-0.7,1.6-1.5,2.1-2.5C412.6,193.2,412.8,192.1,412.8,191z" />
<path class="st5" d="M431.5,214.2c-3.2,0-5.6-0.7-7.4-2.2c-1.8-1.5-2.7-3.6-2.7-6.5c0-4.2,1.3-7.7,4-10.7s5.9-4.5,9.8-4.5
c2.6,0,4.6,0.6,5.9,1.9c1.4,1.3,2.1,3.1,2.1,5.4c0,0.4-0.1,1-0.2,1.9c-0.1,0.9-0.3,1.9-0.6,3.1h-16.8c-0.1,0.4-0.1,0.8-0.2,1.2
c0,0.4-0.1,0.7-0.1,1.1c0,1.9,0.6,3.4,1.8,4.5c1.2,1.1,2.8,1.6,5,1.6c1.5,0,3-0.3,4.6-0.9c1.6-0.6,2.9-1.2,4-2h0.2l-0.8,4.1
c-0.7,0.2-1.3,0.5-1.8,0.7s-1.2,0.4-2.1,0.6c-0.8,0.2-1.6,0.4-2.2,0.5C433.3,214.2,432.5,214.2,431.5,214.2z M439.2,199.9
c0.1-0.4,0.1-0.7,0.1-1c0-0.3,0-0.6,0-0.9c0-1.4-0.4-2.6-1.2-3.4c-0.8-0.8-2.1-1.2-3.8-1.2c-1.9,0-3.6,0.6-5.1,1.8
c-1.5,1.2-2.5,2.8-3,4.7H439.2z" />
<path class="st5" d="M468.8,198.2c0,2.2-0.4,4.4-1.1,6.3c-0.7,2-1.6,3.7-2.8,5c-1.2,1.4-2.5,2.5-4.1,3.4c-1.6,0.8-3.2,1.2-5,1.2
c-1.2,0-2.4-0.1-3.4-0.4s-2-0.7-2.8-1.2l-2.2,9.5h-3.8l7.2-31h3.8l-0.6,2.4c1.3-0.9,2.5-1.6,3.7-2.2c1.2-0.6,2.6-0.8,4.1-0.8
c2.2,0,3.9,0.7,5.1,2.1C468.2,193.8,468.8,195.7,468.8,198.2z M464.8,198.9c0-1.6-0.4-2.9-1.1-3.7c-0.7-0.9-1.8-1.3-3.4-1.3
c-1.1,0-2.3,0.3-3.5,0.8c-1.2,0.6-2.3,1.2-3.4,1.9l-3,12.9c0.9,0.5,1.7,0.8,2.5,1.1c0.8,0.2,1.8,0.3,2.9,0.3c1.4,0,2.7-0.3,3.8-1
s2.1-1.6,2.8-2.6c0.8-1.1,1.4-2.4,1.7-3.8C464.6,202,464.8,200.5,464.8,198.9z" />
<path class="st5" d="M494.1,199.1c0,2-0.3,4-0.9,5.8c-0.6,1.9-1.5,3.5-2.7,4.9c-1.2,1.4-2.6,2.6-4.1,3.4c-1.6,0.8-3.4,1.2-5.4,1.2
c-2.7,0-4.8-0.8-6.3-2.3c-1.5-1.5-2.3-3.7-2.3-6.4c0-2,0.3-4,0.9-5.8c0.6-1.8,1.5-3.5,2.7-4.9c1.1-1.4,2.5-2.5,4.2-3.3
c1.6-0.8,3.4-1.2,5.4-1.2c2.6,0,4.7,0.7,6.3,2.2S494.1,196.3,494.1,199.1z M487.8,207.6c0.7-1.1,1.3-2.3,1.7-3.8s0.6-2.9,0.6-4.5
c0-1.9-0.5-3.3-1.4-4.3c-0.9-1-2.2-1.5-3.9-1.5c-1.3,0-2.5,0.3-3.6,0.9c-1,0.6-2,1.5-2.7,2.6c-0.7,1.1-1.3,2.3-1.7,3.8
c-0.4,1.4-0.6,2.9-0.6,4.5c0,1.9,0.5,3.3,1.4,4.3c0.9,1,2.2,1.5,3.9,1.5c1.3,0,2.5-0.3,3.6-0.9
C486.2,209.6,487.1,208.7,487.8,207.6z" />
<path class="st5" d="M504.2,214.3c-1.7,0-3.2-0.2-4.6-0.6c-1.3-0.4-2.5-0.9-3.4-1.4l0.9-4.1h0.2c0.3,0.2,0.7,0.5,1.1,0.9
c0.5,0.3,1,0.7,1.7,1c0.6,0.3,1.4,0.6,2.2,0.8c0.8,0.2,1.7,0.3,2.6,0.3c1.9,0,3.4-0.4,4.5-1.1s1.6-1.7,1.6-3.1
c0-0.7-0.3-1.3-0.8-1.7c-0.6-0.4-1.4-0.7-2.4-0.9c-0.5-0.1-1.2-0.3-1.9-0.4c-0.7-0.1-1.5-0.3-2.3-0.5c-1.6-0.4-2.8-1.1-3.5-1.9
c-0.8-0.8-1.1-1.9-1.1-3.1c0-1.1,0.2-2,0.7-3c0.5-0.9,1.1-1.8,2.1-2.5c0.9-0.7,2-1.3,3.3-1.8c1.3-0.5,2.8-0.7,4.5-0.7
c1.4,0,2.7,0.2,4.1,0.5c1.4,0.3,2.5,0.8,3.3,1.3l-0.8,3.9H516c-0.2-0.2-0.5-0.4-1-0.7c-0.4-0.3-1-0.6-1.7-0.9
c-0.6-0.3-1.3-0.5-2.1-0.7c-0.8-0.2-1.6-0.3-2.4-0.3c-1.7,0-3.1,0.4-4.1,1.1c-1.1,0.7-1.6,1.7-1.6,2.9c0,0.7,0.3,1.2,0.8,1.7
c0.5,0.5,1.3,0.8,2.4,1.1c0.7,0.2,1.4,0.3,2.1,0.5c0.7,0.1,1.4,0.3,2.1,0.5c1.6,0.4,2.8,1,3.6,1.8s1.2,1.9,1.2,3.1
c0,1-0.2,2.1-0.7,3.1c-0.5,1-1.2,1.9-2.2,2.6c-1,0.8-2.1,1.4-3.5,1.8C507.4,214,505.9,214.3,504.2,214.3z" />
<path class="st5" d="M528,191l-5.3,22.7h-3.8l5.3-22.7H528z M530.1,183.3l-0.9,4h-4.3l0.9-4H530.1z" />
<path class="st5" d="M547.4,191l-0.7,3.1h-7.9l-2.4,10.5c-0.1,0.5-0.3,1.1-0.4,1.8c-0.1,0.7-0.2,1.2-0.2,1.6c0,1,0.3,1.7,0.8,2.2
c0.5,0.5,1.4,0.7,2.8,0.7c0.6,0,1.2-0.1,2-0.3c0.8-0.2,1.3-0.3,1.6-0.4h0.2l-0.7,3.3c-0.8,0.2-1.6,0.3-2.4,0.5
c-0.9,0.1-1.6,0.2-2.3,0.2c-1.9,0-3.3-0.4-4.4-1.2c-1-0.8-1.5-2.1-1.5-3.9c0-0.4,0-0.9,0.1-1.3c0.1-0.4,0.1-0.9,0.3-1.5l2.8-12.2
h-2.6l0.7-3.1h2.6l1.5-6.5h3.9l-1.5,6.5H547.4z" />
<path class="st5" d="M569.2,199.1c0,2-0.3,4-0.9,5.8c-0.6,1.9-1.5,3.5-2.7,4.9c-1.2,1.4-2.6,2.6-4.1,3.4c-1.5,0.8-3.4,1.2-5.4,1.2
c-2.7,0-4.8-0.8-6.3-2.3c-1.5-1.5-2.3-3.7-2.3-6.4c0-2,0.3-4,0.9-5.8c0.6-1.8,1.5-3.5,2.7-4.9c1.1-1.4,2.5-2.5,4.2-3.3
c1.6-0.8,3.4-1.2,5.4-1.2c2.6,0,4.7,0.7,6.3,2.2C568.4,194.1,569.2,196.3,569.2,199.1z M563,207.6c0.7-1.1,1.3-2.3,1.7-3.8
c0.4-1.4,0.6-2.9,0.6-4.5c0-1.9-0.5-3.3-1.4-4.3c-0.9-1-2.2-1.5-3.9-1.5c-1.3,0-2.5,0.3-3.6,0.9c-1,0.6-2,1.5-2.7,2.6
c-0.7,1.1-1.3,2.3-1.7,3.8c-0.4,1.4-0.6,2.9-0.6,4.5c0,1.9,0.5,3.3,1.4,4.3c0.9,1,2.2,1.5,3.9,1.5c1.3,0,2.5-0.3,3.6-0.9
C561.3,209.6,562.2,208.7,563,207.6z" />
<path class="st5" d="M590.6,195.1h-0.2c-0.5-0.1-1.1-0.2-1.5-0.3c-0.5-0.1-1-0.1-1.7-0.1c-1.3,0-2.5,0.3-3.8,0.9
c-1.3,0.6-2.5,1.3-3.6,2.1l-3.7,16.1h-3.9l5.2-22.7h3.9l-0.8,3.3c1.8-1.3,3.3-2.1,4.6-2.6c1.3-0.5,2.5-0.7,3.6-0.7
c0.7,0,1.2,0,1.4,0.1c0.3,0,0.7,0.1,1.3,0.2L590.6,195.1z" />
<path class="st5" d="M594.1,222.1h-4.2l6.6-9.7l-4.1-21.3h4l3.2,16.9l10.9-16.9h4.2L594.1,222.1z" />
</g>
</g>
</svg>

View file

@ -1,8 +1,8 @@
import type { Translations } from './registry'; import type { Translations } from './registry';
import { getLanguage, getBrowserLocale } from './locale'; import { getLanguage } from './locale';
import { getAppTranslations, hasAppTranslations, registerAppTranslations, unregisterAppTranslations } from './registry'; import { getAppTranslations, registerAppTranslations, unregisterAppTranslations } from './registry';
// import { generateFilePath } from '@nextcloud/router'; // import { generateFilePath } from '@nextcloud/router';
import axios from 'axios'; // import axios from 'axios';
// import DOMPurify from 'dompurify'; // import DOMPurify from 'dompurify';
import escapeHTML from 'escape-html'; import escapeHTML from 'escape-html';
@ -206,7 +206,7 @@ export async function loadTranslations(appName: string) {
try { try {
// Making a GET request using Axios // Making a GET request using Axios
// const response = await axios.get(url); // const response = await axios.get(url);
const response = await import(`@/apps/settings/l18n/${locale}`); const response = await import(`@/apps/settings/l18n/${locale}.js`);
// Check if the response data contains translations // Check if the response data contains translations
const bundle = response.default; const bundle = response.default;
if (typeof bundle.translations === 'object') { if (typeof bundle.translations === 'object') {

View file

@ -22,6 +22,7 @@
<input type="hidden" id="initial-state-settings-cronErrors" value="IiI="> <input type="hidden" id="initial-state-settings-cronErrors" value="IiI=">
<input type="hidden" id="initial-state-settings-cliBasedCronPossible" value="dHJ1ZQ=="> <input type="hidden" id="initial-state-settings-cliBasedCronPossible" value="dHJ1ZQ==">
<input type="hidden" id="initial-state-settings-cliBasedCronUser" value="Ind3dy1kYXRhIg=="> <input type="hidden" id="initial-state-settings-cliBasedCronUser" value="Ind3dy1kYXRhIg==">
@vite(['resources/js/app.ts'])
@routes('test') @routes('test')
</head> </head>
@ -29,8 +30,8 @@
<body> <body>
@inertia({ as: 'div', class: 'h-full' }) @inertia({ as: 'div', class: 'h-full' })
@entryPointStyles('app') {{-- @entryPointStyles('app')
@entryPointScripts('app') @entryPointScripts('app') --}}
</body> </body>
</html> </html>

View file

@ -11,39 +11,37 @@
| and hence do not rename or move this file to a different location. | and hence do not rename or move this file to a different location.
| |
*/ */
import { Env } from "@adonisjs/core/env" import { Env } from '@adonisjs/core/env';
export default await Env.create(new URL("../", import.meta.url), { export default await Env.create(new URL('../', import.meta.url), {
HOST: Env.schema.string({ format: 'host' }), HOST: Env.schema.string({ format: 'host' }),
PORT: Env.schema.number(), PORT: Env.schema.number(),
APP_KEY: Env.schema.string(), APP_KEY: Env.schema.string(),
APP_NAME: Env.schema.string(), APP_NAME: Env.schema.string(),
CACHE_VIEWS: Env.schema.boolean(), CACHE_VIEWS: Env.schema.boolean(),
SESSION_DRIVER: Env.schema.enum(["cookie", "memory"] as const), SESSION_DRIVER: Env.schema.enum(['cookie', 'memory'] as const),
DRIVE_DISK: Env.schema.enum(['local'] as const), DRIVE_DISK: Env.schema.enum(['local'] as const),
NODE_ENV: Env.schema.enum(['development', 'production', 'test'] as const), NODE_ENV: Env.schema.enum(['development', 'production', 'test'] as const),
DB_CONNECTION: Env.schema.string(), DB_CONNECTION: Env.schema.string(),
PG_HOST: Env.schema.string({ format: 'host' }), PG_HOST: Env.schema.string({ format: 'host' }),
PG_PORT: Env.schema.number(), PG_PORT: Env.schema.number(),
PG_USER: Env.schema.string(), PG_USER: Env.schema.string(),
PG_PASSWORD: Env.schema.string.optional(), PG_PASSWORD: Env.schema.string.optional(),
PG_DB_NAME: Env.schema.string(), PG_DB_NAME: Env.schema.string(),
REDIS_HOST: Env.schema.string({ format: 'host' }), REDIS_HOST: Env.schema.string({ format: 'host' }),
REDIS_PORT: Env.schema.number(), REDIS_PORT: Env.schema.number(),
HASH_DRIVER: Env.schema.enum(["scrypt", "argon", "bcrypt", "laravel", undefined] as const), HASH_DRIVER: Env.schema.enum(['scrypt', 'argon', 'bcrypt', 'laravel', undefined] as const),
OAI_LIST_SIZE: Env.schema.number(), OAI_LIST_SIZE: Env.schema.number(),
/* /*
|---------------------------------------------------------- |----------------------------------------------------------
| Variables for configuring the mail package | Variables for configuring the mail package
|---------------------------------------------------------- |----------------------------------------------------------
*/ */
SMTP_HOST: Env.schema.string.optional(), SMTP_HOST: Env.schema.string.optional(),
SMTP_PORT: Env.schema.string.optional(), SMTP_PORT: Env.schema.string.optional(),
RESEND_API_KEY: Env.schema.string.optional() RESEND_API_KEY: Env.schema.string.optional(),
});
})

View file

@ -24,8 +24,8 @@ server.use([
() => import('@adonisjs/static/static_middleware'), () => import('@adonisjs/static/static_middleware'),
// () => import('@adonisjs/cors/cors_middleware'), // () => import('@adonisjs/cors/cors_middleware'),
() => import('@adonisjs/inertia/inertia_middleware'), () => import('@adonisjs/inertia/inertia_middleware'),
() => import('@adonisjs/vite/vite_middleware'),
]); ]);
/** /**
* The router middleware stack runs middleware on all the HTTP * The router middleware stack runs middleware on all the HTTP
* requests with a registered route. * requests with a registered route.

View file

@ -41,150 +41,361 @@ import db from '@adonisjs/lucid/services/db'; // Import the DB service
router.get('/health', ({ response }: HttpContext) => response.noContent()); router.get('/health', ({ response }: HttpContext) => response.noContent());
// OAI routes // OAI routes
router.group(() => { router
router.get('/oai', [OaiController, 'index']).as('get'); .group(() => {
router.post('/oai', [OaiController, 'index']).as('post'); router.get('/oai', [OaiController, 'index']).as('get');
}).as('oai'); router.post('/oai', [OaiController, 'index']).as('post');
})
.as('oai');
// Welcome route // Welcome route
router.get('/welcome', async ({ view }: HttpContext) => { router
return view.render('welcome'); .get('/welcome', async ({ view }: HttpContext) => {
}).as('welcome'); return view.render('welcome');
})
.as('welcome');
// Dashboard route // Dashboard route
router.get('/', async ({ response }: HttpContext) => { router
return response.redirect().toRoute('apps.dashboard'); .get('/', async ({ response }: HttpContext) => {
}).as('dashboard'); return response.redirect().toRoute('apps.dashboard');
})
.as('dashboard');
// Apps group // Apps group
router.group(() => { router
router.get('/dashboard', async ({ inertia }: HttpContext) => { .group(() => {
return inertia.render('Dashboard'); router
}).as('dashboard'); .get('/dashboard', async ({ inertia }: HttpContext) => {
return inertia.render('Dashboard');
})
.as('dashboard');
router.get('/map', async ({ inertia }: HttpContext) => { router
return inertia.render('Map'); .get('/map', async ({ inertia }: HttpContext) => {
}).as('map'); return inertia.render('Map');
})
.as('map');
router.get('/', async ({ inertia }: HttpContext) => { router
const users = await User.query().orderBy('login'); .get('/', async ({ inertia }: HttpContext) => {
return inertia.render('App', { const users = await User.query().orderBy('login');
testing: 'this is a test', return inertia.render('App', {
users: users, testing: 'this is a test',
}); users: users,
}).as('index'); });
})
.as('index');
router.get('/register', async ({ inertia }: HttpContext) => { router
return inertia.render('register-view/register-view-component'); .get('/register', async ({ inertia }: HttpContext) => {
}).as('register.show'); return inertia.render('register-view/register-view-component');
})
.as('register.show');
router.post('/register', async ({ request, response }: HttpContext) => { router
await request.validateUsing(authValidator); .post('/register', async ({ request, response }: HttpContext) => {
return response.redirect().toRoute('app.index'); await request.validateUsing(authValidator);
}).as('register.store'); return response.redirect().toRoute('app.index');
}).prefix('apps').as('apps').use(middleware.auth()); })
.as('register.store');
})
.prefix('apps')
.as('apps')
.use(middleware.auth());
// Auth routes // Auth routes
router.get('/app/login', ({ inertia }: HttpContext) => { router
return inertia.render('Auth/Login'); .get('/app/login', ({ inertia }: HttpContext) => {
}).as('app.login.show'); return inertia.render('Auth/Login');
})
.as('app.login.show');
router.post('/app/login', [AuthController, 'login']).as('login.store'); router.post('/app/login', [AuthController, 'login']).as('login.store');
router.post('/app/twoFactorChallenge', [AuthController, 'twoFactorChallenge']).as('login.twoFactorChallenge'); router.post('/app/twoFactorChallenge', [AuthController, 'twoFactorChallenge']).as('login.twoFactorChallenge');
router.post('/signout', [AuthController, 'logout']).as('logout'); router.post('/signout', [AuthController, 'logout']).as('logout');
// Administrator routes // Administrator routes
router.group(() => { router
router.get('/settings', async ({ inertia }: HttpContext) => { .group(() => {
const updatedConfigValue = await db.from('appconfigs') router
.select('configvalue') .get('/settings', async ({ inertia }: HttpContext) => {
.where('appid', 'backgroundjob') const updatedConfigValue = await db
.where('configkey', 'lastjob') .from('appconfigs')
.first(); .select('configvalue')
return inertia.render('Admin/Settings', { .where('appid', 'backgroundjob')
lastCron: updatedConfigValue?.configvalue || '', .where('configkey', 'lastjob')
}); .first();
}).as('overview'); return inertia.render('Admin/Settings', {
lastCron: updatedConfigValue?.configvalue || '',
});
})
.as('overview');
router.post('/mail/store', [MailSettingsController, 'setMailSettings']).as('mail.store').use(middleware.can(['user-create'])); router
router.post('/mail/send', [MailSettingsController, 'sendTestMail']).as('mail.send').use(middleware.can(['user-create'])); .post('/mail/store', [MailSettingsController, 'setMailSettings'])
.as('mail.store')
.use(middleware.can(['user-create']));
router
.post('/mail/send', [MailSettingsController, 'sendTestMail'])
.as('mail.send')
.use(middleware.can(['user-create']));
// User routes // User routes
router.get('/user', [AdminuserController, 'index']).as('user.index').use(middleware.can(['user-list'])); router
router.get('/user/create', [AdminuserController, 'create']).as('user.create').use(middleware.can(['user-create'])); .get('/user', [AdminuserController, 'index'])
router.post('/user/store', [AdminuserController, 'store']).as('user.store').use(middleware.can(['user-create'])); .as('user.index')
router.get('/user/:id', [AdminuserController, 'show']).as('user.show').where('id', router.matchers.number()); .use(middleware.can(['user-list']));
router.get('/user/:id/edit', [AdminuserController, 'edit']).as('user.edit').where('id', router.matchers.number()).use(middleware.can(['user-edit'])); router
router.put('/user/:id/update', [AdminuserController, 'update']).as('user.update').where('id', router.matchers.number()).use(middleware.can(['user-edit'])); .get('/user/create', [AdminuserController, 'create'])
router.delete('/user/:id', [AdminuserController, 'destroy']).as('user.destroy').where('id', router.matchers.number()).use(middleware.can(['user-delete'])); .as('user.create')
.use(middleware.can(['user-create']));
router
.post('/user/store', [AdminuserController, 'store'])
.as('user.store')
.use(middleware.can(['user-create']));
router.get('/user/:id', [AdminuserController, 'show']).as('user.show').where('id', router.matchers.number());
router
.get('/user/:id/edit', [AdminuserController, 'edit'])
.as('user.edit')
.where('id', router.matchers.number())
.use(middleware.can(['user-edit']));
router
.put('/user/:id/update', [AdminuserController, 'update'])
.as('user.update')
.where('id', router.matchers.number())
.use(middleware.can(['user-edit']));
router
.delete('/user/:id', [AdminuserController, 'destroy'])
.as('user.destroy')
.where('id', router.matchers.number())
.use(middleware.can(['user-delete']));
// Role routes // Role routes
router.get('/role', [RoleController, 'index']).as('role.index').use(middleware.can(['user-list'])); router
router.get('/role/create', [RoleController, 'create']).as('role.create').use(middleware.can(['user-create'])); .get('/role', [RoleController, 'index'])
router.post('/role/store', [RoleController, 'store']).as('role.store').use(middleware.can(['user-create'])); .as('role.index')
router.get('/role/:id', [RoleController, 'show']).as('role.show').where('id', router.matchers.number()); .use(middleware.can(['user-list']));
router.get('/role/:id/edit', [RoleController, 'edit']).as('role.edit').where('id', router.matchers.number()).use(middleware.can(['user-edit'])); router
router.put('/role/:id/update', [RoleController, 'update']).as('role.update').where('id', router.matchers.number()).use(middleware.can(['user-edit'])); .get('/role/create', [RoleController, 'create'])
.as('role.create')
.use(middleware.can(['user-create']));
router
.post('/role/store', [RoleController, 'store'])
.as('role.store')
.use(middleware.can(['user-create']));
router.get('/role/:id', [RoleController, 'show']).as('role.show').where('id', router.matchers.number());
router
.get('/role/:id/edit', [RoleController, 'edit'])
.as('role.edit')
.where('id', router.matchers.number())
.use(middleware.can(['user-edit']));
router
.put('/role/:id/update', [RoleController, 'update'])
.as('role.update')
.where('id', router.matchers.number())
.use(middleware.can(['user-edit']));
// License routes // License routes
router.get('/license', [LicenseController, 'index']).as('license.index'); router.get('/license', [LicenseController, 'index']).as('license.index');
router.get('/license/:id/down', [LicenseController, 'down']).as('license.down').where('id', router.matchers.number()).use(middleware.can(['settings'])); router
router.get('/license/:id/up', [LicenseController, 'up']).as('license.up').where('id', router.matchers.number()).use(middleware.can(['settings'])); .get('/license/:id/down', [LicenseController, 'down'])
.as('license.down')
.where('id', router.matchers.number())
.use(middleware.can(['settings']));
router
.get('/license/:id/up', [LicenseController, 'up'])
.as('license.up')
.where('id', router.matchers.number())
.use(middleware.can(['settings']));
// Mimetype routes // Mimetype routes
router.get('/mimetype', [MimetypeController, 'index']).as('mimetype.index'); router.get('/mimetype', [MimetypeController, 'index']).as('mimetype.index');
router.get('/mimetype/create', [MimetypeController, 'create']).as('mimetype.create').use(middleware.can(['settings'])); router
router.post('/mimetype/store', [MimetypeController, 'store']).as('mimetype.store').use(middleware.can(['settings'])); .get('/mimetype/create', [MimetypeController, 'create'])
router.get('/mimetype/:id/down', [MimetypeController, 'down']).as('mimetype.down').where('id', router.matchers.number()).use(middleware.can(['settings'])); .as('mimetype.create')
router.get('/mimetype/:id/up', [MimetypeController, 'up']).as('mimetype.up').where('id', router.matchers.number()).use(middleware.can(['settings'])); .use(middleware.can(['settings']));
router.get('/mimetype/:id/delete', [MimetypeController, 'delete']).as('mimetype.delete').use([middleware.auth(), middleware.can(['dataset-delete'])]); router
router.delete('/mimetype/:id/deleteStore', [MimetypeController, 'deleteStore']).as('mimetype.deleteStore').use([middleware.auth(), middleware.can(['settings'])]); .post('/mimetype/store', [MimetypeController, 'store'])
}).prefix('admin').as('settings').use([middleware.auth(), middleware.is(['administrator', 'moderator'])]); .as('mimetype.store')
.use(middleware.can(['settings']));
router
.get('/mimetype/:id/down', [MimetypeController, 'down'])
.as('mimetype.down')
.where('id', router.matchers.number())
.use(middleware.can(['settings']));
router
.get('/mimetype/:id/up', [MimetypeController, 'up'])
.as('mimetype.up')
.where('id', router.matchers.number())
.use(middleware.can(['settings']));
router
.get('/mimetype/:id/delete', [MimetypeController, 'delete'])
.as('mimetype.delete')
.use([middleware.auth(), middleware.can(['dataset-delete'])]);
router
.delete('/mimetype/:id/deleteStore', [MimetypeController, 'deleteStore'])
.as('mimetype.deleteStore')
.use([middleware.auth(), middleware.can(['settings'])]);
})
.prefix('admin')
.as('settings')
.use([middleware.auth(), middleware.is(['administrator', 'moderator'])]);
router.get('/settings/user/security', [UserController, 'accountInfo']).as('settings.user').use(middleware.auth()); router.get('/settings/user/security', [UserController, 'accountInfo']).as('settings.user').use(middleware.auth());
router.post('/settings/user/store', [UserController, 'accountInfoStore']).as('account.password.store').use(middleware.auth()); router.post('/settings/user/store', [UserController, 'accountInfoStore']).as('account.password.store').use(middleware.auth());
// Submitter routes // Submitter routes
router.group(() => { router
router.get('/dataset', [DatasetController, 'index']).as('dataset.list').use([middleware.auth(), middleware.can(['dataset-list'])]); .group(() => {
router.get('/dataset/create', [DatasetController, 'create']).as('dataset.create').use([middleware.auth(), middleware.can(['dataset-submit'])]); router
router.post('/dataset/first/first-step', [DatasetController, 'firstStep']).as('dataset.first.step').use([middleware.auth(), middleware.can(['dataset-submit'])]); .get('/dataset', [DatasetController, 'index'])
router.post('/dataset/second/second-step', [DatasetController, 'secondStep']).as('dataset.second.step').use([middleware.auth(), middleware.can(['dataset-submit'])]); .as('dataset.list')
router.post('/dataset/second/third-step', [DatasetController, 'thirdStep']).as('dataset.third.step').use([middleware.auth(), middleware.can(['dataset-submit'])]); .use([middleware.auth(), middleware.can(['dataset-list'])]);
router.post('/dataset/submit', [DatasetController, 'store']).as('dataset.submit').use([middleware.auth(), middleware.can(['dataset-submit'])]); router
router.get('/dataset/:id/release', [DatasetController, 'release']).as('dataset.release').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-edit'])]); .get('/dataset/create', [DatasetController, 'create'])
router.put('/dataset/:id/releaseupdate', [DatasetController, 'releaseUpdate']).as('dataset.releaseUpdate').use([middleware.auth(), middleware.can(['dataset-edit'])]); .as('dataset.create')
router.get('/dataset/:id/edit', [DatasetController, 'edit']).as('dataset.edit').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-edit'])]); .use([middleware.auth(), middleware.can(['dataset-submit'])]);
router.put('/dataset/:id/update', [DatasetController, 'update']).as('dataset.update').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-edit'])]); router
router.get('/dataset/:id/delete', [DatasetController, 'delete']).as('dataset.delete').use([middleware.auth(), middleware.can(['dataset-delete'])]); .post('/dataset/first/first-step', [DatasetController, 'firstStep'])
router.put('/dataset/:id/deleteupdate', [DatasetController, 'deleteUpdate']).as('dataset.deleteUpdate').use([middleware.auth(), middleware.can(['dataset-delete'])]); .as('dataset.first.step')
router.get('/person', [PersonController, 'index']).as('person.index').use([middleware.auth()]); .use([middleware.auth(), middleware.can(['dataset-submit'])]);
router.get('/dataset/categorize', ({ inertia }: HttpContext) => { router
return inertia.render('Submitter/Dataset/Category'); .post('/dataset/second/second-step', [DatasetController, 'secondStep'])
}); .as('dataset.second.step')
}).prefix('submitter'); .use([middleware.auth(), middleware.can(['dataset-submit'])]);
router
.post('/dataset/second/third-step', [DatasetController, 'thirdStep'])
.as('dataset.third.step')
.use([middleware.auth(), middleware.can(['dataset-submit'])]);
router
.post('/dataset/submit', [DatasetController, 'store'])
.as('dataset.submit')
.use([middleware.auth(), middleware.can(['dataset-submit'])]);
router
.get('/dataset/:id/release', [DatasetController, 'release'])
.as('dataset.release')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-edit'])]);
router
.put('/dataset/:id/releaseupdate', [DatasetController, 'releaseUpdate'])
.as('dataset.releaseUpdate')
.use([middleware.auth(), middleware.can(['dataset-edit'])]);
router
.get('/dataset/:id/edit', [DatasetController, 'edit'])
.as('dataset.edit')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-edit'])]);
router
.put('/dataset/:id/update', [DatasetController, 'update'])
.as('dataset.update')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-edit'])]);
router
.get('/dataset/:id/delete', [DatasetController, 'delete'])
.as('dataset.delete')
.use([middleware.auth(), middleware.can(['dataset-delete'])]);
router
.put('/dataset/:id/deleteupdate', [DatasetController, 'deleteUpdate'])
.as('dataset.deleteUpdate')
.use([middleware.auth(), middleware.can(['dataset-delete'])]);
router.get('/person', [PersonController, 'index']).as('person.index').use([middleware.auth()]);
router.get('/dataset/categorize', ({ inertia }: HttpContext) => {
return inertia.render('Submitter/Dataset/Category');
});
})
.prefix('submitter');
// Editor routes // Editor routes
router.group(() => { router
router.get('/dataset', [EditorDatasetController, 'index']).as('editor.dataset.list').use([middleware.auth(), middleware.can(['dataset-editor-list'])]); .group(() => {
router.get('dataset/:id/receive', [EditorDatasetController, 'receive']).as('editor.dataset.receive').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-receive'])]); router
router.put('dataset/:id/receive', [EditorDatasetController, 'receiveUpdate']).as('editor.dataset.receiveUpdate').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-receive'])]); .get('/dataset', [EditorDatasetController, 'index'])
router.get('dataset/:id/approve', [EditorDatasetController, 'approve']).as('editor.dataset.approve').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-approve'])]); .as('editor.dataset.list')
router.put('dataset/:id/approve', [EditorDatasetController, 'approveUpdate']).as('editor.dataset.approveUpdate').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-approve'])]); .use([middleware.auth(), middleware.can(['dataset-editor-list'])]);
router.get('dataset/:id/reject', [EditorDatasetController, 'reject']).as('editor.dataset.reject').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-editor-reject'])]); router
router.put('dataset/:id/reject', [EditorDatasetController, 'rejectUpdate']).as('editor.dataset.rejectUpdate').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-editor-reject'])]); .get('dataset/:id/receive', [EditorDatasetController, 'receive'])
router.get('dataset/:id/publish', [EditorDatasetController, 'publish']).as('editor.dataset.publish').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-publish'])]); .as('editor.dataset.receive')
router.put('dataset/:id/publish', [EditorDatasetController, 'publishUpdate']).as('editor.dataset.publishUpdate').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-publish'])]); .where('id', router.matchers.number())
router.get('dataset/:id/doi', [EditorDatasetController, 'doiCreate']).as('editor.dataset.doi').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-publish'])]); .use([middleware.auth(), middleware.can(['dataset-receive'])]);
router.put('dataset/:publish_id/doi', [EditorDatasetController, 'doiStore']).as('editor.dataset.doiStore').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-publish'])]); router
router.put('/dataset/:id/update', [EditorDatasetController, 'update']).as('editor.dataset.update').use([middleware.auth(), middleware.can(['dataset-editor-edit'])]); .put('dataset/:id/receive', [EditorDatasetController, 'receiveUpdate'])
}).prefix('editor'); .as('editor.dataset.receiveUpdate')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-receive'])]);
router
.get('dataset/:id/approve', [EditorDatasetController, 'approve'])
.as('editor.dataset.approve')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-approve'])]);
router
.put('dataset/:id/approve', [EditorDatasetController, 'approveUpdate'])
.as('editor.dataset.approveUpdate')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-approve'])]);
router
.get('dataset/:id/reject', [EditorDatasetController, 'reject'])
.as('editor.dataset.reject')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-editor-reject'])]);
router
.put('dataset/:id/reject', [EditorDatasetController, 'rejectUpdate'])
.as('editor.dataset.rejectUpdate')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-editor-reject'])]);
router
.get('dataset/:id/publish', [EditorDatasetController, 'publish'])
.as('editor.dataset.publish')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-publish'])]);
router
.put('dataset/:id/publish', [EditorDatasetController, 'publishUpdate'])
.as('editor.dataset.publishUpdate')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-publish'])]);
router
.get('dataset/:id/doi', [EditorDatasetController, 'doiCreate'])
.as('editor.dataset.doi')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-publish'])]);
router
.put('dataset/:publish_id/doi', [EditorDatasetController, 'doiStore'])
.as('editor.dataset.doiStore')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-publish'])]);
router
.put('/dataset/:id/update', [EditorDatasetController, 'update'])
.as('editor.dataset.update')
.use([middleware.auth(), middleware.can(['dataset-editor-edit'])]);
})
.prefix('editor');
// Reviewer routes // Reviewer routes
router.group(() => { router
router.get('/dataset', [ReviewerDatasetController, 'index']).as('reviewer.dataset.list').use([middleware.auth(), middleware.can(['dataset-review-list'])]); .group(() => {
router.get('dataset/:id/review', [ReviewerDatasetController, 'review']).as('reviewer.dataset.review').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-review'])]); router
router.put('dataset/:id/review', [ReviewerDatasetController, 'reviewUpdate']).as('reviewer.dataset.reviewUpdate').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-review'])]); .get('/dataset', [ReviewerDatasetController, 'index'])
router.get('dataset/:id/reject', [ReviewerDatasetController, 'reject']).as('reviewer.dataset.reject').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-review-reject'])]); .as('reviewer.dataset.list')
router.put('dataset/:id/reject', [ReviewerDatasetController, 'rejectUpdate']).as('reviewer.dataset.rejectUpdate').where('id', router.matchers.number()).use([middleware.auth(), middleware.can(['dataset-review-reject'])]); .use([middleware.auth(), middleware.can(['dataset-review-list'])]);
}).prefix('reviewer'); router
.get('dataset/:id/review', [ReviewerDatasetController, 'review'])
.as('reviewer.dataset.review')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-review'])]);
router
.put('dataset/:id/review', [ReviewerDatasetController, 'reviewUpdate'])
.as('reviewer.dataset.reviewUpdate')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-review'])]);
router
.get('dataset/:id/reject', [ReviewerDatasetController, 'reject'])
.as('reviewer.dataset.reject')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-review-reject'])]);
router
.put('dataset/:id/reject', [ReviewerDatasetController, 'rejectUpdate'])
.as('reviewer.dataset.rejectUpdate')
.where('id', router.matchers.number())
.use([middleware.auth(), middleware.can(['dataset-review-reject'])]);
})
.prefix('reviewer');

View file

@ -6,30 +6,32 @@ import HomeController from '#controllers/Http/Api/HomeController';
import FileController from '#controllers/Http/Api/FileController'; import FileController from '#controllers/Http/Api/FileController';
import AvatarController from '#controllers/Http/Api/AvatarController'; import AvatarController from '#controllers/Http/Api/AvatarController';
import UserController from '#controllers/Http/Api/UserController'; import UserController from '#controllers/Http/Api/UserController';
import { middleware } from '../kernel.js' import { middleware } from '../kernel.js';
// API // API
router.group(() => { router
.group(() => {
router.get('authors', [AuthorsController, 'index']).as('author.index');
router.get('datasets', [DatasetController, 'index']).as('dataset.index');
router.get('persons', [AuthorsController, 'persons']).as('author.persons');
router.get('/dataset', [DatasetController, 'findAll']).as('dataset.findAll');
router.get('/dataset/:publish_id', [DatasetController, 'findOne']).as('dataset.findOne');
router.get('/sitelinks/:year', [HomeController, 'findDocumentsPerYear']);
router.get('/years', [HomeController, 'findYears']);
router.get('/statistic/:year', [HomeController, 'findPublicationsPerMonth']);
router.get('/download/:id', [FileController, 'findOne']).as('file.findOne');
router.get('authors', [AuthorsController, "index"]).as('author.index');
router.get('datasets', [DatasetController, "index"]).as('dataset.index');
router.get('persons', [AuthorsController, "persons"]).as('author.persons');
router.get('/dataset', [DatasetController, "findAll"]).as('dataset.findAll');
router.get('/dataset/:publish_id', [DatasetController, "findOne"]).as('dataset.findOne');
router.get('/sitelinks/:year', [HomeController, "findDocumentsPerYear"]);
router.get('/years', [HomeController, "findYears"]);
router.get('/statistic/:year', [HomeController, "findPublicationsPerMonth"]);
router.get('/download/:id', [FileController, "findOne"]).as('file.findOne');
router.get('/avatar/:name/:background?/:textColor?/:size?', [AvatarController, 'generateAvatar']); router.get('/avatar/:name/:background?/:textColor?/:size?', [AvatarController, 'generateAvatar']);
router
router.post('/twofactor_totp/settings/enable/:state/:code?', [UserController, 'enable']).as('apps.twofactor_totp.enable') .use(middleware.auth()); .post('/twofactor_totp/settings/enable/:state/:code?', [UserController, 'enable'])
router.post('/twofactor_backupcodes/settings/create', [UserController, 'createCodes']).as('apps.twofactor_backupcodes.create') .use(middleware.auth()); .as('apps.twofactor_totp.enable')
.use(middleware.auth());
}) router
.post('/twofactor_backupcodes/settings/create', [UserController, 'createCodes'])
.as('apps.twofactor_backupcodes.create')
.use(middleware.auth());
})
// .namespace('App/Controllers/Http/Api') // .namespace('App/Controllers/Http/Api')
.prefix('api'); .prefix('api');

View file

@ -9,7 +9,6 @@ import vine from '@vinejs/vine';
// import { VineString } from '@vinejs/vine'; // import { VineString } from '@vinejs/vine';
import { VineMultipartFile, isBodyParserFile } from '#providers/vinejs_provider'; import { VineMultipartFile, isBodyParserFile } from '#providers/vinejs_provider';
import type { MultipartFile } from '@adonisjs/core/bodyparser'; import type { MultipartFile } from '@adonisjs/core/bodyparser';
// import db from '@adonisjs/lucid/services/db';
import MimeType from '#models/mime_type'; import MimeType from '#models/mime_type';
/** /**
@ -22,11 +21,14 @@ import MimeType from '#models/mime_type';
type Options = { type Options = {
// size: string | number; // size: string | number;
// extnames: string[]; // extnames: string[];
clientNameSizeLimit: number; // clientNameSizeLimit?: number;
allowedExtensions: string[];
allowedMimeTypes: string[];
}; };
// async function allowedMimetypeExtensions(file: VineMultipartFile | unknown, options: Options | unknown, field: FieldContext) { // async function allowedMimetypeExtensions(file: VineMultipartFile | unknown, options: Options | unknown, field: FieldContext) {
async function allowedMimetypeExtensions(file: VineMultipartFile | unknown, options: Options | unknown, field: FieldContext) { async function allowedMimetypeExtensions(file: VineMultipartFile | unknown, options: Options, field: FieldContext) {
// if (typeof value !== 'string' && typeof value != 'number') { // if (typeof value !== 'string' && typeof value != 'number') {
// return; // return;
// } // }
@ -42,7 +44,7 @@ async function allowedMimetypeExtensions(file: VineMultipartFile | unknown, opti
const mimeRecord = await MimeType.query().select('file_extension').where('name', mimeType).andWhere('enabled', true).first(); const mimeRecord = await MimeType.query().select('file_extension').where('name', mimeType).andWhere('enabled', true).first();
if (!mimeRecord) { if (!mimeRecord) {
const allowedMimetypes = await MimeType.query().select('name').where('enabled', true); const allowedMimetypes = await MimeType.query().select('name').where('enabled', true)
// Transform allowed MIME types to a concatenated string // Transform allowed MIME types to a concatenated string
const allowedMimetypesString = allowedMimetypes.map((mime) => mime.name).join(', '); const allowedMimetypesString = allowedMimetypes.map((mime) => mime.name).join(', ');
// throw new Error('Invalid MIME type'); // throw new Error('Invalid MIME type');
@ -53,14 +55,19 @@ async function allowedMimetypeExtensions(file: VineMultipartFile | unknown, opti
field, field,
); );
} else { } else {
const allowedExtensions = mimeRecord.file_extension.split('|'); let allowedExtensions: string[] = [];
if (options && options.allowedExtensions) {
allowedExtensions = options.allowedExtensions;
} else {
allowedExtensions = mimeRecord.file_extension.split('|');
}
// Validate if the file's extension is in the allowed extensions // Validate if the file's extension is in the allowed extensions
if (!allowedExtensions.includes(fileExtension)) { if (!allowedExtensions.includes(fileExtension)) {
//throw new Error(`File extension ${fileExtension} is not allowed for MIME type ${mimeType}`); //throw new Error(`File extension ${fileExtension} is not allowed for MIME type ${mimeType}`);
field.report( field.report(
`File extension ${fileExtension} is not allowed for MIME type ${mimeType}. Allowed extensions are: ${mimeRecord.file_extension}`, `File extension ${fileExtension} is not allowed for MIME type ${mimeType}. Allowed extensions are: ${mimeRecord.file_extension}`,
'allowedMimetypeExtensions', 'allowedMimetypeExtensions',
field field,
); );
} }
// if (validatedFile.clientName.length > options.clientNameSizeLimit) { // if (validatedFile.clientName.length > options.clientNameSizeLimit) {

View file

@ -1,7 +1,7 @@
import { FieldContext } from '@vinejs/vine/types'; import { FieldContext } from '@vinejs/vine/types';
import vine from '@vinejs/vine'; import vine from '@vinejs/vine';
import { VineString } from '@vinejs/vine'; import { VineString } from '@vinejs/vine';
import axios from 'axios'; import { default as axios } from 'axios';
import { ReferenceIdentifierTypes } from '#contracts/enums'; import { ReferenceIdentifierTypes } from '#contracts/enums';
type Options = { type Options = {
@ -11,7 +11,7 @@ type Options = {
// Function to check if DOI exists using the DOI API // Function to check if DOI exists using the DOI API
async function checkDoiExists(doi: string): Promise<boolean> { async function checkDoiExists(doi: string): Promise<boolean> {
try { try {
const response = await axios.default.get(`${doi}`); const response = await axios.get(`${doi}`);
return response.status === 200; // If status is 200, DOI is valid return response.status === 200; // If status is 200, DOI is valid
} catch (error) { } catch (error) {
return false; // If request fails, DOI does not exist return false; // If request fails, DOI does not exist
@ -21,7 +21,7 @@ async function checkDoiExists(doi: string): Promise<boolean> {
// Function to check if ISBN exists using the Open Library API // Function to check if ISBN exists using the Open Library API
async function checkIsbnExists(isbn: string): Promise<boolean> { async function checkIsbnExists(isbn: string): Promise<boolean> {
try { try {
const response = await axios.default.get(`https://isbnsearch.org/isbn/${isbn}`); const response = await axios.get(`https://isbnsearch.org/isbn/${isbn}`);
return response.data && response.status == 200; // If title is returned, ISBN is valid return response.data && response.status == 200; // If title is returned, ISBN is valid
} catch (error) { } catch (error) {
return false; // If request fails, ISBN does not exist return false; // If request fails, ISBN does not exist

View file

@ -17,7 +17,7 @@ type Options = {
}; };
async function translatedLanguage(value: unknown, options: Options, field: FieldContext) { async function translatedLanguage(value: unknown, options: Options, field: FieldContext) {
if (typeof value !== 'string' && typeof value != 'number') { if (typeof value !== 'string' && typeof value !== 'number') {
return; return;
} }

View file

@ -15,11 +15,11 @@ import { VineString, VineNumber } from '@vinejs/vine';
type Options = { type Options = {
table: string; table: string;
column: string; column: string;
whereNot?: ((field: FieldContext) => string); whereNot?: (field: FieldContext) => string;
}; };
async function isUnique(value: unknown, options: Options, field: FieldContext) { async function isUnique(value: unknown, options: Options, field: FieldContext) {
if (typeof value !== 'string' && typeof value != 'number') { if (typeof value !== 'string' && typeof value !== 'number') {
return; return;
} }
@ -37,13 +37,11 @@ async function isUnique(value: unknown, options: Options, field: FieldContext) {
// report that value is NOT unique // report that value is NOT unique
field.report('The {{ field }} field is not unique', 'isUnique', field); field.report('The {{ field }} field is not unique', 'isUnique', field);
// field.report(messages.unique, "isUnique", field); // field.report(messages.unique, "isUnique", field);
} }
} }
export const isUniqueRule = vine.createRule(isUnique); export const isUniqueRule = vine.createRule(isUnique);
declare module '@vinejs/vine' { declare module '@vinejs/vine' {
interface VineString { interface VineString {
isUnique(options: Options): this; isUnique(options: Options): this;

View file

@ -19,9 +19,8 @@ type Options = {
idField: string; idField: string;
}; };
async function isUniquePerson(value: unknown, options: Options, field: FieldContext) { async function isUniquePerson(value: unknown, options: Options, field: FieldContext) {
if (typeof value !== 'string' && typeof value != 'number') { if (typeof value !== 'string' && typeof value !== 'number') {
return; return;
} }
@ -40,13 +39,11 @@ async function isUniquePerson(value: unknown, options: Options, field: FieldCont
if (result) { if (result) {
// report that value is NOT unique // report that value is NOT unique
field.report('The {{ field }} field is not unique', 'isUnique', field); field.report('The {{ field }} field is not unique', 'isUnique', field);
} }
} }
export const isUniquePersonRule = vine.createRule(isUniquePerson); export const isUniquePersonRule = vine.createRule(isUniquePerson);
declare module '@vinejs/vine' { declare module '@vinejs/vine' {
interface VineString { interface VineString {
isUniquePerson(options: Options): this; isUniquePerson(options: Options): this;

View file

@ -13,7 +13,6 @@ import vine from '@vinejs/vine';
// import db from '@adonisjs/lucid/services/db'; // import db from '@adonisjs/lucid/services/db';
import { VanillaErrorReporter } from '#validators/vanilla_error_reporter'; import { VanillaErrorReporter } from '#validators/vanilla_error_reporter';
// vine.messagesProvider = new SimpleMessagesProvider({ // vine.messagesProvider = new SimpleMessagesProvider({
// // Applicable for all fields // // Applicable for all fields
// 'required': 'The {{ field }} field is required', // 'required': 'The {{ field }} field is required',
@ -27,7 +26,6 @@ import { VanillaErrorReporter } from '#validators/vanilla_error_reporter';
// }) // })
vine.errorReporter = () => new VanillaErrorReporter(); vine.errorReporter = () => new VanillaErrorReporter();
// /** // /**
// * Options accepted by the unique rule // * Options accepted by the unique rule
// */ // */

View file

@ -12,10 +12,10 @@ import testUtils from '@adonisjs/core/services/test_utils';
// import { assert, runFailedTests, specReporter, apiClient } from '@japa/preset-adonis'; // import { assert, runFailedTests, specReporter, apiClient } from '@japa/preset-adonis';
import { assert } from '@japa/assert'; import { assert } from '@japa/assert';
import { apiClient } from '@japa/api-client'; // import { apiClient } from '@japa/api-client';
import { pluginAdonisJS } from '@japa/plugin-adonisjs'; import { pluginAdonisJS } from '@japa/plugin-adonisjs';
import app from '@adonisjs/core/services/app'; import app from '@adonisjs/core/services/app';
import env from '#start/env' // import env from '#start/env'
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Japa Plugins | Japa Plugins
@ -30,9 +30,9 @@ import env from '#start/env'
// export const plugins: Required<Config>['plugins'] = [assert(), runFailedTests(), apiClient()]; // export const plugins: Required<Config>['plugins'] = [assert(), runFailedTests(), apiClient()];
export const plugins: Config['plugins'] = [ export const plugins: Config['plugins'] = [
assert(), assert(),
apiClient({ // apiClient({
baseURL: `http://${env.get('HOST')}:${env.get('PORT')}`, // baseURL: `http://${env.get('HOST')}:${env.get('PORT')}`,
}), // }),
pluginAdonisJS(app), pluginAdonisJS(app),
]; ];

View file

@ -8,7 +8,7 @@ import User from '#models/user';
import Role from '#models/role'; import Role from '#models/role';
import Permission from '#models/permission'; import Permission from '#models/permission';
import { TestContext } from '@japa/runner/core'; import { TestContext } from '@japa/runner/core';
const BASE_URL = `http://${process.env.HOST}:${process.env.PORT}` const BASE_URL = `http://${process.env.HOST}:${process.env.PORT}`;
test.group('DatasetController', (group) => { test.group('DatasetController', (group) => {
// Write your test here // Write your test here
@ -24,8 +24,6 @@ test.group('DatasetController', (group) => {
// server = await supertest(BASE_URL); // server = await supertest(BASE_URL);
// }); // });
test('should render dataset release page', async ({ assert }: TestContext) => { test('should render dataset release page', async ({ assert }: TestContext) => {
var testAgent = supertest(BASE_URL); var testAgent = supertest(BASE_URL);
@ -39,15 +37,14 @@ test.group('DatasetController', (group) => {
const role = await Role.create({ const role = await Role.create({
name: 'administrator', name: 'administrator',
display_name: 'admin', display_name: 'admin',
description: 'User has access to all system functionality' description: 'User has access to all system functionality',
}); });
await user.related('roles').attach([role.id]); await user.related('roles').attach([role.id]);
const permission = await Permission.create({ const permission = await Permission.create({
name: 'dataset-edit', name: 'dataset-edit',
display_name: 'edit dataset', display_name: 'edit dataset',
description: 'allow role to edit datasets' description: 'allow role to edit datasets',
}); });
await role.related('permissions').attach([permission.id]); await role.related('permissions').attach([permission.id]);

View file

@ -1,8 +1,8 @@
import { test } from '@japa/runner'; // import { test } from '@japa/runner';
test('display welcome page', async ({ client }) => { // test('display welcome page', async ({ client }) => {
const response = await client.get('/welcome'); // const response = await client.get('/welcome');
response.assertStatus(200); // response.assertStatus(200);
response.assertTextIncludes('<h1 class="title"> It Works! </h1>'); // response.assertTextIncludes('<h1 class="title"> It Works! </h1>');
}); // });

View file

@ -10,8 +10,8 @@
"node_modules", "node_modules",
"build", "build",
"public", "public",
"./resources/js/**/*.vue", "./resources/js/**/*",
"./resources/js/**/*.ts" // "./resources/js/**/*.ts"
], ],
// "exclude": ["./inertia/**/*"] // "exclude": ["./inertia/**/*"]
"compilerOptions": { "compilerOptions": {
@ -19,9 +19,10 @@
"outDir": "build", "outDir": "build",
"rootDir": "./", "rootDir": "./",
"sourceMap": true, "sourceMap": true,
"sourceRoot": "./build",
"experimentalDecorators": true, "experimentalDecorators": true,
"strictPropertyInitialization": false, "strictPropertyInitialization": false,
"target": "esnext", "target": "esnext", // Update to a version that supports top-level await
"skipLibCheck": true, "skipLibCheck": true,
"esModuleInterop": true, "esModuleInterop": true,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,

78
vite.config.ts Normal file
View file

@ -0,0 +1,78 @@
import { defineConfig } from 'vite';
import adonisjs from '@adonisjs/vite/client';
// import { getDirname } from '@adonisjs/core/helpers';
import vue from '@vitejs/plugin-vue';
import path from 'path';
// import tailwind from '@tailwindcss/postcss';
// import autoprefixer from 'autoprefixer';
// import postcssNesting from 'postcss-nesting';
import inertia from '@adonisjs/inertia/client';
export default defineConfig({
plugins: [
inertia(),
vue(),
adonisjs({
/**
* Entrypoints of your application. Each entrypoint will
* result in a separate bundle.
*/
entrypoints: ['resources/js/app.ts', 'resources/css/app.css'],
/**
* Paths to watch and reload the browser on file change
*/
reload: ['resources/views/**/*.edge'],
}),
],
server: {
port: 5173,
// host: '127.0.0.1'
},
// css: {
// postcss: {
// plugins: [
// postcssNesting(),
// tailwind(),
// autoprefixer(),
// ],
// },
// },
/**
* Define aliases for importing modules from
* your frontend code
*/
resolve: {
alias: {
'@': path.resolve('./resources/js/'),
'~': path.resolve(__dirname, 'node_modules/'),
},
},
// optimizeDeps: {
// esbuildOptions: {
// target: 'esnext'
// },
// include: ['resources/js/**/*.{vue,js,jsx,ts,tsx}'],
// exclude: ['node_modules', 'app'],
// },
build: {
sourcemap: true,
outDir: 'public/assets',
emptyOutDir: true,
manifest: true,
rollupOptions: {
input: 'resources/js/app.ts',
},
},
// build: {
// outDir: 'public/assets',
// emptyOutDir: true,
// manifest: true,
// rollupOptions: {
// input: path.resolve(__dirname, 'resources/js/app.ts'),
// },
// },
});

View file

@ -302,18 +302,18 @@ Encore.addLoader({
// vue$: 'vue/dist/vue.runtime.esm-bundler.js', // vue$: 'vue/dist/vue.runtime.esm-bundler.js',
// }); // });
Encore.addLoader(babelLoader) // Encore.addLoader(babelLoader)
// Encore.enableTypeScriptLoader(config => { Encore.enableTypeScriptLoader(config => {
// // Loader-specific options // Loader-specific options
// config.configFile = 'resources/js/tsconfig.json'; config.configFile = 'resources/js/tsconfig.json';
// config.appendTsSuffixTo = [/\.vue$/]; config.appendTsSuffixTo = [/\.vue$/];
// config.transpileOnly = true; config.transpileOnly = true;
// config.happyPackMode = false; config.happyPackMode = false;
// }, { }, {
// // Directly change the exclude rule // Directly change the exclude rule
// exclude: /node_modules/, exclude: /node_modules/,
// }) })
.addAliases({ .addAliases({
'@': join(__dirname, 'resources/js'), '@': join(__dirname, 'resources/js'),
'vue$': 'vue/dist/vue.runtime.esm-bundler.js', 'vue$': 'vue/dist/vue.runtime.esm-bundler.js',