From 2cb33a779c7f1e0be4ccd4e97f9555d0dc104a8e Mon Sep 17 00:00:00 2001 From: Arno Kaimbacher Date: Wed, 16 Apr 2025 17:07:45 +0200 Subject: [PATCH] hotfix(dataset): improve dataset management and UI enhancements - Added tooltips to display reject notes from editors and reviewers on dataset index pages for submitters and editors. - Implemented custom ordering for datasets in submitter and editor index views, prioritizing datasets rejected by editors or reviewers. - Changed "Review" button label to "View" on the reviewer dataset index page. - Changed "Review" button label to "Accept" on the reviewer dataset review page. - Added project_id to the dataset model. - Updated dependencies (vite, @pkgr/core, caniuse-lite, electron-to-chromium, http-proxy-middleware). - Replaced the static doctypes array with the DatasetTypes enum. - Updated favicon. --- .../Http/Editor/DatasetController.ts | 32 ++++--- .../Http/Submitter/DatasetController.ts | 34 ++++--- package-lock.json | 30 +++--- public/favicon-32x32.png | Bin 1102 -> 2252 bytes public/favicon-32x32.png:Zone.Identifier | 3 + resources/js/Pages/Editor/Dataset/Index.vue | 90 +++++++++++------- resources/js/Pages/Reviewer/Dataset/Index.vue | 2 +- .../js/Pages/Reviewer/Dataset/Review.vue | 2 +- .../js/Pages/Submitter/Dataset/Index.vue | 51 +++++++--- 9 files changed, 151 insertions(+), 93 deletions(-) create mode 100644 public/favicon-32x32.png:Zone.Identifier diff --git a/app/Controllers/Http/Editor/DatasetController.ts b/app/Controllers/Http/Editor/DatasetController.ts index 5af6e43..7a82949 100644 --- a/app/Controllers/Http/Editor/DatasetController.ts +++ b/app/Controllers/Http/Editor/DatasetController.ts @@ -27,6 +27,7 @@ import { ReferenceIdentifierTypes, RelationTypes, SubjectTypes, + DatasetTypes, } from '#contracts/enums'; import { TransactionClientContract } from '@adonisjs/lucid/types/database'; import db from '@adonisjs/lucid/services/db'; @@ -86,8 +87,15 @@ export default class DatasetsController { } datasets.orderBy(attribute, sortOrder); } else { - // users.orderBy('created_at', 'desc'); - datasets.orderBy('id', 'asc'); + // datasets.orderBy('id', 'asc'); + // Custom ordering to prioritize rejected_editor state + datasets.orderByRaw(` + CASE + WHEN server_state = 'rejected_reviewer' THEN 0 + ELSE 1 + END ASC, + id ASC + `); } // const users = await User.query().orderBy('login').paginate(page, limit); @@ -557,15 +565,15 @@ export default class DatasetsController { // const datasetHasLicenses = await dataset.related('licenses').query().pluck('id'); // const checkeds = dataset.licenses.first().id; - const doctypes = { - analysisdata: { label: 'Analysis', value: 'analysisdata' }, - measurementdata: { label: 'Measurements', value: 'measurementdata' }, - monitoring: 'Monitoring', - remotesensing: 'Remote Sensing', - gis: 'GIS', - models: 'Models', - mixedtype: 'Mixed Type', - }; + // const doctypes = { + // analysisdata: { label: 'Analysis', value: 'analysisdata' }, + // measurementdata: { label: 'Measurements', value: 'measurementdata' }, + // monitoring: 'Monitoring', + // remotesensing: 'Remote Sensing', + // gis: 'GIS', + // models: 'Models', + // mixedtype: 'Mixed Type', + // }; return inertia.render('Editor/Dataset/Edit', { dataset, @@ -584,7 +592,7 @@ export default class DatasetsController { subjectTypes: SubjectTypes, referenceIdentifierTypes: Object.entries(ReferenceIdentifierTypes).map(([key, value]) => ({ value: key, label: value })), relationTypes: Object.entries(RelationTypes).map(([key, value]) => ({ value: key, label: value })), - doctypes, + doctypes: DatasetTypes, }); } diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index b9a627e..e683e7d 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -36,7 +36,6 @@ import path from 'path'; import { Exception } from '@adonisjs/core/exceptions'; import { MultipartFile } from '@adonisjs/core/types/bodyparser'; import * as crypto from 'crypto'; -// import MimeType from '#models/mime_type'; import { pipeline } from 'node:stream/promises'; import { createWriteStream } from 'node:fs'; import type { Multipart } from '@adonisjs/bodyparser'; @@ -77,8 +76,16 @@ export default class DatasetController { } datasets.orderBy(attribute, sortOrder); } else { - // users.orderBy('created_at', 'desc'); - datasets.orderBy('id', 'asc'); + // datasets.orderBy('id', 'asc'); + // Custom ordering to prioritize rejected_editor state + datasets.orderByRaw(` + CASE + WHEN server_state = 'rejected_editor' THEN 0 + WHEN server_state = 'rejected_reviewer' THEN 1 + ELSE 2 + END ASC, + id ASC + `); } // const results = await Database @@ -547,6 +554,7 @@ export default class DatasetController { dataset.creating_corporation = request.input('creating_corporation'); dataset.language = request.input('language'); dataset.embargo_date = request.input('embargo_date'); + dataset.project_id = request.input('project_id'); //await dataset.related('user').associate(user); // speichert schon ab // Dataset.$getRelation('user').boot(); // Dataset.$getRelation('user').setRelated(dataset, user); @@ -979,15 +987,15 @@ export default class DatasetController { // const datasetHasLicenses = await dataset.related('licenses').query().pluck('id'); // const checkeds = dataset.licenses.first().id; - const doctypes = { - analysisdata: { label: 'Analysis', value: 'analysisdata' }, - measurementdata: { label: 'Measurements', value: 'measurementdata' }, - monitoring: 'Monitoring', - remotesensing: 'Remote Sensing', - gis: 'GIS', - models: 'Models', - mixedtype: 'Mixed Type', - }; + // const doctypes = { + // analysisdata: { label: 'Analysis', value: 'analysisdata' }, + // measurementdata: { label: 'Measurements', value: 'measurementdata' }, + // monitoring: 'Monitoring', + // remotesensing: 'Remote Sensing', + // gis: 'GIS', + // models: 'Models', + // mixedtype: 'Mixed Type', + // }; return inertia.render('Submitter/Dataset/Edit', { dataset, @@ -1006,7 +1014,7 @@ export default class DatasetController { subjectTypes: SubjectTypes, referenceIdentifierTypes: Object.entries(ReferenceIdentifierTypes).map(([key, value]) => ({ value: key, label: value })), relationTypes: Object.entries(RelationTypes).map(([key, value]) => ({ value: key, label: value })), - doctypes, + doctypes: DatasetTypes, }); } diff --git a/package-lock.json b/package-lock.json index ea2d86f..480f5eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2540,9 +2540,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.1.tgz", - "integrity": "sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.2.tgz", + "integrity": "sha512-25L86MyPvnlQoX2MTIV2OiUcb6vJ6aRbFa9pbwByn95INKD5mFH2smgjDhq+fwJoqAgvgbdJLj6Tz7V9X5CFAQ==", "dev": true, "license": "MIT", "engines": { @@ -5188,9 +5188,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001712", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz", - "integrity": "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==", + "version": "1.0.30001713", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", + "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", "dev": true, "funding": [ { @@ -6353,9 +6353,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.134", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.134.tgz", - "integrity": "sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==", + "version": "1.5.135", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.135.tgz", + "integrity": "sha512-8gXUdEmvb+WCaYUhA0Svr08uSeRjM2w3x5uHOc1QbaEVzJXB8rgm5eptieXzyKoVEtinLvW6MtTcurA65PeS1Q==", "dev": true, "license": "ISC" }, @@ -8228,9 +8228,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.8.tgz", + "integrity": "sha512-/iazaeFPmL8KLA6QB7DFAU4O5j+9y/TA0D019MbLtPuFI56VK4BXFzM6j6QS9oGpScy8IIDH4S2LHv3zg/63Bw==", "dev": true, "license": "MIT", "dependencies": { @@ -13417,9 +13417,9 @@ } }, "node_modules/vite": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", - "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", + "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png index 90ed7d22fdb07208eaa8f5622c8d119a9c4d87d3..6886e7b7d4af1dc7e63e5d2332d145ee9f2303d8 100644 GIT binary patch delta 2241 zcmV;y2tN1D2+R?XBYy~!Nklw<-3?gH<39t05hRna9umOa?iejrlW@jj;5O$thBH^BTP#aY4Yy z(O}Xw4;Z5+v({BYhzi3f0NAUU-ZnYg}`8GX-CUpf8JeJotLOa_ZI!ud3Y?3ji3*3?c$a3nXoT z4OHOo(#kwumBjOH?GwKf7R_UoO*IX}dk5b4^U>{#JI3!0B<_tOzPYZ6(7(s@9@wzs z%75-`Yc%>=Q#t7Z-DIXc^j589r`HN6(V+`RBM_|PoD48A6Bx`SY)4wjG<2BX6Bfd| z=3U&>8yojNr?Tc&RvN+3;0uLfc;DjoCf7H(LpZ!Nj`*E877O3lgoC*Z3=uJnoP63t zZ`E2>#Twyy-%^F6iil)c6+np=U;=|c1b;At0WECDl8F>l;J;irIB>`OYuYXdLbIac zjGA%&!Naj)elAqv$;C5k2FS(tgFFhioJoJm>Ad`O_ZB|KRQ4TQuW}qT*%JNmQ|lU?(dO1wIJmYgK%;#;N}) zO@H|9O?K`0PIYtu#Acgq*((#tWPh*r{XM&P@6!DTK6jaw1K3)mz2bz1CSBKZR+2QI z6UXY(SjAU?#7yCOFkv37;-d7@u2E56kPmNOaQVb{ePu0^PI6I{9|CI~lMuF>u0e75 z$V)Wik+(m#oWzz?BK6SwTi@I}aAfd8*w$4f#B2i22DqAp6krCk2?6vm^M6h@W+S4w zw|4xv?bF-m)cA$MwNWv;StKi3Ofdi(1?hUwQSmu{VBbCS7tEeljQJ7EOE-pt{l@lE zLKX7wQs<)^D>rZ1*bFDNL_pj~39lZ^U=;&K0mhVS5dcU4LIBb}b{)Cs4;o`$K^(1U zo!0SQspNR+~Vd|m)-N*`E{f-AuaX_H$4LHyaR|u6Aou{q zAhuyp0hmgVNWpRdQEr&50jMER$=>$jd4Gt))sUhYN|jpj$j|6Y9|JHN(0T|^9|72B4Ij8a_-yZ{a-E$Z{?z~_ z69A0Yamn~t#jk z<-JeH`8NX?1>v^Mo@hwC2GH5iN&{fnwgs*K5m&p{qPJI{uK3shMnlZ#Jll|51H!qb z8(>z&GCIy;>sB=u@o#3AU1kA5W&51T&dj;**==)HVcImOygH_T#sKht1pI0hzp~RL P00000NkvXXu0mjf#oSXc delta 1082 zcmV-A1jYNz5zYvZBYyw^b5ch_0Itp)=>Px(2uVaiR9HvtmRn3*WfXCK#tE7!4rWhVn9yB2mC02`4Ej5~0FEvpU?1PEYgp{PQUP#+$f(C7g(SVK7 zYT^S3r6I;X6pPe^j?e~5kyK{pY=y!Icp&PN&0K8uYsF0q`;a*T07HQ^dlG=d(Cs6e1yjnjbD^=wbCGh*AjJ zvfcJZZ${E?2!9?G%)Qcb4&Z%zd^~Ri!Z1MX_hbHWWU2#@4fBMrDdL?HUs|Wxq#XdT zarP`k!2@+U?2QLu7@)FkVC!EIxy5GD#No7=m9B3R#rpx4{xb^$7EOEUjzC(juHy|5 z$pFRyRPOQdo0TBq0u(o%E+^0;KzdAwxCY=f!M2?Bo`3FCx4l*bk5IAQ5c#LnGbwk!v+B0%xM?rP}j2ms5nSrC(i94ZK`>u|WtZ$hvQkdLxG&SUG-UF8%! z2BN9X%f_WNmIWwoJhK;&20&E2K3+fPFoD-L2Q#CfdK)^@sCZIATKrilA(zeC^@5*c zH)<^g5PxCtU~hv6UYrdU3N8pSD8Lm$6hXI;K8V~p?L1$U;E%~J+v|ZqYBdE6~?9@N95+ba*Eq zRgihZw{#OHDEt0V1Rz^+g-AFPqHV2jL{uwhett0X>g*&VGpd4;#>h&~Ol2;g~ARTpFjyIZRmUD&ea9O}O_slopD z0e{pa1`&(y0nnVAm)~!b2XtA1;nsjh81<4>Z(Pa_}qYw@eGANK= zl|A)hBx{Sn<9EvR(2~DJn`>KFs-Q6d0Dsn!t@)y(Lx4d1maxxe)9=07)pa>utYLs@ zA!lJ}=9EeM3Xm-;2=|0_RN&{%KjN9stS=)$3t|fHPBL4g#{nr{G*HCJsj$5gznq#d zs+%~#>`Yip$wvfI9Wx?64x1uRqNgXJ-?G&KTz92;)3yeP>?Lqus;_e&05O_*Y%_Bt zdSOv~$#yr+oLcmeF{=AtDqz%O#kiXQYhHoB0jSzTF!R(Gr~m)}07*qoM6N<$f{AbZ Al>h($ diff --git a/public/favicon-32x32.png:Zone.Identifier b/public/favicon-32x32.png:Zone.Identifier new file mode 100644 index 0000000..8bcdfdc --- /dev/null +++ b/public/favicon-32x32.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://sea1.geoinformation.dev/favicon-32x32.png diff --git a/resources/js/Pages/Editor/Dataset/Index.vue b/resources/js/Pages/Editor/Dataset/Index.vue index 2dad8ea..5ab7d2c 100644 --- a/resources/js/Pages/Editor/Dataset/Index.vue +++ b/resources/js/Pages/Editor/Dataset/Index.vue @@ -123,10 +123,8 @@ const formatServerState = (state: string) => { Submitter - State - Editor @@ -156,6 +154,21 @@ const formatServerState = (state: string) => {
{{ formatServerState(dataset.server_state) }}
+
+ +
+

+ {{ dataset.reject_reviewer_note }} +

+
+
+
+
{ -
- - +
- + - - + - - + + - - + + - + + - + -
+ + +
@@ -260,5 +279,4 @@ const formatServerState = (state: string) => { white-space: nowrap; /* prevent wrapping */ } - \ No newline at end of file diff --git a/resources/js/Pages/Reviewer/Dataset/Index.vue b/resources/js/Pages/Reviewer/Dataset/Index.vue index 2d225e4..f0d8035 100644 --- a/resources/js/Pages/Reviewer/Dataset/Index.vue +++ b/resources/js/Pages/Reviewer/Dataset/Index.vue @@ -148,7 +148,7 @@ const formatServerState = (state: string) => { + color="info" :icon="mdiGlasses" :label="'View'" small /> { - + diff --git a/resources/js/Pages/Submitter/Dataset/Index.vue b/resources/js/Pages/Submitter/Dataset/Index.vue index 65ab0b1..a22d264 100644 --- a/resources/js/Pages/Submitter/Dataset/Index.vue +++ b/resources/js/Pages/Submitter/Dataset/Index.vue @@ -98,7 +98,7 @@ const formatServerState = (state: string) => { Dataset Title - + Server State @@ -114,16 +114,33 @@ const formatServerState = (state: string) => { - + - {{ dataset.main_title }} + {{ dataset.main_title }} {{ formatServerState(dataset.server_state) }} +
+ +
+

+ {{ dataset.reject_editor_note }} +

+
+
+
+
@@ -131,15 +148,17 @@ const formatServerState = (state: string) => { {{ dataset.server_date_modified }} - + - + @@ -152,7 +171,7 @@ const formatServerState = (state: string) => {
- +
@@ -160,13 +179,17 @@ const formatServerState = (state: string) => { +