From 18635f77b3af1028f8c5df43544b800135eb9766 Mon Sep 17 00:00:00 2001 From: Arno Kaimbacher Date: Thu, 4 Jan 2024 16:40:05 +0100 Subject: [PATCH] - npm updates - 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 --- .../Http/Editor/DatasetController.ts | 70 ++- .../Http/Reviewer/DatasetController.ts | 267 +++++++++ app/Models/Dataset.ts | 30 +- app/Models/Traits/DatasetExtension.ts | 2 +- package-lock.json | 537 +++++++++--------- resources/css/_table.css | 67 ++- resources/js/Components/Map/SearchMap.vue | 10 +- resources/js/Components/NavBar.vue | 28 +- resources/js/Pages/Editor/Dataset/Index.vue | 46 +- resources/js/Pages/Editor/Dataset/Publish.vue | 102 ++++ resources/js/Pages/Reviewer/Dataset/Index.vue | 171 ++++++ .../js/Pages/Reviewer/Dataset/Reject.vue | 94 +++ .../js/Pages/Reviewer/Dataset/Review.vue | 95 ++++ .../js/Pages/Submitter/Dataset/Index.vue | 28 +- resources/js/menu.ts | 19 + start/routes.ts | 41 ++ tailwind.config.js | 10 +- 17 files changed, 1224 insertions(+), 393 deletions(-) create mode 100644 app/Controllers/Http/Reviewer/DatasetController.ts create mode 100644 resources/js/Pages/Editor/Dataset/Publish.vue create mode 100644 resources/js/Pages/Reviewer/Dataset/Index.vue create mode 100644 resources/js/Pages/Reviewer/Dataset/Reject.vue create mode 100644 resources/js/Pages/Reviewer/Dataset/Review.vue diff --git a/app/Controllers/Http/Editor/DatasetController.ts b/app/Controllers/Http/Editor/DatasetController.ts index 77cec45..fd2e7a6 100644 --- a/app/Controllers/Http/Editor/DatasetController.ts +++ b/app/Controllers/Http/Editor/DatasetController.ts @@ -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) {} diff --git a/app/Controllers/Http/Reviewer/DatasetController.ts b/app/Controllers/Http/Reviewer/DatasetController.ts new file mode 100644 index 0000000..9910de1 --- /dev/null +++ b/app/Controllers/Http/Reviewer/DatasetController.ts @@ -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 = 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 = 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 = '
    '; + 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 + '
  • ' + prop + ' : ' + modelValue + '
  • '; + } + }); + value = value + '
'; + } 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.' }); + } + } +} diff --git a/app/Models/Dataset.ts b/app/Models/Dataset.ts index 5a438ae..b6e0f8b 100644 --- a/app/Models/Dataset.ts +++ b/app/Models/Dataset.ts @@ -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({}) @@ -95,13 +95,14 @@ export default class Dataset extends DatasetExtension { }) public created_at: DateTime; - @column.dateTime({ + @column.dateTime({ serialize: (value: Date | null) => { return value ? dayjs(value).format('MMMM D YYYY HH:mm a') : value; }, - autoCreate: true, - autoUpdate: true, - columnName: 'server_date_modified' }) + autoCreate: true, + autoUpdate: true, + 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; + } + } } diff --git a/app/Models/Traits/DatasetExtension.ts b/app/Models/Traits/DatasetExtension.ts index 0403014..71971d4 100644 --- a/app/Models/Traits/DatasetExtension.ts +++ b/app/Models/Traits/DatasetExtension.ts @@ -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('EmbargoDate', 'CreatedAt', 'ServerDatePublished', 'ServerDateDeleted'); + let dateFields = new Array('EmbargoDate', 'CreatedAt', 'ServerDateModified', 'ServerDatePublished', 'ServerDateDeleted'); dateFields.forEach((fieldname) => { let dateField = this.getField(fieldname); dateField instanceof Field && dateField.setValueModelClass(DateTime.now()); diff --git a/package-lock.json b/package-lock.json index 0731498..a37eea3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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" } diff --git a/resources/css/_table.css b/resources/css/_table.css index 48c3635..61c24e1 100644 --- a/resources/css/_table.css +++ b/resources/css/_table.css @@ -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) { - @apply lg:bg-gray-50 lg:dark:bg-slate-800; - } - tbody tr:nth-child(even) { +.pure-table tbody tr:nth-child(odd) { + @apply lg:bg-gray-50 lg:dark:bg-slate-800; +} + +.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; - } - \ No newline at end of file +} diff --git a/resources/js/Components/Map/SearchMap.vue b/resources/js/Components/Map/SearchMap.vue index 1e38073..6f0a335 100644 --- a/resources/js/Components/Map/SearchMap.vue +++ b/resources/js/Components/Map/SearchMap.vue @@ -271,18 +271,14 @@ const handleDrawEventCreated = async (event) => { diff --git a/resources/js/Components/NavBar.vue b/resources/js/Components/NavBar.vue index 277a33f..31081fe 100644 --- a/resources/js/Components/NavBar.vue +++ b/resources/js/Components/NavBar.vue @@ -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 () => { - - diff --git a/resources/js/Pages/Editor/Dataset/Publish.vue b/resources/js/Pages/Editor/Dataset/Publish.vue new file mode 100644 index 0000000..d6929d2 --- /dev/null +++ b/resources/js/Pages/Editor/Dataset/Publish.vue @@ -0,0 +1,102 @@ + + + diff --git a/resources/js/Pages/Reviewer/Dataset/Index.vue b/resources/js/Pages/Reviewer/Dataset/Index.vue new file mode 100644 index 0000000..b82cc4c --- /dev/null +++ b/resources/js/Pages/Reviewer/Dataset/Index.vue @@ -0,0 +1,171 @@ + + + + diff --git a/resources/js/Pages/Reviewer/Dataset/Reject.vue b/resources/js/Pages/Reviewer/Dataset/Reject.vue new file mode 100644 index 0000000..004196d --- /dev/null +++ b/resources/js/Pages/Reviewer/Dataset/Reject.vue @@ -0,0 +1,94 @@ + + + diff --git a/resources/js/Pages/Reviewer/Dataset/Review.vue b/resources/js/Pages/Reviewer/Dataset/Review.vue new file mode 100644 index 0000000..4213bc2 --- /dev/null +++ b/resources/js/Pages/Reviewer/Dataset/Review.vue @@ -0,0 +1,95 @@ + + + diff --git a/resources/js/Pages/Submitter/Dataset/Index.vue b/resources/js/Pages/Submitter/Dataset/Index.vue index adc68f1..9a1dd00 100644 --- a/resources/js/Pages/Submitter/Dataset/Index.vue +++ b/resources/js/Pages/Submitter/Dataset/Index.vue @@ -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) => { - +
@@ -155,7 +155,7 @@ const getRowClass = (dataset) => { - + + diff --git a/resources/js/menu.ts b/resources/js/menu.ts index 8fbd703..8d66584 100644 --- a/resources/js/menu.ts +++ b/resources/js/menu.ts @@ -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, diff --git a/start/routes.ts b/start/routes.ts index 69365a2..e05ab54 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -233,6 +233,15 @@ Route.group(() => { .as('editor.dataset.approveUpdate') .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') @@ -240,3 +249,35 @@ Route.group(() => { }) .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'); diff --git a/tailwind.config.js b/tailwind.config.js index 0cd18bd..527ef6e 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -13,7 +13,15 @@ module.exports = { }, extend: { colors: { - 'primary': '#22C55E', + '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',