- npm updates
Some checks failed
CI Pipeline / japa-tests (push) Failing after 51s

- added views and controller coder for reviewer role
- added program logic for publishing a dataset by editor
- added reviewer menu
- adapted routes.ts for additional routes
This commit is contained in:
Kaimbacher 2024-01-04 16:40:05 +01:00
parent c70fa4a0d8
commit 18635f77b3
17 changed files with 1224 additions and 393 deletions

View File

@ -9,6 +9,7 @@ import { readFileSync } from 'fs';
import { transform } from 'saxon-js';
import type { ModelQueryBuilderContract } from '@ioc:Adonis/Lucid/Orm';
import { schema, CustomMessages } from '@ioc:Adonis/Core/Validator';
import { DateTime } from 'luxon';
// Create a new instance of the client
const client = new Client({ node: 'http://localhost:9200' }); // replace with your OpenSearch endpoint
@ -19,6 +20,7 @@ export default class DatasetsController {
// 'required': '{{ field }} is required',
// 'licenses.minLength': 'at least {{ options.minLength }} permission must be defined',
'reviewer_id.required': 'reviewer_id must be defined',
'publisher_name.required': 'publisher name must be defined',
};
constructor() {
@ -73,11 +75,11 @@ export default class DatasetsController {
datasets: myDatasets.serialize(),
filters: request.all(),
can: {
// create: await auth.user?.can(['dataset-submit']),
receive: await auth.user?.can(['dataset-receive']),
approve: await auth.user?.can(['dataset-approve']),
edit: await auth.user?.can(['dataset-editor-edit']),
edit: await auth.user?.can(['dataset-editor-update']),
delete: await auth.user?.can(['dataset-editor-delete']),
publish: await auth.user?.can(['dataset-publish']),
},
});
}
@ -211,6 +213,70 @@ export default class DatasetsController {
}
}
public async publish({ request, inertia, response }) {
const id = request.param('id');
const dataset = await Dataset.query()
.where('id', id)
.preload('titles')
.preload('authors')
// .preload('persons', (builder) => {
// builder.wherePivot('role', 'author')
// })
.firstOrFail();
const validStates = ['reviewed'];
if (!validStates.includes(dataset.server_state)) {
// session.flash('errors', 'Invalid server state!');
return response
.flash(
'warning',
`Invalid server state. Dataset with id ${id} cannot be published. Datset has server state ${dataset.server_state}.`,
)
.redirect()
.back();
}
return inertia.render('Editor/Dataset/Publish', {
dataset,
});
}
public async publishUpdate({ request, response }) {
const publishDatasetSchema = schema.create({
publisher_name: schema.string({ trim: true }),
});
try {
await request.validate({ schema: publishDatasetSchema, messages: this.messages });
} catch (error) {
// return response.badRequest(error.messages);
throw error;
}
const id = request.param('id');
const dataset = await Dataset.findOrFail(id);
// let test = await Dataset.getMax('publish_id');
// const maxPublishId = await Database.from('documents').max('publish_id as max_publish_id').first();
// const max = maxPublishId.max_publish_id;
const max = await Dataset.getMax('publish_id');
let publish_id = 0;
if (max != null) {
publish_id = max + 1;
} else {
publish_id = publish_id + 1;
}
dataset.publish_id = publish_id;
dataset.server_state = 'published';
dataset.server_date_published = DateTime.now();
const publisherName = request.input('publisher_name', 'Tethys');
dataset.publisher_name = publisherName;
if (await dataset.save()) {
return response.toRoute('editor.dataset.list').flash('message', 'You have successfully published the dataset!');
}
}
public async create({}: HttpContextContract) {}
public async store({}: HttpContextContract) {}

View File

@ -0,0 +1,267 @@
import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext';
import User from 'App/Models/User';
import Dataset from 'App/Models/Dataset';
import type { ModelQueryBuilderContract } from '@ioc:Adonis/Lucid/Orm';
import Field from 'App/Library/Field';
import BaseModel from 'App/Models/BaseModel';
import { DateTime } from 'luxon';
import { schema, CustomMessages, rules } from '@ioc:Adonis/Core/Validator';
export default class DatasetsController {
public async index({ auth, request, inertia }: HttpContextContract) {
const user = (await User.find(auth.user?.id)) as User;
const page = request.input('page', 1);
let datasets: ModelQueryBuilderContract<typeof Dataset, Dataset> = Dataset.query();
// if (request.input('search')) {
// // users = users.whereRaw('name like %?%', [request.input('search')])
// const searchTerm = request.input('search');
// datasets.where('name', 'ilike', `%${searchTerm}%`);
// }
if (request.input('sort')) {
type SortOrder = 'asc' | 'desc' | undefined;
let attribute = request.input('sort');
let sortOrder: SortOrder = 'asc';
if (attribute.substr(0, 1) === '-') {
sortOrder = 'desc';
// attribute = substr(attribute, 1);
attribute = attribute.substr(1);
}
datasets.orderBy(attribute, sortOrder);
} else {
// users.orderBy('created_at', 'desc');
datasets.orderBy('id', 'asc');
}
// const users = await User.query().orderBy('login').paginate(page, limit);
const myDatasets = await datasets
.where('server_state', 'approved')
.where('reviewer_id', user.id)
.preload('titles')
.preload('user', (query) => query.select('id', 'login'))
.preload('editor', (query) => query.select('id', 'login'))
.paginate(page, 10);
return inertia.render('Reviewer/Dataset/Index', {
datasets: myDatasets.serialize(),
filters: request.all(),
can: {
review: await auth.user?.can(['dataset-review']),
reject: await auth.user?.can(['dataset-review-reject']),
},
});
}
public async review({ request, inertia, response }: HttpContextContract) {
const id = request.param('id');
const dataset = await Dataset.query()
.where('id', id)
// .preload('titles')
// .preload('descriptions')
.preload('user', (builder) => {
builder.select('id', 'login');
})
.firstOrFail();
const validStates = ['approved'];
if (!validStates.includes(dataset.server_state)) {
// session.flash('errors', 'Invalid server state!');
return response
.flash(
'warning',
`Invalid server state. Dataset with id ${id} cannot be reviewed. Datset has server state ${dataset.server_state}.`,
)
.redirect()
.toRoute('reviewer.dataset.list');
}
const fieldnames: Array<string> = await dataset.describe();
const fields = {};
for (const fieldName of fieldnames) {
const field: Field = dataset.getField(fieldName) as Field;
const modelClass = field.getValueModelClass();
let fieldValues = field.getValue();
let value = '';
if (fieldValues === null || fieldValues == undefined) {
continue;
}
if (modelClass === null) {
if (typeof fieldValues === 'number') {
// If the field values are a number, use them as is
value = fieldValues.toString();
} else {
// If the field values are not a number, use the replace() function to remove non-printable characters
value = fieldValues.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '\xEF\xBF\xBD ');
}
} else {
if (!Array.isArray(fieldValues)) {
fieldValues = [fieldValues];
}
for (const fieldValue of fieldValues) {
if (fieldValue === null) {
continue;
}
if (modelClass.prototype instanceof BaseModel) {
// this.mapModelAttributes(fieldValue, childNode);
value = '<ul>';
Object.keys(fieldValue).forEach((prop) => {
let modelValue = fieldValue[prop];
// console.log(`${prop}: ${value}`);
if (modelValue != null) {
if (modelValue instanceof DateTime) {
modelValue = modelValue.toFormat('yyyy-MM-dd HH:mm:ss').trim();
} else {
modelValue = modelValue.toString().trim();
}
// Replace invalid XML-1.0-Characters by UTF-8 replacement character.
modelValue = modelValue.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '\xEF\xBF\xBD ');
value = value + '<li>' + prop + ' : ' + modelValue + '</li>';
}
});
value = value + '</ul>';
} else if (modelClass instanceof DateTime) {
// console.log('Value is a luxon date');
// this.mapDateAttributes(fieldValue, childNode);
value = value + ' Year ' + modelClass.year.toString();
value = value + ' Month ' + modelClass.month.toString();
value = value + ' Day ' + modelClass.day.toString();
value = value + ' Hour ' + modelClass.hour.toString();
value = value + ' Minute ' + modelClass.minute.toString();
value = value + ' Second ' + modelClass.second.toString();
value = value + ' UnixTimestamp ' + modelClass.toUnixInteger().toString();
let zoneName = modelClass.zoneName ? modelClass.zoneName : '';
value = value + ' Timezone ' + zoneName;
}
}
}
if (value != '') {
fields[fieldName] = value;
}
}
return inertia.render('Reviewer/Dataset/Review', {
dataset,
fields: fields,
});
}
public async reviewUpdate({ request, response }) {
const id = request.param('id');
// const { id } = params;
const dataset = await Dataset.findOrFail(id);
const validStates = ['approved'];
if (!validStates.includes(dataset.server_state)) {
// throw new Error('Invalid server state!');
// return response.flash('warning', 'Invalid server state. Dataset cannot be released to editor').redirect().back();
return response
.flash(
'warning',
`Invalid server state. Dataset with id ${id} cannot be reviewed. Datset has server state ${dataset.server_state}.`,
)
.redirect()
.toRoute('reviewer.dataset.list');
}
dataset.server_state = 'reviewed';
try {
// await dataset.related('editor').associate(user); // speichert schon ab
await dataset.save();
return response.toRoute('reviewer.dataset.list').flash('message', `You have successfully reviewed dataset ${dataset.id}!`);
} catch (error) {
// Handle any errors
console.error(error);
return response.status(500).json({ error: 'An error occurred while reviewing the data.' });
}
}
public async reject({ request, inertia, response }: HttpContextContract) {
const id = request.param('id');
const dataset = await Dataset.query()
.where('id', id)
// .preload('titles')
// .preload('descriptions')
.preload('user', (builder) => {
builder.select('id', 'login');
})
.firstOrFail();
const validStates = ['approved'];
if (!validStates.includes(dataset.server_state)) {
// session.flash('errors', 'Invalid server state!');
return response
.flash(
'warning',
`Invalid server state. Dataset with id ${id} cannot be rejected. Datset has server state ${dataset.server_state}.`,
)
.redirect()
.toRoute('reviewer.dataset.list');
}
return inertia.render('Reviewer/Dataset/Reject', {
dataset,
});
}
public async rejectUpdate({ request, response }) {
const id = request.param('id');
const dataset = await Dataset.query()
.where('id', id)
.preload('editor', (builder) => {
builder.select('id', 'login');
})
.firstOrFail();
const newSchema = schema.create({
server_state: schema.string({ trim: true }),
reject_reviewer_note: schema.string({ trim: true }, [rules.minLength(10), rules.maxLength(500)]),
});
try {
await request.validate({ schema: newSchema });
} catch (error) {
// return response.badRequest(error.messages);
throw error;
}
const validStates = ['approved'];
if (!validStates.includes(dataset.server_state)) {
// throw new Error('Invalid server state!');
// return response.flash('warning', 'Invalid server state. Dataset cannot be released to editor').redirect().back();
return response
.flash(
'warning',
`Invalid server state. Dataset with id ${id} cannot be rejected. Datset has server state ${dataset.server_state}.`,
)
.redirect()
.toRoute('reviewer.dataset.list');
}
// dataset.server_state = 'reviewed';
dataset.server_state = 'rejected_reviewer';
const rejectReviewerNote = request.input('reject_reviewer_note', '');
dataset.reject_reviewer_note = rejectReviewerNote;
try {
// await dataset.related('editor').associate(user); // speichert schon ab
await dataset.save();
return response
.toRoute('reviewer.dataset.list')
.flash('message', `You have rejected dataset ${dataset.id}! to editor ${dataset.editor.login}`);
} catch (error) {
// Handle any errors
console.error(error);
return response.status(500).json({ error: 'An error occurred while reviewing the data.' });
}
}
}

