From 5bc35d781db4a3125f4f009b5abf5b28fe30707a Mon Sep 17 00:00:00 2001 From: BatLeDev Date: Thu, 5 Feb 2026 17:49:06 +0100 Subject: [PATCH 1/7] refactor: organize api in folders --- api/config/development.mjs | 2 +- api/config/test.mjs | 2 +- api/src/{admin.ts => admin/router.ts} | 8 ++- api/src/admin/status.ts | 55 +++++++++++++++++++ api/src/app.ts | 14 ++--- .../{routers/limits.ts => limits/router.ts} | 0 api/src/{ => misc}/routers/identities.ts | 0 api/src/{ => misc}/utils/api-docs.ts | 2 +- api/src/{ => misc}/utils/find.ts | 0 api/src/{ => misc}/utils/permissions.ts | 0 .../router.ts} | 0 .../{routers/plugins.ts => plugins/router.ts} | 2 +- .../processings.ts => processings/router.ts} | 8 +-- api/src/{routers/runs.ts => runs/router.ts} | 4 +- api/src/{utils/runs.ts => runs/service.ts} | 0 api/src/server.ts | 2 +- dev/resources/nginx.conf | 4 +- docker-compose.yml | 5 +- scripts/re-schedule-all.ts | 2 +- ui/.gitignore | 1 + ui/dts/auto-imports.d.ts | 1 - ui/dts/typed-router.d.ts | 1 + ui/src/components/private-access.vue | 3 - .../processing/processing-actions.vue | 3 - .../components/processing/processing-card.vue | 4 +- .../components/processing/processing-runs.vue | 3 - ui/src/pages/dev.vue | 3 - worker/config/development.mjs | 2 +- 28 files changed, 89 insertions(+), 42 deletions(-) rename api/src/{admin.ts => admin/router.ts} (79%) create mode 100644 api/src/admin/status.ts rename api/src/{routers/limits.ts => limits/router.ts} (100%) rename api/src/{ => misc}/routers/identities.ts (100%) rename api/src/{ => misc}/utils/api-docs.ts (99%) rename api/src/{ => misc}/utils/find.ts (100%) rename api/src/{ => misc}/utils/permissions.ts (100%) rename api/src/{routers/plugins-registry.ts => plugins-registry/router.ts} (100%) rename api/src/{routers/plugins.ts => plugins/router.ts} (99%) rename api/src/{routers/processings.ts => processings/router.ts} (98%) rename api/src/{routers/runs.ts => runs/router.ts} (96%) rename api/src/{utils/runs.ts => runs/service.ts} (100%) diff --git a/api/config/development.mjs b/api/config/development.mjs index 9e37ef41..ee27bada 100644 --- a/api/config/development.mjs +++ b/api/config/development.mjs @@ -7,7 +7,7 @@ export default { }, port: 8082, privateDirectoryUrl: 'http://localhost:8080', - privateEventsUrl: 'http://localhost:8084', + privateEventsUrl: 'http://localhost:8083', secretKeys: { identities: 'secret-identities', events: 'secret-events' diff --git a/api/config/test.mjs b/api/config/test.mjs index aafec418..0c4481ef 100644 --- a/api/config/test.mjs +++ b/api/config/test.mjs @@ -7,7 +7,7 @@ export default { }, port: 8082, privateDirectoryUrl: 'http://localhost:8080', - privateEventsUrl: 'http://localhost:8084', + privateEventsUrl: 'http://localhost:8083', secretKeys: { identities: 'secret-identities', events: 'secret-events' diff --git a/api/src/admin.ts b/api/src/admin/router.ts similarity index 79% rename from api/src/admin.ts rename to api/src/admin/router.ts index bc6ed9b6..a0e7bd80 100644 --- a/api/src/admin.ts +++ b/api/src/admin/router.ts @@ -2,7 +2,8 @@ import { resolve } from 'node:path' import { readFile } from 'node:fs/promises' import { Router } from 'express' import { reqOrigin, session } from '@data-fair/lib-express' -import getApiDoc from './utils/api-docs.ts' +import { getStatus } from './status.ts' +import getApiDoc from '../misc/utils/api-docs.ts' const router = Router() export default router @@ -21,6 +22,11 @@ router.get('/info', (req, res) => { res.send(info) }) +router.get('/status', async (req, res) => { + const status = await getStatus(req) + res.send(status) +}) + // Get the full API documentation of the service router.get('/api-docs.json', async (req, res) => { res.json(getApiDoc(reqOrigin(req))) diff --git a/api/src/admin/status.ts b/api/src/admin/status.ts new file mode 100644 index 00000000..2e03ddb1 --- /dev/null +++ b/api/src/admin/status.ts @@ -0,0 +1,55 @@ +import type { Request } from 'express' +import mongo from '#mongo' +import config from '#config' +import fs from 'node:fs/promises' + +const mongoStatus = async () => { await mongo.db.command({ ping: 1 }) } +const volumeStatus = async () => { + await fs.writeFile(`${config.dataDir}/check-access.txt`, 'ok') +} + +export const getStatus = async (req: Request) => + runHealthChecks(req, [ + { fn: mongoStatus, name: 'mongodb' }, + { fn: volumeStatus, name: 'data volume' } + ]) + +// Helper functions +const getSingleStatus = async (req: Request, fn: (req: Request) => Promise, name: string) => { + const start = performance.now() + try { + await fn(req) + return { + status: 'ok', + name, + timeInMs: Math.round(performance.now() - start) + } + } catch (err) { + return { + status: 'error', + message: err instanceof Error ? err.message : String(err), + name, + timeInMs: Math.round(performance.now() - start) + } + } +} +const runHealthChecks = async ( + req: Request, + checks: Array<{ fn: (req: Request) => Promise; name: string }> +) => { + let results + try { + results = await Promise.all(checks.map(({ fn, name }) => getSingleStatus(req, fn, name))) + } catch (err: any) { + return { + status: 'error', + details: err.toString() + } + } + const errors = results.filter(r => r.status === 'error') + return { + status: errors.length ? 'error' : 'ok', + message: errors.length ? ('Problem with : ' + errors.map(s => s.name).join(', ')) : 'Service is ok', + details: results + } +} diff --git a/api/src/app.ts b/api/src/app.ts index 44241549..c5846148 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -1,13 +1,13 @@ import { resolve } from 'node:path' import express from 'express' import { session, errorHandler, createSiteMiddleware, createSpaMiddleware, defaultNonceCSPDirectives } from '@data-fair/lib-express/index.js' -import identitiesRouter from './routers/identities.ts' -import limitsRouter from './routers/limits.ts' -import pluginsRegistryRouter from './routers/plugins-registry.ts' -import pluginsRouter from './routers/plugins.ts' -import processingsRouter from './routers/processings.ts' -import runsRouter from './routers/runs.ts' -import adminRouter from './admin.ts' +import identitiesRouter from './misc/routers/identities.ts' +import limitsRouter from './limits/router.ts' +import pluginsRegistryRouter from './plugins-registry/router.ts' +import pluginsRouter from './plugins/router.ts' +import processingsRouter from './processings/router.ts' +import runsRouter from './runs/router.ts' +import adminRouter from './admin/router.ts' import config, { uiConfig } from '#config' export const app = express() diff --git a/api/src/routers/limits.ts b/api/src/limits/router.ts similarity index 100% rename from api/src/routers/limits.ts rename to api/src/limits/router.ts diff --git a/api/src/routers/identities.ts b/api/src/misc/routers/identities.ts similarity index 100% rename from api/src/routers/identities.ts rename to api/src/misc/routers/identities.ts diff --git a/api/src/utils/api-docs.ts b/api/src/misc/utils/api-docs.ts similarity index 99% rename from api/src/utils/api-docs.ts rename to api/src/misc/utils/api-docs.ts index 932f0670..612a1af9 100644 --- a/api/src/utils/api-docs.ts +++ b/api/src/misc/utils/api-docs.ts @@ -4,7 +4,7 @@ import { type Plugin, resolvedSchema as PluginSchema } from '#types/plugin/index import { readFileSync } from 'node:fs' import path from 'path' -const packageJson = JSON.parse(readFileSync(path.resolve(import.meta.dirname, '../../package.json'), 'utf-8')) +const packageJson = JSON.parse(readFileSync(path.resolve(import.meta.dirname, '../../../package.json'), 'utf-8')) // CTRL + K CTRL + 4 to fold operations levels diff --git a/api/src/utils/find.ts b/api/src/misc/utils/find.ts similarity index 100% rename from api/src/utils/find.ts rename to api/src/misc/utils/find.ts diff --git a/api/src/utils/permissions.ts b/api/src/misc/utils/permissions.ts similarity index 100% rename from api/src/utils/permissions.ts rename to api/src/misc/utils/permissions.ts diff --git a/api/src/routers/plugins-registry.ts b/api/src/plugins-registry/router.ts similarity index 100% rename from api/src/routers/plugins-registry.ts rename to api/src/plugins-registry/router.ts diff --git a/api/src/routers/plugins.ts b/api/src/plugins/router.ts similarity index 99% rename from api/src/routers/plugins.ts rename to api/src/plugins/router.ts index ec976f54..6750e06f 100644 --- a/api/src/routers/plugins.ts +++ b/api/src/plugins/router.ts @@ -15,7 +15,7 @@ import multer from 'multer' import { session, httpError } from '@data-fair/lib-express' import mongo from '#mongo' import config from '#config' -import permissions from '../utils/permissions.ts' +import permissions from '../misc/utils/permissions.ts' // @ts-ignore const ajv = ajvFormats(new Ajv({ strict: false })) diff --git a/api/src/routers/processings.ts b/api/src/processings/router.ts similarity index 98% rename from api/src/routers/processings.ts rename to api/src/processings/router.ts index a504e58f..1a4daf6a 100644 --- a/api/src/routers/processings.ts +++ b/api/src/processings/router.ts @@ -15,15 +15,15 @@ import eventsQueue from '@data-fair/lib-node/events-queue.js' import { reqOrigin, session } from '@data-fair/lib-express/index.js' import { httpError } from '@data-fair/lib-utils/http-errors.js' import { createNext } from '@data-fair/processings-shared/runs.ts' -import { applyProcessing, deleteProcessing } from '../utils/runs.ts' +import { applyProcessing, deleteProcessing } from '../runs/service.ts' import { cipher, decipher } from '@data-fair/processings-shared/cipher.ts' import mongo from '#mongo' import config from '#config' import locks from '#locks' import { resolvedSchema as processingSchema } from '#types/processing/index.ts' -import getApiDoc from '../utils/api-docs.ts' -import findUtils from '../utils/find.ts' -import permissions from '../utils/permissions.ts' +import getApiDoc from '../misc/utils/api-docs.ts' +import findUtils from '../misc/utils/find.ts' +import permissions from '../misc/utils/permissions.ts' const router = Router() export default router diff --git a/api/src/routers/runs.ts b/api/src/runs/router.ts similarity index 96% rename from api/src/routers/runs.ts rename to api/src/runs/router.ts index 4dcbbb4f..3120e38b 100644 --- a/api/src/routers/runs.ts +++ b/api/src/runs/router.ts @@ -5,8 +5,8 @@ import * as wsEmitter from '@data-fair/lib-node/ws-emitter.js' import { session } from '@data-fair/lib-express/index.js' import { Router } from 'express' import mongo from '#mongo' -import findUtils from '../utils/find.ts' -import permissions from '../utils/permissions.ts' +import findUtils from '../misc/utils/find.ts' +import permissions from '../misc/utils/permissions.ts' const router = Router() export default router diff --git a/api/src/utils/runs.ts b/api/src/runs/service.ts similarity index 100% rename from api/src/utils/runs.ts rename to api/src/runs/service.ts diff --git a/api/src/server.ts b/api/src/server.ts index 9726d97f..f2ab198f 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -13,7 +13,7 @@ import config from '#config' import mongo from '#mongo' import locks from '#locks' import http from 'http' -import permissions from './utils/permissions.ts' +import permissions from './misc/utils/permissions.ts' const exec = promisify(execCallback) const server = http.createServer(app) diff --git a/dev/resources/nginx.conf b/dev/resources/nginx.conf index 47881c69..e53f3211 100644 --- a/dev/resources/nginx.conf +++ b/dev/resources/nginx.conf @@ -98,11 +98,11 @@ http { } location /openapi-viewer { - proxy_pass http://localhost:8083; + proxy_pass http://localhost:8084; } location /events/ { - proxy_pass http://localhost:8084; + proxy_pass http://localhost:8083; } } } diff --git a/docker-compose.yml b/docker-compose.yml index f0a26534..318d22f6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -68,9 +68,8 @@ services: profiles: - dev image: ghcr.io/data-fair/openapi-viewer:master - ports: - - 8083:8080 environment: + - PORT=8084 - USE_SIMPLE_DIRECTORY=true - ALLOWED_URLS={"processings":"http://localhost:5600/processings/api/v1/api-docs.json","processingsId":"http://localhost:5600/processings/api/v1/processings/{id}/api-docs.json","processingsAdmin":"http://localhost:5600/processings/api/v1/admin/api-docs.json"} @@ -80,7 +79,7 @@ services: image: ghcr.io/data-fair/events:main network_mode: host environment: - - PORT=8084 + - PORT=8083 - PRIVATE_DIRECTORY_URL=http://localhost:5600/simple-directory - SECRET_IDENTITIES=secret-identities - SECRET_EVENTS=secret-events diff --git a/scripts/re-schedule-all.ts b/scripts/re-schedule-all.ts index e038eb02..a8c2af12 100644 --- a/scripts/re-schedule-all.ts +++ b/scripts/re-schedule-all.ts @@ -1,4 +1,4 @@ -import runs from '../api/src/utils/runs.ts' +import runs from '../api/src/runs/service.ts' async function main () { const { db } = await require('../api/utils/db').connect() diff --git a/ui/.gitignore b/ui/.gitignore index b6cdf575..55e510f1 100644 --- a/ui/.gitignore +++ b/ui/.gitignore @@ -12,6 +12,7 @@ dist dist-ssr *.local *.tsbuildinfo +dts # Editor directories and files .vscode/* diff --git a/ui/dts/auto-imports.d.ts b/ui/dts/auto-imports.d.ts index fc4303ad..4035690e 100644 --- a/ui/dts/auto-imports.d.ts +++ b/ui/dts/auto-imports.d.ts @@ -60,7 +60,6 @@ declare global { const mdiPencil: typeof import('@mdi/js')['mdiPencil'] const mdiPlay: typeof import('@mdi/js')['mdiPlay'] const mdiPlayCircle: typeof import('@mdi/js')['mdiPlayCircle'] - const mdiPlug: typeof import('@mdi/js')['mdiPlug'] const mdiPlusCircle: typeof import('@mdi/js')['mdiPlusCircle'] const mdiPlusCircleOutline: typeof import('@mdi/js')['mdiPlusCircleOutline'] const mdiPowerPlug: typeof import('@mdi/js')['mdiPowerPlug'] diff --git a/ui/dts/typed-router.d.ts b/ui/dts/typed-router.d.ts index 0201f23b..e671f935 100644 --- a/ui/dts/typed-router.d.ts +++ b/ui/dts/typed-router.d.ts @@ -20,6 +20,7 @@ declare module 'vue-router/auto-routes' { export interface RouteNamedMap { '/admin/': RouteRecordInfo<'/admin/', '/admin', Record, Record>, '/admin/plugins': RouteRecordInfo<'/admin/plugins', '/admin/plugins', Record, Record>, + '/dev': RouteRecordInfo<'/dev', '/dev', Record, Record>, '/processings/': RouteRecordInfo<'/processings/', '/processings', Record, Record>, '/processings/[id]/': RouteRecordInfo<'/processings/[id]/', '/processings/:id', { id: ParamValue }, { id: ParamValue }>, '/processings/[id]/runs/[runId]': RouteRecordInfo<'/processings/[id]/runs/[runId]', '/processings/:id/runs/:runId', { id: ParamValue, runId: ParamValue }, { id: ParamValue, runId: ParamValue }>, diff --git a/ui/src/components/private-access.vue b/ui/src/components/private-access.vue index aaf18b9b..f737225a 100644 --- a/ui/src/components/private-access.vue +++ b/ui/src/components/private-access.vue @@ -103,6 +103,3 @@ function onChange () { loading.value = false } - - diff --git a/ui/src/components/processing/processing-actions.vue b/ui/src/components/processing/processing-actions.vue index 3ce6aead..42ae521a 100644 --- a/ui/src/components/processing/processing-actions.vue +++ b/ui/src/components/processing/processing-actions.vue @@ -454,6 +454,3 @@ watch(showTriggerMenu, async (newValue) => { } }) - - diff --git a/ui/src/components/processing/processing-card.vue b/ui/src/components/processing/processing-card.vue index 900e722f..616d610b 100644 --- a/ui/src/components/processing/processing-card.vue +++ b/ui/src/components/processing/processing-card.vue @@ -56,9 +56,7 @@ - - {{ pluginFetch.data.value?.metadata.name }} - + {{ pluginFetch.data.value?.metadata.name }} diff --git a/ui/src/components/processing/processing-runs.vue b/ui/src/components/processing/processing-runs.vue index f0df5076..122f79f6 100644 --- a/ui/src/components/processing/processing-runs.vue +++ b/ui/src/components/processing/processing-runs.vue @@ -85,6 +85,3 @@ onUnmounted(() => { defineExpose({ refresh: () => runs.refresh() }) - - diff --git a/ui/src/pages/dev.vue b/ui/src/pages/dev.vue index 57e88f48..a35aa138 100644 --- a/ui/src/pages/dev.vue +++ b/ui/src/pages/dev.vue @@ -43,6 +43,3 @@ - - diff --git a/worker/config/development.mjs b/worker/config/development.mjs index c6dbb051..edffb4e8 100644 --- a/worker/config/development.mjs +++ b/worker/config/development.mjs @@ -12,7 +12,7 @@ export default { port: 9091 }, privateDataFairUrl: 'http://localhost:8081', - privateEventsUrl: 'http://localhost:8084', + privateEventsUrl: 'http://localhost:8083', runsRetention: 5, upgradeRoot: '../' } From 56838a2c02af373f0708bfb08bf0dca7591fb7c1 Mon Sep 17 00:00:00 2001 From: BatLeDev Date: Fri, 6 Feb 2026 10:24:17 +0100 Subject: [PATCH 2/7] chore: wip --- package-lock.json | 16 +- ui/package.json | 4 + ui/src/pages/admin/plugins.vue | 334 ++++++++++++++++++++++----------- 3 files changed, 243 insertions(+), 111 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f5b45a2..a1d8efd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2262,9 +2262,9 @@ "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, @@ -9332,9 +9332,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11296,6 +11296,7 @@ "iframe-resizer": "^4.4.5", "reconnecting-websocket": "^4.4.0", "sass-embedded": "^1.80.5", + "semver": "^7.7.4", "timezones.json": "^1.7.1", "unplugin-auto-import": "^0.18.3", "unplugin-fonts": "^1.1.1", @@ -11307,6 +11308,9 @@ "vue-i18n": "^11.1.2", "vue-router": "^4.4.5", "vue-tsc": "^2.1.10" + }, + "devDependencies": { + "@types/semver": "^7.7.1" } }, "worker": { diff --git a/ui/package.json b/ui/package.json index 009729e9..55dc89b7 100644 --- a/ui/package.json +++ b/ui/package.json @@ -32,6 +32,7 @@ "iframe-resizer": "^4.4.5", "reconnecting-websocket": "^4.4.0", "sass-embedded": "^1.80.5", + "semver": "^7.7.4", "timezones.json": "^1.7.1", "unplugin-auto-import": "^0.18.3", "unplugin-fonts": "^1.1.1", @@ -43,5 +44,8 @@ "vue-i18n": "^11.1.2", "vue-router": "^4.4.5", "vue-tsc": "^2.1.10" + }, + "devDependencies": { + "@types/semver": "^7.7.1" } } diff --git a/ui/src/pages/admin/plugins.vue b/ui/src/pages/admin/plugins.vue index c1577371..ef6bcbb7 100644 --- a/ui/src/pages/admin/plugins.vue +++ b/ui/src/pages/admin/plugins.vue @@ -9,7 +9,7 @@ density="compact" hide-details placeholder="rechercher" - style="max-width:400px;" + max-width="400" variant="outlined" /> @@ -41,78 +41,129 @@ - - - {{ result.distTag === 'latest' ? result.name : result.name + ' (' + result.distTag + ')' }} - - - Utilisé {{ result.usages }} fois - - {{ result.version }} - - - + - - + + + + + + + + - - + + Oui + + + + + + + + + Changer le propriétaire + + + - - - + - - - - - - - - Annuler - - - Confirmer - - - - + variant="flat" + :disabled="!ownersReady" + :loading="confirmChangeOwner.loading.value" + @click="confirmChangeOwner.execute()" + > + Confirmer + + + + - - - Voir le jeu de données - + + + + Voir le jeu de données + - - - Tutoriel - + + + + Tutoriel + - - - Utiliser l'API - + + + + Utiliser l'API + - - - + + + + + + + + + + en: + processingDisplayed: No processings | {displayed}/{count} processing displayed | {displayed}/{count} processings displayed + noProcessingsCreated: You haven't created any processings yet. + noProcessingsDisplayed: No results match the search criteria. + + fr: + processingDisplayed: Aucun traitement | {displayed}/{count} traitement affiché | {displayed}/{count} traitements affichés + noProcessingsCreated: Vous n'avez pas encore créé de traitement. + noProcessingsDisplayed: Aucun résultat ne correspond aux critères de recherche. + + + diff --git a/ui/src/pages/processings/new.vue b/ui/src/pages/processings/new.vue index a1d20712..7f12b545 100644 --- a/ui/src/pages/processings/new.vue +++ b/ui/src/pages/processings/new.vue @@ -7,7 +7,8 @@ > + + + + + + From 962c8dcb53f4fb141961ff50c3e88e1eac70f70b Mon Sep 17 00:00:00 2001 From: BatLeDev Date: Mon, 9 Feb 2026 11:44:42 +0100 Subject: [PATCH 5/7] fix: build.json path --- api/src/admin/router.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/admin/router.ts b/api/src/admin/router.ts index a0e7bd80..260525fa 100644 --- a/api/src/admin/router.ts +++ b/api/src/admin/router.ts @@ -16,7 +16,7 @@ router.use(async (req, res, next) => { let info = { version: process.env.NODE_ENV } if (process.env.NODE_ENV === 'production') { - info = JSON.parse(await readFile(resolve(import.meta.dirname, '../../BUILD.json'), 'utf8')) + info = JSON.parse(await readFile(resolve(import.meta.dirname, '../../../BUILD.json'), 'utf8')) } router.get('/info', (req, res) => { res.send(info) From 16388e45424367aebd4066ca87d91154309d8f7e Mon Sep 17 00:00:00 2001 From: BatLeDev Date: Wed, 25 Feb 2026 17:23:58 +0100 Subject: [PATCH 6/7] chore: replace tooltip by titles --- .../components/processing/processing-card.vue | 14 ++++------ ui/src/pages/processings/[id]/index.vue | 26 +++++++++---------- .../pages/processings/[id]/runs/[runId].vue | 2 +- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/ui/src/components/processing/processing-card.vue b/ui/src/components/processing/processing-card.vue index 616d610b..980572da 100644 --- a/ui/src/components/processing/processing-card.vue +++ b/ui/src/components/processing/processing-card.vue @@ -6,16 +6,12 @@ diff --git a/ui/src/pages/processings/[id]/index.vue b/ui/src/pages/processings/[id]/index.vue index daaaf5cb..7a2fe079 100644 --- a/ui/src/pages/processings/[id]/index.vue +++ b/ui/src/pages/processings/[id]/index.vue @@ -51,20 +51,20 @@ :processing="processing" class="mt-4" /> - - - - + + + +