View File

@ -55,7 +55,7 @@ export default class Dataset extends DatasetExtension {
@column({})
public language: string;
@column({})
@column({columnName: 'publish_id'})
public publish_id: number | null = null;
@column({})
@ -101,7 +101,8 @@ export default class Dataset extends DatasetExtension {
},
autoCreate: true,
autoUpdate: true,
columnName: 'server_date_modified' })
columnName: 'server_date_modified',
})
public server_date_modified: DateTime;
@manyToMany(() => Person, {
@ -250,4 +251,23 @@ export default class Dataset extends DatasetExtension {
return model || null;
}
static async getMax (column: string) {
let dataset = await this.query().max(column + ' as max_publish_id').firstOrFail();
return dataset.$extras.max_publish_id;
}
@computed({
serializeAs: 'remaining_time',
})
public get remainingTime() {
const dateFuture = this.server_date_modified.plus({ days: 14 });
if (this.server_state === 'approved') {
const now = DateTime.now();
let duration = dateFuture.diff(now, ['days', 'hours', 'months']).toObject();
return duration.days;
} else {
return 0;
}
}
}

View File

@ -159,7 +159,7 @@ export default abstract class DatasetExtension extends LucidBaseModel {
// // Initialize available date fields and set up date validator
// // if the particular field is present
let dateFields = new Array<string>('EmbargoDate', 'CreatedAt', 'ServerDatePublished', 'ServerDateDeleted');
let dateFields = new Array<string>('EmbargoDate', 'CreatedAt', 'ServerDateModified', 'ServerDatePublished', 'ServerDateDeleted');
dateFields.forEach((fieldname) => {
let dateField = this.getField(fieldname);
dateField instanceof Field && dateField.setValueModelClass(DateTime.now());

537
package-lock.json generated
View File

@ -811,9 +811,9 @@
}
},
"node_modules/@babel/core": {
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz",
"integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz",
"integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
@ -821,10 +821,10 @@
"@babel/generator": "^7.23.6",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helpers": "^7.23.6",
"@babel/helpers": "^7.23.7",
"@babel/parser": "^7.23.6",
"@babel/template": "^7.22.15",
"@babel/traverse": "^7.23.6",
"@babel/traverse": "^7.23.7",
"@babel/types": "^7.23.6",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
@ -914,9 +914,9 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz",
"integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz",
"integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
@ -1197,13 +1197,13 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz",
"integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz",
"integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==",
"dev": true,
"dependencies": {
"@babel/template": "^7.22.15",
"@babel/traverse": "^7.23.6",
"@babel/traverse": "^7.23.7",
"@babel/types": "^7.23.6"
},
"engines": {
@ -1268,9 +1268,9 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz",
"integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz",
"integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==",
"dev": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
@ -1301,16 +1301,13 @@
}
},
"node_modules/@babel/plugin-proposal-decorators": {
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.6.tgz",
"integrity": "sha512-D7Ccq9LfkBFnow3azZGJvZYgcfeqAw3I1e5LoTpj6UKIFQilh8yqXsIGcRIqbBdsPWIz+Ze7ZZfggSj62Qp+Fg==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz",
"integrity": "sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==",
"dev": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.23.6",
"@babel/helper-create-class-features-plugin": "^7.23.7",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-replace-supers": "^7.22.20",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/plugin-syntax-decorators": "^7.23.3"
},
"engines": {
@ -1628,9 +1625,9 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
"version": "7.23.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz",
"integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz",
"integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==",
"dev": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
@ -2247,16 +2244,16 @@
}
},
"node_modules/@babel/plugin-transform-runtime": {
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.6.tgz",
"integrity": "sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz",
"integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==",
"dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
"babel-plugin-polyfill-corejs2": "^0.4.6",
"babel-plugin-polyfill-corejs3": "^0.8.5",
"babel-plugin-polyfill-regenerator": "^0.5.3",
"babel-plugin-polyfill-corejs2": "^0.4.7",
"babel-plugin-polyfill-corejs3": "^0.8.7",
"babel-plugin-polyfill-regenerator": "^0.5.4",
"semver": "^6.3.1"
},
"engines": {
@ -2433,9 +2430,9 @@
}
},
"node_modules/@babel/preset-env": {
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz",
"integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz",
"integrity": "sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.23.5",
@ -2444,7 +2441,7 @@
"@babel/helper-validator-option": "^7.23.5",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3",
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
@ -2465,7 +2462,7 @@
"@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
"@babel/plugin-transform-arrow-functions": "^7.23.3",
"@babel/plugin-transform-async-generator-functions": "^7.23.4",
"@babel/plugin-transform-async-generator-functions": "^7.23.7",
"@babel/plugin-transform-async-to-generator": "^7.23.3",
"@babel/plugin-transform-block-scoped-functions": "^7.23.3",
"@babel/plugin-transform-block-scoping": "^7.23.4",
@ -2513,9 +2510,9 @@
"@babel/plugin-transform-unicode-regex": "^7.23.3",
"@babel/plugin-transform-unicode-sets-regex": "^7.23.3",
"@babel/preset-modules": "0.1.6-no-external-plugins",
"babel-plugin-polyfill-corejs2": "^0.4.6",
"babel-plugin-polyfill-corejs3": "^0.8.5",
"babel-plugin-polyfill-regenerator": "^0.5.3",
"babel-plugin-polyfill-corejs2": "^0.4.7",
"babel-plugin-polyfill-corejs3": "^0.8.7",
"babel-plugin-polyfill-regenerator": "^0.5.4",
"core-js-compat": "^3.31.0",
"semver": "^6.3.1"
},
@ -2575,9 +2572,9 @@
"dev": true
},
"node_modules/@babel/runtime": {
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz",
"integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz",
"integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.14.0"
@ -2601,9 +2598,9 @@
}
},
"node_modules/@babel/traverse": {
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz",
"integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
"integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.23.5",
@ -2874,11 +2871,11 @@
}
},
"node_modules/@inertiajs/core/node_modules/axios": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz",
"integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==",
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz",
"integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==",
"dependencies": {
"follow-redirects": "^1.15.0",
"follow-redirects": "^1.15.4",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
@ -4008,22 +4005,12 @@
"dev": true
},
"node_modules/@types/clamscan": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.0.7.tgz",
"integrity": "sha512-YopQF+D1pqbvMbvqTQx2MdxEqFbQAiPJKtjj/KnK9xxgmYkdt3dInkj/k6a+bztT4TexQ+tCUi/5D3LqDZIdhg==",
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.0.8.tgz",
"integrity": "sha512-HaOKUH+MKgGZAYakboOSHcHga1jGRgD4kpUUslceKtsOqDY16yCLHcURETSF7jOokJOR/Z0k2wk0RL+pN0cbUg==",
"dev": true,
"dependencies": {
"@types/node": "*",
"axios": "^0.24.0"
}
},
"node_modules/@types/clamscan/node_modules/axios": {
"version": "0.24.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
"integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
"dev": true,
"dependencies": {
"follow-redirects": "^1.14.4"
"@types/node": "*"
}
},
"node_modules/@types/connect": {
@ -4052,9 +4039,9 @@
"dev": true
},
"node_modules/@types/eslint": {
"version": "8.56.0",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.0.tgz",
"integrity": "sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz",
"integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==",
"dev": true,
"peer": true,
"dependencies": {
@ -4218,9 +4205,9 @@
}
},
"node_modules/@types/luxon": {
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz",
"integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ=="
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.8.tgz",
"integrity": "sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ=="
},
"node_modules/@types/md5": {
"version": "2.3.5",
@ -4240,17 +4227,17 @@
"dev": true
},
"node_modules/@types/node": {
"version": "20.10.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz",
"integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==",
"version": "20.10.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz",
"integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==",
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@types/node-forge": {
"version": "1.3.10",
"resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz",
"integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==",
"version": "1.3.11",
"resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
"integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
"dev": true,
"dependencies": {
"@types/node": "*"
@ -4689,36 +4676,36 @@
"dev": true
},
"node_modules/@vue/compiler-core": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.13.tgz",
"integrity": "sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.4.tgz",
"integrity": "sha512-U5AdCN+6skzh2bSJrkMj2KZsVkUpgK8/XlxjSRYQZhNPcvt9/kmgIMpFEiTyK+Dz5E1J+8o8//BEIX+bakgVSw==",
"dependencies": {
"@babel/parser": "^7.23.5",
"@vue/shared": "3.3.13",
"@babel/parser": "^7.23.6",
"@vue/shared": "3.4.4",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.0.2"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.13.tgz",
"integrity": "sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.4.tgz",
"integrity": "sha512-iSwkdDULCN+Vr8z6uwdlL044GJ/nUmECxP9vu7MzEs4Qma0FwDLYvnvRcyO0ZITuu3Os4FptGUDnhi1kOLSaGw==",
"dependencies": {
"@vue/compiler-core": "3.3.13",
"@vue/shared": "3.3.13"
"@vue/compiler-core": "3.4.4",
"@vue/shared": "3.4.4"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.13.tgz",
"integrity": "sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.4.tgz",
"integrity": "sha512-OTFcU6vUxUNHBcarzkp4g6d25nvcmDvFDzPRvSrIsByFFPRYN+y3b+j9HxYwt6nlWvGyFCe0roeJdJlfYxbCBg==",
"dependencies": {
"@babel/parser": "^7.23.5",
"@vue/compiler-core": "3.3.13",
"@vue/compiler-dom": "3.3.13",
"@vue/compiler-ssr": "3.3.13",
"@vue/reactivity-transform": "3.3.13",
"@vue/shared": "3.3.13",
"@babel/parser": "^7.23.6",
"@vue/compiler-core": "3.4.4",
"@vue/compiler-dom": "3.4.4",
"@vue/compiler-ssr": "3.4.4",
"@vue/shared": "3.4.4",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.5",
"postcss": "^8.4.32",
@ -4726,12 +4713,12 @@
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.13.tgz",
"integrity": "sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.4.tgz",
"integrity": "sha512-1DU9DflSSQlx/M61GEBN+NbT/anUki2ooDo9IXfTckCeKA/2IKNhY8KbG3x6zkd3KGrxzteC7de6QL88vEb41Q==",
"dependencies": {
"@vue/compiler-dom": "3.3.13",
"@vue/shared": "3.3.13"
"@vue/compiler-dom": "3.4.4",
"@vue/shared": "3.4.4"
}
},
"node_modules/@vue/devtools-api": {
@ -4741,41 +4728,29 @@
"dev": true
},
"node_modules/@vue/reactivity": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.13.tgz",
"integrity": "sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.4.tgz",
"integrity": "sha512-DFsuJBf6sfhd5SYzJmcBTUG9+EKqjF31Gsk1NJtnpJm9liSZ806XwGJUeNBVQIanax7ODV7Lmk/k17BgxXNuTg==",
"dependencies": {
"@vue/shared": "3.3.13"
}
},
"node_modules/@vue/reactivity-transform": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.13.tgz",
"integrity": "sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==",
"dependencies": {
"@babel/parser": "^7.23.5",
"@vue/compiler-core": "3.3.13",
"@vue/shared": "3.3.13",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.5"
"@vue/shared": "3.4.4"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.13.tgz",
"integrity": "sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.4.tgz",
"integrity": "sha512-zWWwNQAj5JdxrmOA1xegJm+c4VtyIbDEKgQjSb4va5v7gGTCh0ZjvLI+htGFdVXaO9bs2J3C81p5p+6jrPK8Bw==",
"dependencies": {
"@vue/reactivity": "3.3.13",
"@vue/shared": "3.3.13"
"@vue/reactivity": "3.4.4",
"@vue/shared": "3.4.4"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.13.tgz",
"integrity": "sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.4.tgz",
"integrity": "sha512-Nlh2ap1J/eJQ6R0g+AIRyGNwpTJQACN0dk8I8FRLH8Ev11DSvfcPOpn4+Kbg5xAMcuq0cHB8zFYxVrOgETrrvg==",
"dependencies": {
"@vue/runtime-core": "3.3.13",
"@vue/shared": "3.3.13",
"@vue/runtime-core": "3.4.4",
"@vue/shared": "3.4.4",
"csstype": "^3.1.3"
}
},
@ -4785,21 +4760,21 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"node_modules/@vue/server-renderer": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.13.tgz",
"integrity": "sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.4.tgz",
"integrity": "sha512-+AjoiKcC41k7SMJBYkDO9xs79/Of8DiThS9mH5l2MK+EY0to3psI0k+sElvVqQvsoZTjHMEuMz0AEgvm2T+CwA==",
"dependencies": {
"@vue/compiler-ssr": "3.3.13",
"@vue/shared": "3.3.13"
"@vue/compiler-ssr": "3.4.4",
"@vue/shared": "3.4.4"
},
"peerDependencies": {
"vue": "3.3.13"
"vue": "3.4.4"
}
},
"node_modules/@vue/shared": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.13.tgz",
"integrity": "sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA=="
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.4.tgz",
"integrity": "sha512-abSgiVRhfjfl3JALR/cSuBl74hGJ3SePgf1mKzodf1eMWLwHZbfEGxT2cNJSsNiw44jEgrO7bNkhchaWA7RwNw=="
},
"node_modules/@vue/tsconfig": {
"version": "0.4.0",
@ -5058,9 +5033,9 @@
}
},
"node_modules/acorn": {
"version": "8.11.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
"version": "8.11.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"bin": {
"acorn": "bin/acorn"
},
@ -5525,9 +5500,9 @@
}
},
"node_modules/array-flatten": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
"integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"dev": true
},
"node_modules/array-union": {
@ -6156,13 +6131,11 @@
}
},
"node_modules/bonjour-service": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz",
"integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.0.tgz",
"integrity": "sha512-xdzMA6JGckxyJzZByjEWRcfKmDxXaGXZWVftah3FkCqdlePNS9DjHSUN5zkP4oEfz/t0EXXlro88EIhzwMB4zA==",
"dev": true,
"dependencies": {
"array-flatten": "^2.1.2",
"dns-equal": "^1.0.0",
"fast-deep-equal": "^3.1.3",
"multicast-dns": "^7.2.5"
}
@ -6399,9 +6372,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001572",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz",
"integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==",
"version": "1.0.30001574",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz",
"integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==",
"dev": true,
"funding": [
{
@ -7025,9 +6998,9 @@
}
},
"node_modules/core-js-compat": {
"version": "3.34.0",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz",
"integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==",
"version": "3.35.0",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz",
"integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==",
"dev": true,
"dependencies": {
"browserslist": "^4.22.2"
@ -7378,12 +7351,12 @@
}
},
"node_modules/cssnano": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.2.tgz",
"integrity": "sha512-Tu9wv8UdN6CoiQnIVkCNvi+0rw/BwFWOJBlg2bVfEyKaadSuE3Gq/DD8tniVvggTJGwK88UjqZp7zL5sv6t1aA==",
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.3.tgz",
"integrity": "sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw==",
"dev": true,
"dependencies": {
"cssnano-preset-default": "^6.0.2",
"cssnano-preset-default": "^6.0.3",
"lilconfig": "^3.0.0"
},
"engines": {
@ -7398,40 +7371,40 @@
}
},
"node_modules/cssnano-preset-default": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.2.tgz",
"integrity": "sha512-VnZybFeZ63AiVqIUNlxqMxpj9VU8B5j0oKgP7WyVt/7mkyf97KsYkNzsPTV/RVmy54Pg7cBhOK4WATbdCB44gw==",
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.3.tgz",
"integrity": "sha512-4y3H370aZCkT9Ev8P4SO4bZbt+AExeKhh8wTbms/X7OLDo5E7AYUUy6YPxa/uF5Grf+AJwNcCnxKhZynJ6luBA==",
"dev": true,
"dependencies": {
"css-declaration-sorter": "^7.0.0",
"css-declaration-sorter": "^7.1.1",
"cssnano-utils": "^4.0.1",
"postcss-calc": "^9.0.1",
"postcss-colormin": "^6.0.1",
"postcss-convert-values": "^6.0.1",
"postcss-colormin": "^6.0.2",
"postcss-convert-values": "^6.0.2",
"postcss-discard-comments": "^6.0.1",
"postcss-discard-duplicates": "^6.0.1",
"postcss-discard-empty": "^6.0.1",
"postcss-discard-overridden": "^6.0.1",
"postcss-merge-longhand": "^6.0.1",
"postcss-merge-rules": "^6.0.2",
"postcss-merge-longhand": "^6.0.2",
"postcss-merge-rules": "^6.0.3",
"postcss-minify-font-values": "^6.0.1",
"postcss-minify-gradients": "^6.0.1",
"postcss-minify-params": "^6.0.1",
"postcss-minify-selectors": "^6.0.1",
"postcss-minify-params": "^6.0.2",
"postcss-minify-selectors": "^6.0.2",
"postcss-normalize-charset": "^6.0.1",
"postcss-normalize-display-values": "^6.0.1",
"postcss-normalize-positions": "^6.0.1",
"postcss-normalize-repeat-style": "^6.0.1",
"postcss-normalize-string": "^6.0.1",
"postcss-normalize-timing-functions": "^6.0.1",
"postcss-normalize-unicode": "^6.0.1",
"postcss-normalize-unicode": "^6.0.2",
"postcss-normalize-url": "^6.0.1",
"postcss-normalize-whitespace": "^6.0.1",
"postcss-ordered-values": "^6.0.1",
"postcss-reduce-initial": "^6.0.1",
"postcss-reduce-initial": "^6.0.2",
"postcss-reduce-transforms": "^6.0.1",
"postcss-svgo": "^6.0.1",
"postcss-unique-selectors": "^6.0.1"
"postcss-svgo": "^6.0.2",
"postcss-unique-selectors": "^6.0.2"
},
"engines": {
"node": "^14 || ^16 || >=18.0"
@ -7842,12 +7815,6 @@
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true
},
"node_modules/dns-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
"integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
"dev": true
},
"node_modules/dns-packet": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
@ -7895,6 +7862,15 @@
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/dom-serializer/node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true,
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
@ -8135,9 +8111,9 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"node_modules/electron-to-chromium": {
"version": "1.4.616",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz",
"integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==",
"version": "1.4.620",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.620.tgz",
"integrity": "sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==",
"dev": true
},
"node_modules/emittery": {
@ -8213,10 +8189,12 @@
}
},
"node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true,
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
@ -8810,12 +8788,6 @@
"node": ">= 0.10.0"
}
},
"node_modules/express/node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"dev": true
},
"node_modules/express/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@ -9192,9 +9164,9 @@
}
},
"node_modules/follow-redirects": {
"version": "1.15.3",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
"integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
"version": "1.15.4",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
"integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
"funding": [
{
"type": "individual",
@ -10083,6 +10055,15 @@
"entities": "^2.0.0"
}
},
"node_modules/htmlparser2/node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true,
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
@ -13420,12 +13401,12 @@
}
},
"node_modules/postcss-colormin": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.1.tgz",
"integrity": "sha512-Tb9aR2wCJCzKuNjIeMzVNd0nXjQy25HDgFmmaRsHnP0eP/k8uQWE4S8voX5S2coO5CeKrp+USFs1Ayv9Tpxx6w==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.2.tgz",
"integrity": "sha512-TXKOxs9LWcdYo5cgmcSHPkyrLAh86hX1ijmyy6J8SbOhyv6ua053M3ZAM/0j44UsnQNIWdl8gb5L7xX2htKeLw==",
"dev": true,
"dependencies": {
"browserslist": "^4.21.4",
"browserslist": "^4.22.2",
"caniuse-api": "^3.0.0",
"colord": "^2.9.1",
"postcss-value-parser": "^4.2.0"
@ -13438,12 +13419,12 @@
}
},
"node_modules/postcss-convert-values": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.1.tgz",
"integrity": "sha512-zTd4Vh0HxGkhg5aHtfCogcRHzGkvblfdWlQ53lIh1cJhYcGyIxh2hgtKoVh40AMktRERet+JKdB04nNG19kjmA==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.2.tgz",
"integrity": "sha512-aeBmaTnGQ+NUSVQT8aY0sKyAD/BaLJenEKZ03YK0JnDE1w1Rr8XShoxdal2V2H26xTJKr3v5haByOhJuyT4UYw==",
"dev": true,
"dependencies": {
"browserslist": "^4.21.4",
"browserslist": "^4.22.2",
"postcss-value-parser": "^4.2.0"
},
"engines": {
@ -13595,13 +13576,13 @@
}
},
"node_modules/postcss-merge-longhand": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.1.tgz",
"integrity": "sha512-vmr/HZQzaPXc45FRvSctqFTF05UaDnTn5ABX+UtQPJznDWT/QaFbVc/pJ5C2YPxx2J2XcfmWowlKwtCDwiQ5hA==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.2.tgz",
"integrity": "sha512-+yfVB7gEM8SrCo9w2lCApKIEzrTKl5yS1F4yGhV3kSim6JzbfLGJyhR1B6X+6vOT0U33Mgx7iv4X9MVWuaSAfw==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0",
"stylehacks": "^6.0.1"
"stylehacks": "^6.0.2"
},
"engines": {
"node": "^14 || ^16 || >=18.0"
@ -13611,15 +13592,15 @@
}
},
"node_modules/postcss-merge-rules": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.2.tgz",
"integrity": "sha512-6lm8bl0UfriSfxI+F/cezrebqqP8w702UC6SjZlUlBYwuRVNbmgcJuQU7yePIvD4MNT53r/acQCUAyulrpgmeQ==",
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.3.tgz",
"integrity": "sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA==",
"dev": true,
"dependencies": {
"browserslist": "^4.21.4",
"browserslist": "^4.22.2",
"caniuse-api": "^3.0.0",
"cssnano-utils": "^4.0.1",
"postcss-selector-parser": "^6.0.5"
"postcss-selector-parser": "^6.0.15"
},
"engines": {
"node": "^14 || ^16 || >=18.0"
@ -13661,12 +13642,12 @@
}
},
"node_modules/postcss-minify-params": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.1.tgz",
"integrity": "sha512-eFvGWArqh4khPIgPDu6SZNcaLctx97nO7c59OXnRtGntAp5/VS4gjMhhW9qUFsK6mQ27pEZGt2kR+mPizI+Z9g==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.2.tgz",
"integrity": "sha512-zwQtbrPEBDj+ApELZ6QylLf2/c5zmASoOuA4DzolyVGdV38iR2I5QRMsZcHkcdkZzxpN8RS4cN7LPskOkTwTZw==",
"dev": true,
"dependencies": {
"browserslist": "^4.21.4",
"browserslist": "^4.22.2",
"cssnano-utils": "^4.0.1",
"postcss-value-parser": "^4.2.0"
},
@ -13678,12 +13659,12 @@
}
},
"node_modules/postcss-minify-selectors": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.1.tgz",
"integrity": "sha512-mfReq5wrS6vkunxvJp6GDuOk+Ak6JV7134gp8L+ANRnV9VwqzTvBtX6lpohooVU750AR0D3pVx2Zn6uCCwOAfQ==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.2.tgz",
"integrity": "sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.5"
"postcss-selector-parser": "^6.0.15"
},
"engines": {
"node": "^14 || ^16 || >=18.0"
@ -13858,12 +13839,12 @@
}
},
"node_modules/postcss-normalize-unicode": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.1.tgz",
"integrity": "sha512-ok9DsI94nEF79MkvmLfHfn8ddnKXA7w+8YuUoz5m7b6TOdoaRCpvu/QMHXQs9+DwUbvp+ytzz04J55CPy77PuQ==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.2.tgz",
"integrity": "sha512-Ff2VdAYCTGyMUwpevTZPZ4w0+mPjbZzLLyoLh/RMpqUqeQKZ+xMm31hkxBavDcGKcxm6ACzGk0nBfZ8LZkStKA==",
"dev": true,
"dependencies": {
"browserslist": "^4.21.4",
"browserslist": "^4.22.2",
"postcss-value-parser": "^4.2.0"
},
"engines": {
@ -13920,12 +13901,12 @@
}
},
"node_modules/postcss-reduce-initial": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.1.tgz",
"integrity": "sha512-cgzsI2ThG1PMSdSyM9A+bVxiiVgPIVz9f5c6H+TqEv0CA89iCOO81mwLWRWLgOKFtQkKob9nNpnkxG/1RlgFcA==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.2.tgz",
"integrity": "sha512-YGKalhNlCLcjcLvjU5nF8FyeCTkCO5UtvJEt0hrPZVCTtRLSOH4z00T1UntQPj4dUmIYZgMj8qK77JbSX95hSw==",
"dev": true,
"dependencies": {
"browserslist": "^4.21.4",
"browserslist": "^4.22.2",
"caniuse-api": "^3.0.0"
},
"engines": {
@ -13951,9 +13932,9 @@
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.14",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.14.tgz",
"integrity": "sha512-65xXYsT40i9GyWzlHQ5ShZoK7JZdySeOozi/tz2EezDo6c04q6+ckYMeoY7idaie1qp2dT5KoYQ2yky6JuoHnA==",
"version": "6.0.15",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
"integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
@ -13964,13 +13945,13 @@
}
},
"node_modules/postcss-svgo": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.1.tgz",
"integrity": "sha512-eWV4Rrqa06LzTgqirOv5Ln6WTGyU7Pbeqj9WEyKo9tpnWixNATVJMeaEcOHOW1ZYyjcG8wSJwX/28DvU3oy3HA==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.2.tgz",
"integrity": "sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ==",
"dev": true,
"dependencies": {
"postcss-value-parser": "^4.2.0",
"svgo": "^3.0.5"
"svgo": "^3.2.0"
},
"engines": {
"node": "^14 || ^16 || >= 18"
@ -13980,12 +13961,12 @@
}
},
"node_modules/postcss-unique-selectors": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.1.tgz",
"integrity": "sha512-/KCCEpNNR7oXVJ38/Id7GC9Nt0zxO1T3zVbhVaq6F6LSG+3gU3B7+QuTHfD0v8NPEHlzewAout29S0InmB78EQ==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.2.tgz",
"integrity": "sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.5"
"postcss-selector-parser": "^6.0.15"
},
"engines": {
"node": "^14 || ^16 || >=18.0"
@ -14501,9 +14482,9 @@
}
},
"node_modules/regex-parser": {
"version": "2.2.11",
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
"integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz",
"integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==",
"dev": true
},
"node_modules/regexpu-core": {
@ -14808,11 +14789,11 @@
}
},
"node_modules/saxon-js/node_modules/axios": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz",
"integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==",
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz",
"integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==",
"dependencies": {
"follow-redirects": "^1.15.0",
"follow-redirects": "^1.15.4",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
@ -15787,13 +15768,13 @@
}
},
"node_modules/stylehacks": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.1.tgz",
"integrity": "sha512-jTqG2aIoX2fYg0YsGvqE4ooE/e75WmaEjnNiP6Ag7irLtHxML8NJRxRxS0HyDpde8DRGuEXTFVHVfR5Tmbxqzg==",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.2.tgz",
"integrity": "sha512-00zvJGnCu64EpMjX8b5iCZ3us2Ptyw8+toEkb92VdmkEaRaSGBNKAoK6aWZckhXxmQP8zWiTaFaiMGIU8Ve8sg==",
"dev": true,
"dependencies": {
"browserslist": "^4.21.4",
"postcss-selector-parser": "^6.0.4"
"browserslist": "^4.22.2",
"postcss-selector-parser": "^6.0.15"
},
"engines": {
"node": "^14 || ^16 || >=18.0"
@ -15983,17 +15964,17 @@
}
},
"node_modules/svgo": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.1.0.tgz",
"integrity": "sha512-R5SnNA89w1dYgNv570591F66v34b3eQShpIBcQtZtM5trJwm1VvxbIoMpRYY3ybTAutcKTLEmTsdnaknOHbiQA==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz",
"integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==",
"dev": true,
"dependencies": {
"@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^5.1.0",
"css-tree": "^2.2.1",
"css-tree": "^2.3.1",
"css-what": "^6.1.0",
"csso": "5.0.5",
"csso": "^5.0.5",
"picocolors": "^1.0.0"
},
"bin": {
@ -16075,18 +16056,6 @@
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/svgo/node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"dev": true,
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/swagger-parser": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz",
@ -16261,16 +16230,16 @@
}
},
"node_modules/terser-webpack-plugin": {
"version": "5.3.9",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
"integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
"version": "5.3.10",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
"integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.17",
"@jridgewell/trace-mapping": "^0.3.20",
"jest-worker": "^27.4.5",
"schema-utils": "^3.1.1",
"serialize-javascript": "^6.0.1",
"terser": "^5.16.8"
"terser": "^5.26.0"
},
"engines": {
"node": ">= 10.13.0"
@ -17028,15 +16997,15 @@
}
},
"node_modules/vue": {
"version": "3.3.13",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.3.13.tgz",
"integrity": "sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==",
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.4.4.tgz",
"integrity": "sha512-suZXgDVT8lRNhKmxdkwOsR0oyUi8is7mtqI18qW97JLoyorEbE9B2Sb4Ws/mR/+0AgA/JUtsv1ytlRSH3/pDIA==",
"dependencies": {
"@vue/compiler-dom": "3.3.13",
"@vue/compiler-sfc": "3.3.13",
"@vue/runtime-dom": "3.3.13",
"@vue/server-renderer": "3.3.13",
"@vue/shared": "3.3.13"
"@vue/compiler-dom": "3.4.4",
"@vue/compiler-sfc": "3.4.4",
"@vue/runtime-dom": "3.4.4",
"@vue/server-renderer": "3.4.4",
"@vue/shared": "3.4.4"
},
"peerDependencies": {
"typescript": "*"
@ -17057,9 +17026,9 @@
}
},
"node_modules/vue-loader": {
"version": "17.4.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.0.tgz",
"integrity": "sha512-tq81JlBNWYvoYAh5PRZXg5bE7BEv0Id6W7BF5otj18MtHgu5OqiK9rQu0z73r+VGlIq0lLDoEeC7RWYynUpXlQ==",
"version": "17.4.2",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.2.tgz",
"integrity": "sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0",
@ -17706,12 +17675,12 @@
}
},
"node_modules/xslt3/node_modules/axios": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz",
"integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==",
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz",
"integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==",
"dev": true,
"dependencies": {
"follow-redirects": "^1.15.0",
"follow-redirects": "^1.15.4",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}

View File

@ -1,51 +1,50 @@
table {
@apply w-full;
}
}
thead {
thead {
@apply hidden lg:table-header-group;
}
}
tr {
tr {
@apply max-w-full block relative border-b-4 border-gray-100
lg:table-row lg:border-b-0 dark:border-slate-800;
}
}
tr:last-child {
tr:last-child {
@apply border-b-0;
}
}
td:not(:first-child) {
td:not(:first-child) {
@apply lg:border-0 lg:border-t-0 lg:border-r-0 lg:border-b-0 lg:border-gray-100 lg:dark:border-slate-700;
}
}
th {
th {
@apply lg:text-left lg:p-3;
}
}
td {
td {
@apply flex justify-between text-right py-3 px-4 align-top border-b border-gray-100
lg:table-cell lg:text-left lg:p-3 lg:align-middle lg:border-b-0 dark:border-slate-800;
}
}
td:last-child {
td:last-child {
@apply border-b-0;
}
}
/* tbody tr, tbody tr:nth-child(odd) {
/* tbody tr, tbody tr:nth-child(odd) {
@apply lg:hover:bg-gray-100 lg:dark:hover:bg-slate-700/70;
} */
tbody tr:nth-child(odd) {
.pure-table tbody tr:nth-child(odd) {
@apply lg:bg-gray-50 lg:dark:bg-slate-800;
}
}
tbody tr:nth-child(even) {
.pure-table tbody tr:nth-child(even) {
@apply lg:bg-gray-50 lg:dark:bg-slate-600 lg:bg-opacity-25;
}
}
td:before {
td:before {
content: attr(data-label);
@apply font-semibold pr-3 text-left lg:hidden;
}
}

View File

@ -272,17 +272,13 @@ const handleDrawEventCreated = async (event) => {
<template>
<SectionMain>
<!-- <div class="dark:bg-slate-900 bg-white"> -->
<div id="map" class="map-container mt-6 mb-6 rounded-2xl py-12 px-6 text-center dark:bg-slate-900 bg-white">
<ZoomControlComponent ref="zoomControl" :mapId="mapId"></ZoomControlComponent>
<DrawControlComponent ref="drawControl" :preserve="false" :mapId="mapId" :southWest="southWest"
:northEast="northEast">
</DrawControlComponent>
</div>
<!-- </div> -->
</SectionMain>
<!-- </section> -->
</template>

View File

@ -20,7 +20,7 @@ import {
mdiCloud,
mdiCrop,
mdiAccountCog,
mdiFormatListGroup ,
mdiFormatListGroup,
mdiFormatListNumbered,
// mdiEmail,
mdiLogout,
@ -29,6 +29,7 @@ import {
mdiViewDashboard,
mdiMapSearch,
mdiInformationVariant,
mdiGlasses,
} from '@mdi/js';
import NavBarItem from '@/Components/NavBarItem.vue';
import NavBarItemLabel from '@/Components/NavBarItemLabel.vue';
@ -100,10 +101,9 @@ const showAbout = async () => {
</script>
<template>
<nav class="text-base top-0 left-0 right-0 fixed bg-gray-50 h-14 z-40 w-screen transition-position lg:w-auto dark:bg-slate-800"
:class="{ 'xl:pl-60': props.showBurger == true }">
<FirstrunWizard ref="about"></FirstrunWizard>
<FirstrunWizard ref="about"></FirstrunWizard>
<div class="flex lg:items-stretch" :class="containerMaxW">
<div class="flex-1 items-stretch flex h-14">
<NavBarItem type="flex lg:hidden" @click.prevent="layoutStore.asideMobileToggle()" v-if="props.showBurger">
@ -113,7 +113,8 @@ const showAbout = async () => {
<BaseIcon :path="mdiMenu" size="24" />
</NavBarItem>
<NavBarItem route-name="apps.dashboard">
<NavBarItemLabel :icon="mdiViewDashboard" label="Dashboard" size="22" is-hover-label-only route-name="apps.dashboard" />
<NavBarItemLabel :icon="mdiViewDashboard" label="Dashboard" size="22" is-hover-label-only
route-name="apps.dashboard" />
</NavBarItem>
<NavBarItem route-name="apps.map">
<NavBarItemLabel :icon="mdiMapSearch" label="Map" size="22" is-hover-label-only route-name="apps.map" />
@ -167,10 +168,13 @@ const showAbout = async () => {
<NavBarItemLabel :icon="mdiFormatListGroup" label="Administration" />
</NavBarItem>
<NavBarItem v-if="userHasRoles(['submitter'])" :route-name="'dataset.list'">
<NavBarItemLabel :icon="mdiFormatListNumbered" label="Submitter Setup" />
<NavBarItemLabel :icon="mdiFormatListNumbered" label="Submitter Menu" />
</NavBarItem>
<NavBarItem v-if="userHasRoles(['editor'])" :route-name="'editor.dataset.list'">
<NavBarItemLabel :icon="mdiFormatListNumbered" label="Editor Setup" />
<NavBarItemLabel :icon="mdiFormatListNumbered" label="Editor Menu" />
</NavBarItem>
<NavBarItem v-if="userHasRoles(['reviewer'])" :route-name="'reviewer.dataset.list'">
<NavBarItemLabel :icon="mdiGlasses" label="Reviewer Menu" />
</NavBarItem>
<!-- <NavBarItem>
<NavBarItemLabel :icon="mdiEmail" label="Messages" />

View File

@ -2,7 +2,7 @@
// import { Head, Link, useForm, usePage } from '@inertiajs/inertia-vue3';
import { Head, usePage } from '@inertiajs/vue3';
import { ComputedRef } from 'vue';
import { mdiSquareEditOutline, mdiAlertBoxOutline, mdiShareVariant } from '@mdi/js';
import { mdiSquareEditOutline, mdiAlertBoxOutline, mdiShareVariant, mdiBookEdit } from '@mdi/js';
import { computed } from 'vue';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
@ -42,16 +42,16 @@ const flash: ComputedRef<any> = computed(() => {
const getRowClass = (dataset) => {
// (props.options ? 'select' : props.type)
let rowclass = '';
if (dataset.server_state == 'editor_accepted') {
rowclass = 'editor_accepted';
if (dataset.server_state == 'accepted') {
rowclass = 'bg-accepted';
} else if (dataset.server_state == 'rejected_reviewer') {
rowclass = 'rejected_reviewer';
rowclass = 'bg-rejected-reviewer';
} else if (dataset.server_state == 'reviewed') {
rowclass = 'reviewed';
rowclass = 'bg-reviewed';
} else if (dataset.server_state == 'released') {
rowclass = 'released';
rowclass = 'bg-released';
} else if (dataset.server_state == 'published') {
rowclass = 'released';
rowclass = 'bg-published';
} else {
rowclass = '';
}
@ -77,7 +77,7 @@ const getRowClass = (dataset) => {
<!-- table -->
<CardBox class="mb-6" has-table>
<div v-if="props.datasets.data.length > 0">
<table class="pure-table">
<table>
<thead>
<tr>
<th scope="col" class="py-3 text-left text-xs font-medium uppercase tracking-wider">
@ -152,6 +152,12 @@ const getRowClass = (dataset) => {
v-if="can.approve && (dataset.server_state == 'editor_accepted' || dataset.server_state == 'rejected_reviewer')"
:route-name="stardust.route('editor.dataset.approve', [dataset.id])"
color="info" :icon="mdiShareVariant" :label="'Approve'" small />
<BaseButton
v-if="can.publish && (dataset.server_state == 'reviewed')"
:route-name="stardust.route('editor.dataset.publish', [dataset.id])"
color="info" :icon="mdiBookEdit" :label="'Publish'" small />
</BaseButtons>
</td>
</tr>
@ -179,27 +185,3 @@ const getRowClass = (dataset) => {
</SectionMain>
</LayoutAuthenticated>
</template>
<style scoped>
.pure-table tr.released {
/* background-color: greenyellow; */
background-color: rgb(52 211 153);
color: gray;
}
.pure-table tr.editor_accepted {
/* background-color: lightblue; */
background-color: rgb(125 211 252);
color: gray;
}
.pure-table tr.rejected_reviewer {
background-color: orange;
color: gray;
}
.pure-table tr.reviewed {
background-color: yellow;
color: gray;
}
</style>

View File

@ -0,0 +1,102 @@
<script setup lang="ts">
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
import { useForm, Head, usePage } from '@inertiajs/vue3';
import { computed, Ref } from 'vue';
import CardBox from '@/Components/CardBox.vue';
import FormField from '@/Components/FormField.vue';
import FormControl from '@/Components/FormControl.vue';
import BaseButton from '@/Components/BaseButton.vue';
import BaseButtons from '@/Components/BaseButtons.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
import { mdiArrowLeftBoldOutline, mdiReiterate } from '@mdi/js';
import FormValidationErrors from '@/Components/FormValidationErrors.vue';
const props = defineProps({
dataset: {
type: Object,
default: () => ({}),
},
});
const flash: Ref<any> = computed(() => {
return usePage().props.flash;
});
const errors: Ref<any> = computed(() => {
return usePage().props.errors;
});
const form = useForm({
server_state: 'published',
publisher_name: 'GeoSphere Austria',
});
const handleSubmit = async (e) => {
e.preventDefault();
await form.put(stardust.route('editor.dataset.publishUpdate', [props.dataset.id]));
// await form.put(stardust.route('editor.dataset.update', [props.dataset.id]));
};
</script>
<template>
<LayoutAuthenticated>
<Head title="Publish reviewed dataset" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiReiterate" title="Publish reviewed dataset" main>
<BaseButton :route-name="stardust.route('editor.dataset.list')" :icon="mdiArrowLeftBoldOutline" label="Back"
color="white" rounded-full small />
</SectionTitleLineWithButton>
<CardBox form @submit.prevent="handleSubmit">
<FormValidationErrors v-bind:errors="errors" />
<div class="title font-bold">
Title: {{ dataset.main_title }}
</div>
<!-- <div class="authors">
<span v-for="person in dataset.authors" :key="person.id">
{{ person.name }}
</span>
</div> -->
<FormField label="server state" :class="{ 'text-red-400': form.errors.server_state }">
<FormControl v-model="form.server_state" type="text" placeholder="-- server state --"
:is-read-only="true" :error="form.errors.server_state">
<div class="text-red-400 text-sm" v-if="form.errors.server_state">
{{ form.errors.server_state }}
</div>
</FormControl>
</FormField>
<FormField label="Publisher Name" :class="{ 'text-red-400': form.errors.publisher_name }">
<FormControl v-model="form.publisher_name" placeholder="--publisher name --"
:error="form.errors.publisher_name" is-read-only>
<div class="text-red-400 text-sm" v-if="form.errors.publisher_name">
{{ form.errors.publisher_name }}
</div>
</FormControl>
</FormField>
<div v-if="flash && flash.warning" class="flex flex-col mt-6 animate-fade-in">
<div class="bg-yellow-500 border-l-4 border-orange-400 text-white p-4" role="alert">
<p class="font-bold">Be Warned</p>
<p>{{ flash.warning }}</p>
</div>
</div>
<template #footer>
<p class="text-lg font-medium mb-2">
Are you sure you want to publish the selected dataset?
</p>
<BaseButtons>
<BaseButton type="submit" color="info" label="Set published"
:class="{ 'opacity-25': form.processing }" :disabled="form.processing" />
</BaseButtons>
</template>
</CardBox>
</SectionMain>
</LayoutAuthenticated>
</template>

View File

@ -0,0 +1,171 @@
<script setup lang="ts">
// import { Head, Link, useForm, usePage } from '@inertiajs/inertia-vue3';
import { Head, usePage } from '@inertiajs/vue3';
import { ComputedRef } from 'vue';
import { mdiAlertBoxOutline, mdiGlasses, mdiReiterate } from '@mdi/js';
import { computed } from 'vue';
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
import BaseButton from '@/Components/BaseButton.vue';
import CardBox from '@/Components/CardBox.vue';
import BaseButtons from '@/Components/BaseButtons.vue';
import NotificationBar from '@/Components/NotificationBar.vue';
import Pagination from '@/Components/Admin/Pagination.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
const props = defineProps({
datasets: {
type: Object,
default: () => ({}),
},
filters: {
type: Object,
default: () => ({}),
},
can: {
type: Object,
default: () => ({}),
},
// user: {
// type: Object,
// default: () => ({}),
// }
});
const flash: ComputedRef<any> = computed(() => {
// let test = usePage();
// console.log(test);
return usePage().props.flash;
});
const getRowClass = (dataset) => {
// (props.options ? 'select' : props.type)
let rowclass = '';
if (dataset.server_state == 'approved') {
rowclass = 'bg-approved';
} else if (dataset.server_state == 'rejected_reviewer') {
rowclass = 'bg-rejected-reviewer';
} else if (dataset.server_state == 'reviewed') {
rowclass = 'bg-reviewed';
} else if (dataset.server_state == 'released') {
rowclass = 'bg-released';
} else if (dataset.server_state == 'published') {
rowclass = 'bg-published';
} else {
rowclass = '';
}
return rowclass;
};
</script>
<template>
<LayoutAuthenticated>
<Head title="Dataset List" />
<SectionMain>
<!-- <FormValidationErrors v-bind:errors="errors" /> -->
<NotificationBar v-if="flash.message" color="success" :icon="mdiAlertBoxOutline">
{{ flash.message }}
</NotificationBar>
<NotificationBar v-if="flash.warning" color="warning" :icon="mdiAlertBoxOutline">
{{ flash.warning }}
</NotificationBar>
<!-- table -->
<CardBox class="mb-6" has-table>
<div v-if="props.datasets.data.length > 0">
<table>
<thead>
<tr>
<th scope="col" class="py-3 text-left text-xs font-medium uppercase tracking-wider">
<!-- <Sort label="Dataset Title" attribute="title" :search="form.search" /> -->
Title
</th>
<th scope="col" class="py-3 text-left text-xs font-medium uppercase tracking-wider">
ID
</th>
<th scope="col" class="py-3 text-left text-xs font-medium uppercase tracking-wider">
<!-- <Sort label="Email" attribute="email" :search="form.search" /> -->
State
</th>
<th scope="col" class="py-3 text-left text-xs font-medium uppercase tracking-wider">
Editor
</th>
<th scope="col" class="py-3 text-left text-xs font-medium uppercase tracking-wider">
Remaining Time
</th>
<th scope="col" class="relative px-6 py-3" v-if="can.edit || can.delete">
<span class="sr-only">Actions</span>
</th>
</tr>
</thead>
<tbody>
<tr v-for="dataset in props.datasets.data" :key="dataset.id" :class="[getRowClass(dataset)]">
<td data-label="Login" class="py-4 whitespace-nowrap text-gray-700 dark:text-white">
<!-- <Link v-bind:href="stardust.route('user.show', [user.id])"
class="no-underline hover:underline text-cyan-600 dark:text-cyan-400">
{{ user.login }}
</Link> -->
<div class="text-sm font-medium">{{ dataset.main_title }}</div>
</td>
<td class="py-4 whitespace-nowrap text-gray-700 dark:text-white">
<div class="text-sm">{{ dataset.id }}</div>
</td>
<td class="py-4 whitespace-nowrap text-gray-700 dark:text-white">
<div class="text-sm">{{ dataset.server_state }}</div>
</td>
<td class="py-4 whitespace-nowrap text-gray-700 dark:text-white">
<div class="text-sm">{{ dataset.editor?.login }}</div>
</td>
<td data-label="modified" class="py-4 whitespace-nowrap text-gray-700 dark:text-white">
<div class="text-sm" :title="dataset.remaining_time">
{{ dataset.remaining_time + ' days' }}
</div>
</td>
<td
class="py-4 whitespace-nowrap text-right text-sm font-medium text-gray-700 dark:text-white">
<BaseButtons type="justify-start lg:justify-end" no-wrap>
<BaseButton v-if="can.review && (dataset.server_state == 'approved')"
:route-name="stardust.route('reviewer.dataset.review', [dataset.id])"
color="info" :icon="mdiGlasses" :label="'Review'" small />
<BaseButton
v-if="can.reject && (dataset.server_state == 'approved')"
:route-name="stardust.route('reviewer.dataset.reject', [dataset.id])"
color="info" :icon="mdiReiterate" :label="'Reject'" small />
</BaseButtons>
</td>
</tr>
</tbody>
</table>
</div>
<div v-else>
<!-- Show warning message if datasets are not defined or empty -->
<div class="bg-yellow-200 text-yellow-800 rounded-md p-4">
<p>No datasets defined.</p>
<!-- You can add more descriptive text here -->
</div>
</div>
<!-- <BaseButton
v-if="can.edit && (dataset.server_state == 'editor_accepted' || dataset.server_state == 'rejected_reviewer')"
:route-name="stardust.route('editor.dataset.edit', [dataset.id])" color="info"
:icon="mdiSquareEditOutline" :label="'Edit'" small /> -->
<div class="py-4">
<Pagination v-bind:data="datasets.meta" />
</div>
</CardBox>
</SectionMain>
</LayoutAuthenticated>
</template>

View File

@ -0,0 +1,94 @@
<script setup lang="ts">
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
import { useForm, Head, usePage } from '@inertiajs/vue3';
import { computed, Ref } from 'vue';
import CardBox from '@/Components/CardBox.vue';
import FormField from '@/Components/FormField.vue';
import FormControl from '@/Components/FormControl.vue';
import BaseButton from '@/Components/BaseButton.vue';
import BaseButtons from '@/Components/BaseButtons.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
import { mdiArrowLeftBoldOutline, mdiReiterate } from '@mdi/js';
import FormValidationErrors from '@/Components/FormValidationErrors.vue';
const props = defineProps({
dataset: {
type: Object,
default: () => ({}),
},
});
const flash: Ref<any> = computed(() => {
return usePage().props.flash;
});
const errors: Ref<any> = computed(() => {
return usePage().props.errors;
});
const form = useForm({
server_state: 'rejected_reviewer',
reject_reviewer_note: '',
});
const handleSubmit = async (e) => {
e.preventDefault();
await form.put(stardust.route('reviewer.dataset.rejectUpdate', [props.dataset.id]));
// await form.put(stardust.route('editor.dataset.update', [props.dataset.id]));
};
</script>
<template>
<LayoutAuthenticated>
<Head title="Reject approved dataset" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiReiterate" title="Reject approved dataset" main>
<BaseButton :route-name="stardust.route('reviewer.dataset.list')" :icon="mdiArrowLeftBoldOutline"
label="Back" color="white" rounded-full small />
</SectionTitleLineWithButton>
<CardBox form @submit.prevent="handleSubmit">
<FormValidationErrors v-bind:errors="errors" />
<FormField label="server state" :class="{ 'text-red-400': form.errors.server_state }">
<FormControl v-model="form.server_state" type="text" placeholder="-- server state --"
:is-read-only="true" :error="form.errors.server_state">
<div class="text-red-400 text-sm" v-if="form.errors.server_state">
{{ form.errors.server_state }}
</div>
</FormControl>
</FormField>
<FormField label="reject note" :class="{ 'text-red-400': form.errors.reject_reviewer_note }">
<FormControl v-model="form.reject_reviewer_note" type="textarea"
placeholder="-- reject note for editor --" :error="form.errors.reject_reviewer_note">
<div class="text-red-400 text-sm" v-if="form.errors.reject_reviewer_note">
{{ form.errors.reject_reviewer_note }}
</div>
</FormControl>
</FormField>
<!-- <NotificationBar v-if="flash && flash.message" color="warning" :icon="mdiAlertBoxOutline">
{{ flash.message }}
class="bg-orange-100 border-l-4 border-orange-500 text-orange-700 p-4"
</NotificationBar> -->
<div v-if="flash && flash.warning" class="flex flex-col mt-6 animate-fade-in">
<div class="bg-yellow-500 border-l-4 border-orange-400 text-white p-4" role="alert">
<p class="font-bold">Be Warned</p>
<p>{{ flash.warning }}</p>
</div>
</div>
<template #footer>
<BaseButtons>
<BaseButton type="submit" color="info" label="Reject to editor"
:class="{ 'opacity-25': form.processing }" :disabled="form.processing" />
</BaseButtons>
</template>
</CardBox>
</SectionMain>
</LayoutAuthenticated>
</template>

View File

@ -0,0 +1,95 @@
<script setup lang="ts">
import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue';
import SectionMain from '@/Components/SectionMain.vue';
import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue';
import { router, Head, usePage } from '@inertiajs/vue3';
import { computed, Ref } from 'vue';
import CardBox from '@/Components/CardBox.vue';
import BaseButton from '@/Components/BaseButton.vue';
import BaseButtons from '@/Components/BaseButtons.vue';
import { stardust } from '@eidellev/adonis-stardust/client';
import { mdiArrowLeftBoldOutline, mdiGlasses } from '@mdi/js';
import FormValidationErrors from '@/Components/FormValidationErrors.vue';
const props = defineProps({
dataset: {
type: Object,
default: () => ({}),
},
fields: {
type: Object,
required: true,
},
});
const flash: Ref<any> = computed(() => {
return usePage().props.flash;
});
const errors: Ref<any> = computed(() => {
return usePage().props.errors;
});
// const form = useForm({
// preferred_reviewer: '',
// preferred_reviewer_email: '',
// preferation: 'yes_preferation',
// // preferation: '',
// // isPreferationRequired: false,
// });
// const isPreferationRequired = computed(() => form.preferation === 'yes_preferation');
const handleSubmit = async (e) => {
e.preventDefault();
await router.put(stardust.route('reviewer.dataset.reviewUpdate', [props.dataset.id]));
// await form.put(stardust.route('dataset.releaseUpdate', [props.dataset.id]));
// // await form.put(stardust.route('editor.dataset.update', [props.dataset.id]));
};
</script>
<template>
<LayoutAuthenticated>
<Head title="Review dataset" />
<SectionMain>
<SectionTitleLineWithButton :icon="mdiGlasses" title="Review approved dataset" main>
<BaseButton :route-name="stardust.route('reviewer.dataset.list')" :icon="mdiArrowLeftBoldOutline" label="Back"
color="white" rounded-full small />
</SectionTitleLineWithButton>
<CardBox form @submit.prevent="handleSubmit">
<FormValidationErrors v-bind:errors="errors" />
<div v-if="flash && flash.warning" class="flex flex-col mt-6 animate-fade-in">
<div class="bg-yellow-500 border-l-4 border-orange-400 text-white p-4" role="alert">
<p class="font-bold">Be Warned</p>
<p>{{ flash.warning }}</p>
</div>
</div>
<div class="flex flex-col">
<div class="flex flex-row items-center justify-between dark:bg-slate-900 bg-gray-200 p-2 mb-2"
v-for="(fieldValue, field) in fields" :key="field">
<label :for="field" class="font-bold h-6 mt-3 text-xs leading-8 uppercase">{{ field }}</label>
<span class="text-sm text-gray-600" v-html="fieldValue"></span>
</div>
</div>
<template #footer>
<BaseButtons>
<!-- <BaseButton type="submit" color="info" label="Receive"
:class="{ 'opacity-25': router.processing }" :disabled="form.processing" /> -->
<BaseButton type="submit" color="info" label="Review" />
</BaseButtons>
</template>
</CardBox>
</SectionMain>
</LayoutAuthenticated>
</template>

View File

@ -44,17 +44,17 @@ const getRowClass = (dataset) => {
// (props.options ? 'select' : props.type)
let rowclass = '';
if (dataset.server_state == 'inprogress') {
rowclass = 'inprogress';
rowclass = 'bg-inprogress';
} else if (dataset.server_state == 'released') {
rowclass = 'released';
} else if (dataset.server_state == 'editor_accepted' || dataset.server_state == 'ejected_reviewer') {
rowclass = 'editor_accepted';
rowclass = 'bg-released';
} else if (dataset.server_state == 'editor_accepted' || dataset.server_state == 'rejected_reviewer') {
rowclass = 'bg-editor-accepted';
} else if (dataset.server_state == 'approved') {
rowclass = 'approved';
} else if (dataset.server_state == 'eviewed') {
rowclass = 'eviewed';
} else if (dataset.server_state == 'ejected_editor') {
rowclass = 'ejected_editor';
rowclass = 'bg-approved';
} else if (dataset.server_state == 'reviewed') {
rowclass = 'bg-reviewed';
} else if (dataset.server_state == 'rejected_editor') {
rowclass = 'bg-rejected-editor';
} else {
rowclass = '';
}
@ -78,7 +78,7 @@ const getRowClass = (dataset) => {
<!-- table -->
<CardBox class="mb-6" has-table>
<table class="pure-table">
<table class="">
<thead>
<tr>
<th scope="col" class="py-3 text-left text-xs font-medium uppercase tracking-wider">
@ -155,7 +155,7 @@ const getRowClass = (dataset) => {
</LayoutAuthenticated>
</template>
<style scoped>
<style scoped lang="css">
.pure-table tr.released {
/* background-color: greenyellow; */
background-color: rgb(52 211 153);
@ -200,7 +200,5 @@ const getRowClass = (dataset) => {
}
.pure-table tr.reviewed {
/* padding: 0.8em; */
background-color: #ffed4a;
}</style>
</style>

View File

@ -113,6 +113,25 @@ export default [
// },
],
},
{
// route: 'dataset.create',
icon: mdiAccountEdit,
label: 'Reviewer',
roles: ['reviewer'],
isOpen: false,
children: [
{
route: 'reviewer.dataset.list',
icon: mdiFormatListNumbered,
label: 'All my datasets',
},
// {
// route: 'dataset.create',
// icon: mdiPublish,
// label: 'Create Dataset',
// },
],
},
// {
// route: 'dataset.create',
// icon: mdiDatabasePlus,

View File

@ -234,9 +234,50 @@ Route.group(() => {
.where('id', Route.matchers.number())
.middleware(['auth', 'can:dataset-approve']);
Route.get('dataset/:id/publish', 'DatasetController.publish')
.as('editor.dataset.publish')
.where('id', Route.matchers.number())
.middleware(['auth', 'can:dataset-publish']);
Route.put('dataset/:id/publish', 'DatasetController.publishUpdate')
.as('editor.dataset.publishUpdate')
.where('id', Route.matchers.number())
.middleware(['auth', 'can:dataset-publish']);
Route.put('/dataset/:id/update', 'DatasetController.update')
.as('editor.dataset.update')
.middleware(['auth', 'can:dataset-editor-edit']);
})
.namespace('App/Controllers/Http/Editor')
.prefix('editor');
// reviewer:
Route.group(() => {
Route.get('/dataset', 'DatasetController.index').as('reviewer.dataset.list').middleware(['auth', 'can:dataset-review-list']);
Route.get('dataset/:id/review', 'DatasetController.review')
.as('reviewer.dataset.review')
.where('id', Route.matchers.number())
.middleware(['auth', 'can:dataset-review']);
Route.put('dataset/:id/review', 'DatasetController.reviewUpdate')
.as('reviewer.dataset.reviewUpdate')
.where('id', Route.matchers.number())
.middleware(['auth', 'can:dataset-review']);
Route.get('dataset/:id/reject', 'DatasetController.reject')
.as('reviewer.dataset.reject')
.where('id', Route.matchers.number())
.middleware(['auth', 'can:dataset-review-reject']);
Route.put('dataset/:id/reject', 'DatasetController.rejectUpdate')
.as('reviewer.dataset.rejectUpdate')
.where('id', Route.matchers.number())
.middleware(['auth', 'can:dataset-review-reject']);
// Route.put('dataset/:id/approve', 'DatasetController.approveUpdate')
// .as('editor.dataset.approveUpdate')
// .where('id', Route.matchers.number())
// .middleware(['auth', 'can:dataset-approve']);
// Route.put('/dataset/:id/update', 'DatasetController.update')
// .as('editor.dataset.update')
// .middleware(['auth', 'can:dataset-editor-edit']);
})
.namespace('App/Controllers/Http/Reviewer')
.prefix('reviewer');

View File

@ -14,6 +14,14 @@ module.exports = {
extend: {
colors: {
'primary': '#22C55E',
'inprogress': 'rgb(94 234 212)',
'released': 'rgb(52 211 153)',
'editor-accepted': 'rgb(125 211 252)',
'approved': '#BFCE40',
'rejected-editor': '#f97316',
'rejected-reviewer': '#f97316',
'reviewed': '#34d399', // emerald
'published': '#34d399', // sky
'primary-dark': '#DCFCE7',
'lime': {
DEFAULT: '#BFCE40',